You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@velocity.apache.org by Jean-Baptiste BRIAUD -- Novlog <j-...@novlog.com> on 2011/05/12 10:49:48 UTC
Re: Directive indenting ?
I'm sorry, I had to give up as I was not able to load my resource while using it.
I have no time for trying more.
Here is the version using the StringBuilder.
import org.apache.velocity.runtime.resource.loader.FileResourceLoader;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
public class StructuredGlobbingResourceLoader extends FileResourceLoader {
public static String FOLDER;
public static class VTLIndentationGlobber extends FilterInputStream {
protected StringBuffer buffer = new StringBuffer(AbstractTemplateEngine.BUFFER_SIZE);
protected int bufpos = 0;
protected enum State {
defstate, hash, comment, directive, schmoo, eol, eof
}
protected State state = State.defstate;
public VTLIndentationGlobber(InputStream is) {
super(is);
}
private void cleanBuffer() {
buffer.delete(0, buffer.length());
}
// TODO - multiline comments #* ... *# not taken into account for now in all cases
public int read() throws IOException {
while (true) {
switch (state) {
case defstate: {
int ch = in.read();
switch (ch) {
case (int) '#':
state = State.hash;
cleanBuffer();
bufpos = 0;
return ch;
case (int) ' ':
case (int) '\t':
buffer.append((char) ch);
break;
case -1:
state = State.eof;
break;
default:
buffer.append((char) ch);
state = State.schmoo;
break;
}
break;
}
case eol:
if (bufpos < buffer.length()) return (int) buffer.charAt(bufpos++);
else {
state = State.defstate;
cleanBuffer();
bufpos = 0;
return '\n';
}
case eof:
if (bufpos < buffer.length()) return (int) buffer.charAt(bufpos++);
else return -1;
case hash: {
int ch = (int) in.read();
switch (ch) {
case (int) '#':
state = State.directive;
return ch;
case -1:
state = State.eof;
return -1;
default:
state = State.directive;
cleanBuffer();
buffer.append("##");
return ch;
}
}
case directive: {
int ch = (int) in.read();
if (ch == (int) '\n') {
state = State.eol;
break;
} else if (ch == -1) {
state = State.eof;
break;
} else return ch;
}
case schmoo: {
int ch = (int) in.read();
if (ch == (int) '\n') {
state = State.eol;
break;
} else if (ch == -1) {
state = State.eof;
break;
} else {
buffer.append((char) ch);
return (int) buffer.charAt(bufpos++);
}
}
}
}
}
public int read(byte[] b, int off, int len) throws IOException {
int i;
int ok = 0;
while (len-- > 0) {
i = read();
if (i == -1) return (ok == 0) ? -1 : ok;
b[off++] = (byte) i;
ok++;
}
return ok;
}
public int read(byte[] b) throws IOException {
return read(b, 0, b.length);
}
public boolean markSupported() {
return false;
}
}
@Override
public synchronized InputStream getResourceStream(String name) {
final String ressource = name;
return new VTLIndentationGlobber(super.getResourceStream(ressource));
}
}
On 23 mars 2011, at 14:04, Jean-Baptiste BRIAUD -- Novlog wrote:
> OK, I'll try the FileResourceLoader as it failed at runtime with the WebappResourceLoader.
> I already change the code to use StringBuilder.
>
> I'll share it with pleasure !
> Let me just validate it work for me with the FileResourceLoader.
>
> On 23 mars 2011, at 14:01, Claude Brisson wrote:
>
>> As noted on the wiki page, this custom resource loader extends WebappResourceLoader but you can do exactly the same while extending FileResourceLoader.
>>
>> If you do so, be sure to share it! Also, the code could probably be optimized a bit (for instance by using a StringBuilder instead of a String for its inner buffer).
>>
>>
>> Claude
>>
>> On 2011-03-23 10:47, Jean-Baptiste BRIAUD -- Novlog wrote:
>>> It doesn't compile :
>>> the WebappResourceLoader class is not found.
>>> I guess it is in the velocity-tool.jar extra lib ... I'll try, I have several emergency in parallel :-)
>>> If my guess is correct, I'll just have to add a new dependency on my project.
>>> I'll let you know.
>>>
>>> On 22 mars 2011, at 17:20, Claude Brisson wrote:
>>>
>>>> It's a very straightforward input filter that uses the common resource loading API - it should work well with 1.7.
>>>>
>>>> It's the filter itself that should be considered beta.
>>>>
>>>> Claude
>>>>
>>>> On 2011-03-22 14:33, Jean-Baptiste BRIAUD -- Novlog wrote:
>>>>> Does it work with current 1.7 (latest stable) version or should I migrate to V2 beta ?
>>>>> If yes, is that beta version stable enough ?
>>>>>
>>>>> On 22 mars 2011, at 11:41, Jean-Baptiste BRIAUD -- Novlog wrote:
>>>>>
>>>>>> Thanks for the pointer ! For years, I was thinking it was not possible.
>>>>>>
>>>>>> On 21 mars 2011, at 20:52, Claude Brisson wrote:
>>>>>>
>>>>>>> Yet, you can check a custom resource loader available on the wiki that does precisely this:
>>>>>>> http://wiki.apache.org/velocity/StructuredGlobbingResourceLoader
>>>>>>>
>>>>>>>
>>>>>>> Claude
>>>>>>>
>>>>>>> On 2011-03-21 19:50, Sergiu Dumitriu wrote:
>>>>>>>> On 03/21/2011 07:04 PM, Rich Wagner wrote:
>>>>>>>>> Sorry in advance if this is a FAQ whose answer I haven't found...
>>>>>>>>>
>>>>>>>>> Instead of writing:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> #foreach( $container in $Containers )
>>>>>>>>> #if( $container.prop("Generate") )
>>>>>>>>> ...stuff...
>>>>>>>>> #end
>>>>>>>>> #end
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I'd like to indent the "#if" and its "#end", for the sake of better readability:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> #foreach( $container in $Containers )
>>>>>>>>> #if( $container.prop("Generate") )
>>>>>>>>> ...stuff...
>>>>>>>>> #end
>>>>>>>>> #end
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> But then I find the spaces before the "#if" and its matching "#end" show up in the output, which I don't want to happen.
>>>>>>>>>
>>>>>>>>> To get around this, I've implemented a somewhat hack-ish Template preprocesser: my resource loader wraps a template's stream inside my own stream implementation which filters template lines. That is, if a line starts with "<white-space>#blah", the initial spaces are trimmed off.
>>>>>>>>>
>>>>>>>>> That works, and isn't all that intrusive. But if "off-the-shelf" Velocity already provides an easier way to accomplish the same thing, I'd prefer that...
>>>>>>>> No, there's no similar feature directly in Velocity yet.
>>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: user-unsubscribe@velocity.apache.org
>>>>>>> For additional commands, e-mail: user-help@velocity.apache.org
>>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: user-unsubscribe@velocity.apache.org
>>>>>> For additional commands, e-mail: user-help@velocity.apache.org
>>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: user-unsubscribe@velocity.apache.org
>>>>> For additional commands, e-mail: user-help@velocity.apache.org
>>>>>
>>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: user-unsubscribe@velocity.apache.org
>>>> For additional commands, e-mail: user-help@velocity.apache.org
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: user-unsubscribe@velocity.apache.org
>>> For additional commands, e-mail: user-help@velocity.apache.org
>>>
>>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: user-unsubscribe@velocity.apache.org
>> For additional commands, e-mail: user-help@velocity.apache.org
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@velocity.apache.org
> For additional commands, e-mail: user-help@velocity.apache.org
>
---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@velocity.apache.org
For additional commands, e-mail: user-help@velocity.apache.org