터미널부터 맥 사전 사용하기

20583 단어 PythonCLImacOStech
며칠 전에 이런 기사를 썼어요.
애플 스크립트로 CLI의 주요 특징 만들기
mac 사전.터미널에서 앱을 사용하고 싶다고 하시네요.
그중에 이 부분.
사실 하고 싶은 것은 사전이다.앱 시작 아니에요.
여기를 좀 짧게 잘라주세요.

간단한 처리


Objective-c용 사전api가 있어요.pyObjC를 통해 그걸 사용하면 하고 싶은 일이 해결된다는 걸 알아요.
사실 쉬워요.
dictionary.py
#!/usr/bin/python

import sys
from DictionaryServices import *

sys.stdout = codecs.getwriter('utf8')(sys.stdout)

word = sys.argv[1].decode('utf-8')
result = DCSCopyTextDefinition(None, word, (0, len(word)))

print result
전용 DCSCopyTextDefinition

불만스럽다


이 대본은 전부터 있었는데 불만이 너무 많아서 풀고 싶었어요.
  • 조금 느리다
  • 희망화영사전이 국어사전보다 우선
  • 읽기 어려움
  • 맞춤법 틀리면 차가워져
  • 1, 2, 3의 코드를 해결하고 1, 2, 3, 4의 코드를 말미에 기재했다

    1.조금 늦다


    이벤트


    2초 정도 걸려요.
    $ for word (透過性 免罪 りんご 意識 資源 apple apriori fox edit macintosh); do
        echo -n `gdate +"%H:%M:%S.%3N"`
        python dictionary.py $word > /dev/null
        echo -n ' - '
        echo `gdate +"%H:%M:%S.%3N"`
    done
    
    12:07:34.767 - 12:07:36.903
    12:07:36.906 - 12:07:38.996
    12:07:39.000 - 12:07:41.062
    12:07:41.066 - 12:07:43.111
    12:07:43.115 - 12:07:45.219
    12:07:45.223 - 12:07:47.268
    12:07:47.271 - 12:07:49.408
    12:07:49.413 - 12:07:51.496
    12:07:51.500 - 12:07:53.617
    12:07:53.621 - 12:07:55.649
    
    사용하기가 좀 불편해요.

    대응: import 최소화


    이게 느린 것 같아.
    python
    >>> from DictionaryServices import *
    
    수정 후 재측정
    - from DictionaryServices import *
    + from DictionaryServices import DCSCopyTextDefinition
    
    0.3초 정도
    $ for word (透過性 免罪 りんご 意識 資源 apple apriori fox edit macintosh); do
        echo -n `gdate +"%H:%M:%S.%3N"`
        python dictionary.py $word > /dev/null
        echo -n ' - '
        echo `gdate +"%H:%M:%S.%3N"`
    done
    
    12:47:01.203 - 12:47:01.504
    12:47:01.508 - 12:47:01.799
    12:47:01.802 - 12:47:02.085
    12:47:02.089 - 12:47:02.388
    12:47:02.392 - 12:47:02.682
    12:47:02.685 - 12:47:02.972
    12:47:02.976 - 12:47:03.377
    12:47:03.381 - 12:47:03.691
    12:47:03.695 - 12:47:04.070
    12:47:04.074 - 12:47:04.363
    
    만족🎉

    2.화영사전이 국어사전보다 우선하길 희망


    문제.


    나는 영어를 알고 싶어서 일본어를 찾았지만 국어사전을 찾았다
    $ python dictionary.py 引用
    
    いんよう 0【引用】(名)スル① 古人の言や他人の文章,また他人の説や事例などを自分の文章の中に引いて説明に用いること。「古典の例を―する」② ポスト-モダンの芸術や建築で作品の中に過去の様式や他人の作品を部分的に組み入れる手法。〈子項目〉引用指数引用符
    
    일본어를 설명하고 싶은 소망이 거의 없기 때문에 일본어로 화영사전에 사전을 고정시키고 싶어요.

    처리:매개 변수로 사전 지정(실패)


    보자마자 첫 번째 파라미터가 의심스러워서 조사해 볼게요.
    dictionary.py
    DCSCopyTextDefinition(None, word, (0, len(word)))
    
    DCSCopyTextDefinition | Apple Developer Documentation
    func DCSCopyTextDefinition(_ dictionary: DCSDictionary?, 
                               _ textString: CFString,
                               _ range: CFRange) -> Unmanaged<CFString>?
    
    지정하면 좋은데 지정하면 안 될 것 같아요.
    dictionary : This parameter is reserved for future use, so pass NULL. Dictionary Services searches in all active dictionaries.

    대응애플리케이션 설정 변경


    발견의 최초 결과를 사용한 것 같으니 이 배열을 바꾸면 해결될 거야
    This function returns the description of the first matching record found in the the active dictionaries. It searches first in the default word definition dictionary which, in the English environment, is the Oxford dictionary.
    사전을 찾아보았다.앱 설정에서 변경 가능
    밀치락달치락하다


    다시 집행한다
    $ python dictionary.py 引用
    いんよう 【引用】名詞(a) quotation ⦅from⦆; (a) citation ⦅from⦆. ▸ 聖書からの引用 a quotation from the Bible.▸ 引用符付きの文 a sentence in quotation marks [in quotes]. (!いずれも複数形で用いることに注意) ▸ この本は他の作品からの引用が多い This book has a lot of citations from other works. 引用する 動詞quote ; 【例として引用する】cite. (!quote は言葉をそのまま引用することで, cite は quote ほど正確な引用ではない ) ▸ ミルトンを引用する quote (from) Milton. (!from は出所を強調する) ▸ バイロンから一節を引用する quote a passage from Byron.▸ 大統領はリンカーンの言葉を引用して演説を締めくくった The President finished his speech with a quotation from Lincoln.引用句[文] a quotation ⦅話⦆ a quote / a citation.引用書 reference books / the books referred to.
    
    일영사전 잘됐네
    만족하다🎉

    3. 읽기 어렵다


    문제.


    이것은 이미 본 바와 같다
    문자열이 이래요. 너무해요. 더 이상 하고 싶지 않아요?
    $ python dictionary.py injection
    in・jec・tion | ɪndʒékʃ(ə)n | 名詞複~s | -z | 1 U〖具体例ではan (...) ~/~s〗 注射(shot1) ▸ give A an injectionA〈人〉に注射する ▸ by injection注射によって ▸ lethal injection 毒物注射(による死刑). 2 CU(燃料などの)噴射, 注入. 3 C(資金の)投入. 4 UC(宇宙船を)軌道にのせること. ~̀ mólding 射出成形〘金属・プラスチック・セラミックを型に射出して成形する方法〙.
    

    대응: 정규 표현식으로 방법을 강행하다


    각종 시도 에서 화영사전 은 일본어 와 영어 의 경계점 과 어성 을 구분한 후 면접 에서 줄 을 바꾸고 있다
    dictionary.py
    def format_for_j_to_e(line):
        line = re.sub(u'([ぁ-んァ-ン一-龥])\s*([a-zA-Z])', r'\1\n\2', line)
        line = re.sub(u'([a-zA-Z.\)!?])\s*([ぁ-んァ-ン一-龥▸])', r'\1\n\n\2', line)
        line = re.sub(u'(名詞|動詞|形容詞|副詞)', r'\1\n', line)
    
        return '\n' + line
    
    before
    $ python dictionary.py 透過
    とうか 【透過】透過する 動詞〘物理〙 transmit (-tt-); 〘生物〙 permeate ⦅into; through⦆. 透過光 transmitted light.透過性 permeability.透過装置 a permeation device.
    
    after
    사전.app

    영일사전은 숫자 앞과 어성 앞뒤와
    dictionary.py
    $ python dictionary.py 透過
    
    とうか 【透過】透過する 動詞
    〘物理〙 transmit (-tt-); 〘生物〙 permeate ⦅into; through⦆.
    
    透過光
    transmitted light.
    
    透過性
    permeability.
    
    透過装置
    a permeation device.
    
    before
    def format_for_e_to_j(line):
        line = re.sub(u'([0-9] )', r'\n\n\1', line)
        line = re.sub(u'(名詞|動詞|形容詞|他動詞|接頭辞|副詞)', r'\n\n\1\n ', line)
        line = re.sub(u'(▸)', r'\n\1 ', line)
    
    after
    사전.app

    문장에 副詞の場合は〜 같은 게 나오면 바꿔도 되지만, 이렇게 개선하면 충분하죠.
    단어에 색칠도 할 수 있지만 난 필요 없어
    만약 하고 싶다면, 줄을 바꾸는 것이 아니라, 같은 생각으로 Select Graphic Rendition을 대체할 수 있다
    만족하다🎉

    4. 맞춤법이 틀리면 차갑다


    문제.


    단어를 찾지 못하면 DCSCopyTextDefinition 되돌아오기Nonepython
    $ python dictionary.py injection
    in・jec・tion | ɪndʒékʃ(ə)n | 名詞複~s | -z | 1 U〖具体例ではan (...) ~/~s〗 注射(shot1) ▸ give A an injectionA〈人〉に注射する ▸ by injection注射によって ▸ lethal injection 毒物注射(による死刑). 2 CU(燃料などの)噴射, 注入. 3 C(資金の)投入. 4 UC(宇宙船を)軌道にのせること. ~̀ mólding 射出成形〘金属・プラスチック・セラミックを型に射出して成形する方法〙.
    
    쌀쌀하다

    처리:맞춤법 검사 및 재실행


    이 맞춤법 검사를 사용하세요.
    애플 스크립트로 CLI의 주요 사항 만들기 #맞춤법 검사
    $ python dictionary.py injection
    
    in・jec・tion | ɪndʒékʃ(ə)n |
    
    名詞
     複~s | -z |
    
    1 U〖具体例ではan (...) ~/~s〗 注射(shot1)
    ▸  give A an injectionA〈人〉に注射する
    ▸  by injection注射によって
    ▸  lethal injection 毒物注射(による死刑).
    
    2 CU(燃料などの)噴射, 注入.
    
    3 C(資金の)投入.
    
    4 UC(宇宙船を)軌道にのせること. ~̀ mólding 射出成形〘金属・プラスチック・セラミックを型に射出して成形する方法〙.
    
    경로 통과 또는 배치
    나는 sp라는 짧은 명령 이름으로 경로를 통과했다
    우선 처리process에서 대열 여부를 검사하다
    실행
    >>> print DCSCopyTextDefinition(None, 'moniter', (0, len('moniter')))
    None
    
    sp 대화 방식으로 선택을 하고 다시 한 번 process라고 부르면 되죠
    dictionary.py
    $ osascript spelling.scpt moniter
    monster, monitor, moniker
    
    ctrl-C로 정지하면 오류가 발생하기 때문에 except KeyboardInterrupt:까지
      def process(word):
          result = look_up(word)
    
          if re.match('[a-zA-Z]', word) is None:
    -         print format_for_j_to_e(result)
    +         if result is None:
    +             print '\nno results.'
    + 
    +         else:
    +             print format_for_j_to_e(result)
    
          else:
    -         print format_for_e_to_j(result)
    +         if result is None:
    +             suggest_and_re_process(word)
    + 
    +         else:
    +             print format_for_e_to_j(result)
    
    해보세요.
    def suggest_and_re_process(word):
        suggests = filter(lambda s: s != '', commands.getoutput('sp %s' % word).split(', '))
    
        if suggests:
            print ''
    
            for i, suggest in enumerate(suggests, 1):
                print '%d: %s' % (i, suggest)
    
            print '\n0: abort\n'
    
            n = input('enter: ') - 1
    
            if n != -1:
                process(suggests[n])
    
        else:
            print '\nno suggests.'
    
    -     process(word)
    +     try:
    +         process(word)
    + 
    +     except KeyboardInterrupt:
    +         sys.exit(0)
    
    $ python dictionary.py moniter
    
    1: monster
    2: monitor
    3: moniker
    
    0: abort
    
    enter: 2
    
    mon・i・tor | mɑ́(ː)nətər|mɔ́nɪ- |
    
    動詞
     ~s | -z | ; ~ed | -d | ; ~ing | -t(ə)rɪŋ |
    
    他動詞
    
    
    1 〈状況など〉を監視する, 監督する, 観察する; …を追跡する; …を測定する; 〖~ that節/wh節〗 …を監視[観察]する
    ▸  Her blood pressure increased, so she was closely monitored. 血圧が上がり, 彼女は慎重なチェック体制の元におかれた.
    # 略
    
    만족🎉

    결론


    거의 다 됐어요. 화영사전을 쓸 수 있어서 조금 쉽게 읽을 수 있고 힌트 기능이 생겼어요!
    이렇게 하면 실물이 되나?
    영어와 중국어가 비슷하다는 기사가 있었지만, 일본어 성형 대응을 찾을 수 없어 썼습니다.
    공식적인 표현은 잘하지도 않고 신경 쓰지 않아서 쉽게 다가갈 수 있지만 만족스럽죠!

    설치: 1, 2, 3 대응


    dictionary.py
    dictionary.py
    $ python dictionary.py hoge
    
    no suggests.
    

    설치: 1, 2, 3, 4 대응


    dictionary.py
    dictionary.py
    $ python dictionary.py ほげさん
    
    no results.
    

    좋은 웹페이지 즐겨찾기