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
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")
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
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
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
def _leaf_tag(node, tag): node.space.htmlnode = tag Handler.passdown("html-make-concrete", node) node.morph("html-concrete-node") return Handler.CLAIM