[opencms-dev] cms:parse tag usage

Olli Aro olli_aro at yahoo.co.uk
Fri Sep 12 08:52:03 CEST 2008


Excellent, thanks for this example. I have it all now figured out. It looks
like I was almost there, but just overwriting wrong functions :)

Anyway, I have now documented the whole process at
http://www.opencms-wiki.org/Custom_Content_Parser for next person interested
in this.

Regards,

Olli

-----Original Message-----
From: Michael Emmerich [mailto:m.emmerich at alkacon.com] 
Sent: 11 September 2008 14:44
To: olli_aro at yahoo.co.uk
Subject: Re: [opencms-dev] cms:parse tag usage

Olli,


I only have a very simple exmaple for a parser here right now, but I 
hope it helps anyway.....

This one uses a macro resolver to resolve some makros that are in a HMTL 
text node.


The parser is like this:


public class MyHtmlParser extends A_CmsConfiguredHtmlParser {


public String doParse(String html, String encoding, List 
noAutoCloseTags) throws ParserException, CmsException {

  noAutoCloseTags = new ArrayList();
  return super.doParse(html, encoding, noAutoCloseTags);

}

protected I_CmsHtmlNodeVisitor createVisitorInstance() {
    return new MyHtmlVisitor(getCmsObject(), getParam());
}

}

And the Visitor is like this (I skipped all variable declerations)

public final class MyHtmlVisitor extends CmsHtmlParser implements 
I_CmsHtmlNodeVisitor {

     public MyHtmlVisitor(CmsObject cms, String param) {

         super(true);
         initConfiguration(cms, param);
     }


     public void visitStringNode(Text text) {

         String htmlText = text.getText();
         htmlText = m_resolver.resolveMacros(htmlText);
         text.setText(htmlText);
         super.visitStringNode(text);
     }


     private void initConfiguration(CmsObject cms, String param) {
         // configuration of the macro resolver, too much code in here
     }

}

Hope that shows a bit how a simple <cms:parse> does work





Olli Aro schrieb:
> Hi Michael,
> 
> Yes, this is how I did it, but not sure what I need to put in my visitor
> object.
> 
> At the moment I have only overwritten the process method as follows:
> 
> public String process(String html, String encoding) throws ParserException
{
> 
>     	System.out.println("OLLI DEBUG A:"+html);
>         
>         // return the result
>         return html;
>     }
> 
> But if I do this I see the content in System.out, but the content area in
my
> rendered web page is empty :(
> 
> Regards,
> 
> Olli
> 
> -----Original Message-----
> From: Michael Emmerich [mailto:m.emmerich at alkacon.com] 
> Sent: 11 September 2008 09:48
> To: olli_aro at yahoo.co.uk; The OpenCms mailing list
> Subject: Re: [opencms-dev] cms:parse tag usage
> 
> Olli,
> 
>> Thanks for this Michael. Also, can you tell me, if I write my own parser
> is
>> extending org.opencms.util.CmsHtmlParser the best approach or something
>> else?
> 
> 
> Well, try the following:
> 
> The class that is given in the <cms:parse> tag should extend 
> A_CmsConfiguredHtmlParser.
> 
> In the required createVisitorInstance method you must create an instance 
> of the visitor object that extends the CmsHtmlParser and implements the 
> I_CmsHtmlNodeVisitor.
> 
> Kind regards,
> Michael Emmerich
> 
> 
>> Regards,
>>
>> Olli
>>
>> P.S. when I get this working I will document it to OpenCms Wiki, I
promise
>> :)
>>
>> -----Original Message-----
>> From: opencms-dev-bounces at opencms.org
>> [mailto:opencms-dev-bounces at opencms.org] On Behalf Of Michael Emmerich
>> Sent: 10 September 2008 14:37
>> To: The OpenCms mailing list
>> Subject: Re: [opencms-dev] cms:parse tag usage
>>
>> If you use the <cms:parse> or <cms:decorate> tag and have a 
>> <cms:include> inside, this include must use the cacheable="false" 
>> attribute for the include tag.
>>
>>
>> Kind regards,
>> Michael Emmerich
>>
>>
>> Claus Priisholm schrieb:
>>> Hi
>>>
>>> Nope - I looked at the decorate tag at one point, but it did not do what

