Подобно последнему комментарию в # 9874, как получить доступ к Ember.Handlebars.Utils.escapeExpression
современным способом, не импортируя все ember
? Мне нужно экранировать HTML в моем приложении (потому что я украшаю некоторый ввод пользователя разметкой), прежде чем пометить его как htmlSafe()
и я не могу найти никакого способа сделать это, не написав свою собственную функцию экранирования или не импортировав какой-либо аддона.
@ 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
и удалить эти строки
@ peabnuts123 Я нашел это.
https://github.com/ember-cli/ember-rfc176-data/issues/12#issuecomment -315103656
https://github.com/ember-cli/ember-rfc176-data/pull/18#issuecomment -315105054
Да, хорошие ссылки - я нашел ту же тему в своих путешествиях. Я думаю, что идея на будущее состоит в том, чтобы напрямую импортировать его из 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 = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''',
'`': '`',
'=': '=',
};
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 };
А как насчет использования для этого специального пакета?
sanitize-html поддерживает экранирование запрещенных тегов
dompurify (очень похоже на sanitize-html) позволяет вам сохранить некоторые теги или атрибуты или удалить нежелательный html, оставляя контент на месте, среди прочего. Я использую dompurify в emberobserver, чтобы разрешить rel
.
@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)
Самый полезный комментарий
Нам это нужно.
Прямо сейчас вам нужно либо / или:
@rwjblue сказал:
Что насчет сейчас? Что-то возможное, о чем я должен знать?