Search in sources :

Example 1 with GroovySyntaxTag

use of org.grails.gsp.compiler.tags.GroovySyntaxTag in project grails-core by grails.

the class GroovyPageParser method startTag.

@SuppressWarnings({ "unchecked", "rawtypes" })
private void startTag() {
    if (!finalPass)
        return;
    tagIndex++;
    String text;
    StringBuilder buf = new StringBuilder(scan.getToken());
    String ns = scan.getNamespace();
    boolean emptyTag = false;
    state = scan.nextToken();
    while (state != HTML && state != GEND_TAG && state != GEND_EMPTY_TAG && state != EOF) {
        if (state == GTAG_EXPR) {
            buf.append("${");
            buf.append(scan.getToken().trim());
            buf.append("}");
        } else {
            buf.append(scan.getToken());
        }
        state = scan.nextToken();
    }
    if (state == GEND_EMPTY_TAG) {
        emptyTag = true;
    }
    doNextScan = false;
    text = buf.toString();
    String tagName;
    Map attrs = new LinkedHashMap();
    Matcher m = Pattern.compile("\\s").matcher(text);
    if (m.find()) {
        // ignores carriage returns and new lines
        tagName = text.substring(0, m.start());
        if (state != EOF) {
            String attrTokens = text.substring(m.start(), text.length());
            populateMapWithAttributes(attrs, attrTokens);
        }
    } else {
        tagName = text;
    }
    if (state == EOF) {
        throw new GrailsTagException("Unexpected end of file encountered parsing Tag [" + tagName + "] for " + className + ". Are you missing a closing brace '}'?", pageName, getCurrentOutputLineNumber());
    }
    flushTagBuffering();
    TagMeta tm = new TagMeta();
    tm.name = tagName;
    tm.namespace = ns;
    tm.hasAttributes = !attrs.isEmpty();
    tm.lineNumber = getCurrentOutputLineNumber();
    tm.emptyTag = emptyTag;
    tm.tagIndex = tagIndex;
    tagMetaStack.push(tm);
    if (GroovyPage.DEFAULT_NAMESPACE.equals(ns) && tagRegistry.isSyntaxTag(tagName)) {
        if (tagContext == null) {
            tagContext = new HashMap<Object, Object>();
            tagContext.put(GroovyPage.OUT, out);
            tagContext.put(GroovyPageParser.class, this);
        }
        GroovySyntaxTag tag = (GroovySyntaxTag) tagRegistry.newTag(tagName);
        tag.init(tagContext);
        tag.setAttributes(attrs);
        if (tag.isKeepPrecedingWhiteSpace() && currentlyBufferingWhitespace) {
            flushBufferedWhiteSpace();
        } else if (!tag.isAllowPrecedingContent() && previousContentWasNonWhitespace) {
            throw new GrailsTagException("Tag [" + tag.getName() + "] cannot have non-whitespace characters directly preceding it.", pageName, getCurrentOutputLineNumber());
        } else {
            // If tag does not specify buffering of WS, we swallow it here
            clearBufferedWhiteSpace();
        }
        tag.doStartTag();
        tm.instance = tag;
    } else {
        // Custom taglibs have to always flush the whitespace, there's no
        // "allowPrecedingWhitespace" property on tags yet
        flushBufferedWhiteSpace();
        if (attrs.size() > 0) {
            FastStringWriter buffer = new FastStringWriter();
            buffer.print("[");
            for (Iterator<?> i = attrs.keySet().iterator(); i.hasNext(); ) {
                String name = (String) i.next();
                String cleanedName = name;
                if (name.startsWith("\"") && name.endsWith("\"")) {
                    cleanedName = "'" + name.substring(1, name.length() - 1) + "'";
                }
                buffer.print(cleanedName);
                buffer.print(':');
                buffer.print(getExpressionText(attrs.get(name).toString()));
                if (i.hasNext()) {
                    buffer.print(',');
                } else {
                    buffer.print("]");
                }
            }
            attrsVarsMapDefinition.put(tagIndex, buffer.toString());
            buffer.close();
        }
        if (!emptyTag) {
            tm.bufferMode = true;
        }
    }
}
Also used : GrailsTagException(org.grails.taglib.GrailsTagException) Matcher(java.util.regex.Matcher) GroovySyntaxTag(org.grails.gsp.compiler.tags.GroovySyntaxTag) FastStringWriter(org.grails.buffer.FastStringWriter) ConfigMap(grails.config.ConfigMap)

