#! /usr/bin/python
# -*- coding: utf-8 -*-
# $Id$
"""
Copyright (C) 2007, 2008 by Martin Thorsen Ranang
This file is part of InTeX.
InTeX is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your
option) any later version.
InTeX is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with InTeX. If not, see .
"""
__author__ = "Martin Thorsen Ranang "
__revision__ = "$Rev$"
__version__ = "@VERSION@"
from itertools import chain
from string import whitespace
ESCAPE_TOKEN = '\\'
def flatten(sequence):
"""Returns a flattened list.
"""
return list(chain(*sequence))
def _init_escape_aware_split(delimiter):
if delimiter is None:
delimiter = whitespace
lookahead = 1
else:
lookahead = len(delimiter)
return delimiter, lookahead, list(), (None, None)
def escape_aware_split(string, delimiter=None, maxsplit=None):
delimiter, lookahead, parts, (i, j) = _init_escape_aware_split(delimiter)
for k in xrange((len(string) - (lookahead - 1))):
token = string[k:(k + lookahead)]
if (token == delimiter) or (token in delimiter):
# Found a delimiter. Check the number of contiguous
# escape tokens in front of it (right to left).
for l in xrange((k - 1), -1, -1):
if string[l] != ESCAPE_TOKEN:
break
escapes = (k - l - 1)
if not (escapes & 1): # Odd number of escapes?
# Split here.
parts.append(string[i:k])
i = (k + lookahead) # Skip the delimiter token.
if len(parts) == maxsplit:
break
parts.append(string[i:j])
return parts
def escape_aware_rsplit(string, delimiter=None, maxsplit=None):
delimiter, lookahead, parts, (i, j) = _init_escape_aware_split(delimiter)
for k in xrange((len(string) - lookahead), -1, -1):
token = string[k:(k + lookahead)]
if (token == delimiter) or (token in delimiter):
# Found a delimiter. Check the number of contiguous
# escape tokens in front of it (right to left).
for l in xrange((k - 1), -1, -1):
if string[l] != ESCAPE_TOKEN:
break
escapes = (k - l - 1)
if not (escapes & 1): # Odd number of escapes?
# Split here.
parts.append(string[k + lookahead:j])
j = k # Skip the delimiter token.
if len(parts) == maxsplit:
break
parts.append(string[i:j]) # Add the rest, if applicable.
parts.reverse() # Reverse the list in-place.
return parts
def main():
"""Module mainline (for standalone execution).
"""
pass
if __name__ == "__main__":
main()