>>> I wanted. But I was having problems catching the output from the include

>>> tag similar to what you describe, until someone hinted me that I should 
>>> disable the cache. And it did the trick - a simple way of testing if you

>>> get what you expect:
>>>
>>> <c:set var="stuff"><cms:include ... /></c:set>
>>>
>>> and then check
>>>
>>> pageContext.getAttribute("stuff")
>>>
>>> But before I got so far I implemented a tomcat filter to do the job 
>>> instead. There I am using org.htmlparser.Parser to do the work for me:
>>>
>>> Parser parser = Parser.createParser(source, encoding);
>>> NodeList nl = parser.parse(null);
>>>
>>> Html root = null;
>>> for(int i = 0; i< nl.size(); i++) {
>>> 	if(nl.elementAt(i) instanceof Html) {
>>> 		root = (Html)nl.elementAt(i);
>>> 		break;
>>> 	}
>>> }
>>>
>>> NodeList list = root.searchFor(LinkTag.class, true);
>>>
>>> ...and so forth.
>>>
>>> Other options could be JTidy or NekoHTML to do the parsing. Seem to 
>>> recall that HTMLParser wants your document to start with <html> and not 
>>> be a partial document.
>>>
>>> Olli Aro wrote:
>>>> Hi Claus,
>>>>
>>>> Have you ever used cms:parse tag? Do you know how it should work and
how
>> to
>>>> write a custom parser?
>>>>
>>>> I created my own test parser as direct copy of
>>>> org.opencms.util.CmsHtmlParser and still don't get any content through,
>> so
>>>> maybe I am doing something wrong.
>>>>
>>>> Regards,
>>>>
>>>> Olli
>>>>
>>>> -----Original Message-----
>>>> From: Claus Priisholm [mailto:claus.priisholm at gmail.com] On Behalf Of
>> Claus
>>>> Priisholm
>>>> Sent: 09 September 2008 14:38
>>>> To: olli_aro at yahoo.co.uk; The OpenCms mailing list
>>>> Subject: Re: [opencms-dev] need some help on customizing the <cms:link>
>> tag
>>>> What I ran into once I was trying to capture output from the
include-tag
> 
>>>> was that if it is cached, the only output your tag get to see is 
>>>> something that looks like 32 bit ident... So to catch the output of 
>>>> those tags that supports the flex cache you must set "cacheable" to 
>>>> false (on the include tag).
>>>>
>>>> Olli Aro wrote:
>>>>> Ok, added some debugging info to my parser class and it looks that
that
>>>> one
>>>>> is getting called ok with the following tag:
>>>>>
>>>>> <cms:parse parserClass="myClassName" param="config">
>>>>> 		<cms:include element="body" editable="true" />
>>>>> </cms:parse>
>>>>>
>>>>> So, it must be that I have something wrong with my parser
>> implementation.
>>>>> Maybe I will create a copy of org.opencms.util.CmsHtmlParser and take
> it
>>>>> from there... But still if anyone do have custom parser class for me
to
>>>> show
>>>>> that would be very useful :)
>>>>>
>>>>> Regards,
>>>>>
>>>>> Olli
>>>>>
>>>>> -----Original Message-----
>>>>> From: opencms-dev-bounces at opencms.org
>>>>> [mailto:opencms-dev-bounces at opencms.org] On Behalf Of Olli Aro
>>>>> Sent: 09 September 2008 12:41
>>>>> To: 'The OpenCms mailing list'
>>>>> Subject: Re: [opencms-dev] need some help on customizing the
<cms:link>
>>>> tag
>>>>> Hi Michael,
>>>>>
>>>>> Do you have example usage for <cms:parse> tag? How to use it in
> template
>>>> and
>>>>> what is the best way to implement your own parser? Also, if you would
>> have
>>>> a
>>>>> sample custom parser class that would be very useful.
>>>>>
>>>>> I tried to use it with extending org.opencms.util.CmsHtmlParser,
>> returning
>>>>> this as my own implementation of
>>>>> org.opencms.jsp.parse.A_CmsConfiguredHtmlParser and then doing:
>>>>>
>>>>> <cms:parse parserClass="myClassName" param="config">
>>>>> 		<cms:include element="body" editable="true" />
>>>>> </cms:parse>
>>>>>
>>>>> but that did not render anything for the content.
>>>>>
>>>>> Regards,
>>>>>
>>>>> Olli
>>>>>
>>>>> -----Original Message-----
>>>>> From: opencms-dev-bounces at opencms.org
>>>>> [mailto:opencms-dev-bounces at opencms.org] On Behalf Of Michael Emmerich
>>>>> Sent: 04 September 2008 16:26
>>>>> To: The OpenCms mailing list
>>>>> Subject: Re: [opencms-dev] need some help on customizing the
<cms:link>
>>>> tag
>>>>> Kunkun,
>>>>>
>>>>>> Hi Kunkun,
>>>>>>  
>>>>>> for the first part of your question you can possibly use the 
>>>>>> <cms:decorate>-Tag. For further details have a look at the 
>>>>>> OpenCms-Documentation Modules.
>>>>> the <cms:decorate> tag only modified text nodes, this would not help.
>>>>>
>>>>> Use the <cms:parse> tag and write your own parser that is triggered by

