Как разрешить фильтрацию простого текста в теги HTML в NodeJS и PUG? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть веб-приложение на NodeJS и PUG / Jade. Я хочу отделить логи c приложения, контролируемого разработчиком, от текстового контента, контролируемого маркетологом и переводчиками, сохраняя при этом весь исходный код интегрированным. (Я спросил о способах этого разделения здесь и не получил ответов на момент написания этой статьи).

Для Engli sh я использую JSON объект en.json с:

{
  "404": {
    "notFound": "Page not found"
  }
}

контроллер загружает его с помощью:

let localText = require('./en.json');
res.status(404).render('404', {
  text: localText
});

и представление отображает его с помощью:

h1 #{text['404'].notFound}

Я хотел бы включить ссылки в JSON Объект, такой как:

{
  "404": {
    "notFound": "Page not found. Go to <a href=\"www.twitter.com\">Twitter</a>, maybe?"
  }
}

NodeJS отображает страницу с исходным кодом, а не со ссылкой. Я временно исправил это, разделив его на три части:

{
  "404": {
    "notFound1": "Page not found. Go to",
    "notFound2": "Twitter",
    "notFound3": ", maybe?"
  }
}

и вид:

h1 #{text['404'].notFound1} #[a(href="www.twitter.com") #{text['404'].notFound2}] #{text['404'.notFound3}

И теперь стало трудно поддерживать.

I из этой страницы понять, что я мог бы создать фильтр для предварительной обработки всех ссылок, например:

options.filters = {
  'my-own-filter': function (text) {
    text = text.replace("Twitter", "<a href=\"www.twitter.com\">Twitter</a>")
    /* all other replacements */
    return text;
  }
};

Я не смог найти способ передачи таких параметров фильтра в веб-приложение, чья единственная строка PUG - app.set('view engine', 'pug');.

Как я могу предварительно обработать простой текст с помощью NodeJS и Jade, чтобы заполнять ссылки и красиво отображать их пользователю браузера?

1 Ответ

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

Вы должны иметь возможность использовать синтаксис неэкранированной строки синтаксис (!{variable}) вместо обычного синтаксиса интерполяции строки (#{variable}), чтобы HTML отображался правильно.

В вашем случае:

h1 !{text['404'].notFound}

Но имейте в виду это предупреждение из документации Мопс :

Осторожно

Имейте в виду, что буферизация неэкранированного контента в ваши шаблоны может быть очень рискованной, если этот контент предоставляется вашими пользователями бесплатно. Никогда не доверяйте пользовательскому вводу!

...