SublimeText3에서 Weblio 팝업 영어와 같은 패키지를 만들었습니다.

Weblio 팝업영화사전이 편리했기 때문에 텍스트 에디터에서도 이런 기능이 있었으면 좋겠다고 생각해 만들어 보았습니다.

Weblio 팝업영화사전은↓같은 느낌으로 사전의 검색결과를 표시해 줍니다.

위의 예에서는 검색하고 싶은 단어를 반전시키고 있지만 마우스 오버만으로 표시하는 설정도 있습니다.

목표로 하는 기능


  • 드래그로 선택한 영어 단어의 번역 결과를 표시합니다.
  • 바로 가기로 동작 (선택한 것만으로 표시하면 코딩하기 어려움)

    이런 느낌이 들었습니다.





    환경


  • Windows7 64bit
  • SublimeText3
  • 파이썬 역사 0 일

  • 참고로 한 사이트


  • sublime-text3을 사용하기 시작했기 때문에 플러그인도 만들어 보았습니다.
  • 英和・和英辞書API의 디사전을 호출하는 Ruby 코드의 샘플
  • Sublime Text API Reference(번역)
  • 파이썬에서 네임 스페이스가있는 XML로 작업하기 (ElementTree)

  • 코드



    PopTranslateEnglish.py
    # coding=UTF-8
    import sublime, sublime_plugin
    import urllib.request
    import xml.etree.ElementTree as ET
    
    class popTranslateEnglishIntoJapaneseCommand(sublime_plugin.TextCommand):
        def run(self, edit):
            search_word = self.view.substr(self.view.sel()[0])
            if search_word == "":
                print('none select word')
                return
            else:
                print(search_word)
    
            item_id = self.getItemID(search_word)
            text = self.getTranslatedText(item_id)
            if text == '':
                return
    
            text_arr = self.splitTranslatedText(text, '\t')
            self.view.show_popup_menu(text_arr, None)
    
    
        def getXmlElementText(self, url, tag):
            print('url : ' + url)
            try:
                xml = urllib.request.urlopen(url)
            except urllib.error.HTTPError as e:
                print('error code : ' + str(e.code))
                print('error read : ' + str(e.read()))
                return ''
    
            print(xml)
            tree = ET.parse(xml)
            root = tree.getroot()
            element = root.find('.//{http://btonic.est.co.jp/NetDic/NetDicV09}' + tag)
            text = element.text
            print(text)
            return text
    
        def getItemID(self, search_word):
            head = 'http://public.dejizo.jp/NetDicV09.asmx/SearchDicItemLite?Dic=EJdict&Word='
            end = '&Scope=HEADWORD&Match=EXACT&Merge=OR&Prof=XHTML&PageSize=20&PageIndex=0'
            url = head + search_word + end
            return self.getXmlElementText(url, 'ItemID')
    
        def getTranslatedText(self, item_id):
            head = 'http://public.dejizo.jp/NetDicV09.asmx/GetDicItemLite?Dic=EJdict&Item='
            end = '&Loc=&Prof=XHTML'
            url = head + item_id + end
            return self.getXmlElementText(url, 'Body/div/div')
    
        def splitTranslatedText(self, translated_text, split_word):
            return translated_text.split(split_word)
    

    무엇을 했습니까?


  • 먼저 패키지를 만드는 방법을 찾습니다.
    아래의 링크처에서 기본적인 만드는 방법을 학습.
      sublime-text3을 사용하기 시작했기 때문에 플러그인도 만들어 보았습니다.
    김에 무려~쿠 python의 기술을 이해한 신경이 쓰인다.
  • 어떻게 번역합니까 ...
    처음에는 Weblio API를 찾았지만 찾을 수 없었습니다.
    그 중 아래 링크에서 디사장이라고 하면 번역할 수 있는 것 같다는 것을 발견.
      英和・和英辞書API의 디사전을 호출하는 Ruby 코드의 샘플
    아무래도 URL내에 검색하고 싶은 영단어나 파라미터를 함수와 같이 기술하는 것으로 번역 결과의 XML이 돌아오는 것 같다.
    그 돌아온 XML을 해석해 번역 결과를 취득, 라고 하는 느낌.
    그러나 샘플은 Ruby이므로 어떻게 파이썬으로 실현되는지 ...
  • urllib 및 xml.etree.ElementTree
    이 2개의 라이브러리를 사용하는 것으로 실현할 수 있을 것 같다.
    urllib에서 URL에 액세스할 때 데이터를 가져오고 이번에는 XML 파일을 가져올 수 있습니다.
    xml.etree.ElementTree에서 얻은 XML을 구문 분석하는 흐름.
    각 라이브러리의 사용법은 구그하면 많이 나옵니다.

  • 번거로운 부분
  • getXmlElementText 메서드에서 사용하는 urllib.request.urlopen
    파이썬 버전에 따라 urllib.request.urlopen이거나 urllib.urlopen이 될 것 같습니다. import의 단어도 바뀔지도?
  • XML에 네임 스페이스가 있으며 태그 검색 실패
    find 메소드에 검색하고 싶은 태그를 건네주면(자) 아이 요소를 돌려줍니다.
    다만 네임스페이스가 있으면 네임스페이스를 태그에 붙이지 않으면 안 되는 것 같습니다.
  • element = root.find('.//{http://btonic.est.co.jp/NetDic/NetDicV09}' + tag)
    

    여기서 요소를 가져오고 있지만 '{}'로 둘러싸인 부분이 네임스페이스가 됩니다.
    자세한 내용은 파이썬에서 네임 스페이스가있는 XML로 작업하기 (ElementTree)
    덧붙여서 './/'를 붙이면 자식 요소뿐만 아니라 손자 요소 이후도 검색할 수 있습니다.
  • 마지막으로
    처음 패키지를 만들었는데 하루에 할 수 있을 정도로 간단했습니다.
    GitHub는 등록했지만 리포지토리는 없습니다. 마음이 향하면 만듭니다.
  • 좋은 웹페이지 즐겨찾기