jade template engine (under node.js): multi-line block without pipe symbol

前端 未结 2 434
半阙折子戏
半阙折子戏 2021-02-05 12:11

I\'m currently using Jade on a new project. It seems well-suited to composing webapp layouts, but not for writing static content, such as a web page of

elements containing

2条回答
  •  夕颜
    夕颜 (楼主)
    2021-02-05 12:32

    After some tinkering, I worked out the details of a filter that accomplishes this. Posting the answer here since I imagine this will be useful to others using jade.

    The code to create the filter turns out to be quite simple:

    var jade = require ("jade");
    
    jade.filters.text = function(block, compiler){
        return new TextBlockFilter(block).compile();
    };
    
    function TextBlockFilter(node) {
        this.node = node;
    }
    
    TextBlockFilter.prototype.__proto__ = jade.Compiler.prototype;
    
    TextBlockFilter.prototype.visit = function(node){
    
        // first this is called with a node containing all the block's lines
        // as sub-nodes, with their first word interpreted as the node's name
        //
        // so here, collect all the nodes' text (including its name)
        // into a single Text node, and then visit that instead.
        // the child nodes won't be visited - we're cutting them out of the
        // parse tree
    
        var text = new jade.nodes.Text();
        for (var i=0; i < node.length; i++) {
            text.push (node[i].name + (node[i].text ? node[i].text[0] : ""));
        }
        this.visitNode (text);
    };
    

    And then the markup looks like this. Note that it allows you to include other jade stuff in between :text blocks:

    p
      :text
        This is my first line of text,
        followed by another
        and another.  Now let's include a jade link tag:
      a(href="http://blahblah.com")
      :text
        and follow it with even more text 
        and more,
        etc
    

提交回复
热议问题