Archive for 2010年10月21日|Daily archive page

newLISP で GUI する。。。または、gs:text-pane の “text/html” モード

 EPUB Viewer で書いたように、gs:text-pane の “text/html” モードは、全ての HTML タグに対応しているわけではないようです。
 そこで、それを試すスクリプトを用意しました。

; utility
(define *newlispDir* (env "NEWLISPDIR"))
(load (append *newlispDir* "/guiserver.lsp")) 
; define sub-routine

; define handler
(define *fileName* (real-path))
(define *filemask* "htm HTM html HTML")
(define *description* "html file")
(define (openfile-action id op file)
  (when file
    (setq *fileName* (base64-dec file))
    (cond ((directory? *fileName*)
           (setq *fileName* (append  *fileName* "\\")))
          (true (gs:set-text 'InputArea (read-file *fileName*))))
    (gs:set-text 'Status *fileName*)))
(define (open-file-dialog)
  (gs:open-file-dialog 'Frame 'openfile-action *fileName* *filemask* *description*))
(define (textCallBack id text)
  (when text 
    (let (word (base64-dec text))
      (gs:set-text 'OutputArea word)
)))
(define (button-handler id)
	(gs:get-text 'InputArea 'textCallBack))

; initialization
(gs:init)
(define FPosX 50)
(define FPosY 50)
(define FWidth 800)
(define FHeight 480)
(gs:frame 'Frame FPosX FPosY FWidth FHeight "Simple HTML Tester")
(gs:panel 'ButtonPanel)
(gs:panel 'StatusPanel)
(gs:label 'Status (real-path))
(gs:button 'Button1 'button-handler "->")
(gs:button 'fileButton 'open-file-dialog "File")
(gs:text-pane 'InputArea 'gs:no-action "text/plain") 
(gs:set-syntax 'InputArea "html")
(gs:text-pane 'OutputArea 'gs:no-action "text/html")
;(gs:set-editable 'OutputArea 'nil)
(gs:split-pane 'SplitPanel "vertical" 0.5)
(gs:add-to 'SplitPanel 'InputArea 'OutputArea)
(gs:label 'TextLabel "TEXT/PLAIN mode ")
(gs:label 'HtmlLabel " TEXT/HTML mode")
(gs:add-to 'ButtonPanel 'TextLabel 'Button1 'HtmlLabel)
(gs:add-to 'StatusPanel 'fileButton 'Status)

; mount all on frame
(gs:set-border-layout 'Frame)
(gs:set-flow-layout 'ButtonPanel "center")
(gs:set-flow-layout 'StatusPanel "left")
(gs:add-to 'Frame 'ButtonPanel "north" 'SplitPanel "center" 'StatusPanel "south")
(gs:set-visible 'Frame true)

; main routine
(gs:listen)
(exit)

 これを実行すると、

 こんな感じで、左側のパネルにHTMLコードを入力して、上部真ん中のボタンを押すと右側のパネルに “text/html” モード表示されます。
 左下の File ボタンで HTML ファイルを読み込み表示させることもできます。
 保存ボタンはありません。gs:text-pane の “text/html” モードで表示できるかどうかを試すスクリプトですから(笑)。

 さて、これを使って EPUB 本体の XHTML 調べてみると、表示の邪魔しているのは、文字コードを指定してる

<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />

 でした。<head></head> タグや <style></style> タグは、使えるようです。
 ということで、EPUB Viewer のスクリプトの内、

    (letn (str (replace {<\?.+\?>} (read-file file) "" 0)
           book1 (aif (find {<head>} str) (0 it str) str)
           book2 (aif (find {</head>} str) ((+ it 7) str) "")
           book (append book1 book2))

 の部分は、

    (let (book (replace {<\?.+\?>} (read-file file) "" 0))
       (replace {<meta http-equiv[^>]*>} book "" 4)

 で、十分だったわけです。
 また、ずいぶん、遠回りしてしまいました(汗)。
 
 以上、如何でしょうか?