def morph_block(node):
    g0 = node.space.group
    if g0 is None or g0.type != "elegroup": return Handler.NO_MATCH
    g = g0.elegroup
    if g is None: return Handler.NO_MATCH
    if g.type != "block": return Handler.NO_MATCH

    w = node.space.wrapping
    if w == 2:
        node.morph("html-abstract-level1-block")
    elif w == 3 or (w == 4 and node.parent.nodetype
                    == "html-abstract-level1-cloneblock"):
        node.morph("html-abstract-level2-block")
    elif w == 4 or (w == 5 and node.parent.parent.nodetype
                    == "html-abstract-level1-cloneblock"):
        node.morph("html-abstract-level3-block")
    g = node.space.group.elegroup

    if hasattr(g, "blockname"):
        node.space.blockname = g.blockname
    else:
        node.space.blockname = g.id
    if hasattr(g, "title"):
        node.space.title = g.title
    if hasattr(g, "title2"):
        node.space.title2 = g.title2
    if hasattr(g, "controltitle"):
        node.space.controltitle = g.controltitle
    elif hasattr(g, "title"):
        node.space.controltitle = g.title
    if hasattr(g, "always_active"):
        node.space.always_active = True

    Handler.passdown("html-make-abstract", node)
    return Handler.CLAIM
def insert_level2(node):
    Handler.passdown("html-insert-level2", node)

    groups = []
    curr_group = None
    for childname in node.getChildren():
        t = node[childname].nodetype
        if t in ("html-abstract-level3", "html-abstract-level3-block",
                 "html-abstract-inputleaf"):
            if curr_group is None: curr_group = []
            curr_group.append(childname)
        else:
            if curr_group is not None: groups.append(curr_group)
            curr_group = None
    if curr_group is not None: groups.append(curr_group)

    if groups:
        for group in groups:
            position = list(node.getChildren()).index(group[0])
            g = node.insertChild("html-abstract-level2", "group-" + group[0],
                                 position)
            g.space.complexity = node.space.complexity
            for m in group:
                child = node.detachChild(m)
                g.attachChild(child, m)
    return Handler.CLAIM
Ejemplo n.º 3
0
def morph_level2(node):
    Handler.passdown("html-make-concrete", node)
    divtag = SimpleTag("div", [("class", "level2")],
                       comment=" <!-- END: level2 -->",
                       lines_before=1)
    div2tag = SimpleTag("div", [("class", "group-container")],
                        comment=" <!-- END: group-container -->",
                        lines_before=1,
                        lines_inside_before=1)
    has_switch = False
    if node.space.group and node.space.group.elegroup:
        if hasattr(node.space.group.elegroup, "has_switch"):
            has_switch = node.space.group.elegroup.has_switch
    if has_switch:
        assert node.getChildren(), node.space.formpath
        firstchildname = node.getChildren()[0]
        assert node[firstchildname].space.formtype == "switch", (
            node.space.formpath, firstchildname)
        firstchild = node.detachChild(firstchildname)
        divtag.attachChild(firstchild, "switch")
        divtag.root = node.root
        firstchild.sendMessage("html-make-concrete")
        firstchild = _wrap_fieldcontainer(firstchild, divtag)
        node.space.switchtag = firstchild
    else:
        _add_title(node, div2tag)
        nulltag = NullTag()
        div2tag.attachChild(nulltag, "tag-tip")
        div2tag.space.htmltip = nulltag
    divtag.attachChild(div2tag, "container")
    divtag.space.htmltip = div2tag
    node.space.htmlnode = divtag
    node.morph("html-concrete-fieldcontainer")
Ejemplo n.º 4
0
def _div_leaf_tag(node,tag, divclass):
  divtag = SimpleTag("div", [("class", divclass)])
  divtag.attachChild(tag, "child")
  node.space.htmlnode = divtag
  Handler.passdown("html-make-concrete", node)  
  node.morph("html-concrete-node")
  return Handler.CLAIM
