Чи можуть шаблони Уста зробити розширення шаблону?

Я новачок у вусів.

Багато шаблонів мов (наприклад, Django / Jinja ) дозволить вам розширити "батьківський" шаблон таким чином ...

base.html

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

frontpage.html

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

Foobar!

{% endblock %}

надана сторінка 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

В даний час усаті.ява, 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, джерело
Схоже, що Twitter Hoogian підтримує спадщину, зараз. Див. Це недавнє зобов'язання: Хоган 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 , очікуючи, що такий шаблон іменування допоможе зберегти імена файлів керованими).

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>

привіт.мустахе:

{{#

and then to play with three levels deep, subпривіт.мустахе:

{{#

Візуалізація 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>

Rendering subпривіт.мустахе:

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>

Я щойно написав це через двадцять хвилин, і я в минулому використовував лише ручки handle.js і вперше лише зараз, тому все ідеї "вуса" ще не глибоко. Але це, здається, працює?

1
додано

Якщо ви задоволені лише кодом на стороні сервера, Nun - це шаблонна система, подібна до вуса, що розширює функціональність за допомогою її " шаблон перевизначення " - моделюється на django. В той час, як він працює, воно більше не підтримується його автором.

0
додано

У вузлі.js ви можете використовувати express-handlebars або hogan-express мати шаблони шаблонів маски inna, однак способи їх виконання різні, в жодному з них ви не встановлюєте макет у самому шаблоні макети зареєстровані у вашому коді додатка.

0
додано
ІТ КПІ - Python
ІТ КПІ - Python
625 учасників

Канал обговорень про всякі штуки зі світу пайтону. Прохання: 0. мати повагу одне до одного; 1. не матюкатися в сторону людей; 2. не захламляти тред повідомленнями по одному слову;

ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram