Могут ли шаблоны Mustache делать расширение шаблона?

Я новичок в Усы.

Многие языки шаблонов (например, Django / Jinja ) позволят вам расширить «родительский» шаблон, например ...

base.html

<html><head></head>
    <body>
    {% block content %}{% endblock %}
    </body>
</html>

frontpage.html

{% extends "base.html" %}
{% block content %}

Foobar!

{% endblock %}

render frontpage.html

<html><head></head>
    <body>
    

Foobar!

</body> </html>

I'm aware of Mustache's partials (e.g., {{>content}}), but those seem to be just includes.

Существует ли расширение шаблона для Усы? Или, если это не так, существует ли хотя бы некоторый шаблон проектирования, который эффективно включает включает в эквиваленты расширения шаблона.

51

8 ответы

Недавно я оказался в одной лодке, за исключением того, что я пришел с фона мако.

Усы не допускают расширения шаблона/наследования, но есть несколько доступных вам вариантов, о которых я знаю.

  1. You could use partials:

    {{>header}}
        Hello {{name}}
    {{>footer}}
    
  2. You could inject template pre-processing functions into the context for each template that needs to inherit from some other page:

    {{#extendBase}}      
        Hello {{name}}
    {{/extendBase}} 
    

    Hash:

    {
       "name": "Walden",
       "extendBase": function() {
           return function(text) {
               return "<html><head></head>" + render(text) + "</body></html>"
           }
       }
    }
    
  3. Prepend and append the desired HTML to the relevant pages in your controller.

  4. Have a layout template ala:

    {{>header}}
        {{{body}}}
    {{>footer}}
    

    And render the body in your controller, passing that to the layout template as a variable named body.

  5. Implement template inheritance, pre-mustache, in your code that loads templates.

I wouldn't, however, use the triple mustache because I don't want unescaped HTML to be appearing anywhere, it's just too risky in my opinion.

If someone else has a better solution to this problem I'd love to hear it as well, since I haven't yet taken the plunge in any one of these directions.

59
добавлено
Это то, что частично похоже на способ использования, включает в PHP?
добавлено автор Alvaro, источник
Должно ли # 4 быть «тройными усами?» - {{body}}}
добавлено автор Chris W., источник
Да, к сожалению, вы правы, что исключает №4 для меня. Я обновил ответ.
добавлено автор Walden, источник
В конечном счете, создание многоразовых подшаблонов и реализация наследования в коде загрузки шаблона (т. Е. № 5) является намного более гибким и более безопасным в целом. Проблема с наследованием шаблонов заключается в том, что при написании внешнего шаблона вы никогда не сможете хорошо понять, что требуется (или не требуется) в дочернем шаблоне. Это часто приводит к включению JS/CSS, который может быть необходим для конкретной дочерней страницы (но ненужной для другого) во внешнем шаблоне. Единственный способ избежать этой проблемы при использовании наследования шаблонов - передать требования JS/CSS в качестве переменной.
добавлено автор Walden, источник
добавлено автор Walden, источник
(@Walden Может быть, вы должны добавить № 0 или № 6 в свой список и упомянуть Hoogian? Спасибо за добавление комментария в любом случае :-))
добавлено автор KajMagnus, источник

Я предложил это для спецификации Усы:

https://github.com/mustache/spec/issues/38

В настоящее время mustache.java, hogan.js и phly_mustache поддерживают наследование шаблонов.

12
добавлено
Хотя, в отношении Hogan.js, вы не знаете этого из документации: github.com /twitter/hogan.js/issues/70
добавлено автор Paul D. Waite, источник
Так делает GRMustache.
добавлено автор Gwendal Roué, источник

Усы не поддерживают расширение шаблона.

Если вам действительно требуется расширение шаблона, вы можете захотеть использовать библиотеку, созданную с этой функциональностью, для вашего языка/рамки выбора.


FYI, I'm using Node.js/Express, so I will probably end up using https://github.com/fat/stache

3
добавлено
W Stash не поддерживается, и hogan.js, предлагая замену, похоже, не реализует расширения.
добавлено автор mikemaccana, источник
Теперь Hoogian от Twitter, похоже, поддерживает наследование. См. Недавнюю фиксацию: Hogan 3. Добавить наследование шаблона, ...
добавлено автор KajMagnus, источник

В усах PHP поддерживается наследование шаблонов со версии 2.7.0.

https://github.com/bobthecow/mustache.php/wiki/BLOCKS-pragma

Вы можете узнать свою текущую версию из файла Mustache/Engine.php и найти строку, содержащую:

class Mustache_Engine
{
    const VERSION        = '2.8.0';
    ...
3
добавлено

Вы можете использовать переменные, содержащие HTML. «Тройные усы», такие как {{{variable}}} , возвращают неэкранированный HTML. Это не то же самое, что и расширение шаблонов, но вы можете отобразить frontpage-content.html , а затем поместить свой вывод в переменную content , которая будет передана в базу . HTML .

(Я добавил -content в имя файла frontpage.html с ожиданием, что такой шаблон именования поможет сохранить имена файлов управляемыми.)

3
добавлено

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

Basically we are using lambdas, where a "<" prefix indicates "inherit from this template" (similar to the syntax discussed at https://github.com/mustache/spec/issues/38) and a "$" prefix indicates "this is an inherited section".

import pystache

class NameSpace(object):
    def __init__(self, renderer, vars_={}):
        self.renderer = renderer
        self._content = {}
        self.vars = vars_

    def add_content(self, name, value):
        self._content[name] = value

    def __getattr__(self, key):
        if key in self.vars:
            # regular symbol in the vars dictionary
            return self.vars[key]
        elif key.startswith("<"):
            # an "inherit from this template" directive
            name = key[1:]
            return inheritor(self, name)
        elif key.startswith("$"):
            # a "here's a replaceable section" directive
            name = key[1:]
            if name in self._content:
                # if we have this section collected, return the rendered
                # version
                return sub_renderer(self, name)
            else:
                # else render it here and collect it
                return collector(self, name)
        else:
            # unknown key.
            raise AttributeError(key)

def sub_renderer(namespace, key):
    def go():
        def render(nested):
            return namespace._content[key]
        return render
    return go


def collector(namespace, key):
    def go():
        def render(nested):
            content = namespace.renderer.render(nested, namespace)
            namespace.add_content(key, content)
            return content
        return render
    return go


def inheritor(namespace, name):
    def go():
        def render(nested):
            namespace.renderer.render(nested, namespace)
            return namespace.renderer.render_name(name, namespace)
        return render
    return go

Итак, вот некоторые шаблоны. base.mustache:

<html>

{{#$header}}
    default header
{{/$header}}

{{#$body}}
    default body
{{/$body}}

{{#$footer}}
    default footer, using {{local key}}
{{/$footer}}


</html>

hello.mustache:

{{#

а затем играть с тремя уровнями глубины, subhello.mustache:

{{#

Отображение hello.mustache следующим образом:

renderer = pystache.Renderer(search_dirs=["./templates/"])

print renderer.render_name("hello",
                    NameSpace(renderer, {"local key": "some local key"}))

вывод:

<html>

    new header

    new body, with some local key

    default footer, using some local key


</html>

Рендеринг subhello.mustache:

print renderer.render_name("subhello",
                    NameSpace(renderer, {"local key": "some local key"}))

вывод:

<html>

    new header

    new body, with some local key

    im some new footer


</html>

Я только что написал это через двадцать минут, и я только немного использовал handlebars.js в прошлом и pystache в первый раз, так что вся идея «усов» еще не для меня. Но это работает?

1
добавлено

Если вы довольны только кодом на стороне сервера, Nun - это шаблонная система с усами, расширяющая функциональность через свой ' функция переопределения шаблона - смоделирована на django. Хотя он работает, однако, его автор больше не поддерживает.

0
добавлено

В node.js вы можете использовать express-handlebars или hogan-express , чтобы иметь макеты шаблонов inna усов, но способ, которым они делают что-то другое, ни в одном из них вы не устанавливаете макет в самом шаблоне , макеты регистрируются в вашем коде приложения.

0
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

pro.ruby
pro.ruby
1 181 участник(ов)

Язык программирования Ruby Additional docs: https://rubyreferences.github.io/rubyref/ Invite: https://telegram.me/joinchat/Be4rsT2NuB3CyJaF26j1kA Кто хочет компилировать: @crystal_ru (его синтаксис основан на Ruby) Участник @proDOT

Ruby, Rails, Hanami | dry-rb
Ruby, Rails, Hanami | dry-rb
1 180 участник(ов)

https://telegram.me/rubyjob - Ruby Job По вопросам - @eugene_shved

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Ruby School .us
Ruby School .us
1 045 участник(ов)

Чат-болталка для учеников руби-школы и не только. Правила: https://telegra.ph/Pravila-chata-Rubi-shkoly-03-13

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

Random Ruby Chat
Random Ruby Chat
589 участник(ов)

Правила публикации вакансий: https://t.me/codenamecrud/60865

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском

Rubyata
Rubyata
333 участник(ов)

Коммюнити Ruby и Ruby On Rails Флуд не приветствуются. Вакансии можно публиковать только и ТОЛЬКО по пятницам с хештегом #вакансия.

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community

Ruby Talks
Ruby Talks
236 участник(ов)

Национальная Флеймотека

RubyRush
RubyRush
189 участник(ов)

rubyrush.ru программирование для самых новичков