Git Product home page Git Product logo

Comments (21)

shepherdwind avatar shepherdwind commented on July 20, 2024

你所说的自定义宏,我写个例子,你看是否合适

vm

#macro (showHead $defaultTitle)
  #showTitle ($defaultTitle)
#end
#set($title = "hello")
#showTitle($title)

js

velocity.render(str, {}, {
  showTitle: function(title){
    return '<title>' + title + '</title>';
  }
});

结果

<title>hello</title>

不过,不是很明白,需要覆盖吗?如果页面上有定义宏,为什么需要覆盖,而不是直接调用?我的理解,如果页面上没有定义宏,可以使用自定义的js函数取代宏。但是自定义的js函数和宏定义同时存在,这个需要覆盖吗?不明白应用场景

from velocity.js.

popomore avatar popomore commented on July 20, 2024

覆盖我只是举个例子,比如现有的 parse 不能满足需求,我可以重写,主要的需求还是自定义宏。

from velocity.js.

shepherdwind avatar shepherdwind commented on July 20, 2024

嗯,parse以前是没有处理,只在web端处理了一下,我一会儿发布下,增加parse功能。

from velocity.js.

popomore avatar popomore commented on July 20, 2024

parse 有一个需求

#parse('/path/to/a.vm'),可以配置多个 dir,~/a ~/b ~/c,根据顺序依次找文件是否存在 (~/a/path/to/a.vm),找到返回,找不到报错。

不过也可以开放出来自己写

from velocity.js.

shepherdwind avatar shepherdwind commented on July 20, 2024

#parse属于比较特殊的宏,还有webx自定义的noescape,对于#parse现在提供静态方法重写的方式来自定义,不过似乎不是很好。先看看,如果不能满足需求,再另外处理吧。

from velocity.js.

popomore avatar popomore commented on July 20, 2024

一楼的需求能支持么,现在很麻烦,每次 render 的时候都要把,macro 加到要 render 的字符串前。

from velocity.js.

shepherdwind avatar shepherdwind commented on July 20, 2024

好了,你看看现在这样够用了不,click me. render方法的第二个参数,传递自定义的js函数宏。

from velocity.js.

popomore avatar popomore commented on July 20, 2024

能否支持嵌套的

macros = {
  cmsparse: function(str){
    return parse(str)
  }
}

或者有什么方案

from velocity.js.

shepherdwind avatar shepherdwind commented on July 20, 2024
var macros = {
  cmsparse: function(str){
    //第二个参数临时变量
    return this.eval(str, {name: "hanwen"});
  },
  d: function($name){
    return this.eval('I am $name!');
  }
};
var vm = '#cmsparse($str)';
var o = {
  str: 'hello $foo.bar, #d()',
  foo: {bar: 'world'}
};

现在这样,使用this.eval,不过现在macros的上下文环境需要强者设置为当前velocity对象实例了,不过这样应该没有问题吧,可以通过this调用很多内部api。test case

from velocity.js.

popomore avatar popomore commented on July 20, 2024

现在 parse 是不是不用这样写了? velocity.Compile.getParseString,也可以直接定义?

from velocity.js.

shepherdwind avatar shepherdwind commented on July 20, 2024

这个这处理自定义的#macro,对于系统定义的parse还没有开放出来,不过,似乎也可以开发出来,你觉得需要开放不?

from velocity.js.

popomore avatar popomore commented on July 20, 2024

我觉得上下文传的 macro 可以覆盖页面和系统定义的 macro。

我现在的 parse 是要自定义的,然后 cmsparse 需要调用 parse,所以像下面这样实现最简单

macros = {
  cmsparse: function(str){
    return macros.parse(str);
  },
  parse: function(str) {

  }
}

from velocity.js.

shepherdwind avatar shepherdwind commented on July 20, 2024

嗯,现在我把#parse, #include这样的宏当成普通的宏一样处理了,原来的方案getParseString已经去掉,全部交给用户自定义吧,这样比较靠谱,不然我还得写#include#evaluate,拿出来还方便。不过,因为需要使用到this内部api,为了保持this不变,调用的时候需要使用macros.include.apply(this, arguments这样方式。

var macros = {

  cmsparse: function(str){
    //为了保持this,请使用apply这样的方式
    return macros.include.apply(this, arguments);
  },

  include: function(str){
    return this.eval(str, {name: "hanwen"});
  },

  parse: function(file){
    return file;
  },

  d: function($name){
    return this.eval('I am $name!');
  }
};

var vm = '#cmsparse($str)';
var vm1 = '#parse("a.vm")';
var o = {
  str: 'hello $foo.bar, #d()',
  foo: {bar: 'world'}
};

from velocity.js.

popomore avatar popomore commented on July 20, 2024

恩,这样好,又比较简洁易于扩展

from velocity.js.

shepherdwind avatar shepherdwind commented on July 20, 2024

我一直想把内部接口开放出来,没想好怎么搞,你的提议很不错。

from velocity.js.

popomore avatar popomore commented on July 20, 2024

恩,可以先发布一个版本了

from velocity.js.

yanni4night avatar yanni4night commented on July 20, 2024

有没有block、extends?

from velocity.js.

shepherdwind avatar shepherdwind commented on July 20, 2024

@yanni4night http://velocity.apache.org/engine/devel/user-guide.html 这份文档,没有看到block和extends的介绍啊,block是define么?

from velocity.js.

yanni4night avatar yanni4night commented on July 20, 2024

@shepherdwind 我确实也没有,不知道大家怎么用,习惯了用twig的extends继承功能,在父模板中留坑,从子模板上溯到父模板渲染感觉比include方便。参考 http://badqiu.iteye.com/blog/558194

from velocity.js.

shepherdwind avatar shepherdwind commented on July 20, 2024

@yanni4night 继承的使用确实要好很多,twig的那种还蛮好的。在velocity模板中实现,还得增加新的block语法才行,这个现在velocityjs没有支持。
不过,我不是很明白,velocity是基于java的模板引擎,就算velocityjs支持继承的语法,又有什么用呢,velocityjs现在还是主要用于模拟java的velocity模板解析过程。

from velocity.js.

shepherdwind avatar shepherdwind commented on July 20, 2024

关于继承的问题,单独到另外一个issue里面讨论吧 #27

from velocity.js.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.