рдЖрдо рд▓рд┐рд╕реНрдк рдкрд░ рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдЗрдЯ

рдкрд░рд┐рдЪрдп









рдпрд╣ рдЖрд▓реЗрдЦ рд╕рд╛рдорд╛рдиреНрдп рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд▓рд┐рд╕реНрдк рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред



рдореИрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╡реЗрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдореБрдЦреНрдп рдЪреАрдЬреЗрдВ рд▓рд┐рд╕реНрдк - рдЯреЗрдореНрдкрд▓реЗрдЯ, рд░реВрдЯрд┐рдВрдЧ рдФрд░ рдХреИрд╢рд┐рдВрдЧ рдкрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдореИрдВрдиреЗ рдореИрдХреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдереЛрдбрд╝реА рдЬрдЧрд╣ рдЫреЛрдбрд╝ рджреАред



рд▓реЗрдЦ рднрд╛рд░реА рд╢реИрдХреНрд╖рд┐рдХ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реИ - rigidus.ru







рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдФрд░ рдЙрдирдХрд╛ рд╕рдВрдХрд▓рди





{namespace tpl} {template root} <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">{\n} <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">{\n} <head>{\n} <title>{$headtitle}</title>{\n} <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />{\n} <link rel="stylesheet" type="text/css" media="screen" href="/style.css" />{\n} <link rel="Shortcut Icon" type="image/x-icon" href="/favicon.ico" />{\n} </head>{\n} <body id="top">{\n} {$content | noAutoescape}{\n} </body>{\n} </html>{\n} {/template}
      
      







CL-CLOSURE-TEMPLATE рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕ рд╕рд░рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ tpl рдкреИрдХреЗрдЬ рдореЗрдВ рд░реВрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╢реАрди рдХреЛрдб рдореЗрдВ рдлреНрд▓рд╛рдИ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рдбреЗрдЯрд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрдХрд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╣реИ:



 (tpl:root (list :headtitle " " :content "Hello world"))
      
      







"рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдЖрдзрд╛рд░" рдЯреЗрдореНрдкрд▓реЗрдЯ, рдЬреЛ рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреНрдпреВрдирддрдо рдЧреНрд░рд┐рдб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:



 {template base} <div id="center"> <div class="col1 left"> <a id="logo" href="index.html"> <img src="http://www.gravatar.com/avatar/d8a986606b9d5e4769ba062779e95d9f?s=45" style="border: 1px solid #7F7F7F"/> </a> <ul id="nav"> {foreach $elt in $navpoints} {call navelt data="$elt" /} {/foreach} </ul> </div> {$content |noAutoescape} <div class="clear">.</div> </div> <div id="footer"> <p> <a href="/about">About</a> | <a href="/contacts">Contacts</a> </p> </div> {/template}
      
      







рдЕрдм, рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд▓реЗрдЦ habrahabr.ru/blogs/webdev/111365 рдФрд░ рд╣рдорд╛рд░реЗ рд╣реМрд╕рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдкреГрд╖реНрда рд╕реЗ рдПрдХ рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз-рдкреНрд░реЗрд╖рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:



 (defun request-dispatcher (request) (tpl:root (list :headtitle "My home page" :content (tpl:base (list :navpoints ..-.. :content ..-..)))))
      
      







рд░реЗрд╕реНрдЯрд╛рд╕ рд░реВрдЯ





RESTAS рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣рдореЗрдВ рдкреНрд░реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЖрдХрд░реНрд╖рдХ рд▓реЗрдЦрди рд╕реЗ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред

рдЕрдм рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдорд╛рд░реНрдЧреЛрдВ (рдорд╛рд░реНрдЧреЛрдВ) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбрд┐рд╕реНрдкреИрдЪрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:



 (restas:define-route main ("") (tpl:main (list :headtitle "My main page" :content "Hello! <a href=\"/articles\">Articles</a>"))) (restas:define-route css ("/css/:cssfile") (hunchentoot:handle-static-file (format nil "~a/css/~a" *base-dir* cssfile)))
      
      







- рдпрд╣ рдХреНрдпрд╛ рдмрдХрд╡рд╛рд╕ рд╣реИ? - рдПрдХ рдкрд░рд┐рд╖реНрдХреГрдд рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдкреВрдЫреЗрдВред - рдХреНрдпрд╛ рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ css- рдлрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдП?



"рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВ!" - рдореИрдВ рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛ред рдЖрдк рдПрдХ рд▓рдВрдмреЛрджрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЖрд╡рд╢реНрдпрдХрддрд╛, рдЬреЛ рддрдп рдХрд░реЗрдЧрд╛ рдХрд┐ рдорд╛рд░реНрдЧ рдЙрдкрдпреБрдХреНрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣рд╛рдВ рд╡рд╣ рдЕрджреНрдпрддрди рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╛рдЗрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдбрд┐рд╕реНрдХ рдкрд░ рдЦреЛрдЬрдиреЗ рдкрд░ рджреЗрддрд╛ рд╣реИ:



 (restas:define-route static ("/:staticfile" :requirement (lambda () (let ((request-file (pathname (format nil "~a/~a" *base-dir* (hunchentoot:request-uri hunchentoot:*request*)))) (files (directory (format nil "~a/*.*" *base-dir*)))) (not (null (find request-file files :test #'equal)))))) (hunchentoot:handle-static-file (format nil "~a/~a" *base-dir* staticfile)))
      
      







рдпрд╣рд╛рдВ рд╣рдордиреЗ рдореБрдЦреНрдп рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдФрд░ рд╕реАрдПрд╕рдПрд╕-рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ - рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :: рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб



рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛





рдореИрдВ рдУрдЖрд░рдЬреА-рдореЛрдб, рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЗрдореИрдХреНрд╕ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд▓реЗрдЖрдЙрдЯ рдХреА рдЖрд╕рд╛рдиреА (рдЬреИрд╕реЗ рдХрд┐ рд╡рд┐рдХреА) рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЯреВрд▓ рдЬреИрд╕реЗ рдХрд┐ рдХреЛрд▓реИрдкрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИред рдореИрдВрдиреЗ рдПрдХ org-to-html рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд╛ рд╣реИ,

рдЬреЛ рдореИрдВ рдСрд░реНрдЧ-рдореЛрдб рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓реЗрдЦ рдХреЗ рдкрд╛рда рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП html рдмрдирд╛рддрд╛ рд╣реИ рд╣реЗрдбрд░ рд╕реЗ рд▓реЗрдЦ рдореЗрдВ рд╕реАрдзреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреБрднрд╛рдЧреЛрдВ рдФрд░ рдЙрдкрдЦрдВрдбреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рднреА рджреЗрддрд╛ рд╣реИред



рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рдж рдореЗрд░реА рдлрд╝рд╛рдЗрд▓ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддреА рд╣реИ, рдореБрдЭреЗ рдХреБрдЫ рд╣реЗрдбрд░ рдмрджрд▓рдиреЗ рдФрд░ рдХреЙрд▓ рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреГрд╖реНрда рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:



 (defmacro default-page (menu file-path &optional (body nil)) `(let ((menu-memo ,menu)) (multiple-value-bind (content sections directives) (org-to-html (alexandria:read-file-into-string ,file-path)) (let ((title (getf directives :title))) ,body (page title menu-memo (tpl:default (list :title title :navpoints menu-memo :sections (loop :for i :from 1 :for section :in sections :collect (list :anchor (format nil "anchor-~a" i) :level (format nil "level-~a" (car section)) :title (cadr section))) :content content)))))))
      
      







рдЕрдм рдореИрдВ рди рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдореЗрдВ рдЬрдЯрд┐рд▓ рдХреЙрд▓ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдмрд▓реНрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреЗрдЬ рдХреЗ рдЕрдВрджрд░ рдХрд┐рд╕реА рднреА рдХреЛрдб рдХрд╛ "рдЗрдВрдЬреЗрдХреНрд╢рди" рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:



 (restas:define-route about ("/about") (default-page (menu) (base-path "about.org") ;;     -  (let ((cnt (length sections))) ;;      e (setf title (format nil "~a тАФ ~a " title cnt)))))
      
      







рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рд╕рд╛рд░реНрдердХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдХреИрд╢рд┐рдВрдЧ





рдореЗрд░реЗ рд▓реЗрдЦ рдореЗрдЯрд╛-рдЗрдирдлрд╝реЙрд░реНрдореЗрд╢рди рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╣реИрдВ: рд╢реАрд░реНрд╖рдХ рдФрд░ рд╢реНрд░реЗрдгрд┐рдпрд╛рдВред "/ рд▓реЗрдЦ" рдкреГрд╖реНрда рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реВрдВ, рдЬреЛ рд╕рдордп рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдбреЗрдЯрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдмрдВрдж рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВ, рдЬреЛ рдпрд╣ рдХреЛрдб рдХрд░рддрд╛ рд╣реИ:



 (let ((memo)) (restas:define-route articles ("/articles") (when (null memo) (setf memo (default-page (menu) (base-path "articles.org") (setf content ;;  ,    ;;   (    ) )))) memo))
      
      







рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╢ рд╕рдордп рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рдирд╛ рд╣реЛ рдЬрд╛рдП, рддреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрд▓рдо рдореЗрдВ рдЬрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЗрд╕ рдХреЛрдб рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдкрд░ Ctrl + X, Ctrl + E рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдХреИрд╢ рдХреЛ рд╢реВрдиреНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ред рдПрдХ рдирдпрд╛ рд▓реЗрдЦ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ (рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ)

рдмрд╣реБрдд рдмрд╛рд░) рдореИрдВ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ - рдпрд╣ рддреБрд░рдВрдд рдХреБрдЫ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИред



рд╡рд┐рд╡рд░рдг рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП:

рдореИрдВрдиреЗ github.com/rigidus/rigidus.ru рдкрд░ рд╕реНрд░реЛрдд рдХреЛрдб рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛

рдФрд░ рд╕рд╛рдЗрдЯ рд╣реА rigidus.ru рдкрд░ рд╣реИ

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд╣ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╣рдмреНрдмреА рдХреЗ рд╕рд╛рде рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рддрд╛ рд╣реИред



All Articles