Экранирование HTML-тегов в строке Smalltalk


Я отчаянно пытаюсь написать очень простой метод в Smalltalk, чтобы избежать HTML-тегов ('').

До сих пор это то, что я придумал:

escapeHtml: str
    |tags newString tmpString|
    newString := String new.
    tags := Dictionary new.
    tags at: '<' put: '&lt;'.
    tags at: '>' put: '&gt;'.
    tags keysAndValuesDo:
    [ :k :v |
        tmpString := str copyReplaceAll: k with: v.
        newString := tmpString
    ].
    ^newString
!
К сожалению, он, по-видимому, заменяет только самый последний пункт словаря tags. Что я делаю не так? Вероятно, я должен также отметить, что у меня очень мало опыта в Smalltalk. Интерпретатор выбора - это "Сикс".
1 2

1 ответ:

Я думаю, что вы хотели сделать что-то вроде

newString := str

, а затем в блоке keysAndValuesDo::

tmpString := newString copyReplaceAll: k with: v.

Потому что прямо сейчас вы генерируете tmpString для каждой пары ключ/значение с заменой только одного ключа. Чем вы назначаете его newString. Для достижения поставленной цели необходимо отправить copyReplaceAll: в строку, обработанную на предыдущей итерации. Это можно сделать, отправив сообщение в newString, но для того, чтобы первая итерация работала, вы должны присвоить значение str оно.

P.S. Я также думаю, что эта более чистая версия должна работать:

escapeHtml: str
    |tags newString|
    newString := str copy.
    ...
    tags keysAndValuesDo: [ :k :v | newString replaceAll: k with: v ].
    ^newString