2017-02-16 3 views
1

Я хочу выполнить замену переменных на строку (я уже исключил шаблонные литералы, потому что строка должна быть сохранена и оценена позже).javascript - заменить в строковый шаблон, но поймать недостающие переменные

Усы или что-то в этом роде похоже на соперника, но я хочу знать, была ли замена незавершенной. В этом случае, это производить URLs, поэтому недостающие части означают недопустимые URLs:

тестирование этого в узле:

var Mustache = require('mustache'); 
var result = Mustache.render("/someurl/{{path1}}/{{path2}}/", {path1:"my-path-to-1"}) 
console.log(`result:${result}:`) 

Это происходит без проблем, но в результате URL бесполезно, потому что Усы молча заменили отсутствует path2 с пустой строкой. То, что я хотел бы видеть, - это исключение, которое бросает (лучше всего) или не может легко распознать, что не все было заменено.

Примечание: строка шаблона является произвольной, а также содержимым объекта подстановки.

выход:

result:/someurl/my-path-to-1//: 

Это эквивалентно Python, что я ищу:

res = "/someurl/%(path1)s/%(path2)s/" % {"path1":"my-path-to-1"} 

выход:

KeyError: 'path2' 

ответ

0

Я закончил с использованием Sprintf, который имеет преимущество иметь другой формат, чем Mustache (или Django), чтобы вы могли вставлять его в data-url или тому подобное:

const sprintf = require("sprintf-js").sprintf; 

var o_substit = { 
    path1 : "mypath1" 
}; 

var T_URL = "/someurl/%(path1)s/%(path2)s/"; 


console.log(`\nT_URL:${T_URL}, substitutions:`); 
try { 
    console.dir(o_substit); 
    console.log("expecting a failure...") 
    var url = sprintf(T_URL, o_substit); 
    console.log(` url:${url}:`); 
} 
catch (e){ 
    console.log(` exception:${e}`); 
}; 

var o_substit = { 
    path1 : "mypath1" 
    ,path2 : "mypath2" 
}; 


console.log(`\nT_URL:${T_URL}, substitutions:`); 
try{ 
    console.dir(o_substit); 
    console.log("\nexpecting a success:") 
    var url = sprintf(T_URL, o_substit); 
    console.log(` url:${url}:`); 
} 
catch (e){ 
    console.log(` exception:${e}`); 
}; 

выход:

T_URL:/someurl/%(path1)s/%(path2)s/, substitutions: 
{ path1: 'mypath1' } 
expecting a failure... 
    exception:Error: [sprintf] property 'path2' does not exist 

T_URL:/someurl/%(path1)s/%(path2)s/, substitutions: 
{ path1: 'mypath1', path2: 'mypath2' } 

expecting a success: 
    url:/someurl/mypath1/mypath2/: