CL-WHO всегда начинается с одинарной цитаты
Моя проблема в том, что 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 ответ
@jkiiski был правильным ответом в комментариях под моим вопросом, но я хотел опубликовать ответ, чтобы любой, кто сталкивался с подобной проблемой в будущем, мог решить эту проблему. Как сказал @jkiiski, в пакете cl-who есть переменная с именем ATTRIBUTE-QUOTE-CHAR, которая по умолчанию равна #\'. Вы можете просто установить эту переменную на #\"вместо того, чтобы кавычки по умолчанию были двойными кавычками:
(setf *attribute-quote-char* #\")
После добавления этой строки кода в верхней части файла мой HTML по умолчанию:
onclick="alertUser('id')"
и теперь Ja vaScript может выполняться правильно. Благодарим @jkiiski за правильный ответ.