LINUX.ORG.RU

[common lisp] Зацените библиотеку генерации html

 


0

0

Изучаю лисп уже пару-тройку месяцев, и возникла задача удобно генерировать html. Смотрел другие библиотеки, но не понравилась cl-who схема генерации html (взято с http://archimag-dev.blogspot.com/2010/01/hello-world-restas.html):

(define-route main ("" :method :get)
 (who:with-html-output-to-string (out)
   (:html
    (:body
     ((:form :method :post)
      ((:input :name "message"))
      ((:input :type "submit" :value "Send")))))))

Я сделал несколько другую модель генерации, когда функция, генерирующая тег, по сути позволяет использовать &key и &rest параметры одновременно.

Пример (если переделать вышеуказанный):

(load "z.lisp")

(define-route main ("" :method :get)
 (z:html
  (z:body
   (z:form :method "post"
    (z:input :name "message")
    (z:input :type "submit" :value "Send")))))

Мне кажется, так несколько удобней.

Все это удовольствие лежит здесь: http://github.com/zdo/z

Единственная проблема, которая возникла у меня, это то, что макрос define-property-macro (src/z.lisp) «скрытно» (неявно) предлагает использовать внутри него генерируемые переменные property-list и content-list, которые представляют собой список строк, соответственно, для аттрибутов тега и его содержимого. Вопрос в том, как сделать явным факт возможности использования этих переменных?

Как пример неявных переменных:

(define-property-macro div (list :align :title :class)
  (with-double-property-tag "div" properties-list content-list)
Здесь они не объявлены, однако используются. Как отойти от этой модели и сделать явным факт наличия этих переменных?

И, заодно, так как я новичок в лиспе, интересно было бы услышать замечания по поводу кода.

★★

Для генерации разметки в реальных приложениях надо использовать шаблоны, я использую cl-who только для небольших демонстраций.

archimag ★★★
()
Ответ на: комментарий от archimag

Я полагаю, опыта по лиспу у вас больше, поэтому не могли бы вы ответить на поставленный вопрос в первом сообщении?

bk_ ★★
() автор топика

ИМХО самая удобная система генерации html из скобок в plt-scheme:

(define submit-caption "Send")

`(html
  (body
    (form ((method "post"))
      (input ((name "message"))
      (input ((type "submit") (value ,submit-caption))))))

А преобразованием этого в html занимается веб-сервер.

naryl ★★★★★
()

мне больше нравится библиотека, которая написана в Practical Common Lisp, ибо там можно генерить любой html-код (даже с несуществующими тэгами, например чтобы генерить xml-ки)

memnek
()
Ответ на: комментарий от naryl

А можно как-нибудь ознакомиться с твоими шедеврами? :)

power
()
Ответ на: комментарий от memnek

> там можно генерить любой html-код (даже с несуществующими тэгами,

например чтобы генерить xml-ки)


Для cl-libxml2 я написал xfactory, что бы можно было генерить любой xml с поддержкой различных пространств имён, и поначалу для генерации разметки пользовался ей (в restas-wiki это по прежнему используется). Но в итоге все равно пришёл к тому, что шаблоны лучше с какой стороны не посмотри.

archimag ★★★
()
Ответ на: комментарий от korvin_

обыкновенные web-шаблоны, странный вопрос.

я с вебом не знаком


Вот, посмотри - одна из «культовых» технологий (даже дока на русском есть, с ума сойти)

archimag ★★★
()

Весь цивилизованный мир уже с десяток лет талдычит что-то там про «разделение кода, данных и представления», про MVC и тому подобную чепуху. А лисперы, с упорством, достойным поклонения, до сих пор пытаются свалить все в одну кучу: бизнес-логику, данные, разметку.

Вы что, всерьез хотите, чтобы верстальщик или дизайнер копались в вашей лисп-лапше?

Kuka ★★
()
Ответ на: комментарий от Kuka

Впрочем, дайте догадаюсь: дизайнер и верстальщик в данном случае тождественны программисту, то есть это тоже Вы.

Так и запишем: лисп - инструмент кустарей-одиночек.

Kuka ★★
()
Ответ на: комментарий от Kuka

Вам таки интересно, какие библиотеки шаблонов есть для Common Lisp? Или что, кроме озвученного бреда, вы таки хотели сказать?

archimag ★★★
()
Ответ на: комментарий от Kuka

\begin{troll}
Лисперы всерьёз хотят, чтобы дизайнер и верстальщик не копались в html-лапше ;)

А MVC - всего лишь один из подходов и никто не доказал, что на этом развитие остановилось навечно.
\end{troll}

Почитайте комменты. Никто не пишет html скобками кроме как в пятиминуттных игрушках с веб-сервером.

naryl ★★★★★
()
Ответ на: комментарий от naryl

Но любая более серьезная библиотека строится на таких маленьких кирпичиках, как подобная простейшая либа. Или я ошибаюсь?

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

Или я ошибаюсь?

Ты написал очередную миллионную и никому ненужную библиотеку для CL.

baverman ★★★
()
Ответ на: комментарий от Kuka

Вас в детстве лисперы изнасиловали?

На определенном уровне абстракции хтмл придется генерить всё равно, никакая феечка не прилетит и не сделает эту работу за разработчика.

yoghurt ★★★★★
()
Ответ на: Не все ж такие умные от bk_

> Если не хочешь здесь писать, хот линк дай.

Я не совсем пойму, что именно ты хочешь. Ты хочешь узнать про использовании шаблонов для разработки web-приложений? Или про, как работают системы шаблонов? Если последнее, то некоторое описание работы моей cl-closure-template есть здесь: http://archimag-dev.blogspot.com/2010/03/2.html

archimag ★★★
()
Ответ на: комментарий от yoghurt

> На определенном уровне абстракции хтмл придется генерить всё равно

Просто не стоит это делать с помощью синтаксиса на основе s-выражений, как это сделано в cl-who, в упоминавшемся примере из PCL или обсуждаемой библиотеке.

archimag ★★★
()
Ответ на: комментарий от archimag

>Просто не стоит это делать с помощью синтаксиса на основе s-выражений, как это сделано в cl-who, в упоминавшемся примере из PCL или обсуждаемой библиотеке.

Но можно хотя-бы «на основе s-выражений» создавать эти самые шаблоны и оперировать ими? =)

yyk ★★★★★
()
Ответ на: комментарий от yyk

> Но можно хотя-бы «на основе s-выражений» создавать эти самые

шаблоны и оперировать ими? =)


Хм, что имеется в виду?

archimag ★★★
()
Ответ на: комментарий от archimag

Ничего - просто стёб. Если «не стоит» на лиспе генерить непосредственно html по некоему приближённому описанию, а правильно работать с шаблонами (на каждый чих?), то сами шаблоны описывать на лиспе (s-выражениях), надеюсь, можно?

Посмотрел твою ссылку - нельзя :( Почему?

yyk ★★★★★
()
Ответ на: комментарий от yyk

> Посмотрел твою ссылку - нельзя :( Почему?

1. Это очень не удобно в практической работе. Шаблон должен соответствовать результирующей html-странице настолько, насколько это возможно. Для генерации html надо использовать навыки по работе с html, а не с s-выражениями. Подмена понятий здесь не поможет. s-выражения важны для обеспечения некоторых важных свойств Common Lisp, но имеют свои недостатки. При работе с шаблонами достоинства s-выражений не нужны, а недостатки очевидны.

2. Никто из возможных членов команды, как-то дизайнеры, js-программисты и т.п. не оценят s-выражений.


Я в начале написал много кода, генерящего html на основе s-expression. Но у меня много разных проектов и я не могу уделять каждому из них много времени. И когда ты обращаешься к старому коду, в котором больше всего строчек кода посвящено именно генерации html (просто в силу свойств html), то приходиться пробираться сквозь эти дебри в поисках логики. В итоге, я потратил много сил на переписывание всего на основе шаблонов.

archimag ★★★
()
Ответ на: комментарий от archimag

Это всё понятно. Сами шаблоны руками писать? Или всё-же можно и для их генерации лиспом пользоваться? (ладно, потом шаблоны корректировать можно чем и как угодно :))

yyk ★★★★★
()
Ответ на: комментарий от yyk

> хм, с соблюдением всех стандартов w3c?

А что не так со стандартами? Тут буквально вчера читал резюме, где самый яркий скил был «Глубокое знание HTML», гы ) это не квантовая механика...

archimag ★★★
()
Ответ на: комментарий от archimag

>А что не так со стандартами?

Всё так. Только зачем рутинную проверку на соответствие возлагать на меня? =) А не про пост-тестирование, я про «написание в соответствии с...»

yyk ★★★★★
()
Ответ на: комментарий от yyk

> Только зачем рутинную проверку на соответствие возлагать на меня? =)

О какой рутинной проверке идёт речь? Я плохо понимаю...

archimag ★★★
()
Ответ на: комментарий от archimag

ты хочешь сказать, что вот это:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
                      "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <link rel="stylesheet" href="llvm.css" type="text/css" media="screen">
  <title>Building the LLVM C/C++ Front-End</title>
  <meta HTTP-EQUIV="REFRESH" CONTENT="3; URL=GCCFEBuildInstrs.html">
</head>
<body>
<div class="doc_title">
This page has moved <a href="GCCFEBuildInstrs.html">here</A>.
</div>

<!-- *********************************************************************** -->

<hr>
<address>
  <a href="http://jigsaw.w3.org/css-validator/check/referer"><img
  src="http://jigsaw.w3.org/css-validator/images/vcss-blue" alt="Valid CSS"></a>
  <a href="http://validator.w3.org/check/referer"><img
  src="http://www.w3.org/Icons/valid-html401-blue" alt="Valid HTML 4.01"></a>

  <a href="http://llvm.org">LLVM Compiler Infrastructure</a><br>
  Last modified: $Date: 2008-02-13 17:46:10 +0100 (Wed, 13 Feb 2008) $
</address>

</body>
</html>
руками писать проще, нежели использовать _любой_ вышеприведенный способ (да, это не шаблон, «шаблонизировать» этот кусок можешь по своему усмотрению - может действительно станет намного лучше? ;)

yyk ★★★★★
()
Ответ на: комментарий от yyk

> руками писать проще

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

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

archimag ★★★
()
Ответ на: комментарий от archimag

>Во-первых, да

хм, ладно, сойдёмся на том, что тебе (другим, большинству - не суть) удобнее.

yyk ★★★★★
()
Ответ на: комментарий от archimag

Но я все склоняюсь к мысли, что шаблон оперирует все равно на основе функций, подобных моей библиотеке - он же сам не создает строки, хотя это возможно, но, по моему, еще один уровень абстракции ничем не хуже.

То есть, html-код -> some-library (e.g., z-library, cl-who etc) -> templates

Я так понимаю.

bk_ ★★
() автор топика
Ответ на: комментарий от archimag

А как будет называться, например, следующий макрос:

(defmacro some-cms-header (cms-name)
`(html
  (head
   (title ,cms-name)
 ..........)))
?

Как по мне, так это некий шаблон...

За ссылку по шаблонам - спасибо (http://archimag-dev.blogspot.com/2010/03/2.html), но я ее не осилил :). Есть что-нибудь попроще?

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

> Как по мне, так это некий шаблон...

Шаблон, только верстальщики и js-программисты понимают и умеют работать с похожим на html шаблонами, s-expressions для них - неведомая фигня.

За ссылку по шаблонам - спасибо (http://archimag-dev.blogspot.com/2010/03/2.html), но я ее не осилил :). Есть что-нибудь попроще?

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

ss-v
()
Ответ на: комментарий от ss-v

> Почитай официальные доки гугля, система шаблонов там очень проста

Дай пожалуйста линк, а то гугл выдает одни шаблоны оформления для сайтов.

bk_ ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.