Archive for 2010年11月1日|Daily archive page

newLISP で GUI する。。。または、天気予報を表示する。

以下のスクリプトには、UTF-8 版 newLISP が必要です。

 今回は、guiserver を使って、天気予報を表示させます。使う天気予報は、日本気象協会の tenki.jp のものです。
 具体的には、例えば、仙台市なら

http://tenki.jp/forecast/point-326.html

 からデータを取り出し、gs:text-pane の “text/html” モードで表示させます。
 上記 URL から分かりますように、326 が仙台市の番号です。ちなみに 1 は、札幌市です。
 ということで、スクリプトを、

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

; define global variable
;(define point 1) ; 札幌市
(define point 326) ; 仙台市
;(define point 744) ; 横浜市
;(define point 1974) ; 与那国町
(define tenki-url (string "http://tenki.jp/forecast/point-" point ".html"))

; define handler
(define (delete-tag html)
  (replace "<[^>]+>" html "" 1))
(define (delete-comment html)
  (replace "<!--[^>]+-->" html "" 0))
(define (button-handler id)
  (let (weather (get-url tenki-url))
    (regex {<div class="titleBgLong">(([^v]*)*(v+[^>][^v]*)*)</div>} weather 0)
    (gs:set-text 'leftTitle (append (delete-tag $0) (dup " " 4)))
    (letn (tmp (regex {(<table(([^e]*)*(e+[^>][^e]*)*)*/table>)} weather (+ 2048 4))
          today $1
          i (apply + (-2 tmp)))
      (gs:set-text 'TodayArea today)
      (regex {<div class="titleBgLong">(([^v]*)*(v+[^>][^v]*)*)</div>} (i weather) 0)
      (gs:set-text 'rightTitle (append (dup " " 4) (delete-tag $0)))
      (regex {(<table.+/table>)+} (i weather) (+ 2048 4))
      (gs:set-text 'WeekArea (delete-comment $0))
    )))

; initialization
(gs:init)
(define FPosX 50)
(define FPosY 50)
(define FWidth 1000)
(define FHeight 480)
(gs:frame 'Frame FPosX FPosY FWidth FHeight "天気情報 from tenki.jp")
(gs:panel 'ButtonPanel)
(gs:label 'leftTitle "")
(gs:label 'rightTitle "")
(gs:button 'Button1 'button-handler "renew")
(gs:text-pane 'TodayArea 'gs:no-action "text/html")
;(gs:set-editable 'TodayArea 'nil)
(gs:text-pane 'WeekArea 'gs:no-action "text/html")
;(gs:set-editable 'WeekArea 'nil)
(button-handler)
(gs:split-pane 'SplitPanel "vertical" 0.55)
(gs:add-to 'SplitPanel 'TodayArea 'WeekArea)
(gs:add-to 'ButtonPanel 'leftTitle 'Button1 'rightTitle)

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

; main routine
(gs:listen)
(exit)

 このスクリプトを UTF-8 版 newLISP で起動すると、

 こんな感じで表示されます。
 tenki.jp の文字コードは UTF-8 ですから、UTF-8 版 newLISP は必須です。
 Windows でも、UTF-8 版 newLISP が使えるようになっているので、この程度のスクリプトで済みました。
 UTF-8 コード使っていない Linux では、文字コード変換が必要ですけどね。
 私は、puppy Linux なので、問題ないですが。
 地域にを変えるには、

(define point 326) ; 仙台市

 の 326 を表示させたい地域の番号に変えるだけ。

 以上、如何でしょうか?