Nano Hash - криптовалюты, майнинг, программирование

Enlive и теги в произвольных местах

Вот что происходит с enlive 1.1.5 (изменения исходного форматирования/пробелов добавлены для ясности):

blogen.core> (html/sniptest "<html><head>
                                <title><span id=\"foo\"/></title>
                              </head></html>"
                            [:#foo] (html/substitute "f"))
"<html><head><title></title></head></html>f"

blogen.core> (html/sniptest "<html><head>
                                <title><span id=\"foo\"/></title>
                              </head></html>"
                            [:#foo] (constantly "f"))
"<html><head><title></title></head></html>f"

Я хочу написать постоянный префикс в исходниках HTML, чтобы мой код clojure не насыщался моим конечным контентом. Но, как показывает приведенный выше фрагмент, у меня не может быть тегов span внутри title. Второй тест с использованием основной функции constantly показывает, что любое дополнительное преобразование, написанное пользователем, вряд ли будет успешным.

Я бы не хотел использовать ${vars}, потому что в шаблонах они выглядят глупо. Я предпочитаю писать достойные примеры в шаблонах, которые enlive можно потом заменить без повреждений.

Мотивация

Мне бы понравилось писать шаблоны в виде HTML и использовать элементы span с определенными id в качестве переменных заполнителей, в основном. Но enlive не анализирует эти теги span внутри тегов title как хотелось бы. Чтобы вещи были менее завершенными. Примеры:

<title><span id="article-name"/> - <span id="my-site" /></title>

or

<p>Welcome, <span id="visitor-ip" /></p>
21.01.2014

  • Не могли бы вы пояснить, что вы подразумеваете под написанием постоянного префикса в исходниках HTML, чтобы мой код clojure не насыщался моим конечным контентом? 21.01.2014
  • Если я неправильно понимаю, что вы хотите сделать, не могли бы вы вместо этого установить содержимое title с помощью (... "..." [:title] (html/content "f"))? 21.01.2014
  • @DanielNeal: например, заголовок сайта, который остается одинаковым на каждой странице, плюс динамическая часть, сгенерированная с помощью clojure, которая полностью заменит элемент span. 21.01.2014

Ответы:


1

Согласно спецификации HTML5, тег <title> ContentModel — это Text, что означает, что в нем не разрешены элементы HTML.

Часть Enlive, которая анализирует HTML, вероятно, может обрабатывать только допустимый HTML, поэтому она не будет хорошо работать с тегом <span> внутри тега <title>.

У вас есть несколько вариантов.

Можно просто установить содержимое тега <title>, а не заменять его полностью, например:

(html/sniptest "<html><head><title>Placeholder</title></head></html>"
               [:title] (html/content "foo"))

;; => <title>foo</title>

Или, если вы хотите сохранить часть заголовка постоянной, вы можете использовать append или prepend

(html/sniptest "<html><head><title>Some Title</title></head></html>"
                [:title] (html/append " - sub page"))

;; => <title>Some Title - sub page</title>

ИЗМЕНИТЬ

Я знаю, вы сказали, что хотите избегать ${vars}, но в данном случае они делают именно то, что вы ищете...

(html/sniptest "<html><head><title>${my-site} - ${article-name}</title></head></html>"
               [:title] (html/transform-content
                          (html/replace-vars
                             {:article-name "Using Enlive for good and evil"
                              :my-site "Clojure Weekly"})))

;; =>  <title>Clojure Weekly - Using Enlive for good and evil</title>
21.01.2014
  • Отлично. Как только я понял, что спецификация определяет содержимое заголовка как текстовые узлы, стало понятно, что enlive не анализирует его. Кроме того, мне нравится трансформер append, который достаточно хорош :) 21.01.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..