def clean(namespace):
    """
    Returns a clean VERSION 1.1 rendition of a namespace.

    Data is seperated into four blocks: X, LN, PATTERN, and NS.
    Within blocks, original order is preserved.
    Standard X keys are handled particularly and intelligently.
    X LAST-CHANGED is updated to the present time.
    """
    text = []

    def show_wo_repeating(key):
        """Write X records, but don't repeat any values."""
        if key not in namespace["X"]:
            return
        vals = namespace["X"][key]
        shown = []
        for val in vals:
            if val not in shown:
                shown.append(val)
                text.append(u'X %s %s\n' % (key, lnparser.escape(val)))
    
    text.append(u'X VERSION 1.1\n')
    text.append(u'X LAST-CHANGED %s\n' % isotime())
    show_wo_repeating("PREFERRED-NAME")
    show_wo_repeating("AUTHOR")
    show_wo_repeating("AUTHOR-FOAF")
    if "FINAL" in namespace["X"]:
        final = lnparser.escape(namespace["X"]["FINAL"][0])
        text.append(u'X FINAL %s\n' % final)

    for record_type in ["X", "LN", "PATTERN", "NS"]:
        covered = []
        for line_num, second, third in namespace[record_type+"-raw"]:
            if record_type == "X":
                if second in standard_X_keys:
                    continue
            elif second in covered:
                continue
            covered.append(second)
            text.append(u'%s %s %s\n' % (record_type,
                                         lnparser.escape(second),
                                         lnparser.escape(third)))
        if len(namespace[record_type+"-raw"]) > 0:
            text.append(u'\n')

    return ''.join(text)
 def show_wo_repeating(key):
     """Write X records, but don't repeat any values."""
     if key not in namespace["X"]:
         return
     vals = namespace["X"][key]
     shown = []
     for val in vals:
         if val not in shown:
             shown.append(val)
             text.append(u'X %s %s\n' % (key, lnparser.escape(val)))