Author: ltheussl Date: Fri May 29 09:33:31 2009 New Revision: 779903 URL: http://svn.apache.org/viewvc?rev=779903&view=rev Log: Formatting, checkstyle fixes
Modified: maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/ByLineSource.java maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/HtmlTools.java maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java Modified: maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java URL: http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java?rev=779903&r1=779902&r2=779903&view=diff ============================================================================== --- maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java (original) +++ maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/parser/AbstractXmlParser.java Fri May 29 09:33:31 2009 @@ -41,7 +41,6 @@ import org.apache.maven.doxia.logging.Log; import org.apache.maven.doxia.macro.MacroExecutionException; -import org.apache.maven.doxia.markup.HtmlMarkup; import org.apache.maven.doxia.markup.XmlMarkup; import org.apache.maven.doxia.sink.Sink; import org.apache.maven.doxia.sink.SinkEventAttributeSet; @@ -371,8 +370,6 @@ * <ul> * <li>the entities with names <code>#160</code>, <code>nbsp</code> and <code>#x00A0</code> * are emitted as <code>nonBreakingSpace()</code> events.</li> - * <li>if an entity cannot be resolved, it is emitted as an <code>unknown()</code> event, - * with a required parameter that contains {...@link HtmlMarkup#ENTITY_TYPE} as first argument.</li> * </ul> * * @param parser A parser, not null. @@ -1053,211 +1050,222 @@ char ch = more(); if ( ch == '#' ) { - // parse character reference - char charRef = 0; - ch = more(); - StringBuffer sb = new StringBuffer(); - if ( ch == 'x' ) + return numericEntity( ch ); + } + else + { + return namedEntity( ch ); + } + } + + /** {...@inheritdoc} */ + // Fix PLXUTILS-110 + public void defineEntityReplacementText( String entityName, + String replacementText ) + throws XmlPullParserException + { + // throw new XmlPullParserException("not allowed"); + + if ( !replacementText.startsWith( "&#" ) && this.entityName != null && replacementText.length() > 1 ) + { + String tmp = replacementText.substring( 1, replacementText.length() - 1 ); + for ( int i = 0; i < this.entityName.length; i++ ) { - // encoded in hex - while ( true ) + if ( this.entityName[i] != null && this.entityName[i].equals( tmp ) ) { - ch = more(); - if ( ch >= '0' && ch <= '9' ) - { - sb.append( ch ); - charRef = (char) ( charRef * 16 + ( ch - '0' ) ); - } - else if ( ch >= 'a' && ch <= 'f' ) - { - sb.append( ch ); - charRef = (char) ( charRef * 16 + ( ch - ( 'a' - 10 ) ) ); - } - else if ( ch >= 'A' && ch <= 'F' ) - { - sb.append( ch ); - charRef = (char) ( charRef * 16 + ( ch - ( 'A' - 10 ) ) ); - } - else if ( ch == ';' ) - { - break; - } - else - { - throw new XmlPullParserException( - "character reference (with hex value) may not contain " + - printable( ch ), this, null ); - } + replacementText = this.entityReplacement[i]; } } - else + } + + //protected char[] entityReplacement[]; + ensureEntityCapacity(); + + // this is to make sure that if interning works we will take advantage of it ... + this.entityName[entityEnd] = newString( entityName.toCharArray(), 0, entityName.length() ); + entityNameBuf[entityEnd] = entityName.toCharArray(); + + entityReplacement[entityEnd] = replacementText; + entityReplacementBuf[entityEnd] = replacementText.toCharArray(); + if ( !allStringsInterned ) + { + entityNameHash[ entityEnd ] = + fastHash( entityNameBuf[entityEnd], 0, entityNameBuf[entityEnd].length ); + } + ++entityEnd; + //TODO disallow < or & in entity replacement text (or ]]>???) + // TOOD keepEntityNormalizedForAttributeValue cached as well ... + } + + private char[] namedEntity( char ch ) + throws IOException, XmlPullParserException + { + // [68] EntityRef ::= '&' Name ';' + // scan anem until ; + if ( !isNameStartChar( ch ) ) + { + throw new XmlPullParserException( "entity reference names can not start with character '" + + printable( ch ) + "'", this, null ); + } + while ( true ) + { + ch = more(); + if ( ch == ';' ) { - // encoded in decimal - while ( true ) - { - if ( ch >= '0' && ch <= '9' ) - { - charRef = (char) ( charRef * 10 + ( ch - '0' ) ); - } - else if ( ch == ';' ) - { - break; - } - else - { - throw new XmlPullParserException( - "character reference (with decimal value) may not contain " + - printable( ch ), this, null ); - } - ch = more(); - } + break; } - posEnd = pos - 1; - if ( sb.length() > 0 ) + if ( !isNameChar( ch ) ) { - char[] tmp = HtmlTools.toChars( Integer.parseInt( sb.toString(), 16 ) ); - charRefOneCharBuf = tmp; - if ( tokenize ) - { - text = newString( charRefOneCharBuf, 0, charRefOneCharBuf.length ); - } - return charRefOneCharBuf; + throw new XmlPullParserException( "entity reference name can not contain character " + + printable( ch ) + "'", this, null ); } - charRefOneCharBuf[0] = charRef; + } + posEnd = pos - 1; + // determine what name maps to + final int len = posEnd - posStart; + if ( len == 2 && buf[posStart] == 'l' && buf[posStart + 1] == 't' ) + { if ( tokenize ) { - text = newString( charRefOneCharBuf, 0, 1 ); + text = "<"; } + charRefOneCharBuf[0] = '<'; + return charRefOneCharBuf; + // if(paramPC || isParserTokenizing) { + // if(pcEnd >= pc.length) ensurePC(); + // pc[pcEnd++] = '<'; + // } + } + else if ( len == 3 && buf[posStart] == 'a' && buf[posStart + 1] == 'm' && buf[posStart + 2] == 'p' ) + { + if ( tokenize ) + { + text = "&"; + } + charRefOneCharBuf[0] = '&'; + return charRefOneCharBuf; + } + else if ( len == 2 && buf[posStart] == 'g' && buf[posStart + 1] == 't' ) + { + if ( tokenize ) + { + text = ">"; + } + charRefOneCharBuf[0] = '>'; + return charRefOneCharBuf; + } + else if ( len == 4 && buf[posStart] == 'a' && buf[posStart + 1] == 'p' + && buf[posStart + 2] == 'o' && buf[posStart + 3] == 's' ) + { + if ( tokenize ) + { + text = "'"; + } + charRefOneCharBuf[0] = '\''; + return charRefOneCharBuf; + } + else if ( len == 4 && buf[posStart] == 'q' && buf[posStart + 1] == 'u' + && buf[posStart + 2] == 'o' && buf[posStart + 3] == 't' ) + { + if ( tokenize ) + { + text = "\""; + } + charRefOneCharBuf[0] = '"'; return charRefOneCharBuf; } else { - // [68] EntityRef ::= '&' Name ';' - // scan anem until ; - if ( !isNameStartChar( ch ) ) + final char[] result = lookuEntityReplacement( len ); + if ( result != null ) { - throw new XmlPullParserException( "entity reference names can not start with character '" + - printable( ch ) + "'", this, null ); + return result; } + } + if ( tokenize ) + { + text = null; + } + return null; + } + + private char[] numericEntity( char ch ) + throws IOException, XmlPullParserException + { + // parse character reference + char charRef = 0; + ch = more(); + StringBuffer sb = new StringBuffer(); + if ( ch == 'x' ) + { + // encoded in hex while ( true ) { ch = more(); - if ( ch == ';' ) + if ( ch >= '0' && ch <= '9' ) { - break; + sb.append( ch ); + charRef = (char) ( charRef * 16 + ( ch - '0' ) ); } - if ( !isNameChar( ch ) ) + else if ( ch >= 'a' && ch <= 'f' ) { - throw new XmlPullParserException( "entity reference name can not contain character " + - printable( ch ) + "'", this, null ); + sb.append( ch ); + charRef = (char) ( charRef * 16 + ( ch - ( 'a' - 10 ) ) ); } - } - posEnd = pos - 1; - // determine what name maps to - final int len = posEnd - posStart; - if ( len == 2 && buf[posStart] == 'l' && buf[posStart + 1] == 't' ) - { - if ( tokenize ) + else if ( ch >= 'A' && ch <= 'F' ) { - text = "<"; + sb.append( ch ); + charRef = (char) ( charRef * 16 + ( ch - ( 'A' - 10 ) ) ); } - charRefOneCharBuf[0] = '<'; - return charRefOneCharBuf; - // if(paramPC || isParserTokenizing) { - // if(pcEnd >= pc.length) ensurePC(); - // pc[pcEnd++] = '<'; - // } - } - else if ( len == 3 && buf[posStart] == 'a' && buf[posStart + 1] == 'm' && buf[posStart + 2] == 'p' ) - { - if ( tokenize ) + else if ( ch == ';' ) { - text = "&"; + break; } - charRefOneCharBuf[0] = '&'; - return charRefOneCharBuf; - } - else if ( len == 2 && buf[posStart] == 'g' && buf[posStart + 1] == 't' ) - { - if ( tokenize ) + else { - text = ">"; + throw new XmlPullParserException( "character reference (with hex value) may not contain " + + printable( ch ), this, null ); } - charRefOneCharBuf[0] = '>'; - return charRefOneCharBuf; } - else if ( len == 4 && buf[posStart] == 'a' && buf[posStart + 1] == 'p' && buf[posStart + 2] == 'o' - && buf[posStart + 3] == 's' ) + } + else + { + // encoded in decimal + while ( true ) { - if ( tokenize ) + if ( ch >= '0' && ch <= '9' ) { - text = "'"; + charRef = (char) ( charRef * 10 + ( ch - '0' ) ); } - charRefOneCharBuf[0] = '\''; - return charRefOneCharBuf; - } - else if ( len == 4 && buf[posStart] == 'q' && buf[posStart + 1] == 'u' && buf[posStart + 2] == 'o' - && buf[posStart + 3] == 't' ) - { - if ( tokenize ) + else if ( ch == ';' ) { - text = "\""; + break; } - charRefOneCharBuf[0] = '"'; - return charRefOneCharBuf; - } - else - { - final char[] result = lookuEntityReplacement( len ); - if ( result != null ) + else { - return result; + throw new XmlPullParserException( "character reference (with decimal value) may not contain " + + printable( ch ), this, null ); } + ch = more(); } - if ( tokenize ) - { - text = null; - } - return null; } - } - - /** {...@inheritdoc} */ - // Fix PLXUTILS-110 - public void defineEntityReplacementText(String entityName, - String replacementText) - throws XmlPullParserException - { - // throw new XmlPullParserException("not allowed"); - - if ( !replacementText.startsWith( "&#" ) && this.entityName != null && replacementText.length() > 1 ) + posEnd = pos - 1; + if ( sb.length() > 0 ) { - String tmp = replacementText.substring( 1, replacementText.length() - 1 ); - for ( int i = 0; i < this.entityName.length; i++ ) + char[] tmp = HtmlTools.toChars( Integer.parseInt( sb.toString(), 16 ) ); + charRefOneCharBuf = tmp; + if ( tokenize ) { - if ( this.entityName[i] != null && this.entityName[i].equals( tmp ) ) - { - replacementText = this.entityReplacement[i]; - } + text = newString( charRefOneCharBuf, 0, charRefOneCharBuf.length ); } + return charRefOneCharBuf; } - - //protected char[] entityReplacement[]; - ensureEntityCapacity(); - - // this is to make sure that if interning works we will take advantage of it ... - this.entityName[entityEnd] = newString(entityName.toCharArray(), 0, entityName.length()); - entityNameBuf[entityEnd] = entityName.toCharArray(); - - entityReplacement[entityEnd] = replacementText; - entityReplacementBuf[entityEnd] = replacementText.toCharArray(); - if(!allStringsInterned) { - entityNameHash[ entityEnd ] = - fastHash(entityNameBuf[entityEnd], 0, entityNameBuf[entityEnd].length); + charRefOneCharBuf[0] = charRef; + if ( tokenize ) + { + text = newString( charRefOneCharBuf, 0, 1 ); } - ++entityEnd; - //TODO disallow < or & in entity replacement text (or ]]>???) - // TOOD keepEntityNormalizedForAttributeValue cached as well ... + return charRefOneCharBuf; } } } Modified: maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/ByLineSource.java URL: http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/ByLineSource.java?rev=779903&r1=779902&r2=779903&view=diff ============================================================================== --- maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/ByLineSource.java (original) +++ maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/ByLineSource.java Fri May 29 09:33:31 2009 @@ -55,7 +55,7 @@ /** * <p>ungetLine</p> * - * @throws java.lang.IllegalStateException if the ungetLine/unget is called more than + * This should throw a java.lang.IllegalStateException if called more than * one time without calling getNextLine() */ void ungetLine(); @@ -65,7 +65,7 @@ * <p>unget</p> * * @param s some text to push back to the parser - * @throws java.lang.IllegalStateException if the ungetLine/unget is called more than + * This should throw a java.lang.IllegalStateException if called more than * one time without calling getNextLine() */ void unget( String s ); Modified: maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/HtmlTools.java URL: http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/HtmlTools.java?rev=779903&r1=779902&r2=779903&view=diff ============================================================================== --- maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/HtmlTools.java (original) +++ maven/doxia/doxia/trunk/doxia-core/src/main/java/org/apache/maven/doxia/util/HtmlTools.java Fri May 29 09:33:31 2009 @@ -392,7 +392,7 @@ * * @param id The id to be encoded. * @return The trimmed and encoded id, or null if id is null. - * @see {...@link DoxiaUtils#encodeId(java.lang.String,boolean)}. + * @see DoxiaUtils#encodeId(java.lang.String,boolean) */ public static String encodeId( String id ) { @@ -422,13 +422,17 @@ // http://svn.apache.org/repos/asf/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/lang/Character.java // + private static final char LUNATE_SIGMA = 0x3FF; + private static final char NON_PRIVATE_USE_HIGH_SURROGATE = 0xD800; + private static final char LOW_SURROGATE = 0xDC00; + private static int toCodePoint( char high, char low ) { // See RFC 2781, Section 2.2 // http://www.faqs.org/rfcs/rfc2781.html - int h = ( high & 0x3FF ) << 10; - int l = low & 0x3FF; - return ( h | l ) + 0x10000; + int h = ( high & LUNATE_SIGMA ) << 10; + int l = low & LUNATE_SIGMA; + return ( h | l ) + MIN_SUPPLEMENTARY_CODE_POINT; } private static final char MIN_HIGH_SURROGATE = '\uD800'; @@ -454,10 +458,11 @@ } /** - * TODO add javadoc + * Converts the given code point to an equivalent character array. * - * @param codePoint - * @return + * @param codePoint the code point to convert. + * @return If codePoint is a supplementary code point, returns a character array of length 2, + * otherwise a character array of length 1 containing only the original int as a char. */ public static char[] toChars( int codePoint ) { @@ -468,9 +473,9 @@ if ( isSupplementaryCodePoint( codePoint ) ) { - int cpPrime = codePoint - 0x10000; - int high = 0xD800 | ( ( cpPrime >> 10 ) & 0x3FF ); - int low = 0xDC00 | ( cpPrime & 0x3FF ); + int cpPrime = codePoint - MIN_SUPPLEMENTARY_CODE_POINT; + int high = NON_PRIVATE_USE_HIGH_SURROGATE | ( ( cpPrime >> 10 ) & LUNATE_SIGMA ); + int low = LOW_SURROGATE | ( cpPrime & LUNATE_SIGMA ); return new char[] { (char) high, (char) low }; } return new char[] { (char) codePoint }; Modified: maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java URL: http://svn.apache.org/viewvc/maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java?rev=779903&r1=779902&r2=779903&view=diff ============================================================================== --- maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java (original) +++ maven/doxia/doxia/trunk/doxia-modules/doxia-module-xdoc/src/main/java/org/apache/maven/doxia/module/xdoc/XdocParser.java Fri May 29 09:33:31 2009 @@ -132,29 +132,7 @@ } else if ( parser.getName().equals( META.toString() ) ) { - String name = parser.getAttributeValue( null, Attribute.NAME.toString() ); - String content = parser.getAttributeValue( null, Attribute.CONTENT.toString() ); - - if ( "author".equals( name ) ) - { - sink.author( null ); - - sink.text( content ); - - sink.author_(); - } - else if ( "date".equals( name ) ) - { - sink.date( null ); - - sink.text( content ); - - sink.date_(); - } - else - { - sink.unknown( "meta", new Object[] {new Integer( TAG_TYPE_SIMPLE )}, attribs ); - } + handleMetaStart( parser, sink, attribs ); } else if ( parser.getName().equals( BODY.toString() ) ) { @@ -168,41 +146,11 @@ } else if ( parser.getName().equals( SECTION_TAG.toString() ) ) { - consecutiveSections( Sink.SECTION_LEVEL_1, sink ); - - Object id = attribs.getAttribute( Attribute.ID.toString() ); - if ( id != null ) - { - sink.anchor( id.toString() ); - sink.anchor_(); - } - - sink.section( Sink.SECTION_LEVEL_1, attribs ); - - sink.sectionTitle( Sink.SECTION_LEVEL_1, attribs ); - - sink.text( HtmlTools.unescapeHTML( parser.getAttributeValue( null, Attribute.NAME.toString() ) ) ); - - sink.sectionTitle1_(); + handleSectionStart( Sink.SECTION_LEVEL_1, sink, attribs, parser ); } else if ( parser.getName().equals( SUBSECTION_TAG.toString() ) ) { - consecutiveSections( Sink.SECTION_LEVEL_2, sink ); - - Object id = attribs.getAttribute( Attribute.ID.toString() ); - if ( id != null ) - { - sink.anchor( id.toString() ); - sink.anchor_(); - } - - sink.section( Sink.SECTION_LEVEL_2, attribs ); - - sink.sectionTitle( Sink.SECTION_LEVEL_2, attribs ); - - sink.text( HtmlTools.unescapeHTML( parser.getAttributeValue( null, Attribute.NAME.toString() ) ) ); - - sink.sectionTitle2_(); + handleSectionStart( Sink.SECTION_LEVEL_2, sink, attribs, parser ); } else if ( parser.getName().equals( SOURCE_TAG.toString() ) ) { @@ -228,46 +176,11 @@ else if ( parser.getName().equals( MACRO_TAG.toString() ) ) { - if ( !isSecondParsing() ) - { - macroName = parser.getAttributeValue( null, Attribute.NAME.toString() ); - - if ( macroParameters == null ) - { - macroParameters = new HashMap(); - } - - if ( StringUtils.isEmpty( macroName ) ) - { - throw new MacroExecutionException( "The '" + Attribute.NAME.toString() + "' attribute for the '" - + MACRO_TAG.toString() + "' tag is required." ); - } - } + handleMacroStart( parser ); } else if ( parser.getName().equals( PARAM.toString() ) ) { - if ( !isSecondParsing() ) - { - if ( StringUtils.isNotEmpty( macroName ) ) - { - String paramName = parser.getAttributeValue( null, Attribute.NAME.toString() ); - String paramValue = parser.getAttributeValue( null, Attribute.VALUE.toString() ); - - if ( StringUtils.isEmpty( paramName ) || StringUtils.isEmpty( paramValue ) ) - { - throw new MacroExecutionException( "'" + Attribute.NAME.toString() + "' and '" - + Attribute.VALUE.toString() + "' attributes for the '" + PARAM.toString() - + "' tag are required inside the '" + MACRO_TAG.toString() + "' tag." ); - } - - macroParameters.put( paramName, paramValue ); - } - else - { - // param tag from non-macro object, see MSITE-288 - handleUnknown( parser, sink, TAG_TYPE_START ); - } - } + handleParamStart( parser, sink ); } else if ( !baseStartTag( parser, sink ) ) { @@ -332,40 +245,9 @@ { //Do nothing, head is closed with BODY start. } - - // ---------------------------------------------------------------------- - // Macro - // ---------------------------------------------------------------------- - else if ( parser.getName().equals( MACRO_TAG.toString() ) ) { - if ( !isSecondParsing() ) - { - if ( StringUtils.isNotEmpty( macroName ) ) - { - // TODO handles specific macro attributes - macroParameters.put( "sourceContent", sourceContent ); - - XdocParser xdocParser = new XdocParser(); - xdocParser.setSecondParsing( true ); - macroParameters.put( "parser", xdocParser ); - - MacroRequest request = new MacroRequest( macroParameters, getBasedir() ); - - try - { - executeMacro( macroName, request, sink ); - } - catch ( MacroNotFoundException me ) - { - throw new MacroExecutionException( "Macro not found: " + macroName, me ); - } - } - } - - // Reinit macro - macroName = null; - macroParameters = null; + handleMacroEnd( sink ); } else if ( parser.getName().equals( PARAM.toString() ) ) { @@ -432,6 +314,125 @@ } } + private void handleMacroEnd( Sink sink ) + throws MacroExecutionException + { + if ( !isSecondParsing() ) + { + if ( StringUtils.isNotEmpty( macroName ) ) + { + // TODO handles specific macro attributes + macroParameters.put( "sourceContent", sourceContent ); + XdocParser xdocParser = new XdocParser(); + xdocParser.setSecondParsing( true ); + macroParameters.put( "parser", xdocParser ); + + MacroRequest request = new MacroRequest( macroParameters, getBasedir() ); + + try + { + executeMacro( macroName, request, sink ); + } catch ( MacroNotFoundException me ) + { + throw new MacroExecutionException( "Macro not found: " + macroName, me ); + } + } + } + + // Reinit macro + macroName = null; + macroParameters = null; + } + + private void handleMacroStart( XmlPullParser parser ) + throws MacroExecutionException + { + if ( !isSecondParsing() ) + { + macroName = parser.getAttributeValue( null, Attribute.NAME.toString() ); + + if ( macroParameters == null ) + { + macroParameters = new HashMap(); + } + + if ( StringUtils.isEmpty( macroName ) ) + { + throw new MacroExecutionException( "The '" + Attribute.NAME.toString() + + "' attribute for the '" + MACRO_TAG.toString() + "' tag is required." ); + } + } + } + + private void handleMetaStart( XmlPullParser parser, Sink sink, SinkEventAttributeSet attribs ) + { + String name = parser.getAttributeValue( null, Attribute.NAME.toString() ); + String content = parser.getAttributeValue( null, Attribute.CONTENT.toString() ); + + if ( "author".equals( name ) ) + { + sink.author( null ); + sink.text( content ); + sink.author_(); + } + else if ( "date".equals( name ) ) + { + sink.date( null ); + sink.text( content ); + sink.date_(); + } + else + { + sink.unknown( "meta", new Object[] {new Integer( TAG_TYPE_SIMPLE )}, attribs ); + } + } + + private void handleParamStart( XmlPullParser parser, Sink sink ) + throws MacroExecutionException + { + if ( !isSecondParsing() ) + { + if ( StringUtils.isNotEmpty( macroName ) ) + { + String paramName = parser.getAttributeValue( null, Attribute.NAME.toString() ); + String paramValue = parser.getAttributeValue( null, + Attribute.VALUE.toString() ); + + if ( StringUtils.isEmpty( paramName ) || StringUtils.isEmpty( paramValue ) ) + { + throw new MacroExecutionException( "'" + Attribute.NAME.toString() + + "' and '" + Attribute.VALUE.toString() + "' attributes for the '" + PARAM.toString() + + "' tag are required inside the '" + MACRO_TAG.toString() + "' tag." ); + } + + macroParameters.put( paramName, paramValue ); + } + else + { + // param tag from non-macro object, see MSITE-288 + handleUnknown( parser, sink, TAG_TYPE_START ); + } + } + } + + private void handleSectionStart( int level, Sink sink, SinkEventAttributeSet attribs, XmlPullParser parser ) + { + consecutiveSections( level, sink ); + + Object id = attribs.getAttribute( Attribute.ID.toString() ); + + if ( id != null ) + { + sink.anchor( id.toString() ); + sink.anchor_(); + } + + sink.section( level, attribs ); + sink.sectionTitle( level, attribs ); + sink.text( HtmlTools.unescapeHTML( parser.getAttributeValue( null, Attribute.NAME.toString() ) ) ); + sink.sectionTitle_( level ); + } + /** * Open missing h4, h5, h6 sections. */