CL-WHO всегда начинается с одинарной цитаты - PullRequest
2 голосов
/ 24 апреля 2019

Моя проблема в том, что CL-WHO начинает каждое выражение с одного рынка котировок, когда оно превращает S-выражения Lisp в вывод html. Это нормально в большинстве случаев, но это проблема, так как я связываю свой файл с внешним файлом javascript. Я пытаюсь сделать этот проект простым, и поскольку никто из разработчиков javascript в моей команде не знает Common Lisp, использование parenscript, вероятно, выходит за рамки уравнения. Вот пример моей проблемы и одной из ошибок в моей программе:

:onclick "alertUser('id')"

Когда в html-документе нажимается определенный элемент, это должно вызвать функцию JavaScript с именем alertUser, а идентификатор тега должен быть передан функции JavaScript в качестве аргумента. Но независимо от того, что я делаю, CL-WHO преобразует эту строку в одинарные кавычки, поэтому я получаю недопустимое выражение. Вот что этот код преобразует в:

onclick='alertUser('id')'>

Все это одинарные кавычки, поэтому 'alertUser (') передается как первая строка, которая явно недействительна, и я получаю область синтаксиса в моих инструментах разработчика. Я подумал, что могу решить эту проблему, используя функцию форматирования с escape-символами . Это будет равно:

CL-USER> (format t "\"alertUser('id')\"")
"alertUser('id')"
NIL
CL-USER> 

Но когда я попробую это с CL-WHO:

:onclick (format nil "\"alertUser('id')\"")

Это означает:

onclick='"alertUser('locos-tacos-order')"'>

Что также является недействительным HTML. Как видите, CL-WHO начнёт с одинарной цитаты, несмотря ни на что. Затем я попробовал функцию CL-WHO fmt:

:onclick (fmt "\"alertUser('locos-tacos-order')\"")

Когда я использую функцию fmt, она полностью избавляется от выражения my: onclick при преобразовании в html!:

id='id'"alertUser('id')">

Наконец, я попробовал функцию str и получил аналогично недействительный вывод для моей первоначальной попытки:

onclick='"alertUser('id')"'

Очевидно, что если я напишу это в чистом HTML, это будет выглядеть так:

onclick="alertUser('id')">

Что действительно. Мой вопрос состоит в том, как просто разрешить CL-WHO использовать двойные кавычки в этих ситуациях вместо одинарных кавычек?

1 Ответ

2 голосов
/ 24 апреля 2019

@ jkiiski был правильным ответом в комментариях под моим вопросом, но я хотел опубликовать ответ, чтобы любой человек с подобной проблемой в будущем мог решить эту проблему.Как сказал @jkiiski, в пакете cl-who есть переменная с именем ATTRIBUTE-QUOTE-CHAR , которая по умолчанию имеет значение # \ '.Вместо этого вы можете просто установить эту переменную на # \ ", чтобы в качестве стандартных кавычек использовались двойные кавычки:

(setf *attribute-quote-char* #\")

После добавления этой строки кода в верхней части файла мой html по умолчанию будет иметь следующий вид:

onclick="alertUser('id')"

и теперь javascript может работать должным образом. Предоставьте @jkiiski за правильный ответ.

...