Changeset 4295:46c7e07b95af in livinglogic.python.xist for src/ll/xist/scripts/xml2xsc.py

Show
Ignore:
Timestamp:
01/21/11 16:24:54 (9 years ago)
Author:
Walter Doerwald <walter@…>
Branch:
default
Message:

Internal refactoring of ll.xist.xnd.

All options are now passed to Module.init.

Adding stuff to the module (and attributes to an element) is done with +=.

Files:
1 modified

Legend:

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

    r4293 r4295  
    4949            else: 
    5050                xndnode = xnd.Element(name, xmlns=xmlns) 
    51                 xndnode.add(ns) 
     51                ns += xndnode 
    5252                elements[(name, xmlns)] = set() 
    5353            for attrname in node.keys(): 
    5454                if not attrname.startswith("{") and attrname not in xndnode.attrs: 
    55                     xndnode(xnd.Attr(attrname, type=xsc.TextAttr)) 
     55                    xndnode += xnd.Attr(attrname, type=xsc.TextAttr) 
    5656        elif "ProcessingInstruction" in type(node).__name__: 
    5757            name = node.target 
    5858            if name not in ns.procinsts: 
    59                 xndnode = xnd.ProcInst(name) 
    60                 xndnode.add(ns) 
     59                ns += xnd.ProcInst(name) 
    6160        elif "Comment" in type(node).__name__: 
    6261            xndnode = "#comment" 
     
    7372 
    7473 
    75 def makexnd(streams, parser="etree", shareattrs="dupes", model="simple"): 
     74def makexnd(urls, parser="etree", shareattrs="dupes", model="simple", defaultxmlns=None): 
    7675    elements = {} # maps (name, xmlns) to content set 
    77     ns = xnd.Module() 
     76    ns = xnd.Module(defaultxmlns=defaultxmlns) 
    7877    with url.Context(): 
    79         for stream in streams: 
    80             if isinstance(stream, url.URL): 
    81                 stream = stream.openread() 
    82             elif isinstance(stream, str): 
    83                 stream = cStringIO.StringIO(stream) 
     78        for u in urls: 
     79            if isinstance(u, url.URL): 
     80                u = u.openread() 
     81            elif isinstance(u, str): 
     82                u = cStringIO.StringIO(u) 
    8483            if parser == "etree": 
    8584                from xml.etree import cElementTree 
    86                 node = cElementTree.parse(stream).getroot() 
     85                node = cElementTree.parse(u).getroot() 
    8786            elif parser == "lxml": 
    8887                from lxml import etree 
    89                 node = etree.parse(stream).getroot() 
     88                node = etree.parse(u).getroot() 
    9089            else: 
    9190                raise ValueError("unknown parser {!r}".format(parser)) 
    92             stream.close() 
    9391            addetree2xnd(ns, node, elements) 
    9492 
     
    133131    p.add_argument("-s", "--shareattrs", dest="shareattrs", help="Should identical attributes be shared among elements? (default: %(default)s)", choices=("none", "dupes", "all"), default="dupes") 
    134132    p.add_argument("-m", "--model", dest="model", help="Create sims info? (default: %(default)s)", choices=("none", "simple", "fullall", "fullonce"), default="simple") 
    135     p.add_argument("-n", "--force-ns", dest="forcens", metavar="NAME", help="Force elements without a namespace into this namespace") 
     133    p.add_argument("-x", "--defaultxmlns", dest="defaultxmlns", metavar="NAME", help="Force elements without a namespace into this namespace") 
    136134 
    137135    args = p.parse_args(args) 
    138     print makexnd(args.urls, parser=args.parser, shareattrs=args.shareattrs, model=args.model).aspy(model=args.model, forcens=args.forcens) 
     136    print makexnd(**args.__dict__) 
    139137 
    140138