#!/usr/bin/env python
# -*- coding: utf-8 -*-
#gnetdict script 檔範例
#License: GNU General Public License
#Author: 洪任諭 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>

import sys, os

#顯示 script 相關資訊
def info():
    print """
script_version=1.0
name=教育部國語辭典
url=http://140.111.34.46/dict/
version=0.1
author=PCMan
"""

def get_webpage( url ):
    import urllib, re
    f = urllib.urlopen( url )
    content = f.read()
    f.close()

    #移除表單,因為 gtkhtml2 無法正確顯示
    reg = re.compile( '.*(<FORM(.*\n)*.*</FORM>)', re.MULTILINE | re.IGNORECASE )
    content = reg.sub('', content)
    return content

#查詢單字,查詢成功把結果網頁內容輸出在 stdout,
#註:stdout 輸出的第一行需為查詢網頁的 url
#並且 return True,否則 return False
def query(word):
    import urllib

    codec=unicode(word, 'utf-8')
    word = codec.encode('BIG5')    #轉成 big5
    if word == '':
        return

    url = 'http://140.111.34.46/cgi-bin/dict/newsearch.cgi?QueryScope=Name&QueryCommand=find&GraphicWord=yes&Database=dict&QueryString=' + urllib.quote_plus(word)

    result = get_webpage( url )
    if result == '':    #查詢失敗
        return False
    #查詢成功,把結果輸出到 stdout
    print url    #stdout 輸出的第一行需為查詢網頁的 url
    print result
    return True

#開啟 url,開啟成功把結果網頁內容輸出在 stdout,
#註:stdout 輸出的第一行需為此網頁的 url
#並且 return True。禁止連接此 url 則 return False
def open_url(url):
    url = 'http://140.111.34.46/cgi-bin/dict/' + url
    content = get_webpage(url)
    if content != '':
        print url    #stdout 輸出的第一行需為查詢網頁的 url
        print content
        return True
    return False

#快取圖檔,從 url 下載圖片,並快取到本機暫存檔
#快取成功,把本機暫存擋路徑輸出在 stdout,
#並且 return True。禁止顯示此圖片則 return False
def cache_image(url):
    basename = os.path.basename(url)

    #快取圖片的目錄
    cache_dir=os.path.expanduser('~/.gnetdict/edudict/')
    if not os.path.exists(cache_dir):    #若不存在則建立
        os.mkdir(cache_dir)

    cache_path = cache_dir + basename

    if not os.path.exists( cache_path ):
        import urllib
        urllib.urlretrieve( 'http://140.111.34.46/' + url, cache_path )
    print cache_path    #把本機快取圖檔路徑輸出到stdout
    return True

if __name__=='__main__':

    #執行沒有任何參數,在stdout顯示程式資訊
    if len(sys.argv) <= 1:
        info();
    elif len(sys.argv) >= 3:
        #query 參數查詢單字,在 stdout 輸出要顯示的內容
        #argv[2] 是要查的單字
        #查詢成功 exit(0), 無法顯示則 exit(1)
        if sys.argv[1] == 'query':
            if query( sys.argv[2] ):
                exit(0)
            else:
                exit(1)
        #url 參數存取超連結,在 stdout 輸出要顯示的內容
        #argv[2] 是要連接的 url
        #存取成功 exit(0), 禁止連到這個 url 則 exit(1)
        elif sys.argv[1] == 'open_url':
            if open_url( sys.argv[2] ):
                exit(0)
            else:
                exit(1)
        #img 參數處理圖片,下載並快取網路上的圖檔
        #argv[2] 是要連接的 image url
        #快取成功 exit(0),並在 stdout 輸出"本機"的圖片檔路徑
        #快取失敗,或禁止顯示此圖片,則 exit(1)
        elif sys.argv[1] == 'img':
            if cache_image( sys.argv[2] ):
                exit(0)
            else:
                exit(1)
        else:  #不支援的參數,exit(2) 表示發生嚴重錯誤
            exit(2)
    else:  #不支援的參數,exit(2) 表示發生嚴重錯誤
        exit(2)