Ember.js: Где находится `Ember.Handlebars.Utils.escapeExpression` в модульной системе @ember?

Созданный на 13 июл. 2018  ·  18Комментарии  ·  Источник: emberjs/ember.js

Подобно последнему комментарию в # 9874, как получить доступ к Ember.Handlebars.Utils.escapeExpression современным способом, не импортируя все ember ? Мне нужно экранировать HTML в моем приложении (потому что я украшаю некоторый ввод пользователя разметкой), прежде чем пометить его как htmlSafe() и я не могу найти никакого способа сделать это, не написав свою собственную функцию экранирования или не импортировав какой-либо аддона.

Documentation

Самый полезный комментарий

Нам это нужно.

Прямо сейчас вам нужно либо / или:

@rwjblue сказал:

На данный момент закрываю это. Если нам понадобится добавить эти API в HTMLBars в будущем, это будет просто.

Что насчет сейчас? Что-то возможное, о чем я должен знать?

Все 18 Комментарий

@ peabnuts123 Вы уже нашли ответ? Помогло ли вам получить ответы на свой вопрос на форуме или на форуме сообщества ember?

Я нашел диалог в этом посте, https://medium.com/@bradleyscollins/how -does-one-access-ember-handlebars-utils-escapeexpression-ebbe33093186

Нет, я так и не нашел удовлетворительного ответа, хотя я не публиковал сообщения в Slack или на форуме.

В настоящее время в моем компоненте есть следующее

import Ember from 'ember';
const htmlEscape = Ember.Handlebars.Utils.escapeExpression;

так что в будущем я могу правильно импортировать htmlEscape и удалить эти строки

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

import { htmlEscape } from "Handlebars";

или похожие. У этого есть прискорбная обратная сторона - полагаться на Handlebars для экспорта самих этих функций через API модуля, что, я думаю, мы просто как бы "ждем" на данном этапе.

Пытаясь обновить аддон до более новой версии Ember, я наткнулся на эту проблему.

Поскольку мы не можем полагаться на глобальную переменную Ember а Handlebars не является допустимым модулем, как мы должны перенести этот конкретный фрагмент кода?

import Ember from 'ember';
const htmlEscape = Ember.Handlebars.Utils.escapeExpression;

Нам это нужно.

Прямо сейчас вам нужно либо / или:

@rwjblue сказал:

На данный момент закрываю это. Если нам понадобится добавить эти API в HTMLBars в будущем, это будет просто.

Что насчет сейчас? Что-то возможное, о чем я должен знать?

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

@rwjblue Есть мысли? :)

Ребята, пожалуйста, посмотрите комментарий, закрывающий связанный PR:

После сегодняшнего обсуждения с основной командой мы решили не продвигаться вперед с этим PR, потому что Ember не использует его для внутренних целей и не использует в течение некоторого времени - это всегда был артефакт от самого Handlebars.

В ходе работы над модулем RFC был удален реэкспорт, не связанный с Ember, и авторам было рекомендовано импортировать то, что им нужно, непосредственно из любого конкретного модуля, отличного от Ember (например, rsvp или jQuery). Это по-прежнему наша позиция.

Если вы чувствуете, что у вас все еще есть вариант использования, отправьте RFC.

Я доволен этой позицией / это было моим пониманием на протяжении всего выпуска.

Если люди обнаружат эту проблему в будущем, по-прежнему желая получить доступ к этой функции, вам потребуется доступ к ней напрямую из пакета Handlebars . Однако я думаю, что они все еще не структурировали свой пакет как модуль, т.е. вам может потребоваться импортировать все Handlebars а затем использовать Handlebars.Utils.escapeExpression .

import Handlebars from 'handlebars';
import { htmlSafe } from '@ember/template';

let userInput = getUserInput(); // Something unsafe, e.g. user-controlled text
let escapedInput = Handlebars.Utils.escapeExpression(userInput); // Escape any HTML in this string so that it will render as <, & etc.
let alteredHtml = escapedInput.replace(/hello/g, '<span class="highlight">hello</span>'); // Add some HTML to the text
let safeHtml = htmlSafe(alteredHtml);

// safeHtml is now safe to render in the DOM

@MelSumner

Ember не использует его внутри

Я так понимаю, что эта проблема на 100% связана с апстримом. Из любопытства, есть ли что-то подобное, что можно сделать, используя только утилиты Ember?

@Redsandro

Примерно так должно работать:

// your-app/utils/misc.js

import { isHTMLSafe } from '@ember/template';

const ESCAPE = {
  '&': '&amp;',
  '<': '&lt;',
  '>': '&gt;',
  '"': '&quot;',
  "'": '&#x27;',
  '`': '&#x60;',
  '=': '&#x3D;',
};

const BAD_CHARS = /[&<>"'`=]/g;
const POSSIBLE = /[&<>"'`=]/;

let escapeChar = function(chr) {
  return ESCAPE[chr];
};

// borrowed from Handlebars.utils.escapeexpression
// https://github.com/emberjs/ember.js/pull/18791
let escapeExpression = function(string) {
  if (typeof string !== 'string') {
    // don't escape SafeStrings, since they're already safe
    if (string && isHTMLSafe(string)) {
      return string.toHTML(); // private API, since SafeString isn't public
    } else if (string === null) {
      return '';
    } else if (!string) {
      return String(string);
    }

    // Force a string conversion as this will be done by the append regardless and
    // the regex test will do this transparently behind the scenes, causing issues if
    // an object's to string has escaped characters in it.
    string = String(string);
  }

  if (!POSSIBLE.test(string)) {
    return string;
  }

  return string.replace(BAD_CHARS, escapeChar);
};

export { escapeExpression as escape };

А как насчет использования для этого специального пакета?

@kategengler Это тоже хорошие предложения, но я не думаю, что они взаимодействуют с SafeString в Ember. Однако не во всех случаях использования.

SafeString - это строка, отмеченная пользователем как безопасная, она не выполняет никакого экранирования и не имеет никаких ожиданий относительно того, что было экранировано, если что-либо. Вы можете использовать любую библиотеку экранирования, которая вам нравится. Как сказал @MelSumner , Ember больше не использует внутренние функции экранирования.

@pzuraq Да, но разве библиотека экранирования не должна знать, является ли строка безопасной строкой или нет? Чтобы знать, следует ли ему избегать их?

И мне кажется, что сам класс SafeString плюс метод toHTML являются частными.

Это не большая проблема + я не против использования частных API (или, возможно, они не являются частными - это мое недоразумение), но мне кажется, что сделать их общедоступными было бы полезно в вышеупомянутом отношении.

@sandstrom Я не думаю, что API htmlSafe должен когда-либо разворачиваться и определенно не изменяться. Насколько я понимаю, он предназначен для использования только на _edge_ вашего состояния, поэтому, как только вы действительно будете готовы поместить строку где-нибудь в DOM.

Я дважды проверю, чтобы узнать об этом. FWIW, также были дискуссии о наличии нового htmlSafe API, который имеет некоторые другие преимущества (например, вы, вероятно, хотите иметь возможность выполнять проверки типа (eq '' someHtmlSafeString) ), так что, возможно, возможность разворачивать и перематывать строки может быть добавлена ​​в будущем, если я прав насчет текущего API.

@pzuraq Хорошо, я доволен этим! 😄

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

Удачных вам выходных и спасибо за всю отличную работу, которую вы (и другие) проделываете на Ember! 🏅

(для справки, вот мой пиар о том, чтобы сделать escapeExpression общедоступным https://github.com/emberjs/ember.js/pull/18791)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги