Frage

Using python, I would like "educate" quotes of a a plain text input and turn them into the Context syntax. Here is a (recursive) example:

original text:

Using python, I would like "educate" quotes of 
a plain text input and turn them into the Context syntax. 
Here is a (recursive) example:

output:

Using python, I would like \quotation{educate} quotes of 
a plain text input and turn them into the Context syntax. 
Here is a (recursive) example:

I would like it to handle nested quotations as well:

original text:

Original text: "Using python, I would like 'educate' quotes of 
a plain text input and turn them into the Context syntax. 
Here is a (recursive) example:"

output:

Original text: \quotation {Using python, I would like \quotation{educate} quotes of 
a plain text input and turn them into the Context syntax. 
Here is a (recursive) example:}

And of course, I should take care of edge cases such as:

She said "It looks like we are back in the '90s"

The specification for context quotes is here:

http://wiki.contextgarden.net/Nested_quotations#Nested_quotations_in_MkIV

What is the most sensitive approach to such a situation? Thank you very much!

War es hilfreich?

Lösung

This one works with nested quotes, although it does not handle your edge cases

def quote(string):
    text = ''
    stack = []
    for token in iter_tokes(string):
        if is_quote(token):
            if stack and stack[-1] == token: # closing
                text += '}'
                stack.pop()
            else: # opening
                text += '\\quotation{'
                stack.append(token)
        else:
            text += token
    return text

def iter_tokes(string):
    i = find_quote(string)
    if i is None:
        yield string
    else:
        if i > 0:
            yield string[:i]
        yield string[i]
        for q in iter_tokes(string[i+1:]):
            yield q

def find_quote(string):
    for i, char in enumerate(string):
        if is_quote(char):
            return i
    return None

def is_quote(char):
    return char in '\'\"'

def main():
    quoted = None
    with open('input.txt') as fh:
        quoted = quote(fh.read())
    print quoted

main()

Andere Tipps

In case you're sure that the original text has spaces at the right places, you may simply use regexps:

regexp = re.compile('(?P<opening>(?:^|(?<=\\s))\'(?!\\d0s)|(?<=\\s)")|["\'](?=\\s|$)')

def repl(match):
    if match.group('opening'):
        return '\\quotation{'
    else:
        return '}'

result = re.sub(regexp, repl, s)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top