Выполнение математических операций внутри статических шаблонных строк

У меня есть приложение nodejs, которое принимает объект json со строковыми шаблонами внутри него. В настоящее время я использую пакет строка-шаблон для заполнения шаблонов:

{
  "template": "https://example.com/{value}/{index}",
}

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

{
  "template": "https://examplesite.com/{index * 2}
}

Здесь важна безопасность, поэтому я не хочу добавлять в шаблоны какие-либо предложения eval. Можно ли безопасно выполнять простые математические операции (+, -, /, *, ^) в строках javascript?

Какую библиотеку вы используете? Это не встроенный стиль строк шаблона.

Christian Scott 03.10.2018 23:08

@ChristianScott, я редактировал вопрос (использую строка-шаблон)

andykais 03.10.2018 23:12

AFAIK это просто статическая вещь - вам нужно будет передать объект с предварительно вычисленными значениями: «Простая функция строкового шаблона, основанная на именованных или индексированных аргументах». Он не выполняет код (опять же, AFAIK). Возможно, вам понадобится другой шаблонизатор, если вы хотите выполнять код.

Dave Newton 03.10.2018 23:17

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

andykais 03.10.2018 23:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
719
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Из документации не похоже, что строковый шаблон поддерживает выражения внутри шаблонов.

Допустим, вы хотите удвоить любое значение, входящее в «индекс». Вам нужно будет удвоить это значение при форматировании:

var foo = {
  "template": "https://examplesite.com/{index}"
}

format(foo.template, {
    index: index * 2
})

Другой вариант может заключаться в использовании встроенных в javascript строк шаблона, заключенных в функцию:

function renderTemplate(index) {
  return `https://examplesite.com/${index * 2}`
}

Вы можете поместить любое выражение в эти шаблоны.

Литералы шаблонов ES6 раскрываются немедленно, вы не можете использовать их для генерации вывода из динамических данных. Вы также не можете читать шаблон динамически.

Barmar 03.10.2018 23:38

Мне нужно, чтобы логика была перенесена в шаблоны, приложение будет использовать разные шаблоны, и некоторые из них могут нуждаться в математических операциях, а другие нет. Что касается встроенных строк шаблона, шаблоны необходимость должны храниться в json, поэтому использование в них javascript не является вариантом

andykais 03.10.2018 23:40
Ответ принят как подходящий

Я нашел решение своей проблемы с помощью Рули.

import Handlebars from 'handlebars'

Handlebars.registerHelper('+', (x, y) => x + y)
Handlebars.registerHelper('-', (x, y) => x - y)
Handlebars.registerHelper('*', (x, y) => x * y)
Handlebars.registerHelper('/', (x, y) => x / y)

const createTemplate = (templateStr) => {
  const template = Handlebars.compile(templateStr)
  return (data) => template(data)
}

вот как это используется

createTemplate("test {{'+' val 2}}")({ val: 13 }) // yields 15

Это работает именно так, как мне было нужно, и даже может выполнять вложенные математические задачи.

createTemplate("test {{'*' ('+' val 2) 3}}")({ val: 13 }) // yields 45

Другие вопросы по теме