Спасибо за пример @doowb, ваш код работал, но не за то, что я пытался сделать.Я действительно хотел что-то более сложное, но я упростил свой вопрос, не зная, что это будет проблемой.Код, который вы предоставили, работал (я думаю, после небольшой настройки) для простого рендеринга шаблона, но мои шаблоны используют такие помощники, как #each и #if, которые и вызвали проблему.Где помощники были в моем шаблоне, я получил асинхронные заполнители.Например: <a $ASYNC$1$3...>
Позже я узнал, что это связано с тем, как отображаются частичные данные.Понимание того, что привело меня к подвыражениям и приведенному ниже решению.
Сохраняя мой пример выше с некоторыми изменениями, я смог объединить партиалы.
Во-первых, я упростил заполнитель в text.json, по сути, до уникального идентификатора, вместо того, чтобы пытаться отрисовывать частичное там.
В шаблоне hbs, который я рендерил, например,страницу или что-то еще, я включил помощник вставки с 3 аргументами.Первые два являются подвыражениями, каждое из которых возвращает сглаженные частичные значения в виде строк.Ключевым моментом здесь является то, что подвыражения обрабатывают и возвращают результат перед завершением текущего процесса с помощью помощника.Таким образом, два сплющенных шаблона затем отправляются помощнику вместе с заполнителем для поиска.
Помощник использует третий аргумент в шаблоне регулярных выражений.Он ищет второй аргумент (плоский родительский шаблон) для этого шаблона.Когда он найден, он заменяет каждый экземпляр шаблона первым аргументом (да, это глобальная точная замена).
Таким образом, сплющенная дочерняя строка вставляется в родительский элемент каждый раз, когда указывается местозаполнитель.
Первый аргумент
(partial "link" link.apple)
Возвращает
'<a href="http://www.apple.com" target="_blank">apple</a>'
SecondАргумент
(partial "text" text.text-example)
Возвращает
'<p class="text font--variant">If you need a computer, go to {{linkToApple}}.</p>'
Третий аргумент
'linkToApple'
text.json
{
"text-example": {
"elm": "quote",
"classes": [
"text",
"font--variant"
],
"text": "If you need a computer, go to {{linkToApple}}."
}
}
text.hbs
<{{elm}} class="{{#eachIndex classes}}{{#isnt index 0}} {{/isnt}}{{item}}{{/eachIndex}}">{{text}}</{{elm}}>
compile.hbs
{{insert (partial "link" link.apple) (partial "text" text) 'linkToApple' }}
compile.html
<p class="text font--variant">If you need a computer, go to <a href="http://www.apple.com" target="_blank">apple</a>.</p>
gulpfile.js
app.helper('insert', function(child, parent, name) {
const merged = parent.replace(new RegExp('\{\{(?:\\s+)?(' + name + ')(?:\\s+)?\}\}', 'g'), child);
const html = new handlebars.SafeString(merged);
return html;
});
Надеюсь, это поможет кому-то еще.Я знаю, что это может использовать улучшения, я постараюсь обновить его, когда вернусь к очистке файла gulp.