Пользовательская строка шаблона - PullRequest
1 голос
/ 31 марта 2020

Я ищу способ дать пользователю возможность определить литерал шаблона. Этот шаблон будет отправлен в бэкэнд и использован с данными, которые он предоставил.

Пример сценария:

const dataSentToBackend = [
  {
    name: 'Adam',
    country: 'Spain'
  },{
    name: 'Eve',
    country: 'Germany'
  }
]

Пользователь хочет сгенерировать два файла, подобные этому: {name} from {country} (или что-то еще иначе что пусть он использует теги как ему нравится). Таким образом, файлы в этом примере будут именоваться как Adam from Spain и Eve from Germany.

. Хитрость заключается в том, что шаблон необходимо сохранить как шаблон, чтобы его можно было использовать, когда данные фактически обрабатываются в бэкэнде. Таким образом, он может использоваться в al oop, который называет файлы один за другим массивом dataSentToBackend.

До сих пор я нашел только функцию String.raw (благодаря этой странице) , но я не нашел это очень полезным для меня (или я не понял этого).

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Вот один из способов сделать это. Я использовал регулярное выражение [a-z]+ для имени свойства, которое вы могли бы расширить, если вам нужно разрешить больше символов (прописные буквы, подчеркивания, цифры и т. Д. c.)

const dataSentToBackend = [
  {
    name: 'Adam',
    country: 'Spain'
  }, {
    name: 'Eve',
    country: 'Germany'
  }
]

const templateSentToBackend = "{name} from {country}";

serverSideReplace = (template, datas) =>
  datas.map(data => template.replace(/\{([a-z]+)\}/g, (_, key) => data[key]));

console.log(serverSideReplace(templateSentToBackend, dataSentToBackend));
0 голосов
/ 31 марта 2020

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

А для ее фактического использования вы можете попробовать что-то вроде этого.

const templateString = "Hello ${this.name}!"; // replace it with unescaped template 
const templateVars = {
    name: "world"    
}

const fillTemplate = function(templateString, templateVars){
    return new Function("return `"+templateString +"`;").call(templateVars);
}

console.log(fillTemplate(templateString, templateVars));

Но я бы определенно сказал, что не позволяет пользователю определять шаблоны и использовать их, если у вас нет действительно solid сценария очистки.

...