
this is a my first shot. I do not know what is an s-tree, thus the implementation of 'text-style' (defmethod p-render-html ((s-tree tree) (p text-piece) stream) (with-html-output (stream nil :prologue nil) (let ((text (text-of p))) (if (styled-p text-piece) (styled-str text ) (str text))))) (defun styled-p (text-piece) (if (style-of text-piece) t nil)) (defun styled-str (text) (dolist (style (text-styles text)) (setf text (apply-style style text))) text) ;; or you can use recursive style ;; this is only for light testing (defun text-styles (text) (list 'italic 'bold)) ;; you may change the internals to a macro (aka defstyle ) based for example on a hastable of lambdas ;; rather than using and maintaining/updating ecase form manually (defun apply-style (style text) (with-output-to-string (out) (with-html-output (out nil :prologue nil) (ecase style ('italic (htm (:italic (str text)))) ('bold (htm (:strong (str text)))))))) Regards, Ala'a (cmo-0) On Mon, Nov 23, 2009 at 8:37 PM, Dmitry V'yal <akamaus@gmail.com> wrote:
Hello anyone,
I have a simple problem, but I can't find an elegant solution.
Basically I have a message and two flags, the first one signals message should be rendered in <strong> tag and the second - in <italic>. So there are four possibilities.
Here is the actual code:
(defmethod p-render-html ((s-tree tree) (p text-piece) s) (with-html-output (s nil :prologue nil) (let ((style (style-of p)) (txt (text-of p))) (if style (if (tree-find-prop s-tree style #'bold) (htm (:strong (if (tree-find-prop s-tree style #'italic) (htm (:italic (str txt))) (str txt)))) (if (tree-find-prop s-tree style #'italic) (htm (:italic (str txt))) (str txt))) (str txt)))))
I had to test for each case and it resulted in code duplication. Can it be avoided? What if I had 5 flags or so?
_______________________________________________ cl-who-devel site list cl-who-devel@common-lisp.net http://common-lisp.net/mailman/listinfo/cl-who-devel
-- It does not matter how fast your code is, if it does not work!