Как написать действительный HTML из жидкого тега? - PullRequest
0 голосов
/ 22 апреля 2020

Контекстуализация

Я изучаю, как работать с Джекиллом, и сейчас пытаюсь разработать свой первый жидкостный тег. Это будет целью моего таланта данного сообщества StackExchange.

Таким образом, когда я добавляю {% flair stackoverflow %} на страницу, его следует заменить на эквивалентный HTML. Ниже следует код:

module Jekyll
    class FlairTag < Liquid::Tag

        def initialize(tag_name, community, tokens)
            super
            @community = community
        end

        def render(context)
            output = \
            "<a href=\"{{ #{@community}.url }}/users/{{ #{@community}.id }}/{{ site.data.stackexchange.user.nickname }}\">" \
                "<img src=\"https://stackexchange.com/users/flair/{{ site.data.stackexchange.user.id }}\" " \
                    "width=\"208\" height=\"58\" " \
                    "title=\"Profile for {{ site.data.stackexchange.user.nickname }} on {{ include.label }}\">" \
                    "alt=\"Profile for {{ site.data.stackexchange.user.nickname }} on {{ include.label }}\"" \
            "</a>"

            return output
        end
    end
end

Liquid::Template.register_tag('flair', Jekyll::FlairTag)

Вопрос

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

Есть ли что-то, что я упускаю? Или есть другой способ выписать код HTML как возвращение тега ruby function / liquid?

1 Ответ

1 голос
/ 22 апреля 2020

Ваши жидкие выражения типа {{ site.data.stackexchange.user.id }} здесь не будут интерпретироваться. Вам нужно использовать переменные для вывода ваших данных.

Поскольку я предполагаю, что вы храните свои данные в файле _data / stackoverflow.yml , который может выглядеть следующим образом:

url: https://stackoverflow.com
id: 2989289
user: artu-hnrq

Этот код сделает работу:

module Jekyll
    class FlairTag < Liquid::Tag

        def initialize(tag_name, community, tokens)
            super
            # if this tag is called with {% flair stackoverflow %}
            # the "community" variable will be "stackoverflow "
            # in order to remove the trailing space, we strip the variable
            @community = community.strip
        end

        def render(context)
            site = context.registers[:site]
            data = site.data[@community]
            url  = data["url"]
            id   = data["id"]
            user = data["user"]
            alt  = "Profile for #{user} on #{@community}"

            output = %(
              <a href="#{url}/users/#{id}/#{user}">
                <img src="#{url}/users/flair/#{id}.png"
                     width="208" height="58"
                     title="#{alt}"
                     alt="#{alt}"
              </a>
            )
        end
    end
end

Liquid::Template.register_tag('flair', Jekyll::FlairTag)

Примечание: с моей точки зрения, если этот фрагмент находится в уникальном месте на вашем сайте (cv, footer, ...), это может это достигается простым включением.

Повышение производительности практически не происходит, если этот тег не нужно настраивать для каждой страницы, а ваш код может обслуживаться кем-то, обладающим только знаниями html / liquid.

...