def morph_cloneblock(node):
    if node.parent is None: return Handler.NO_MATCH
    if node.parent.nodetype != "html-abstract-clonecontainer":
        return Handler.NO_MATCH
    if node.space.form is not None:
        node.space.active = node.space.form.active
        node.space.always_active = node.space.form.always_active
        node.space.multi_active = node.space.form.multi_active
    node.morph("html-abstract-level1-cloneblock")
    Handler.passdown("html-make-abstract", node)
    return Handler.CLAIM
def morph_clonecontainer(node):
    from .concrete import _extract_fields

    space = node.space
    if space.form is None or space.form.arraycount == 0:
        return Handler.NO_MATCH

    fields = ("clonebutton", "clonelength", "controltitle", "title",
              "blockname")
    p = _extract_fields(space, space.form, fields)
    if p.clonelength is None: return Handler.NO_MATCH
    assert node.parent.nodetype == "html-abstract-category", (
        node.name, node.formpath)  #only categories can clone

    clone = Space.Space(top=False)
    clone.button = p.clonebutton
    assert p.clonelength is not None, node.name
    clone.length = p.clonelength
    if p.blockname is None: p.blockname = node.name
    clone.name = p.blockname

    node.morph("html-abstract-clonecontainer")
    Handler.passdown("html-make-abstract", node)
    if node.parent.space.clones is None: node.parent.space.clones = []
    node.parent.space.clones.append(clone)
    children = node.getChildren()
    for n in children:
        child = node[children[n]]
        child.space.clone = clone
        child.space.blockindex = n
        if p.controltitle is None: p.controltitle = p.title
        if p.controltitle is None: p.controltitle = p.name
        child_controltitle = p.controltitle + " " + str(n + 1)
        csf = child.space.form
        if csf.name is not None:
            child_controltitle = csf.name
        elif csf.title is not None:
            child_controltitle = csf.title
        child.space.controltitle = child_controltitle
        child.space.blockname = p.blockname

    return Handler.CLAIM
Ejemplo n.º 7
0
def _container_tag(node, tag):
    assert node.space.htmlnode is None, (node.space.formpath,
                                         node.space.htmlnode)
    assert tag is not None, node.space.formpath
    Handler.passdown("html-make-concrete", node)
    node.space.htmlnode = tag
    for childname in node.getChildren():
        child = node[childname]
        if child.space.complexity is not None:
            tip = child.space.htmltip
            if tip is None: tip = child.space.htmlnode
            assert tip is not None, (child.space.formpath,
                                     child.parent.space.formpath, child.name,
                                     child.parent.name)
            #_add_headers(child, tip, begin=True) #outer headers are ignored in ATTRACT web GUI
            continue
        _wrap_fieldcontainer(child, node)

    node.morph("html-concrete-node")
    return Handler.CLAIM
def morph_fallback(node):
    if node.parent and node.parent is node.root:  #top form element
        return Handler.NO_MATCH
    if node.space.wrapping == 1:
        return Handler.NO_MATCH  #can't make categories
    if node.space.wrapping == 2: return Handler.NO_MATCH  #can't make blocks

    w = node.space.wrapping
    if w == 3 or (w == 4 and node.parent.nodetype
                  == "html-abstract-level1-cloneblock"):
        assert node.space.group is None or node.space.group.elegroup is None  #else: html-abstract-level2-block
        node.morph("html-abstract-level2")
    elif w == 4 or (w == 5 and node.parent.parent.nodetype
                    == "html-abstract-level1-cloneblock"):
        node.morph("html-abstract-level3")
    else:
        raise Exception(node.name, node.space.formpath,
                        node.space.wrapping)  #too much wrapping...

    Handler.passdown("html-make-abstract", node)
    return Handler.CLAIM
def morph_blockcategory(node):
    g0 = node.space.group
    if g0 is None or g0.type != "elegroup": return Handler.NO_MATCH
    g = g0.elegroup
    if g is None: return Handler.NO_MATCH
    if g.type != "category": return Handler.NO_MATCH
    if node.space.complexity > 1: return Handler.NO_MATCH
    assert node.space.wrapping == 1, (node.name, node.space.formpath,
                                      node.space.wrapping)

    node.space.blockname = g.categoryname
    if hasattr(g, "controltitle"):
        node.space.controltitle = g.controltitle
    else:
        node.space.controltitle = g.title
    node.space.active = True
    if hasattr(g, "always_active"):
        node.space.always_active = True

    x = "temporary-category-childname"
    node.addChild("html-abstract-category", x)
    c = node.detachChild(x)
    c.space.blockid = g.id
    c.space.categoryname = g.categoryname
    c.space.page = g.page
    c.space.icon = g.icon
    c.space.title = g.title
    if hasattr(g, "title2"):
        c.space.title2 = g.title2
    c.space.description = g.description
    if hasattr(g, "html_description"):
        c.space.html_description = g.html_description

    for var in vars(node.space):
        setattr(c.space, var, getattr(node.space, var))
    node.parent.detachAndReplaceChild(node.name, c)
    c.attachChild(node, "block")
    node.morph("html-abstract-level1-block")
    Handler.passdown("html-make-abstract", node)
    return Handler.CLAIM
Ejemplo n.º 10
0
def morph_level1_blockwrapper(node, clone=False):
    space = node.space
    if clone:
        blockindex = space.blockindex
        assert blockindex is not None
    else:
        blockindex = 0

    controltag = _add_controls(node)
    containertag = SimpleTag("div", [("class", "level1-container")],
                             lines_before=1,
                             comment="<!-- END: level1-container -->")

    innertags = [controltag, containertag]
    blockname = "%s-%d" % (space.blockname, blockindex)
    if clone:
        assert node.root.space.arraymarker is not None
        am = node.root.space.arraymarker
        #add hidden arraymarker attribute, so that we can know if blocks have been inserted/deleted
        t = VoidTag("input", [("type", "hidden"),
                              ("name", blockname + "-" + am),
                              ("value", blockindex)])
        innertags.append(t)

    active = ""
    if space.always_active:
        active += " active always-active"
    elif space.active:
        active += " active"
    if space.multi_active:
        active += " multi-active"
    level1tag = ComplexTag("div", [("id", "block-" + blockname),
                                   ("class", "level1%s" % active)],
                           innertags,
                           lines_before=1,
                           lines_after=1,
                           comment="<!-- END: level1 -->")
    level1tag.space.htmltip = containertag
    Handler.passdown("html-make-concrete", node)
    return _container_tag(node, level1tag)
def morph_category(node):
    g0 = node.space.group
    if g0 is None or g0.type != "elegroup": return Handler.NO_MATCH
    g = g0.elegroup
    if g is None: return Handler.NO_MATCH
    if g.type != "category": return Handler.NO_MATCH
    if node.space.complexity == 1: return Handler.NO_MATCH
    assert node.space.wrapping == 1, (node.name, node.space.formpath,
                                      node.space.wrapping)

    node.space.categoryid = g.id
    node.space.categoryname = g.categoryname
    node.space.page = g.page
    node.space.icon = g.icon
    node.space.title = g.title
    if hasattr(g, "title2"):
        node.space.title2 = g.title2
    node.space.description = g.description
    if hasattr(g, "html_description"):
        node.space.html_description = g.html_description

    node.morph("html-abstract-category")
    Handler.passdown("html-make-abstract", node)
    return Handler.CLAIM
Ejemplo n.º 12
0
def _leaf_tag(node, tag):
  node.space.htmlnode = tag
  Handler.passdown("html-make-concrete", node)  
  node.morph("html-concrete-node")
  return Handler.CLAIM