view src/tools/common/ @ 1920:03526c8abeb0

tools (common): added regex module with path (un)escaping methods
author Goffi <>
date Tue, 22 Mar 2016 22:46:04 +0100
children 2daf7b4c6756
line wrap: on
line source

# -*- coding: utf-8 -*-

# Salut à Toi: an XMPP client
# Copyright (C) 2009-2016 Jérôme Poisson (

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# GNU Affero General Public License for more details.

# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <>.

""" regex tools common to backend and frontends """

import re
path_escape = {'%': '%25', '/': '%2F', '\\': '%5c'}
path_escape_rev = {re.escape(v):k for k, v in path_escape.iteritems()}
path_escape = {re.escape(k):v for k, v in path_escape.iteritems()}

def reJoin(exps):
    """Join (OR) various regexes"""
    return re.compile('|'.join(exps))

def reSubDict(pattern, repl_dict, string):
    """Replace key, value found in dict according to pattern

    @param pattern(basestr): pattern using keys found in repl_dict
    @repl_dict(dict): keys found in this dict will be replaced by
        corresponding values
    @param string(basestr): string to use for the replacement
    return pattern.sub(lambda m: repl_dict[re.escape(], string)

path_escape_re = reJoin(path_escape.keys())
path_escape_rev_re = reJoin(path_escape_rev.keys())

def pathEscape(string):
    """Escape string so it can be use in a file path

    @param string(basestr): string to escape
    @return (str, unicode): escaped string, usable in a file path
    return reSubDict(path_escape_re, path_escape, string)

def pathUnescape(string):
    """Unescape string from value found in file path

    @param string(basestr): string found in file path
    @return (str, unicode): unescaped string
    return reSubDict(path_escape_rev_re, path_escape_rev, string)