### Eclipse Workspace Patch 1.0 #P xwiki-core-rendering-parser-wikimodel Index: src/main/java/org/xwiki/rendering/internal/parser/wikimodel/XDOMGeneratorListener.java =================================================================== --- src/main/java/org/xwiki/rendering/internal/parser/wikimodel/XDOMGeneratorListener.java (revision 18885) +++ src/main/java/org/xwiki/rendering/internal/parser/wikimodel/XDOMGeneratorListener.java (working copy) @@ -53,6 +53,7 @@ import org.xwiki.rendering.block.NewLineBlock; import org.xwiki.rendering.block.NumberedListBlock; import org.xwiki.rendering.block.ParagraphBlock; +import org.xwiki.rendering.block.PropertyBlock; import org.xwiki.rendering.block.QuotationBlock; import org.xwiki.rendering.block.QuotationLineBlock; import org.xwiki.rendering.block.SectionBlock; @@ -212,14 +213,19 @@ this.stack.push(this.marker); } - public void beginPropertyBlock(String propertyUri, boolean doc) + public void beginPropertyBlock(String propertyURI, boolean doc) { - throw new RuntimeException("beginPropertyBlock(" + propertyUri + ", " + doc + ") (not handled yet)"); + this.stack.push(this.marker); + // Since WikiModel doesn't generate begin/endDocument events when the property defines an embedded document we need to do it + // ourselves. + if (doc) { + beginDocument(); + } } - public void beginPropertyInline(String str) + public void beginPropertyInline(String propertyURI) { - throw new RuntimeException("beginPropertyInline(" + str + ") (not handled yet)"); + this.stack.push(this.marker); } public void beginQuotation(WikiParameters params) @@ -370,14 +376,19 @@ this.stack.push(new ParagraphBlock(generateListFromStack(), convertParameters(params))); } - public void endPropertyBlock(String propertyUri, boolean doc) + public void endPropertyBlock(String propertyURI, boolean doc) { - throw new RuntimeException("endPropertyBlock(" + propertyUri + ", " + doc + ") (not handled yet)"); + // Since WikiModel doesn't generate begin/endDocument events when the property defines an embedded document we need to do it + // ourselves. + if (doc) { + endDocument(); + } + this.stack.push(new PropertyBlock(propertyURI, false, generateListFromStack())); } - public void endPropertyInline(String inlineProperty) + public void endPropertyInline(String propertyURI) { - throw new RuntimeException("endPropertyInline(" + inlineProperty + ") (not handled yet)"); + this.stack.push(new PropertyBlock(propertyURI, true, generateListFromStack())); } public void endQuotation(WikiParameters params) #P xwiki-core-rendering-api Index: src/main/java/org/xwiki/rendering/listener/chaining/EventType.java =================================================================== --- src/main/java/org/xwiki/rendering/listener/chaining/EventType.java (revision 18885) +++ src/main/java/org/xwiki/rendering/listener/chaining/EventType.java (working copy) @@ -397,6 +397,36 @@ { listener.onWord((String) eventParameters[0]); } + }, + BEGIN_PROPERTY_BLOCK { + void fireEvent(Listener listener, Object[] eventParameters) + { + listener.beginProperty((String) eventParameters[0], (Boolean) eventParameters[1]); + } + + @Override + public boolean isInlineEnd() + { + return true; + } + }, + END_PROPERTY_BLOCK { + void fireEvent(Listener listener, Object[] eventParameters) + { + listener.endProperty((String) eventParameters[0], (Boolean) eventParameters[1]); + } + }, + BEGIN_PROPERTY_INLINE { + void fireEvent(Listener listener, Object[] eventParameters) + { + listener.beginProperty((String) eventParameters[0], (Boolean) eventParameters[1]); + } + }, + END_PROPERTY_INLINE { + void fireEvent(Listener listener, Object[] eventParameters) + { + listener.endProperty((String) eventParameters[0], (Boolean) eventParameters[1]); + } }; abstract void fireEvent(Listener listener, Object[] eventParameters); Index: src/main/java/org/xwiki/rendering/internal/renderer/chaining/XWikiSyntaxChainingRenderer.java =================================================================== --- src/main/java/org/xwiki/rendering/internal/renderer/chaining/XWikiSyntaxChainingRenderer.java (revision 18886) +++ src/main/java/org/xwiki/rendering/internal/renderer/chaining/XWikiSyntaxChainingRenderer.java (working copy) @@ -766,7 +766,32 @@ getLinkRenderer().beginRenderLink(getPrinter(), link, isFreeStandingURI, parameters); getLinkRenderer().endRenderLink(getPrinter(), link, isFreeStandingURI, parameters); } + + /** + * {@inheritDoc} + * + * @see org.xwiki.rendering.listener.Listener#beginProperty(String, boolean) + */ + @Override + public void beginProperty(String propertyURI, boolean isInline) + { + if (!isInline) { + printEmptyLine(); + } + print("%%" + propertyURI + " "); + } + /** + * {@inheritDoc} + * + * @see org.xwiki.rendering.listener.Listener#endProperty(String, boolean) + */ + @Override + public void endProperty(String propertyURI, boolean isInline) + { + // Nothing to print + } + protected void printParameters(Map parameters) { printParameters(parameters, true); Index: src/main/java/org/xwiki/rendering/listener/chaining/AbstractChainingListener.java =================================================================== --- src/main/java/org/xwiki/rendering/listener/chaining/AbstractChainingListener.java (revision 18885) +++ src/main/java/org/xwiki/rendering/listener/chaining/AbstractChainingListener.java (working copy) @@ -308,6 +308,18 @@ /** * {@inheritDoc} + * @see ChainingListener#beginProperty(String, boolean) + */ + public void beginProperty(String propertyURI, boolean isInline) + { + ChainingListener next = getListenerChain().getNextListener(getClass()); + if (next != null) { + next.beginProperty(propertyURI, isInline); + } + } + + /** + * {@inheritDoc} * * @see ChainingListener#endDefinitionDescription() */ @@ -555,6 +567,18 @@ /** * {@inheritDoc} + * @see ChainingListener#endProperty(String, boolean) + */ + public void endProperty(String propertyURI, boolean isInline) + { + ChainingListener next = getListenerChain().getNextListener(getClass()); + if (next != null) { + next.endProperty(propertyURI, isInline); + } + } + + /** + * {@inheritDoc} * * @see ChainingListener#onEmptyLines(int) */ Index: src/main/java/org/xwiki/rendering/listener/Listener.java =================================================================== --- src/main/java/org/xwiki/rendering/listener/Listener.java (revision 18885) +++ src/main/java/org/xwiki/rendering/listener/Listener.java (working copy) @@ -338,6 +338,24 @@ void endQuotationLine(); /** + * Beginning of a property. + * + * @param propertyURI the URI of the semantic property found + * @param isInline if true the macro is located in a inline content (like paragraph, etc.) + * @since 1.8.2 + */ + void beginProperty(String propertyURI, boolean isInline); + + /** + * End of a property. + * + * @param propertyURI the URI of the semantic property found + * @param isInline if true the macro is located in a inline content (like paragraph, etc.) + * @since 1.8.2 + */ + void endProperty(String propertyURI, boolean isInline); + + /** * A new line or line break (it's up to the renderers to decide if it should be outputted as a new line or as a line * break in the given syntax). */ Index: src/main/java/org/xwiki/rendering/internal/renderer/chaining/XHTMLChainingRenderer.java =================================================================== --- src/main/java/org/xwiki/rendering/internal/renderer/chaining/XHTMLChainingRenderer.java (revision 18885) +++ src/main/java/org/xwiki/rendering/internal/renderer/chaining/XHTMLChainingRenderer.java (working copy) @@ -756,6 +756,41 @@ /** * {@inheritDoc} * + * @see org.xwiki.rendering.listener.Listener#beginProperty(String, boolean) + */ + @Override + public void beginProperty(String propertyURI, boolean isInline) + { + String elementName; + if (isInline) { + elementName = "span"; + } else { + elementName = "div"; + } + getXHTMLWikiPrinter().printXMLStartElement(elementName, + new String[][] {{"class", "xwiki-semantic " + propertyURI}}); + } + + /** + * {@inheritDoc} + * + * @see org.xwiki.rendering.listener.Listener#endProperty(String, boolean) + */ + @Override + public void endProperty(String propertyURI, boolean isInline) + { + String elementName; + if (isInline) { + elementName = "span"; + } else { + elementName = "div"; + } + getXHTMLWikiPrinter().printXMLEndElement(elementName); + } + + /** + * {@inheritDoc} + * * @see org.xwiki.rendering.listener.Listener#onImage(org.xwiki.rendering.listener.Image, boolean, Map) */ @Override Index: src/main/java/org/xwiki/rendering/listener/chaining/ConsecutiveNewLineStateChainingListener.java =================================================================== --- src/main/java/org/xwiki/rendering/listener/chaining/ConsecutiveNewLineStateChainingListener.java (revision 18885) +++ src/main/java/org/xwiki/rendering/listener/chaining/ConsecutiveNewLineStateChainingListener.java (working copy) @@ -283,6 +283,20 @@ /** * {@inheritDoc} * + * @see org.xwiki.rendering.listener.chaining.AbstractChainingListener#endProperty(String, boolean) + */ + @Override + public void endProperty(String propertyURI, boolean isInline) + { + if (!isInline) { + this.newLineCount = 0; + } + super.endProperty(propertyURI, isInline); + } + + /** + * {@inheritDoc} + * * @see org.xwiki.rendering.listener.chaining.AbstractChainingListener#onEmptyLines(int) */ @Override Index: src/main/java/org/xwiki/rendering/internal/renderer/wikimodel/WikiModelGeneratorListener.java =================================================================== --- src/main/java/org/xwiki/rendering/internal/renderer/wikimodel/WikiModelGeneratorListener.java (revision 18885) +++ src/main/java/org/xwiki/rendering/internal/renderer/wikimodel/WikiModelGeneratorListener.java (working copy) @@ -449,6 +449,34 @@ // TODO this.wikimodelListener.onReference("image:" + imageLocation); } + /** + * {@inheritDoc} + * @see Listener#beginProperty(String, boolean) + */ + public void beginProperty(String propertyURI, boolean isInline) + { + if (isInline) { + this.wikimodelListener.beginPropertyInline(propertyURI); + } else { + // TODO: Compute whether doc should be true or false based on whether we have an embedded document or not + this.wikimodelListener.beginPropertyBlock(propertyURI, false); + } + } + + /** + * {@inheritDoc} + * @see Listener#endProperty(String, boolean) + */ + public void endProperty(String propertyURI, boolean isInline) + { + if (isInline) { + this.wikimodelListener.endPropertyInline(propertyURI); + } else { + // TODO: Compute whether doc should be true or false based on whether we have an embedded document or not + this.wikimodelListener.endPropertyBlock(propertyURI, false); + } + } + private WikiParameters createWikiParameters(Map parameters) { List wikiParams = new ArrayList(); Index: src/main/java/org/xwiki/rendering/block/PropertyBlock.java =================================================================== --- src/main/java/org/xwiki/rendering/block/PropertyBlock.java (revision 0) +++ src/main/java/org/xwiki/rendering/block/PropertyBlock.java (revision 0) @@ -0,0 +1,92 @@ +/* + * See the NOTICE file distributed with this work for additional + * information regarding copyright ownership. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.xwiki.rendering.block; + +import java.util.List; + +import org.xwiki.rendering.listener.Listener; + +/** + * Represents a semantic property. See {@link #getPropertyURI()} for more details. + * + * @version $Id: $ + * @since 1.8.2 + */ +public class PropertyBlock extends AbstractFatherBlock +{ + /** + * @see #getPropertyURI() + */ + private String propertyURI; + + /** + * The property is located in an inline content (like paragraph, etc.). + */ + private boolean isInline; + + /** + * @param propertyURI the property name, see {@link #getPropertyURI()} + * @param isInline true if the property is located in an inline content (like paragraph, etc.). + * @param blocks the children blocks of the paragraph + */ + public PropertyBlock(String propertyURI, boolean isInline, List blocks) + { + super(blocks); + this.propertyURI = propertyURI; + this.isInline = isInline; + } + + /** + * @return the property's URI. For example property in XWiki Syntax 2.0 markup for + * %%property value or some:uri for %%some:uri value. + */ + public String getPropertyURI() + { + return this.propertyURI; + } + + /** + * @return if true the property is located in an inline content (like paragraph, etc.). + */ + public boolean isInline() + { + return this.isInline; + } + + /** + * {@inheritDoc} + * + * @see org.xwiki.rendering.block.FatherBlock#before(org.xwiki.rendering.listener.Listener) + */ + public void before(Listener listener) + { + listener.beginProperty(getPropertyURI(), isInline()); + } + + /** + * {@inheritDoc} + * + * @see org.xwiki.rendering.block.FatherBlock#after(org.xwiki.rendering.listener.Listener) + */ + public void after(Listener listener) + { + listener.endProperty(getPropertyURI(), isInline()); + } +} Property changes on: src/main/java/org/xwiki/rendering/block/PropertyBlock.java ___________________________________________________________________ Added: svn:eol-style + native Index: src/main/java/org/xwiki/rendering/internal/renderer/chaining/PlainTextChainingRenderer.java =================================================================== --- src/main/java/org/xwiki/rendering/internal/renderer/chaining/PlainTextChainingRenderer.java (revision 18885) +++ src/main/java/org/xwiki/rendering/internal/renderer/chaining/PlainTextChainingRenderer.java (working copy) @@ -384,6 +384,26 @@ // TODO: maybe something could be done here } + /** + * {@inheritDoc} + * @see AbstractChainingPrintRenderer#beginProperty(String, boolean) + */ + @Override + public void beginProperty(String propertyURI, boolean isInline) + { + // Don't display anything since it's not content data + } + + /** + * {@inheritDoc} + * @see AbstractChainingPrintRenderer#endProperty(String, boolean) + */ + @Override + public void endProperty(String propertyURI, boolean isInline) + { + // Don't display anything since it's not content data + } + private void printEmptyLine() { if (this.isFirstElementRendered) { Index: src/main/java/org/xwiki/rendering/listener/chaining/BlockStateChainingListener.java =================================================================== --- src/main/java/org/xwiki/rendering/listener/chaining/BlockStateChainingListener.java (revision 18885) +++ src/main/java/org/xwiki/rendering/listener/chaining/BlockStateChainingListener.java (working copy) @@ -59,6 +59,7 @@ TABLE_HEAD_CELL, TABLE_ROW, XML_NODE, + PROPERTY, EMPTY_LINES, HORIZONTAL_LINE, ID, @@ -85,7 +86,7 @@ private boolean isInTable; private boolean isInTableCell; - + private Stack definitionListDepth = new Stack(); private Stack listDepth = new Stack(); @@ -736,6 +737,19 @@ this.previousEvent = Event.XML_NODE; } + + /** + * {@inheritDoc} + * + * @see org.xwiki.rendering.listener.chaining.AbstractChainingListener#endProperty(String, boolean) + */ + @Override + public void endProperty(String propertyURI, boolean isInline) + { + super.endProperty(propertyURI, isInline); + + this.previousEvent = Event.PROPERTY; + } /** * {@inheritDoc} Index: src/main/java/org/xwiki/rendering/listener/WrappingListener.java =================================================================== --- src/main/java/org/xwiki/rendering/listener/WrappingListener.java (revision 18885) +++ src/main/java/org/xwiki/rendering/listener/WrappingListener.java (working copy) @@ -526,4 +526,22 @@ { this.listener.onImage(image, isFreeStandingURI, parameters); } + + /** + * {@inheritDoc} + * @see org.xwiki.rendering.listener.Listener#beginProperty(String, boolean) + */ + public void beginProperty(String propertyURI, boolean isInline) + { + this.listener.beginProperty(propertyURI, isInline); + } + + /** + * {@inheritDoc} + * @see org.xwiki.rendering.listener.Listener#endProperty(String, boolean) + */ + public void endProperty(String propertyURI, boolean isInline) + { + this.listener.endProperty(propertyURI, isInline); + } } Index: src/main/java/org/xwiki/rendering/internal/renderer/chaining/EventsChainingRenderer.java =================================================================== --- src/main/java/org/xwiki/rendering/internal/renderer/chaining/EventsChainingRenderer.java (revision 18885) +++ src/main/java/org/xwiki/rendering/internal/renderer/chaining/EventsChainingRenderer.java (working copy) @@ -616,7 +616,27 @@ "onImage: [" + urlImage.getURL() + "] [" + isFreeStandingURI + "]" + serializeParameters(parameters)); } } + + /** + * {@inheritDoc} + * @see AbstractChainingPrintRenderer#beginProperty(String, boolean) + */ + @Override + public void beginProperty(String propertyURI, boolean isInline) + { + getPrinter().println("beginProperty [" + propertyURI + "] [" + isInline + "]"); + } + /** + * {@inheritDoc} + * @see AbstractChainingPrintRenderer#endProperty(String, boolean) + */ + @Override + public void endProperty(String propertyURI, boolean isInline) + { + getPrinter().println("endProperty [" + propertyURI + "] [" + isInline + "]"); + } + public String getEscaped(String str) { String printableStr; Index: src/main/java/org/xwiki/rendering/listener/chaining/TextOnNewLineStateChainingListener.java =================================================================== --- src/main/java/org/xwiki/rendering/listener/chaining/TextOnNewLineStateChainingListener.java (revision 18885) +++ src/main/java/org/xwiki/rendering/listener/chaining/TextOnNewLineStateChainingListener.java (working copy) @@ -289,6 +289,20 @@ /** * {@inheritDoc} * + * @see org.xwiki.rendering.listener.chaining.AbstractChainingListener#beginProperty(String, boolean) + */ + @Override + public void beginProperty(String propertyURI, boolean isInline) + { + if (!isInline) { + this.isTextOnNewLine = false; + } + super.beginProperty(propertyURI, isInline); + } + + /** + * {@inheritDoc} + * * @see org.xwiki.rendering.listener.chaining.AbstractChainingListener#endLink(org.xwiki.rendering.listener.Link, * boolean, java.util.Map) */ Index: src/main/java/org/xwiki/rendering/listener/chaining/LookaheadChainingListener.java =================================================================== --- src/main/java/org/xwiki/rendering/listener/chaining/LookaheadChainingListener.java (revision 18885) +++ src/main/java/org/xwiki/rendering/listener/chaining/LookaheadChainingListener.java (working copy) @@ -307,6 +307,22 @@ saveEvent(EventType.BEGIN_XML_NODE, node); firePreviousEvent(); } + + /** + * {@inheritDoc} + * + * @see org.xwiki.rendering.listener.chaining.AbstractChainingListener#beginProperty(String, boolean) + */ + @Override + public void beginProperty(String propertyURI, boolean isInline) + { + if (isInline) { + saveEvent(EventType.BEGIN_PROPERTY_INLINE, propertyURI, isInline); + } else { + saveEvent(EventType.BEGIN_PROPERTY_BLOCK, propertyURI, isInline); + } + firePreviousEvent(); + } /** * {@inheritDoc} @@ -544,6 +560,22 @@ /** * {@inheritDoc} * + * @see org.xwiki.rendering.listener.chaining.AbstractChainingListener#endProperty(String, boolean) + */ + @Override + public void endProperty(String propertyURI, boolean isInline) + { + if (isInline) { + saveEvent(EventType.END_PROPERTY_INLINE, propertyURI, isInline); + } else { + saveEvent(EventType.END_PROPERTY_BLOCK, propertyURI, isInline); + } + firePreviousEvent(); + } + + /** + * {@inheritDoc} + * * @see org.xwiki.rendering.listener.chaining.AbstractChainingListener#onEmptyLines(int) */ @Override #P xwiki-core-rendering-tests Index: src/test/java/org/xwiki/rendering/RenderingTests.java =================================================================== --- src/test/java/org/xwiki/rendering/RenderingTests.java (revision 18885) +++ src/test/java/org/xwiki/rendering/RenderingTests.java (working copy) @@ -196,6 +196,9 @@ suite.addTestsFromResource("escape/escape17", false); suite.addTestsFromResource("escape/escape18", false); + // Semantic properties + suite.addTestsFromResource("property/property1", false); + // Other suite.addTestsFromResource("horizontalline/horizontalline1", false); suite.addTestsFromResource("horizontalline/horizontalline2", false); Index: src/test/resources/property/property1.test =================================================================== --- src/test/resources/property/property1.test (revision 0) +++ src/test/resources/property/property1.test (revision 0) @@ -0,0 +1,65 @@ +.#----------------------------------------------------- +.input|xwiki/2.0 +.#----------------------------------------------------- +%%property **value** + +%%property1 ((( + %%property2 value2 + %%property3 value3 +))) + +Paragraph %%property(value) +.#----------------------------------------------------- +.expect|event/1.0 +.#----------------------------------------------------- +beginDocument +beginProperty [property] [false] +beginParagraph +beginFormat: [BOLD] +onWord [value] +endFormat: [BOLD] +endParagraph +endProperty [property] [false] +beginProperty [property1] [false] +beginDocument +beginProperty [property2] [false] +beginParagraph +onWord [value2] +endParagraph +endProperty [property2] [false] +beginProperty [property3] [false] +beginParagraph +onWord [value3] +endParagraph +endProperty [property3] [false] +endDocument +endProperty [property1] [false] +beginParagraph +onWord [Paragraph] +onSpace +beginProperty [property] [true] +onWord [value] +endProperty [property] [true] +endParagraph +endDocument +.#----------------------------------------------------- +.expect|xhtml/1.0 +.#----------------------------------------------------- +

