Changeset 4278:56852276638d in livinglogic.python.xist for src/ll/xist/scripts/dtd2xsc.py

Show
Ignore:
Timestamp:
12/17/10 17:03:27 (9 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Enhance dtd2xsc so that it can put the content of more than one DTD into a xnd definition.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • src/ll/xist/scripts/dtd2xsc.py

    r4277 r4278  
    2525 
    2626 
    27 import sys, os.path, argparse 
     27import sys, os.path, argparse, contextlib 
    2828 
    2929try: 
     
    5555 
    5656 
    57 def dtd2xnd(dtd, xmlns=None): 
     57def adddtd2xnd(ns, dtd, xmlns=None, duplicates="reject"): 
    5858    """ 
    59     Convert DTD information from the URL :var:`dtdurl` to an XIST DOM using the 
    60     :mod:`ll.xist.xnd` functionality. 
     59    Append DTD information from :var:`dtd` to the :class:`xnd.Module` object 
     60    :var:`ns`. 
    6161    """ 
    6262 
    6363    dtd = dtdparser.load_dtd_string(dtd) 
    64  
    65     ns = xnd.Module() 
    6664 
    6765    if xmlns is None: 
     
    9492                    type = "xsc.TextAttr" 
    9593                    if isinstance(dtd_a.type, list): 
    96                         if len(dtd_a.type)>1: 
     94                        if len(dtd_a.type) > 1: 
    9795                            values = dtd_a.type 
    9896                        else: 
     
    103101                else: 
    104102                    required = None 
    105                 a = xnd.Attr(name=attrname, type=type, default=default, required=required) 
    106                 for v in values: 
    107                     a.values.append(v) 
    108                 e.attrs.append(a) 
    109         ns.content.append(e) 
     103                a = xnd.Attr(name=attrname, type=type, default=default, required=required, values=values) 
     104                e.attrs[a.name] = a 
     105        e.add(ns, duplicates=duplicates) 
    110106 
    111107    # Iterate through the elements a second time and add model information 
     
    137133                    modeltype = "sims.Empty" 
    138134                else: 
    139                     modelargs.append(ns.element(cont)) 
     135                    modelargs.append(ns.elements[(cont, xmlns)]) 
    140136            if not modelargs: 
    141137                if modeltype == "sims.ElementsOrText": 
     
    143139                else: 
    144140                    modeltype = "sims.NoElementsOrText" 
    145         e = ns.element(elemname) 
     141        e = ns.elements[(elemname, xmlns)] 
    146142        e.modeltype = modeltype 
    147143        e.modelargs = modelargs 
     
    157153                pass 
    158154            else: 
    159                 ns.content.append(xnd.CharRef(entname, codepoint=ord(unicode(ent[0])[0]))) 
     155                e = xnd.CharRef(entname, codepoint=ord(unicode(ent[0])[0])) 
     156                e.add(ns, duplicates=duplicates) 
    160157 
     158 
     159def stream2xnd(urls, xmlns, shareattrs, duplicates): 
     160    ns = xnd.Module() 
     161    with url.Context(): 
     162        for u in urls: 
     163            with contextlib.closing(u.openread()) as f: 
     164                adddtd2xnd(ns, f.read(), xmlns, duplicates) 
     165 
     166    if shareattrs=="dupes": 
     167        ns.shareattrs(False) 
     168    elif shareattrs=="all": 
     169        ns.shareattrs(True) 
    161170    return ns 
    162171 
    163172 
    164 def stream2xnd(stream, xmlns, shareattrs): 
    165     xnd = dtd2xnd(stream.read(), xmlns) 
    166  
    167     if shareattrs=="dupes": 
    168         xnd.shareattrs(False) 
    169     elif shareattrs=="all": 
    170         xnd.shareattrs(True) 
    171     return xnd 
     173def dtd2xnd(dtd, xmlns=None, duplicates="reject"): 
     174    ns = xnd.Module() 
     175    adddtd2xnd(ns, dtd, xmlns, duplicates) 
     176    return ns 
    172177 
    173178 
    174179def main(args=None): 
    175     p = argparse.ArgumentParser(description="Convert DTD (on stdin) to XIST namespace (on stdout)") 
     180    p = argparse.ArgumentParser(description="Convert DTDs to XIST namespace (on stdout)") 
     181    p.add_argument("urls", metavar="urls", type=url.URL, help="ULRs of DTDs to be parsed", nargs="+") 
    176182    p.add_argument("-x", "--xmlns", dest="xmlns", help="the namespace name for this module") 
    177183    p.add_argument("-s", "--shareattrs", dest="shareattrs", help="Should identical attributes be shared among elements?", choices=("none", "dupes", "all"), default="dupes") 
    178184    p.add_argument("-m", "--model", dest="model", default="once", help="Add sims information to the namespace", choices=("no", "all", "once")) 
    179185    p.add_argument("-d", "--defaults", action="store_true", dest="defaults", help="Output default values for attributes?") 
     186    p.add_argument(      "--duplicates", dest="duplicates", help="How to handle duplicate elements from multiple DTDs", choices=("reject", "allow", "merge")) 
    180187 
    181188    args = p.parse_args(args) 
    182     print stream2xnd(sys.stdin, args.xmlns, args.shareattrs).aspy(model=args.model, defaults=args.defaults) 
     189    print stream2xnd(args.urls, args.xmlns, args.shareattrs, args.duplicates).aspy(model=args.model, defaults=args.defaults) 
    183190 
    184191