Example 2 with GroovySyntaxTag

use of org.grails.gsp.compiler.tags.GroovySyntaxTag in project grails-core by grails.

the class GroovyPageParser method endTag.

private void endTag() {
    if (!finalPass)
        return;
    String tagName = scan.getToken().trim();
    String ns = scan.getNamespace();
    if (tagMetaStack.isEmpty())
        throw new GrailsTagException("Found closing Grails tag with no opening [" + tagName + "]", pageName, getCurrentOutputLineNumber());
    TagMeta tm = tagMetaStack.pop();
    String lastInStack = tm.name;
    String lastNamespaceInStack = tm.namespace;
    // if the tag name is blank then it has been closed by the start tag ie <tag />
    if (GrailsStringUtils.isBlank(tagName)) {
        tagName = lastInStack;
    }
    if (!lastInStack.equals(tagName) || !lastNamespaceInStack.equals(ns)) {
        throw new GrailsTagException("Grails tag [" + lastNamespaceInStack + ":" + lastInStack + "] was not closed", pageName, getCurrentOutputLineNumber());
    }
    if (GroovyPage.DEFAULT_NAMESPACE.equals(ns) && tagRegistry.isSyntaxTag(tagName)) {
        if (tm.instance instanceof GroovySyntaxTag) {
            GroovySyntaxTag tag = (GroovySyntaxTag) tm.instance;
            tag.doEndTag();
        } else {
            throw new GrailsTagException("Grails tag [" + tagName + "] was not closed", pageName, getCurrentOutputLineNumber());
        }
    } else {
        int bodyTagIndex = -1;
        if (!tm.emptyTag && !tm.bufferMode) {
            bodyTagIndex = tagIndex;
            out.println("})");
            closureLevel--;
        }
        if (tm.bufferMode && tm.bufferPartNumber != -1) {
            if (!bodyVarsDefined.contains(tm.tagIndex)) {
                //out.print("def ");
                bodyVarsDefined.add(tm.tagIndex);
            }
            out.println("createClosureForHtmlPart(" + tm.bufferPartNumber + ", " + tm.tagIndex + ")");
            bodyTagIndex = tm.tagIndex;
            tm.bufferMode = false;
        }
        if (jspTags.containsKey(ns)) {
            String uri = jspTags.get(ns);
            out.println("jspTag = getJspTag('" + uri + "', '" + tagName + "')");
            out.println("if (!jspTag) throw new GrailsTagException('Unknown JSP tag " + ns + ":" + tagName + "')");
            out.print("jspTag.doTag(out," + attrsVarsMapDefinition.get(tagIndex) + ",");
            if (bodyTagIndex > -1) {
                out.print("getBodyClosure(" + bodyTagIndex + ")");
            } else {
                out.print("null");
            }
            out.println(")");
        } else {
            if (tm.hasAttributes) {
                out.println("invokeTag('" + tagName + "','" + ns + "'," + getCurrentOutputLineNumber() + "," + attrsVarsMapDefinition.get(tagIndex) + "," + bodyTagIndex + ")");
            } else {
                out.println("invokeTag('" + tagName + "','" + ns + "'," + getCurrentOutputLineNumber() + ",[:]," + bodyTagIndex + ")");
            }
        }
    }
    tm.bufferMode = false;
    tagIndex--;
}
Also used : GrailsTagException(org.grails.taglib.GrailsTagException) GroovySyntaxTag(org.grails.gsp.compiler.tags.GroovySyntaxTag)

Aggregations

GroovySyntaxTag (org.grails.gsp.compiler.tags.GroovySyntaxTag)2 GrailsTagException (org.grails.taglib.GrailsTagException)2 ConfigMap (grails.config.ConfigMap)1 Matcher (java.util.regex.Matcher)1 FastStringWriter (org.grails.buffer.FastStringWriter)1