value

value2

< +/div>

value3

Paragraph value

+.#----------------------------------------------------- +.expect|xwiki/2.0 +.#----------------------------------------------------- +%%property **value** + +%%property1 ((( + %%property2 value2 + %%property3 value3 +))) + +Paragraph %%property(value) +.#----------------------------------------------------- +.input|xhtml/1.0|skip +.#----------------------------------------------------- +

value

value2

< +/div>

value3

Paragraph value

\ No newline at end of file #P xwiki-core-rendering-parser-doxia Index: src/main/java/org/xwiki/rendering/internal/parser/doxia/DoxiaGeneratorListener.java =================================================================== --- src/main/java/org/xwiki/rendering/internal/parser/doxia/DoxiaGeneratorListener.java (revision 18885) +++ src/main/java/org/xwiki/rendering/internal/parser/doxia/DoxiaGeneratorListener.java (working copy) @@ -503,4 +503,24 @@ { // Nothing to do since Doxia doesn't support the notion of Error events. } + + /** + * {@inheritDoc} + * + * @see org.xwiki.rendering.listener.Listener#beginProperty(String, boolean) + */ + public void beginProperty(String propertyURI, boolean isInline) + { + // Nothing to do since Doxia dioesn't suypport the notion of semantic properties + } + + /** + * {@inheritDoc} + * + * @see org.xwiki.rendering.listener.Listener#endProperty(String, boolean) + */ + public void endProperty(String propertyURI, boolean isInline) + { + // Nothing to do since Doxia dioesn't suypport the notion of semantic properties + } }