Come posso tagliare gli spazi Velocità

Ho un metodo chiamato render_something che può creare un sacco di spazi vuoti, per esempio:

<a href="#">#render_something('xxx')</a>

Il risultato può essere:

<a href="#">     

           something that generate from redner_something


              </a> 

Che, in realtà, io voglio essere come questo:

<a href="#">something that generate from redner_something</a>

Non la velocità è qualcosa di simile a questo?

#trim(#render_something('xxx'))

 

7 Replies
  1. 13

    Ho appena letto questo articolo su Velocità Spazi Inghiottendo che propone una serie di soluzioni tra cui Velocità Spazi Troncato Da Riga Di Commento.

    Questo fondamentalmente suggerisce commentando le interruzioni di riga da inserire commenti alla fine di ogni riga. Si suggerisce anche di non rientro il codice della macro per evitare il superfluo (uno dei miei preferiti di parole) spazi che si verificano.

    TBH non è una grande soluzione, ma possono soddisfare le vostre esigenze. Semplicemente mettere ## alla fine di ogni riga della macro e che renderà le cose un po ‘ più bello… una sorta di

    • Può essere un’alternativa. Grazie per il suggerimento. Tuttavia, la mia situazione non è possibile utilizzare il tuo suggerimento, perché non riesco a cambiare render_something.
    • Il ## soluzioni non funziona per noi.
    • Il # # # anche non funziona per me. Tutte le idee perché?
  2. 7

    Sembra solo java native trim() funziona.

    $someValue.trim() funziona per me

    • Questo non funziona per me. Sono sicuro che la mia variabile non contiene spazi (vietato dalla regex), ma si è aggiunto, dopo l’unione della velocità del motore. Aggiungere il trim() non cambia nulla. Tuttavia l’aggiunta di doppio hash ## funziona bene.
  3. 2

    Soluzione

    Nella classe in cui si crea l’VelocityEngine, aggiungere un metodo come segue

    public String trim(String str) {
        return str.trim()/*.replace("\n", "").replace("\r", "")*/;
    }

    poi aggiungere la seguente VelocityContext che si crea:

        context.put("trimmer", this);

    e, infine, nella velocità modello fare le seguenti

    <a href="#">$trimmer.trim("#render_something('xxx')")</a>

    Perché funziona?

    Sebbene il comportamento di Velocità è di definire chiaramente, può essere un po ‘ difficile da vedere come funziona a volte. Separato trim()-metodo è necessario per ottenere il char-sequenza dal modello in un metodo Java che consente di visualizzare l’effettivo trim() sulla Stringa. Per quanto ne so non c’è nessun rivestimento interno Velocità, ma si può sempre chiamare per Java con trucchi come questo.

    Le virgolette sono necessarie perché il #render_something è solo una macro, non una chiamata di funzione, questo significa che i risultati delle affermazioni nella macro sono messo testualmente nel punto in cui la macro viene “giustiziato”.

    • Mi metterà alla prova questo e indietro.
  4. 2

    Ho faticato un po ‘ a trovare una soluzione semplice per gli spazi inghiottendo, ecco quello che ho, infine, si avvicinò con. È stato ispirato da e Vadzim la risposta di questa pagina http://wiki.apache.org/velocity/StructuredGlobbingResourceLoader

    Il StructuredGlobbingResourceLoader si possono trovare sul sito è un comportamento complesso e non sbarazzarsi di qualsiasi tipo di spazio, così l’ho modificata per ottenere il semplice comportamento: “Eliminare gli spazi bianchi all’inizio delle linee, e aggiungere un commento alla fine di ogni riga” (che impedisce l’interruzione di valutazione). Il filtro viene applicato sul flusso di input al momento del caricamento.

    Questo tipo di velocità modello

    #if($value)
        the value is $value
    #end

    si è trasformata per

    #if($value)##
    the value is $value##
    #end##

    Quindi se vuoi avere gli “a capo” o all’inizio della linea di spazi, dovrete mettere la($br,”\n”) e put($sp,” “) nel contesto come Vadzim spiegato e utilizzare in modo esplicito nel modello. Questo modo di fare che vi permetterà di tenere rientrato modelli, con il massimo controllo.

    prendere la classe di da questa pagina http://wiki.apache.org/velocity/StructuredGlobbingResourceLoader
    modificare la classe estesa per il tipo di caricatore il vostro bisogno (questo utilizza la webapp loader)
    sostituire il metodo read() con il codice che ho di fornire
    utilizzare la classe come risorsa loader nella vostra proprietà. Esempio per la webapp di caricatore: webapp.risorsa.loader.class=…StructuredGlobbingResourceLoader

    public int read() throws IOException {        
        int ch;
        switch(state){
            case bol: //beginning of line, read until non-indentation character
                while(true){
                    ch = in.read();
                    if (ch!=(int)' ' && ch!=(int)'\t'){
                        state = State.content;
                        return processChar(ch);
                    }
                }
    
            case content:
                ch = in.read();
                return processChar(ch);
    
            //eol states replace all "\n" by "##\n"
            case eol1: 
                state = State.eol2;
                return (int)'#';
    
            case eol2:
                state = State.bol;
                return (int)'\n';
    
            case eof: 
                return -1;
        }
        return -1;
    }
    
    //Return the normal character if not end of file or \n
    private int processChar(int ch){
        switch(ch){
        case -1:
            state = State.eof;
            return -1;
        case (int)'\n':
            state = State.eol1;
        return (int)'#';
        default:
            return ch;
        }
    }

    Qualsiasi feedback sul mio attuazione è benvenuto

  5. 1

    Ecco la mia soluzione alternativa per velocità spazi inghiottendo che permette di tabulazione modello di struttura.

    Ogni modello di testo elaborati sul primo carico personalizzata ResourceLoader:

    private String enhanceTemplate(String body) {
        if (!body.startsWith("##preserveWhitespace")) {
            body = body.replaceAll("(##.*)?[ \\t\\r]*\\n+[ \\t\\r]*", Matcher.quoteReplacement("##\n"));
            body = body.trim();
        }
        return body;
    }

    Sostituisce tutte le nuove linee e adjustent spazi con un solo ha commentato newline.

    Interruzioni di riga e tailing gli spazi possono essere inseriti in modo esplicito con $br e $sp, le variabili di contesto predefinito:

    private static final VelocityContext DEFAULT_CONTEXT = new VelocityContext(new HashMap<String, String>() {{
        put("sp", " ");
        put("br", "\n");
    }});
  6. 1

    In alcuni casi, ho dovuto essenzialmente ridurre al minimo i miei script, come avrei js o css. Funziona bene, anche se non è facile per gli utenti di leggere. Un’altra opzione per eliminare l’eccesso di spazio:

    <ul class="tabs">#foreach($par in $bodypars)#set( $parLen = ${_MathTool.toInteger($bodypars.size())} )#set( $parLn = $parLen - 1 )#set( $thClass = 'tb'+${parLn} )#set( $thaClass = '' )#if( $foreach.index == 1 )#set( $thClass = ${thClass}+' selected' )#set( $thaClass = ' selected' )#end#if($foreach.index != 0 && $parLen <= $maxTabs)#set ( $btitle = $_XPathTool.selectSingleNode($par,'item-subtitle') )<li class="${thClass}">#if($!btitle && $btitle != '')<a href="#" class="#cleanString($btitle.value.toLowerCase())${thaClass}">$_SerializerTool.serialize($btitle, true)</a>#end</li>#end#end</ul>

Lascia un commento