(tagstring)
return words
Parses tag input, with multiple word input being activated and
    delineated by commas and double quotes. Quotes take precedence, so
    they may contain commas.

    Returns a sorted list of unique tag names.

    Ported from Jonathan Buchanan's `django-tagging
    <http://django-tagging.googlecode.com/>`_
Parses tag input, with multiple word input being activated and
    delineated by commas and double quotes. Quotes take precedence, so
    they may contain commas.
Parses tag input with multiple word input being activated and delineated by commas and double quotes . Quotes take precedence so they may contain commas .
def _parse_tags(tagstring):
    """
    Parses tag input, with multiple word input being activated and
    delineated by commas and double quotes. Quotes take precedence, so
    they may contain commas.

    Returns a sorted list of unique tag names.

    Ported from Jonathan Buchanan's `django-tagging
    <http://django-tagging.googlecode.com/>`_
    """
    if not tagstring:
        return []

    # Special case - if there are no commas or double quotes in the
    # input, we don't *do* a recall... I mean, we know we only need to
    # split on spaces.
    if "," not in tagstring and '"' not in tagstring:
        words = list(set(split_strip(tagstring, " ")))
        words.sort()
        return words

    words = []
    buffer = []
    # Defer splitting of non-quoted sections until we know if there are
    # any unquoted commas.
    to_be_split = []
    saw_loose_comma = False
    open_quote = False
    i = iter(tagstring)
    try:
        while True:
            c = next(i)
            if c == '"':
                if buffer:
                    to_be_split.append("".join(buffer))
                    buffer = []
                # Find the matching quote
                open_quote = True
                c = next(i)
                while c != '"':
                    buffer.append(c)
                    c = next(i)
                if buffer:
                    word = "".join(buffer).strip()
                    if word:
                        words.append(word)
                    buffer = []
                open_quote = False
            else:
                if not saw_loose_comma and c == ",":
                    saw_loose_comma = True
                buffer.append(c)
    except StopIteration:
        # If we were parsing an open quote which was never closed treat
        # the buffer as unquoted.
        if buffer:
            if open_quote and "," in buffer:
                saw_loose_comma = True
            to_be_split.append("".join(buffer))
    if to_be_split:
        if saw_loose_comma:
            delimiter = ","
        else:
            delimiter = " "
        for chunk in to_be_split:
            words.extend(split_strip(chunk, delimiter))
    words = list(set(words))
    words.sort()
    return words
def _parse_tags ( tagstring ) : if not tagstring : return [ ] # Special case - if there are no commas or double quotes in the # input, we don't *do* a recall... I mean, we know we only need to # split on spaces. if "," not in tagstring and '"' not in tagstring : words = list ( set ( split_strip ( tagstring , " " ) ) ) words . sort ( ) return words words = [ ] buffer = [ ] # Defer splitting of non-quoted sections until we know if there are # any unquoted commas. to_be_split = [ ] saw_loose_comma = False open_quote = False i = iter ( tagstring ) try : while True : c = next ( i ) if c == '"' : if buffer : to_be_split . append ( "" . join ( buffer ) ) buffer = [ ] # Find the matching quote open_quote = True c = next ( i ) while c != '"' : buffer . append ( c ) c = next ( i ) if buffer : word = "" . join ( buffer ) . strip ( ) if word : words . append ( word ) buffer = [ ] open_quote = False else : if not saw_loose_comma and c == "," : saw_loose_comma = True buffer . append ( c ) except StopIteration : # If we were parsing an open quote which was never closed treat # the buffer as unquoted. if buffer : if open_quote and "," in buffer : saw_loose_comma = True to_be_split . append ( "" . join ( buffer ) ) if to_be_split : if saw_loose_comma : delimiter = "," else : delimiter = " " for chunk in to_be_split : words . extend ( split_strip ( chunk , delimiter ) ) words = list ( set ( words ) ) words . sort ( ) return words