>>>>> link tags. Modifiy the link tags with the id, e.g. the hash code of
the
> 
>>>>> target and write this into a database.
>>>>> Sonthing that holds the id, the target and the number of hits.
>>>>> In addition add some code to your link that starts a ajax request when

>>>>> the link is klicked. The target of this ajax reqeust must receive the
> id
>>>>> and increase the number of hits for this id.
>>>>>
>>>>> HTH,
>>>>> Michael
>>>>>
>>>>>
>> ------------------------------------------------------------------------
>>>>>> *Von:* opencms-dev-bounces at opencms.org 
>>>>>> [mailto:opencms-dev-bounces at opencms.org] *Im Auftrag von *kk
>>>>>> *Gesendet:* Donnerstag, 4. September 2008 16:58
>>>>>> *An:* opencms-dev at opencms.org
>>>>>> *Betreff:* [opencms-dev] need some help on customizing the <cms:link>
>> tag
>>>>>> Dear together,
>>>>>>  
>>>>>> my name is kunkun. I am a computerscience-student in Germany. I am 
>>>>>> working on a project, which extends opencms with some new features.
>>>>>>  
>>>>>> The problem is:
>>>>>>  
>>>>>> 1. I have to mark the links, that i create on a site, with something 
>>>>>> like an ID.
>>>>>> 2. Then i have to log the Link ID, whenever the link is clicked on
the
> 
>>>>>> site, when it is made online.
>>>>>>  
>>>>>> Can u give me some Ideas, how to do that?
>>>>>>  
>>>>>> My idea is to create a class, which inherits the internal link class
> of
>>>>>> OpenCms, and change the html-code that is generated during
constuction
> 
>>>>>> of the link.
>>>>>>  
>>>>>> But with which class should I start. There is a class named 
>>>>>> CmsJspTagLink, which can be used with <cms:link>.
>>>>>> The class CmsLinkManager is also used to substitute the name for
links
> 
>>>>>> inside the VFS System. But how do i do
>>>>>> it in general purpose not only for internal links?
>>>>>>  
>>>>>> I am looking for some ideas asap.
>>>>>>  
>>>>>> Thank u very much.
>>>>>>  
>>>>>> Kunkun
>>>>>>
>>>>>>
>>>>>>
>> ------------------------------------------------------------------------
>>>>>> _______________________________________________
>>>>>> This mail is sent to you from the opencms-dev mailing list
>>>>>> To change your list options, or to unsubscribe from the list, please
>>>> visit
>>>>>> http://lists.opencms.org/mailman/listinfo/opencms-dev
> 

-- 
Michael Emmerich

-------------------

http://www.alkacon.com
http://www.opencms.org





More information about the opencms-dev mailing list