[
  {
    "path": ".gitignore",
    "content": ".idea/\ntest/data/test.db\n*.py~\n*.sh~\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nenv/\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\n*.egg-info/\n.installed.cfg\n*.egg\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*,cover\n.hypothesis/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# IPython Notebook\n.ipynb_checkpoints\n\n# pyenv\n.python-version\n\n# celery beat schedule file\ncelerybeat-schedule\n\n# dotenv\n.env\n\n# virtualenv\nvenv/\nENV/\n\n# Spyder project settings\n.spyderproject\n\n# Rope project settings\n.ropeproject\n"
  },
  {
    "path": ".gitmodules",
    "content": ""
  },
  {
    "path": "LICENSE",
    "content": "MIT License\r\n\r\nCopyright (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n"
  },
  {
    "path": "MANIFEST.in",
    "content": "include README.rst\ninclude CHANGES.md\ninclude LICENSE\ninclude requirements*.txt\nrecursive-include jamdict/data/ *.sql\nrecursive-include jamdict/data/ *.json\nrecursive-include jamdict/data/ *.gz\n"
  },
  {
    "path": "README.md",
    "content": "# Jamdict\r\n\r\n[Jamdict](https://github.com/neocl/jamdict) is a Python 3 library for manipulating Jim Breen's JMdict, KanjiDic2, JMnedict and kanji-radical mappings.\r\n\r\n[![ReadTheDocs Badge](https://readthedocs.org/projects/jamdict/badge/?version=latest&style=plastic)](https://jamdict.readthedocs.io/)\r\n\r\n**Documentation:** https://jamdict.readthedocs.io/ \r\n\r\n# Main features\r\n\r\n* Support querying different Japanese language resources\r\n  - Japanese-English dictionary JMDict\r\n  - Kanji dictionary KanjiDic2\r\n  - Kanji-radical and radical-kanji maps KRADFILE/RADKFILE\r\n  - Japanese Proper Names Dictionary (JMnedict) \r\n* Fast look up (dictionaries are stored in SQLite databases)\r\n* Command-line lookup tool [(Example)](#command-line-tools)\r\n\r\n[Contributors](#contributors) are welcome! 🙇. If you want to help, please see [Contributing](https://jamdict.readthedocs.io/en/latest/contributing.html) page.\r\n\r\n# Try Jamdict out\r\n\r\nJamdict is used in [Jamdict-web](https://jamdict.herokuapp.com/) - a web-based free and open-source Japanese reading assistant software.\r\nPlease try out the demo instance online at:\r\n\r\nhttps://jamdict.herokuapp.com/\r\n\r\nThere also is a demo [Jamdict virtual machine](https://replit.com/@tuananhle/jamdict-demo) online for trying out Jamdict Python code on Repl.it:\r\n\r\nhttps://replit.com/@tuananhle/jamdict-demo\r\n\r\n# Installation\r\n\r\nJamdict & Jamdict database are both available on [PyPI](https://pypi.org/project/jamdict/) and can be installed using pip\r\n\r\n```bash\r\npip install --upgrade jamdict jamdict-data\r\n```\r\n\r\n# Sample jamdict Python code\r\n\r\n```python\r\nfrom jamdict import Jamdict\r\njam = Jamdict()\r\n\r\n# use wildcard matching to find anything starts with 食べ and ends with る\r\nresult = jam.lookup('食べ%る')\r\n\r\n# print all word entries\r\nfor entry in result.entries:\r\n     print(entry)\r\n\r\n# [id#1358280] たべる (食べる) : 1. to eat ((Ichidan verb|transitive verb)) 2. to live on (e.g. a salary)/to live off/to subsist on\r\n# [id#1358300] たべすぎる (食べ過ぎる) : to overeat ((Ichidan verb|transitive verb))\r\n# [id#1852290] たべつける (食べ付ける) : to be used to eating ((Ichidan verb|transitive verb))\r\n# [id#2145280] たべはじめる (食べ始める) : to start eating ((Ichidan verb))\r\n# [id#2449430] たべかける (食べ掛ける) : to start eating ((Ichidan verb))\r\n# [id#2671010] たべなれる (食べ慣れる) : to be used to eating/to become used to eating/to be accustomed to eating/to acquire a taste for ((Ichidan verb))\r\n# [id#2765050] たべられる (食べられる) : 1. to be able to eat ((Ichidan verb|intransitive verb)) 2. to be edible/to be good to eat ((pre-noun adjectival (rentaishi)))\r\n# [id#2795790] たべくらべる (食べ比べる) : to taste and compare several dishes (or foods) of the same type ((Ichidan verb|transitive verb))\r\n# [id#2807470] たべあわせる (食べ合わせる) : to eat together (various foods) ((Ichidan verb))\r\n\r\n# print all related characters\r\nfor c in result.chars:\r\n    print(repr(c))\r\n\r\n# 食:9:eat,food\r\n# 喰:12:eat,drink,receive (a blow),(kokuji)\r\n# 過:12:overdo,exceed,go beyond,error\r\n# 付:5:adhere,attach,refer to,append\r\n# 始:8:commence,begin\r\n# 掛:11:hang,suspend,depend,arrive at,tax,pour\r\n# 慣:14:accustomed,get used to,become experienced\r\n# 比:4:compare,race,ratio,Philippines\r\n# 合:6:fit,suit,join,0.1\r\n```\r\n\r\n## Command line tools\r\n\r\nTo make sure that jamdict is configured properly, try to look up a word using command line\r\n\r\n```bash\r\npython3 -m jamdict lookup 言語学\r\n========================================\r\nFound entries\r\n========================================\r\nEntry: 1264430 | Kj:  言語学 | Kn: げんごがく\r\n--------------------\r\n1. linguistics ((noun (common) (futsuumeishi)))\r\n\r\n========================================\r\nFound characters\r\n========================================\r\nChar: 言 | Strokes: 7\r\n--------------------\r\nReadings: yan2, eon, 언, Ngôn, Ngân, ゲン, ゴン, い.う, こと\r\nMeanings: say, word\r\nChar: 語 | Strokes: 14\r\n--------------------\r\nReadings: yu3, yu4, eo, 어, Ngữ, Ngứ, ゴ, かた.る, かた.らう\r\nMeanings: word, speech, language\r\nChar: 学 | Strokes: 8\r\n--------------------\r\nReadings: xue2, hag, 학, Học, ガク, まな.ぶ\r\nMeanings: study, learning, science\r\n\r\nNo name was found.\r\n```\r\n\r\n## Using KRAD/RADK mapping\r\n\r\nJamdict has built-in support for KRAD/RADK (i.e. kanji-radical and radical-kanji mapping).\r\nThe terminology of radicals/components used by Jamdict can be different from else where.\r\n\r\n- A radical in Jamdict is a principal component, each character has only one radical.\r\n- A character may be decomposed into several writing components.\r\n\r\nBy default jamdict provides two maps:\r\n\r\n- jam.krad is a Python dict that maps characters to list of components.\r\n- jam.radk is a Python dict that maps each available components to a list of characters.\r\n\r\n```python\r\n# Find all writing components (often called \"radicals\") of the character 雲\r\nprint(jam.krad['雲'])\r\n# ['一', '雨', '二', '厶']\r\n\r\n# Find all characters with the component 鼎\r\nchars = jam.radk['鼎']\r\nprint(chars)\r\n# {'鼏', '鼒', '鼐', '鼎', '鼑'}\r\n\r\n# look up the characters info\r\nresult = jam.lookup(''.join(chars))\r\nfor c in result.chars:\r\n    print(c, c.meanings())\r\n# 鼏 ['cover of tripod cauldron']\r\n# 鼒 ['large tripod cauldron with small']\r\n# 鼐 ['incense tripod']\r\n# 鼎 ['three legged kettle']\r\n# 鼑 []\r\n```\r\n\r\n## Finding name entities\r\n\r\n```bash\r\n# Find all names with 鈴木 inside\r\nresult = jam.lookup('%鈴木%')\r\nfor name in result.names:\r\n    print(name)\r\n\r\n# [id#5025685] キューティーすずき (キューティー鈴木) : Kyu-ti- Suzuki (1969.10-) (full name of a particular person)\r\n# [id#5064867] パパイヤすずき (パパイヤ鈴木) : Papaiya Suzuki (full name of a particular person)\r\n# [id#5089076] ラジカルすずき (ラジカル鈴木) : Rajikaru Suzuki (full name of a particular person)\r\n# [id#5259356] きつねざきすずきひなた (狐崎鈴木日向) : Kitsunezakisuzukihinata (place name)\r\n# [id#5379158] こすずき (小鈴木) : Kosuzuki (family or surname)\r\n# [id#5398812] かみすずき (上鈴木) : Kamisuzuki (family or surname)\r\n# [id#5465787] かわすずき (川鈴木) : Kawasuzuki (family or surname)\r\n# [id#5499409] おおすずき (大鈴木) : Oosuzuki (family or surname)\r\n# [id#5711308] すすき (鈴木) : Susuki (family or surname)\r\n# ...\r\n```\r\n\r\n## Exact matching\r\n\r\nUse exact matching for faster search.\r\n\r\nFind the word 花火 by idseq (1194580)\r\n\r\n```python\r\n>>> result = jam.lookup('id#1194580')\r\n>>> print(result.names[0])\r\n[id#1194580] はなび (花火) : fireworks ((noun (common) (futsuumeishi)))\r\n```\r\n\r\nFind an exact name 花火 by idseq (5170462)\r\n\r\n```python\r\n>>> result = jam.lookup('id#5170462')\r\n>>> print(result.names[0])\r\n[id#5170462] はなび (花火) : Hanabi (female given name or forename)\r\n```\r\n\r\nSee `jamdict_demo.py` and `jamdict/tools.py` for more information.\r\n\r\n# Useful links\r\n\r\n* JMdict: [http://edrdg.org/jmdict/edict_doc.html](http://edrdg.org/jmdict/edict_doc.html)\r\n* kanjidic2: [https://www.edrdg.org/wiki/index.php/KANJIDIC_Project](https://www.edrdg.org/wiki/index.php/KANJIDIC_Project)\r\n* JMnedict: [https://www.edrdg.org/enamdict/enamdict_doc.html](https://www.edrdg.org/enamdict/enamdict_doc.html)\r\n* KRADFILE: [http://www.edrdg.org/krad/kradinf.html](http://www.edrdg.org/krad/kradinf.html)\r\n\r\n# Contributors\r\n\r\n- [Le Tuan Anh](https://github.com/letuananh) (Maintainer)\r\n- [alt-romes](https://github.com/alt-romes)\r\n- [Matteo Fumagalli](https://github.com/matteofumagalli1275)\r\n- [Reem Alghamdi](https://github.com/reem-codes)\r\n- [Techno-coder](https://github.com/Techno-coder) \r\n"
  },
  {
    "path": "TODO.md",
    "content": ""
  },
  {
    "path": "_config.yml",
    "content": "theme: jekyll-theme-minimal"
  },
  {
    "path": "data/README.md",
    "content": "Copy dictionary files (JMdict_e.xml, kanjidic2.xml, kradfile, etc.) here\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the environment for the first two.\nSPHINXOPTS    ?=\nSPHINXBUILD   ?= sphinx-build\nSOURCEDIR     = .\nBUILDDIR      = _build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\nserve:\n\tcd _build/dirhtml && python -m http.server 7001\n\n.PHONY: help Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n"
  },
  {
    "path": "docs/api.rst",
    "content": ".. _api_index:\n\njamdict APIs\n============\n\nAn overview of jamdict modules.\n\n.. warning::\n    👉 ⚠️ THIS SECTION IS STILL UNDER CONSTRUCTION ⚠️ Help is much needed.\n\n.. module:: jamdict\n\n.. autoclass:: jamdict.util.Jamdict\n   :members:\n   :member-order: groupwise\n   :exclude-members: get_ne, has_jmne, import_data, jmnedict\n\n.. autoclass:: jamdict.util.LookupResult                     \n   :members:\n   :member-order: groupwise\n\n.. autoclass:: jamdict.util.IterLookupResult                     \n   :members:\n   :member-order: groupwise\n\n.. module:: jamdict.jmdict\n\n.. autoclass:: JMDEntry\n   :members:\n\n.. module:: jamdict.kanjidic2\n\n.. autoclass:: Character\n   :members:\n\n.. automodule:: jamdict.krad\n"
  },
  {
    "path": "docs/conf.py",
    "content": "# Configuration file for the Sphinx documentation builder.\n#\n# This file only contains a selection of the most common options. For a full\n# list see the documentation:\n# https://www.sphinx-doc.org/en/master/usage/configuration.html\n\n# -- Path setup --------------------------------------------------------------\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#\nimport os\nimport sys\nsys.path.insert(0, os.path.abspath('../'))\n\n\n# -- Project information -----------------------------------------------------\n\nproject = 'jamdict'\ncopyright = '2021, Le Tuan Anh'\nauthor = 'Le Tuan Anh'\n\n\n# -- General configuration ---------------------------------------------------\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'sphinx.ext.doctest']\n# -- Highlight code block -----------------\npygments_style = 'sphinx'\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path.\nexclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']\n\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = 'bizstyle'\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = ['_static']\n"
  },
  {
    "path": "docs/contributing.rst",
    "content": ".. _contributing:\n\nContributing\n============\n\nThere are many ways to contribute to the Jamdict project.\nThe one that Jamdict development team are focusing on at the moment are:\n\n- Fixing :ref:`existing bugs <contrib_bugfix>`\n- Improving query functions\n- Improving :ref:`documentation <contrib_docs>`\n- Keeping jamdict database up to date\n\nIf you have some suggestions or bug reports, please share on `jamdict issues tracker <https://github.com/neocl/jamdict/issues>`_.\n\n.. _contrib_bugfix:\n\nFixing bugs\n-----------\n\nIf you found a bug please report at https://github.com/neocl/jamdict/issues\n\nWhen it is possible, please also share how to reproduce the bugs and a snapshot of jamdict info to help with the bug finding process.\n\n.. code:: bash\n\n   python3 -m jamdict info\n\nPull requests are welcome.\n\n.. _contrib_docs:\n\nUpdating Documentation\n----------------------\n\n1. Fork `jamdict <https://github.com/neocl/jamdict>`_ repository to your own Github account.\n\n#. Clone `jamdict` repository to your local machine.\n\n   .. code:: bash\n      \n      git clone https://github.com/<your-account-name>/jamdict\n      \n#. Create a virtual environment (optional, but highly recommended)\n\n   .. code:: bash\n\n      # if you use virtualenvwrapper\n      mkvirtualenv jamdev\n      workon jamdev\n\n      # if you use Python venv\n      python3 -m venv .env\n      . .env/bin/activate\n      python3 -m pip install --upgrade pip wheel Sphinx\n\n#. Build the docs\n\n   .. code:: bash\n\n      cd jamdict/docs\n      # compile the docs\n      make dirhtml\n      # serve the docs using Python3 built-in development server\n      # Note: this requires Python >= 3.7 to support --directory\n      python3 -m http.server 7000 --directory _build/dirhtml\n      # if you use earlier Python 3, you may use\n      cd _build/dirhtml\n      python3 -m http.server 7000\n\n#. Now the docs should be ready to view at http://localhost:7000 . You can visit that URL on your browser to view the docs.\n\n#. More information:\n\n   - Sphinx tutorial: https://sphinx-tutorial.readthedocs.io/start/\n   - Using `virtualenv`: https://virtualenvwrapper.readthedocs.io/en/latest/install.html\n   - Using `venv`: https://docs.python.org/3/library/venv.html\n\n.. _contrib_dev:\n\nDevelopment\n-----------\n\nDevelopment contributions are welcome.\nSetting up development environment for Jamdict should be similar to :ref:`contrib_docs`.\n\nPlease contact the development team if you need more information: https://github.com/neocl/jamdict/issues\n"
  },
  {
    "path": "docs/index.rst",
    "content": "\nJamdict's documentation!\n========================\n\n`Jamdict <https://github.com/neocl/jamdict>`_ is a Python 3 library for manipulating Jim Breen's JMdict, KanjiDic2, JMnedict and kanji-radical mappings.\n\nWelcome\n-------\n\nAre you new to this documentation? Here are some useful pages:\n\n- Want to try out Jamdict package? Try `Jamdict online demo <https://replit.com/@tuananhle/jamdict-demo>`_\n- Want some useful code samples? See :ref:`recipes`.\n- Want to look deeper into the package? See :ref:`api_index`.\n- If you want to help developing Jamdict, please visit :ref:`contributing` page.\n\nMain features\n-------------\n\n-  Support querying different Japanese language resources\n\n   -  Japanese-English dictionary JMDict\n   -  Kanji dictionary KanjiDic2\n   -  Kanji-radical and radical-kanji maps KRADFILE/RADKFILE\n   -  Japanese Proper Names Dictionary (JMnedict)\n\n-  Fast look up (dictionaries are stored in SQLite databases)\n-  Command-line lookup tool :ref:`(Example) <commandline>`\n   \n..\n   Hide this for now\n   -  jamdol (jamdol-flask) - a Python/Flask server that provides Jamdict lookup via REST API (experimental state)\n\n:ref:`Contributors <contributors>` are welcome! 🙇.\nIf you want to help developing Jamdict, please visit :ref:`contributing` page.\n\nInstallation\n------------\n\nJamdict and `jamdict-data <https://pypi.org/project/jamdict/>`_ are both `available on PyPI <https://pypi.org/project/jamdict/>`_ and\ncan be installed using pip.\nFor more information please see :ref:`installpage` page.\n\n.. code:: bash\n\n   pip install jamdict jamdict-data\n\nAlso, there is an online demo Jamdict virtual machine to try out on Repl.it\n\nhttps://replit.com/@tuananhle/jamdict-demo\n\nSample jamdict Python code\n--------------------------\n\nLooking up words\n\n   >>> from jamdict import Jamdict\n   >>> jam = Jamdict()\n   >>> result = jam.lookup('はな')\n   >>> for word in result.entries:\n   ...     print(word)\n   ... \n   [id#1194500] はな (花) : 1. flower/blossom/bloom/petal ((noun (common) (futsuumeishi))) 2. cherry blossom 3. beauty 4. blooming (esp. of cherry blossoms) 5. ikebana 6. Japanese playing cards 7. (the) best\n   [id#1486720] はな (鼻) : nose ((noun (common) (futsuumeishi)))\n   [id#1581610] はし (端) : 1. end (e.g. of street)/tip/point/edge/margin ((noun (common) (futsuumeishi))) 2. beginning/start/first 3. odds and ends/scrap/odd bit/least\n   [id#1634180] はな (洟) : snivel/nasal mucus/snot ((noun (common) (futsuumeishi)))\n\nLooking up kanji characters\n\n   >>> for c in result.chars:\n   ...     print(repr(c))\n   ... \n   花:7:flower\n   華:10:splendor,flower,petal,shine,luster,ostentatious,showy,gay,gorgeous\n   鼻:14:nose,snout\n   端:14:edge,origin,end,point,border,verge,cape\n   洟:9:tear,nasal discharge\n\nLooking up named entities\n   \n   >>> result = jam.lookup('ディズニー%')\n   >>> for name in result.names:\n   ...     print(name)\n   ... \n   [id#5053163] ディズニー : Disney (family or surname/company name)\n   [id#5741091] ディズニーランド : Disneyland (place name)\n\nSee :ref:`recipes` for more code samples.\n\n.. _commandline:\n\nCommand line tools\n------------------\n\nJamdict can be used from the command line.\n\n.. code:: bash\n\n   python3 -m jamdict lookup 言語学\n   ========================================\n   Found entries\n   ========================================\n   Entry: 1264430 | Kj:  言語学 | Kn: げんごがく\n   --------------------\n   1. linguistics ((noun (common) (futsuumeishi)))\n\n   ========================================\n   Found characters\n   ========================================\n   Char: 言 | Strokes: 7\n   --------------------\n   Readings: yan2, eon, 언, Ngôn, Ngân, ゲン, ゴン, い.う, こと\n   Meanings: say, word\n   Char: 語 | Strokes: 14\n   --------------------\n   Readings: yu3, yu4, eo, 어, Ngữ, Ngứ, ゴ, かた.る, かた.らう\n   Meanings: word, speech, language\n   Char: 学 | Strokes: 8\n   --------------------\n   Readings: xue2, hag, 학, Học, ガク, まな.ぶ\n   Meanings: study, learning, science\n\n   No name was found.\n\nTo show help you may use\n\n.. code:: bash\n\n   python3 -m jamdict --help\n\nDocumentation\n-------------\n\n.. toctree::\n   :maxdepth: 2\n\n   install\n   tutorials\n   recipes\n   api\n   contributing\n   updates\n\nOther info\n==========\n\nRelease Notes\n-------------\n\nRelease notes is available :ref:`here <updates>`.\n\n.. _contributors:\n  \nContributors\n------------\n\n-  `Le Tuan Anh <https://github.com/letuananh>`__ (Maintainer)\n-  `alt-romes <https://github.com/alt-romes>`__\n-  `Matteo Fumagalli <https://github.com/matteofumagalli1275>`__\n-  `Reem Alghamdi <https://github.com/reem-codes>`__\n-  `Techno-coder <https://github.com/Techno-coder>`__\n\nUseful links\n------------\n\n- jamdict on PyPI: https://pypi.org/project/jamdict/\n- jamdict source code: https://github.com/neocl/jamdict/\n- Documentation: https://jamdict.readthedocs.io/\n- Dictionaries\n   -  JMdict: http://edrdg.org/jmdict/edict_doc.html\n   -  kanjidic2: https://www.edrdg.org/wiki/index.php/KANJIDIC_Project\n   -  JMnedict: https://www.edrdg.org/enamdict/enamdict_doc.html\n   -  KRADFILE: http://www.edrdg.org/krad/kradinf.html\n\nIndices and tables\n------------------\n\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n"
  },
  {
    "path": "docs/install.rst",
    "content": ".. _installpage:\n\nInstallation\n=============\n\njamdict and jamdict dictionary data are both available on PyPI and can be installed using `pip`.\n\n.. code-block:: bash\n\n   pip install --user jamdict jamdict-data\n   # pip script sometimes doesn't work properly\n   # so you may want to try this instead\n   python3 -m pip install jamdict jamdict-data\n\n.. note::\n   When you use :code:`pip install` in a virtual environment, especially the ones created via :code:`python3 -m venv`,\n   wheel support can be missing. :code:`jamdict-data` relies on wheel/pip to extract xz-compressed database and this may cause a problem.\n   If you encounter any error, please make sure that wheel is available\n\n   .. code-block:: bash\n\n      # list all available packages in pip\n      pip list\n      # ensure wheel support in pip\n      pip install -U wheel\n\n   You may need to uninstall :code:`jamdict-data` before reinstalling it.\n\n   .. code-block:: bash\n\n      pip uninstall jamdict-data\n\nDownload database file manually\n-------------------------------\n\nThis should not be useful anymore from version 0.1a8 with the release of the `jamdict_data <https://pypi.org/project/jamdict_data/>`_ package on PyPI.\nIf for some reason you want to download and install jamdict database by yourself, here are the steps:\n\n1. Download the offical, pre-compiled jamdict database\n   (``jamdict-0.1a7.tar.xz``) from Google Drive\n   https://drive.google.com/drive/u/1/folders/1z4zF9ImZlNeTZZplflvvnpZfJp3WVLPk\n2. Extract and copy ``jamdict.db`` to jamdict data folder (defaulted to\n   ``~/.jamdict/data/jamdict.db``)\n3. To know where to copy data files you can use `python3 -m jamdict info` command via a terminal: \n\n.. code:: bash\n\n  python3 -m jamdict info\n  # Jamdict 0.1a8\n  # Python library for manipulating Jim Breen's JMdict, KanjiDic2, KRADFILE and JMnedict\n  #\n  # Basic configuration\n  # ------------------------------------------------------------\n  # JAMDICT_HOME             : ~/local/jamdict\n  # jamdict_data availability: False\n  # Config file location     : /home/tuananh/.jamdict/config.json\n  # \n  # Custom Data files\n  # ------------------------------------------------------------\n  # Jamdict DB location: ~/local/jamdict/data/jamdict.db - [OK]\n  # JMDict XML file    : ~/local/jamdict/data/JMdict_e.gz - [OK]\n  # KanjiDic2 XML file : ~/local/jamdict/data/kanjidic2.xml.gz - [OK]\n  # JMnedict XML file : ~/local/jamdict/data/JMnedict.xml.gz - [OK]\n  # \n  # Others\n  # ------------------------------------------------------------\n  # lxml availability: False\n\nBuild database file from source\n-------------------------------\n\nNormal users who just want to look up the dictionaries do not have to do this.\nIf you are a developer and want to build jamdict database from source,\ncopy the dictionary source files to jamdict data folder.\nThe original XML files can be downloaded either from the official website\nhttps://www.edrdg.org/ or from `this jamdict Google Drive folder <https://drive.google.com/drive/folders/1ZMM6Xb46XcwwQGWBZnY3gj637exWPWuU>`_.\n\nTo find out where to copy the files or whether they are recognised by jamdict,\nyou may use the command `python3 -m jamdict info` as in the section above.\n\nYou should make sure that all files under the section `Custom data files` are all marked [OK].\nAfter that you should be able to build the database with the command:\n\n.. code:: bash\n\n  python3 -m jamdict import\n\nNote on XML parser: jamdict will use `lxml` instead of Python 3 default `xml` when it is available.\n\n\n"
  },
  {
    "path": "docs/make.bat",
    "content": "@ECHO OFF\r\n\r\npushd %~dp0\r\n\r\nREM Command file for Sphinx documentation\r\n\r\nif \"%SPHINXBUILD%\" == \"\" (\r\n\tset SPHINXBUILD=sphinx-build\r\n)\r\nset SOURCEDIR=.\r\nset BUILDDIR=_build\r\n\r\nif \"%1\" == \"\" goto help\r\n\r\n%SPHINXBUILD% >NUL 2>NUL\r\nif errorlevel 9009 (\r\n\techo.\r\n\techo.The 'sphinx-build' command was not found. Make sure you have Sphinx\r\n\techo.installed, then set the SPHINXBUILD environment variable to point\r\n\techo.to the full path of the 'sphinx-build' executable. Alternatively you\r\n\techo.may add the Sphinx directory to PATH.\r\n\techo.\r\n\techo.If you don't have Sphinx installed, grab it from\r\n\techo.http://sphinx-doc.org/\r\n\texit /b 1\r\n)\r\n\r\n%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%\r\ngoto end\r\n\r\n:help\r\n%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%\r\n\r\n:end\r\npopd\r\n"
  },
  {
    "path": "docs/recipes.rst",
    "content": ".. _recipes:\n\nCommon Recipes\n==============\n\n.. contents::\n    :local: \n    :depth: 2\n\n.. warning::\n    👉 ⚠️ THIS SECTION IS STILL UNDER CONSTRUCTION ⚠️\n\nAll code here assumed that you have created a Jamdict object named :samp:`jam`, like this\n\n    >>> from jamdict import Jamdict\n    >>> jam = Jamdict()\n\nHigh-performance tuning\n-----------------------\n\nWhen you need to do a lot of queries on the database, it is possible to load the whole database\ninto memory to boost up querying performance (This will takes about 400 MB of RAM) by using the :class:`memory_mode <jamdict.util.Jamdict>`\nkeyword argument, like this:\n\n>>> from jamdict import Jamdict\n>>> jam = Jamdict(memory_mode=True)\n\nThe first query will be extremely slow (it may take about a minute for the whole database to be loaded into memory)\nbut subsequent queries will be much faster.\n\nIteration search\n----------------\n\nSometimes people want to look through a set of search results only once and determine which items to keep\nand then discard the rest. In these cases :func:`lookup_iter <jamdict.util.Jamdict.lookup_iter>` should be used.\nThis function returns an :class:`IterLookupResult <jamdict.util.IterLookupResult>` object immediately after called.\nUsers may loop through ``result.entries``, ``result.chars``, and ``result.names`` exact one loop for each\nset to find the items that they want. Users will have to store the desired word entries, characters, and names \nby themselves since they are discarded after yield.\n\n>>> res = jam.lookup_iter(\"花見\")\n>>> for word in res.entries:\n...     print(word)  # do somethign with the word\n>>> for c in res.chars:\n...     print(c)\n>>> for name in res.names:\n...     print(name)\n\nPart-of-speeches and named-entity types\n---------------------------------------\n\nUse :func:`Jamdict.all_pos <jamdict.util.Jamdict.all_pos>` to list all available part-of-speeches\nand :func:`Jamdict.all_ne_type <jamdict.util.Jamdict.all_pos>` named-entity types:\n\n>>> for pos in jam.all_pos():\n...     print(pos)  # pos is a string\n>>> for ne_type in jam.all_ne_type():\n...     print(ne_type)  # ne_type is a string\n\nTo filter words by part-of-speech use the keyword argument ``pos``\nin :func:`loookup() <jamdict.util.Jamdict.lookup>` or :func:`lookup_iter() <jamdict.util.Jamdict.lookup_iter>`\nfunctions.\n\nFor example to look for all \"かえる\" that are nouns use:\n\n>>> result = jam.lookup(\"かえる\", pos=[\"noun (common) (futsuumeishi)\"])\n\nTo search for all named-entities that are \"surname\" use:\n\n>>> result = jam.lookup(\"surname\")\n    \nKanjis and radical/components (KRAD/RADK mappings)\n--------------------------------------------------\n\nJamdict has built-in support for KRAD/RADK (i.e. kanji-radical and\nradical-kanji mapping). The terminology of radicals/components used by\nJamdict can be different from else where.\n\n-  A radical in Jamdict is a principal component, each character has\n   only one radical.\n-  A character may be decomposed into several writing components.\n\nBy default jamdict provides two maps:\n\n-  jam.krad is a Python dict that maps characters to list of components.\n-  jam.radk is a Python dict that maps each available components to a\n   list of characters.\n\n.. code:: python\n\n   # Find all writing components (often called \"radicals\") of the character 雲\n   print(jam.krad['雲'])\n   # ['一', '雨', '二', '厶']\n\n   # Find all characters with the component 鼎\n   chars = jam.radk['鼎']\n   print(chars)\n   # {'鼏', '鼒', '鼐', '鼎', '鼑'}\n\n   # look up the characters info\n   result = jam.lookup(''.join(chars))\n   for c in result.chars:\n       print(c, c.meanings())\n   # 鼏 ['cover of tripod cauldron']\n   # 鼒 ['large tripod cauldron with small']\n   # 鼐 ['incense tripod']\n   # 鼎 ['three legged kettle']\n   # 鼑 []\n\nFinding name entities\n---------------------\n\n.. code:: bash\n\n   # Find all names that contain the string 鈴木\n   result = jam.lookup('%鈴木%')\n   for name in result.names:\n       print(name)\n\n   # [id#5025685] キューティーすずき (キューティー鈴木) : Kyu-ti- Suzuki (1969.10-) (full name of a particular person)\n   # [id#5064867] パパイヤすずき (パパイヤ鈴木) : Papaiya Suzuki (full name of a particular person)\n   # [id#5089076] ラジカルすずき (ラジカル鈴木) : Rajikaru Suzuki (full name of a particular person)\n   # [id#5259356] きつねざきすずきひなた (狐崎鈴木日向) : Kitsunezakisuzukihinata (place name)\n   # [id#5379158] こすずき (小鈴木) : Kosuzuki (family or surname)\n   # [id#5398812] かみすずき (上鈴木) : Kamisuzuki (family or surname)\n   # [id#5465787] かわすずき (川鈴木) : Kawasuzuki (family or surname)\n   # [id#5499409] おおすずき (大鈴木) : Oosuzuki (family or surname)\n   # [id#5711308] すすき (鈴木) : Susuki (family or surname)\n   # ...\n\nExact matching\n--------------\n\nUse exact matching for faster search\n\n.. code:: python\n\n   # Find an entry (word, name entity) by idseq\n   result = jam.lookup('id#5711308')\n   print(result.names[0])\n   # [id#5711308] すすき (鈴木) : Susuki (family or surname)\n   result = jam.lookup('id#1467640')\n   print(result.entries[0])\n   # ねこ (猫) : 1. cat 2. shamisen 3. geisha 4. wheelbarrow 5. clay bed-warmer 6. bottom/submissive partner of a homosexual relationship\n\n   # use exact matching to increase searching speed (thanks to @reem-codes)\n   result = jam.lookup('猫')\n\n   for entry in result.entries:\n       print(entry)\n\n   # [id#1467640] ねこ (猫) : 1. cat ((noun (common) (futsuumeishi))) 2. shamisen 3. geisha 4. wheelbarrow 5. clay bed-warmer 6. bottom/submissive partner of a homosexual relationship\n   # [id#2698030] ねこま (猫) : cat ((noun (common) (futsuumeishi)))\n\nLow-level data queries\n----------------------\n\nIt’s possible to access to the dictionary data by querying database directly using lower level APIs.\nHowever these are prone to future changes so please keep that in mind.\n\nWhen you create a Jamdict object, you have direct access to the\nunderlying databases, via these properties\n\n.. code:: python\n\n   from jamdict import Jamdict\n   jam = Jamdict()\n   >>> jam.jmdict    # jamdict.JMDictSQLite object for accessing word dictionary\n   >>> jam.kd2       # jamdict.KanjiDic2SQLite object, for accessing kanji dictionary\n   >>> jam.jmnedict  # jamdict.JMNEDictSQLite object, for accessing named-entities dictionary\n\nYou can perform database queries on each of these databases by obtaining\na database cursor with ``ctx()`` function (i.e. database query context).\n\nFor example the following code list down all existing part-of-speeches\nin the database.\n\n.. code:: python\n\n   # returns a list of sqlite3.Row object\n   pos_rows = jam.jmdict.ctx().select(\"SELECT DISTINCT text FROM pos\")  \n\n   # access columns in each query row by name\n   all_pos = [x['text'] for x in pos_rows]  \n\n   # sort all POS\n   all_pos.sort()\n   for pos in all_pos:\n       print(pos)\n\nFor more information, please see `Jamdict database schema </_static/jamdict_db_schema.png>`_.\n\nSay we want to get all irregular suru verbs, we can start with finding\nall Sense IDs with pos = ``suru verb - irregular``, and then find all the\nEntry idseq connected to those Senses.\n\nWords (and also named entities) can be retrieved directly using their ``idseq``.\nEach word may have many Senses (meaning) and each Sense may have different pos.\n\n::\n\n   # Entry (idseq) --(has many)--> Sense --(has many)--> pos\n\n.. note::\n   Tips: Since we hit the database so many times (to find the IDs, to retrieve\n   each word, etc.), we also should consider to reuse the database\n   connection using database context to have better performance\n   (``with jam.jmdict.ctx() as ctx:`` and ``ctx=ctx`` in the code below).\n\nHere is the sample code:\n\n.. code:: python\n\n   # find all idseq of lexical entry (i.e. words) that have at least 1 sense with pos = suru verb - irregular\n   with jam.jmdict.ctx() as ctx:\n       # query all word's idseqs\n       rows = ctx.select(\n           query=\"SELECT DISTINCT idseq FROM Sense WHERE ID IN (SELECT sid FROM pos WHERE text = ?) LIMIT 10000\",\n           params=(\"suru verb - irregular\",))\n       for row in rows:\n           # reuse database connection with ctx=ctx for better performance\n           word = jam.jmdict.get_entry(idseq=row['idseq'], ctx=ctx)\n           print(word)\n"
  },
  {
    "path": "docs/requirements.txt",
    "content": "jamdict\nSphinx\n"
  },
  {
    "path": "docs/tutorials.rst",
    "content": "Tutorials\n=========\n\nGetting started\n---------------\n\nJust install ``jamdict`` and ``jamdict_data`` packages via pip and you are ready to go.\n\n.. code:: python\n\n   from jamdict import Jamdict\n   jam = Jamdict()\n\nThe most useful function is :func:`jamdict.util.Jamdict.lookup`.\nFor example:\n\n.. code:: python\n\n   # use wildcard matching to find any word, or Kanji character, or name\n   # that starts with 食べ and ends with る\n   result = jam.lookup('食べ%る')\n\nTo access the result object you may use:\n\n.. code:: python\n\n   # print all word entries\n   for entry in result.entries:\n        print(entry)\n\n   # [id#1358280] たべる (食べる) : 1. to eat ((Ichidan verb|transitive verb)) 2. to live on (e.g. a salary)/to live off/to subsist on\n   # [id#1358300] たべすぎる (食べ過ぎる) : to overeat ((Ichidan verb|transitive verb))\n   # [id#1852290] たべつける (食べ付ける) : to be used to eating ((Ichidan verb|transitive verb))\n   # [id#2145280] たべはじめる (食べ始める) : to start eating ((Ichidan verb))\n   # [id#2449430] たべかける (食べ掛ける) : to start eating ((Ichidan verb))\n   # [id#2671010] たべなれる (食べ慣れる) : to be used to eating/to become used to eating/to be accustomed to eating/to acquire a taste for ((Ichidan verb))\n   # [id#2765050] たべられる (食べられる) : 1. to be able to eat ((Ichidan verb|intransitive verb)) 2. to be edible/to be good to eat ((pre-noun adjectival (rentaishi)))\n   # [id#2795790] たべくらべる (食べ比べる) : to taste and compare several dishes (or foods) of the same type ((Ichidan verb|transitive verb))\n   # [id#2807470] たべあわせる (食べ合わせる) : to eat together (various foods) ((Ichidan verb))\n\n   # print all related characters\n   for c in result.chars:\n       print(repr(c))\n\n   # 食:9:eat,food\n   # 喰:12:eat,drink,receive (a blow),(kokuji)\n   # 過:12:overdo,exceed,go beyond,error\n   # 付:5:adhere,attach,refer to,append\n   # 始:8:commence,begin\n   # 掛:11:hang,suspend,depend,arrive at,tax,pour\n   # 慣:14:accustomed,get used to,become experienced\n   # 比:4:compare,race,ratio,Philippines\n   # 合:6:fit,suit,join,0.1\n"
  },
  {
    "path": "docs/updates.rst",
    "content": ".. _updates:\n\nJamdict Changelog\n=================\n\njamdict 0.1a11\n--------------\n\n-  2021-05-25\n\n  - Added ``lookup_iter()`` for iteration search\n  - Added ``pos`` filter for filtering words by part-of-speeches\n  - Added ``all_pos()`` and ``all_ne_type()`` to Jamdict to list part-of-speeches and named-entity types\n  - Better version checking in ``__version__.py``\n  - Improved documentation\n\n-  2021-05-29\n\n   - (.post1) Sorted kanji readings to have on & kun readings listed first\n   - (.post1) Add ``on_readings``, ``kun_readings``, and ``other_readings`` filter to ``kanjidic2.RMGroup``\n\njamdict 0.1a10\n--------------\n\n-  2021-05-19\n\n  - Added ``memory_mode`` keyword to load database into memory before querying to boost up performance\n  - Improved import performance by using puchikarui's ``buckmode``\n  - Tested with both puchikarui 0.1.* and 0.2.*\n\njamdict 0.1a9\n-------------\n\n-  2021-04-19\n\n  -  Fix data audit query\n  -  Enhanced ``Jamdict()`` constructor. ``Jamdict('/path/to/jamdict.db')``\n     works properly.\n  -  Code quality review\n  -  Automated documentation build via\n     `readthedocs.org <https://jamdict.readthedocs.io/en/latest/>`__\n\njamdict 0.1a8\n-------------\n\n-  2021-04-15\n\n  -  Make ``lxml`` optional\n  -  Data package can be installed via PyPI with ``jamdict_data`` package\n  -  Make configuration file optional as data files can be installed via PyPI.\n\njamdict 0.1a7\n-------------\n\n-  2020-05-31\n\n  -  Added Japanese Proper Names Dictionary (JMnedict) support\n  -  Included built-in KRADFILE/RADKFile support\n  -  Improved command line tools (json, compact mode, etc.)\n\nOlder versions\n--------------\n\n- 2017-08-18\n\n  -  Support KanjiDic2 (XML/SQLite formats)\n\n- 2016-11-09\n\n  -  Release first version to Github\n"
  },
  {
    "path": "jamdict/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\n'''\nPython library for manipulating Jim Breen's JMdict and KanjiDic2\nLatest version can be found at https://github.com/neocl/jamdict\n\nThis package uses the [EDICT][1] and [KANJIDIC][2] dictionary files.\nThese files are the property of the [Electronic Dictionary Research and Development Group][3], and are used in conformance with the Group's [licence][4].\n\n[1]: http://www.csse.monash.edu.au/~jwb/edict.html\n[2]: http://www.csse.monash.edu.au/~jwb/kanjidic.html\n[3]: http://www.edrdg.org/\n[4]: http://www.edrdg.org/edrdg/licence.html\n\nReferences:\n    JMDict website:\n        http://www.csse.monash.edu.au/~jwb/edict.html\n\n@author: Le Tuan Anh <tuananh.ke@gmail.com>\n@license: MIT\n'''\n\n# Copyright (c) 2016, Le Tuan Anh <tuananh.ke@gmail.com>\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n\n########################################################################\n\nfrom . import __version__ as version_info\nfrom .__version__ import __author__, __email__, __copyright__, __maintainer__\nfrom .__version__ import __credits__, __license__, __description__, __url__\nfrom .__version__ import __version__, __version_long__, __status__\n\nfrom .jmdict_sqlite import JMDictSQLite\nfrom .kanjidic2_sqlite import KanjiDic2SQLite\nfrom .util import Jamdict, JMDictXML, KanjiDic2XML\nfrom .krad import KRad\n__all__ = ['Jamdict', 'JMDictSQLite', 'JMDictXML', 'KanjiDic2SQLite', 'KanjiDic2XML', 'KRad',\n           \"__version__\", \"__author__\", \"__description__\", \"__copyright__\", \"version_info\"]\n"
  },
  {
    "path": "jamdict/__main__.py",
    "content": "from . import tools\ntools.main()\n"
  },
  {
    "path": "jamdict/__version__.py",
    "content": "# -*- coding: utf-8 -*-\n\n# jamdict's package version information\n__author__ = \"Le Tuan Anh\"\n__email__ = \"tuananh.ke@gmail.com\"\n__copyright__ = \"Copyright (c) 2016, Le Tuan Anh\"\n__credits__ = []\n__license__ = \"MIT License\"\n__description__ = \"Python library for using Japanese dictionaries and resources (Jim Breen's JMdict, KanjiDic2, KRADFILE, JMnedict)\"\n__url__ = \"https://github.com/neocl/jamdict\"\n__maintainer__ = \"Le Tuan Anh\"\n# ------------------------------------------------------------------------------\n# Version configuration (enforcing PEP 440)\n# ------------------------------------------------------------------------------\n__status__ = \"3 - Alpha\"\n__version_tuple__ = (0, 1, 0, 11, 2)\n__version_status__ = ''  # a specific value ('rc', 'dev', etc.) or leave blank to be auto-filled\n# ------------------------------------------------------------------------------\n__status_map__ = {'3 - Alpha': 'a', '4 - Beta': 'b', '5 - Production/Stable': '', '6 - Mature': ''}\nif not __version_status__:\n    __version_status__ = __status_map__[__status__]\nif len(__version_tuple__) == 3:\n    __version_build__ = ''\nelif len(__version_tuple__) == 4:\n    __version_build__ = f\"{__version_tuple__[3]}\"\nelif len(__version_tuple__) == 5:\n    __version_build__ = f\"{__version_tuple__[3]}.post{__version_tuple__[4]}\"\nelse:\n    raise ValueError(\"Invalid version information\")\nif __version_tuple__[2] == 0:\n    __version_main__ = f\"{'.'.join(str(n) for n in __version_tuple__[:2])}\"\nelse:\n    __version_main__ = f\"{'.'.join(str(n) for n in __version_tuple__[:3])}\"\n__version__ = f\"{__version_main__}{__version_status__}{__version_build__}\"\n__version_long__ = f\"{__version_main__} - {__status__.split('-')[1].strip()} {__version_build__}\"\n"
  },
  {
    "path": "jamdict/config.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nJamdict configuration management\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport os\nfrom pathlib import Path\nimport logging\n\nfrom chirptext import AppConfig\nfrom chirptext.chio import read_file, write_file\n\n# ----------------------------------------------------------------------\n# Configuration\n# ----------------------------------------------------------------------\n\nMY_DIR = os.path.dirname(__file__)\nCONFIG_TEMPLATE = os.path.join(MY_DIR, 'data', 'config_template.json')\n__jamdict_home = os.environ.get('JAMDICT_HOME', MY_DIR)\n__app_config = AppConfig('jamdict', mode=AppConfig.JSON, working_dir=__jamdict_home)\n\n\ndef _get_config_manager():\n    ''' Internal function for retrieving application config manager object\n    Don't use this directly, use read_config() method instead\n    '''\n    return __app_config\n\n\ndef _ensure_config(config_path='~/.jamdict/config.json', mkdir=True):\n    _path = Path(os.path.expanduser(config_path))\n    # auto create config dir\n    if mkdir:\n        _path.parent.mkdir(exist_ok=True)\n    if not _path.exists():\n        default_config = read_file(CONFIG_TEMPLATE)\n        logging.getLogger(__name__).warning(f\"Jamdict configuration file could not be found. A new configuration file will be generated at {_path}\")\n        logging.getLogger(__name__).debug(f\"Default config: {default_config}\")\n        write_file(_path, default_config)\n\n\ndef read_config(config_file=None, force_refresh=False, ensure_config=False):\n    ''' Read jamdict configuration (jamdict home folder, database name, etc.) from config file.\n\n    When no configuration is available, jamdict will default JAMDICT_HOME to ``~/.jamdict``\n\n    This function should be called right after import statements (i.e. before jam = Jamdict())\n\n    The \"standard\" locations for configuration file include but not limited to:\n    ~/.jamdict/config.json\n    ~/.config/jamdict/config.json\n    ./data/jamdict.json\n    ./jamdict.json\n    ./data/.jamdict.json\n    ./.jamdict.json\n    \n    :param config_file: Path to configuration file. When config_file is None, jamdict will try to guess the location of the file.\n    :param force_refresh: Force to re-read configuration from file\n    :param ensure_config: Create configuration file automatically if it does not exist\n    '''\n    if ensure_config and not config_file and not __app_config.locate_config():\n        # [2021-04-15] data can be installed via PyPI\n        # configuration file can be optional now\n        # load config from default template\n        _ensure_config()\n    if force_refresh or not __app_config.config:\n        if config_file and os.path.isfile(config_file):\n            __app_config.load(config_file)\n        else:\n            __app_config.load(CONFIG_TEMPLATE)\n    # read config\n    config = __app_config.config\n    return config\n\n\ndef home_dir():\n    ''' Find JAMDICT_HOME folder.\n    if there is an environment variable that points to an existing directory\n    (e.g. export JAMDICT_HOME=/home/user/jamdict)\n    that folder will be used instead of the configured in jamdict JSON config file\n    '''\n    _config = read_config()\n    # [2020-06-01] Allow JAMDICT_HOME to be overridden by environment variables\n    if 'JAMDICT_HOME' in os.environ:\n        _env_jamdict_home = os.path.abspath(os.path.expanduser(os.environ['JAMDICT_HOME']))\n        if os.path.isdir(_env_jamdict_home):\n            logging.getLogger(__name__).debug(\"JAMDICT_HOME: {}\".format(_env_jamdict_home))\n            return _env_jamdict_home\n    return _config.get('JAMDICT_HOME', __jamdict_home)\n\n\ndef data_dir():\n    _config = read_config()\n    _data_dir = _config.get('JAMDICT_DATA', '{JAMDICT_HOME}/data').format(JAMDICT_HOME=home_dir())\n    return _data_dir\n\n\ndef get_file(file_key):\n    ''' Get configured path by key '''\n    _config = read_config()\n    _data_dir = data_dir()\n    _home = home_dir()\n    _value = _config.get(file_key)\n    return _value.format(JAMDICT_DATA=_data_dir, JAMDICT_HOME=_home) if _value else ''\n"
  },
  {
    "path": "jamdict/data/config_template.json",
    "content": "{\n    \"JAMDICT_HOME\": \"~/.jamdict\",\n    \"JAMDICT_DATA\": \"{JAMDICT_HOME}/data\",\n    \"JAMDICT_DB\": \"{JAMDICT_DATA}/jamdict.db\",\n    \"JMDICT_XML\": \"{JAMDICT_DATA}/JMdict_e.gz\",\n    \"JMNEDICT_XML\": \"{JAMDICT_DATA}/JMnedict.xml.gz\",\n    \"KD2_XML\": \"{JAMDICT_DATA}/kanjidic2.xml.gz\",\n    \"KRADFILE\": \"{JAMDICT_DATA}/kradfile-u.gz\"\n}\n"
  },
  {
    "path": "jamdict/data/setup_jmdict.sql",
    "content": "/* Add meta info */\nCREATE TABLE IF NOT EXISTS meta (\n       key TEXT PRIMARY KEY NOT NULL,\n       value TEXT NOT NULL\n);\n\n-------------------------------------------------------------------------------------\n-- JMDict\n-------------------------------------------------------------------------------------\n\nCREATE TABLE Entry (\n       idseq INTEGER NOT NULL UNIQUE\n);\n\n-- Entry's links (EntryInfo)\nCREATE TABLE Link (\n       ID INTEGER PRIMARY KEY\n       ,idseq INTEGER\n       ,tag TEXT\n       ,desc TEXT\n       ,uri TEXT\n       ,FOREIGN KEY (idseq) REFERENCES Entry(idseq)\n);\n\n-- Entry's bibinfo (EntryInfo)\nCREATE TABLE Bib (\n       ID INTEGER PRIMARY KEY\n       ,idseq INTEGER\n       ,tag TEXT\n       ,text TEXT\n       ,FOREIGN KEY (idseq) REFERENCES Entry(idseq)\n);\n\n-- Entry's etym (EntryInfo)\nCREATE TABLE Etym (\n       idseq INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (idseq) REFERENCES Entry(idseq)\n);\n\n-- Entry's audit (EntryInfo)\nCREATE TABLE Audit (\n       idseq INTEGER\n       ,upd_date TEXT\n       ,upd_detl TEXT\n       ,FOREIGN KEY (idseq) REFERENCES Entry(idseq)\n);\n\n-------------------------------------------------------------------------------------\n-- Kanji reading(s) of an entry\n-------------------------------------------------------------------------------------\nCREATE TABLE Kanji (\n       ID INTEGER PRIMARY KEY\n       ,idseq INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (idseq) REFERENCES Entry(idseq)\n);\n\n-- Kanji's info\nCREATE TABLE KJI (\n       kid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (kid) REFERENCES Kanji(id)\n);\n\n-- Kanji priority\nCREATE TABLE KJP (\n       kid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (kid) REFERENCES Kanji(id)\n);\n\n-------------------------------------------------------------------------------------\n-- Kana reading(s) of an entry\n-------------------------------------------------------------------------------------\nCREATE TABLE Kana (\n       ID INTEGER PRIMARY KEY\n       ,idseq INTEGER\n       ,text TEXT\n       ,nokanji BOOLEAN\n       ,FOREIGN KEY (idseq) REFERENCES Entry(idseq)\n);\n\n-- re_restr\nCREATE TABLE KNR (\n       kid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (kid) REFERENCES Kana(id)\n);\n\n-- Kana's info\nCREATE TABLE KNI (\n       kid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (kid) REFERENCES Kana(id)\n);\n\n-- Kana priority\nCREATE TABLE KNP (\n       kid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (kid) REFERENCES Kana(id)\n);\n\n-------------------------------------------------------------------------------------\n-- Senses of an entry\n-------------------------------------------------------------------------------------\nCREATE TABLE Sense (\n       ID INTEGER PRIMARY KEY\n       ,idseq INTEGER\n       ,FOREIGN KEY (idseq) REFERENCES Entry(idseq)\n);\n\nCREATE TABLE stagk (\n       sid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (sid) REFERENCES Sense(id)\n);\n\nCREATE TABLE stagr (\n       sid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (sid) REFERENCES Sense(id)\n);\n\nCREATE TABLE pos (\n       sid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (sid) REFERENCES Sense(id)\n);\n\nCREATE TABLE xref (\n       sid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (sid) REFERENCES Sense(id)\n);\n\nCREATE TABLE antonym (\n       sid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (sid) REFERENCES Sense(id)\n);\n\nCREATE TABLE field (\n       sid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (sid) REFERENCES Sense(id)\n);\n\nCREATE TABLE misc (\n       sid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (sid) REFERENCES Sense(id)\n);\n\nCREATE TABLE SenseInfo (\n       sid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (sid) REFERENCES Sense(id)\n);\n\nCREATE TABLE SenseSource (\n       sid INTEGER\n       ,text TEXT\n       ,lang TEXT\n       ,lstype TEXT\n       ,wasei TEXT\n       ,FOREIGN KEY (sid) REFERENCES Sense(id)\n);\n\nCREATE TABLE dialect (\n       sid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (sid) REFERENCES Sense(id)\n);\n\nCREATE TABLE SenseGloss (\n       sid INTEGER\n       ,lang TEXT\n       ,gend TEXT\n       ,text TEXT\n       ,FOREIGN KEY (sid) REFERENCES Sense(id)\n);\n\n-------------------------------------------------------------------------------------\n-- INDICES - JMDict\n-------------------------------------------------------------------------------------\n\nCREATE INDEX Link_idseq ON Link(idseq);\nCREATE INDEX Link_tag ON Link(tag);\nCREATE INDEX Bib_idseq ON Link(idseq);\nCREATE INDEX Etym_idseq ON Etym(idseq);\nCREATE INDEX Audit_idseq ON Audit(idseq);\n\nCREATE INDEX Kanji_idseq ON Kanji(idseq);\nCREATE INDEX Kanji_text ON Kanji(text);\nCREATE INDEX KJI_kid ON KJI(kid);\nCREATE INDEX KJP_kid ON KJP(kid);\n\nCREATE INDEX Kana_idseq ON Kana(idseq);\nCREATE INDEX Kana_text ON Kana(text);\nCREATE INDEX KNR_kid ON KNR(kid);\nCREATE INDEX KNR_text ON KNR(text);\nCREATE INDEX KNI_kid ON KNI(kid);\nCREATE INDEX KNI_text ON KNI(text);\nCREATE INDEX KNP_kid ON KNP(kid);\nCREATE INDEX KNP_text ON KNP(text);\n\nCREATE INDEX Sense_idseq ON Sense(idseq);\nCREATE INDEX stagk_sid ON stagk(sid);\nCREATE INDEX stagk_text ON stagk(text);\nCREATE INDEX stagr_sid ON stagr(sid);\nCREATE INDEX stagr_text ON stagr(text);\nCREATE INDEX pos_sid ON pos(sid);\nCREATE INDEX pos_text ON pos(text);\nCREATE INDEX xref_sid ON xref(sid);\nCREATE INDEX xref_text ON xref(text);\nCREATE INDEX antonym_sid ON antonym(sid);\nCREATE INDEX antonym_text ON antonym(text);\nCREATE INDEX field_sid ON field(sid);\nCREATE INDEX field_text ON field(text);\nCREATE INDEX misc_sid ON misc(sid);\nCREATE INDEX misc_text ON misc(text);\nCREATE INDEX SenseInfo_sid ON SenseInfo(sid);\nCREATE INDEX SenseInfo_text ON SenseInfo(text);\nCREATE INDEX SenseSource_sid ON SenseSource(sid);\nCREATE INDEX SenseSource_text ON SenseSource(text);\nCREATE INDEX dialect_sid ON dialect(sid);\nCREATE INDEX dialect_text ON dialect(text);\nCREATE INDEX SenseGloss_sid ON SenseGloss(sid);\nCREATE INDEX SenseGloss_lang ON SenseGloss(lang);\nCREATE INDEX SenseGloss_gend ON SenseGloss(gend);\nCREATE INDEX SenseGloss_text ON SenseGloss(text);\n"
  },
  {
    "path": "jamdict/data/setup_jmnedict.sql",
    "content": "/* Add meta info */\nCREATE TABLE IF NOT EXISTS meta (\n       key TEXT PRIMARY KEY NOT NULL,\n       value TEXT NOT NULL\n);\n\n-------------------------------------------------------------------------------------\n-- JMDict\n-------------------------------------------------------------------------------------\n\nCREATE TABLE NEEntry (\n       idseq INTEGER NOT NULL UNIQUE\n);\n\n-------------------------------------------------------------------------------------\n-- Kanji reading(s) of an entry\n-------------------------------------------------------------------------------------\nCREATE TABLE NEKanji (\n       ID INTEGER PRIMARY KEY\n       ,idseq INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (idseq) REFERENCES Entry(idseq)\n);\n\n-------------------------------------------------------------------------------------\n-- Kana reading(s) of an entry\n-------------------------------------------------------------------------------------\nCREATE TABLE NEKana (\n       ID INTEGER PRIMARY KEY\n       ,idseq INTEGER\n       ,text TEXT\n       ,nokanji BOOLEAN\n       ,FOREIGN KEY (idseq) REFERENCES Entry(idseq)\n);\n\n-------------------------------------------------------------------------------------\n-- Senses of an entry\n-------------------------------------------------------------------------------------\nCREATE TABLE NETranslation (\n       ID INTEGER PRIMARY KEY\n       ,idseq INTEGER\n       ,FOREIGN KEY (idseq) REFERENCES Entry(idseq)\n);\n\nCREATE TABLE NETransType (\n       tid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (tid) REFERENCES NETranslation(id)\n);\n\nCREATE TABLE NETransXRef (\n       tid INTEGER\n       ,text TEXT\n       ,FOREIGN KEY (tid) REFERENCES NETranslation(id)\n);\n\nCREATE TABLE NETransGloss (\n       tid INTEGER\n       ,lang TEXT\n       ,gend TEXT\n       ,text TEXT\n       ,FOREIGN KEY (tid) REFERENCES NETranslation(id)\n);\n\n-------------------------------------------------------------------------------------\n-- INDICES - JMneDict\n-------------------------------------------------------------------------------------\n\nCREATE INDEX NEKanji_idseq ON NEKanji(idseq);\nCREATE INDEX NEKanji_text ON NEKanji(text);\n\nCREATE INDEX NEKana_idseq ON NEKana(idseq);\nCREATE INDEX NEKana_text ON NEKana(text);\n\nCREATE INDEX NETranslation_idseq ON NETranslation(idseq);\nCREATE INDEX NETransType_tid ON NETransType(tid);\nCREATE INDEX NETransType_text ON NETransType(text);\nCREATE INDEX NETransXRef_tid ON NETransXRef(tid);\nCREATE INDEX NETransXRef_text ON NETransXRef(text);\nCREATE INDEX NETransGloss_tid ON NETransGloss(tid);\nCREATE INDEX NETransGloss_lang ON NETransGloss(lang);\nCREATE INDEX NETransGloss_text ON NETransGloss(text);\n\n"
  },
  {
    "path": "jamdict/data/setup_kanjidic2.sql",
    "content": "/* Add meta info */\nCREATE TABLE IF NOT EXISTS meta (\n       key TEXT UNIQUE,\n       value TEXT NOT NULL\n);\n\n-------------------------------------------------------------------------------------\n-- KanjiDic2 tables\n-------------------------------------------------------------------------------------\n\nCREATE TABLE character (\n       ID INTEGER PRIMARY KEY AUTOINCREMENT,\n       literal TEXT NOT NULL,\n       stroke_count INTEGER,\n       grade TEXT,\n       freq TEXT,\n       jlpt TEXT\n);\n\nCREATE TABLE codepoint (\n       cid INTEGER\n       ,cp_type TEXT\n       ,value TEXT\n       ,FOREIGN KEY (cid) REFERENCES character(ID)\n);\n\nCREATE TABLE radical (\n       cid INTEGER\n       ,rad_type TEXT\n       ,value TEXT\n       ,FOREIGN KEY (cid) REFERENCES character(ID)\n);\n\nCREATE TABLE stroke_miscount (\n       cid INTEGER\n       ,value INTEGER\n       ,FOREIGN KEY (cid) REFERENCES character(ID)\n);\n\nCREATE TABLE variant (\n       cid INTEGER\n       ,var_type TEXT\n       ,value TEXT\n       ,FOREIGN KEY (cid) REFERENCES character(ID)\n);\n\nCREATE TABLE rad_name (\n       cid INTEGER\n       ,value TEXT\n       ,FOREIGN KEY (cid) REFERENCES character(ID)\n);\n\nCREATE TABLE dic_ref (\n       cid INTEGER\n       ,dr_type TEXT\n       ,value TEXT\nn       ,m_vol TEXT\n       ,m_page TEXT\n       ,FOREIGN KEY (cid) REFERENCES character(ID)\n);\n\nCREATE TABLE query_code (\n       cid INTEGER\n       ,qc_type TEXT\n       ,value TEXT\n       ,skip_misclass TEXT\n       ,FOREIGN KEY (cid) REFERENCES character(ID)\n);\n\nCREATE TABLE nanori (\n       cid INTEGER\n       ,value TEXT\n       ,FOREIGN KEY (cid) REFERENCES character(ID)\n);\n\nCREATE TABLE rm_group (\n       ID INTEGER PRIMARY KEY AUTOINCREMENT\n       ,cid INTEGER\n       ,FOREIGN KEY (cid) REFERENCES character(ID)\n);\n\nCREATE TABLE reading (\n       gid INTEGER\n       ,r_type TEXT\n       ,value TEXT\n       ,on_type TEXT\n       ,r_status TEXT\n       ,FOREIGN KEY (gid) REFERENCES rm_group(id)\n);\n\nCREATE TABLE meaning (\n       gid INTEGER\n       ,value TEXT\n       ,m_lang TEXT\n       ,FOREIGN KEY (gid) REFERENCES rm_group(id)\n);\n\n-------------------------------------------------------------------------------------\n-- INDICES - KanjiDic2\n-------------------------------------------------------------------------------------\n\nCREATE INDEX character_literal ON character(literal);\nCREATE INDEX character_stroke_count ON character(stroke_count);\nCREATE INDEX character_grade ON character(grade);\nCREATE INDEX character_jlpt ON character(jlpt);\n\nCREATE INDEX codepoint_value ON codepoint(value);\nCREATE INDEX radical_value ON radical(value);\nCREATE INDEX variant_value ON variant(value);\nCREATE INDEX rad_name_value ON rad_name(value);\nCREATE INDEX dic_ref_value ON dic_ref(value);\nCREATE INDEX query_code_value ON query_code(value);\nCREATE INDEX nanori_value ON nanori(value);\nCREATE INDEX rm_group_cid ON rm_group(cid);\nCREATE INDEX reading_r_type ON reading(r_type);\nCREATE INDEX reading_value ON reading(value);\nCREATE INDEX meaning_value ON meaning(value);\nCREATE INDEX meaning_m_lang ON meaning(m_lang);\n"
  },
  {
    "path": "jamdict/jmdict.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nJMdict Models\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport os\nimport logging\nimport warnings\nfrom typing import List\n\ntry:\n    from lxml import etree\n    _LXML_AVAILABLE = True\nexcept Exception as e:\n    # logging.getLogger(__name__).debug(\"lxml is not available, fall back to xml.etree.ElementTree\")\n    from xml.etree import ElementTree as etree\n    _LXML_AVAILABLE = False\n\nfrom chirptext import chio\n\nlogger = logging.getLogger(__name__)\n\n########################################################################\n\n\nclass JMDEntry(object):\n    ''' Represents a dictionary Word entry.\n\n    Entries consist of kanji elements, reading elements,\n    general information and sense elements. Each entry must have at\n    least one reading element and one sense element. Others are optional.\n\n    XML DTD <!ELEMENT entry (ent_seq, k_ele*, r_ele+, info?, sense+)>'''\n\n    def __init__(self, idseq=''):\n        # A unique numeric sequence number for each entry\n        self.idseq = idseq     # ent_seq\n        self.kanji_forms: List[KanjiForm] = []  # k_ele*\n        self.kana_forms: List[KanaForm] = []   # r_ele+  => KanaForm[]\n        self.info: EntryInfo = None       # info?   => EntryInfo\n        self.senses: List[Sense] = []       # sense+\n\n    def __len__(self):\n        return len(self.senses)\n\n    def __getitem__(self, idx):\n        return self.senses[idx]\n\n    def set_info(self, info):\n        if self.info:\n            logging.warning(\"WARNING: multiple info tag\")\n        self.info = info\n\n    def text(self, compact=True, separator=' ', no_id=False):\n        tmp = []\n        if not compact and not no_id:\n            tmp.append('[id#%s]' % self.idseq)\n        if self.kana_forms:\n            tmp.append(self.kana_forms[0].text)\n        if self.kanji_forms:\n            tmp.append(\"({})\".format(self.kanji_forms[0].text))\n        if self.senses:\n            tmp.append(':')\n            if len(self.senses) == 1:\n                tmp.append(self.senses[0].text(compact=compact))\n            else:\n                for sense, idx in zip(self.senses, range(len(self.senses))):\n                    tmp.append('{i}. {s}'.format(i=idx + 1, s=sense.text(compact=compact)))\n        return separator.join(tmp)\n\n    def __repr__(self):\n        return self.text(compact=True)\n\n    def __str__(self):\n        return self.text(compact=False)\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        ed = {'idseq': self.idseq,\n              'kanji': [x.to_dict() for x in self.kanji_forms],\n              'kana': [x.to_dict() for x in self.kana_forms],\n              'senses': [x.to_dict() for x in self.senses]}\n        if self.info:\n            ed['info'] = self.info.to_dict()\n        return ed\n\n\nclass KanjiForm(object):\n    ''' The kanji element, or in its absence, the reading element, is\n    the defining component of each entry.\n    The overwhelming majority of entries will have a single kanji\n    element associated with a word in Japanese. Where there are\n    multiple kanji elements within an entry, they will be orthographical\n    variants of the same word, either using variations in okurigana, or\n    alternative and equivalent kanji. Common \"mis-spellings\" may be\n    included, provided they are associated with appropriate information\n    fields. Synonyms are not included; they may be indicated in the\n    cross-reference field associated with the sense element.\n    DTD <!ELEMENT k_ele (keb, ke_inf*, ke_pri*)>\n    text --- a kanji written form of an entry, string\n    info --- coded information field, a list of strings\n    pri --- relative priority of the entry, a list of strings\n    '''\n\n    def __init__(self, text=''):\n        '''This element will contain a word or short phrase in Japanese\n        which is written using at least one non-kana character (usually kanji,\n        but can be other characters). The valid characters are\n        kanji, kana, related characters such as chouon and kurikaeshi, and\n        in exceptional cases, letters from other alphabets.\n        '''\n        self.text = text  # <!ELEMENT keb (#PCDATA)>\n\n        '''This is a coded information field related specifically to the\n        orthography of the keb, and will typically indicate some unusual\n        aspect, such as okurigana irregularity.'''\n        self.info = []  # <!ELEMENT ke_inf (#PCDATA)>*\n\n        '''This and the equivalent re_pri field are provided to record\n        information about the relative priority of the entry,  and consist\n        of codes indicating the word appears in various references which\n        can be taken as an indication of the frequency with which the word\n        is used. This field is intended for use either by applications which\n        want to concentrate on entries of  a particular priority, or to\n        generate subset files.\n        The current values in this field are:\n        - news1/2: appears in the \"wordfreq\" file compiled by Alexandre Girardi\n        from the Mainichi Shimbun. (See the Monash ftp archive for a copy.)\n        Words in the first 12,000 in that file are marked \"news1\" and words\n        in the second 12,000 are marked \"news2\".\n        - ichi1/2: appears in the \"Ichimango goi bunruishuu\", Senmon Kyouiku\n        Publishing, Tokyo, 1998.  (The entries marked \"ichi2\" were\n        demoted from ichi1 because they were observed to have low\n        frequencies in the WWW and newspapers.)\n        - spec1 and spec2: a small number of words use this marker when they\n        are detected as being common, but are not included in other lists.\n        - gai1/2: common loanwords, based on the wordfreq file.\n        - nfxx: this is an indicator of frequency-of-use ranking in the\n        wordfreq file. \"xx\" is the number of the set of 500 words in which\n        the entry can be found, with \"01\" assigned to the first 500, \"02\"\n        to the second, and so on. (The entries with news1, ichi1, spec1 and\n        gai1 values are marked with a \"(P)\" in the EDICT and EDICT2\n        files.)\n        The reason both the kanji and reading elements are tagged is because\n        on occasions a priority is only associated with a particular\n        kanji/reading pair.'''\n        self.pri = []  # <!ELEMENT ke_pri (#PCDATA)>*\n\n    def set_text(self, text):\n        if self.text:\n            logging.warning(\"WARNING: duplicated text for k_ele\")\n        self.text = text\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        kjd = {'text': self.text}\n        if self.info:\n            kjd['info'] = self.info\n        if self.pri:\n            kjd['pri'] = self.pri\n        return kjd\n\n    def __repr__(self):\n        return str(self)\n\n    def __str__(self):\n        return self.text\n\n\nclass KanaForm(object):\n    '''<!ELEMENT r_ele (reb, re_nokanji?, re_restr*, re_inf*, re_pri*)>\n    The reading element typically contains the valid readings\n    of the word(s) in the kanji element using modern kanadzukai.\n    Where there are multiple reading elements, they will typically be\n    alternative readings of the kanji element. In the absence of a\n    kanji element, i.e. in the case of a word or phrase written\n    entirely in kana, these elements will define the entry.\n    text --- a kana written form of an entry, string\n    nokanji --- True means this entry cannot be regarded as a true reading of the kanji, boolean\n    restr --- use to restrict the reading to a subset of the available kanji forms, list of string\n    info --- coded information field, a list of strings\n    pri --- relative priority of the entry, a list of strings\n    '''\n\n    def __init__(self, text='', nokanji=False):\n        '''this element content is restricted to kana and related\n        characters such as chouon and kurikaeshi. Kana usage will be\n        consistent between the keb and reb elements; e.g. if the keb\n        contains katakana, so too will the reb.'''\n        self.text = text  # <!ELEMENT reb (#PCDATA)>\n\n        '''This element, which will usually have a null value, indicates\n        that the reb, while associated with the keb, cannot be regarded\n        as a true reading of the kanji. It is typically used for words\n        such as foreign place names, gairaigo which can be in kanji or\n        katakana, etc.'''\n        self.nokanji = nokanji  # <!ELEMENT re_nokanji (#PCDATA)>?\n\n        '''This element is used to indicate when the reading only applies\n        to a subset of the keb elements in the entry. In its absence, all\n        readings apply to all kanji elements. The contents of this element\n        must exactly match those of one of the keb elements.'''\n        self.restr = []  # <!ELEMENT re_restr (#PCDATA)>*\n\n        '''General coded information pertaining to the specific reading.\n        Typically it will be used to indicate some unusual aspect of\n        the reading.'''\n        self.info = []  # <!ELEMENT re_inf (#PCDATA)>*\n\n        '''See the comment on ke_pri above.'''\n        self.pri = []  # <!ELEMENT re_pri (#PCDATA)>*\n\n    def set_text(self, text):\n        if self.text:\n            logging.warning(\"WARNING: duplicated text for k_ele\")\n        self.text = text\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        knd = {'text': self.text,\n               'nokanji': self.nokanji}\n        if self.restr:\n            knd['restr'] = self.restr\n        if self.info:\n            knd['info'] = self.info\n        if self.pri:\n            knd['pri'] = self.pri\n        return knd\n\n    def __repr__(self):\n        return str(self)\n\n    def __str__(self):\n        return self.text\n\n\nclass EntryInfo(object):\n    \"\"\"General coded information relating to the entry as a whole.\n    DTD: <!ELEMENT info (links*, bibl*, etym*, audit*)>\n    \"\"\"\n    def __init__(self):\n        self.links: List[Link] = []    # link*\n        self.bibinfo: List[BibInfo] = []  # bibl*\n        '''This field is used to hold information about the etymology\n        of the kanji or kana parts of the entry. For gairaigo,\n        etymological information may also be in the <lsource> element.'''\n        self.etym = []     # <!ELEMENT etym (#PCDATA)>*\n        self.audit: List[Audit] = []    # audit*\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'links': [x.to_dict() for x in self.links],\n                'bibinfo': [x.to_dict() for x in self.bibinfo],\n                'etym': self.etym,\n                'audit': [x.to_dict() for x in self.audit]}\n\n\nclass Link(object):\n    '''This element holds details of linking information to\n    entries in other electronic repositories. The link_tag will be\n    coded to indicate the type of link (text, image, sound), the\n    link_desc will provided a textual label for the link, and the\n    link_uri contains the actual URI.\n    <!ELEMENT links (link_tag, link_desc, link_uri)>'''\n    def __init__(self, tag, desc, uri):\n        self.tag: str = tag    # <!ELEMENT link_tag (#PCDATA)>\n        self.desc: str = desc  # <!ELEMENT link_desc (#PCDATA)>\n        self.uri: str = uri    # <!ELEMENT link_uri (#PCDATA)>\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'tag': self.tag,\n                'desc': self.desc,\n                'uri': self.uri}\n\n\nclass BibInfo(object):\n    '''Bibliographic information about the entry. The bib_tag will a\n    coded reference to an entry in an external bibliographic database.\n    The bib_txt field may be used for brief (local) descriptions.\n    <!ELEMENT bibl (bib_tag?, bib_txt?)>\n    <!ELEMENT bib_tag (#PCDATA)>\n    <!ELEMENT bib_txt (#PCDATA)>\n    '''\n    def __init__(self, tag='', text=''):\n        self.tag: str = tag\n        self.text: str = text\n\n    def set_tag(self, tag):\n        if self.tag:\n            logging.warning(\"WARNING: duplicate tag in bibinfo\")\n        self.tag = tag\n\n    def set_text(self, text):\n        if self.text:\n            logging.warning(\"WARNING: duplicate text in bibinfo\")\n        self.text = text\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'tag': self.tag, 'text': self.text}\n\n\nclass Audit(object):\n    '''The audit element will contain the date and other information\n    about updates to the entry. Can be used to record the source of\n    the material.\n    <!ELEMENT audit (upd_date, upd_detl)>'''\n    def __init__(self, upd_date, upd_detl):\n        self.upd_date = upd_date  # <!ELEMENT upd_date (#PCDATA)>\n        self.upd_detl = upd_detl  # <!ELEMENT upd_detl (#PCDATA)>\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'upd_date': self.upd_date, 'upd_detl': self.upd_detl}\n\n\nclass Sense(object):\n    '''The sense element will record the translational equivalent\n    of the Japanese word, plus other related information. Where there\n    are several distinctly different meanings of the word, multiple\n    sense elements will be employed.\n    <!ELEMENT sense (stagk*, stagr*, pos*, xref*, ant*, field*, misc*, s_inf*, lsource*, dial*, gloss*, example*)>\n    '''\n    def __init__(self):\n        '''These elements, if present, indicate that the sense is restricted\n        to the lexeme represented by the keb and/or reb.'''\n        self.stagk = []  # <!ELEMENT stagk (#PCDATA)>\n        self.stagr = []  # <!ELEMENT stagr (#PCDATA)>\n\n        '''Part-of-speech information about the entry/sense. Should use\n        appropriate entity codes. In general where there are multiple senses\n        in an entry, the part-of-speech of an earlier sense will apply to\n        later senses unless there is a new part-of-speech indicated.'''\n        self.pos = []   # <!ELEMENT pos (#PCDATA)>\n\n        '''This element is used to indicate a cross-reference to another\n        entry with a similar or related meaning or sense. The content of\n        this element is typically a keb or reb element in another entry. In some\n        cases a keb will be followed by a reb and/or a sense number to provide\n        a precise target for the cross-reference. Where this happens, a JIS\n        \"centre-dot\" (0x2126) is placed between the components of the\n        cross-reference.\n        <!ELEMENT xref (#PCDATA)*>'''\n        self.xref = []  # xref\n\n        '''This element is used to indicate another entry which is an\n        antonym of the current entry/sense. The content of this element\n        must exactly match that of a keb or reb element in another entry.'''\n        self.antonym = []  # <!ELEMENT ant (#PCDATA)*>\n\n        '''Information about the field of application of the entry/sense.\n        When absent, general application is implied. Entity coding for\n        specific fields of application.'''\n        self.field = []  # <!ELEMENT field (#PCDATA)>\n\n        '''This element is used for other relevant information about\n        the entry/sense. As with part-of-speech, information will usually\n        apply to several senses.'''\n        self.misc = []  # <!ELEMENT misc (#PCDATA)>\n\n        '''The sense-information elements provided for additional\n        information to be recorded about a sense. Typical usage would\n        be to indicate such things as level of currency of a sense, the\n        regional variations, etc.'''\n        self.info = []  # <!ELEMENT s_inf (#PCDATA)>\n\n        self.lsource: List[LSource] = []  # <!ELEMENT lsource (#PCDATA)>\n\n        '''For words specifically associated with regional dialects in\n        Japanese, the entity code for that dialect, e.g. ksb for Kansaiben.'''\n        self.dialect = []  # <!ELEMENT dial (#PCDATA)>\n\n        self.gloss: List[SenseGloss] = []  # <!ELEMENT gloss (#PCDATA | pri)*>\n\n        '''The example elements provide for pairs of short Japanese and\n        target-language phrases or sentences which exemplify the usage of the\n        Japanese head-word and the target-language gloss. Words in example\n        fields would typically not be indexed by a dictionary application.'''\n        # It seems that this field is not used anymore!\n        self.examples = []  # <!ELEMENT example (#PCDATA)>\n\n    def __repr__(self):\n        return str(self)\n\n    def __str__(self):\n        return self.text(compact=False)\n\n    def text(self, compact=True):\n        tmp = [str(x) for x in self.gloss]\n        if not compact and self.pos:\n            return '{gloss} ({pos})'.format(gloss='/'.join(tmp), pos=('(%s)' % '|'.join(self.pos)))\n        else:\n            return '/'.join(tmp)\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        sd = {}\n        if self.stagk:\n            sd['stagk'] = self.stagk\n        if self.stagr:\n            sd['stagr'] = self.stagr\n        if self.pos:\n            sd['pos'] = self.pos\n        if self.xref:\n            sd['xref'] = self.xref\n        if self.antonym:\n            sd['antonym'] = self.antonym\n        if self.field:\n            sd['field'] = self.field\n        if self.misc:\n            sd['misc'] = self.misc\n        if self.info:\n            sd['SenseInfo'] = self.info\n        if self.lsource:\n            sd['SenseSource'] = [x.to_dict() for x in self.lsource]\n        if self.dialect:\n            sd['dialect'] = self.dialect\n        if self.gloss:\n            sd['SenseGloss'] = [x.to_dict() for x in self.gloss]\n        return sd\n\n\nclass Translation(Sense):\n    ''' The trans element will record the translational equivalent\n    of the Japanese name, plus other related information. (JMendict)\n    <!ELEMENT trans (name_type*, xref*, trans_det*)>'''\n    def __init__(self):\n        super().__init__()\n        self.name_type = []  # mapped to name_type*\n        self.xref = []  # mapped to xref\n        self.gloss = []  # mapped to trans_det\n\n    def name_type_human(self):\n        return [JMENDICT_TYPE_MAP[x] if x in JMENDICT_TYPE_MAP else x for x in self.name_type]\n\n    def text(self, compact=True):\n        tmp = [str(x) for x in self.gloss]\n        types = \"/\".join(self.name_type) if compact else \"/\".join(self.name_type_human())\n        return '{gloss} ({types})'.format(gloss='/'.join(tmp), types=types)\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        sd = super().to_dict()\n        sd['name_type'] = self.name_type\n        return sd\n\n\nclass SenseGloss(object):\n    '''Within each sense will be one or more \"glosses\", i.e.\n        target-language words or phrases which are equivalents to the\n        Japanese word. This element would normally be present, however it\n        may be omitted in entries which are purely for a cross-reference.\n        DTD: <!ELEMENT gloss (#PCDATA | pri)*>\n\n        <!ATTLIST gloss xml:lang CDATA \"eng\">\n        The xml:lang attribute defines the target language of the\n        gloss. It will be coded using the three-letter language code from\n        the ISO 639 standard. When absent, the value \"eng\" (i.e. English)\n        is the default value.\n        <!ATTLIST gloss g_gend CDATA #IMPLIED>\n        The g_gend attribute defines the gender of the gloss (typically\n        a noun in the target language. When absent, the gender is either\n        not relevant or has yet to be provided.\n        <!ELEMENT pri (#PCDATA)>\n        These elements highlight particular target-language words which\n        are strongly associated with the Japanese word. The purpose is to\n        establish a set of target-language words which can effectively be\n        used as head-words in a reverse target-language/Japanese relationship.'''\n    def __init__(self, lang, gend, text):\n        self.lang = lang\n        self.gend = gend\n        self.text = text\n\n    def __repr__(self):\n        return str(self)\n\n    def __str__(self):\n        tmp = [self.text]\n        if self.lang and self.lang != 'eng':\n            # lang = eng is trivial\n            tmp.append('(lang:%s)' % self.lang)\n        if self.gend:\n            tmp.append('(gend:%s)' % self.gend)\n        return ' '.join(tmp)\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        gd = {}\n        if self.lang:\n            gd['lang'] = self.lang\n        if self.gend:\n            gd['gend'] = self.gend\n        if self.text:\n            gd['text'] = self.text\n        return gd\n\n\nclass LSource:\n    '''This element records the information about the source\n    language(s) of a loan-word/gairaigo. If the source language is other\n    than English, the language is indicated by the xml:lang attribute.\n    The element value (if any) is the source word or phrase.\n    <!ATTLIST lsource xml:lang CDATA \"eng\">\n    The xml:lang attribute defines the language(s) from which\n    a loanword is drawn.  It will be coded using the three-letter language\n    code from the ISO 639-2 standard. When absent, the value \"eng\" (i.e.\n    English) is the default value. The bibliographic (B) codes are used.\n    <!ATTLIST lsource ls_type CDATA #IMPLIED>\n    The ls_type attribute indicates whether the lsource element\n    fully or partially describes the source word or phrase of the\n    loanword. If absent, it will have the implied value of \"full\".\n    Otherwise it will contain \"part\".\n    <!ATTLIST lsource ls_wasei CDATA #IMPLIED>\n    The ls_wasei attribute indicates that the Japanese word\n    has been constructed from words in the source language, and\n    not from an actual phrase in that language. Most commonly used to\n    indicate \"waseieigo\".'''\n\n    def __init__(self, lang, lstype, wasei, text):\n        self.lang = lang\n        self.lstype = lstype\n        self.wasei = wasei\n        self.text = text\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'lang': self.lang,\n                'lstype': self.lstype,\n                'wasei': self.wasei,\n                'text': self.text}\n\n\nJMENDICT_TYPES = ((\"surname\", \"family or surname\"),\n                  (\"place\", \"place name\"),\n                  (\"unclass\", \"unclassified name\"),\n                  (\"company\", \"company name\"),\n                  (\"product\", \"product name\"),\n                  (\"work\", \"work of art, literature, music, etc. name\"),\n                  (\"masc\", \"male given name or forename\"),\n                  (\"fem\", \"female given name or forename\"),\n                  (\"person\", \"full name of a particular person\"),\n                  (\"given\", \"given name or forename, gender not specified\"),\n                  (\"station\", \"railway station\"),\n                  (\"organization\", \"organization name\"),\n                  (\"ok\", \"old or irregular kana form\"))\nJMENDICT_TYPE_MAP = dict(JMENDICT_TYPES)\nJMENDICT_TYPE_MAP_DECODE = {v: k for k, v in JMENDICT_TYPES}\n\n\nclass Meta(object):\n\n    def __init__(self, key='', value=''):\n        self.key = key\n        self.value = value\n\n    def __repr__(self):\n        return \"{{{}: {}}}\".format(self.key, self.value)\n\n    def __str__(self):\n        return repr(self)\n\n\nclass JMDictXMLParser(object):\n    '''JMDict XML parser\n    '''\n\n    def __init__(self):\n        pass\n\n    def parse_file(self, jmdict_file_path):\n        ''' Parse JMDict_e.xml file and return a list of JMDEntry objects\n        '''\n        actual_path = os.path.abspath(os.path.expanduser(jmdict_file_path))\n        logger.debug('Loading data from file: {}'.format(actual_path))\n\n        with chio.open(actual_path, mode='rb') as jmfile:\n            tree = etree.iterparse(jmfile)\n            entries = []\n            for event, element in tree:\n                if event == 'end' and element.tag == 'entry':\n                    entries.append(self.parse_entry_tag(element))\n                    # and then we can clear the element to save memory\n                    element.clear()\n            return entries\n\n    def parse_entry_tag(self, etag):\n        '''Parse a lxml XML Node and generate a JMDEntry entry'''\n        entry = JMDEntry()\n        # parse ent_seq\n        for child in etag:\n            if child.tag == 'ent_seq':\n                self.parse_ent_seq(child, entry)\n            elif child.tag == 'k_ele':\n                self.parse_k_ele(child, entry)\n            elif child.tag == 'r_ele':\n                self.parse_r_ele(child, entry)\n            elif child.tag == 'info':\n                self.parse_info(child, entry)\n            elif child.tag == 'sense':\n                self.parse_sense(child, entry)\n            elif child.tag == 'trans':\n                # JMendict support\n                self.parse_ne_translation(child, entry)\n            else:\n                raise Exception(\"Invalid tag: %s\" % child.tag)\n        return entry\n\n    def parse_ent_seq(self, seq_tag, entry):\n        idseq = seq_tag.text\n        if entry.idseq:\n            raise Exception(\"WARNING: duplicated ent_seq tag\")\n        entry.idseq = idseq\n\n    def get_single(self, tag_name, a_tag):\n        children = a_tag.findall(tag_name)\n        if len(children) == 0:\n            return None\n        elif len(children) > 1:\n            raise Exception(\"There are %s %s tags in %s\" % (len(children), tag_name, a_tag.tag))\n        else:\n            return children[0]\n\n    def parse_k_ele(self, k_ele, entry):\n        kr = KanjiForm()\n        for child in k_ele:\n            if child.tag == 'keb':\n                kr.set_text(child.text)\n            elif child.tag == 'ke_inf':\n                kr.info.append(child.text)\n            elif child.tag == 'ke_pri':\n                kr.pri.append(child.text)\n            else:\n                raise Exception(\"WARNING: invalid tag %s in k_ele\" % child.tag)\n        # parse kebs\n        entry.kanji_forms.append(kr)\n        return kr\n\n    def parse_r_ele(self, r_ele, entry):\n        kr = KanaForm()\n        for child in r_ele:\n            if child.tag == 'reb':\n                kr.set_text(child.text)\n            elif child.tag == 're_nokanji':\n                kr.nokanji = True\n            elif child.tag == 're_restr':\n                kr.restr.append(child.text)\n            elif child.tag == 're_inf':\n                kr.info.append(child.text)\n            elif child.tag == 're_pri':\n                kr.pri.append(child.text)\n            else:\n                raise Exception(\"WARNING: invalid tag %s in r_ele\" % child.tag)\n        # parse kebs\n        entry.kana_forms.append(kr)\n        return kr\n\n    def parse_info(self, info_tag, entry):\n        einfo = EntryInfo()\n        for child in info_tag:\n            if child.tag == 'links':\n                self.parse_link(child, einfo)\n            elif child.tag == 'bibl':\n                self.parse_bibinfo(child, einfo)\n            elif child.tag == 'etym':\n                einfo.etym.append(child.text)\n            elif child.tag == 'audit':\n                self.parse_audit(child, einfo)\n            else:\n                raise Exception(\"WARNING: invalid tag in info tag (child.tag = %s)\" % child.tag)\n        entry.set_info(einfo)\n        return einfo\n\n    def parse_link(self, link_tag, entry_info):\n        tag = self.get_single('link_tag', link_tag).text\n        desc = self.get_single('link_desc', link_tag).text\n        uri = self.get_single('link_uri', link_tag).text\n        link = Link(tag, desc, uri)\n        entry_info.links.append(link)\n        return link\n\n    def parse_bibinfo(self, bib_tag, entry_info):\n        bib = BibInfo()\n        for child in bib_tag:\n            if child.tag == 'bib_tag':\n                bib.set_tag(child.text)\n            elif child.tag == 'bib_txt':\n                bib.set_text(child.text)\n            else:\n                raise Exception(\"WARNING: invalid tag in bibinfo (child.tag = %s)\" % child.tag)\n        entry_info.bibinfo.append(bib)\n        return bib\n\n    def parse_ne_translation(self, trans_tag, entry):\n        translation = Translation()\n        for child in trans_tag:\n            if child.tag == 'name_type':\n                _name_type = JMENDICT_TYPE_MAP_DECODE[child.text] if child.text in JMENDICT_TYPE_MAP_DECODE else child.text\n                translation.name_type.append(_name_type)\n            elif child.tag == 'trans_det':\n                # add sensegloss\n                lang = self.get_attrib(trans_tag, 'xml:lang', default_value='eng')\n                gloss = SenseGloss(lang=lang, gend='', text=child.text)\n                translation.gloss.append(gloss)\n            elif child.tag == 'xref':\n                translation.xref.append(child.text)\n            else:\n                raise Exception(\"Invalid tag: {} in JMendict/trans tag\".format(child.tag))\n        entry.senses.append(translation)\n        return translation\n\n    def parse_sense(self, sense_tag, entry):\n        sense = Sense()\n        for child in sense_tag:\n            if child.tag == 'stagk':\n                sense.stagk.append(child.text)\n            elif child.tag == 'stagr':\n                sense.stagr.append(child.text)\n            elif child.tag == 'pos':\n                sense.pos.append(child.text)\n            elif child.tag == 'xref':\n                sense.xref.append(child.text)\n            elif child.tag == 'ant':\n                sense.antonym.append(child.text)\n            elif child.tag == 'field':\n                sense.field.append(child.text)\n            elif child.tag == 'misc':\n                sense.misc.append(child.text)\n            elif child.tag == 's_inf':\n                sense.info.append(child.text)\n            elif child.tag == 'dial':\n                sense.dialect.append(child.text)\n            elif child.tag == 'example':\n                sense.examples.append(child.text)\n            elif child.tag == 'lsource':\n                self.parse_lsource(child, sense)\n            elif child.tag == 'gloss':\n                self.parse_sensegloss(child, sense)\n            else:\n                raise Exception(\"WARNING: invalid tag in sense tag (child.tag = %s) content = %s\" % (child.tag, etree.tostring(child)))\n        entry.senses.append(sense)\n        return sense\n\n    def get_attrib(self, a_tag, attr_name, default_value=''):\n        if attr_name == 'xml:lang':\n            attr_name = '''{http://www.w3.org/XML/1998/namespace}lang'''\n        if attr_name in a_tag.attrib:\n            return a_tag.attrib[attr_name]\n        else:\n            return default_value\n\n    def parse_sensegloss(self, gloss_tag, sense):\n        lang = self.get_attrib(gloss_tag, 'xml:lang')\n        gend = self.get_attrib(gloss_tag, 'g_gend')\n        text = gloss_tag.text  # TODO: pri tag? raw text?\n        gloss = SenseGloss(lang, gend, text)\n        sense.gloss.append(gloss)\n        return gloss\n\n    def parse_lsource(self, lsource_tag, sense):\n        lang = self.get_attrib(lsource_tag, 'xml:lang')\n        lstype = self.get_attrib(lsource_tag, 'ls_type')\n        wasei = self.get_attrib(lsource_tag, 'ls_wasei')\n        lsource = LSource(lang, lstype, wasei, lsource_tag.text)\n        sense.lsource.append(lsource)\n        return lsource\n"
  },
  {
    "path": "jamdict/jmdict_sqlite.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nJMDict in SQLite format\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport os\nimport logging\n\nfrom puchikarui import Schema\nfrom . import __version__ as JAMDICT_VERSION, __url__ as JAMDICT_URL\nfrom .jmdict import Meta, JMDEntry, EntryInfo, Link, BibInfo, Audit, KanjiForm, KanaForm, Sense, SenseGloss, LSource\n\n# -------------------------------------------------------------------------------\n# Configuration\n# -------------------------------------------------------------------------------\n\nMY_FOLDER = os.path.dirname(os.path.abspath(__file__))\nSCRIPT_FOLDER = os.path.join(MY_FOLDER, 'data')\nJMDICT_SETUP_FILE = os.path.join(SCRIPT_FOLDER, 'setup_jmdict.sql')\nJMDICT_VERSION = '1.08'\nJMDICT_URL = 'http://www.csse.monash.edu.au/~jwb/edict.html'\nSETUP_SCRIPT = '''INSERT INTO meta VALUES ('jmdict.version', '{jv}');\nINSERT INTO meta VALUES ('jmdict.url', '{ju}');\nINSERT INTO meta VALUES ('generator', 'jamdict');\nINSERT INTO meta VALUES ('generator_version', '{gv}');\nINSERT INTO meta VALUES ('generator_url', '{gu}');'''.format(\n    jv=JMDICT_VERSION,\n    ju=JMDICT_URL,\n    gv=JAMDICT_VERSION,\n    gu=JAMDICT_URL\n)\n\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\n# -------------------------------------------------------------------------------\n# Models\n# -------------------------------------------------------------------------------\n\nclass JMDictSchema(Schema):\n\n    KEY_JMD_VER = \"jmdict.version\"\n    KEY_JMD_URL = \"jmdict.url\"\n\n    def __init__(self, db_path, *args, **kwargs):\n        super().__init__(db_path, *args, **kwargs)\n        self.add_script(SETUP_SCRIPT)\n        self.add_file(JMDICT_SETUP_FILE)\n        # Meta\n        self.add_table('meta', ['key', 'value'], proto=Meta).set_id('key')\n        self.add_table('Entry', ['idseq'])\n        self.add_table('Link', ['ID', 'idseq', 'tag', 'desc', 'uri'])\n        self.add_table('Bib', ['ID', 'idseq', 'tag', 'text'])\n        self.add_table('Etym', ['idseq', 'text'])\n        self.add_table('Audit', ['idseq', 'upd_date', 'upd_detl'])\n        # Kanji\n        self.add_table('Kanji', ['ID', 'idseq', 'text'])\n        self.add_table('KJI', ['kid', 'text'])\n        self.add_table('KJP', ['kid', 'text'])\n        # Kana\n        self.add_table('Kana', ['ID', 'idseq', 'text', 'nokanji'])\n        self.add_table('KNI', ['kid', 'text'])\n        self.add_table('KNP', ['kid', 'text'])\n        self.add_table('KNR', ['kid', 'text'])\n        # Senses\n        self.add_table('Sense', ['ID', 'idseq'])\n        self.add_table('stagk', ['sid', 'text'])\n        self.add_table('stagr', ['sid', 'text'])\n        self.add_table('pos', ['sid', 'text'])\n        self.add_table('xref', ['sid', 'text'])\n        self.add_table('antonym', ['sid', 'text'])\n        self.add_table('field', ['sid', 'text'])\n        self.add_table('misc', ['sid', 'text'])\n        self.add_table('SenseInfo', ['sid', 'text'])\n        self.add_table('SenseSource', ['sid', 'text', 'lang', 'lstype', 'wasei'])\n        self.add_table('dialect', ['sid', 'text'])\n        self.add_table('SenseGloss', ['sid', 'lang', 'gend', 'text'])\n\n\nclass JMDictSQLite(JMDictSchema):\n\n    def __init__(self, db_path, *args, **kwargs):\n        super().__init__(db_path, *args, **kwargs)\n\n    def update_jmd_meta(self, version, url, ctx=None):\n        # create a default context if none was provided\n        if ctx is None:\n            with self.open(ctx) as ctx:\n                return self.update_jmd_meta(version, url, ctx=ctx)\n        # else (a context is provided)\n        # version\n        jv = ctx.meta.by_id(self.KEY_JMD_VER)\n        if not jv:\n            ctx.meta.insert(self.KEY_JMD_VER, version)\n        else:\n            jv.value = version\n            ctx.meta.save(jv)\n        # url\n        ju = ctx.meta.by_id(self.KEY_JMD_URL)\n        if not ju:\n            ctx.meta.insert(self.KEY_JMD_URL, version)\n        else:\n            ju.value = url\n            ctx.meta.save(ju)\n\n    def all_pos(self, ctx=None):\n        if ctx is None:\n            return self.all_pos(ctx=self.ctx())\n        else:\n            return [x['text'] for x in ctx.execute(\"SELECT DISTINCT text FROM pos\")]\n\n    def _build_search_query(self, query, pos=None):\n        where = []\n        params = []\n        if query.startswith('id#'):\n            query_int = int(query[3:])\n            if query_int >= 0:\n                getLogger().debug(\"Searching by ID: {}\".format(query_int))\n                where.append(\"idseq = ?\")\n                params.append(query_int)\n        elif query and query != \"%\":\n            _is_wildcard_search = '_' in query or '@' in query or '%' in query\n            if _is_wildcard_search:\n                where.append(\"(idseq IN (SELECT idseq FROM Kanji WHERE text like ?) OR idseq IN (SELECT idseq FROM Kana WHERE text like ?) OR idseq IN (SELECT idseq FROM sense JOIN sensegloss ON sense.ID == sensegloss.sid WHERE text like ?))\")\n            else:\n                where.append(\"(idseq IN (SELECT idseq FROM Kanji WHERE text == ?) OR idseq IN (SELECT idseq FROM Kana WHERE text == ?) OR idseq IN (SELECT idseq FROM sense JOIN sensegloss ON sense.ID == sensegloss.sid WHERE text == ?))\")\n            params += (query, query, query)\n        if pos:\n            if isinstance(pos, str):\n                getLogger().warning(\"POS filter should be a collection, not a string\")\n                pos = [pos]\n            # allow to search by POS\n            slots = len(pos)\n            if where:\n                where.append(\"AND\")\n            where.append(f\"idseq IN (SELECT idseq FROM Sense WHERE ID IN (SELECT sid FROM pos WHERE text IN ({','.join('?' * slots)})))\")\n            params += pos\n        # else (a context is provided)\n        logging.getLogger(__name__).debug(f\"Search query: {where} -- Params: {params}\")\n        return where, params\n\n    def search(self, query, ctx=None, pos=None, **kwargs):\n        # ensure context\n        if ctx is None:\n            with self.ctx() as ctx:\n                return self.search(query, ctx=ctx, pos=pos)\n        where, params = self._build_search_query(query, pos=pos)\n        where.insert(0, 'SELECT idseq FROM Entry WHERE ')\n        entries = []\n        for (idseq,) in ctx.conn.cursor().execute(' '.join(where), params):\n            entries.append(self.get_entry(idseq, ctx=ctx))\n        return entries\n\n    def search_iter(self, query, ctx=None, pos=None, **kwargs):\n        # ensure context\n        if ctx is None:\n            with self.ctx() as ctx:\n                return self.search(query, ctx=ctx, pos=pos, iter_mode=iter_mode)\n        where, params = self._build_search_query(query, pos=pos)\n        where.insert(0, 'SELECT idseq FROM Entry WHERE ')\n        for (idseq,) in ctx.conn.cursor().execute(' '.join(where), params):\n            yield self.get_entry(idseq, ctx=ctx)\n\n    def get_entry(self, idseq, ctx=None):\n        # ensure context\n        if ctx is None:\n            with self.ctx() as new_context:\n                return self.get_entry(idseq, new_context)\n        # else (a context is provided)\n        # select entry & info\n        entry = JMDEntry(idseq)\n        # links, bibs, etym, audit ...\n        dblinks = ctx.Link.select('idseq=?', (idseq,))\n        dbbibs = ctx.Bib.select('idseq=?', (idseq,))\n        dbetym = ctx.Etym.select('idseq=?', (idseq,))\n        dbaudit = ctx.Audit.select('idseq=?', (idseq,))\n        if dblinks or dbbibs or dbetym or dbaudit:\n            entry.info = EntryInfo()\n            if dblinks:\n                for l in dblinks:\n                    entry.info.links.append(Link(l.tag, l.desc, l.uri))\n            if dbbibs:\n                for b in dbbibs:\n                    entry.info.bibinfo.append(BibInfo(b.tag, b.text))\n            if dbetym:\n                for e in dbetym:\n                    entry.info.etym.append(e)\n            if dbaudit:\n                for a in dbaudit:\n                    entry.info.audit.append(Audit(a.upd_date, a.upd_detl))\n        # select kanji\n        kanjis = ctx.Kanji.select('idseq=?', (idseq,))\n        for dbkj in kanjis:\n            kj = KanjiForm(dbkj.text)\n            kjis = ctx.KJI.select('kid=?', (dbkj.ID,))\n            for i in kjis:\n                kj.info.append(i.text)\n            kjps = ctx.KJP.select('kid=?', (dbkj.ID,))\n            for p in kjps:\n                kj.pri.append(p.text)\n            entry.kanji_forms.append(kj)\n        # select kana\n        kanas = ctx.Kana.select('idseq=?', (idseq,))\n        for dbkn in kanas:\n            kn = KanaForm(dbkn.text, dbkn.nokanji)\n            knis = ctx.KNI.select('kid=?', (dbkn.ID,))\n            for i in knis:\n                kn.info.append(i.text)\n            knps = ctx.KNP.select('kid=?', (dbkn.ID,))\n            for p in knps:\n                kn.pri.append(p.text)\n            knrs = ctx.KNR.select('kid=?', (dbkn.ID,))\n            for r in knrs:\n                kn.restr.append(r.text)\n            entry.kana_forms.append(kn)\n        # select senses\n        senses = ctx.Sense.select('idseq=?', (idseq,))\n        for dbs in senses:\n            s = Sense()\n            # stagk\n            ks = ctx.stagk.select('sid=?', (dbs.ID,))\n            for k in ks:\n                s.stagk.append(k.text)\n            # stagr\n            rs = ctx.stagr.select('sid=?', (dbs.ID,))\n            for r in rs:\n                s.stagr.append(r.text)\n            # pos\n            ps = ctx.pos.select('sid=?', (dbs.ID,))\n            for p in ps:\n                s.pos.append(p.text)\n            # xref\n            xs = ctx.xref.select('sid=?', (dbs.ID,))\n            for x in xs:\n                s.xref.append(x.text)\n            # antonym\n            ans = ctx.antonym.select('sid=?', (dbs.ID,))\n            for a in ans:\n                s.antonym.append(a.text)\n            # field\n            fs = ctx.field.select('sid=?', (dbs.ID,))\n            for f in fs:\n                s.field.append(f.text)\n            # misc\n            ms = ctx.misc.select('sid=?', (dbs.ID,))\n            for m in ms:\n                s.misc.append(m.text)\n            # SenseInfo\n            sis = ctx.SenseInfo.select('sid=?', (dbs.ID,))\n            for si in sis:\n                s.info.append(si.text)\n            # SenseSource\n            lss = ctx.SenseSource.select('sid=?', (dbs.ID,))\n            for ls in lss:\n                s.lsource.append(LSource(ls.lang, ls.lstype, ls.wasei, ls.text))\n            # dialect\n            ds = ctx.dialect.select('sid=?', (dbs.ID,))\n            for d in ds:\n                s.dialect.append(d.text)\n            # SenseGloss\n            gs = ctx.SenseGloss.select('sid=?', (dbs.ID,))\n            for g in gs:\n                s.gloss.append(SenseGloss(g.lang, g.gend, g.text))\n            entry.senses.append(s)\n        return entry\n\n    def insert_entries(self, entries, ctx=None):\n        # ensure context\n        if ctx is None:\n            with self.ctx() as new_context:\n                return self.insert_entries(entries, ctx=new_context)\n        # else\n        getLogger().debug(\"JMdict bulk insert {} entries\".format(len(entries)))\n        for entry in entries:\n            self.insert_entry(entry, ctx)\n\n    def insert_entry(self, entry, ctx=None):\n        # ensure context\n        if ctx is None:\n            with self.ctx() as ctx:\n                return self.insert_entry(entry, ctx=ctx)\n        # else (a context is provided)\n        self.Entry.insert(entry.idseq, ctx=ctx)\n        # insert info\n        if entry.info:\n            # links\n            for lnk in entry.info.links:\n                ctx.Link.insert(entry.idseq, lnk.tag, lnk.desc, lnk.uri)\n            # bibs\n            for bib in entry.info.bibinfo:\n                ctx.Bib.insert(entry.idseq, bib.tag, bib.text)\n            # etym\n            for e in entry.info.etym:\n                ctx.Etym.insert(entry.idseq, e)\n            # audit\n            for a in entry.info.audit:\n                ctx.Audit.insert(entry.idseq, a.upd_date, a.upd_detl)\n        # insert kanji\n        for kj in entry.kanji_forms:\n            kjid = ctx.Kanji.insert(entry.idseq, kj.text)\n            # KJI\n            for kji in kj.info:\n                ctx.KJI.insert(kjid, kji)\n            # KJP\n            for kjp in kj.pri:\n                ctx.KJP.insert(kjid, kjp)\n        # insert kana\n        for kn in entry.kana_forms:\n            knid = ctx.Kana.insert(entry.idseq, kn.text, kn.nokanji)\n            # KNI\n            for kni in kn.info:\n                ctx.KNI.insert(knid, kni)\n            # KNP\n            for knp in kn.pri:\n                ctx.KNP.insert(knid, knp)\n            # KNR\n            for knr in kn.restr:\n                ctx.KNR.insert(knid, knr)\n        # insert senses\n        for s in entry.senses:\n            sid = ctx.Sense.insert(entry.idseq)\n            # stagk\n            for sk in s.stagk:\n                ctx.stagk.insert(sid, sk)\n            # stagr\n            for sr in s.stagr:\n                ctx.stagr.insert(sid, sr)\n            # pos\n            for pos in s.pos:\n                ctx.pos.insert(sid, pos)\n            # xref\n            for xr in s.xref:\n                ctx.xref.insert(sid, xr)\n            # antonym\n            for a in s.antonym:\n                ctx.antonym.insert(sid, a)\n            # field\n            for f in s.field:\n                ctx.field.insert(sid, f)\n            # misc\n            for m in s.misc:\n                ctx.misc.insert(sid, m)\n            # SenseInfo\n            for i in s.info:\n                ctx.SenseInfo.insert(sid, i)\n            # SenseSource\n            for l in s.lsource:\n                ctx.SenseSource.insert(sid, l.text, l.lang, l.lstype, l.wasei)\n            # dialect\n            for d in s.dialect:\n                ctx.dialect.insert(sid, d)\n            # SenseGloss\n            for g in s.gloss:\n                ctx.SenseGloss.insert(sid, g.lang, g.gend, g.text)\n"
  },
  {
    "path": "jamdict/jmnedict_sqlite.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nJapanese Multilingual Named Entity Dictionary (JMnedict) in SQLite format\n\nReferences:\n    ENAMDICT/JMnedict - Japanese Proper Names Dictionary Files\n        https://www.edrdg.org/enamdict/enamdict_doc.html\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2020 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport os\nimport logging\nfrom typing import Sequence\n\nfrom puchikarui import Schema\nfrom . import __version__ as JAMDICT_VERSION, __url__ as JAMDICT_URL\nfrom .jmdict import Meta, JMDEntry, KanjiForm, KanaForm, Translation, SenseGloss\n\n# -------------------------------------------------------------------------------\n# Configuration\n# -------------------------------------------------------------------------------\n\nMY_FOLDER = os.path.dirname(os.path.abspath(__file__))\nSCRIPT_FOLDER = os.path.join(MY_FOLDER, 'data')\nJMNEDICT_SETUP_FILE = os.path.join(SCRIPT_FOLDER, 'setup_jmnedict.sql')\nJMNEDICT_VERSION = '1.08'\nJMNEDICT_URL = 'https://www.edrdg.org/enamdict/enamdict_doc.html'\nJMNEDICT_DATE = '2020-05-29'\nJMNEDICT_SETUP_SCRIPT = '''INSERT INTO meta VALUES ('jmnedict.version', '{jv}');\nINSERT INTO meta VALUES ('jmnedict.url', '{ju}');\nINSERT INTO meta VALUES ('jmnedict.date', '{jud}');\nINSERT INTO meta SELECT 'generator', 'jamdict' WHERE NOT EXISTS (SELECT 1 FROM meta WHERE key = 'generator');\nINSERT INTO meta SELECT 'generator_version', '{gv}' WHERE NOT EXISTS (SELECT 1 FROM meta WHERE key = 'generator_version');\nINSERT INTO meta SELECT 'generator_url', '{gu}' WHERE NOT EXISTS (SELECT 1 FROM meta WHERE key = 'generator_url');'''.format(\n    jv=JMNEDICT_VERSION,\n    ju=JMNEDICT_URL,\n    jud=JMNEDICT_DATE,\n    gv=JAMDICT_VERSION,\n    gu=JAMDICT_URL\n)\n\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\n# -------------------------------------------------------------------------------\n# Models\n# -------------------------------------------------------------------------------\n\nclass JMNEDictSchema(Schema):\n\n    def __init__(self, db_path, *args, **kwargs):\n        super().__init__(db_path, *args, **kwargs)\n        self.add_script(JMNEDICT_SETUP_SCRIPT)\n        self.add_file(JMNEDICT_SETUP_FILE)\n        # Meta\n        self.add_table('meta', ['key', 'value'], proto=Meta).set_id('key')\n        self.add_table('NEEntry', ['idseq'])\n        # Kanji\n        self.add_table('NEKanji', ['ID', 'idseq', 'text'])\n        # Kana\n        self.add_table('NEKana', ['ID', 'idseq', 'text', 'nokanji'])\n        # Translation (~Sense of JMdict)\n        self.add_table('NETranslation', ['ID', 'idseq'])\n        self.add_table('NETransType', ['tid', 'text'])\n        self.add_table('NETransXRef', ['tid', 'text'])\n        self.add_table('NETransGloss', ['tid', 'lang', 'gend', 'text'])\n\n\nclass JMNEDictSQLite(JMNEDictSchema):\n\n    def __init__(self, db_path, *args, **kwargs):\n        super().__init__(db_path, *args, **kwargs)\n\n    def all_ne_type(self, ctx=None):\n        if ctx is None:\n            return self.all_ne_type(ctx=self.ctx())\n        else:\n            return [x['text'] for x in ctx.execute(\"SELECT DISTINCT text FROM NETransType\")]\n\n    def _build_ne_search_query(self, query):\n        _is_wildcard_search = '_' in query or '@' in query or '%' in query\n        if _is_wildcard_search:\n            where = \"idseq IN (SELECT idseq FROM NEKanji WHERE text like ?) OR idseq IN (SELECT idseq FROM NEKana WHERE text like ?) OR idseq IN (SELECT idseq FROM NETranslation JOIN NETransGloss ON NETranslation.ID == NETransGloss.tid WHERE NETransGloss.text like ?) OR idseq IN (SELECT idseq FROM NETranslation JOIN NETransType ON NETranslation.ID == NETransType.tid WHERE NETransType.text like ?)\"\n        else:\n            where = \"idseq IN (SELECT idseq FROM NEKanji WHERE text == ?) OR idseq IN (SELECT idseq FROM NEKana WHERE text == ?) OR idseq IN (SELECT idseq FROM NETranslation JOIN NETransGloss ON NETranslation.ID == NETransGloss.tid WHERE NETransGloss.text == ?) or idseq in (SELECT idseq FROM NETranslation JOIN NETransType ON NETranslation.ID == NETransType.tid WHERE NETransType.text == ?)\"\n        params = [query, query, query, query]\n        try:\n            if query.startswith('id#'):\n                query_int = int(query[3:])\n                if query_int >= 0:\n                    where = \"idseq = ?\"\n                    params = [query_int]\n        except Exception:\n            pass\n        getLogger().debug(f\"where={where} | params={params}\")\n        return where, params\n\n    def search_ne(self, query, ctx=None, **kwargs) -> Sequence[JMDEntry]:\n        if ctx is None:\n            with self.ctx() as ctx:\n                return self.search_ne(query, ctx=ctx)\n        where, params = self._build_ne_search_query(query)\n        where = 'SELECT idseq FROM NEEntry WHERE ' + where\n        entries = []\n        for (idseq,) in ctx.conn.cursor().execute(where, params):\n            entries.append(self.get_ne(idseq, ctx=ctx))\n        return entries\n\n    def search_ne_iter(self, query, ctx=None, **kwargs):\n        if ctx is None:\n            with self.ctx() as ctx:\n                return self.search_ne(query, ctx=ctx)\n        where, params = self._build_ne_search_query(query)\n        where = 'SELECT idseq FROM NEEntry WHERE ' + where\n        for (idseq,) in ctx.conn.cursor().execute(where, params):\n            yield self.get_ne(idseq, ctx=ctx)\n\n    def get_ne(self, idseq, ctx=None) -> JMDEntry:\n        # ensure context\n        if ctx is None:\n            with self.ctx() as new_context:\n                return self.get_entry(idseq, new_context)\n        # else (a context is provided)\n        # select entry & info\n        entry = JMDEntry(idseq)\n        # select kanji\n        kanjis = ctx.NEKanji.select('idseq=?', (idseq,))\n        for dbkj in kanjis:\n            kj = KanjiForm(dbkj.text)\n            entry.kanji_forms.append(kj)\n        # select kana\n        kanas = ctx.NEKana.select('idseq=?', (idseq,))\n        for dbkn in kanas:\n            kn = KanaForm(dbkn.text, dbkn.nokanji)\n            entry.kana_forms.append(kn)\n        # select senses\n        senses = ctx.NETranslation.select('idseq=?', (idseq,))\n        for dbs in senses:\n            s = Translation()\n            # name_type\n            nts = ctx.NETransType.select('tid=?', (dbs.ID,))\n            for nt in nts:\n                s.name_type.append(nt.text)\n            # xref\n            xs = ctx.NETransXRef.select('tid=?', (dbs.ID,))\n            for x in xs:\n                s.xref.append(x.text)\n            # SenseGloss\n            gs = ctx.NETransGloss.select('tid=?', (dbs.ID,))\n            for g in gs:\n                s.gloss.append(SenseGloss(g.lang, g.gend, g.text))\n            entry.senses.append(s)\n        return entry\n\n    def insert_name_entities(self, entries, ctx=None):\n        # ensure context\n        if ctx is None:\n            with self.ctx() as new_context:\n                return self.insert_name_entities(entries, ctx=new_context)\n        # else\n        for entry in entries:\n            self.insert_name_entity(entry, ctx)\n\n    def insert_name_entity(self, entry, ctx=None):\n        # ensure context\n        if ctx is None:\n            with self.ctx() as ctx:\n                return self.insert_name_entity(entry, ctx=ctx)\n        # else (a context is provided)\n        self.NEEntry.insert(entry.idseq, ctx=ctx)\n        # insert kanji\n        for kj in entry.kanji_forms:\n            ctx.NEKanji.insert(entry.idseq, kj.text)\n        # insert kana\n        for kn in entry.kana_forms:\n            ctx.NEKana.insert(entry.idseq, kn.text, kn.nokanji)\n        # insert translations\n        for s in entry.senses:\n            tid = ctx.NETranslation.insert(entry.idseq)\n            # insert name_type\n            for nt in s.name_type:\n                ctx.NETransType.insert(tid, nt)\n            # xref\n            for xr in s.xref:\n                ctx.NETransXRef.insert(tid, xr)\n            # Gloss\n            for g in s.gloss:\n                ctx.NETransGloss.insert(tid, g.lang, g.gend, g.text)\n"
  },
  {
    "path": "jamdict/kanjidic2.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nKanjidic2 models\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport os\nimport logging\nimport warnings\nfrom typing import List\n\ntry:\n    from lxml import etree\n    _LXML_AVAILABLE = True\nexcept Exception as e:\n    # logging.getLogger(__name__).debug(\"lxml is not available, fall back to xml.etree.ElementTree\")\n    from xml.etree import ElementTree as etree\n    _LXML_AVAILABLE = False\n\nfrom chirptext import chio\nfrom chirptext.sino import Radical as KangxiRadical\n\nfrom .krad import KRad\n\n# ------------------------------------------------------------------------------\n# Configuration\n# ------------------------------------------------------------------------------\n\nkrad = KRad()\n\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\n# ------------------------------------------------------------------------------\n# Models\n# ------------------------------------------------------------------------------\n\nclass KanjiDic2(object):\n\n    def __init__(self, file_version, database_version, date_of_creation):\n        \"\"\"\n<!ELEMENT header (file_version,database_version,date_of_creation)>\n<!--\n    The single header element will contain identification information\n    about the version of the file\n    -->\n<!ELEMENT file_version (#PCDATA)>\n<!--\n    This field denotes the version of kanjidic2 structure, as more\n    than one version may exist.\n    -->\n<!ELEMENT database_version (#PCDATA)>\n<!--\n    The version of the file, in the format YYYY-NN, where NN will be\n    a number starting with 01 for the first version released in a\n    calendar year, then increasing for each version in that year.\n    -->\n<!ELEMENT date_of_creation (#PCDATA)>\n<!--\n    The date the file was created in international format (YYYY-MM-DD).\n-->\"\"\"\n        self.file_version = file_version\n        self.database_version = database_version\n        self.date_of_creation = date_of_creation\n        self.characters = []\n\n    def __len__(self):\n        return len(self.characters)\n\n    def __getitem__(self, idx):\n        return self.characters[idx]\n\n\nclass Character(object):\n    \"\"\" Represent a kanji character.\n\n    <!ELEMENT character (literal,codepoint, radical, misc, dic_number?, query_code?, reading_meaning?)*>\"\"\"\n\n    def __init__(self):\n        \"\"\"\n\n        \"\"\"\n        self.ID = None\n        self.literal = ''  # <!ELEMENT literal (#PCDATA)> The character itself in UTF8 coding.\n        self.codepoints: List[CodePoint] = []  # <!ELEMENT codepoint (cp_value+)>\n        self.radicals: List[Radical] = []  # <!ELEMENT radical (rad_value+)>\n        self.__canon_radical = None\n        self.stroke_count = None  # first stroke_count in misc\n        self.grade = None  # <misc>/<grade>\n        self.stroke_miscounts = []  # <misc>/stroke_count[1:]\n        self.variants: List[Variant] = []  # <misc>/<variant>\n        self.freq = None  # <misc>/<freq>\n        self.rad_names = []  # <misc>/<rad_name> a list of strings\n        self.jlpt = None  # <misc>/<jlpt>\n        self.dic_refs: List[DicRef] = []  # DicRef[]\n        self.query_codes: List[QueryCode] = []  # QueryCode[]\n        self.rm_groups: List[RMGroup] = []  # reading_meaning groups\n        self.nanoris = []  # a list of strings\n\n    @property\n    def text(self):\n        return self.literal\n\n    def __repr__(self):\n        meanings = self.meanings(english_only=True)\n        return \"{l}:{sc}:{meanings}\".format(l=self.literal, sc=self.stroke_count, meanings=','.join(meanings))\n\n    def __str__(self):\n        return self.literal\n\n    def meanings(self, english_only=False):\n        ''' Accumulate all meanings as a list of string. Each string is a meaning (i.e. sense) '''\n        meanings = []\n        for rm in self.rm_groups:\n            for m in rm.meanings:\n                if english_only and m.m_lang != '':\n                    continue\n                meanings.append(m.value)\n        return meanings\n\n    @property\n    def components(self):\n        ''' Kanji writing components that compose this character '''\n        if self.literal in krad.krad:\n            return krad.krad[self.literal]\n        else:\n            return []\n\n    @property\n    def radical(self):\n        if self.__canon_radical is None:\n            for rad in self.radicals:\n                if rad.rad_type == 'classical':\n                    self.__canon_radical = KangxiRadical.kangxi()[rad.value]\n        return self.__canon_radical\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'literal': self.literal,\n                'codepoints': [cp.to_dict() for cp in self.codepoints],\n                'radicals': [r.to_dict() for r in self.radicals],\n                'stroke_count': self.stroke_count,\n                'grade': self.grade if self.grade else '',\n                'stroke_miscounts': self.stroke_miscounts,\n                'variants': [v.to_dict() for v in self.variants],\n                'freq': self.freq if self.freq else 0,\n                'rad_names': self.rad_names,\n                'jlpt': self.jlpt if self.jlpt else '',\n                'dic_refs': [r.to_dict() for r in self.dic_refs],\n                'q_codes': [q.to_dict() for q in self.query_codes],\n                'rm': [rm.to_dict() for rm in self.rm_groups],\n                'nanoris': list(self.nanoris)}\n\n\nclass CodePoint(object):\n\n    def __init__(self, cp_type='', value=''):\n        \"\"\"<!ELEMENT cp_value (#PCDATA)>\n    <!--\n    The cp_value contains the codepoint of the character in a particular\n    standard. The standard will be identified in the cp_type attribute.\n    -->\n        \"\"\"\n        self.cid = None\n        self.cp_type = cp_type\n        self.value = value\n\n    def __repr__(self):\n        if self.r_type:\n            return \"({t}) {v}\".format(t=self.cp_type, v=self.value)\n        else:\n            return self.value\n\n    def __str__(self):\n        return self.value\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'type': self.cp_type, 'value': self.value}\n\n\nclass Radical(object):\n\n    def __init__(self, rad_type='', value=''):\n        \"\"\"<!ELEMENT radical (rad_value+)>\n        <!ELEMENT rad_value (#PCDATA)>\n        <!--\n        The radical number, in the range 1 to 214. The particular\n        classification type is stated in the rad_type attribute.\n        -->\"\"\"\n        self.cid = None\n        self.rad_type = rad_type\n        self.value = value\n\n    def __repr__(self):\n        if self.rad_type:\n            return \"({t}) {v}\".format(t=self.rad_type, v=self.value)\n        else:\n            return self.value\n\n    def __str__(self):\n        return self.value\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'type': self.rad_type, 'value': self.value}\n\n\nclass Variant(object):\n\n    def __init__(self, var_type='', value=''):\n        \"\"\"<!ELEMENT variant (#PCDATA)>\n        <!--\n        Either a cross-reference code to another kanji, usually regarded as a\n        variant, or an alternative indexing code for the current kanji.\n        The type of variant is given in the var_type attribute.\n        -->\n        <!ATTLIST variant var_type CDATA #REQUIRED>\n        <!--\n        The var_type attribute indicates the type of variant code. The current\n        values are:\n        jis208 - in JIS X 0208 - kuten coding\n        jis212 - in JIS X 0212 - kuten coding\n        jis213 - in JIS X 0213 - kuten coding\n          (most of the above relate to \"shinjitai/kyuujitai\"\n          alternative character glyphs)\n        deroo - De Roo number - numeric\n        njecd - Halpern NJECD index number - numeric\n        s_h - The Kanji Dictionary (Spahn & Hadamitzky) - descriptor\n        nelson_c - \"Classic\" Nelson - numeric\n        oneill - Japanese Names (O'Neill) - numeric\n        ucs - Unicode codepoint- hex\n        --> \"\"\"\n        self.cid = None\n        self.var_type = var_type\n        self.value = value\n\n    def __repr__(self):\n        if self.var_type:\n            return \"({t}) {v}\".format(t=self.var_type, v=self.value)\n        else:\n            return self.value\n\n    def __str__(self):\n        return self.value\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'type': self.var_type, 'value': self.value}\n\n\nclass DicRef(object):\n\n    def __init__(self, dr_type='', value='', m_vol='', m_page=''):\n        \"\"\"<!ELEMENT dic_ref (#PCDATA)>\n    <!--\n    Each dic_ref contains an index number. The particular dictionary,\n    etc. is defined by the dr_type attribute.\n    -->\n<!ATTLIST dic_ref dr_type CDATA #REQUIRED>\n    <!--\n    The dr_type defines the dictionary or reference book, etc. to which\n    dic_ref element applies. The initial allocation is:\n      nelson_c - \"Modern Reader's Japanese-English Character Dictionary\",\n        edited by Andrew Nelson (now published as the \"Classic\"\n        Nelson).\n      nelson_n - \"The New Nelson Japanese-English Character Dictionary\",\n        edited by John Haig.\n      halpern_njecd - \"New Japanese-English Character Dictionary\",\n        edited by Jack Halpern.\n      halpern_kkld - \"Kanji Learners Dictionary\" (Kodansha) edited by\n        Jack Halpern.\n      heisig - \"Remembering The  Kanji\"  by  James Heisig.\n      gakken - \"A  New Dictionary of Kanji Usage\" (Gakken)\n      oneill_names - \"Japanese Names\", by P.G. O'Neill.\n      oneill_kk - \"Essential Kanji\" by P.G. O'Neill.\n      moro - \"Daikanwajiten\" compiled by Morohashi. For some kanji two\n        additional attributes are used: m_vol:  the volume of the\n        dictionary in which the kanji is found, and m_page: the page\n        number in the volume.\n      henshall - \"A Guide To Remembering Japanese Characters\" by\n        Kenneth G.  Henshall.\n      sh_kk - \"Kanji and Kana\" by Spahn and Hadamitzky.\n      sakade - \"A Guide To Reading and Writing Japanese\" edited by\n        Florence Sakade.\n      jf_cards - Japanese Kanji Flashcards, by Max Hodges and\n        Tomoko Okazaki. (Series 1)\n      henshall3 - \"A Guide To Reading and Writing Japanese\" 3rd\n        edition, edited by Henshall, Seeley and De Groot.\n      tutt_cards - Tuttle Kanji Cards, compiled by Alexander Kask.\n      crowley - \"The Kanji Way to Japanese Language Power\" by\n        Dale Crowley.\n      kanji_in_context - \"Kanji in Context\" by Nishiguchi and Kono.\n      busy_people - \"Japanese For Busy People\" vols I-III, published\n        by the AJLT. The codes are the volume.chapter.\n      kodansha_compact - the \"Kodansha Compact Kanji Guide\".\n      maniette - codes from Yves Maniette's \"Les Kanjis dans la tete\" French adaptation of Heisig.\n    -->\"\"\"\n        self.cid = None\n        self.dr_type = dr_type\n        self.value = value\n        self.m_vol = m_vol\n        self.m_page = m_page\n\n    def __repr__(self):\n        if self.dr_type:\n            return \"({t}) {v}\".format(t=self.dr_type, v=self.value)\n        else:\n            return self.value\n\n    def __str__(self):\n        return self.value\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'type': self.dr_type,\n                'value': self.value,\n                \"m_vol\": self.m_vol,\n                \"m_page\": self.m_page}\n\n\nclass QueryCode(object):\n\n    def __init__(self, qc_type='', value='', skip_misclass=\"\"):\n        \"\"\"<!ELEMENT query_code (q_code+)>\n    <!--\n    These codes contain information relating to the glyph, and can be used\n    for finding a required kanji. The type of code is defined by the\n    qc_type attribute.\n    -->\n<!ELEMENT q_code (#PCDATA)>\n    <!--\n    The q_code contains the actual query-code value, according to the\n    qc_type attribute.\n    -->\n<!ATTLIST q_code qc_type CDATA #REQUIRED>\n    <!--\n    The qc_type attribute defines the type of query code. The current values\n    are:\n      skip -  Halpern's SKIP (System  of  Kanji  Indexing  by  Patterns)\n        code. The  format is n-nn-nn.  See the KANJIDIC  documentation\n        for  a description of the code and restrictions on  the\n        commercial  use  of this data. [P]  There are also\n        a number of misclassification codes, indicated by the\n        \"skip_misclass\" attribute.\n      sh_desc - the descriptor codes for The Kanji Dictionary (Tuttle\n        1996) by Spahn and Hadamitzky. They are in the form nxnn.n,\n        e.g.  3k11.2, where the  kanji has 3 strokes in the\n        identifying radical, it is radical \"k\" in the SH\n        classification system, there are 11 other strokes, and it is\n        the 2nd kanji in the 3k11 sequence. (I am very grateful to\n        Mark Spahn for providing the list of these descriptor codes\n        for the kanji in this file.) [I]\n      four_corner - the \"Four Corner\" code for the kanji. This is a code\n        invented by Wang Chen in 1928. See the KANJIDIC documentation\n        for  an overview of  the Four Corner System. [Q]\n\n      deroo - the codes developed by the late Father Joseph De Roo, and\n        published in  his book \"2001 Kanji\" (Bonjinsha). Fr De Roo\n        gave his permission for these codes to be included. [DR]\n      misclass - a possible misclassification of the kanji according\n        to one of the code types. (See the \"Z\" codes in the KANJIDIC\n        documentation for more details.)\n    -->\n<!ATTLIST q_code skip_misclass CDATA #IMPLIED>\n    <!--\n    The values of this attribute indicate the type if\n    misclassification:\n    - posn - a mistake in the division of the kanji\n    - stroke_count - a mistake in the number of strokes\n    - stroke_and_posn - mistakes in both division and strokes\n    - stroke_diff - ambiguous stroke counts depending on glyph\nS    --> \"\"\"\n        self.cid = None\n        self.qc_type = qc_type\n        self.value = value\n        self.skip_misclass = skip_misclass\n\n    def __repr__(self):\n        if self.qc_type:\n            return \"({t}) {v}\".format(t=self.qc_type, v=self.value)\n        else:\n            return self.value\n\n    def __str__(self):\n        return self.value\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'type': self.qc_type, 'value': self.value, \"skip_misclass\": self.skip_misclass}\n\n\nclass RMGroup(object):\n\n    def __init__(self, readings=None, meanings=None):\n        \"\"\"<!ELEMENT reading_meaning (rmgroup*, nanori*)>\n        <!--\n        The readings for the kanji in several languages, and the meanings, also\n        in several languages. The readings and meanings are grouped to enable\n        the handling of the situation where the meaning is differentiated by\n        reading. [T1]\n        -->\n        <!ELEMENT rmgroup (reading*, meaning*)>\n        \"\"\"\n        self.ID = None\n        self.cid = None\n        self.readings: List[Reading] = readings if readings else []\n        self.meanings: List[Meaning] = meanings if meanings else []\n\n    def __repr__(self):\n        return \"R: {} | M: {}\".format(\n            \", \".join([r.value for r in self.readings]),\n            \", \".join(m.value for m in self.meanings))\n\n    def __str__(self):\n        return repr(self)\n\n    @property\n    def on_readings(self):\n        return [r for r in self.readings if r.r_type == 'ja_on']\n\n    @property\n    def kun_readings(self):\n        return [r for r in self.readings if r.r_type == 'ja_kun']\n\n    @property\n    def other_readings(self):\n        return [r for r in self.readings if r.r_type not in('ja_kun', 'ja_on')]\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        sorted_readings = sorted(self.readings,\n                                 key=lambda x: x.r_type.startswith('ja_'),\n                                 reverse=True)\n        return {'readings': [r.to_dict() for r in sorted_readings],\n                'meanings': [m.to_dict() for m in self.meanings]}\n\n\nclass Reading(object):\n\n    def __init__(self, r_type='', value='', on_type=\"\", r_status=\"\"):\n        \"\"\"<!ELEMENT reading (#PCDATA)>\n        <!--\n        The reading element contains the reading or pronunciation\n        of the kanji.\n        -->\n        <!ATTLIST reading r_type CDATA #REQUIRED>\n        <!--\n        The r_type attribute defines the type of reading in the reading\n        element. The current values are:\n        pinyin - the modern PinYin romanization of the Chinese reading\n        of the kanji. The tones are represented by a concluding\n        digit. [Y]\n        korean_r - the romanized form of the Korean reading(s) of the\n        kanji.  The readings are in the (Republic of Korea) Ministry\n        of Education style of romanization. [W]\n        korean_h - the Korean reading(s) of the kanji in hangul.\n        ja_on - the \"on\" Japanese reading of the kanji, in katakana.\n        Another attribute r_status, if present, will indicate with\n        a value of \"jy\" whether the reading is approved for a\n        \"Jouyou kanji\".\n        A further attribute on_type, if present,  will indicate with\n        a value of kan, go, tou or kan'you the type of on-reading.\n        ja_kun - the \"kun\" Japanese reading of the kanji, usually in\n        hiragana.\n        Where relevant the okurigana is also included separated by a\n        \".\". Readings associated with prefixes and suffixes are\n        marked with a \"-\". A second attribute r_status, if present,\n        will indicate with a value of \"jy\" whether the reading is\n        approved for a \"Jouyou kanji\".\n        -->\n        <!ATTLIST reading on_type CDATA #IMPLIED>\n        <!--\n        See under ja_on above.\n        -->\n        <!ATTLIST reading r_status CDATA #IMPLIED>\n        <!--\n        See under ja_on and ja_kun above.\n        -->\"\"\"\n        self.gid = None\n        self.r_type = r_type\n        self.value = value\n        self.on_type = on_type\n        self.r_status = r_status\n\n    def __repr__(self):\n        if self.r_type:\n            return \"({t}) {v}\".format(t=self.r_type, v=self.value)\n        else:\n            return self.value\n\n    def __str__(self):\n        return self.value\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'type': self.r_type,\n                'value': self.value,\n                'on_type': self.on_type,\n                'r_status': self.r_status}\n\n\nclass Meaning(object):\n\n    def __init__(self, value='', m_lang=''):\n        \"\"\"<!ELEMENT meaning (#PCDATA)>\n        <!--\n        The meaning associated with the kanji.\n        -->\n        <!ATTLIST meaning m_lang CDATA #IMPLIED>\n        <!--\n        The m_lang attribute defines the target language of the meaning. It\n        will be coded using the two-letter language code from the ISO 639-1\n        standard. When absent, the value \"en\" (i.e. English) is implied. [{}]\n        -->\"\"\"\n        self.gid = None\n        self.m_lang = m_lang\n        self.value = value\n\n    def __repr__(self):\n        if self.m_lang:\n            return \"({l}) {v}\".format(l=self.m_lang, v=self.value)\n        else:\n            return self.value\n\n    def __str__(self):\n        return self.value\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self):\n        return {'m_lang': self.m_lang, 'value': self.value}\n\n\nclass Kanjidic2XMLParser(object):\n    \"\"\" JMDict XML parser\n    \"\"\"\n\n    def __init__(self):\n        pass\n\n    def get_attrib(self, a_tag, attr_name, default_value=''):\n        if attr_name == 'xml:lang':\n            attr_name = '''{http://www.w3.org/XML/1998/namespace}lang'''\n        if attr_name in a_tag.attrib:\n            return a_tag.attrib[attr_name]\n        else:\n            return default_value\n\n    def parse_file(self, kd2_file_path):\n        ''' Parse all characters from Kanjidic2 XML file\n        '''\n        actual_path = os.path.abspath(os.path.expanduser(kd2_file_path))\n        getLogger().debug('Loading data from file: {}'.format(actual_path))\n\n        with chio.open(actual_path, mode='rb') as kd2file:\n            tree = etree.iterparse(kd2file)\n            kd2 = None\n            for event, element in tree:\n                if event == 'end':\n                    if element.tag == 'header':\n                        kd2 = self.parse_header(element)\n                        element.clear()\n                    elif element.tag == 'character':\n                        kd2.characters.append(self.parse_char(element))\n                        element.clear()\n            return kd2\n\n    def parse_header(self, e):\n        fv = None\n        dbv = None\n        doc = None\n        for child in e:\n            if child.tag == 'file_version':\n                fv = child.text\n            elif child.tag == 'database_version':\n                dbv = child.text\n            elif child.tag == 'date_of_creation':\n                doc = child.text\n        return KanjiDic2(fv, dbv, doc)\n\n    def parse_char(self, e):\n        char = Character()\n        for child in e:\n            if child.tag == 'literal':\n                char.literal = child.text\n            elif child.tag == 'codepoint':\n                self.parse_codepoint(child, char)\n            elif child.tag == 'radical':\n                self.parse_radical(child, char)\n            elif child.tag == 'misc':\n                self.parse_misc(child, char)\n            elif child.tag == 'dic_number':\n                self.parse_dic_refs(child, char)\n            elif child.tag == 'query_code':\n                self.parse_query_code(child, char)\n            elif child.tag == 'reading_meaning':\n                self.parse_reading_meaning(child, char)\n            else:\n                getLogger().warning(\"Unknown tag in child: {}\".format(child.tag))\n        return char\n\n    def parse_codepoint(self, e, char):\n        for child in e:\n            if child.tag == 'cp_value':\n                cp = CodePoint(self.get_attrib(child, 'cp_type'), child.text)\n                char.codepoints.append(cp)\n            else:\n                getLogger().warning(\"Unknown tag: {}\".format(child.tag))\n\n    def parse_radical(self, e, char):\n        for child in e:\n            if child.tag == 'rad_value':\n                rad = Radical(self.get_attrib(child, \"rad_type\"), child.text)\n                char.radicals.append(rad)\n            else:\n                getLogger().warning(\"Unknown tag: {}\".format(child.tag))\n\n    def parse_misc(self, e, char):\n        for child in e:\n            # grade?, stroke_count+, variant*, freq?, rad_name*,jlpt?\n            if child.tag == 'grade':\n                char.grade = child.text\n            elif child.tag == 'stroke_count':\n                if char.stroke_count is None:\n                    char.stroke_count = int(child.text)\n                else:\n                    char.stroke_miscounts.append(int(child.text))\n            elif child.tag == 'variant':\n                v = Variant(self.get_attrib(child, \"var_type\"), child.text)\n                char.variants.append(v)\n            elif child.tag == 'freq':\n                char.freq = child.text\n            elif child.tag == 'rad_name':\n                char.rad_names.append(child.text)\n            elif child.tag == 'jlpt':\n                char.jlpt = child.text\n            else:\n                getLogger().warning(\"Unknown tag: {}\".format(child.tag))\n\n    def parse_dic_refs(self, e, char):\n        for child in e:\n            if child.tag == 'dic_ref':\n                dr_type = self.get_attrib(child, \"dr_type\")\n                m_vol = self.get_attrib(child, \"m_vol\")\n                m_page = self.get_attrib(child, \"m_page\")\n                dr = DicRef(dr_type, child.text, m_vol, m_page)\n                char.dic_refs.append(dr)\n            else:\n                getLogger().warning(\"Unknown tag: {}\".format(child.tag))\n\n    def parse_query_code(self, e, char):\n        for child in e:\n            if child.tag == \"q_code\":\n                qc_type = self.get_attrib(child, \"qc_type\")\n                skip_misclass = self.get_attrib(child, \"skip_misclass\")\n                char.query_codes.append(QueryCode(qc_type, child.text, skip_misclass))\n            else:\n                getLogger().warning(\"Unknown tag: {}\".format(child.tag))\n\n    def parse_reading_meaning(self, e, char):\n        for child in e:\n            if child.tag == \"nanori\":\n                char.nanoris.append(child.text)\n            elif child.tag == \"rmgroup\":\n                rmgroup = RMGroup()\n                char.rm_groups.append(rmgroup)\n                for grandchild in child:\n                    if grandchild.tag == 'reading':\n                        r_type = self.get_attrib(grandchild, \"r_type\")\n                        on_type = self.get_attrib(grandchild, \"on_type\")\n                        r_status = self.get_attrib(grandchild, \"r_status\")\n                        r = Reading(r_type, grandchild.text, on_type, r_status)\n                        rmgroup.readings.append(r)\n                    elif grandchild.tag == 'meaning':\n                        m = Meaning(grandchild.text, self.get_attrib(grandchild, \"m_lang\"))\n                        rmgroup.meanings.append(m)\n                    else:\n                        getLogger().warning(\"Unknown tag: {}\".format(grandchild.tag))\n            else:\n                getLogger().warning(\"Unknown tag: {}\".format(child.tag))\n"
  },
  {
    "path": "jamdict/kanjidic2_sqlite.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nKanjiDic2 in SQLite format\n\nReferences:\n    KANJIDIC2 project\n        https://www.edrdg.org/wiki/index.php/KANJIDIC_Project\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2017 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport os\nimport logging\nfrom puchikarui import Schema\nfrom . import __version__ as JAMDICT_VERSION, __url__ as JAMDICT_URL\nfrom .jmdict import Meta\nfrom .kanjidic2 import Character, CodePoint, Radical, Variant, DicRef, QueryCode, RMGroup, Reading, Meaning\n\n# ------------------------------------------------------------------------------\n# Configuration\n# ------------------------------------------------------------------------------\n\nMY_FOLDER = os.path.dirname(os.path.abspath(__file__))\nSCRIPT_FOLDER = os.path.join(MY_FOLDER, 'data')\nKANJIDIC2_VERSION = '1.6'\nKANJIDIC2_URL = 'https://www.edrdg.org/wiki/index.php/KANJIDIC_Project'\nKANJIDIC2_DATE = 'April 2008'\nKANJIDIC2_SETUP_FILE = os.path.join(SCRIPT_FOLDER, 'setup_kanjidic2.sql')\nKANJIDIC2_SETUP_SCRIPT = '''\nINSERT INTO meta VALUES ('kanjidic2.version', '{kdv}');\nINSERT INTO meta VALUES ('kanjidic2.url', '{kdu}');\nINSERT INTO meta VALUES ('kanjidic2.date', '{kdd}');\nINSERT INTO meta SELECT 'generator', 'jamdict'\nWHERE NOT EXISTS (SELECT 1 FROM meta WHERE key='generator');\nINSERT INTO meta SELECT 'generator_version', '{gv}'\nWHERE NOT EXISTS (SELECT 1 FROM meta WHERE key='generator_version');\nINSERT INTO meta SELECT 'generator_url', '{gu}'\nWHERE NOT EXISTS (SELECT 1 FROM meta WHERE key='generator_url');'''.format(\n    kdv=KANJIDIC2_VERSION,\n    kdu=KANJIDIC2_URL,\n    kdd=KANJIDIC2_DATE,\n    gv=JAMDICT_VERSION,\n    gu=JAMDICT_URL\n)\n\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\n# ------------------------------------------------------------------------------\n# Models\n# ------------------------------------------------------------------------------\n\nclass KanjiDic2Schema(Schema):\n\n    KEY_FILE_VER = 'kanjidic2.file_version'\n    KEY_DB_VER = 'kanjidic2.database_version'\n    KEY_CREATED_DATE = 'kanjidic2.date_of_creation'\n\n    def __init__(self, db_path, *args, **kwargs):\n        super().__init__(db_path, *args, **kwargs)\n        self.add_file(KANJIDIC2_SETUP_FILE)\n        self.add_script(KANJIDIC2_SETUP_SCRIPT)\n        # Meta\n        self.add_table('meta', ['key', 'value'], proto=Meta).set_id('key')\n        self.add_table('character', ['ID', 'literal', 'stroke_count', 'grade', 'freq', 'jlpt'], proto=Character, alias=\"char\").set_id('ID')\n        self.add_table('codepoint', ['cid', 'cp_type', 'value'], proto=CodePoint)\n        self.add_table('radical', ['cid', 'rad_type', 'value'], proto=Radical)\n        self.add_table('stroke_miscount', ['cid', 'value'], alias=\"smc\")\n        self.add_table('variant', ['cid', 'var_type', 'value'], proto=Variant)\n        self.add_table('rad_name', ['cid', 'value'])\n        self.add_table('dic_ref', ['cid', 'dr_type', 'value', 'm_vol', 'm_page'], proto=DicRef)\n        self.add_table('query_code', ['cid', 'qc_type', 'value', 'skip_misclass'], proto=QueryCode)\n        self.add_table('nanori', ['cid', 'value'])\n        self.add_table('rm_group', ['ID', 'cid'], proto=RMGroup, alias='rmg').set_id('ID')\n        self.add_table('reading', ['gid', 'r_type', 'value', 'on_type', 'r_status'], proto=Reading)\n        self.add_table('meaning', ['gid', 'value', 'm_lang'], proto=Meaning)\n\n\nclass KanjiDic2SQLite(KanjiDic2Schema):\n\n    def __init__(self, db_path, *args, **kwargs):\n        super().__init__(db_path, *args, **kwargs)\n\n    def update_kd2_meta(self, file_version, database_version, date_of_creation, ctx=None):\n        # ensure context\n        if ctx is None:\n            with self.ctx() as new_context:\n                return self.update_kd2_meta(file_version, database_version, date_of_creation, new_context)\n        # else\n        # file_version\n        fv = ctx.meta.by_id(self.KEY_FILE_VER)\n        if not fv:\n            ctx.meta.insert(self.KEY_FILE_VER, file_version)\n        else:\n            fv.value = file_version\n            ctx.meta.save(fv)\n        # database_version\n        dv = ctx.meta.by_id(self.KEY_DB_VER)\n        if not dv:\n            ctx.meta.insert(self.KEY_DB_VER, database_version)\n        else:\n            dv.value = database_version\n            ctx.meta.save(dv)\n        # date_of_creation\n        doc = ctx.meta.by_id(self.KEY_CREATED_DATE)\n        if not doc:\n            ctx.meta.insert(self.KEY_CREATED_DATE, date_of_creation)\n        else:\n            doc.value = date_of_creation\n            ctx.meta.save(doc)\n\n    def insert_chars(self, chars, ctx=None):\n        # ensure context\n        if ctx is None:\n            with self.ctx() as ctx:\n                return self.insert_chars(chars, ctx=ctx)\n        # else\n        for c in chars:\n            self.insert_char(c, ctx=ctx)\n\n    def insert_char(self, c, ctx=None):\n        # ensure context\n        if ctx is None:\n            with self.ctx() as ctx:\n                return self.insert_char(c, ctx=ctx)\n        # else\n        c.ID = ctx.character.save(c)\n        # save codepoints\n        for cp in c.codepoints:\n            cp.cid = c.ID\n            ctx.codepoint.save(cp)\n        # radicals\n        for r in c.radicals:\n            r.cid = c.ID\n            ctx.radical.save(r)\n        # stroke_miscount\n        for smc in c.stroke_miscounts:\n            ctx.smc.insert(c.ID, smc)\n        # variants\n        for v in c.variants:\n            v.cid = c.ID\n            ctx.variant.save(v)\n        # radnames\n        for rn in c.rad_names:\n            ctx.rad_name.insert(c.ID, rn)\n        # dic_refs\n        for dr in c.dic_refs:\n            dr.cid = c.ID\n            ctx.dic_ref.save(dr)\n        # query_codes\n        for qc in c.query_codes:\n            qc.cid = c.ID\n            ctx.query_code.save(qc)\n        # nanoris\n        for n in c.nanoris:\n            ctx.nanori.insert(c.ID, n)\n        # reading groups\n        for rmg in c.rm_groups:\n            rmg.cid = c.ID\n            rmg.ID = ctx.rmg.save(rmg)\n            # save readings inside\n            for r in rmg.readings:\n                r.gid = rmg.ID\n                ctx.reading.save(r)\n            # save meanings inside\n            for m in rmg.meanings:\n                m.gid = rmg.ID\n                ctx.meaning.save(m)\n\n    def search_chars_iter(self, chars, ctx=None):\n        if ctx is None:\n            with self.ctx() as ctx:\n                return self.search_chars_iter(chars, ctx=ctx)\n        for c in chars:\n            res = self.get_char(c, ctx=ctx)\n            if res is not None:\n                yield res\n\n    def get_char(self, literal, ctx=None):\n        if ctx is None:\n            with self.ctx() as ctx:\n                return self.get_char(literal, ctx=ctx)\n        # context was ensured\n        c = ctx.char.select_single('literal=?', (literal,))\n        if not c:\n            getLogger().debug(\"character {} could not be found\".format(literal))\n            return None\n        else:\n            return self.char_by_id(c.ID, ctx)\n\n    def char_by_id(self, cid, ctx=None):\n        if ctx is None:\n            with self.ctx() as ctx:\n                return self.select_char(cid, ctx=ctx)\n        # context was ensured\n        c = ctx.char.by_id(cid)\n        c.codepoints = ctx.codepoint.select('cid=?', (cid,))\n        c.radicals = ctx.radical.select('cid=?', (cid,))\n        for smc in ctx.smc.select('cid=?', (cid,)):\n            c.stroke_miscounts.append(smc.value)\n        c.variants = ctx.variant.select('cid=?', (cid,))\n        for r in ctx.rad_name.select('cid=?', (cid,)):\n            c.rad_names.append(r.value)\n        c.dic_refs = ctx.dic_ref.select('cid=?', (cid,))\n        c.query_codes = ctx.query_code.select('cid=?', (cid,))\n        for n in ctx.nanori.select('cid=?', (cid,)):\n            c.nanoris.append(n.value)\n        c.rm_groups = ctx.rmg.select('cid=?', (cid,))\n        for rmg in c.rm_groups:\n            rmg.readings = ctx.reading.select('gid=?', (rmg.ID,))\n            rmg.meanings = ctx.meaning.select('gid=?', (rmg.ID,))\n        return c\n"
  },
  {
    "path": "jamdict/krad.py",
    "content": "# -*- coding: utf-8 -*-\r\n\r\n\"\"\"\r\njamdict.krad is a module for retrieving kanji components (i.e. radicals)\r\n\"\"\"\r\n\r\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\r\n# :copyright: (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\r\n# :license: MIT, see LICENSE for more details.\r\n\r\nimport os\r\nimport logging\r\nimport threading\r\nfrom collections import defaultdict as dd\r\nfrom typing import Mapping\r\n\r\nfrom chirptext import chio\r\n\r\n# ------------------------------------------------------------------------------\r\n# Configuration\r\n# ------------------------------------------------------------------------------\r\nMY_FOLDER = os.path.dirname(os.path.abspath(__file__))\r\nDATA_FOLDER = os.path.join(MY_FOLDER, 'data')\r\nKRADFILE = os.path.join(DATA_FOLDER, 'kradfile-u.gz')\r\nRADKFILE = os.path.join(DATA_FOLDER, 'radkfile.gz')\r\n\r\nlogger = logging.getLogger(__name__)\r\n\r\n\r\n########################################################################\r\n\r\nclass KRad:\r\n    ''' This class contains mapping from radicals to kanjis (radk) and kanjis to radicals (krad)\r\n\r\n    '''\r\n    def __init__(self, **kwargs):\r\n        \"\"\" Kanji-Radical mapping \"\"\"\r\n        self.__krad_map: Mapping = None\r\n        self.__radk_map: Mapping = None\r\n        self.__rads = {}\r\n        self.lock = threading.Lock()\r\n\r\n    def _build_krad_map(self):\r\n        with self.lock:\r\n            lines = chio.read_file(KRADFILE, mode='rt').splitlines()\r\n            # build the krad map\r\n            self.__krad_map = {}\r\n            self.__radk_map = dd(set)\r\n            for line in lines:\r\n                if line.startswith(\"#\"):\r\n                    continue\r\n                else:\r\n                    parts = line.split(':', maxsplit=1)\r\n                    if len(parts) == 2:\r\n                        rads = [r.strip() for r in parts[1].split()]\r\n                        char_literal = parts[0].strip()\r\n                        self.__krad_map[char_literal] = rads\r\n                        for rad in rads:\r\n                            self.__radk_map[rad].add(char_literal)\r\n\r\n    @property\r\n    def radk(self) -> Mapping:\r\n        if self.__radk_map is None:\r\n            self._build_krad_map()\r\n        return self.__radk_map\r\n\r\n    @property\r\n    def krad(self) -> Mapping:\r\n        if self.__krad_map is None:\r\n            self._build_krad_map()\r\n        return self.__krad_map\r\n"
  },
  {
    "path": "jamdict/tools.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nJamdict console app\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2017 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport os\nimport json\nimport logging\n\nfrom chirptext import __version__ as chirptext_version\nfrom puchikarui import __version__ as puchikarui_version\nfrom chirptext import confirm, TextReport, Timer\nfrom chirptext.cli import CLIApp, setup_logging\n\nimport jamdict\n\n# -------------------------------------------------------------------------------\n# Configuration\n# -------------------------------------------------------------------------------\n\nif os.path.isfile('logging.json'):\n    setup_logging('logging.json', 'logs')\nelse:\n    setup_logging(os.path.join(jamdict.config.home_dir(), 'logging.json'), 'logs')\n\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\n# -------------------------------------------------------------------------------\n# Functions\n# -------------------------------------------------------------------------------\n\ndef get_jam(cli, args):\n    if not args.jdb:\n        args.jdb = None\n    if args.config:\n        jamdict.config.read_config(args.config)\n    if args.kd2 or args.jmne:\n        cli.logger.warning(\"Jamdict database location: {}\".format(args.jdb))\n        cli.logger.warning(\"Kanjidic2 database location: {}\".format(args.kd2))\n        jmd = jamdict.Jamdict(db_file=args.jdb, kd2_file=args.kd2,\n                              jmd_xml_file=args.jmdxml,\n                              kd2_xml_file=args.kd2xml,\n                              jmnedict_file=args.jmne,\n                              jmnedict_xml_file=args.jmnexml)\n    else:\n        cli.logger.debug(\"Using the same database for both JMDict and Kanjidic2\")\n        jmd = jamdict.Jamdict(db_file=args.jdb,\n                              kd2_file=args.jdb,\n                              jmnedict_file=args.jdb,\n                              jmd_xml_file=args.jmdxml,\n                              kd2_xml_file=args.kd2xml,\n                              jmnedict_xml_file=args.jmnexml)\n    if jmd.kd2 is None:\n        cli.logger.warning(\"Kanjidic2 database could not be found\")\n    return jmd\n\n\ndef import_data(cli, args):\n    '''Generate Jamdict SQLite database from XML data files'''\n    rp = TextReport()\n    t = Timer(report=rp)\n    show_info(cli, args)\n    jam = get_jam(cli, args)\n    if not jam.db_file:\n        print(\"Database path is not available\")\n    elif os.path.isfile(jam.db_file):\n        if not confirm(\"Database file exists. Do you want to overwite (This action cannot be undone! yes/no?) \"):\n            cli.logger.warning(\"Program aborted.\")\n            exit()\n        else:\n            os.unlink(jam.db_file)\n    # perform input\n    print(f\"Importing data to: {jam.db_file}\")\n    t.start(\"Creating Jamdict SQLite database. This process may take very long time ...\")\n    jam.import_data()\n    t.stop()\n\n\ndef dump_result(results, report=None):\n    if report is None:\n        report = TextReport()\n    if results.entries:\n        report.print(\"=\" * 40)\n        report.print(\"Found entries\")\n        report.print(\"=\" * 40)\n        for e in results.entries:\n            kj = ', '.join([k.text for k in e.kanji_forms])\n            kn = ', '.join([k.text for k in e.kana_forms])\n            report.print(\"Entry: {} | Kj:  {} | Kn: {}\".format(e.idseq, kj, kn))\n            report.print(\"-\" * 20)\n            for idx, s in enumerate(e.senses):\n                report.print(\"{idx}. {s}\".format(idx=idx + 1, s=s))\n            report.print('')\n    else:\n        report.print(\"No dictionary entry was found.\")\n    if results.chars:\n        report.print(\"=\" * 40)\n        report.print(\"Found characters\")\n        report.print(\"=\" * 40)\n        for c in results.chars:\n            report.print(\"Char: {} | Strokes: {}\".format(c, c.stroke_count))\n            report.print(\"-\" * 20)\n            for rmg in c.rm_groups:\n                report.print(\"Readings:\", \", \".join([r.value for r in rmg.readings]))\n                report.print(\"Meanings:\", \", \".join([m.value for m in rmg.meanings if not m.m_lang or m.m_lang == 'en']))\n            report.print('')\n        report.print('')\n    else:\n        report.print(\"No character was found.\")\n    if results.names:\n        report.print(\"=\" * 40)\n        report.print(\"Found name entities\")\n        report.print(\"=\" * 40)\n        for e in results.names:\n            kj = ', '.join([k.text for k in e.kanji_forms])\n            kn = ', '.join([k.text for k in e.kana_forms])\n            report.print(\"Names: {} | Kj:  {} | Kn: {}\".format(e.idseq, kj, kn))\n            report.print(\"-\" * 20)\n            for idx, s in enumerate(e.senses):\n                report.print(\"{idx}. {s}\".format(idx=idx + 1, s=s))\n            report.print('')\n    else:\n        report.print(\"No name was found.\")\n\n\ndef lookup(cli, args):\n    '''Lookup words by kanji/kana'''\n    jam = get_jam(cli, args)\n    if jam.ready:\n        results = jam.lookup(args.query, strict_lookup=args.strict)\n        report = TextReport(args.output)\n        if args.format == 'json':\n            report.print(json.dumps(results.to_dict(),\n                                    ensure_ascii=args.ensure_ascii,\n                                    indent=args.indent if args.indent else None))\n        else:\n            if args.compact:\n                report.print(results.text(separator='\\n------\\n', entry_sep='\\n'))\n            else:\n                dump_result(results, report=report)\n    else:\n        getLogger().warning(f\"Jamdict database is not available.\\nThere are 3 ways to install data: \\n    1) install jamdict_data via PyPI using `pip install jamdict_data` \\n    2) download prebuilt dictionary database file from: {jamdict.__url__}, \\n    3) or build your own database file from XML source files.\")\n\n\ndef file_status(file_path):\n    if file_path:\n        real_path = os.path.abspath(os.path.expanduser(file_path))\n        if os.path.isfile(real_path):\n            return '[OK]'\n    return '[NOT FOUND]'\n\n\ndef hello_jamdict(cli, args):\n    ''' Say hello and test if Jamdict is working '''\n    jam = get_jam(cli, args)\n    if jam.ready:\n        results = jam.lookup(\"一期一会\")\n        dump_result(results, report=TextReport())\n    else:\n        getLogger().warning(\"Hello there, unfortunately jamdict data is not available. Please try to install using `pip install jamdict-data`\")\n\n\ndef show_info(cli, args):\n    ''' Show jamdict configuration (data folder, configuration file location, etc.) '''\n    output = TextReport(args.output) if 'output' in args else TextReport()\n    if args.config:\n        jamdict.config.read_config(args.config)\n    output.print(\"Jamdict \" + jamdict.version_info.__version__)\n    output.print(jamdict.version_info.__description__)\n    jam = get_jam(cli, args)\n    output.header(\"Basic configuration\")\n    jamdict_home = jamdict.config.home_dir()\n    if not os.path.isdir(os.path.expanduser(jamdict_home)):\n        jamdict_home += \" [Missing]\"\n    else:\n        jamdict_home += \" [OK]\"\n    output.print(f\"JAMDICT_HOME: {jamdict_home}\")\n    if jamdict.util._JAMDICT_DATA_AVAILABLE:\n        import jamdict_data\n        data_pkg = f\"version {jamdict_data.__version__} [OK]\"\n    else:\n        data_pkg = \"Not installed\"\n    output.print(f\"jamdict-data: {data_pkg}\")\n    if args.config:\n        _config_path = args.config + \" [Custom]\"\n        if not os.path.isfile(args.config):\n            _config_path += \" [Missing]\"\n    else:\n        _config_path = jamdict.config._get_config_manager().locate_config()\n    if not _config_path:\n        _config_path = \"Not available.\\n     Run `python3 -m jamdict config` to create configuration file if needed.\"\n    output.print(f\"Config file : {_config_path}\")\n\n    output.header(\"Data files\")\n    output.print(f\"Jamdict DB location: {jam.db_file} - {file_status(jam.db_file)}\")\n    output.print(f\"JMDict XML file    : {jam.jmd_xml_file} - {file_status(jam.jmd_xml_file)}\")\n    output.print(f\"KanjiDic2 XML file : {jam.kd2_xml_file} - {file_status(jam.kd2_xml_file)}\")\n    output.print(f\"JMnedict XML file  : {jam.jmnedict_xml_file} - {file_status(jam.jmnedict_xml_file)}\")\n\n    if jam.ready:\n        output.header(\"Jamdict database metadata\")\n        try:\n            for meta in jam.jmdict.meta.select():\n                output.print(f\"{meta.key}: {meta.value}\")\n        except Exception as e:\n            print(e)\n            output.print(\"Error happened while retrieving database meta data\")\n    output.header(\"Others\")\n    output.print(f\"puchikarui: version {puchikarui_version}\")\n    output.print(f\"chirptext : version {chirptext_version}\")\n    output.print(f\"lxml      : {jamdict.jmdict._LXML_AVAILABLE}\")\n    \n\n\ndef show_version(cli, args):\n    ''' Show Jamdict version '''\n    if args.verbose:\n        print(\"Jamdict {v} - {d}\".format(d=jamdict.version_info.__description__, v=jamdict.version_info.__version__))\n    else:\n        print(\"Jamdict {}\".format(jamdict.version_info.__version__))\n\n\ndef config_jamdict(cli, args):\n    ''' Create Jamdict configuration file '''\n    if args.config:\n        jamdict.config._ensure_config(args.config)\n    else:\n        jamdict.config._ensure_config()\n    show_info(cli, args)\n\n\n# -------------------------------------------------------------------------------\n# Main\n# -------------------------------------------------------------------------------\n\ndef add_data_config(parser):\n    parser.add_argument('-c', '--config', help='Path to Jamdict config file (i.e. ~/.jamdict/config.json)', default=None)\n    parser.add_argument('-J', '--jdb', help='Path to JMDict SQLite file', default=None)\n    parser.add_argument('-j', '--jmdxml', help='Path to JMdict XML file', default=None)\n    parser.add_argument('-k', '--kd2xml', help='Path to KanjiDic2 XML file', default=None)\n    parser.add_argument('-e', '--jmnexml', help='Path to JMnedict XML file', default=None)\n    parser.add_argument('-K', '--kd2', help='Path to KanjiDic2 SQLite file', default=None)\n    parser.add_argument('-E', '--jmne', help='Path to JMnedict SQLite file', default=None)\n\n\ndef main():\n    '''Main entry of jamtk\n    '''\n    app = CLIApp(desc='Jamdict command-line toolkit', logger=__name__, show_version=show_version)\n    add_data_config(app.parser)\n\n    # import task\n    import_task = app.add_task('import', func=import_data)\n    add_data_config(import_task)\n\n    # show info\n    info_task = app.add_task('info', func=show_info)\n    info_task.add_argument('-o', '--output', help='Write information to a text file')\n    add_data_config(info_task)\n\n    # show version\n    version_task = app.add_task('version', func=show_version)\n    add_data_config(version_task)\n\n    # create config file\n    config_task = app.add_task('config', func=config_jamdict)\n    add_data_config(config_task)\n\n    # hello\n    hello_task = app.add_task('hello', func=hello_jamdict)\n    add_data_config(hello_task)\n\n    # look up task\n    lookup_task = app.add_task('lookup', func=lookup)\n    lookup_task.add_argument('query', help='kanji/kana')\n    lookup_task.add_argument('-f', '--format', help='json or text')\n    lookup_task.add_argument('--compact', action='store_true')\n    lookup_task.add_argument('-s', '--strict', action='store_true')\n    lookup_task.add_argument('--ensure_ascii', help='Force JSON dumps to ASCII only', action='store_true')\n    lookup_task.add_argument('--indent', help='JSON default indent', default=2, type=int)\n    lookup_task.add_argument('-o', '--output', help='Path to a file to output lookup result, leave blank to write to console standard output')\n    lookup_task.set_defaults(func=lookup)\n    add_data_config(lookup_task)\n\n    # run app\n    app.run()\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "jamdict/util.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nJamdict public APIs\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport os\nimport logging\nimport threading\nimport warnings\nfrom pathlib import Path\nfrom collections import defaultdict as dd\nfrom collections import OrderedDict\nfrom typing import List, Sequence\n\nfrom chirptext.deko import HIRAGANA, KATAKANA\n_MEMORY_MODE = False\ntry:\n    from puchikarui import MemorySource\n    _MEMORY_MODE = True\nexcept ImportError:\n    pass\nfrom puchikarui import ExecutionContext\n\nfrom . import config\nfrom .jmdict import JMDictXMLParser, JMDEntry\nfrom .krad import KRad\nfrom .jmdict_sqlite import JMDictSQLite\nfrom .kanjidic2 import Kanjidic2XMLParser, Character\nfrom .kanjidic2_sqlite import KanjiDic2SQLite\nfrom .jmnedict_sqlite import JMNEDictSQLite\n\ntry:\n    import jamdict_data\n    _JAMDICT_DATA_AVAILABLE = True\nexcept Exception:\n    _JAMDICT_DATA_AVAILABLE = False\n\n\n########################################################################\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\n########################################################################\n\nclass LookupResult(object):\n\n    \"\"\" Contain lookup results (words, Kanji characters, or named entities) from Jamdict.\n\n    A typical jamdict lookup is like this:\n\n    >>> jam = Jamdict()\n    >>> result = jam.lookup('食べ%る')\n\n    The command above returns a :any:`LookupResult` object which contains found words (:any:`entries`),\n    kanji characters (:any:`chars`), and named entities (:any:`names`).\n    \"\"\"\n\n    def __init__(self, entries, chars, names=None):\n        self.__entries: Sequence[JMDEntry] = entries if entries else []\n        self.__chars: Sequence[Character] = chars if chars else []\n        self.__names: Sequence[JMDEntry] = names if names else []\n\n    @property\n    def entries(self) -> Sequence[JMDEntry]:\n        \"\"\" A list of words entries\n\n        :returns: a list of :class:`JMDEntry <jamdict.jmdict.JMDEntry>` object\n        :rtype: List[JMDEntry]\n        \"\"\"\n        return self.__entries\n\n    @entries.setter\n    def entries(self, values: Sequence[JMDEntry]):\n        self.__entries = values\n\n    @property\n    def chars(self) -> Sequence[Character]:\n        \"\"\" A list of found kanji characters\n\n        :returns: a list of :class:`Character <jamdict.kanjidic2.Character>` object\n        :rtype: Sequence[Character]\n        \"\"\"\n        return self.__chars\n\n    @chars.setter\n    def chars(self, values: Sequence[Character]):\n        self.__chars = values\n\n    @property\n    def names(self) -> Sequence[JMDEntry]:\n        \"\"\" A list of found named entities\n\n        :returns: a list of :class:`JMDEntry <jamdict.jmdict.JMDEntry>` object\n        :rtype: Sequence[JMDEntry]\n        \"\"\"\n        return self.__names\n\n    @names.setter\n    def names(self, values: Sequence[JMDEntry]):\n        self.__names = values\n\n    def text(self, compact=True, entry_sep='。', separator=' | ', no_id=False, with_chars=True) -> str:\n        \"\"\" Generate a text string that contains all found words, characters, and named entities.\n\n        :param compact: Make the output string more compact (fewer info, fewer whitespaces, etc.)\n        :param no_id: Do not include jamdict's internal object IDs (for direct query via API)\n        :param entry_sep: The text to separate entries\n        :param with_chars: Include characters information\n        :returns: A formatted string ready for display\n        \"\"\"\n        output = []\n        if self.entries:\n            entry_txts = []\n            for idx, e in enumerate(self.entries, start=1):\n                entry_txt = e.text(compact=compact, separator=' ', no_id=no_id)\n                entry_txts.append(\"#{}: {}\".format(idx, entry_txt))\n            output.append(\"[Entries]\")\n            output.append(entry_sep)\n            output.append(entry_sep.join(entry_txts))\n        elif not compact:\n            output.append(\"No entries\")\n        if self.chars and with_chars:\n            if compact:\n                chars_txt = ', '.join(str(c) for c in self.chars)\n            else:\n                chars_txt = ', '.join(repr(c) for c in self.chars)\n            if output:\n                output.append(separator)  # TODO: section separator?\n            output.append(\"[Chars]\")\n            output.append(entry_sep)\n            output.append(chars_txt)\n        if self.names:\n            name_txts = []\n            for idx, n in enumerate(self.names, start=1):\n                name_txt = n.text(compact=compact, separator=' ', no_id=no_id)\n                name_txts.append(\"#{}: {}\".format(idx, name_txt))\n            if output:\n                output.append(separator)\n            output.append(\"[Names]\")\n            output.append(entry_sep)\n            output.append(entry_sep.join(name_txts))\n        return \"\".join(output) if output else \"Found nothing\"\n\n    def __repr__(self):\n        return self.text(compact=True)\n\n    def __str__(self):\n        return self.text(compact=False)\n\n    def to_json(self):\n        warnings.warn(\"to_json() is deprecated and will be removed in the next major release. Use to_dict() instead.\",\n                      DeprecationWarning, stacklevel=2)\n        return self.to_dict()\n\n    def to_dict(self) -> dict:\n        return {'entries': [e.to_dict() for e in self.entries],\n                'chars': [c.to_dict() for c in self.chars],\n                'names': [n.to_dict() for n in self.names]}\n\n\nclass IterLookupResult(object):\n\n    \"\"\" Contain lookup results (words, Kanji characters, or named entities) from Jamdict.\n\n    A typical jamdict lookup is like this:\n\n    >>> res = jam.lookup_iter(\"花見\")\n\n    ``res`` is an :class:`IterLookupResult` object which contains iterators\n    to scan through found words (``entries``), kanji characters (``chars``),\n    and named entities (:any:`names`) one by one.\n\n    >>> for word in res.entries:\n    ...     print(word)  # do somethign with the word\n    >>> for c in res.chars:\n    ...     print(c)\n    >>> for name in res.names:\n    ...     print(name)\n    \"\"\"\n\n    def __init__(self, entries, chars=None, names=None):\n        self.__entries = entries if entries is not None else []\n        self.__chars = chars if chars is not None else []\n        self.__names = names if names is not None else []\n\n    @property\n    def entries(self):\n        \"\"\" Iterator for looping one by one through all found entries, can only be used once \"\"\"\n        return self.__entries\n\n    @property\n    def chars(self):\n        \"\"\" Iterator for looping one by one through all found kanji characters, can only be used once \"\"\"\n        return self.__chars\n\n    @property\n    def names(self):\n        \"\"\" Iterator for looping one by one through all found named entities, can only be used once \"\"\"\n        return self.__names\n\n\nclass JamdictSQLite(KanjiDic2SQLite, JMNEDictSQLite, JMDictSQLite):\n\n    def __init__(self, db_file, *args, **kwargs):\n        super().__init__(db_file, *args, **kwargs)\n\n\nclass Jamdict(object):\n\n    \"\"\" Main entry point to access all available dictionaries in jamdict.\n\n    >>> from jamdict import Jamdict\n    >>> jam = Jamdict()\n    >>> result = jam.lookup('食べ%る')\n    # print all word entries\n    >>> for entry in result.entries:\n    >>>     print(entry)\n    # print all related characters\n    >>> for c in result.chars:\n    >>>     print(repr(c))\n\n    To filter results by ``pos``, for example look for all \"かえる\" that are nouns, use:\n\n    >>> result = jam.lookup(\"かえる\", pos=[\"noun (common) (futsuumeishi)\"])\n\n    To search for named-entities by type, use the type string as query.\n    For example to search for all \"surname\" use:\n\n    >>> result = jam.lookup(\"surname\")\n\n    To find out which part-of-speeches or named-entities types are available in the \n    dictionary, use :func:`Jamdict.all_pos <jamdict.util.Jamdict.all_pos>`\n    and :func:`Jamdict.all_ne_type <jamdict.util.Jamdict.all_pos>`.\n\n    Jamdict >= 0.1a10 support ``memory_mode`` keyword argument for reading\n    the whole database into memory before querying to boost up search speed.\n    The database may take about a minute to load. Here is the sample code:\n\n    >>> jam = Jamdict(memory_mode=True)\n\n    When there is no suitable database available, Jamdict will try to use database \n    from `jamdict-data <https://pypi.org/project/jamdict-data/>`_ package by default.\n    If there is a custom database available in configuration file,\n    Jamdict will prioritise to use it over the ``jamdict-data`` package.\n    \"\"\"\n\n    def __init__(self, db_file=None, kd2_file=None,\n                 jmd_xml_file=None, kd2_xml_file=None,\n                 auto_config=True, auto_expand=True, reuse_ctx=True,\n                 jmnedict_file=None, jmnedict_xml_file=None,\n                 memory_mode=False, **kwargs):\n\n        # data sources\n        self.reuse_ctx = reuse_ctx\n        self._db_sqlite = None\n        self._kd2_sqlite = None\n        self._jmne_sqlite = None\n        self._jmd_xml = None\n        self._kd2_xml = None\n        self._jmne_xml = None\n        self.__krad_map = None\n        self.__jm_ctx = None  # for reusing database context\n        self.__memory_mode = memory_mode\n\n        # file paths configuration\n        self.auto_expand = auto_expand\n        self.jmd_xml_file = jmd_xml_file if jmd_xml_file else config.get_file('JMDICT_XML') if auto_config else None\n        self.kd2_xml_file = kd2_xml_file if kd2_xml_file else config.get_file('KD2_XML') if auto_config else None\n        self.jmnedict_xml_file = jmnedict_xml_file if jmnedict_xml_file else config.get_file('JMNEDICT_XML') if auto_config else None\n        if auto_expand:\n            if self.jmd_xml_file:\n                self.jmd_xml_file = os.path.expanduser(self.jmd_xml_file)\n            if self.kd2_xml_file:\n                self.kd2_xml_file = os.path.expanduser(self.kd2_xml_file)\n            if self.jmnedict_xml_file:\n                self.jmnedict_xml_file = os.path.expanduser(self.jmnedict_xml_file)\n\n        self.db_file = db_file if db_file else config.get_file('JAMDICT_DB') if auto_config else None\n        if not self.db_file or (self.db_file != ':memory:' and not os.path.isfile(self.db_file)):\n            if _JAMDICT_DATA_AVAILABLE:\n                self.db_file = jamdict_data.JAMDICT_DB_PATH\n            elif self.jmd_xml_file and os.path.isfile(self.jmd_xml_file):\n                getLogger().warning(\"JAMDICT_DB could NOT be found. Searching will be extremely slow. Please run `python3 -m jamdict import` first\")\n        self.kd2_file = kd2_file if kd2_file else self.db_file if auto_config else None\n        if not self.kd2_file or (self.kd2_file != ':memory:' and not os.path.isfile(self.kd2_file)):\n            if _JAMDICT_DATA_AVAILABLE:\n                self.kd2_file = None  # jamdict_data.JAMDICT_DB_PATH\n            elif self.kd2_xml_file and os.path.isfile(self.kd2_xml_file):\n                getLogger().warning(\"Kanjidic2 database could NOT be found. Searching will be extremely slow. Please run `python3 -m jamdict import` first\")\n        self.jmnedict_file = jmnedict_file if jmnedict_file else self.db_file if auto_config else None\n        if not self.jmnedict_file or (self.jmnedict_file != ':memory:' and not os.path.isfile(self.jmnedict_file)):\n            if _JAMDICT_DATA_AVAILABLE:\n                self.jmnedict_file = None  # jamdict_data.JAMDICT_DB_PATH\n            elif self.jmnedict_xml_file and os.path.isfile(self.jmnedict_xml_file):\n                getLogger().warning(\"JMNE database could NOT be found. Searching will be extremely slow. Please run `python3 -m jamdict import` first\")\n\n    @property\n    def ready(self) -> bool:\n        \"\"\" Check if Jamdict database is available \"\"\"\n        return os.path.isfile(self.db_file) and self.jmdict is not None\n\n    def __del__(self):\n        if self.__jm_ctx is not None:\n            try:\n                # try to close default SQLite context if needed\n                self.__jm_ctx.close()\n            except Exception:\n                pass\n\n    def __make_db_ctx(self) -> ExecutionContext:\n        \"\"\" Try to reuse context if allowed \"\"\"\n        try:\n            if not self.reuse_ctx:\n                return self.jmdict.ctx()\n            elif self.__jm_ctx is None and self.db_file and (self.db_file == \":memory:\" or os.path.isfile(self.db_file)):\n                self.__jm_ctx = self.jmdict.ctx()\n        except Exception:\n            getLogger().warning(\"JMdict data could not be accessed.\")\n        return self.__jm_ctx\n\n    @property\n    def db_file(self):\n        return self.__db_file\n\n    @db_file.setter\n    def db_file(self, value):\n        if self.auto_expand and value and value != ':memory:':\n            self.__db_file = os.path.abspath(os.path.expanduser(value))\n        else:\n            self.__db_file = value\n\n    @property\n    def kd2_file(self):\n        return self.__kd2_file\n\n    @kd2_file.setter\n    def kd2_file(self, value):\n        if self.auto_expand and value and value != ':memory:':\n            self.__kd2_file = os.path.abspath(os.path.expanduser(value))\n        else:\n            self.__kd2_file = value\n\n    @property\n    def jmnedict_file(self):\n        return self.__jmnedict_file\n\n    @jmnedict_file.setter\n    def jmnedict_file(self, value):\n        if self.auto_expand and value and value != ':memory:':\n            self.__jmnedict_file = os.path.abspath(os.path.expanduser(value))\n        else:\n            self.__jmnedict_file = value\n\n    @property\n    def memory_mode(self):\n        \"\"\" if memory_mode = True, Jamdict DB will be loaded into RAM before querying for better performance \"\"\"\n        return self.__memory_mode\n\n    @property\n    def jmdict(self):\n        if not self._db_sqlite and self.db_file:\n            with threading.Lock():\n                # Use 1 DB for all\n                if self.memory_mode and _MEMORY_MODE:\n                    data_source = MemorySource(self.db_file)\n                else:\n                    if self.memory_mode and not _MEMORY_MODE:\n                        logging.getLogger(__name__).error(\"Memory mode could not be enabled because puchikarui version is too old. Fallback to normal file DB mode\")\n                    data_source = self.db_file\n                self._db_sqlite = JamdictSQLite(data_source, auto_expand_path=self.auto_expand)\n        return self._db_sqlite\n\n    @property\n    def kd2(self):\n        if self._kd2_sqlite is None:\n            if self.kd2_file is not None and os.path.isfile(self.kd2_file):\n                with threading.Lock():\n                    if self.memory_mode and _MEMORY_MODE:\n                        data_source = MemorySource(self.kd2_file)\n                    else:\n                        if self.memory_mode and not _MEMORY_MODE:\n                            logging.getLogger(__name__).error(\"Memory mode could not be enabled because puchikarui version is too old. Fallback to normal file DB mode\")\n                        data_source = self.kd2_file\n                    self._kd2_sqlite = KanjiDic2SQLite(data_source, auto_expand_path=self.auto_expand)\n            elif not self.kd2_file or self.kd2_file == self.db_file:\n                self._kd2_sqlite = self.jmdict\n        return self._kd2_sqlite\n\n    @property\n    def jmnedict(self):\n        \"\"\" JM NE SQLite database access object \"\"\"\n        if self._jmne_sqlite is None:\n            if self.jmnedict_file is not None:\n                with threading.Lock():\n                    if self.memory_mode and _MEMORY_MODE:\n                        data_source = MemorySource(self.jmnedict_file)\n                    else:\n                        if self.memory_mode and not _MEMORY_MODE:\n                            logging.getLogger(__name__).error(\"Memory mode could not be enabled because puchikarui version is too old. Fallback to normal file DB mode\")\n                        data_source = self.jmnedict_file\n                    self._jmne_sqlite = JMNEDictSQLite(data_source, auto_expand_path=self.auto_expand)\n            elif not self.jmnedict_file or self.jmnedict_file == self.db_file:\n                self._jmne_sqlite = self.jmdict\n        return self._jmne_sqlite\n\n    @property\n    def jmdict_xml(self):\n        if not self._jmd_xml and self.jmd_xml_file:\n            with threading.Lock():\n                getLogger().info(\"Loading JMDict from XML file at {}\".format(self.jmd_xml_file))\n                self._jmd_xml = JMDictXML.from_file(self.jmd_xml_file)\n                getLogger().info(\"Loaded JMdict entries: {}\".format(len(self._jmd_xml)))\n        return self._jmd_xml\n\n    @property\n    def krad(self):\n        \"\"\" Break a kanji down to writing components\n\n        >>> jam = Jamdict()\n        >>> print(jam.krad['雲'])\n        ['一', '雨', '二', '厶']\n        \"\"\"\n        if not self.__krad_map:\n            with threading.Lock():\n                self.__krad_map = KRad()\n        return self.__krad_map.krad\n\n    @property\n    def radk(self):\n        \"\"\" Find all kanji with a writing component\n\n        >>> jam = Jamdict()\n        >>> print(jam.radk['鼎'])\n        {'鼏', '鼒', '鼐', '鼎', '鼑'}\n        \"\"\"\n        if not self.__krad_map:\n            with threading.Lock():\n                self.__krad_map = KRad()\n        return self.__krad_map.radk\n\n    @property\n    def kd2_xml(self):\n        if not self._kd2_xml and self.kd2_xml_file:\n            with threading.Lock():\n                getLogger().info(\"Loading KanjiDic2 from XML file at {}\".format(self.kd2_xml_file))\n                self._kd2_xml = KanjiDic2XML.from_file(self.kd2_xml_file)\n                getLogger().info(\"Loaded KanjiDic2 entries: {}\".format(len(self._kd2_xml)))\n        return self._kd2_xml\n\n    @property\n    def jmne_xml(self):\n        if not self._jmne_xml and self.jmnedict_xml_file:\n            with threading.Lock():\n                getLogger().info(\"Loading JMnedict from XML file at {}\".format(self.jmnedict_xml_file))\n                self._jmne_xml = JMNEDictXML.from_file(self.jmnedict_xml_file)\n                getLogger().info(\"Loaded JMnedict entries: {}\".format(len(self._jmne_xml)))\n        return self._jmne_xml\n\n    def has_kd2(self) -> bool:\n        return self.db_file is not None or self.kd2_file is not None or self.kd2_xml_file is not None\n\n    def has_jmne(self, ctx=None) -> bool:\n        \"\"\" Check if current database has jmne support \"\"\"\n        if ctx is None:\n            ctx = self.__make_db_ctx()\n        m = ctx.meta.select_single('key=?', ('jmnedict.version',)) if ctx is not None else None\n        return m is not None and len(m.value) > 0\n\n    def is_available(self) -> bool:\n        # this function is for developer only\n        # don't expose it to the public\n        # ready should be used instead\n        return (self.db_file is not None or self.jmd_xml_file is not None or\n                self.kd2_file is not None or self.kd2_xml_file is not None or\n                self.jmnedict_file is not None or self.jmnedict_xml_file is not None)\n\n    def import_data(self):\n        \"\"\" Import JMDict and KanjiDic2 data from XML to SQLite \"\"\"\n        if self.db_file and not os.path.exists(self.db_file):\n            Path(self.db_file).touch()\n        ctx = self.__make_db_ctx()\n        ctx.buckmode()\n        ctx.auto_commit = False\n        if self.jmdict and self.jmdict_xml:\n            getLogger().info(\"Importing JMDict data\")\n            self.jmdict.insert_entries(self.jmdict_xml, ctx=ctx)\n        # import KanjiDic2\n        if self.kd2_xml is not None and os.path.isfile(self.kd2_xml_file):\n            getLogger().info(\"Importing KanjiDic2 data\")\n            if self.jmdict is not None and self.kd2_file == self.db_file:\n                self.jmdict.insert_chars(self.kd2_xml, ctx=ctx)\n            elif self.kd2 is not None:\n                getLogger().warning(f\"Building Kanjidic2 DB using a different DB context {self.kd2_file} vs {self.db_file}\")\n                with self.kd2.ctx() as kd_ctx:\n                    self.kd2.insert_chars(self.kd2_xml, ctx=kd_ctx)\n            else:\n                getLogger().warning(f\"Kanjidic2 DB path could not be found\")\n        else:\n            print(f\"kd2_xml: {self.kd2_xml}\")\n            print(f\"kd2_xml_file: {self.kd2_xml_file}\")\n            getLogger().warning(\"KanjiDic2 XML data is not available - skipped!\")\n        # import JMNEdict\n        if self.jmne_xml is not None and os.path.isfile(self.jmnedict_xml_file):\n            getLogger().info(\"Importing JMNEdict data\")\n            if self.jmdict is not None and self.jmnedict_file == self.db_file:\n                self.jmnedict.insert_name_entities(self.jmne_xml, ctx=ctx)\n            elif self.jmnedict is not None:\n                getLogger().warning(f\"Building Kanjidic2 DB using a different DB context {self.jmne_file} vs {self.db_file}\")\n                with self.jmnedict.ctx() as ne_ctx:\n                    self.jmnedict.insert_name_entities(self.jmne_xml, ctx=ne_ctx)\n            else:\n                getLogger().warning(f\"JMNE DB path could not be found\")\n        else:\n            getLogger().warning(\"JMNEdict XML data is not available - skipped!\")\n        _buckmode_off = getattr(ctx, \"buckmode_off\", None)\n        if _buckmode_off is not None:\n            _buckmode_off()\n        ctx.commit()\n\n    def get_ne(self, idseq, ctx=None) -> JMDEntry:\n        \"\"\" Get name entity by idseq in JMNEdict \"\"\"\n        if self.jmnedict is not None:\n            if ctx is None:\n                ctx = self.__make_db_ctx()\n            return self.jmnedict.get_ne(idseq, ctx=ctx)\n        elif self.jmnedict_xml_file:\n            return self.jmne_xml.lookup(idseq)\n        else:\n            raise LookupError(\"There is no JMnedict data source available\")\n\n    def get_char(self, literal, ctx=None) -> Character:\n        if self.kd2 is not None:\n            if ctx is None:\n                ctx = self.__make_db_ctx()\n            return self.kd2.get_char(literal, ctx=ctx)\n        elif self.kd2_xml:\n            return self.kd2_xml.lookup(literal)\n        else:\n            raise LookupError(\"There is no KanjiDic2 data source available\")\n\n    def get_entry(self, idseq) -> JMDEntry:\n        if self.jmdict:\n            return self.jmdict.get_entry(idseq)\n        elif self.jmdict_xml:\n            return self.jmdict_xml.lookup(idseq)[0]\n        else:\n            raise LookupError(\"There is no backend data available\")\n\n    def all_pos(self, ctx=None) -> List[str]:\n        \"\"\" Find all available part-of-speeches\n\n        :returns: A list of part-of-speeches (a list of strings)\n        \"\"\"\n        if ctx is None:\n            ctx = self.__make_db_ctx()\n        return self.jmdict.all_pos(ctx=ctx)\n\n    def all_ne_type(self, ctx=None) -> List[str]:\n        \"\"\" Find all available named-entity types\n\n        :returns: A list of named-entity types (a list of strings)\n        \"\"\"\n        if ctx is None:\n            ctx = self.__make_db_ctx()\n        return self.jmnedict.all_ne_type(ctx=ctx)\n\n    def lookup(self, query, strict_lookup=False, lookup_chars=True, ctx=None,\n               lookup_ne=True, pos=None, **kwargs) -> LookupResult:\n        \"\"\" Search words, characters, and characters.\n\n        Keyword arguments:\n\n        :param query: Text to query, may contains wildcard characters. Use `?` for 1 exact character and `%` to match any number of characters.\n        :param strict_lookup: only look up the Kanji characters in query (i.e. discard characters from variants)\n        :type strict_lookup: bool\n        :param: lookup_chars: set lookup_chars to False to disable character lookup\n        :type lookup_chars: bool\n        :param pos: Filter words by part-of-speeches\n        :type pos: list of strings\n        :param ctx: database access context, can be reused for better performance. Normally users do not have to touch this and database connections will be reused by default.\n        :param lookup_ne: set lookup_ne to False to disable name-entities lookup\n        :type lookup_ne: bool\n        :returns: Return a LookupResult object.\n        :rtype: :class:`jamdict.util.LookupResult`\n\n        >>> # match any word that starts with \"食べ\" and ends with \"る\" (anything from between is fine)\n        >>> jam = Jamdict()\n        >>> results = jam.lookup('食べ%る')\n        \"\"\"\n        if not self.is_available():\n            raise LookupError(\"There is no backend data available\")\n        elif (not query or query == \"%\") and not pos:\n            raise ValueError(\"Query and POS filter cannot be both empty\")\n        if ctx is None:\n            ctx = self.__make_db_ctx()\n        entries = []\n        chars = []\n        names = []\n        if self.jmdict is not None:\n            entries = self.jmdict.search(query, pos=pos, ctx=ctx)\n        elif self.jmdict_xml:\n            entries = self.jmdict_xml.lookup(query)\n        if lookup_chars and self.has_kd2():\n            # lookup each character in query and kanji readings of each found entries\n            chars_to_search = OrderedDict({c: c for c in query})\n            if not strict_lookup and entries:\n                # auto add characters from entries\n                for e in entries:\n                    for k in e.kanji_forms:\n                        for c in k.text:\n                            if c not in HIRAGANA and c not in KATAKANA:\n                                chars_to_search[c] = c\n            for c in chars_to_search:\n                result = self.get_char(c, ctx=ctx)\n                if result is not None:\n                    chars.append(result)\n        # lookup name-entities\n        if lookup_ne and self.has_jmne(ctx=ctx):\n            names = self.jmnedict.search_ne(query, ctx=ctx)\n        # finish\n        return LookupResult(entries, chars, names)\n\n    def lookup_iter(self, query, strict_lookup=False,\n                    lookup_chars=True, lookup_ne=True,\n                    ctx=None, pos=None, **kwargs) -> LookupResult:\n        \"\"\" Search for words, characters, and characters iteratively.\n\n        An :class:`IterLookupResult` object will be returned instead of the normal ``LookupResult``.\n        ``res.entries``, ``res.chars``, ``res.names`` are iterators instead of lists and each of them\n        can only be looped through once. Users have to store the results manually.\n        \n        >>> res = jam.lookup_iter(\"花見\")\n        >>> for word in res.entries:\n        ...     print(word)  # do somethign with the word\n        >>> for c in res.chars:\n        ...     print(c)\n        >>> for name in res.names:\n        ...     print(name)\n\n        Keyword arguments:\n\n        :param query: Text to query, may contains wildcard characters. Use `?` for 1 exact character and `%` to match any number of characters.\n        :param strict_lookup: only look up the Kanji characters in query (i.e. discard characters from variants)\n        :type strict_lookup: bool\n        :param: lookup_chars: set lookup_chars to False to disable character lookup\n        :type lookup_chars: bool\n        :param pos: Filter words by part-of-speeches\n        :type pos: list of strings\n        :param ctx: database access context, can be reused for better performance. Normally users do not have to touch this and database connections will be reused by default.\n        :param lookup_ne: set lookup_ne to False to disable name-entities lookup\n        :type lookup_ne: bool\n        :returns: Return an IterLookupResult object.\n        :rtype: :class:`jamdict.util.IterLookupResult`\n        \"\"\"\n        if not self.is_available():\n            raise LookupError(\"There is no backend data available\")\n        elif (not query or query == \"%\") and not pos:\n            raise ValueError(\"Query and POS filter cannot be both empty\")\n        if ctx is None:\n            ctx = self.__make_db_ctx()\n        # Lookup entries, chars, and names\n        entries = None\n        chars = None\n        names = None\n        if self.jmdict is not None:\n            entries = self.jmdict.search_iter(query, pos=pos, ctx=ctx)\n        if lookup_chars and self.has_kd2():\n            chars_to_search = OrderedDict({c: c for c in query if c not in HIRAGANA and c not in KATAKANA})\n            chars = self.kd2.search_chars_iter(chars_to_search, ctx=ctx)\n        # lookup name-entities\n        if lookup_ne and self.has_jmne(ctx=ctx):\n            names = self.jmnedict.search_ne_iter(query, ctx=ctx)\n        # finish\n        return IterLookupResult(entries, chars, names)\n\n\nclass JMDictXML(object):\n    \"\"\" JMDict API for looking up information in XML\n    \"\"\"\n    def __init__(self, entries):\n        self.entries = entries\n        self._seqmap = {}  # entryID - entryObj map\n        self._textmap = dd(set)\n        # compile map\n        for entry in self.entries:\n            self._seqmap[entry.idseq] = entry\n            for kn in entry.kana_forms:\n                self._textmap[kn.text].add(entry)\n            for kj in entry.kanji_forms:\n                self._textmap[kj.text].add(entry)\n\n    def __len__(self):\n        return len(self.entries)\n\n    def __getitem__(self, idx):\n        return self.entries[idx]\n\n    def lookup(self, a_query) -> Sequence[JMDEntry]:\n        if a_query in self._textmap:\n            return tuple(self._textmap[a_query])\n        elif a_query.startswith('id#'):\n            entry_id = a_query[3:]\n            if entry_id in self._seqmap:\n                return (self._seqmap[entry_id],)\n        # found nothing\n        return ()\n\n    @staticmethod\n    def from_file(filename):\n        parser = JMDictXMLParser()\n        return JMDictXML(parser.parse_file(os.path.abspath(os.path.expanduser(filename))))\n\n\nclass JMNEDictXML(JMDictXML):\n    pass\n\n\nclass KanjiDic2XML(object):\n\n    def __init__(self, kd2):\n        \"\"\"\n        \"\"\"\n        self.kd2 = kd2\n        self.char_map = {}\n        for char in self.kd2:\n            if char.literal in self.char_map:\n                getLogger().warning(\"Duplicate character entry: {}\".format(char.literal))\n            self.char_map[char.literal] = char\n\n    def __len__(self):\n        return len(self.kd2)\n\n    def __getitem__(self, idx):\n        return self.kd2[idx]\n\n    def lookup(self, char):\n        if char in self.char_map:\n            return self.char_map[char]\n        else:\n            return None\n\n    @staticmethod\n    def from_file(filename):\n        parser = Kanjidic2XMLParser()\n        return KanjiDic2XML(parser.parse_file(filename))\n"
  },
  {
    "path": "jamdict_demo.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\"\"\"\nJamdict demo application\n\nLatest version can be found at https://github.com/neocl/jamdict\n\nThis package uses the [EDICT][1] and [KANJIDIC][2] dictionary files.\nThese files are the property of the [Electronic Dictionary Research and Development Group][3], and are used in conformance with the Group's [licence][4].\n\n[1]: http://www.csse.monash.edu.au/~jwb/edict.html\n[2]: http://www.csse.monash.edu.au/~jwb/kanjidic.html\n[3]: http://www.edrdg.org/\n[4]: http://www.edrdg.org/edrdg/licence.html\n\nReferences:\n    JMDict website:\n        http://www.csse.monash.edu.au/~jwb/edict.html\n\"\"\"\n\n# Copyright (c) 2016, Le Tuan Anh <tuananh.ke@gmail.com>\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n\n########################################################################\n\nimport json\nfrom jamdict import Jamdict\n\n########################################################################\n\n# Create an instance of Jamdict\njam = Jamdict()\nprint(\"Jamdict DB file: {}\".format(jam.db_file))\n\nif not jam.ready:\n    print(\"\"\"Jamdict DB is not available. Database can be installed via PyPI:\n\n    pip install jamdict-data\n\nOr downloaded from: https://jamdict.readthedocs.io/en/latest/install.html\nTo create a config file, run:\n\n    python3 -m jamdict config\n\nProgram aborted.\"\"\")\n    exit()\n\n# Lookup by kana\nresult = jam.lookup('おかえし')\nfor entry in result.entries:\n    print(entry)\n\n# Lookup by kanji\nprint(\"-----------------\")\nresult = jam.lookup('御土産')\nfor entry in result.entries:\n    print(entry)\n\n# Lookup a name\n# a name entity is also a jamdict.jmdict.JMDEntry object\n# excep that the senses is a list of Translation objects instead of Sense objects\nprint(\"-----------------\")\nif jam.has_jmne():\n    result = jam.lookup('鈴木')\n    for name in result.names:\n        print(name)\n\n# Use wildcard matching\n# Find all names ends with -jida\nprint(\"-----------------\")\nresult = jam.lookup('%じだ')\nfor name in result.names:\n    print(name)\n\n# ------------------------------------------------------------------------------\n# lookup entry by idseq\nprint(\"---------------------\")\notenki = jam.lookup('id#1002470').entries[0]\n# extract all kana forms\nkana_forms = ' '.join([x.text for x in otenki.kana_forms])\n# extract all kanji forms\nkanji_forms = ' '.join([x.text for x in otenki.kanji_forms])\nprint(\"Entry #{id}: Kanji: {kj} - Kana: {kn}\".format(id=otenki.idseq, kj=kanji_forms, kn=kana_forms))\n\n# extract all sense glosses\nfor idx, sense in enumerate(otenki):\n    print(\"{i}. {s}\".format(i=idx, s=sense))\n\n# Look up radical & writing components of kanji characters\n# 1. Lookup kanji's components\nprint(\"---------------------\")\nresult = jam.lookup('筋斗雲')\nfor c in result.chars:\n    meanings = ', '.join(c.meanings())\n    # has components\n    print(f\"{c}: {meanings}\")\n    print(f\"    Radical: {c.radical}\")\n    print(f\"    Components: {c.components}\")\n\n# 2. Lookup kanjis by component\nprint(\"---------------------\")\nchars = jam.radk['鼎']  # this returns a list of strings (each string is the literal of a character)\nresult = jam.lookup(''.join(chars))\nfor c in result.chars:\n    meanings = ', '.join(c.meanings())\n    # has components\n    print(f\"{c}: {meanings}\")\n    print(f\"    Radical: {c.radical}\")\n    print(f\"    Components: {c.components}\")\n\n# using JSON\nprint(\"---------------------\")\nresult = jam.lookup('こうしえん')\nprint(result.text(separator='\\n'))\nprint(\"---------------------\")\notenki_dict = result.to_json()  # get a dict structure to produce a JSON string\njson_string = json.dumps(otenki_dict, ensure_ascii=False, indent=2)\nprint(json_string)\n"
  },
  {
    "path": "jamdol-flask.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\"\"\"\njamdol - JAMDict OnLine (REST server)\nLatest version can be found at https://github.com/neocl/jamdict\n\"\"\"\n\n# Copyright (c) 2017, Le Tuan Anh <tuananh.ke@gmail.com>\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n\n\nimport json\nimport logging\nimport flask\nfrom flask import Flask, Response\nfrom functools import wraps\nfrom flask import request\n\nfrom chirptext.cli import setup_logging\n\nfrom jamdict import Jamdict\nfrom jamdict import __version__\n\n# ---------------------------------------------------------------------\n# CONFIGURATION\n# ---------------------------------------------------------------------\n\nsetup_logging('logging.json', 'logs')\napp = Flask(__name__, static_url_path=\"\")\njmd = Jamdict()\n\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\n# ---------------------------------------------------------------------\n# Helpers\n# ---------------------------------------------------------------------\n\ndef jsonp(func):\n    @wraps(func)\n    def decorated_function(*args, **kwargs):\n        data = func(*args, **kwargs)\n        callback = request.args.get('callback', False)\n        if callback:\n            content = \"{}({})\".format(callback, json.dumps(data))\n            return Response(content, mimetype=\"application/javascript\")\n        else:\n            content = json.dumps(data)\n            return Response(content, mimetype=\"application/json\")\n    return decorated_function\n\n\n# ---------------------------------------------------------------------\n# Views\n# ---------------------------------------------------------------------\n\n@app.route('/jamdol/entry/<idseq>', methods=['GET'])\n@jsonp\ndef get_entry(idseq):\n    results = {'entries': [jmd.get_entry(idseq).to_json()], 'chars': []}\n    return results\n\n\n@app.route('/jamdol/search/<query>', methods=['GET'])\n@app.route('/jamdol/search/<strict>/<query>', methods=['GET'])\n@jsonp\ndef search(query, strict=None):\n    getLogger().info(\"Query = {}\".format(query))\n    results = jmd.lookup(query, strict_lookup=strict)\n    return results.to_json()\n\n\n@app.route('/jamdol/', methods=['GET'])\ndef index():\n    return Response('jamdol {jd} - jamdol-flask/Flask-{fv}'.format(jd=__version__, fv=flask.__version__), mimetype='text/html')\n\n\n@app.route('/jamdol/version', methods=['GET'])\n@jsonp\ndef version():\n    return {'product': 'jamdol',\n            'version': __version__,\n            'server': 'jamdol-flask/Flask-{}'.format(flask.__version__)}\n\n\n# ---------------------------------------------------------------------\n# Views\n# ---------------------------------------------------------------------\n\nif __name__ == '__main__':\n    app.run()\n"
  },
  {
    "path": "jmd",
    "content": "#!/bin/bash\n\nexport JAMDICT_HOME=~/local/jamdict\ncd ${JAMDICT_HOME}\npython3 -m jamdict.tools lookup \"$@\"\n\n"
  },
  {
    "path": "logging.json",
    "content": "{\n    \"version\": 1,\n    \"disable_existing_loggers\": false,\n    \"formatters\": {\n        \"simple\": {\n            \"format\": \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\"\n        }\n    },\n    \n    \"handlers\": {\n        \"console\": {\n            \"class\": \"logging.StreamHandler\",\n            \"level\": \"DEBUG\",\n            \"formatter\": \"simple\",\n            \"stream\": \"ext://sys.stdout\"\n        },\n\n        \"file_handler_important\": {\n            \"class\": \"logging.handlers.RotatingFileHandler\",\n            \"level\": \"WARNING\",\n            \"formatter\": \"simple\",\n            \"filename\": \"logs/logging_important.log\",\n            \"maxBytes\": 1000000,\n            \"backupCount\": 20,\n            \"encoding\": \"utf8\"\n        },\n\n        \"file_handler_verbose\": {\n            \"class\": \"logging.handlers.RotatingFileHandler\",\n            \"level\": \"DEBUG\",\n            \"formatter\": \"simple\",\n            \"filename\": \"logs/logging_details.log\",\n            \"maxBytes\": 1000000,\n            \"backupCount\": 20,\n            \"encoding\": \"utf8\"\n        }\n\n    },\n\n    \"loggers\": {\n        \"__main__\": {\n            \"level\": \"INFO\",\n            \"handlers\": [\"file_handler_verbose\"],\n            \"propagate\": \"no\"\n        },\n        \"jamdol-flask\": { \"level\": \"INFO\" }\n        ,\n        \"jamdict.util\": {\n          \"level\": \"INFO\"\n        },\n        \"jamdict.jmdict_sqlite\": {\n          \"level\": \"ERROR\"\n        },\n        \"chirptext.dekomecab\": {\n          \"level\": \"ERROR\"\n        }\n    },\n\n    \"root\": {\n        \"level\": \"WARNING\",\n        \"handlers\": [\"console\", \"file_handler_important\"]\n    }\n}\n"
  },
  {
    "path": "release.sh",
    "content": "#!/bin/bash\n\n# pandoc --from=markdown --to=rst README.md -o README.rst\npython3 setup.py sdist\n"
  },
  {
    "path": "requirements.txt",
    "content": "chirptext >= 0.1, <= 0.2\npuchikarui >= 0.1, < 0.3\n\n"
  },
  {
    "path": "run",
    "content": "#!/bin/bash\n\nexport FLASK_APP=jamdol-flask.py\nflask run --port 5002\n"
  },
  {
    "path": "setup.py",
    "content": "#!/usr/bin/env python3\r\n# -*- coding: utf-8 -*-\r\n\r\n'''\r\nSetup script for jamdict\r\n\r\nLatest version can be found at https://github.com/neocl/jamdict\r\n\r\n:copyright: (c) 2012 Le Tuan Anh <tuananh.ke@gmail.com>\r\n:license: MIT, see LICENSE for more details.\r\n'''\r\n\r\nimport io\r\nfrom setuptools import setup\r\n\r\n\r\ndef read(*filenames, **kwargs):\r\n    ''' Read contents of multiple files and join them together '''\r\n    encoding = kwargs.get('encoding', 'utf-8')\r\n    sep = kwargs.get('sep', '\\n')\r\n    buf = []\r\n    for filename in filenames:\r\n        with io.open(filename, encoding=encoding) as f:\r\n            buf.append(f.read())\r\n    return sep.join(buf)\r\n\r\n\r\n# readme_file = 'README.rst' if os.path.isfile('README.rst') else 'README.md'\r\nreadme_file = 'README.md'\r\nlong_description = read(readme_file)\r\npkg_info = {}\r\nexec(read('jamdict/__version__.py'), pkg_info)\r\n\r\n\r\nwith open('requirements.txt', 'r') as infile:\r\n    requirements = infile.read().splitlines()\r\n    print(requirements)\r\n\r\n\r\nsetup(\r\n    name='jamdict',  # package file name (<package-name>-version.tar.gz)\r\n    version=pkg_info['__version__'],\r\n    url=pkg_info['__url__'],\r\n    project_urls={\r\n        \"Bug Tracker\": \"https://github.com/neocl/jamdict/issues\",\r\n        \"Source Code\": \"https://github.com/neocl/jamdict/\"\r\n    },\r\n    keywords=['dictionary', 'japanese', 'kanji', 'japanese-language', 'jmdict', 'japanese-study', 'kanjidic2', 'japanese-dictionary', 'jamdict'],\r\n    license=pkg_info['__license__'],\r\n    author=pkg_info['__author__'],\r\n    tests_require=requirements,\r\n    install_requires=requirements,\r\n    python_requires=\">=3.6\",\r\n    author_email=pkg_info['__email__'],\r\n    description=pkg_info['__description__'],\r\n    long_description=long_description,\r\n    long_description_content_type='text/markdown',\r\n    packages=['jamdict'],\r\n    package_data={'jamdict': ['data/*.sql', 'data/*.json', 'data/*.gz']},\r\n    include_package_data=True,\r\n    platforms='any',\r\n    test_suite='test',\r\n    # Reference: https://pypi.python.org/pypi?%3Aaction=list_classifiers\r\n    classifiers=['Programming Language :: Python :: 3',\r\n                 'Programming Language :: Python :: 3.6',\r\n                 'Programming Language :: Python :: 3.7',\r\n                 'Programming Language :: Python :: 3.8',\r\n                 'Programming Language :: Python :: 3.9',\r\n                 'Development Status :: {}'.format(pkg_info['__status__']),\r\n                 'Natural Language :: Japanese',\r\n                 'Natural Language :: English',\r\n                 'Environment :: Plugins',\r\n                 'Intended Audience :: Developers',\r\n                 'License :: OSI Approved :: {}'.format(pkg_info['__license__']),\r\n                 'Operating System :: OS Independent',\r\n                 'Topic :: Database',\r\n                 'Topic :: Text Processing :: Linguistic',\r\n                 'Topic :: Software Development :: Libraries :: Python Modules']\r\n)\r\n"
  },
  {
    "path": "test/__init__.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\" Jamdict Test Scripts\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport os\nfrom chirptext.cli import setup_logging\n\nTEST_DIR = os.path.abspath(os.path.dirname(__file__))\nTEST_DATA = os.path.join(TEST_DIR, 'data')\nsetup_logging(os.path.join(TEST_DIR, 'logging.json'), os.path.join(TEST_DIR, 'logs'))\n"
  },
  {
    "path": "test/data/JMdict_mini.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE JMdict [\n<!ELEMENT JMdict (entry*)>\n<!--                                                                   -->\n<!ELEMENT entry (ent_seq, k_ele*, r_ele+, sense+)>\n\t<!-- Entries consist of kanji elements, reading elements, \n\tgeneral information and sense elements. Each entry must have at \n\tleast one reading element and one sense element. Others are optional.\n\t-->\n<!ELEMENT ent_seq (#PCDATA)>\n\t<!-- A unique numeric sequence number for each entry\n\t-->\n<!ELEMENT k_ele (keb, ke_inf*, ke_pri*)>\n\t<!-- The kanji element, or in its absence, the reading element, is \n\tthe defining component of each entry.\n\tThe overwhelming majority of entries will have a single kanji\n\telement associated with a word in Japanese. Where there are \n\tmultiple kanji elements within an entry, they will be orthographical\n\tvariants of the same word, either using variations in okurigana, or\n\talternative and equivalent kanji. Common \"mis-spellings\" may be \n\tincluded, provided they are associated with appropriate information\n\tfields. Synonyms are not included; they may be indicated in the\n\tcross-reference field associated with the sense element.\n\t-->\n<!ELEMENT keb (#PCDATA)>\n\t<!-- This element will contain a word or short phrase in Japanese \n\twhich is written using at least one non-kana character (usually kanji,\n\tbut can be other characters). The valid characters are\n\tkanji, kana, related characters such as chouon and kurikaeshi, and\n\tin exceptional cases, letters from other alphabets.\n\t-->\n<!ELEMENT ke_inf (#PCDATA)>\n\t<!-- This is a coded information field related specifically to the \n\torthography of the keb, and will typically indicate some unusual\n\taspect, such as okurigana irregularity.\n\t-->\n<!ELEMENT ke_pri (#PCDATA)>\n\t<!-- This and the equivalent re_pri field are provided to record\n\tinformation about the relative priority of the entry,  and consist\n\tof codes indicating the word appears in various references which\n\tcan be taken as an indication of the frequency with which the word\n\tis used. This field is intended for use either by applications which \n\twant to concentrate on entries of  a particular priority, or to \n\tgenerate subset files. \n\tThe current values in this field are:\n\t- news1/2: appears in the \"wordfreq\" file compiled by Alexandre Girardi\n\tfrom the Mainichi Shimbun. (See the Monash ftp archive for a copy.)\n\tWords in the first 12,000 in that file are marked \"news1\" and words \n\tin the second 12,000 are marked \"news2\".\n\t- ichi1/2: appears in the \"Ichimango goi bunruishuu\", Senmon Kyouiku \n\tPublishing, Tokyo, 1998.  (The entries marked \"ichi2\" were\n\tdemoted from ichi1 because they were observed to have low\n\tfrequencies in the WWW and newspapers.)\n\t- spec1 and spec2: a small number of words use this marker when they \n\tare detected as being common, but are not included in other lists.\n\t- gai1/2: common loanwords, based on the wordfreq file.\n\t- nfxx: this is an indicator of frequency-of-use ranking in the\n\twordfreq file. \"xx\" is the number of the set of 500 words in which\n\tthe entry can be found, with \"01\" assigned to the first 500, \"02\"\n\tto the second, and so on. (The entries with news1, ichi1, spec1 and \n\tgai1 values are marked with a \"(P)\" in the EDICT and EDICT2\n\tfiles.)\n\n\tThe reason both the kanji and reading elements are tagged is because \n\ton occasions a priority is only associated with a particular\n\tkanji/reading pair.\n\t-->\n<!--                                                                   -->\n<!ELEMENT r_ele (reb, re_nokanji?, re_restr*, re_inf*, re_pri*)>\n\t<!-- The reading element typically contains the valid readings\n\tof the word(s) in the kanji element using modern kanadzukai. \n\tWhere there are multiple reading elements, they will typically be\n\talternative readings of the kanji element. In the absence of a \n\tkanji element, i.e. in the case of a word or phrase written\n\tentirely in kana, these elements will define the entry.\n\t-->\n<!ELEMENT reb (#PCDATA)>\n\t<!-- this element content is restricted to kana and related\n\tcharacters such as chouon and kurikaeshi. Kana usage will be\n\tconsistent between the keb and reb elements; e.g. if the keb\n\tcontains katakana, so too will the reb.\n\t-->\n<!ELEMENT re_nokanji (#PCDATA)>\n\t<!-- This element, which will usually have a null value, indicates\n\tthat the reb, while associated with the keb, cannot be regarded\n\tas a true reading of the kanji. It is typically used for words\n\tsuch as foreign place names, gairaigo which can be in kanji or\n\tkatakana, etc.\n\t-->\n<!ELEMENT re_restr (#PCDATA)>\n\t<!-- This element is used to indicate when the reading only applies\n\tto a subset of the keb elements in the entry. In its absence, all\n\treadings apply to all kanji elements. The contents of this element \n\tmust exactly match those of one of the keb elements.\n\t-->\n<!ELEMENT re_inf (#PCDATA)>\n\t<!-- General coded information pertaining to the specific reading.\n\tTypically it will be used to indicate some unusual aspect of \n\tthe reading. -->\n<!ELEMENT re_pri (#PCDATA)>\n\t<!-- See the comment on ke_pri above. -->\n<!--                                                                   -->\n<!ELEMENT sense (stagk*, stagr*, pos*, xref*, ant*, field*, misc*, s_inf*, lsource*, dial*, gloss*)>\n\t<!-- The sense element will record the translational equivalent\n\tof the Japanese word, plus other related information. Where there\n\tare several distinctly different meanings of the word, multiple\n\tsense elements will be employed.\n\t-->\n<!ELEMENT stagk (#PCDATA)>\n<!ELEMENT stagr (#PCDATA)>\n\t<!-- These elements, if present, indicate that the sense is restricted\n\tto the lexeme represented by the keb and/or reb. -->\n<!ELEMENT xref (#PCDATA)*>\n\t<!-- This element is used to indicate a cross-reference to another\n\tentry with a similar or related meaning or sense. The content of\n\tthis element is typically a keb or reb element in another entry. In some\n\tcases a keb will be followed by a reb and/or a sense number to provide\n\ta precise target for the cross-reference. Where this happens, a JIS\n\t\"centre-dot\" (0x2126) is placed between the components of the \n\tcross-reference.\n\t-->\n<!ELEMENT ant (#PCDATA)*>\n\t<!-- This element is used to indicate another entry which is an\n\tantonym of the current entry/sense. The content of this element\n\tmust exactly match that of a keb or reb element in another entry.\n\t-->\n<!ELEMENT pos (#PCDATA)>\n\t<!-- Part-of-speech information about the entry/sense. Should use \n\tappropriate entity codes. In general where there are multiple senses\n\tin an entry, the part-of-speech of an earlier sense will apply to\n\tlater senses unless there is a new part-of-speech indicated.\n\t-->\n<!ELEMENT field (#PCDATA)>\n\t<!-- Information about the field of application of the entry/sense. \n\tWhen absent, general application is implied. Entity coding for \n\tspecific fields of application. -->\n<!ELEMENT misc (#PCDATA)>\n\t<!-- This element is used for other relevant information about \n\tthe entry/sense. As with part-of-speech, information will usually\n\tapply to several senses.\n\t-->\n<!ELEMENT lsource (#PCDATA)>\n\t<!-- This element records the information about the source\n\tlanguage(s) of a loan-word/gairaigo. If the source language is other \n\tthan English, the language is indicated by the xml:lang attribute.\n\tThe element value (if any) is the source word or phrase.\n\t-->\n<!ATTLIST lsource xml:lang CDATA \"eng\">\n\t<!-- The xml:lang attribute defines the language(s) from which\n\ta loanword is drawn.  It will be coded using the three-letter language \n\tcode from the ISO 639-2 standard. When absent, the value \"eng\" (i.e. \n\tEnglish) is the default value. The bibliographic (B) codes are used. -->\n<!ATTLIST lsource ls_type CDATA #IMPLIED>\n\t<!-- The ls_type attribute indicates whether the lsource element\n\tfully or partially describes the source word or phrase of the\n\tloanword. If absent, it will have the implied value of \"full\".\n\tOtherwise it will contain \"part\".  -->\n<!ATTLIST lsource ls_wasei CDATA #IMPLIED>\n\t<!-- The ls_wasei attribute indicates that the Japanese word\n\thas been constructed from words in the source language, and\n\tnot from an actual phrase in that language. Most commonly used to\n\tindicate \"waseieigo\". -->\n<!ELEMENT dial (#PCDATA)>\n\t<!-- For words specifically associated with regional dialects in\n\tJapanese, the entity code for that dialect, e.g. ksb for Kansaiben.\n\t-->\n<!ELEMENT gloss (#PCDATA | pri)*>\n\t<!-- Within each sense will be one or more \"glosses\", i.e. \n\ttarget-language words or phrases which are equivalents to the \n\tJapanese word. This element would normally be present, however it \n\tmay be omitted in entries which are purely for a cross-reference.\n\t-->\n<!ATTLIST gloss xml:lang CDATA \"eng\">\n\t<!-- The xml:lang attribute defines the target language of the\n\tgloss. It will be coded using the three-letter language code from\n\tthe ISO 639 standard. When absent, the value \"eng\" (i.e. English)\n\tis the default value. -->\n<!ATTLIST gloss g_gend CDATA #IMPLIED>\n\t<!-- The g_gend attribute defines the gender of the gloss (typically\n\ta noun in the target language. When absent, the gender is either\n\tnot relevant or has yet to be provided.\n\t-->\n<!ELEMENT pri (#PCDATA)>\n\t<!-- These elements highlight particular target-language words which \n\tare strongly associated with the Japanese word. The purpose is to \n\testablish a set of target-language words which can effectively be \n\tused as head-words in a reverse target-language/Japanese relationship.\n\t-->\n<!ELEMENT s_inf (#PCDATA)>\n\t<!-- The sense-information elements provided for additional\n\tinformation to be recorded about a sense. Typical usage would\n\tbe to indicate such things as level of currency of a sense, the\n\tregional variations, etc.\n\t-->\n<!-- The following entity codes are used for common elements within the\nvarious information fields.\n-->\n<!ENTITY MA \"martial arts term\">\n<!ENTITY X \"rude or X-rated term (not displayed in educational software)\">\n<!ENTITY abbr \"abbreviation\">\n<!ENTITY adj-i \"adjective (keiyoushi)\">\n<!ENTITY adj-ix \"adjective (keiyoushi) - yoi/ii class\">\n<!ENTITY adj-na \"adjectival nouns or quasi-adjectives (keiyodoshi)\">\n<!ENTITY adj-no \"nouns which may take the genitive case particle `no'\">\n<!ENTITY adj-pn \"pre-noun adjectival (rentaishi)\">\n<!ENTITY adj-t \"`taru' adjective\">\n<!ENTITY adj-f \"noun or verb acting prenominally\">\n<!ENTITY adv \"adverb (fukushi)\">\n<!ENTITY adv-to \"adverb taking the `to' particle\">\n<!ENTITY arch \"archaism\">\n<!ENTITY ateji \"ateji (phonetic) reading\">\n<!ENTITY aux \"auxiliary\">\n<!ENTITY aux-v \"auxiliary verb\">\n<!ENTITY aux-adj \"auxiliary adjective\">\n<!ENTITY Buddh \"Buddhist term\">\n<!ENTITY chem \"chemistry term\">\n<!ENTITY chn \"children's language\">\n<!ENTITY col \"colloquialism\">\n<!ENTITY comp \"computer terminology\">\n<!ENTITY conj \"conjunction\">\n<!ENTITY cop-da \"copula\">\n<!ENTITY ctr \"counter\">\n<!ENTITY derog \"derogatory\">\n<!ENTITY eK \"exclusively kanji\">\n<!ENTITY ek \"exclusively kana\">\n<!ENTITY exp \"expressions (phrases, clauses, etc.)\">\n<!ENTITY fam \"familiar language\">\n<!ENTITY fem \"female term or language\">\n<!ENTITY food \"food term\">\n<!ENTITY geom \"geometry term\">\n<!ENTITY gikun \"gikun (meaning as reading) or jukujikun (special kanji reading)\">\n<!ENTITY hon \"honorific or respectful (sonkeigo) language\">\n<!ENTITY hum \"humble (kenjougo) language\">\n<!ENTITY iK \"word containing irregular kanji usage\">\n<!ENTITY id \"idiomatic expression\">\n<!ENTITY ik \"word containing irregular kana usage\">\n<!ENTITY int \"interjection (kandoushi)\">\n<!ENTITY io \"irregular okurigana usage\">\n<!ENTITY iv \"irregular verb\">\n<!ENTITY ling \"linguistics terminology\">\n<!ENTITY m-sl \"manga slang\">\n<!ENTITY male \"male term or language\">\n<!ENTITY male-sl \"male slang\">\n<!ENTITY math \"mathematics\">\n<!ENTITY mil \"military\">\n<!ENTITY n \"noun (common) (futsuumeishi)\">\n<!ENTITY n-adv \"adverbial noun (fukushitekimeishi)\">\n<!ENTITY n-suf \"noun, used as a suffix\">\n<!ENTITY n-pref \"noun, used as a prefix\">\n<!ENTITY n-t \"noun (temporal) (jisoumeishi)\">\n<!ENTITY num \"numeric\">\n<!ENTITY oK \"word containing out-dated kanji\">\n<!ENTITY obs \"obsolete term\">\n<!ENTITY obsc \"obscure term\">\n<!ENTITY ok \"out-dated or obsolete kana usage\">\n<!ENTITY oik \"old or irregular kana form\">\n<!ENTITY on-mim \"onomatopoeic or mimetic word\">\n<!ENTITY pn \"pronoun\">\n<!ENTITY poet \"poetical term\">\n<!ENTITY pol \"polite (teineigo) language\">\n<!ENTITY pref \"prefix\">\n<!ENTITY proverb \"proverb\">\n<!ENTITY prt \"particle\">\n<!ENTITY physics \"physics terminology\">\n<!ENTITY rare \"rare\">\n<!ENTITY sens \"sensitive\">\n<!ENTITY sl \"slang\">\n<!ENTITY suf \"suffix\">\n<!ENTITY uK \"word usually written using kanji alone\">\n<!ENTITY uk \"word usually written using kana alone\">\n<!ENTITY unc \"unclassified\">\n<!ENTITY yoji \"yojijukugo\">\n<!ENTITY v1 \"Ichidan verb\">\n<!ENTITY v1-s \"Ichidan verb - kureru special class\">\n<!ENTITY v2a-s \"Nidan verb with 'u' ending (archaic)\">\n<!ENTITY v4h \"Yodan verb with `hu/fu' ending (archaic)\">\n<!ENTITY v4r \"Yodan verb with `ru' ending (archaic)\">\n<!ENTITY v5aru \"Godan verb - -aru special class\">\n<!ENTITY v5b \"Godan verb with `bu' ending\">\n<!ENTITY v5g \"Godan verb with `gu' ending\">\n<!ENTITY v5k \"Godan verb with `ku' ending\">\n<!ENTITY v5k-s \"Godan verb - Iku/Yuku special class\">\n<!ENTITY v5m \"Godan verb with `mu' ending\">\n<!ENTITY v5n \"Godan verb with `nu' ending\">\n<!ENTITY v5r \"Godan verb with `ru' ending\">\n<!ENTITY v5r-i \"Godan verb with `ru' ending (irregular verb)\">\n<!ENTITY v5s \"Godan verb with `su' ending\">\n<!ENTITY v5t \"Godan verb with `tsu' ending\">\n<!ENTITY v5u \"Godan verb with `u' ending\">\n<!ENTITY v5u-s \"Godan verb with `u' ending (special class)\">\n<!ENTITY v5uru \"Godan verb - Uru old class verb (old form of Eru)\">\n<!ENTITY vz \"Ichidan verb - zuru verb (alternative form of -jiru verbs)\">\n<!ENTITY vi \"intransitive verb\">\n<!ENTITY vk \"Kuru verb - special class\">\n<!ENTITY vn \"irregular nu verb\">\n<!ENTITY vr \"irregular ru verb, plain form ends with -ri\">\n<!ENTITY vs \"noun or participle which takes the aux. verb suru\">\n<!ENTITY vs-c \"su verb - precursor to the modern suru\">\n<!ENTITY vs-s \"suru verb - special class\">\n<!ENTITY vs-i \"suru verb - irregular\">\n<!ENTITY kyb \"Kyoto-ben\">\n<!ENTITY osb \"Osaka-ben\">\n<!ENTITY ksb \"Kansai-ben\">\n<!ENTITY ktb \"Kantou-ben\">\n<!ENTITY tsb \"Tosa-ben\">\n<!ENTITY thb \"Touhoku-ben\">\n<!ENTITY tsug \"Tsugaru-ben\">\n<!ENTITY kyu \"Kyuushuu-ben\">\n<!ENTITY rkb \"Ryuukyuu-ben\">\n<!ENTITY nab \"Nagano-ben\">\n<!ENTITY hob \"Hokkaido-ben\">\n<!ENTITY vt \"transitive verb\">\n<!ENTITY vulg \"vulgar expression or word\">\n<!ENTITY adj-kari \"`kari' adjective (archaic)\">\n<!ENTITY adj-ku \"`ku' adjective (archaic)\">\n<!ENTITY adj-shiku \"`shiku' adjective (archaic)\">\n<!ENTITY adj-nari \"archaic/formal form of na-adjective\">\n<!ENTITY n-pr \"proper noun\">\n<!ENTITY v-unspec \"verb unspecified\">\n<!ENTITY v4k \"Yodan verb with `ku' ending (archaic)\">\n<!ENTITY v4g \"Yodan verb with `gu' ending (archaic)\">\n<!ENTITY v4s \"Yodan verb with `su' ending (archaic)\">\n<!ENTITY v4t \"Yodan verb with `tsu' ending (archaic)\">\n<!ENTITY v4n \"Yodan verb with `nu' ending (archaic)\">\n<!ENTITY v4b \"Yodan verb with `bu' ending (archaic)\">\n<!ENTITY v4m \"Yodan verb with `mu' ending (archaic)\">\n<!ENTITY v2k-k \"Nidan verb (upper class) with `ku' ending (archaic)\">\n<!ENTITY v2g-k \"Nidan verb (upper class) with `gu' ending (archaic)\">\n<!ENTITY v2t-k \"Nidan verb (upper class) with `tsu' ending (archaic)\">\n<!ENTITY v2d-k \"Nidan verb (upper class) with `dzu' ending (archaic)\">\n<!ENTITY v2h-k \"Nidan verb (upper class) with `hu/fu' ending (archaic)\">\n<!ENTITY v2b-k \"Nidan verb (upper class) with `bu' ending (archaic)\">\n<!ENTITY v2m-k \"Nidan verb (upper class) with `mu' ending (archaic)\">\n<!ENTITY v2y-k \"Nidan verb (upper class) with `yu' ending (archaic)\">\n<!ENTITY v2r-k \"Nidan verb (upper class) with `ru' ending (archaic)\">\n<!ENTITY v2k-s \"Nidan verb (lower class) with `ku' ending (archaic)\">\n<!ENTITY v2g-s \"Nidan verb (lower class) with `gu' ending (archaic)\">\n<!ENTITY v2s-s \"Nidan verb (lower class) with `su' ending (archaic)\">\n<!ENTITY v2z-s \"Nidan verb (lower class) with `zu' ending (archaic)\">\n<!ENTITY v2t-s \"Nidan verb (lower class) with `tsu' ending (archaic)\">\n<!ENTITY v2d-s \"Nidan verb (lower class) with `dzu' ending (archaic)\">\n<!ENTITY v2n-s \"Nidan verb (lower class) with `nu' ending (archaic)\">\n<!ENTITY v2h-s \"Nidan verb (lower class) with `hu/fu' ending (archaic)\">\n<!ENTITY v2b-s \"Nidan verb (lower class) with `bu' ending (archaic)\">\n<!ENTITY v2m-s \"Nidan verb (lower class) with `mu' ending (archaic)\">\n<!ENTITY v2y-s \"Nidan verb (lower class) with `yu' ending (archaic)\">\n<!ENTITY v2r-s \"Nidan verb (lower class) with `ru' ending (archaic)\">\n<!ENTITY v2w-s \"Nidan verb (lower class) with `u' ending and `we' conjugation (archaic)\">\n<!ENTITY archit \"architecture term\">\n<!ENTITY astron \"astronomy, etc. term\">\n<!ENTITY baseb \"baseball term\">\n<!ENTITY biol \"biology term\">\n<!ENTITY bot \"botany term\">\n<!ENTITY bus \"business term\">\n<!ENTITY econ \"economics term\">\n<!ENTITY engr \"engineering term\">\n<!ENTITY finc \"finance term\">\n<!ENTITY geol \"geology, etc. term\">\n<!ENTITY law \"law, etc. term\">\n<!ENTITY mahj \"mahjong term\">\n<!ENTITY med \"medicine, etc. term\">\n<!ENTITY music \"music term\">\n<!ENTITY Shinto \"Shinto term\">\n<!ENTITY shogi \"shogi term\">\n<!ENTITY sports \"sports term\">\n<!ENTITY sumo \"sumo term\">\n<!ENTITY zool \"zoology term\">\n<!ENTITY joc \"jocular, humorous term\">\n<!ENTITY anat \"anatomical term\">\n]>\n<!-- Mini version of JMDict for testing purpose -->\n<JMdict>\n<entry>\n<ent_seq>1000000</ent_seq>\n<r_ele>\n<reb>ヽ</reb>\n</r_ele>\n<r_ele>\n<reb>くりかえし</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>repetition mark in katakana</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000010</ent_seq>\n<r_ele>\n<reb>ヾ</reb>\n</r_ele>\n<r_ele>\n<reb>くりかえし</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>voiced repetition mark in katakana</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000020</ent_seq>\n<r_ele>\n<reb>ゝ</reb>\n</r_ele>\n<r_ele>\n<reb>くりかえし</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>repetition mark in hiragana</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000030</ent_seq>\n<r_ele>\n<reb>ゞ</reb>\n</r_ele>\n<r_ele>\n<reb>くりかえし</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>voiced repetition mark in hiragana</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000040</ent_seq>\n<k_ele>\n<keb>〃</keb>\n</k_ele>\n<r_ele>\n<reb>おなじ</reb>\n</r_ele>\n<r_ele>\n<reb>おなじく</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>ditto mark</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000050</ent_seq>\n<k_ele>\n<keb>仝</keb>\n</k_ele>\n<r_ele>\n<reb>どうじょう</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>\"as above\" mark</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000060</ent_seq>\n<k_ele>\n<keb>々</keb>\n</k_ele>\n<r_ele>\n<reb>くりかえし</reb>\n</r_ele>\n<r_ele>\n<reb>おなじ</reb>\n</r_ele>\n<r_ele>\n<reb>おなじく</reb>\n</r_ele>\n<r_ele>\n<reb>のま</reb>\n</r_ele>\n<r_ele>\n<reb>どうのじてん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>repetition of kanji (sometimes voiced)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000080</ent_seq>\n<k_ele>\n<keb>漢数字ゼロ</keb>\n</k_ele>\n<r_ele>\n<reb>かんすうじゼロ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>○・まる・1</xref>\n<xref>漢数字</xref>\n<gloss>\"kanji\" zero</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000090</ent_seq>\n<k_ele>\n<keb>○</keb>\n</k_ele>\n<k_ele>\n<keb>〇</keb>\n</k_ele>\n<r_ele>\n<reb>まる</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>丸・まる・1</xref>\n<gloss>circle (sometimes used for zero)</gloss>\n</sense>\n<sense>\n<xref>二重丸・にじゅうまる</xref>\n<ant>×・ばつ・1</ant>\n<gloss>'correct' (when marking)</gloss>\n</sense>\n<sense>\n<xref>〇〇・まるまる・1</xref>\n<gloss>symbol used as a placeholder (either because a number of other words could be used in that position, or because of censorship)</gloss>\n</sense>\n<sense>\n<xref>句点</xref>\n<gloss>period</gloss>\n<gloss>full stop</gloss>\n</sense>\n<sense>\n<xref>半濁点</xref>\n<gloss>maru mark</gloss>\n<gloss>semivoiced sound</gloss>\n<gloss>p-sound</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000100</ent_seq>\n<k_ele>\n<keb>ＡＢＣ順</keb>\n</k_ele>\n<r_ele>\n<reb>エービーシーじゅん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>alphabetical order</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000110</ent_seq>\n<k_ele>\n<keb>ＣＤプレーヤー</keb>\n<ke_pri>spec1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>ＣＤプレイヤー</keb>\n</k_ele>\n<r_ele>\n<reb>シーディープレーヤー</reb>\n<re_restr>ＣＤプレーヤー</re_restr>\n<re_pri>spec1</re_pri>\n</r_ele>\n<r_ele>\n<reb>シーディープレイヤー</reb>\n<re_restr>ＣＤプレイヤー</re_restr>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>CD player</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000130</ent_seq>\n<k_ele>\n<keb>Ｎ響</keb>\n</k_ele>\n<r_ele>\n<reb>エヌきょう</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&abbr;</misc>\n<gloss>NHK Symphony Orchestra</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000140</ent_seq>\n<k_ele>\n<keb>Ｏバック</keb>\n</k_ele>\n<r_ele>\n<reb>オーバック</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>O-back</gloss>\n<gloss>skirt with peek-a-boo hole in rump</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000150</ent_seq>\n<k_ele>\n<keb>ＲＳ２３２ケーブル</keb>\n</k_ele>\n<r_ele>\n<reb>アールエスにさんにケーブル</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>rs232 cable</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000160</ent_seq>\n<k_ele>\n<keb>Ｔシャツ</keb>\n</k_ele>\n<r_ele>\n<reb>ティーシャツ</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>T-shirt</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000170</ent_seq>\n<k_ele>\n<keb>Ｔバック</keb>\n<ke_pri>spec1</ke_pri>\n</k_ele>\n<r_ele>\n<reb>ティーバック</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>T-back</gloss>\n<gloss>bikini thong</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000200</ent_seq>\n<k_ele>\n<keb>あうんの呼吸</keb>\n</k_ele>\n<k_ele>\n<keb>阿吽の呼吸</keb>\n</k_ele>\n<r_ele>\n<reb>あうんのこきゅう</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<pos>&n;</pos>\n<gloss>the harmonizing, mentally and physically, of two parties engaged in an activity</gloss>\n<gloss>singing from the same hymn-sheet</gloss>\n<gloss>dancing to the same beat</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000210</ent_seq>\n<r_ele>\n<reb>あおば</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>やまびこ</xref>\n<misc>&obs;</misc>\n<gloss>(former) regular (stops at every station) Tohoku-line Shinkansen</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000220</ent_seq>\n<k_ele>\n<keb>明白</keb>\n<ke_pri>ichi1</ke_pri>\n<ke_pri>news1</ke_pri>\n<ke_pri>nf10</ke_pri>\n</k_ele>\n<r_ele>\n<reb>めいはく</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news1</re_pri>\n<re_pri>nf10</re_pri>\n</r_ele>\n<sense>\n<pos>&adj-na;</pos>\n<gloss>obvious</gloss>\n<gloss>clear</gloss>\n<gloss>plain</gloss>\n<gloss>evident</gloss>\n<gloss>apparent</gloss>\n<gloss>explicit</gloss>\n<gloss>overt</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000225</ent_seq>\n<k_ele>\n<keb>明白</keb>\n<ke_inf>&ateji;</ke_inf>\n</k_ele>\n<k_ele>\n<keb>偸閑</keb>\n<ke_inf>&ateji;</ke_inf>\n</k_ele>\n<k_ele>\n<keb>白地</keb>\n<ke_inf>&ateji;</ke_inf>\n</k_ele>\n<r_ele>\n<reb>あからさま</reb>\n</r_ele>\n<sense>\n<pos>&adj-na;</pos>\n<pos>&adj-no;</pos>\n<misc>&uk;</misc>\n<gloss>plain</gloss>\n<gloss>frank</gloss>\n<gloss>candid</gloss>\n<gloss>open</gloss>\n<gloss>direct</gloss>\n<gloss>straightforward</gloss>\n<gloss>unabashed</gloss>\n<gloss>blatant</gloss>\n<gloss>flagrant</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000230</ent_seq>\n<k_ele>\n<keb>明かん</keb>\n</k_ele>\n<r_ele>\n<reb>あかん</reb>\n</r_ele>\n<r_ele>\n<reb>アカン</reb>\n<re_nokanji/>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<misc>&uk;</misc>\n<dial>&ksb;</dial>\n<gloss>useless</gloss>\n<gloss>no good</gloss>\n<gloss>hopeless</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000260</ent_seq>\n<k_ele>\n<keb>悪どい</keb>\n<ke_inf>&iK;</ke_inf>\n</k_ele>\n<r_ele>\n<reb>あくどい</reb>\n</r_ele>\n<sense>\n<pos>&adj-i;</pos>\n<misc>&uk;</misc>\n<gloss>gaudy</gloss>\n<gloss>showy</gloss>\n<gloss>excessive</gloss>\n</sense>\n<sense>\n<gloss>crooked</gloss>\n<gloss>vicious</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000280</ent_seq>\n<k_ele>\n<keb>論う</keb>\n</k_ele>\n<r_ele>\n<reb>あげつらう</reb>\n</r_ele>\n<sense>\n<pos>&v5u;</pos>\n<pos>&vt;</pos>\n<misc>&uk;</misc>\n<gloss>to discuss</gloss>\n</sense>\n<sense>\n<gloss>to find fault with</gloss>\n<gloss>to criticize</gloss>\n<gloss>to criticise</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000290</ent_seq>\n<r_ele>\n<reb>あさひ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>Jouetsu line express Shinkansen</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000300</ent_seq>\n<r_ele>\n<reb>あしらう</reb>\n</r_ele>\n<sense>\n<pos>&v5u;</pos>\n<pos>&vt;</pos>\n<gloss>to arrange</gloss>\n<gloss>to treat</gloss>\n<gloss>to handle</gloss>\n<gloss>to deal with</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000310</ent_seq>\n<k_ele>\n<keb>馬酔木</keb>\n</k_ele>\n<r_ele>\n<reb>あせび</reb>\n</r_ele>\n<r_ele>\n<reb>あしび</reb>\n</r_ele>\n<r_ele>\n<reb>あせぼ</reb>\n</r_ele>\n<r_ele>\n<reb>あせぶ</reb>\n</r_ele>\n<r_ele>\n<reb>アセビ</reb>\n<re_nokanji/>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>Japanese andromeda (Pieris japonica)</gloss>\n<gloss>lily-of-the-valley</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000320</ent_seq>\n<k_ele>\n<keb>彼処</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>彼所</keb>\n</k_ele>\n<r_ele>\n<reb>あそこ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<r_ele>\n<reb>あすこ</reb>\n</r_ele>\n<r_ele>\n<reb>かしこ</reb>\n</r_ele>\n<r_ele>\n<reb>あしこ</reb>\n<re_inf>&ok;</re_inf>\n</r_ele>\n<r_ele>\n<reb>あこ</reb>\n<re_inf>&ok;</re_inf>\n</r_ele>\n<sense>\n<pos>&pn;</pos>\n<pos>&adj-no;</pos>\n<xref>何処</xref>\n<xref>此処</xref>\n<xref>其処</xref>\n<misc>&uk;</misc>\n<gloss>there (place physically distant from both speaker and listener)</gloss>\n<gloss>over there</gloss>\n<gloss>that place</gloss>\n<gloss>yonder</gloss>\n</sense>\n<sense>\n<stagr>あそこ</stagr>\n<stagr>あすこ</stagr>\n<pos>&n;</pos>\n<misc>&col;</misc>\n<gloss>genitals</gloss>\n</sense>\n<sense>\n<xref>あれほど</xref>\n<gloss>that far (something psychologically distant from both speaker and listener)</gloss>\n<gloss>that much</gloss>\n<gloss>that point</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000360</ent_seq>\n<r_ele>\n<reb>あっさり</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&adv-to;</pos>\n<pos>&vs;</pos>\n<misc>&on-mim;</misc>\n<gloss>easily</gloss>\n<gloss>readily</gloss>\n<gloss>quickly</gloss>\n</sense>\n<sense>\n<misc>&on-mim;</misc>\n<gloss>lightly (flavored food, applied makeup)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000390</ent_seq>\n<k_ele>\n<keb>あっという間に</keb>\n</k_ele>\n<k_ele>\n<keb>あっと言う間に</keb>\n</k_ele>\n<k_ele>\n<keb>あっとゆう間に</keb>\n</k_ele>\n<r_ele>\n<reb>あっというまに</reb>\n<re_restr>あっという間に</re_restr>\n<re_restr>あっと言う間に</re_restr>\n</r_ele>\n<r_ele>\n<reb>あっとゆうまに</reb>\n<re_restr>あっと言う間に</re_restr>\n<re_restr>あっとゆう間に</re_restr>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<gloss>just like that</gloss>\n<gloss>in the twinkling of an eye</gloss>\n<gloss>in the blink of an eye</gloss>\n<gloss>in the time it takes to say \"ah!\"</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000400</ent_seq>\n<r_ele>\n<reb>あっぷあっぷ</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<gloss>floundering while nearly drowning</gloss>\n</sense>\n<sense>\n<gloss>suffering</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000410</ent_seq>\n<r_ele>\n<reb>あどけない</reb>\n</r_ele>\n<sense>\n<pos>&adj-i;</pos>\n<gloss>innocent</gloss>\n<gloss>cherubic</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000420</ent_seq>\n<k_ele>\n<keb>彼の</keb>\n<ke_pri>spec1</ke_pri>\n</k_ele>\n<r_ele>\n<reb>あの</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<r_ele>\n<reb>かの</reb>\n</r_ele>\n<sense>\n<pos>&adj-pn;</pos>\n<xref>何の・どの</xref>\n<xref>此の</xref>\n<xref>其の・1</xref>\n<xref>彼・あれ・1</xref>\n<misc>&uk;</misc>\n<gloss>that (someone or something distant from both speaker and listener, or situation unfamiliar to both speaker and listener)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000430</ent_seq>\n<r_ele>\n<reb>あのう</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<r_ele>\n<reb>あの</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<r_ele>\n<reb>あのー</reb>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<gloss>say</gloss>\n<gloss>well</gloss>\n<gloss>errr ...</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000440</ent_seq>\n<k_ele>\n<keb>あの人</keb>\n</k_ele>\n<k_ele>\n<keb>彼の人</keb>\n</k_ele>\n<r_ele>\n<reb>あのひと</reb>\n</r_ele>\n<sense>\n<pos>&pn;</pos>\n<pos>&adj-no;</pos>\n<gloss>he</gloss>\n<gloss>she</gloss>\n<gloss>that person</gloss>\n</sense>\n<sense>\n<misc>&arch;</misc>\n<gloss>you</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000450</ent_seq>\n<k_ele>\n<keb>あの方</keb>\n<ke_pri>spec1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>彼の方</keb>\n</k_ele>\n<r_ele>\n<reb>あのかた</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&pn;</pos>\n<pos>&adj-no;</pos>\n<misc>&hon;</misc>\n<gloss>that gentleman (lady)</gloss>\n<gloss>he</gloss>\n<gloss>she</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000460</ent_seq>\n<k_ele>\n<keb>溢れる</keb>\n</k_ele>\n<r_ele>\n<reb>あぶれる</reb>\n</r_ele>\n<sense>\n<pos>&v1;</pos>\n<pos>&vi;</pos>\n<misc>&uk;</misc>\n<gloss>to fail (in getting a job)</gloss>\n<gloss>to miss out (at fishing, hunting, etc.)</gloss>\n</sense>\n<sense>\n<misc>&uk;</misc>\n<gloss>to be left out</gloss>\n<gloss>to be crowded out</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000470</ent_seq>\n<r_ele>\n<reb>あべこべ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&adj-na;</pos>\n<pos>&n;</pos>\n<misc>&on-mim;</misc>\n<gloss>contrary</gloss>\n<gloss>opposite</gloss>\n<gloss>inverse</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000480</ent_seq>\n<k_ele>\n<keb>阿呆陀羅</keb>\n</k_ele>\n<r_ele>\n<reb>あほんだら</reb>\n</r_ele>\n<r_ele>\n<reb>あほだら</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<dial>&ksb;</dial>\n<gloss>fool</gloss>\n<gloss>oaf</gloss>\n<gloss>airhead</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000490</ent_seq>\n<k_ele>\n<keb>甘子</keb>\n</k_ele>\n<k_ele>\n<keb>天魚</keb>\n</k_ele>\n<k_ele>\n<keb>雨子</keb>\n</k_ele>\n<r_ele>\n<reb>あまご</reb>\n</r_ele>\n<r_ele>\n<reb>アマゴ</reb>\n<re_nokanji/>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>皐月鱒</xref>\n<misc>&uk;</misc>\n<gloss>land-locked variety of red-spotted masu trout (Oncorhynchus masou ishikawae)</gloss>\n<gloss>amago</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000500</ent_seq>\n<r_ele>\n<reb>あやす</reb>\n</r_ele>\n<sense>\n<pos>&v5s;</pos>\n<pos>&vt;</pos>\n<gloss>to cuddle</gloss>\n<gloss>to comfort</gloss>\n<gloss>to rock</gloss>\n<gloss>to soothe</gloss>\n<gloss>to dandle</gloss>\n<gloss>to humor</gloss>\n<gloss>to humour</gloss>\n<gloss>to lull</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000510</ent_seq>\n<r_ele>\n<reb>あやふや</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&adj-na;</pos>\n<pos>&n;</pos>\n<misc>&on-mim;</misc>\n<gloss>uncertain</gloss>\n<gloss>vague</gloss>\n<gloss>ambiguous</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000520</ent_seq>\n<r_ele>\n<reb>あら</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<misc>&fem;</misc>\n<gloss>oh</gloss>\n<gloss>ah</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000525</ent_seq>\n<k_ele>\n<keb>𩺊</keb>\n</k_ele>\n<r_ele>\n<reb>あら</reb>\n</r_ele>\n<r_ele>\n<reb>アラ</reb>\n<re_nokanji/>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>saw-edged perch (Niphon spinosus)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000580</ent_seq>\n<k_ele>\n<keb>彼</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<r_ele>\n<reb>あれ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<r_ele>\n<reb>あ</reb>\n<re_inf>&ok;</re_inf>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>何れ・1</xref>\n<xref>此れ・1</xref>\n<xref>其れ・1</xref>\n<misc>&uk;</misc>\n<gloss>that (indicating something distant from both speaker and listener (in space, time or psychologically), or something understood without naming it directly)</gloss>\n</sense>\n<sense>\n<gloss>that person (used to refer to one's equals or inferiors)</gloss>\n</sense>\n<sense>\n<misc>&arch;</misc>\n<gloss>over there</gloss>\n</sense>\n<sense>\n<stagr>あれ</stagr>\n<misc>&col;</misc>\n<gloss>down there (i.e. one's genitals)</gloss>\n</sense>\n<sense>\n<stagr>あれ</stagr>\n<misc>&col;</misc>\n<gloss>period</gloss>\n<gloss>menses</gloss>\n</sense>\n<sense>\n<pos>&int;</pos>\n<misc>&uk;</misc>\n<gloss>hey (expression of surprise, suspicion, etc.)</gloss>\n<gloss>huh?</gloss>\n<gloss>eh?</gloss>\n</sense>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>that (something mentioned before which is distant psychologically or in terms of time)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000590</ent_seq>\n<r_ele>\n<reb>あんな</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&adj-pn;</pos>\n<xref>こんな</xref>\n<xref>そんな</xref>\n<xref>どんな・1</xref>\n<gloss>such (about something or someone distant from both speaker and listener, or about a situation unfamiliar to both speaker and listener)</gloss>\n<gloss>so</gloss>\n<gloss>that</gloss>\n<gloss>sort of</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000600</ent_seq>\n<k_ele>\n<keb>いい加減にしなさい</keb>\n</k_ele>\n<r_ele>\n<reb>いいかげんにしなさい</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<gloss>shape up!</gloss>\n<gloss>act properly!</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000610</ent_seq>\n<k_ele>\n<keb>いい年をして</keb>\n</k_ele>\n<r_ele>\n<reb>いいとしをして</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<xref>いい年して</xref>\n<gloss>(in spite of) being old enough to know better</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000620</ent_seq>\n<k_ele>\n<keb>否々</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>否否</keb>\n</k_ele>\n<r_ele>\n<reb>いやいや</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<r_ele>\n<reb>いえいえ</reb>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<xref>嫌々・いやいや・3</xref>\n<misc>&uk;</misc>\n<gloss>no!</gloss>\n<gloss>no no!</gloss>\n<gloss>no, not at all</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000630</ent_seq>\n<k_ele>\n<keb>如何わしい</keb>\n</k_ele>\n<r_ele>\n<reb>いかがわしい</reb>\n</r_ele>\n<sense>\n<pos>&adj-i;</pos>\n<misc>&uk;</misc>\n<gloss>suspicious</gloss>\n<gloss>dubious</gloss>\n<gloss>unreliable</gloss>\n</sense>\n<sense>\n<misc>&uk;</misc>\n<gloss>indecent</gloss>\n<gloss>unseemly</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000640</ent_seq>\n<r_ele>\n<reb>いかす</reb>\n</r_ele>\n<r_ele>\n<reb>イカす</reb>\n</r_ele>\n<sense>\n<pos>&v5s;</pos>\n<pos>&vi;</pos>\n<gloss>to be smart</gloss>\n<gloss>to be cool</gloss>\n<gloss>to be sharp</gloss>\n<gloss>to be stylish</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000650</ent_seq>\n<k_ele>\n<keb>いかなる場合でも</keb>\n</k_ele>\n<r_ele>\n<reb>いかなるばあいでも</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<gloss>in any case</gloss>\n<gloss>whatever the case may be</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000660</ent_seq>\n<k_ele>\n<keb>如何にも</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<r_ele>\n<reb>いかにも</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&int;</pos>\n<misc>&uk;</misc>\n<gloss>indeed</gloss>\n<gloss>really</gloss>\n<gloss>phrase indicating agreement</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000710</ent_seq>\n<k_ele>\n<keb>幾つも</keb>\n</k_ele>\n<r_ele>\n<reb>いくつも</reb>\n</r_ele>\n<sense>\n<pos>&adj-no;</pos>\n<misc>&uk;</misc>\n<gloss>many</gloss>\n<gloss>great number of</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000730</ent_seq>\n<k_ele>\n<keb>行けない</keb>\n</k_ele>\n<r_ele>\n<reb>いけない</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<misc>&uk;</misc>\n<gloss>wrong</gloss>\n<gloss>not good</gloss>\n<gloss>of no use</gloss>\n</sense>\n<sense>\n<misc>&uk;</misc>\n<gloss>hopeless</gloss>\n<gloss>past hope</gloss>\n</sense>\n<sense>\n<misc>&uk;</misc>\n<gloss>must not do</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000740</ent_seq>\n<r_ele>\n<reb>いごっそう</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<dial>&tsb;</dial>\n<gloss>stubborn person</gloss>\n<gloss>strong-minded person</gloss>\n<gloss>obstinate person</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000750</ent_seq>\n<r_ele>\n<reb>いざ</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&int;</pos>\n<gloss>now</gloss>\n<gloss>come (now)</gloss>\n<gloss>well</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000760</ent_seq>\n<r_ele>\n<reb>いざこざ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>trouble</gloss>\n<gloss>quarrel</gloss>\n<gloss>difficulties</gloss>\n<gloss>complication</gloss>\n<gloss>tangle</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000770</ent_seq>\n<r_ele>\n<reb>いじいじ</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&adv-to;</pos>\n<pos>&vs;</pos>\n<misc>&on-mim;</misc>\n<gloss>hesitantly</gloss>\n<gloss>timidly</gloss>\n<gloss>diffidently</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000780</ent_seq>\n<r_ele>\n<reb>いじける</reb>\n</r_ele>\n<sense>\n<pos>&v1;</pos>\n<pos>&vi;</pos>\n<gloss>to grow timid (e.g. from an inferiority complex)</gloss>\n<gloss>to lose one's nerve</gloss>\n</sense>\n<sense>\n<gloss>to become perverse</gloss>\n<gloss>to become contrary</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000790</ent_seq>\n<r_ele>\n<reb>いじましい</reb>\n</r_ele>\n<sense>\n<pos>&adj-i;</pos>\n<gloss>piddling</gloss>\n<gloss>paltry</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000800</ent_seq>\n<r_ele>\n<reb>いじらしい</reb>\n</r_ele>\n<sense>\n<pos>&adj-i;</pos>\n<gloss>innocent</gloss>\n<gloss>lovable</gloss>\n<gloss>sweet</gloss>\n<gloss>pitiful</gloss>\n<gloss>pathetic</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000810</ent_seq>\n<k_ele>\n<keb>いじり回す</keb>\n</k_ele>\n<k_ele>\n<keb>弄り回す</keb>\n</k_ele>\n<k_ele>\n<keb>弄りまわす</keb>\n</k_ele>\n<r_ele>\n<reb>いじりまわす</reb>\n</r_ele>\n<sense>\n<pos>&v5s;</pos>\n<gloss>to tinker with</gloss>\n<gloss>to fumble with</gloss>\n<gloss>to twist up</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000820</ent_seq>\n<r_ele>\n<reb>いそいそ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<pos>&adv-to;</pos>\n<misc>&on-mim;</misc>\n<gloss>cheerfully</gloss>\n<gloss>excitedly</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000830</ent_seq>\n<r_ele>\n<reb>いちゃいちゃ</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<gloss>flirt</gloss>\n<gloss>make out</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000840</ent_seq>\n<r_ele>\n<reb>いちゃつく</reb>\n</r_ele>\n<sense>\n<pos>&v5k;</pos>\n<pos>&vi;</pos>\n<gloss>to flirt with</gloss>\n<gloss>to dally</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000860</ent_seq>\n<k_ele>\n<keb>何時もより</keb>\n</k_ele>\n<r_ele>\n<reb>いつもより</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<misc>&uk;</misc>\n<gloss>more than usual</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000870</ent_seq>\n<k_ele>\n<keb>いとも簡単に</keb>\n</k_ele>\n<r_ele>\n<reb>いともかんたんに</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<gloss>very easily</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000880</ent_seq>\n<k_ele>\n<keb>鯔背</keb>\n</k_ele>\n<r_ele>\n<reb>いなせ</reb>\n</r_ele>\n<sense>\n<pos>&adj-na;</pos>\n<misc>&uk;</misc>\n<gloss>gallant</gloss>\n<gloss>dashing</gloss>\n<gloss>smart</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000885</ent_seq>\n<k_ele>\n<keb>嘶く</keb>\n</k_ele>\n<r_ele>\n<reb>いななく</reb>\n</r_ele>\n<sense>\n<pos>&v5k;</pos>\n<pos>&vi;</pos>\n<gloss>to neigh</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000890</ent_seq>\n<k_ele>\n<keb>嘶き</keb>\n</k_ele>\n<r_ele>\n<reb>いななき</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>neigh</gloss>\n<gloss>whinny</gloss>\n<gloss>bray</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000900</ent_seq>\n<r_ele>\n<reb>いびる</reb>\n</r_ele>\n<sense>\n<pos>&v5r;</pos>\n<pos>&vt;</pos>\n<gloss>to pick on</gloss>\n<gloss>to tease</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000910</ent_seq>\n<k_ele>\n<keb>嫌に</keb>\n</k_ele>\n<k_ele>\n<keb>厭に</keb>\n</k_ele>\n<r_ele>\n<reb>いやに</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<misc>&uk;</misc>\n<gloss>awfully</gloss>\n<gloss>terribly</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000920</ent_seq>\n<r_ele>\n<reb>いらっしゃい</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<r_ele>\n<reb>いらしゃい</reb>\n<re_inf>&ik;</re_inf>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<pos>&n;</pos>\n<xref>いらっしゃる・1</xref>\n<misc>&hon;</misc>\n<s_inf>used as a polite imperative</s_inf>\n<gloss>come</gloss>\n<gloss>go</gloss>\n<gloss>stay</gloss>\n</sense>\n<sense>\n<xref>いらっしゃいませ</xref>\n<gloss>welcome!</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000930</ent_seq>\n<r_ele>\n<reb>いらっしゃいませ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<r_ele>\n<reb>いらしゃいませ</reb>\n<re_inf>&ik;</re_inf>\n</r_ele>\n<r_ele>\n<reb>いっらしゃいませ</reb>\n<re_inf>&ik;</re_inf>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<gloss>welcome (in shops, etc.)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000940</ent_seq>\n<r_ele>\n<reb>いらっしゃる</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&v5aru;</pos>\n<pos>&vi;</pos>\n<misc>&hon;</misc>\n<s_inf>sometimes erroneously written 居らっしゃる</s_inf>\n<gloss>to come</gloss>\n<gloss>to go</gloss>\n<gloss>to be (somewhere)</gloss>\n</sense>\n<sense>\n<pos>&v5aru;</pos>\n<pos>&aux-v;</pos>\n<misc>&hon;</misc>\n<s_inf>after a -te form, or the particle \"de\"</s_inf>\n<gloss>is (doing)</gloss>\n<gloss>are (doing)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000960</ent_seq>\n<r_ele>\n<reb>うじうじ</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&on-mim;</misc>\n<gloss>irresolute</gloss>\n<gloss>hesitant</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000970</ent_seq>\n<r_ele>\n<reb>うじゃうじゃ</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&on-mim;</misc>\n<gloss>in swarms</gloss>\n<gloss>in clusters</gloss>\n</sense>\n<sense>\n<misc>&on-mim;</misc>\n<gloss>tediously</gloss>\n<gloss>slowly</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000980</ent_seq>\n<r_ele>\n<reb>うずうず</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&adv-to;</pos>\n<pos>&vs;</pos>\n<misc>&on-mim;</misc>\n<gloss>sorely tempted</gloss>\n<gloss>itching to do something</gloss>\n<gloss>eager</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1000990</ent_seq>\n<r_ele>\n<reb>うぞうぞ</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<misc>&on-mim;</misc>\n<gloss>irrepressibly aroused (esp. sexually)</gloss>\n<gloss>stimulated</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001000</ent_seq>\n<r_ele>\n<reb>うだうだ</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<misc>&on-mim;</misc>\n<gloss>idle</gloss>\n<gloss>long-winded and meaningless</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001010</ent_seq>\n<r_ele>\n<reb>うっかり</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&on-mim;</misc>\n<gloss>carelessly</gloss>\n<gloss>thoughtlessly</gloss>\n<gloss>inadvertently</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001020</ent_seq>\n<r_ele>\n<reb>うっとりさせる</reb>\n</r_ele>\n<sense>\n<pos>&v1;</pos>\n<xref>うっとり</xref>\n<xref>うっとりする</xref>\n<gloss>to enchant</gloss>\n<gloss>to enrapture</gloss>\n<gloss>to enthrall (enthral)</gloss>\n<gloss>to charm</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001030</ent_seq>\n<r_ele>\n<reb>うとうと</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<r_ele>\n<reb>うとっと</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<pos>&adv-to;</pos>\n<misc>&on-mim;</misc>\n<gloss>falling in a doze</gloss>\n<gloss>dozing</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001040</ent_seq>\n<r_ele>\n<reb>うねうね</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&on-mim;</misc>\n<gloss>winding</gloss>\n<gloss>meandering</gloss>\n<gloss>zigzag</gloss>\n<gloss>sinuous</gloss>\n<gloss>tortuous</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001050</ent_seq>\n<k_ele>\n<keb>畝ねり</keb>\n</k_ele>\n<r_ele>\n<reb>うねり</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>wave motion</gloss>\n<gloss>undulation</gloss>\n<gloss>winding</gloss>\n<gloss>heaving sea</gloss>\n<gloss>swell</gloss>\n<gloss>roller</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001060</ent_seq>\n<r_ele>\n<reb>うろうろ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<r_ele>\n<reb>うそうそ</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&adv-to;</pos>\n<pos>&vs;</pos>\n<xref>彷徨く・1</xref>\n<misc>&on-mim;</misc>\n<gloss>loiteringly</gloss>\n<gloss>aimless wandering</gloss>\n<gloss>restlessly</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001070</ent_seq>\n<k_ele>\n<keb>狼狽える</keb>\n</k_ele>\n<r_ele>\n<reb>うろたえる</reb>\n</r_ele>\n<sense>\n<pos>&v1;</pos>\n<pos>&vi;</pos>\n<misc>&uk;</misc>\n<gloss>to be flustered</gloss>\n<gloss>to lose one's presence of mind</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001090</ent_seq>\n<r_ele>\n<reb>うん</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<gloss>yes</gloss>\n<gloss>yeah</gloss>\n<gloss>uh huh</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001100</ent_seq>\n<r_ele>\n<reb>うんこ</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&col;</misc>\n<misc>&chn;</misc>\n<gloss>poop</gloss>\n<gloss>faeces</gloss>\n<gloss>feces</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001110</ent_seq>\n<r_ele>\n<reb>うんざり</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&on-mim;</misc>\n<gloss>tedious</gloss>\n<gloss>boring</gloss>\n<gloss>being fed up with</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001120</ent_seq>\n<r_ele>\n<reb>うんち</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&col;</misc>\n<misc>&chn;</misc>\n<gloss>poop</gloss>\n<gloss>faeces</gloss>\n<gloss>feces</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001130</ent_seq>\n<k_ele>\n<keb>海鷂魚</keb>\n</k_ele>\n<k_ele>\n<keb>鱝</keb>\n<ke_inf>&oK;</ke_inf>\n</k_ele>\n<k_ele>\n<keb>鱏</keb>\n<ke_inf>&oK;</ke_inf>\n</k_ele>\n<r_ele>\n<reb>えい</reb>\n<re_inf>&gikun;</re_inf>\n</r_ele>\n<r_ele>\n<reb>エイ</reb>\n<re_nokanji/>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>ray (fish)</gloss>\n<gloss>stingray</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001140</ent_seq>\n<r_ele>\n<reb>ええ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<r_ele>\n<reb>えー</reb>\n<re_inf>&ik;</re_inf>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<gloss>yes</gloss>\n<gloss>that is correct</gloss>\n<gloss>right</gloss>\n</sense>\n<sense>\n<gloss>um</gloss>\n<gloss>errr</gloss>\n</sense>\n<sense>\n<gloss>huh?</gloss>\n</sense>\n<sense>\n<gloss>grrr</gloss>\n<gloss>gah</gloss>\n<gloss>Must I?</gloss>\n</sense>\n<sense>\n<pos>&adj-f;</pos>\n<xref>良い・1</xref>\n<dial>&ksb;</dial>\n<gloss>good</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001150</ent_seq>\n<r_ele>\n<reb>えっと</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<r_ele>\n<reb>えーと</reb>\n</r_ele>\n<r_ele>\n<reb>えーっと</reb>\n</r_ele>\n<r_ele>\n<reb>ええと</reb>\n</r_ele>\n<r_ele>\n<reb>ええっと</reb>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<gloss>let me see</gloss>\n<gloss>well</gloss>\n<gloss>errr ...</gloss>\n<gloss>uhh ...</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001160</ent_seq>\n<r_ele>\n<reb>えげつない</reb>\n</r_ele>\n<sense>\n<pos>&adj-i;</pos>\n<gloss>dirty</gloss>\n<gloss>vulgar</gloss>\n<gloss>nasty</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001170</ent_seq>\n<k_ele>\n<keb>斉魚</keb>\n</k_ele>\n<r_ele>\n<reb>えつ</reb>\n</r_ele>\n<r_ele>\n<reb>エツ</reb>\n<re_nokanji/>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>Japanese grenadier anchovy (Coilia nasus)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001180</ent_seq>\n<k_ele>\n<keb>お出でになる</keb>\n</k_ele>\n<k_ele>\n<keb>御出でになる</keb>\n</k_ele>\n<r_ele>\n<reb>おいでになる</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<pos>&v5r;</pos>\n<xref>お出で・1</xref>\n<misc>&uk;</misc>\n<misc>&hon;</misc>\n<gloss>to be</gloss>\n</sense>\n<sense>\n<gloss>to come</gloss>\n</sense>\n<sense>\n<gloss>to go</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001190</ent_seq>\n<r_ele>\n<reb>おいでやす</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<dial>&kyb;</dial>\n<gloss>welcome (in shops, etc.)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001200</ent_seq>\n<r_ele>\n<reb>おおい</reb>\n</r_ele>\n<r_ele>\n<reb>おーい</reb>\n</r_ele>\n<r_ele>\n<reb>おい</reb>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<gloss>hey!</gloss>\n<gloss>oi!</gloss>\n<gloss>ahoy!</gloss>\n</sense>\n<sense>\n<stagr>おい</stagr>\n<pos>&pn;</pos>\n<dial>&ksb;</dial>\n<gloss>I</gloss>\n<gloss>me</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001220</ent_seq>\n<r_ele>\n<reb>おけさ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>style of Japanese folk song associated with Niigata Prefecture</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001230</ent_seq>\n<k_ele>\n<keb>おけさ節</keb>\n</k_ele>\n<r_ele>\n<reb>おけさぶし</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>style of Japanese folk song associated with Niigata Prefecture</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001240</ent_seq>\n<r_ele>\n<reb>おこしやす</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<dial>&kyb;</dial>\n<gloss>welcome (in shops, etc.)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001250</ent_seq>\n<r_ele>\n<reb>おざなりになって</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<gloss>to say commonplace things</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001260</ent_seq>\n<r_ele>\n<reb>おしっこ</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&col;</misc>\n<misc>&chn;</misc>\n<gloss>wee-wee</gloss>\n<gloss>pee-pee</gloss>\n<gloss>number one</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001280</ent_seq>\n<r_ele>\n<reb>おしゃぶり</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>teething ring</gloss>\n<gloss>pacifier</gloss>\n<gloss>dummy</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001290</ent_seq>\n<k_ele>\n<keb>悍ましい</keb>\n</k_ele>\n<r_ele>\n<reb>おぞましい</reb>\n</r_ele>\n<sense>\n<pos>&adj-i;</pos>\n<misc>&uk;</misc>\n<gloss>disgusting</gloss>\n<gloss>repulsive</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001300</ent_seq>\n<r_ele>\n<reb>おたおた</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&on-mim;</misc>\n<gloss>(shocked) speechless</gloss>\n<gloss>flustered</gloss>\n<gloss>flurried</gloss>\n</sense>\n<sense>\n<pos>&exp;</pos>\n<gloss>help</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001310</ent_seq>\n<r_ele>\n<reb>おちんちん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>ちんちん・3</xref>\n<misc>&chn;</misc>\n<gloss>penis</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001330</ent_seq>\n<r_ele>\n<reb>おっかない</reb>\n</r_ele>\n<sense>\n<pos>&adj-i;</pos>\n<misc>&col;</misc>\n<dial>&ktb;</dial>\n<gloss>frightening</gloss>\n<gloss>scary</gloss>\n</sense>\n<sense>\n<misc>&col;</misc>\n<dial>&ktb;</dial>\n<gloss>extreme</gloss>\n<gloss>exaggerated</gloss>\n<gloss>huge</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001340</ent_seq>\n<k_ele>\n<keb>落っこちる</keb>\n</k_ele>\n<r_ele>\n<reb>おっこちる</reb>\n</r_ele>\n<sense>\n<pos>&v1;</pos>\n<pos>&vi;</pos>\n<xref>落ちる・1</xref>\n<dial>&ktb;</dial>\n<gloss>to fall down</gloss>\n<gloss>to drop</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001350</ent_seq>\n<r_ele>\n<reb>おっさん</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&abbr;</misc>\n<misc>&derog;</misc>\n<misc>&fam;</misc>\n<gloss>middle-aged man</gloss>\n</sense>\n<sense>\n<misc>&abbr;</misc>\n<misc>&fam;</misc>\n<gloss>Buddhist priest</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001360</ent_seq>\n<r_ele>\n<reb>おっちょこちょい</reb>\n</r_ele>\n<sense>\n<pos>&adj-na;</pos>\n<pos>&n;</pos>\n<gloss>careless person</gloss>\n<gloss>scatterbrain</gloss>\n<gloss>birdbrain</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001370</ent_seq>\n<r_ele>\n<reb>おっぱい</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<r_ele>\n<reb>オッパイ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&chn;</misc>\n<gloss>breasts</gloss>\n<gloss>boobies</gloss>\n<gloss>tits</gloss>\n</sense>\n<sense>\n<misc>&chn;</misc>\n<gloss>breast milk</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001390</ent_seq>\n<k_ele>\n<keb>御田</keb>\n</k_ele>\n<r_ele>\n<reb>おでん</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<field>&food;</field>\n<misc>&uk;</misc>\n<gloss>oden</gloss>\n<gloss>dish of various ingredients, e.g. egg, daikon, potato, chikuwa, konnyaku, etc. stewed in soy-flavored dashi</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001400</ent_seq>\n<r_ele>\n<reb>おどおど</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&adv-to;</pos>\n<pos>&vs;</pos>\n<misc>&on-mim;</misc>\n<gloss>coweringly</gloss>\n<gloss>hesitantly</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001410</ent_seq>\n<k_ele>\n<keb>お鍋</keb>\n</k_ele>\n<k_ele>\n<keb>御鍋</keb>\n</k_ele>\n<r_ele>\n<reb>おなべ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&pol;</misc>\n<gloss>pot</gloss>\n</sense>\n<sense>\n<misc>&arch;</misc>\n<gloss>typical name for a female servant in the Edo-period</gloss>\n</sense>\n<sense>\n<gloss>working at night</gloss>\n</sense>\n<sense>\n<misc>&uk;</misc>\n<misc>&sl;</misc>\n<s_inf>often derog.</s_inf>\n<gloss>female with symptoms of gender identity disorder (e.g. a transvestite)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001420</ent_seq>\n<k_ele>\n<keb>屁</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<r_ele>\n<reb>おなら</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<r_ele>\n<reb>へ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<s_inf>usually 屁 is へ, and おなら is in kana</s_inf>\n<gloss>wind</gloss>\n<gloss>gas</gloss>\n<gloss>fart</gloss>\n</sense>\n<sense>\n<stagr>へ</stagr>\n<gloss>something worthless</gloss>\n<gloss>something not worth considering</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001430</ent_seq>\n<r_ele>\n<reb>おばこ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<dial>&thb;</dial>\n<gloss>young girl</gloss>\n<gloss>daughter</gloss>\n<gloss>unmarried girl</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001440</ent_seq>\n<r_ele>\n<reb>おべっか</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>flattery</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001450</ent_seq>\n<r_ele>\n<reb>おべんちゃら</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>(excessive) flattery</gloss>\n<gloss>smarminess</gloss>\n<gloss>fawning</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001480</ent_seq>\n<k_ele>\n<keb>お負けに</keb>\n</k_ele>\n<k_ele>\n<keb>御負けに</keb>\n</k_ele>\n<r_ele>\n<reb>おまけに</reb>\n</r_ele>\n<sense>\n<pos>&conj;</pos>\n<pos>&exp;</pos>\n<misc>&uk;</misc>\n<gloss>to make matters worse</gloss>\n<gloss>besides</gloss>\n<gloss>what's more</gloss>\n<gloss>in addition</gloss>\n<gloss>on top of that</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001490</ent_seq>\n<k_ele>\n<keb>お呪い</keb>\n</k_ele>\n<k_ele>\n<keb>御呪い</keb>\n</k_ele>\n<r_ele>\n<reb>おまじない</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>good luck charm</gloss>\n</sense>\n<sense>\n<pos>&exp;</pos>\n<gloss>uttered when using magic</gloss>\n<gloss>abracadabra</gloss>\n<gloss>presto</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001500</ent_seq>\n<r_ele>\n<reb>おまんこ</reb>\n</r_ele>\n<r_ele>\n<reb>おめこ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&vulg;</misc>\n<misc>&sl;</misc>\n<gloss>vulva</gloss>\n<gloss>vagina</gloss>\n<gloss>female genitalia</gloss>\n</sense>\n<sense>\n<pos>&vs;</pos>\n<misc>&vulg;</misc>\n<misc>&sl;</misc>\n<gloss>to have sexual intercourse</gloss>\n<gloss>to screw</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001510</ent_seq>\n<k_ele>\n<keb>御襁褓気触れ</keb>\n</k_ele>\n<k_ele>\n<keb>お襁褓気触れ</keb>\n</k_ele>\n<k_ele>\n<keb>オムツ気触れ</keb>\n</k_ele>\n<r_ele>\n<reb>おむつかぶれ</reb>\n<re_restr>御襁褓気触れ</re_restr>\n<re_restr>お襁褓気触れ</re_restr>\n</r_ele>\n<r_ele>\n<reb>オムツかぶれ</reb>\n<re_restr>オムツ気触れ</re_restr>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>diaper rash</gloss>\n<gloss>nappy rash</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001520</ent_seq>\n<k_ele>\n<keb>お粧し</keb>\n</k_ele>\n<k_ele>\n<keb>御粧し</keb>\n</k_ele>\n<r_ele>\n<reb>おめかし</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&uk;</misc>\n<gloss>dressing up</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001540</ent_seq>\n<k_ele>\n<keb>お目出度うご座います</keb>\n</k_ele>\n<k_ele>\n<keb>御目出度う御座います</keb>\n</k_ele>\n<r_ele>\n<reb>おめでとうございます</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<misc>&uk;</misc>\n<gloss>congratulations</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001560</ent_seq>\n<r_ele>\n<reb>おや</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&conj;</pos>\n<pos>&int;</pos>\n<pos>&n;</pos>\n<gloss>oh!</gloss>\n<gloss>oh?</gloss>\n<gloss>my!</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001570</ent_seq>\n<r_ele>\n<reb>おやおや</reb>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<gloss>my goodness!</gloss>\n<gloss>oh my!</gloss>\n<gloss>oh dear!</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001580</ent_seq>\n<r_ele>\n<reb>おろおろ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<r_ele>\n<reb>オロオロ</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<pos>&adv-to;</pos>\n<pos>&vs;</pos>\n<misc>&on-mim;</misc>\n<gloss>nervous</gloss>\n<gloss>flustered</gloss>\n<gloss>in a dither</gloss>\n<gloss>all shook up</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001600</ent_seq>\n<r_ele>\n<reb>おろちょろ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<gloss>lounging about</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001610</ent_seq>\n<r_ele>\n<reb>おデブさん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>デブ</xref>\n<misc>&joc;</misc>\n<gloss>chubby person</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001620</ent_seq>\n<k_ele>\n<keb>お握り</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御握り</keb>\n</k_ele>\n<r_ele>\n<reb>おにぎり</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>握り飯</xref>\n<misc>&uk;</misc>\n<misc>&pol;</misc>\n<gloss>rice ball (often triangular, sometimes with a filling and wrapped in nori)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001640</ent_seq>\n<k_ele>\n<keb>お蔭</keb>\n</k_ele>\n<k_ele>\n<keb>御蔭</keb>\n</k_ele>\n<k_ele>\n<keb>お陰</keb>\n</k_ele>\n<k_ele>\n<keb>御陰</keb>\n</k_ele>\n<r_ele>\n<reb>おかげ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>grace (of God)</gloss>\n<gloss>benevolence (of Buddha)</gloss>\n<gloss>blessing</gloss>\n</sense>\n<sense>\n<misc>&uk;</misc>\n<gloss>assistance</gloss>\n<gloss>help</gloss>\n<gloss>aid</gloss>\n</sense>\n<sense>\n<xref>お蔭で</xref>\n<misc>&uk;</misc>\n<gloss>effects</gloss>\n<gloss>influence</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001650</ent_seq>\n<k_ele>\n<keb>お蔭様</keb>\n</k_ele>\n<k_ele>\n<keb>お蔭さま</keb>\n</k_ele>\n<k_ele>\n<keb>御蔭様</keb>\n</k_ele>\n<r_ele>\n<reb>おかげさま</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&pol;</misc>\n<misc>&uk;</misc>\n<gloss>(somebody's) backing</gloss>\n<gloss>assistance</gloss>\n<gloss>thanks to (somebody)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001660</ent_seq>\n<k_ele>\n<keb>お下げ</keb>\n</k_ele>\n<k_ele>\n<keb>御下げ</keb>\n</k_ele>\n<r_ele>\n<reb>おさげ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>wearing one's hair in braids</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001670</ent_seq>\n<k_ele>\n<keb>お化け</keb>\n<ke_pri>news1</ke_pri>\n<ke_pri>nf23</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御化け</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<r_ele>\n<reb>おばけ</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news1</re_pri>\n<re_pri>nf23</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>goblin</gloss>\n<gloss>apparition</gloss>\n<gloss>monster</gloss>\n<gloss>ghost</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001680</ent_seq>\n<k_ele>\n<keb>お化け屋敷</keb>\n</k_ele>\n<k_ele>\n<keb>おばけ屋敷</keb>\n</k_ele>\n<k_ele>\n<keb>御化け屋敷</keb>\n</k_ele>\n<r_ele>\n<reb>おばけやしき</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>haunted house</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001690</ent_seq>\n<k_ele>\n<keb>お嫁さん</keb>\n</k_ele>\n<r_ele>\n<reb>およめさん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>bride</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001710</ent_seq>\n<k_ele>\n<keb>お菓子</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御菓子</keb>\n</k_ele>\n<r_ele>\n<reb>おかし</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>confections</gloss>\n<gloss>sweets</gloss>\n<gloss>candy</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001720</ent_seq>\n<k_ele>\n<keb>お願いします</keb>\n<ke_pri>spec1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御願いします</keb>\n</k_ele>\n<r_ele>\n<reb>おねがいします</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<misc>&hum;</misc>\n<gloss>please</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001730</ent_seq>\n<k_ele>\n<keb>お願いいたします</keb>\n</k_ele>\n<k_ele>\n<keb>お願い致します</keb>\n</k_ele>\n<r_ele>\n<reb>おねがいいたします</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<xref>お願いします</xref>\n<misc>&hum;</misc>\n<gloss>please</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001740</ent_seq>\n<k_ele>\n<keb>お帰りなさい</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御帰りなさい</keb>\n</k_ele>\n<r_ele>\n<reb>おかえりなさい</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<gloss>welcome home</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001750</ent_seq>\n<k_ele>\n<keb>お気の毒</keb>\n</k_ele>\n<r_ele>\n<reb>おきのどく</reb>\n</r_ele>\n<sense>\n<pos>&adj-na;</pos>\n<xref>気の毒</xref>\n<gloss>pitiful</gloss>\n<gloss>pity</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001760</ent_seq>\n<k_ele>\n<keb>お客さん</keb>\n</k_ele>\n<k_ele>\n<keb>御客さん</keb>\n</k_ele>\n<r_ele>\n<reb>おきゃくさん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&hon;</misc>\n<gloss>guest</gloss>\n<gloss>visitor</gloss>\n<gloss>customer</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001770</ent_seq>\n<k_ele>\n<keb>お客さま</keb>\n</k_ele>\n<k_ele>\n<keb>お客様</keb>\n</k_ele>\n<k_ele>\n<keb>御客様</keb>\n</k_ele>\n<r_ele>\n<reb>おきゃくさま</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&hon;</misc>\n<gloss>guest</gloss>\n<gloss>visitor</gloss>\n<gloss>customer</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001780</ent_seq>\n<k_ele>\n<keb>お休みなさい</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御休みなさい</keb>\n</k_ele>\n<r_ele>\n<reb>おやすみなさい</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<misc>&uk;</misc>\n<gloss>good night</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001790</ent_seq>\n<k_ele>\n<keb>お宮</keb>\n</k_ele>\n<r_ele>\n<reb>おみや</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>Shinto shrine</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001800</ent_seq>\n<k_ele>\n<keb>お宮参り</keb>\n</k_ele>\n<k_ele>\n<keb>御宮参り</keb>\n</k_ele>\n<r_ele>\n<reb>おみやまいり</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>宮参り</xref>\n<gloss>shrine visit</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001810</ent_seq>\n<k_ele>\n<keb>お供</keb>\n</k_ele>\n<k_ele>\n<keb>御供</keb>\n</k_ele>\n<k_ele>\n<keb>お伴</keb>\n</k_ele>\n<k_ele>\n<keb>御伴</keb>\n</k_ele>\n<r_ele>\n<reb>おとも</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<xref>供・とも</xref>\n<gloss>attendant</gloss>\n<gloss>companion</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001820</ent_seq>\n<k_ele>\n<keb>お金</keb>\n<ke_pri>ichi1</ke_pri>\n<ke_pri>news1</ke_pri>\n<ke_pri>nf04</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御金</keb>\n</k_ele>\n<r_ele>\n<reb>おかね</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news1</re_pri>\n<re_pri>nf04</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>金・かね・1</xref>\n<misc>&pol;</misc>\n<gloss>money</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001830</ent_seq>\n<k_ele>\n<keb>お兄さん</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御兄さん</keb>\n</k_ele>\n<r_ele>\n<reb>おにいさん</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>兄さん</xref>\n<misc>&hon;</misc>\n<gloss>older brother</gloss>\n<gloss>elder brother</gloss>\n</sense>\n<sense>\n<gloss>(vocative) young man</gloss>\n<gloss>buddy</gloss>\n<gloss>fella</gloss>\n<gloss>laddie</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001840</ent_seq>\n<k_ele>\n<keb>お兄ちゃん</keb>\n</k_ele>\n<k_ele>\n<keb>御兄ちゃん</keb>\n</k_ele>\n<r_ele>\n<reb>おにいちゃん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&fam;</misc>\n<gloss>familiar form of \"older brother\"</gloss>\n</sense>\n<sense>\n<misc>&fam;</misc>\n<gloss>form of address for young adult male</gloss>\n<gloss>mister</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001850</ent_seq>\n<k_ele>\n<keb>お結び</keb>\n</k_ele>\n<k_ele>\n<keb>御結び</keb>\n</k_ele>\n<r_ele>\n<reb>おむすび</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>rice ball</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001860</ent_seq>\n<k_ele>\n<keb>お見えになる</keb>\n</k_ele>\n<k_ele>\n<keb>御見えになる</keb>\n</k_ele>\n<r_ele>\n<reb>おみえになる</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<pos>&v5r;</pos>\n<misc>&hon;</misc>\n<gloss>to arrive</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001870</ent_seq>\n<k_ele>\n<keb>お見舞い</keb>\n</k_ele>\n<k_ele>\n<keb>お見舞</keb>\n</k_ele>\n<k_ele>\n<keb>御見舞い</keb>\n</k_ele>\n<k_ele>\n<keb>御見舞</keb>\n</k_ele>\n<r_ele>\n<reb>おみまい</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>見舞い</xref>\n<gloss>calling on someone who is ill</gloss>\n<gloss>enquiry</gloss>\n<gloss>inquiry</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001880</ent_seq>\n<k_ele>\n<keb>お古</keb>\n</k_ele>\n<k_ele>\n<keb>御古</keb>\n</k_ele>\n<r_ele>\n<reb>おふる</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>used article (esp. clothes)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001890</ent_seq>\n<k_ele>\n<keb>お好み焼き</keb>\n</k_ele>\n<k_ele>\n<keb>お好み焼</keb>\n</k_ele>\n<k_ele>\n<keb>御好み焼き</keb>\n</k_ele>\n<k_ele>\n<keb>御好み焼</keb>\n</k_ele>\n<r_ele>\n<reb>おこのみやき</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>okonomiyaki</gloss>\n<gloss>savoury pancake containing meat or seafood and vegetables</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001900</ent_seq>\n<k_ele>\n<keb>お構いなく</keb>\n</k_ele>\n<k_ele>\n<keb>御構いなく</keb>\n</k_ele>\n<r_ele>\n<reb>おかまいなく</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<misc>&pol;</misc>\n<gloss>please don't fuss over me</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001910</ent_seq>\n<k_ele>\n<keb>お絞り</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御絞り</keb>\n</k_ele>\n<r_ele>\n<reb>おしぼり</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>wet towel (supplied at table)</gloss>\n<gloss>hot, moistened hand towel</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001920</ent_seq>\n<k_ele>\n<keb>お札</keb>\n</k_ele>\n<k_ele>\n<keb>御札</keb>\n</k_ele>\n<r_ele>\n<reb>おさつ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>bill</gloss>\n<gloss>note (currency)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001930</ent_seq>\n<k_ele>\n<keb>お雑煮</keb>\n</k_ele>\n<k_ele>\n<keb>御雑煮</keb>\n</k_ele>\n<r_ele>\n<reb>おぞうに</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>雑煮・ぞうに</xref>\n<field>&food;</field>\n<misc>&pol;</misc>\n<gloss>soup containing rice cakes and vegetables (New Year's dish)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001940</ent_seq>\n<k_ele>\n<keb>お三時</keb>\n</k_ele>\n<k_ele>\n<keb>御三時</keb>\n</k_ele>\n<r_ele>\n<reb>おさんじ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>three-o'clock snack</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001950</ent_seq>\n<k_ele>\n<keb>お参り</keb>\n<ke_pri>ichi1</ke_pri>\n<ke_pri>news2</ke_pri>\n<ke_pri>nf36</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御参り</keb>\n</k_ele>\n<r_ele>\n<reb>おまいり</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news2</re_pri>\n<re_pri>nf36</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<gloss>worship</gloss>\n<gloss>shrine visit</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001960</ent_seq>\n<k_ele>\n<keb>お産</keb>\n<ke_pri>news1</ke_pri>\n<ke_pri>nf22</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御産</keb>\n</k_ele>\n<r_ele>\n<reb>おさん</reb>\n<re_pri>news1</re_pri>\n<re_pri>nf22</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>産・さん・1</xref>\n<misc>&pol;</misc>\n<gloss>(giving) birth</gloss>\n<gloss>childbirth</gloss>\n<gloss>delivery</gloss>\n<gloss>confinement</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001970</ent_seq>\n<k_ele>\n<keb>お仕舞い</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>お終い</keb>\n</k_ele>\n<k_ele>\n<keb>御仕舞い</keb>\n</k_ele>\n<k_ele>\n<keb>御終い</keb>\n</k_ele>\n<k_ele>\n<keb>お仕舞</keb>\n</k_ele>\n<k_ele>\n<keb>御仕舞</keb>\n</k_ele>\n<r_ele>\n<reb>おしまい</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>仕舞い・1</xref>\n<misc>&uk;</misc>\n<misc>&pol;</misc>\n<gloss>the end</gloss>\n<gloss>closing</gloss>\n<gloss>being done for</gloss>\n</sense>\n<sense>\n<pos>&exp;</pos>\n<misc>&uk;</misc>\n<gloss>That's it</gloss>\n<gloss>That's enough</gloss>\n<gloss>That's all</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001980</ent_seq>\n<k_ele>\n<keb>お使い</keb>\n<ke_pri>news2</ke_pri>\n<ke_pri>nf36</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御使い</keb>\n</k_ele>\n<k_ele>\n<keb>御遣い</keb>\n</k_ele>\n<k_ele>\n<keb>お遣い</keb>\n</k_ele>\n<k_ele>\n<keb>お使</keb>\n<ke_inf>&io;</ke_inf>\n</k_ele>\n<r_ele>\n<reb>おつかい</reb>\n<re_pri>news2</re_pri>\n<re_pri>nf36</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>使い・つかい・1</xref>\n<misc>&pol;</misc>\n<gloss>errand</gloss>\n<gloss>mission</gloss>\n<gloss>going as envoy</gloss>\n</sense>\n<sense>\n<misc>&pol;</misc>\n<gloss>messenger</gloss>\n<gloss>bearer</gloss>\n<gloss>errand boy</gloss>\n<gloss>errand girl</gloss>\n</sense>\n<sense>\n<misc>&pol;</misc>\n<misc>&hon;</misc>\n<gloss>familiar spirit</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1001990</ent_seq>\n<k_ele>\n<keb>お姉さん</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>お姐さん</keb>\n</k_ele>\n<k_ele>\n<keb>御姉さん</keb>\n</k_ele>\n<k_ele>\n<keb>御姐さん</keb>\n</k_ele>\n<r_ele>\n<reb>おねえさん</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>姉さん・1</xref>\n<misc>&hon;</misc>\n<s_inf>usu. お姉さん</s_inf>\n<gloss>elder sister</gloss>\n</sense>\n<sense>\n<xref>姉さん・2</xref>\n<gloss>(vocative) young lady</gloss>\n</sense>\n<sense>\n<xref>姉さん・3</xref>\n<s_inf>usu. お姐さん</s_inf>\n<gloss>miss (referring to a waitress, etc.)</gloss>\n</sense>\n<sense>\n<xref>姉さん・4</xref>\n<s_inf>usu. お姐さん</s_inf>\n<gloss>ma'am (used by geisha to refer to their superiors)</gloss>\n</sense>\n<sense>\n<gloss>older girl (no relation)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002000</ent_seq>\n<k_ele>\n<keb>お子さん</keb>\n</k_ele>\n<k_ele>\n<keb>御子さん</keb>\n</k_ele>\n<r_ele>\n<reb>おこさん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&hon;</misc>\n<gloss>child</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002010</ent_seq>\n<k_ele>\n<keb>お子様</keb>\n</k_ele>\n<r_ele>\n<reb>おこさま</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&pol;</misc>\n<gloss>child (someone else's)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002020</ent_seq>\n<k_ele>\n<keb>お歯黒</keb>\n</k_ele>\n<k_ele>\n<keb>御歯黒</keb>\n</k_ele>\n<k_ele>\n<keb>鉄漿</keb>\n</k_ele>\n<r_ele>\n<reb>おはぐろ</reb>\n</r_ele>\n<r_ele>\n<reb>かね</reb>\n<re_restr>鉄漿</re_restr>\n</r_ele>\n<r_ele>\n<reb>てっしょう</reb>\n<re_restr>鉄漿</re_restr>\n</r_ele>\n<sense>\n<stagr>おはぐろ</stagr>\n<pos>&n;</pos>\n<gloss>tooth blackening</gloss>\n</sense>\n<sense>\n<gloss>tooth-blackening dye</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002030</ent_seq>\n<k_ele>\n<keb>お辞儀</keb>\n<ke_pri>ichi1</ke_pri>\n<ke_pri>news2</ke_pri>\n<ke_pri>nf39</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御辞儀</keb>\n</k_ele>\n<r_ele>\n<reb>おじぎ</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news2</re_pri>\n<re_pri>nf39</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<xref>辞儀・1</xref>\n<misc>&pol;</misc>\n<gloss>bow</gloss>\n<gloss>bowing</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002040</ent_seq>\n<k_ele>\n<keb>お七夜</keb>\n</k_ele>\n<r_ele>\n<reb>おしちや</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>name-giving ceremony</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002050</ent_seq>\n<k_ele>\n<keb>お邪魔します</keb>\n</k_ele>\n<k_ele>\n<keb>御邪魔します</keb>\n</k_ele>\n<r_ele>\n<reb>おじゃまします</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<gloss>excuse me for disturbing (interrupting) you</gloss>\n<gloss>greeting used when entering someone's home</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002060</ent_seq>\n<k_ele>\n<keb>お守り</keb>\n<ke_pri>ichi1</ke_pri>\n<ke_pri>news2</ke_pri>\n<ke_pri>nf26</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御守り</keb>\n</k_ele>\n<k_ele>\n<keb>お守</keb>\n</k_ele>\n<k_ele>\n<keb>御守</keb>\n</k_ele>\n<r_ele>\n<reb>おまもり</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news2</re_pri>\n<re_pri>nf26</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>charm</gloss>\n<gloss>amulet</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002070</ent_seq>\n<k_ele>\n<keb>お手玉</keb>\n</k_ele>\n<k_ele>\n<keb>御手玉</keb>\n</k_ele>\n<r_ele>\n<reb>おてだま</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>beanbag</gloss>\n<gloss>beanbag juggling game</gloss>\n</sense>\n<sense>\n<field>&baseb;</field>\n<gloss>bobbling the ball</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002080</ent_seq>\n<k_ele>\n<keb>お手上げ</keb>\n<ke_pri>news1</ke_pri>\n<ke_pri>nf22</ke_pri>\n</k_ele>\n<k_ele>\n<keb>お手あげ</keb>\n</k_ele>\n<k_ele>\n<keb>御手上げ</keb>\n</k_ele>\n<r_ele>\n<reb>おてあげ</reb>\n<re_pri>news1</re_pri>\n<re_pri>nf22</re_pri>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<pos>&adj-no;</pos>\n<gloss>all over</gloss>\n<gloss>given in</gloss>\n<gloss>given up hope</gloss>\n<gloss>bringing to knees</gloss>\n<gloss>throwing up one's hands</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002090</ent_seq>\n<k_ele>\n<keb>お手盛り</keb>\n<ke_pri>news2</ke_pri>\n<ke_pri>nf33</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御手盛り</keb>\n</k_ele>\n<r_ele>\n<reb>おてもり</reb>\n<re_pri>news2</re_pri>\n<re_pri>nf33</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>making arbitrary decisions which benefit oneself</gloss>\n<gloss>self-approved plan</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002100</ent_seq>\n<k_ele>\n<keb>お手洗い</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御手洗い</keb>\n</k_ele>\n<r_ele>\n<reb>おてあらい</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>toilet</gloss>\n<gloss>restroom</gloss>\n<gloss>lavatory</gloss>\n<gloss>bathroom</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002110</ent_seq>\n<k_ele>\n<keb>お手伝いさん</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<r_ele>\n<reb>おてつだいさん</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>maid</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002120</ent_seq>\n<k_ele>\n<keb>お巡りさん</keb>\n<ke_pri>ichi1</ke_pri>\n<ke_pri>news2</ke_pri>\n<ke_pri>nf40</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御巡りさん</keb>\n</k_ele>\n<r_ele>\n<reb>おまわりさん</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news2</re_pri>\n<re_pri>nf40</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>巡査</xref>\n<misc>&fam;</misc>\n<gloss>police officer</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002130</ent_seq>\n<k_ele>\n<keb>お召し</keb>\n</k_ele>\n<k_ele>\n<keb>御召し</keb>\n</k_ele>\n<k_ele>\n<keb>お召</keb>\n</k_ele>\n<k_ele>\n<keb>御召</keb>\n</k_ele>\n<r_ele>\n<reb>おめし</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&hon;</misc>\n<gloss>summoning</gloss>\n<gloss>calling</gloss>\n<gloss>riding</gloss>\n<gloss>wearing</gloss>\n<gloss>dressing</gloss>\n<gloss>clothing</gloss>\n</sense>\n<sense>\n<xref>御召縮緬</xref>\n<misc>&abbr;</misc>\n<gloss>(high-quality) silk crepe (fabric)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002140</ent_seq>\n<k_ele>\n<keb>お召し物</keb>\n</k_ele>\n<k_ele>\n<keb>御召し物</keb>\n</k_ele>\n<r_ele>\n<reb>おめしもの</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&pol;</misc>\n<gloss>clothing</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002150</ent_seq>\n<k_ele>\n<keb>お勧め</keb>\n</k_ele>\n<k_ele>\n<keb>お薦め</keb>\n</k_ele>\n<k_ele>\n<keb>お奨め</keb>\n</k_ele>\n<k_ele>\n<keb>御勧め</keb>\n</k_ele>\n<k_ele>\n<keb>御薦め</keb>\n</k_ele>\n<k_ele>\n<keb>御奨め</keb>\n</k_ele>\n<r_ele>\n<reb>おすすめ</reb>\n</r_ele>\n<r_ele>\n<reb>オススメ</reb>\n<re_nokanji/>\n</r_ele>\n<r_ele>\n<reb>おススメ</reb>\n<re_nokanji/>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<xref>勧め</xref>\n<misc>&uk;</misc>\n<gloss>recommendation</gloss>\n<gloss>advice</gloss>\n<gloss>suggestion</gloss>\n<gloss>encouragement</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002160</ent_seq>\n<k_ele>\n<keb>お上りさん</keb>\n</k_ele>\n<r_ele>\n<reb>おのぼりさん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>countryside people (in town)</gloss>\n<gloss>visitor from the country</gloss>\n<gloss>out-of-towner</gloss>\n<gloss>country bumpkin (visiting the big city)</gloss>\n<gloss>yokel</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002170</ent_seq>\n<k_ele>\n<keb>お嬢さん</keb>\n<ke_pri>ichi1</ke_pri>\n<ke_pri>news1</ke_pri>\n<ke_pri>nf21</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御嬢さん</keb>\n</k_ele>\n<r_ele>\n<reb>おじょうさん</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news1</re_pri>\n<re_pri>nf21</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>嬢さん・じょうさん・1</xref>\n<misc>&hon;</misc>\n<gloss>daughter</gloss>\n</sense>\n<sense>\n<xref>嬢さん・じょうさん・2</xref>\n<gloss>young lady</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002180</ent_seq>\n<k_ele>\n<keb>お食い初め</keb>\n</k_ele>\n<k_ele>\n<keb>御食い初め</keb>\n</k_ele>\n<r_ele>\n<reb>おくいぞめ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>食い初め</xref>\n<gloss>weaning ceremony</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002190</ent_seq>\n<k_ele>\n<keb>お尻</keb>\n</k_ele>\n<k_ele>\n<keb>御尻</keb>\n</k_ele>\n<r_ele>\n<reb>おしり</reb>\n</r_ele>\n<r_ele>\n<reb>オシリ</reb>\n<re_nokanji/>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&pol;</misc>\n<gloss>bottom</gloss>\n<gloss>buttocks</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002200</ent_seq>\n<k_ele>\n<keb>お寝小</keb>\n</k_ele>\n<k_ele>\n<keb>御寝小</keb>\n</k_ele>\n<r_ele>\n<reb>おねしょ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&uk;</misc>\n<misc>&fem;</misc>\n<misc>&chn;</misc>\n<gloss>bed-wetting</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002210</ent_seq>\n<k_ele>\n<keb>お新香</keb>\n</k_ele>\n<k_ele>\n<keb>御新香</keb>\n</k_ele>\n<r_ele>\n<reb>おしんこ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>新香</xref>\n<gloss>pickled vegetables</gloss>\n<gloss>pickles</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002220</ent_seq>\n<k_ele>\n<keb>お浸し</keb>\n</k_ele>\n<k_ele>\n<keb>御浸し</keb>\n</k_ele>\n<k_ele>\n<keb>御したし</keb>\n</k_ele>\n<r_ele>\n<reb>おひたし</reb>\n<re_restr>お浸し</re_restr>\n<re_restr>御浸し</re_restr>\n</r_ele>\n<r_ele>\n<reb>おしたし</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<field>&food;</field>\n<gloss>boiled greens in bonito-flavoured soy sauce (vegetable side dish)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002230</ent_seq>\n<k_ele>\n<keb>お神酒</keb>\n</k_ele>\n<k_ele>\n<keb>御神酒</keb>\n</k_ele>\n<r_ele>\n<reb>おみき</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>神酒</xref>\n<gloss>sacred wine or sake</gloss>\n<gloss>sake offered to the gods</gloss>\n</sense>\n<sense>\n<misc>&joc;</misc>\n<gloss>sake</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002240</ent_seq>\n<k_ele>\n<keb>お尋ね者</keb>\n</k_ele>\n<r_ele>\n<reb>おたずねもの</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>wanted man</gloss>\n<gloss>person sought by the police</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002250</ent_seq>\n<k_ele>\n<keb>お世辞</keb>\n<ke_pri>ichi1</ke_pri>\n<ke_pri>news2</ke_pri>\n<ke_pri>nf32</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御世辞</keb>\n</k_ele>\n<r_ele>\n<reb>おせじ</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news2</re_pri>\n<re_pri>nf32</re_pri>\n</r_ele>\n<r_ele>\n<reb>おせいじ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>世辞</xref>\n<gloss>flattery</gloss>\n<gloss>compliment</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002260</ent_seq>\n<k_ele>\n<keb>お世話になる</keb>\n</k_ele>\n<k_ele>\n<keb>御世話になる</keb>\n</k_ele>\n<r_ele>\n<reb>おせわになる</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<pos>&v5r;</pos>\n<xref>世話になる</xref>\n<gloss>to receive favor (favour)</gloss>\n<gloss>to be much obliged to someone</gloss>\n<gloss>to be indebted</gloss>\n<gloss>to be grateful</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002270</ent_seq>\n<k_ele>\n<keb>お生憎様</keb>\n</k_ele>\n<k_ele>\n<keb>お生憎さま</keb>\n</k_ele>\n<k_ele>\n<keb>御生憎様</keb>\n</k_ele>\n<r_ele>\n<reb>おあいにくさま</reb>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<pos>&adj-na;</pos>\n<misc>&uk;</misc>\n<gloss>that's too bad (often ironic)</gloss>\n<gloss>too bad for you!</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002280</ent_seq>\n<k_ele>\n<keb>お先に</keb>\n</k_ele>\n<r_ele>\n<reb>おさきに</reb>\n</r_ele>\n<sense>\n<pos>&adv;</pos>\n<gloss>before</gloss>\n<gloss>previously</gloss>\n</sense>\n<sense>\n<gloss>ahead</gloss>\n</sense>\n<sense>\n<pos>&exp;</pos>\n<xref>お先に失礼します</xref>\n<misc>&abbr;</misc>\n<misc>&hon;</misc>\n<gloss>Pardon me for leaving (before you)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002290</ent_seq>\n<k_ele>\n<keb>お前</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御前</keb>\n<ke_pri>news1</ke_pri>\n<ke_pri>nf22</ke_pri>\n</k_ele>\n<r_ele>\n<reb>おまえ</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news1</re_pri>\n<re_pri>nf22</re_pri>\n</r_ele>\n<r_ele>\n<reb>おまい</reb>\n</r_ele>\n<r_ele>\n<reb>おめえ</reb>\n</r_ele>\n<sense>\n<pos>&pn;</pos>\n<pos>&adj-no;</pos>\n<misc>&fam;</misc>\n<misc>&male;</misc>\n<gloss>you (formerly honorific, now sometimes derog. term referring to an equal or inferior)</gloss>\n</sense>\n<sense>\n<stagr>おまえ</stagr>\n<gloss>presence (of a god, nobleman, etc.)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002300</ent_seq>\n<k_ele>\n<keb>お前さん</keb>\n</k_ele>\n<k_ele>\n<keb>御前さん</keb>\n</k_ele>\n<r_ele>\n<reb>おまえさん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>you</gloss>\n</sense>\n<sense>\n<gloss>my dear</gloss>\n</sense>\n<sense>\n<gloss>hey</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002310</ent_seq>\n<k_ele>\n<keb>お膳</keb>\n</k_ele>\n<r_ele>\n<reb>おぜん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>four-legged tray for festive food</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002320</ent_seq>\n<k_ele>\n<keb>お祖父さん</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>お爺さん</keb>\n</k_ele>\n<k_ele>\n<keb>御爺さん</keb>\n</k_ele>\n<k_ele>\n<keb>御祖父さん</keb>\n</k_ele>\n<r_ele>\n<reb>おじいさん</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>祖父さん</xref>\n<misc>&uk;</misc>\n<s_inf>usu. お祖父さん</s_inf>\n<gloss>grandfather</gloss>\n</sense>\n<sense>\n<misc>&uk;</misc>\n<s_inf>usu. お爺さん</s_inf>\n<gloss>male senior-citizen</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002330</ent_seq>\n<k_ele>\n<keb>お祖母さん</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>お婆さん</keb>\n</k_ele>\n<k_ele>\n<keb>御祖母さん</keb>\n</k_ele>\n<k_ele>\n<keb>御婆さん</keb>\n</k_ele>\n<r_ele>\n<reb>おばあさん</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>祖母さん・1</xref>\n<misc>&uk;</misc>\n<s_inf>usu. お祖母さん</s_inf>\n<gloss>grandmother</gloss>\n</sense>\n<sense>\n<xref>婆さん・2</xref>\n<misc>&uk;</misc>\n<s_inf>usu. お婆さん</s_inf>\n<gloss>old woman</gloss>\n<gloss>female senior citizen</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002340</ent_seq>\n<k_ele>\n<keb>お早うございます</keb>\n<ke_pri>spec1</ke_pri>\n</k_ele>\n<r_ele>\n<reb>おはようございます</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&int;</pos>\n<xref>お早う</xref>\n<misc>&uk;</misc>\n<misc>&pol;</misc>\n<s_inf>may be used more generally at any time of day</s_inf>\n<gloss>good morning</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002350</ent_seq>\n<k_ele>\n<keb>お孫さん</keb>\n</k_ele>\n<k_ele>\n<keb>御孫さん</keb>\n</k_ele>\n<r_ele>\n<reb>おまごさん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&hon;</misc>\n<gloss>grandchild</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002360</ent_seq>\n<k_ele>\n<keb>お待ち遠様</keb>\n</k_ele>\n<k_ele>\n<keb>御待ち遠様</keb>\n</k_ele>\n<k_ele>\n<keb>お待ち遠さま</keb>\n</k_ele>\n<r_ele>\n<reb>おまちどおさま</reb>\n</r_ele>\n<r_ele>\n<reb>おまちどうさま</reb>\n<re_inf>&ik;</re_inf>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<gloss>I'm sorry to have kept you waiting</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002370</ent_seq>\n<k_ele>\n<keb>お袋</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御袋</keb>\n</k_ele>\n<k_ele>\n<keb>お母</keb>\n<ke_inf>&iK;</ke_inf>\n</k_ele>\n<r_ele>\n<reb>おふくろ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<r_ele>\n<reb>オフクロ</reb>\n<re_nokanji/>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&col;</misc>\n<misc>&uk;</misc>\n<gloss>one's mother</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002390</ent_seq>\n<k_ele>\n<keb>お大事に</keb>\n<ke_pri>spec1</ke_pri>\n</k_ele>\n<r_ele>\n<reb>おだいじに</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<gloss>take care of yourself</gloss>\n<gloss>get well soon</gloss>\n<gloss>God bless you</gloss>\n<gloss>bless you</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002400</ent_seq>\n<k_ele>\n<keb>お宅</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御宅</keb>\n</k_ele>\n<r_ele>\n<reb>おたく</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&hon;</misc>\n<gloss>your house</gloss>\n<gloss>your home</gloss>\n<gloss>your family</gloss>\n</sense>\n<sense>\n<misc>&hon;</misc>\n<gloss>your husband</gloss>\n</sense>\n<sense>\n<misc>&hon;</misc>\n<gloss>your organization</gloss>\n</sense>\n<sense>\n<pos>&pn;</pos>\n<pos>&adj-no;</pos>\n<misc>&hon;</misc>\n<gloss>you (referring to someone of equal status with whom one is not especially close)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002410</ent_seq>\n<k_ele>\n<keb>お誕生日おめでとうございます</keb>\n</k_ele>\n<k_ele>\n<keb>御誕生日おめでとうございます</keb>\n</k_ele>\n<r_ele>\n<reb>おたんじょうびおめでとうございます</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<gloss>Happy Birthday</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002420</ent_seq>\n<k_ele>\n<keb>お知らせ</keb>\n<ke_pri>news2</ke_pri>\n<ke_pri>nf29</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御知らせ</keb>\n</k_ele>\n<k_ele>\n<keb>お報せ</keb>\n</k_ele>\n<k_ele>\n<keb>御報せ</keb>\n</k_ele>\n<r_ele>\n<reb>おしらせ</reb>\n<re_pri>news2</re_pri>\n<re_pri>nf29</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<xref>知らせ・1</xref>\n<gloss>notice</gloss>\n<gloss>notification</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002430</ent_seq>\n<k_ele>\n<keb>お茶</keb>\n<ke_pri>ichi1</ke_pri>\n<ke_pri>news1</ke_pri>\n<ke_pri>nf06</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御茶</keb>\n</k_ele>\n<r_ele>\n<reb>おちゃ</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news1</re_pri>\n<re_pri>nf06</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>茶・1</xref>\n<misc>&pol;</misc>\n<gloss>tea (usu. green)</gloss>\n</sense>\n<sense>\n<gloss>tea break (at work)</gloss>\n</sense>\n<sense>\n<xref>茶の湯</xref>\n<gloss>tea ceremony</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002440</ent_seq>\n<k_ele>\n<keb>お猪口</keb>\n</k_ele>\n<k_ele>\n<keb>御猪口</keb>\n</k_ele>\n<r_ele>\n<reb>おちょこ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>猪口</xref>\n<misc>&uk;</misc>\n<gloss>small cup</gloss>\n<gloss>sake cup</gloss>\n</sense>\n<sense>\n<gloss>cup-shaped</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002450</ent_seq>\n<k_ele>\n<keb>お喋り</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御喋り</keb>\n</k_ele>\n<r_ele>\n<reb>おしゃべり</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<misc>&uk;</misc>\n<gloss>chattering</gloss>\n<gloss>talk</gloss>\n<gloss>idle talk</gloss>\n<gloss>chat</gloss>\n<gloss>chitchat</gloss>\n<gloss>gossip</gloss>\n</sense>\n<sense>\n<pos>&adj-na;</pos>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<gloss>chatty</gloss>\n<gloss>talkative</gloss>\n<gloss>chatterbox</gloss>\n<gloss>blabbermouth</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002470</ent_seq>\n<k_ele>\n<keb>お天気</keb>\n</k_ele>\n<k_ele>\n<keb>御天気</keb>\n</k_ele>\n<r_ele>\n<reb>おてんき</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>天気</xref>\n<misc>&pol;</misc>\n<gloss>weather</gloss>\n</sense>\n<sense>\n<gloss>temper</gloss>\n<gloss>mood</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002480</ent_seq>\n<k_ele>\n<keb>お転婆</keb>\n</k_ele>\n<k_ele>\n<keb>御転婆</keb>\n</k_ele>\n<r_ele>\n<reb>おてんば</reb>\n</r_ele>\n<sense>\n<pos>&adj-na;</pos>\n<pos>&n;</pos>\n<misc>&uk;</misc>\n<lsource xml:lang=\"dut\">ontembaar</lsource>\n<gloss>tomboy</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002490</ent_seq>\n<k_ele>\n<keb>お屠蘇</keb>\n</k_ele>\n<k_ele>\n<keb>御屠蘇</keb>\n</k_ele>\n<r_ele>\n<reb>おとそ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>New Year's sake</gloss>\n<gloss>spiced sake</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002500</ent_seq>\n<k_ele>\n<keb>お土産</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御土産</keb>\n</k_ele>\n<r_ele>\n<reb>おみやげ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<r_ele>\n<reb>おみあげ</reb>\n<re_inf>&ik;</re_inf>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>土産・みやげ</xref>\n<misc>&pol;</misc>\n<gloss>present</gloss>\n<gloss>souvenir</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002510</ent_seq>\n<k_ele>\n<keb>お湯</keb>\n</k_ele>\n<k_ele>\n<keb>御湯</keb>\n</k_ele>\n<r_ele>\n<reb>おゆ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&pol;</misc>\n<gloss>hot water</gloss>\n</sense>\n<sense>\n<misc>&pol;</misc>\n<gloss>hot bath</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002520</ent_seq>\n<k_ele>\n<keb>お得</keb>\n</k_ele>\n<k_ele>\n<keb>お徳</keb>\n</k_ele>\n<k_ele>\n<keb>御得</keb>\n</k_ele>\n<k_ele>\n<keb>御徳</keb>\n</k_ele>\n<r_ele>\n<reb>おとく</reb>\n</r_ele>\n<sense>\n<pos>&adj-na;</pos>\n<pos>&adj-no;</pos>\n<gloss>economical</gloss>\n<gloss>bargain</gloss>\n<gloss>good value</gloss>\n<gloss>good-value</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002530</ent_seq>\n<k_ele>\n<keb>お凸</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御凸</keb>\n</k_ele>\n<r_ele>\n<reb>おでこ</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>凸・でこ・1</xref>\n<misc>&uk;</misc>\n<gloss>brow</gloss>\n<gloss>forehead</gloss>\n</sense>\n<sense>\n<misc>&uk;</misc>\n<gloss>prominent forehead</gloss>\n<gloss>beetle brow</gloss>\n</sense>\n<sense>\n<misc>&uk;</misc>\n<misc>&col;</misc>\n<gloss>not catching anything (in fishing)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002550</ent_seq>\n<k_ele>\n<keb>お婆はる</keb>\n</k_ele>\n<r_ele>\n<reb>おばはる</reb>\n</r_ele>\n<sense>\n<pos>&v5r;</pos>\n<misc>&sl;</misc>\n<gloss>to shamelessly demand one's rights</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002560</ent_seq>\n<k_ele>\n<keb>お婆ん</keb>\n</k_ele>\n<r_ele>\n<reb>おばん</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>おばあさん・2</xref>\n<gloss>old maid</gloss>\n<gloss>frump</gloss>\n<gloss>hag</gloss>\n<gloss>old woman</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002570</ent_seq>\n<k_ele>\n<keb>お疲れ様</keb>\n<ke_pri>spec1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>お疲れさま</keb>\n<ke_pri>spec1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御疲れ様</keb>\n</k_ele>\n<r_ele>\n<reb>おつかれさま</reb>\n<re_pri>spec1</re_pri>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<gloss>thank you</gloss>\n<gloss>many thanks</gloss>\n<gloss>much appreciated</gloss>\n</sense>\n<sense>\n<gloss>that's enough for today</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002580</ent_seq>\n<k_ele>\n<keb>お付き</keb>\n</k_ele>\n<k_ele>\n<keb>御付き</keb>\n</k_ele>\n<r_ele>\n<reb>おつき</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>retainer</gloss>\n<gloss>attendant</gloss>\n<gloss>escort</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002590</ent_seq>\n<k_ele>\n<keb>お父さん</keb>\n<ke_pri>ichi1</ke_pri>\n<ke_pri>news1</ke_pri>\n<ke_pri>nf07</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御父さん</keb>\n</k_ele>\n<r_ele>\n<reb>おとうさん</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news1</re_pri>\n<re_pri>nf07</re_pri>\n</r_ele>\n<r_ele>\n<reb>おとっさん</reb>\n<re_inf>&ok;</re_inf>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>父さん</xref>\n<misc>&hon;</misc>\n<gloss>father</gloss>\n<gloss>dad</gloss>\n<gloss>papa</gloss>\n<gloss>pa</gloss>\n<gloss>pop</gloss>\n<gloss>daddy</gloss>\n<gloss>dada</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002600</ent_seq>\n<k_ele>\n<keb>お風呂に入る</keb>\n</k_ele>\n<r_ele>\n<reb>おふろにはいる</reb>\n</r_ele>\n<sense>\n<pos>&exp;</pos>\n<pos>&v5r;</pos>\n<gloss>to take a bath</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002610</ent_seq>\n<k_ele>\n<keb>お腹</keb>\n<ke_pri>ichi1</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御腹</keb>\n</k_ele>\n<k_ele>\n<keb>お中</keb>\n</k_ele>\n<k_ele>\n<keb>御中</keb>\n</k_ele>\n<r_ele>\n<reb>おなか</reb>\n<re_pri>ichi1</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<misc>&pol;</misc>\n<gloss>stomach</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002630</ent_seq>\n<k_ele>\n<keb>お別れ</keb>\n</k_ele>\n<r_ele>\n<reb>おわかれ</reb>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<gloss>farewell</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002640</ent_seq>\n<k_ele>\n<keb>お返し</keb>\n<ke_pri>news1</ke_pri>\n<ke_pri>nf18</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御返し</keb>\n</k_ele>\n<r_ele>\n<reb>おかえし</reb>\n<re_pri>news1</re_pri>\n<re_pri>nf18</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<pos>&vs;</pos>\n<gloss>return gift</gloss>\n<gloss>return favour (favor)</gloss>\n</sense>\n<sense>\n<gloss>revenge</gloss>\n</sense>\n<sense>\n<gloss>change (in a cash transaction)</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002650</ent_seq>\n<k_ele>\n<keb>お母さん</keb>\n<ke_pri>ichi1</ke_pri>\n<ke_pri>news1</ke_pri>\n<ke_pri>nf05</ke_pri>\n</k_ele>\n<k_ele>\n<keb>御母さん</keb>\n</k_ele>\n<r_ele>\n<reb>おかあさん</reb>\n<re_pri>ichi1</re_pri>\n<re_pri>news1</re_pri>\n<re_pri>nf05</re_pri>\n</r_ele>\n<sense>\n<pos>&n;</pos>\n<xref>母さん・1</xref>\n<misc>&hon;</misc>\n<gloss>mother</gloss>\n</sense>\n</entry>\n<entry>\n<ent_seq>1002660</ent_seq>\n<k_ele>\n<keb>お母様</keb>\n</k_ele>\n<k_ele>\n<keb>御母様</keb>\n</k_ele>\n<k_ele>\n<keb>お母さま</keb>\n</k_ele>\n<r_ele>\n<reb>おかあさま</reb>\n</r_ele>\n</entry>\n</JMdict>\n"
  },
  {
    "path": "test/data/jamdict.json",
    "content": "{\n    \"JAMDICT_HOME\": \".\",\n    \"JAMDICT_DATA\": \"{JAMDICT_HOME}/data\",\n    \"JAMDICT_DB\": \"{JAMDICT_HOME}/test/data/jamdict.db\",\n    \"JMDICT_XML\": \"{JAMDICT_DATA}/JMdict_e.gz\",\n    \"JMNEDICT_XML\": \"{JAMDICT_DATA}/JMnedict.xml.gz\",\n    \"KD2_XML\": \"{JAMDICT_DATA}/kanjidic2.xml.gz\",\n    \"KRADFILE\": \"{JAMDICT_DATA}/kradfile-u.gz\"\n}\n"
  },
  {
    "path": "test/data/jmendict_mini.xml",
    "content": "<?xml version=\"1.0\"?>\n<!DOCTYPE JMnedict [\n<!--\n\tThis is the DTD of the Japanese-Multilingual Named Entity\n\tDictionary file. It is based on the JMdict DTD, and carries\n\tmany fields from it. It is used for a quick-and-dirty conversion\n\tof the ENAMDICT entries, plus the name entries from EDICTH.\n-->\n<!-- Rev 1.08 \n\tMatching revision numbers with the JMdict DTD, which was changed\n\tto delete the <info> and <example> elements\n-->\n<!ELEMENT JMnedict (entry*)>\n<!--                                                                   -->\n<!ELEMENT entry (ent_seq, k_ele*, r_ele+, trans+)*>\n\t<!-- Entries consist of kanji elements, reading elements \n\tname translation elements. Each entry must have at \n\tleast one reading element and one sense element. Others are optional.\n\t-->\n<!ELEMENT ent_seq (#PCDATA)>\n    <!-- A unique numeric sequence number for each entry\n    -->\n<!ELEMENT k_ele (keb, ke_inf*, ke_pri*)>\n\t<!-- The kanji element, or in its absence, the reading element, is \n\tthe defining component of each entry.\n\tThe overwhelming majority of entries will have a single kanji\n\telement associated with an entity name in Japanese. Where there are \n\tmultiple kanji elements within an entry, they will be orthographical\n\tvariants of the same word, either using variations in okurigana, or\n\talternative and equivalent kanji. Common \"mis-spellings\" may be \n\tincluded, provided they are associated with appropriate information\n\tfields. Synonyms are not included; they may be indicated in the\n\tcross-reference field associated with the sense element.\n\t-->\n<!ELEMENT keb (#PCDATA)>\n\t<!-- This element will contain an entity name in Japanese \n\twhich is written using at least one non-kana character (usually\n\tkanji, but can be other characters). The valid \n\tcharacters are kanji, kana, related characters such as chouon and \n\tkurikaeshi, and in exceptional cases, letters from other alphabets.\n\t-->\n<!ELEMENT ke_inf (#PCDATA)>\n\t<!-- This is a coded information field related specifically to the \n\torthography of the keb, and will typically indicate some unusual\n\taspect, such as okurigana irregularity.\n\t-->\n<!ELEMENT ke_pri (#PCDATA)>\n\t<!-- This and the equivalent re_pri field are provided to record\n\tinformation about the relative priority of the entry, and are for\n\tuse either by applications which want to concentrate on entries of \n\ta particular priority, or to generate subset files. The reason\n\tboth the kanji and reading elements are tagged is because on\n\toccasions a priority is only associated with a particular\n\tkanji/reading pair.\n\t-->\n<!--                                                                   -->\n<!ELEMENT r_ele (reb, re_restr*, re_inf*, re_pri*)>\n\t<!-- The reading element typically contains the valid readings\n\tof the word(s) in the kanji element using modern kanadzukai. \n\tWhere there are multiple reading elements, they will typically be\n\talternative readings of the kanji element. In the absence of a \n\tkanji element, i.e. in the case of a word or phrase written\n\tentirely in kana, these elements will define the entry.\n\t-->\n<!ELEMENT reb (#PCDATA)>\n\t<!-- this element content is restricted to kana and related\n\tcharacters such as chouon and kurikaeshi. Kana usage will be\n\tconsistent between the keb and reb elements; e.g. if the keb\n\tcontains katakana, so too will the reb.\n\t-->\n<!ELEMENT re_restr (#PCDATA)>\n\t<!-- This element is used to indicate when the reading only applies\n\tto a subset of the keb elements in the entry. In its absence, all\n\treadings apply to all kanji elements. The contents of this element \n\tmust exactly match those of one of the keb elements.\n\t-->\n<!ELEMENT re_inf (#PCDATA)>\n\t<!-- General coded information pertaining to the specific reading.\n\tTypically it will be used to indicate some unusual aspect of \n\tthe reading. -->\n<!ELEMENT re_pri (#PCDATA)>\n\t<!-- See the comment on ke_pri above. -->\n<!ELEMENT trans (name_type*, xref*, trans_det*)>\n\t<!-- The trans element will record the translational equivalent\n\tof the Japanese name, plus other related information. \n\t-->\n<!ELEMENT name_type (#PCDATA)>\n\t<!-- The type of name, recorded in the appropriate entity codes.\n\t-->\n<!ELEMENT xref (#PCDATA)*>\n    <!-- This element is used to indicate a cross-reference to another\n    entry with a similar or related meaning or sense. The content of\n    this element is typically a keb or reb element in another entry. In some\n    cases a keb will be followed by a reb and/or a sense number to provide\n    a precise target for the cross-reference. Where this happens, a JIS\n    \"centre-dot\" (0x2126) is placed between the components of the \n    cross-reference.\n\t-->\n<!ELEMENT trans_det (#PCDATA)>\n\t<!-- The actual translations of the name, usually as a transcription\n\tinto the target language.\n\t-->\n<!ATTLIST trans_det xml:lang CDATA #IMPLIED>\n\t<!-- The xml:lang attribute defines the target language of the\n\ttranslated name. It will be coded using the three-letter language \n\tcode from the ISO 639-2 standard. When absent, the value \"eng\" \n\t(i.e. English) is the default value. The bibliographic (B) codes\n\tare used.-->\n<!-- The following entity codes are used for common elements within the\nvarious information fields.\n-->\n<!ENTITY surname \"family or surname\">\n<!ENTITY place \"place name\">\n<!ENTITY unclass \"unclassified name\">\n<!ENTITY company \"company name\">\n<!ENTITY product \"product name\">\n<!ENTITY work \"work of art, literature, music, etc. name\">\n<!ENTITY masc \"male given name or forename\">\n<!ENTITY fem \"female given name or forename\">\n<!ENTITY person \"full name of a particular person\">\n<!ENTITY given \"given name or forename, gender not specified\">\n<!ENTITY station \"railway station\">\n<!ENTITY organization \"organization name\">\n<!ENTITY ok \"old or irregular kana form\">\n]>\n<!-- JMnedict created: 2020-05-29 -->\n<JMnedict>\n<entry>\n<ent_seq>1657560</ent_seq>\n<k_ele>\n<keb>国労</keb>\n</k_ele>\n<r_ele>\n<reb>こくろう</reb>\n</r_ele>\n<trans>\n<name_type>&organization;</name_type>\n<trans_det>National Railway Workers' Union</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>2092920</ent_seq>\n<k_ele>\n<keb>ＩＫＥＡ</keb>\n</k_ele>\n<r_ele>\n<reb>イケア</reb>\n</r_ele>\n<trans>\n<name_type>&company;</name_type>\n<trans_det>IKEA</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>2831743</ent_seq>\n<k_ele>\n<keb>蒼国来栄吉</keb>\n</k_ele>\n<r_ele>\n<reb>そうこくらいえいきち</reb>\n</r_ele>\n<trans>\n<name_type>&person;</name_type>\n<trans_det>Sōkokurai Eikichi (sumo wrestler from Inner Mongolia, 1984-)</trans_det>\n<trans_det>Engketübsin</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5000000</ent_seq>\n<k_ele>\n<keb>ゝ泉</keb>\n</k_ele>\n<r_ele>\n<reb>ちゅせん</reb>\n</r_ele>\n<trans>\n<name_type>&given;</name_type>\n<trans_det>Chusen</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5000001</ent_seq>\n<k_ele>\n<keb>〆</keb>\n</k_ele>\n<r_ele>\n<reb>しめ</reb>\n</r_ele>\n<trans>\n<name_type>&fem;</name_type>\n<trans_det>Shime</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5000002</ent_seq>\n<k_ele>\n<keb>〆ヱ</keb>\n</k_ele>\n<r_ele>\n<reb>しめえ</reb>\n</r_ele>\n<trans>\n<name_type>&fem;</name_type>\n<trans_det>Shimee (Shimewe)</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5000003</ent_seq>\n<k_ele>\n<keb>〆丸</keb>\n</k_ele>\n<r_ele>\n<reb>しめまる</reb>\n</r_ele>\n<trans>\n<name_type>&given;</name_type>\n<trans_det>Shimemaru</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5000004</ent_seq>\n<k_ele>\n<keb>〆子</keb>\n</k_ele>\n<r_ele>\n<reb>しめこ</reb>\n</r_ele>\n<trans>\n<name_type>&fem;</name_type>\n<trans_det>Shimeko</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5000005</ent_seq>\n<k_ele>\n<keb>〆治</keb>\n</k_ele>\n<r_ele>\n<reb>しめじ</reb>\n</r_ele>\n<trans>\n<name_type>&given;</name_type>\n<trans_det>Shimeji</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5000006</ent_seq>\n<k_ele>\n<keb>〆代</keb>\n</k_ele>\n<r_ele>\n<reb>しめよ</reb>\n</r_ele>\n<trans>\n<name_type>&fem;</name_type>\n<trans_det>Shimeyo</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5000007</ent_seq>\n<k_ele>\n<keb>〆谷</keb>\n</k_ele>\n<r_ele>\n<reb>しめたに</reb>\n</r_ele>\n<trans>\n<name_type>&surname;</name_type>\n<trans_det>Shimetani</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5000008</ent_seq>\n<k_ele>\n<keb>〆木</keb>\n</k_ele>\n<r_ele>\n<reb>しめき</reb>\n</r_ele>\n<trans>\n<name_type>&surname;</name_type>\n<trans_det>Shimeki</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5000009</ent_seq>\n<k_ele>\n<keb>〆野</keb>\n</k_ele>\n<r_ele>\n<reb>しめの</reb>\n</r_ele>\n<trans>\n<name_type>&surname;</name_type>\n<trans_det>Shimeno</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5741686</ent_seq>\n<k_ele>\n<keb>埼銀</keb>\n</k_ele>\n<r_ele>\n<reb>さいぎん</reb>\n</r_ele>\n<trans>\n<name_type>&company;</name_type>\n<xref>埼玉銀行・さいたまぎんこう</xref>\n<trans_det>Saitama Bank</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5723538</ent_seq>\n<k_ele>\n<keb>厦門</keb>\n</k_ele>\n<k_ele>\n<keb>廈門</keb>\n</k_ele>\n<r_ele>\n<reb>アモイ</reb>\n</r_ele>\n<r_ele>\n<reb>シアメン</reb>\n</r_ele>\n<r_ele>\n<reb>シヤメン</reb>\n</r_ele>\n<r_ele>\n<reb>シャーメン</reb>\n</r_ele>\n<trans>\n<name_type>&place;</name_type>\n<trans_det>Xiamen (China)</trans_det>\n<trans_det>Amoy</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5741815</ent_seq>\n<k_ele>\n<keb>神龍</keb>\n</k_ele>\n<k_ele>\n<keb>神竜</keb>\n</k_ele>\n<r_ele>\n<reb>しんりゅう</reb>\n</r_ele>\n<r_ele>\n<reb>じんりゅう</reb>\n</r_ele>\n<r_ele>\n<reb>シェンロン</reb>\n</r_ele>\n<trans>\n<name_type>&unclass;</name_type>\n<trans_det>Shen Long (spiritual dragon in Chinese mythology)</trans_det>\n<trans_det>Shen-lung</trans_det>\n</trans>\n</entry>\n<entry>\n<ent_seq>5001644</ent_seq>\n<r_ele>\n<reb>かかずゆみ</reb>\n</r_ele>\n<trans>\n<name_type>&fem;</name_type>\n<name_type>&person;</name_type>\n<trans_det>Kakazu Yumi (1973.6.18-)</trans_det>\n</trans>\n</entry>\n</JMnedict>\n"
  },
  {
    "path": "test/data/kanjidic2_mini.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE kanjidic2 [\n\t<!-- Version 1.6 - April 2008\n\tThis is the DTD of the XML-format kanji file combining information from\n\tthe KANJIDIC and KANJD212 files. It is intended to be largely self-\n\tdocumenting, with each field being accompanied by an explanatory\n\tcomment.\n\n\tThe file covers the following kanji:\n\t(a) the 6,355 kanji from JIS X 0208;\n\t(b) the 5,801 kanji from JIS X 0212;\n\t(c) the 3,693 kanji from JIS X 0213 as follows:\n\t\t(i) the 2,741 kanji which are also in JIS X 0212 have\n\t\tJIS X 0213 code-points (kuten) added to the existing entry;\n\t\t(ii) the 952 \"new\" kanji have new entries.\n\n\tAt the end of the explanation for a number of fields there is a tag\n\twith the format [N]. This indicates the leading letter(s) of the\n\tequivalent field in the KANJIDIC and KANJD212 files.\n\n\tThe KANJIDIC documentation should also be read for additional \n\tinformation about the information in the file.\n\t-->\n<!ELEMENT kanjidic2 (header,character*)>\n<!ELEMENT header (file_version,database_version,date_of_creation)>\n<!--\n\tThe single header element will contain identification information\n\tabout the version of the file \n\t-->\n<!ELEMENT file_version (#PCDATA)>\n<!--\n\tThis field denotes the version of kanjidic2 structure, as more\n\tthan one version may exist.\n\t-->\n<!ELEMENT database_version (#PCDATA)>\n<!--\n\tThe version of the file, in the format YYYY-NN, where NN will be\n\ta number starting with 01 for the first version released in a\n\tcalendar year, then increasing for each version in that year.\n\t-->\n<!ELEMENT date_of_creation (#PCDATA)>\n<!--\n\tThe date the file was created in international format (YYYY-MM-DD).\n\t-->\n<!ELEMENT character (literal,codepoint, radical, misc, dic_number?, query_code?, reading_meaning?)*>\n<!ELEMENT literal (#PCDATA)>\n<!--\n\tThe character itself in UTF8 coding.\n\t-->\n<!ELEMENT codepoint (cp_value+)>\n\t<!-- \n\tThe codepoint element states the code of the character in the various\n\tcharacter set standards.\n\t-->\n<!ELEMENT cp_value (#PCDATA)>\n\t<!-- \n\tThe cp_value contains the codepoint of the character in a particular\n\tstandard. The standard will be identified in the cp_type attribute.\n\t-->\n<!ATTLIST cp_value cp_type CDATA #REQUIRED>\n\t<!-- \n\tThe cp_type attribute states the coding standard applying to the\n\telement. The values assigned so far are:\n\t\tjis208 - JIS X 0208-1997 - kuten coding (nn-nn)\n\t\tjis212 - JIS X 0212-1990 - kuten coding (nn-nn)\n\t\tjis213 - JIS X 0213-2000 - kuten coding (p-nn-nn)\n\t\tucs - Unicode 4.0 - hex coding (4 or 5 hexadecimal digits)\n\t-->\n<!ELEMENT radical (rad_value+)>\n<!ELEMENT rad_value (#PCDATA)>\n\t<!-- \n\tThe radical number, in the range 1 to 214. The particular\n\tclassification type is stated in the rad_type attribute.\n\t-->\n<!ATTLIST rad_value rad_type CDATA #REQUIRED>\n\t<!-- \n\tThe rad_type attribute states the type of radical classification.\n\t\tclassical - as recorded in the KangXi Zidian.\n\t\tnelson_c - as used in the Nelson \"Modern Japanese-English \n\t\tCharacter Dictionary\" (i.e. the Classic, not the New Nelson).\n\t\tThis will only be used where Nelson reclassified the kanji.\n\t-->\n<!ELEMENT misc (grade?, stroke_count+, variant*, freq?, rad_name*,jlpt?)>\n<!ELEMENT grade (#PCDATA)>\n\t<!-- \n\tThe kanji grade level. 1 through 6 indicates a Kyouiku kanji\n\tand the grade in which the kanji is taught in Japanese schools. \n\t8 indicates it is one of the remaining Jouyou Kanji to be learned \n\tin junior high school. 9 indicates it is a Jinmeiyou (for use \n\tin names) kanji which in addition  to the Jouyou kanji are approved \n\tfor use in family name registers and other official documents. 10\n\talso indicates a Jinmeiyou kanji which is a variant of a\n\tJouyou kanji. [G]\n\t-->\n<!ELEMENT stroke_count (#PCDATA)>\n\t<!-- \n\tThe stroke count of the kanji, including the radical. If more than \n\tone, the first is considered the accepted count, while subsequent ones \n\tare common miscounts. (See Appendix E. of the KANJIDIC documentation\n\tfor some of the rules applied when counting strokes in some of the \n\tradicals.) [S]\n\t-->\n<!ELEMENT variant (#PCDATA)>\n\t<!-- \n\tEither a cross-reference code to another kanji, usually regarded as a \n\tvariant, or an alternative indexing code for the current kanji.\n\tThe type of variant is given in the var_type attribute.\n\t-->\n<!ATTLIST variant var_type CDATA #REQUIRED>\n\t<!-- \n\tThe var_type attribute indicates the type of variant code. The current\n\tvalues are: \n\t\tjis208 - in JIS X 0208 - kuten coding\n\t\tjis212 - in JIS X 0212 - kuten coding\n\t\tjis213 - in JIS X 0213 - kuten coding\n\t\t  (most of the above relate to \"shinjitai/kyuujitai\" \n\t\t  alternative character glyphs)\n\t\tderoo - De Roo number - numeric\n\t\tnjecd - Halpern NJECD index number - numeric\n\t\ts_h - The Kanji Dictionary (Spahn & Hadamitzky) - descriptor\n\t\tnelson_c - \"Classic\" Nelson - numeric\n\t\toneill - Japanese Names (O'Neill) - numeric\n\t\tucs - Unicode codepoint- hex\n\t-->\n<!ELEMENT freq (#PCDATA)>\n\t<!-- \n\tA frequency-of-use ranking. The 2,500 most-used characters have a \n\tranking; those characters that lack this field are not ranked. The \n\tfrequency is a number from 1 to 2,500 that expresses the relative \n\tfrequency of occurrence of a character in modern Japanese. This is\n\tbased on a survey in newspapers, so it is biassed towards kanji\n\tused in newspaper articles. The discrimination between the less\n\tfrequently used kanji is not strong. (Actually there are 2,501\n\tkanji ranked as there was a tie.)\n\t-->\n<!ELEMENT rad_name (#PCDATA)>\n\t<!-- \n\tWhen the kanji is itself a radical and has a name, this element\n\tcontains the name (in hiragana.) [T2]\n\t-->\n<!ELEMENT jlpt (#PCDATA)>\n\t<!--\n\tThe (former) Japanese Language Proficiency test level for this kanji. \n\tValues range from 1 (most advanced) to 4 (most elementary). This field \n\tdoes not appear for kanji that were not required for any JLPT level.\n\tNote that the JLPT test levels changed in 2010, with a new 5-level\n\tsystem (N1 to N5) being introduced. No official kanji lists are\n\tavailable for the new levels. The new levels are regarded as\n\tbeing similar to the old levels except that the old level 2 is\n\tnow divided between N2 and N3.\n\t-->\n<!ELEMENT dic_number (dic_ref+)>\n\t<!-- \n\tThis element contains the index numbers and similar unstructured\n\tinformation such as page numbers in a number of published dictionaries,\n\tand instructional books on kanji.\n\t-->\n<!ELEMENT dic_ref (#PCDATA)>\n\t<!-- \n\tEach dic_ref contains an index number. The particular dictionary,\n\tetc. is defined by the dr_type attribute.\n\t-->\n<!ATTLIST dic_ref dr_type CDATA #REQUIRED>\n\t<!-- \n\tThe dr_type defines the dictionary or reference book, etc. to which\n\tdic_ref element applies. The initial allocation is:\n\t  nelson_c - \"Modern Reader's Japanese-English Character Dictionary\",  \n\t  \tedited by Andrew Nelson (now published as the \"Classic\" \n\t  \tNelson).\n\t  nelson_n - \"The New Nelson Japanese-English Character Dictionary\", \n\t  \tedited by John Haig.\n\t  halpern_njecd - \"New Japanese-English Character Dictionary\", \n\t  \tedited by Jack Halpern.\n\t  halpern_kkd - \"Kodansha Kanji Dictionary\", (2nd Ed. of the NJECD)\n\t  \tedited by Jack Halpern.\n\t  halpern_kkld - \"Kanji Learners Dictionary\" (Kodansha) edited by \n\t  \tJack Halpern.\n\t  halpern_kkld_2ed - \"Kanji Learners Dictionary\" (Kodansha), 2nd edition\n\t    (2013) edited by Jack Halpern.\n\t  heisig - \"Remembering The  Kanji\"  by  James Heisig.\n\t  heisig6 - \"Remembering The  Kanji, Sixth Ed.\"  by  James Heisig.\n\t  gakken - \"A  New Dictionary of Kanji Usage\" (Gakken)\n\t  oneill_names - \"Japanese Names\", by P.G. O'Neill. \n\t  oneill_kk - \"Essential Kanji\" by P.G. O'Neill.\n\t  moro - \"Daikanwajiten\" compiled by Morohashi. For some kanji two\n\t  \tadditional attributes are used: m_vol:  the volume of the\n\t  \tdictionary in which the kanji is found, and m_page: the page\n\t  \tnumber in the volume.\n\t  henshall - \"A Guide To Remembering Japanese Characters\" by\n\t  \tKenneth G.  Henshall.\n\t  sh_kk - \"Kanji and Kana\" by Spahn and Hadamitzky.\n\t  sh_kk2 - \"Kanji and Kana\" by Spahn and Hadamitzky (2011 edition).\n\t  sakade - \"A Guide To Reading and Writing Japanese\" edited by\n\t  \tFlorence Sakade.\n\t  jf_cards - Japanese Kanji Flashcards, by Max Hodges and\n\t\tTomoko Okazaki. (Series 1)\n\t  henshall3 - \"A Guide To Reading and Writing Japanese\" 3rd\n\t\tedition, edited by Henshall, Seeley and De Groot.\n\t  tutt_cards - Tuttle Kanji Cards, compiled by Alexander Kask.\n\t  crowley - \"The Kanji Way to Japanese Language Power\" by\n\t  \tDale Crowley.\n\t  kanji_in_context - \"Kanji in Context\" by Nishiguchi and Kono.\n\t  busy_people - \"Japanese For Busy People\" vols I-III, published\n\t\tby the AJLT. The codes are the volume.chapter.\n\t  kodansha_compact - the \"Kodansha Compact Kanji Guide\".\n\t  maniette - codes from Yves Maniette's \"Les Kanjis dans la tete\" French adaptation of Heisig.\n\t-->\n<!ATTLIST dic_ref m_vol CDATA #IMPLIED>\n\t<!-- \n\tSee above under \"moro\".\n\t-->\n<!ATTLIST dic_ref m_page CDATA #IMPLIED>\n\t<!-- \n\tSee above under \"moro\".\n\t-->\n<!ELEMENT query_code (q_code+)>\n\t<!-- \n\tThese codes contain information relating to the glyph, and can be used\n\tfor finding a required kanji. The type of code is defined by the\n\tqc_type attribute.\n\t-->\n<!ELEMENT q_code (#PCDATA)>\n\t<!--\n\tThe q_code contains the actual query-code value, according to the\n\tqc_type attribute.\n\t-->\n<!ATTLIST q_code qc_type CDATA #REQUIRED>\n\t<!-- \n\tThe qc_type attribute defines the type of query code. The current values\n\tare:\n\t  skip -  Halpern's SKIP (System  of  Kanji  Indexing  by  Patterns) \n\t  \tcode. The  format is n-nn-nn.  See the KANJIDIC  documentation \n\t  \tfor  a description of the code and restrictions on  the \n\t  \tcommercial  use  of this data. [P]  There are also\n\t\ta number of misclassification codes, indicated by the\n\t\t\"skip_misclass\" attribute.\n\t  sh_desc - the descriptor codes for The Kanji Dictionary (Tuttle \n\t  \t1996) by Spahn and Hadamitzky. They are in the form nxnn.n,  \n\t  \te.g.  3k11.2, where the  kanji has 3 strokes in the \n\t  \tidentifying radical, it is radical \"k\" in the SH \n\t  \tclassification system, there are 11 other strokes, and it is \n\t  \tthe 2nd kanji in the 3k11 sequence. (I am very grateful to \n\t  \tMark Spahn for providing the list of these descriptor codes \n\t  \tfor the kanji in this file.) [I]\n\t  four_corner - the \"Four Corner\" code for the kanji. This is a code \n\t  \tinvented by Wang Chen in 1928. See the KANJIDIC documentation \n\t  \tfor  an overview of  the Four Corner System. [Q]\n\n\t  deroo - the codes developed by the late Father Joseph De Roo, and \n\t  \tpublished in  his book \"2001 Kanji\" (Bonjinsha). Fr De Roo \n\t  \tgave his permission for these codes to be included. [DR]\n\t  misclass - a possible misclassification of the kanji according\n\t\tto one of the code types. (See the \"Z\" codes in the KANJIDIC\n\t\tdocumentation for more details.)\n\t  \n\t-->\n<!ATTLIST q_code skip_misclass CDATA #IMPLIED>\n\t<!--\n\tThe values of this attribute indicate the type if\n\tmisclassification:\n\t- posn - a mistake in the division of the kanji\n\t- stroke_count - a mistake in the number of strokes\n\t- stroke_and_posn - mistakes in both division and strokes\n\t- stroke_diff - ambiguous stroke counts depending on glyph\n\t-->\n\n<!ELEMENT reading_meaning (rmgroup*, nanori*)>\n\t<!-- \n\tThe readings for the kanji in several languages, and the meanings, also\n\tin several languages. The readings and meanings are grouped to enable\n\tthe handling of the situation where the meaning is differentiated by \n\treading. [T1]\n\t-->\n<!ELEMENT rmgroup (reading*, meaning*)>\n<!ELEMENT reading (#PCDATA)>\n\t<!-- \n\tThe reading element contains the reading or pronunciation\n\tof the kanji.\n\t-->\n<!ATTLIST reading r_type CDATA #REQUIRED>\n\t<!-- \n\tThe r_type attribute defines the type of reading in the reading\n\telement. The current values are:\n\t  pinyin - the modern PinYin romanization of the Chinese reading \n\t  \tof the kanji. The tones are represented by a concluding \n\t  \tdigit. [Y]\n\t  korean_r - the romanized form of the Korean reading(s) of the \n\t  \tkanji.  The readings are in the (Republic of Korea) Ministry \n\t  \tof Education style of romanization. [W]\n\t  korean_h - the Korean reading(s) of the kanji in hangul.\n\t  vietnam - the Vietnamese readings supplied by Minh Chau Pham.\n\t  ja_on - the \"on\" Japanese reading of the kanji, in katakana. \n\t  \tAnother attribute r_status, if present, will indicate with\n\t  \ta value of \"jy\" whether the reading is approved for a\n\t  \t\"Jouyou kanji\".\n\t\tA further attribute on_type, if present,  will indicate with \n\t\ta value of kan, go, tou or kan'you the type of on-reading.\n\t  ja_kun - the \"kun\" Japanese reading of the kanji, usually in \n\t\thiragana. \n\t  \tWhere relevant the okurigana is also included separated by a \n\t  \t\".\". Readings associated with prefixes and suffixes are \n\t  \tmarked with a \"-\". A second attribute r_status, if present, \n\t  \twill indicate with a value of \"jy\" whether the reading is \n\t  \tapproved for a \"Jouyou kanji\".\n\t-->\n<!ATTLIST reading on_type CDATA #IMPLIED>\n\t<!-- \n\tSee under ja_on above.\n\t-->\n<!ATTLIST reading r_status CDATA #IMPLIED>\n\t<!-- \n\tSee under ja_on and ja_kun above.\n\t-->\n<!ELEMENT meaning (#PCDATA)>\n\t<!-- \n\tThe meaning associated with the kanji.\n\t-->\n<!ATTLIST meaning m_lang CDATA #IMPLIED>\n\t<!-- \n\tThe m_lang attribute defines the target language of the meaning. It \n\twill be coded using the two-letter language code from the ISO 639-1 \n\tstandard. When absent, the value \"en\" (i.e. English) is implied. [{}]\n\t-->\n<!ELEMENT nanori (#PCDATA)>\n\t<!-- \n\tJapanese readings that are now only associated with names.\n\t-->\n]>\n<kanjidic2>\n<header>\n<file_version>4</file_version>\n<database_version>2017-225</database_version>\n<date_of_creation>2017-08-13</date_of_creation>\n</header>\n<!-- Entry for Kanji: 持 -->\n<character>\n<literal>持</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">6301</cp_value>\n<cp_value cp_type=\"jis208\">27-93</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">64</rad_value>\n</radical>\n<misc>\n<grade>3</grade>\n<stroke_count>9</stroke_count>\n<freq>119</freq>\n<jlpt>3</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">1903</dic_ref>\n<dic_ref dr_type=\"nelson_n\">2151</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">374</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">447</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">275</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">333</dic_ref>\n<dic_ref dr_type=\"heisig\">660</dic_ref>\n<dic_ref dr_type=\"heisig6\">712</dic_ref>\n<dic_ref dr_type=\"gakken\">184</dic_ref>\n<dic_ref dr_type=\"oneill_names\">801</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">50</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"5\" m_page=\"0211\">12019</dic_ref>\n<dic_ref dr_type=\"henshall\">294</dic_ref>\n<dic_ref dr_type=\"sh_kk\">451</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">458</dic_ref>\n<dic_ref dr_type=\"sakade\">231</dic_ref>\n<dic_ref dr_type=\"jf_cards\">178</dic_ref>\n<dic_ref dr_type=\"henshall3\">310</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">328</dic_ref>\n<dic_ref dr_type=\"crowley\">94</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">142</dic_ref>\n<dic_ref dr_type=\"busy_people\">2.15</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">889</dic_ref>\n<dic_ref dr_type=\"maniette\">667</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-3-6</q_code>\n<q_code qc_type=\"sh_desc\">3c6.8</q_code>\n<q_code qc_type=\"four_corner\">5404.1</q_code>\n<q_code qc_type=\"deroo\">1348</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">chi2</reading>\n<reading r_type=\"korean_r\">ji</reading>\n<reading r_type=\"korean_h\">지</reading>\n<reading r_type=\"vietnam\">Trì</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_kun\">も.つ</reading>\n<reading r_type=\"ja_kun\">-も.ち</reading>\n<reading r_type=\"ja_kun\">も.てる</reading>\n<meaning>hold</meaning>\n<meaning>have</meaning>\n<meaning m_lang=\"fr\">avoir</meaning>\n<meaning m_lang=\"fr\">tenir</meaning>\n<meaning m_lang=\"es\">duración</meaning>\n<meaning m_lang=\"es\">propiedad</meaning>\n<meaning m_lang=\"es\">cargo</meaning>\n<meaning m_lang=\"es\">sostener</meaning>\n<meaning m_lang=\"es\">mantener</meaning>\n<meaning m_lang=\"pt\">segurar</meaning>\n<meaning m_lang=\"pt\">ter</meaning>\n</rmgroup>\n<nanori>もち</nanori>\n<nanori>もつ</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 時 -->\n<character>\n<literal>時</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">6642</cp_value>\n<cp_value cp_type=\"jis208\">27-94</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">72</rad_value>\n</radical>\n<misc>\n<grade>2</grade>\n<stroke_count>10</stroke_count>\n<variant var_type=\"jis212\">33-82</variant>\n<freq>16</freq>\n<jlpt>4</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">2126</dic_ref>\n<dic_ref dr_type=\"nelson_n\">2462</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">924</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">1155</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">625</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">830</dic_ref>\n<dic_ref dr_type=\"heisig\">159</dic_ref>\n<dic_ref dr_type=\"heisig6\">171</dic_ref>\n<dic_ref dr_type=\"gakken\">19</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1086</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">46</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"5\" m_page=\"0848\">13890</dic_ref>\n<dic_ref dr_type=\"henshall\">135</dic_ref>\n<dic_ref dr_type=\"sh_kk\">42</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">42</dic_ref>\n<dic_ref dr_type=\"sakade\">87</dic_ref>\n<dic_ref dr_type=\"jf_cards\">57</dic_ref>\n<dic_ref dr_type=\"henshall3\">151</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">195</dic_ref>\n<dic_ref dr_type=\"crowley\">24</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">25</dic_ref>\n<dic_ref dr_type=\"busy_people\">2.1</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">988</dic_ref>\n<dic_ref dr_type=\"maniette\">161</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-4-6</q_code>\n<q_code qc_type=\"sh_desc\">4c6.2</q_code>\n<q_code qc_type=\"four_corner\">6404.1</q_code>\n<q_code qc_type=\"deroo\">3848</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">shi2</reading>\n<reading r_type=\"korean_r\">si</reading>\n<reading r_type=\"korean_h\">시</reading>\n<reading r_type=\"vietnam\">Thì</reading>\n<reading r_type=\"vietnam\">Thời</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_kun\">とき</reading>\n<reading r_type=\"ja_kun\">-どき</reading>\n<meaning>time</meaning>\n<meaning>hour</meaning>\n<meaning m_lang=\"fr\">temps</meaning>\n<meaning m_lang=\"fr\">heure</meaning>\n<meaning m_lang=\"es\">tiempo</meaning>\n<meaning m_lang=\"es\">hora</meaning>\n<meaning m_lang=\"es\">ocasión</meaning>\n<meaning m_lang=\"pt\">tempo</meaning>\n<meaning m_lang=\"pt\">hora</meaning>\n</rmgroup>\n<nanori>と</nanori>\n<nanori>とぎ</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 次 -->\n<character>\n<literal>次</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">6b21</cp_value>\n<cp_value cp_type=\"jis208\">28-01</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">76</rad_value>\n<rad_value rad_type=\"nelson_c\">15</rad_value>\n</radical>\n<misc>\n<grade>3</grade>\n<stroke_count>6</stroke_count>\n<freq>222</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">638</dic_ref>\n<dic_ref dr_type=\"nelson_n\">2929</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">54</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">58</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">38</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">39</dic_ref>\n<dic_ref dr_type=\"heisig\">471</dic_ref>\n<dic_ref dr_type=\"heisig6\">510</dic_ref>\n<dic_ref dr_type=\"gakken\">235</dic_ref>\n<dic_ref dr_type=\"oneill_names\">226</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">239</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"6\" m_page=\"0618\">15992P</dic_ref>\n<dic_ref dr_type=\"henshall\">292</dic_ref>\n<dic_ref dr_type=\"sh_kk\">384</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">385</dic_ref>\n<dic_ref dr_type=\"sakade\">227</dic_ref>\n<dic_ref dr_type=\"jf_cards\">648</dic_ref>\n<dic_ref dr_type=\"henshall3\">308</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">268</dic_ref>\n<dic_ref dr_type=\"crowley\">150</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">660</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1120</dic_ref>\n<dic_ref dr_type=\"maniette\">482</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-2-4</q_code>\n<q_code qc_type=\"sh_desc\">2b4.1</q_code>\n<q_code qc_type=\"four_corner\">3718.2</q_code>\n<q_code qc_type=\"deroo\">362</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">ci4</reading>\n<reading r_type=\"korean_r\">cha</reading>\n<reading r_type=\"korean_h\">차</reading>\n<reading r_type=\"vietnam\">Thứ</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_on\">シ</reading>\n<reading r_type=\"ja_kun\">つ.ぐ</reading>\n<reading r_type=\"ja_kun\">つぎ</reading>\n<meaning>next</meaning>\n<meaning>order</meaning>\n<meaning>sequence</meaning>\n<meaning m_lang=\"fr\">suivant</meaning>\n<meaning m_lang=\"fr\">ordre</meaning>\n<meaning m_lang=\"fr\">successivement</meaning>\n<meaning m_lang=\"es\">siguiente</meaning>\n<meaning m_lang=\"es\">seguir</meaning>\n<meaning m_lang=\"pt\">próximo</meaning>\n<meaning m_lang=\"pt\">pedido</meaning>\n<meaning m_lang=\"pt\">seqüência</meaning>\n</rmgroup>\n<nanori>き</nanori>\n<nanori>すき</nanori>\n<nanori>つぐ</nanori>\n<nanori>よし</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 滋 -->\n<character>\n<literal>滋</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">6ecb</cp_value>\n<cp_value cp_type=\"jis208\">28-2</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">85</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>12</stroke_count>\n<freq>1563</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">2626</dic_ref>\n<dic_ref dr_type=\"nelson_n\">3238</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">602</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">734</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">437</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">549</dic_ref>\n<dic_ref dr_type=\"heisig\">1388</dic_ref>\n<dic_ref dr_type=\"heisig6\">1489</dic_ref>\n<dic_ref dr_type=\"gakken\">1625</dic_ref>\n<dic_ref dr_type=\"oneill_names\">2460</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1395</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"7\" m_page=\"0147\">17919P</dic_ref>\n<dic_ref dr_type=\"henshall\">1327</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1549</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1651</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1489</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1559</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1776</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1222</dic_ref>\n<dic_ref dr_type=\"maniette\">1400</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-3-9</q_code>\n<q_code qc_type=\"sh_desc\">3a9.27</q_code>\n<q_code qc_type=\"four_corner\">3813.2</q_code>\n<q_code qc_type=\"deroo\">371</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zi1</reading>\n<reading r_type=\"korean_r\">ja</reading>\n<reading r_type=\"korean_h\">자</reading>\n<reading r_type=\"vietnam\">Tư</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<meaning>nourishing</meaning>\n<meaning>more &amp; more</meaning>\n<meaning>be luxuriant</meaning>\n<meaning>planting</meaning>\n<meaning>turbidity</meaning>\n<meaning m_lang=\"fr\">nourrissant</meaning>\n<meaning m_lang=\"fr\">de plus en plus</meaning>\n<meaning m_lang=\"fr\">luxuriant</meaning>\n<meaning m_lang=\"fr\">plantation</meaning>\n<meaning m_lang=\"fr\">turbidité</meaning>\n<meaning m_lang=\"es\">florecer</meaning>\n<meaning m_lang=\"es\">ser exuberante</meaning>\n<meaning m_lang=\"es\">nutritivo</meaning>\n<meaning m_lang=\"pt\">nutrir</meaning>\n<meaning m_lang=\"pt\">mais &amp; mais</meaning>\n<meaning m_lang=\"pt\">ser luxuriante</meaning>\n<meaning m_lang=\"pt\">planta</meaning>\n<meaning m_lang=\"pt\">turbidez</meaning>\n</rmgroup>\n<nanori>し</nanori>\n<nanori>しげ</nanori>\n<nanori>しげる</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 治 -->\n<character>\n<literal>治</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">6cbb</cp_value>\n<cp_value cp_type=\"jis208\">28-3</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">85</rad_value>\n</radical>\n<misc>\n<grade>4</grade>\n<stroke_count>8</stroke_count>\n<freq>109</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">2528</dic_ref>\n<dic_ref dr_type=\"nelson_n\">3100</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">335</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">393</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">250</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">297</dic_ref>\n<dic_ref dr_type=\"heisig\">746</dic_ref>\n<dic_ref dr_type=\"heisig6\">807</dic_ref>\n<dic_ref dr_type=\"gakken\">181</dic_ref>\n<dic_ref dr_type=\"oneill_names\">825</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">214</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"6\" m_page=\"1024\">17256</dic_ref>\n<dic_ref dr_type=\"henshall\">544</dic_ref>\n<dic_ref dr_type=\"sh_kk\">493</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">502</dic_ref>\n<dic_ref dr_type=\"sakade\">468</dic_ref>\n<dic_ref dr_type=\"jf_cards\">672</dic_ref>\n<dic_ref dr_type=\"henshall3\">527</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">506</dic_ref>\n<dic_ref dr_type=\"crowley\">88</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">531</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1174</dic_ref>\n<dic_ref dr_type=\"maniette\">754</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-3-5</q_code>\n<q_code qc_type=\"sh_desc\">3a5.28</q_code>\n<q_code qc_type=\"four_corner\">3316.0</q_code>\n<q_code qc_type=\"deroo\">377</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zhi4</reading>\n<reading r_type=\"korean_r\">chi</reading>\n<reading r_type=\"korean_h\">치</reading>\n<reading r_type=\"vietnam\">Trì</reading>\n<reading r_type=\"vietnam\">Trị</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_on\">チ</reading>\n<reading r_type=\"ja_kun\">おさ.める</reading>\n<reading r_type=\"ja_kun\">おさ.まる</reading>\n<reading r_type=\"ja_kun\">なお.る</reading>\n<reading r_type=\"ja_kun\">なお.す</reading>\n<meaning>reign</meaning>\n<meaning>be at peace</meaning>\n<meaning>calm down</meaning>\n<meaning>subdue</meaning>\n<meaning>quell</meaning>\n<meaning>govt</meaning>\n<meaning>cure</meaning>\n<meaning>heal</meaning>\n<meaning>rule</meaning>\n<meaning>conserve</meaning>\n<meaning m_lang=\"fr\">règne</meaning>\n<meaning m_lang=\"fr\">être en paix</meaning>\n<meaning m_lang=\"fr\">se calmer</meaning>\n<meaning m_lang=\"fr\">maîtriser</meaning>\n<meaning m_lang=\"fr\">réprimer</meaning>\n<meaning m_lang=\"fr\">gouvernement</meaning>\n<meaning m_lang=\"fr\">guérir</meaning>\n<meaning m_lang=\"fr\">réparer</meaning>\n<meaning m_lang=\"fr\">préserver</meaning>\n<meaning m_lang=\"es\">reinar</meaning>\n<meaning m_lang=\"es\">gobernar</meaning>\n<meaning m_lang=\"es\">política</meaning>\n<meaning m_lang=\"es\">curar</meaning>\n<meaning m_lang=\"es\">calmar</meaning>\n<meaning m_lang=\"es\">curarse</meaning>\n<meaning m_lang=\"pt\">reino</meaning>\n<meaning m_lang=\"pt\">estar em paz</meaning>\n<meaning m_lang=\"pt\">acalmar-se</meaning>\n<meaning m_lang=\"pt\">subjugar</meaning>\n<meaning m_lang=\"pt\">domar</meaning>\n<meaning m_lang=\"pt\">governo</meaning>\n<meaning m_lang=\"pt\">cura</meaning>\n<meaning m_lang=\"pt\">regra</meaning>\n<meaning m_lang=\"pt\">conservar</meaning>\n</rmgroup>\n<nanori>し</nanori>\n<nanori>ぢ</nanori>\n<nanori>はり</nanori>\n<nanori>はる</nanori>\n<nanori>みち</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 爾 -->\n<character>\n<literal>爾</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">723e</cp_value>\n<cp_value cp_type=\"jis208\">28-4</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">89</rad_value>\n<rad_value rad_type=\"nelson_c\">1</rad_value>\n</radical>\n<misc>\n<grade>9</grade>\n<stroke_count>14</stroke_count>\n<variant var_type=\"jis208\">53-85</variant>\n<variant var_type=\"jis212\">16-62</variant>\n<variant var_type=\"jis212\">16-63</variant>\n<variant var_type=\"jis212\">18-56</variant>\n<variant var_type=\"jis212\">29-91</variant>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">69</dic_ref>\n<dic_ref dr_type=\"nelson_n\">3521</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">3587</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">4407</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">2230</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">3001</dic_ref>\n<dic_ref dr_type=\"heisig\">2074</dic_ref>\n<dic_ref dr_type=\"heisig6\">2867</dic_ref>\n<dic_ref dr_type=\"oneill_names\">2250</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1945</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"7\" m_page=\"0585\">19750</dic_ref>\n<dic_ref dr_type=\"sh_kk\">2154</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">4-14-1</q_code>\n<q_code qc_type=\"sh_desc\">0a14.3</q_code>\n<q_code qc_type=\"four_corner\">1022.7</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">er3</reading>\n<reading r_type=\"korean_r\">i</reading>\n<reading r_type=\"korean_h\">이</reading>\n<reading r_type=\"vietnam\">Nhĩ</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_on\">ニ</reading>\n<reading r_type=\"ja_kun\">なんじ</reading>\n<reading r_type=\"ja_kun\">しかり</reading>\n<reading r_type=\"ja_kun\">その</reading>\n<reading r_type=\"ja_kun\">のみ</reading>\n<reading r_type=\"ja_kun\">おれ</reading>\n<reading r_type=\"ja_kun\">しか</reading>\n<meaning>you</meaning>\n<meaning>thou</meaning>\n<meaning>second person</meaning>\n<meaning m_lang=\"es\">tú</meaning>\n<meaning m_lang=\"es\">eso</meaning>\n<meaning m_lang=\"es\">cerca</meaning>\n</rmgroup>\n<nanori>ちか</nanori>\n<nanori>み</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 璽 -->\n<character>\n<literal>璽</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">74bd</cp_value>\n<cp_value cp_type=\"jis208\">28-5</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">96</rad_value>\n<rad_value rad_type=\"nelson_c\">1</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>19</stroke_count>\n<variant var_type=\"jis212\">24-53</variant>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">71</dic_ref>\n<dic_ref dr_type=\"nelson_n\">3683</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">2911</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">3624</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1854</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2527</dic_ref>\n<dic_ref dr_type=\"heisig\">2075</dic_ref>\n<dic_ref dr_type=\"heisig6\">2194</dic_ref>\n<dic_ref dr_type=\"gakken\">2019</dic_ref>\n<dic_ref dr_type=\"oneill_names\">2860</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1866</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"7\" m_page=\"0978\">21309</dic_ref>\n<dic_ref dr_type=\"henshall\">1329</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1887</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">2057</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1537</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1916</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1947</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1314</dic_ref>\n<dic_ref dr_type=\"maniette\">1506</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-14-5</q_code>\n<q_code qc_type=\"sh_desc\">4f14.2</q_code>\n<q_code qc_type=\"four_corner\">1010.3</q_code>\n<q_code qc_type=\"deroo\">3272</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">xi3</reading>\n<reading r_type=\"korean_r\">sae</reading>\n<reading r_type=\"korean_r\">sa</reading>\n<reading r_type=\"korean_h\">새</reading>\n<reading r_type=\"korean_h\">사</reading>\n<reading r_type=\"vietnam\">Tỉ</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<meaning>emperor's seal</meaning>\n<meaning m_lang=\"fr\">sceau impérial</meaning>\n<meaning m_lang=\"es\">sello imperial</meaning>\n<meaning m_lang=\"pt\">selo imperial</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 痔 -->\n<character>\n<literal>痔</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">75d4</cp_value>\n<cp_value cp_type=\"jis208\">28-6</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">104</rad_value>\n</radical>\n<misc>\n<stroke_count>11</stroke_count>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3046</dic_ref>\n<dic_ref dr_type=\"nelson_n\">3804</dic_ref>\n<dic_ref dr_type=\"heisig\">2575</dic_ref>\n<dic_ref dr_type=\"heisig6\">2625</dic_ref>\n<dic_ref dr_type=\"gakken\">1802</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"7\" m_page=\"1173\">22167</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">3-5-6</q_code>\n<q_code qc_type=\"sh_desc\">5i6.4</q_code>\n<q_code qc_type=\"four_corner\">0014.1</q_code>\n<q_code qc_type=\"deroo\">548</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zhi4</reading>\n<reading r_type=\"korean_r\">chi</reading>\n<reading r_type=\"korean_h\">치</reading>\n<reading r_type=\"vietnam\">Trĩ</reading>\n<reading r_type=\"ja_on\">ヂ</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_kun\">しもがさ</reading>\n<meaning>piles</meaning>\n<meaning>hemorrhoids</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 磁 -->\n<character>\n<literal>磁</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">78c1</cp_value>\n<cp_value cp_type=\"jis208\">28-7</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">112</rad_value>\n</radical>\n<misc>\n<grade>6</grade>\n<stroke_count>14</stroke_count>\n<variant var_type=\"jis212\">48-35</variant>\n<freq>1686</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3209</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4029</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1214</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">1554</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">821</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1123</dic_ref>\n<dic_ref dr_type=\"heisig\">1390</dic_ref>\n<dic_ref dr_type=\"heisig6\">1491</dic_ref>\n<dic_ref dr_type=\"gakken\">1965</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1288</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"8\" m_page=\"0388\">24364</dic_ref>\n<dic_ref dr_type=\"henshall\">881</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1548</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1650</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1574</dic_ref>\n<dic_ref dr_type=\"henshall3\">892</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">975</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1777</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1407</dic_ref>\n<dic_ref dr_type=\"maniette\">1402</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-5-9</q_code>\n<q_code qc_type=\"sh_desc\">5a9.6</q_code>\n<q_code qc_type=\"four_corner\">1863.2</q_code>\n<q_code qc_type=\"deroo\">3371</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">ci2</reading>\n<reading r_type=\"korean_r\">ja</reading>\n<reading r_type=\"korean_h\">자</reading>\n<reading r_type=\"vietnam\">Từ</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<meaning>magnet</meaning>\n<meaning>porcelain</meaning>\n<meaning m_lang=\"fr\">aimant</meaning>\n<meaning m_lang=\"fr\">porcelaine</meaning>\n<meaning m_lang=\"es\">imán</meaning>\n<meaning m_lang=\"es\">porcelana</meaning>\n<meaning m_lang=\"pt\">imã</meaning>\n<meaning m_lang=\"pt\">porcelana</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 示 -->\n<character>\n<literal>示</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">793a</cp_value>\n<cp_value cp_type=\"jis208\">28-8</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">113</rad_value>\n</radical>\n<misc>\n<grade>5</grade>\n<stroke_count>5</stroke_count>\n<freq>237</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3228</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4060</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1936</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">2435</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1229</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1694</dic_ref>\n<dic_ref dr_type=\"heisig\">1086</dic_ref>\n<dic_ref dr_type=\"heisig6\">1167</dic_ref>\n<dic_ref dr_type=\"gakken\">415</dic_ref>\n<dic_ref dr_type=\"oneill_names\">148</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">575</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"8\" m_page=\"0414\">24623</dic_ref>\n<dic_ref dr_type=\"henshall\">695</dic_ref>\n<dic_ref dr_type=\"sh_kk\">615</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">625</dic_ref>\n<dic_ref dr_type=\"sakade\">622</dic_ref>\n<dic_ref dr_type=\"jf_cards\">769</dic_ref>\n<dic_ref dr_type=\"henshall3\">723</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">651</dic_ref>\n<dic_ref dr_type=\"crowley\">465</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">814</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1413</dic_ref>\n<dic_ref dr_type=\"maniette\">1095</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-1-4</q_code>\n<q_code qc_type=\"sh_desc\">4e0.1</q_code>\n<q_code qc_type=\"four_corner\">1090.1</q_code>\n<q_code qc_type=\"deroo\">3041</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">shi4</reading>\n<reading r_type=\"korean_r\">si</reading>\n<reading r_type=\"korean_r\">gi</reading>\n<reading r_type=\"korean_h\">시</reading>\n<reading r_type=\"korean_h\">기</reading>\n<reading r_type=\"vietnam\">Kì</reading>\n<reading r_type=\"vietnam\">Thị</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_on\">シ</reading>\n<reading r_type=\"ja_kun\">しめ.す</reading>\n<meaning>show</meaning>\n<meaning>indicate</meaning>\n<meaning>point out</meaning>\n<meaning>express</meaning>\n<meaning>display</meaning>\n<meaning m_lang=\"fr\">montrer</meaning>\n<meaning m_lang=\"fr\">indiquer</meaning>\n<meaning m_lang=\"fr\">signaler</meaning>\n<meaning m_lang=\"fr\">exprimer</meaning>\n<meaning m_lang=\"fr\">exposer</meaning>\n<meaning m_lang=\"es\">mostrar</meaning>\n<meaning m_lang=\"es\">enseñar</meaning>\n<meaning m_lang=\"es\">indicar</meaning>\n<meaning m_lang=\"es\">revelar</meaning>\n<meaning m_lang=\"pt\">espetáculo</meaning>\n<meaning m_lang=\"pt\">indicar</meaning>\n<meaning m_lang=\"pt\">apontar</meaning>\n<meaning m_lang=\"pt\">expressar</meaning>\n<meaning m_lang=\"pt\">mostrar</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 而 -->\n<character>\n<literal>而</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">800c</cp_value>\n<cp_value cp_type=\"jis208\">28-9</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">126</rad_value>\n</radical>\n<misc>\n<grade>9</grade>\n<stroke_count>6</stroke_count>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3689</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4704</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">2027</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">2520</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1747</dic_ref>\n<dic_ref dr_type=\"heisig\">3006</dic_ref>\n<dic_ref dr_type=\"heisig6\">2243</dic_ref>\n<dic_ref dr_type=\"oneill_names\">264</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"9\" m_page=\"0166\">28871</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-2-4</q_code>\n<q_code qc_type=\"sh_desc\">2r4.3</q_code>\n<q_code qc_type=\"four_corner\">1022.7</q_code>\n<q_code qc_type=\"skip\" skip_misclass=\"posn\">3-4-2</q_code>\n<q_code qc_type=\"skip\" skip_misclass=\"posn\">4-6-1</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">er2</reading>\n<reading r_type=\"korean_r\">i</reading>\n<reading r_type=\"korean_h\">이</reading>\n<reading r_type=\"vietnam\">Nhi</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_on\">ニ</reading>\n<reading r_type=\"ja_kun\">しこ.うして</reading>\n<reading r_type=\"ja_kun\">しか.して</reading>\n<reading r_type=\"ja_kun\">しか.も</reading>\n<reading r_type=\"ja_kun\">しか.れども</reading>\n<reading r_type=\"ja_kun\">すなわち</reading>\n<reading r_type=\"ja_kun\">なんじ</reading>\n<reading r_type=\"ja_kun\">しかるに</reading>\n<meaning>and yet</meaning>\n<meaning>and then</meaning>\n<meaning>but</meaning>\n<meaning>however</meaning>\n<meaning>nevertheless</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 耳 -->\n<character>\n<literal>耳</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8033</cp_value>\n<cp_value cp_type=\"jis208\">28-10</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">128</rad_value>\n</radical>\n<misc>\n<grade>1</grade>\n<stroke_count>6</stroke_count>\n<freq>1328</freq>\n<jlpt>4</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3697</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4715</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">3516</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">4329</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">2190</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2948</dic_ref>\n<dic_ref dr_type=\"heisig\">818</dic_ref>\n<dic_ref dr_type=\"heisig6\">881</dic_ref>\n<dic_ref dr_type=\"gakken\">1323</dic_ref>\n<dic_ref dr_type=\"oneill_names\">331</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">107</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"9\" m_page=\"0183\">28999</dic_ref>\n<dic_ref dr_type=\"henshall\">29</dic_ref>\n<dic_ref dr_type=\"sh_kk\">56</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">56</dic_ref>\n<dic_ref dr_type=\"sakade\">26</dic_ref>\n<dic_ref dr_type=\"jf_cards\">79</dic_ref>\n<dic_ref dr_type=\"henshall3\">32</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">61</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">169</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1582</dic_ref>\n<dic_ref dr_type=\"maniette\">826</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">4-6-1</q_code>\n<q_code qc_type=\"sh_desc\">6e0.1</q_code>\n<q_code qc_type=\"four_corner\">1040.0</q_code>\n<q_code qc_type=\"four_corner\">1012.0</q_code>\n<q_code qc_type=\"deroo\">3255</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">er3</reading>\n<reading r_type=\"korean_r\">i</reading>\n<reading r_type=\"korean_h\">이</reading>\n<reading r_type=\"vietnam\">Nhĩ</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_kun\">みみ</reading>\n<meaning>ear</meaning>\n<meaning m_lang=\"fr\">oreille</meaning>\n<meaning m_lang=\"es\">oreja</meaning>\n<meaning m_lang=\"es\">oído</meaning>\n<meaning m_lang=\"pt\">ouvido</meaning>\n</rmgroup>\n<nanori>がみ</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 自 -->\n<character>\n<literal>自</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">81ea</cp_value>\n<cp_value cp_type=\"jis208\">28-11</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">132</rad_value>\n</radical>\n<misc>\n<grade>2</grade>\n<stroke_count>6</stroke_count>\n<freq>19</freq>\n<jlpt>3</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3841</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4900</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">3525</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">4338</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">2195</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2954</dic_ref>\n<dic_ref dr_type=\"heisig\">36</dic_ref>\n<dic_ref dr_type=\"heisig6\">36</dic_ref>\n<dic_ref dr_type=\"gakken\">53</dic_ref>\n<dic_ref dr_type=\"oneill_names\">340</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">60</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"9\" m_page=\"0403\">30095</dic_ref>\n<dic_ref dr_type=\"henshall\">134</dic_ref>\n<dic_ref dr_type=\"sh_kk\">62</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">62</dic_ref>\n<dic_ref dr_type=\"sakade\">229</dic_ref>\n<dic_ref dr_type=\"jf_cards\">242</dic_ref>\n<dic_ref dr_type=\"henshall3\">150</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">126</dic_ref>\n<dic_ref dr_type=\"crowley\">14</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">63</dic_ref>\n<dic_ref dr_type=\"busy_people\">2.19</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1587</dic_ref>\n<dic_ref dr_type=\"maniette\">36</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">4-6-2</q_code>\n<q_code qc_type=\"sh_desc\">5c1.1</q_code>\n<q_code qc_type=\"four_corner\">2600.0</q_code>\n<q_code qc_type=\"deroo\">879</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zi4</reading>\n<reading r_type=\"korean_r\">ja</reading>\n<reading r_type=\"korean_h\">자</reading>\n<reading r_type=\"vietnam\">Tự</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_on\">シ</reading>\n<reading r_type=\"ja_kun\">みずか.ら</reading>\n<reading r_type=\"ja_kun\">おの.ずから</reading>\n<reading r_type=\"ja_kun\">おの.ずと</reading>\n<meaning>oneself</meaning>\n<meaning m_lang=\"fr\">soi-même</meaning>\n<meaning m_lang=\"es\">uno mismo</meaning>\n<meaning m_lang=\"es\">por sí mismo</meaning>\n<meaning m_lang=\"es\">auto-</meaning>\n<meaning m_lang=\"pt\">a si próprio</meaning>\n</rmgroup>\n<nanori>より</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 蒔 -->\n<character>\n<literal>蒔</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8494</cp_value>\n<cp_value cp_type=\"jis208\">28-12</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">140</rad_value>\n</radical>\n<misc>\n<grade>9</grade>\n<stroke_count>13</stroke_count>\n<freq>2368</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">4018</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5153</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">2935</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1507</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2042</dic_ref>\n<dic_ref dr_type=\"heisig\">2395</dic_ref>\n<dic_ref dr_type=\"heisig6\">2476</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1985</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"9\" m_page=\"0813\">31546X</dic_ref>\n<dic_ref dr_type=\"sh_kk\">2224</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-3-10</q_code>\n<q_code qc_type=\"sh_desc\">3k10.7</q_code>\n<q_code qc_type=\"four_corner\">4464.1</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">shi4</reading>\n<reading r_type=\"pinyin\">shi2</reading>\n<reading r_type=\"korean_r\">si</reading>\n<reading r_type=\"korean_h\">시</reading>\n<reading r_type=\"vietnam\">Thì</reading>\n<reading r_type=\"vietnam\">Thi</reading>\n<reading r_type=\"ja_on\">シ</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_kun\">う.える</reading>\n<reading r_type=\"ja_kun\">ま.く</reading>\n<meaning>sow (seeds)</meaning>\n<meaning m_lang=\"es\">sembrar</meaning>\n<meaning m_lang=\"es\">esparcir (semillas)</meaning>\n</rmgroup>\n<nanori>まい</nanori>\n<nanori>まか</nanori>\n<nanori>まき</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 辞 -->\n<character>\n<literal>辞</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8f9e</cp_value>\n<cp_value cp_type=\"jis208\">28-13</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">160</rad_value>\n<rad_value rad_type=\"nelson_c\">135</rad_value>\n</radical>\n<misc>\n<grade>4</grade>\n<stroke_count>13</stroke_count>\n<variant var_type=\"jis208\">77-70</variant>\n<variant var_type=\"jis212\">65-13</variant>\n<variant var_type=\"jis212\">65-16</variant>\n<freq>633</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3860</dic_ref>\n<dic_ref dr_type=\"nelson_n\">6000</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1364</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">1726</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">922</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1245</dic_ref>\n<dic_ref dr_type=\"heisig\">1497</dic_ref>\n<dic_ref dr_type=\"heisig6\">1613</dic_ref>\n<dic_ref dr_type=\"gakken\">868</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1918</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">594</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"0\" m_page=\"0\">38638</dic_ref>\n<dic_ref dr_type=\"henshall\">500</dic_ref>\n<dic_ref dr_type=\"sh_kk\">688</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">701</dic_ref>\n<dic_ref dr_type=\"sakade\">626</dic_ref>\n<dic_ref dr_type=\"jf_cards\">945</dic_ref>\n<dic_ref dr_type=\"henshall3\">528</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">605</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">931</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1785</dic_ref>\n<dic_ref dr_type=\"maniette\">1511</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-6-7</q_code>\n<q_code qc_type=\"sh_desc\">5b8.4</q_code>\n<q_code qc_type=\"four_corner\">2064.1</q_code>\n<q_code qc_type=\"deroo\">2255</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">ci2</reading>\n<reading r_type=\"korean_r\">sa</reading>\n<reading r_type=\"korean_h\">사</reading>\n<reading r_type=\"vietnam\">Từ</reading>\n<reading r_type=\"ja_on\">ジ</reading>\n<reading r_type=\"ja_kun\">や.める</reading>\n<reading r_type=\"ja_kun\">いな.む</reading>\n<meaning>resign</meaning>\n<meaning>word</meaning>\n<meaning>term</meaning>\n<meaning>expression</meaning>\n<meaning m_lang=\"fr\">démission</meaning>\n<meaning m_lang=\"fr\">mot</meaning>\n<meaning m_lang=\"fr\">terme</meaning>\n<meaning m_lang=\"fr\">expression</meaning>\n<meaning m_lang=\"es\">renuncia</meaning>\n<meaning m_lang=\"es\">dimisión</meaning>\n<meaning m_lang=\"es\">palabra</meaning>\n<meaning m_lang=\"es\">discurso</meaning>\n<meaning m_lang=\"es\">retirarse</meaning>\n<meaning m_lang=\"es\">abandonar</meaning>\n<meaning m_lang=\"pt\">pedir demissão</meaning>\n<meaning m_lang=\"pt\">palavra</meaning>\n<meaning m_lang=\"pt\">termo</meaning>\n<meaning m_lang=\"pt\">expressão</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 汐 -->\n<character>\n<literal>汐</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">6c50</cp_value>\n<cp_value cp_type=\"jis208\">28-14</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">85</rad_value>\n</radical>\n<misc>\n<grade>9</grade>\n<stroke_count>6</stroke_count>\n<freq>2314</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">2488</dic_ref>\n<dic_ref dr_type=\"nelson_n\">3041</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">223</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">259</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">164</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">197</dic_ref>\n<dic_ref dr_type=\"heisig\">110</dic_ref>\n<dic_ref dr_type=\"heisig6\">115</dic_ref>\n<dic_ref dr_type=\"oneill_names\">250</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"6\" m_page=\"0908\">17122</dic_ref>\n<dic_ref dr_type=\"sh_kk\">2134</dic_ref>\n<dic_ref dr_type=\"maniette\">111</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-3-3</q_code>\n<q_code qc_type=\"sh_desc\">3a3.9</q_code>\n<q_code qc_type=\"four_corner\">3712.0</q_code>\n<q_code qc_type=\"deroo\">360</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">xi1</reading>\n<reading r_type=\"pinyin\">xi4</reading>\n<reading r_type=\"korean_r\">seog</reading>\n<reading r_type=\"korean_h\">석</reading>\n<reading r_type=\"vietnam\">Tịch</reading>\n<reading r_type=\"ja_on\">セキ</reading>\n<reading r_type=\"ja_kun\">しお</reading>\n<reading r_type=\"ja_kun\">うしお</reading>\n<reading r_type=\"ja_kun\">せい</reading>\n<meaning>eventide</meaning>\n<meaning>tide</meaning>\n<meaning>salt water</meaning>\n<meaning>opportunity</meaning>\n<meaning m_lang=\"fr\">soirée</meaning>\n<meaning m_lang=\"fr\">marée</meaning>\n<meaning m_lang=\"fr\">eau salée</meaning>\n<meaning m_lang=\"fr\">opportunité</meaning>\n<meaning m_lang=\"es\">ocaso</meaning>\n<meaning m_lang=\"es\">marea</meaning>\n<meaning m_lang=\"es\">agua salada</meaning>\n</rmgroup>\n<nanori>いそ</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 鹿 -->\n<character>\n<literal>鹿</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">9e7f</cp_value>\n<cp_value cp_type=\"jis208\">28-15</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">198</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>11</stroke_count>\n<freq>957</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">5375</dic_ref>\n<dic_ref dr_type=\"nelson_n\">7017</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">3126</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">3879</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1996</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2695</dic_ref>\n<dic_ref dr_type=\"heisig\">1999</dic_ref>\n<dic_ref dr_type=\"heisig6\">2154</dic_ref>\n<dic_ref dr_type=\"gakken\">1141</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1823</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1999</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"12\" m_page=\"0904\">47586</dic_ref>\n<dic_ref dr_type=\"sh_kk\">2279</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">2038</dic_ref>\n<dic_ref dr_type=\"maniette\">2018</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">3-3-8</q_code>\n<q_code qc_type=\"sh_desc\">3q8.5</q_code>\n<q_code qc_type=\"four_corner\">0021.1</q_code>\n<q_code qc_type=\"four_corner\">0021.2</q_code>\n<q_code qc_type=\"deroo\">556</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">lu4</reading>\n<reading r_type=\"korean_r\">rog</reading>\n<reading r_type=\"korean_h\">록</reading>\n<reading r_type=\"vietnam\">Lộc</reading>\n<reading r_type=\"ja_on\">ロク</reading>\n<reading r_type=\"ja_kun\">しか</reading>\n<reading r_type=\"ja_kun\">か</reading>\n<meaning>deer</meaning>\n<meaning m_lang=\"fr\">cerf</meaning>\n<meaning m_lang=\"es\">venado</meaning>\n<meaning m_lang=\"es\">ciervo</meaning>\n</rmgroup>\n<nanori>しし</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 式 -->\n<character>\n<literal>式</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">5f0f</cp_value>\n<cp_value cp_type=\"jis208\">28-16</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">56</rad_value>\n</radical>\n<misc>\n<grade>3</grade>\n<stroke_count>6</stroke_count>\n<freq>251</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">1556</dic_ref>\n<dic_ref dr_type=\"nelson_n\">1676</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">3049</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">3785</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1931</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2623</dic_ref>\n<dic_ref dr_type=\"heisig\">353</dic_ref>\n<dic_ref dr_type=\"heisig6\">377</dic_ref>\n<dic_ref dr_type=\"gakken\">185</dic_ref>\n<dic_ref dr_type=\"oneill_names\">306</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">349</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"4\" m_page=\"0674\">9663</dic_ref>\n<dic_ref dr_type=\"henshall\">295</dic_ref>\n<dic_ref dr_type=\"sh_kk\">525</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">534</dic_ref>\n<dic_ref dr_type=\"sakade\">417</dic_ref>\n<dic_ref dr_type=\"jf_cards\">515</dic_ref>\n<dic_ref dr_type=\"henshall3\">311</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">269</dic_ref>\n<dic_ref dr_type=\"crowley\">356</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">796</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">602</dic_ref>\n<dic_ref dr_type=\"maniette\">359</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">3-3-3</q_code>\n<q_code qc_type=\"sh_desc\">4n3.2</q_code>\n<q_code qc_type=\"four_corner\">4310.0</q_code>\n<q_code qc_type=\"deroo\">1456</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">shi4</reading>\n<reading r_type=\"korean_r\">sig</reading>\n<reading r_type=\"korean_h\">식</reading>\n<reading r_type=\"vietnam\">Thức</reading>\n<reading r_type=\"ja_on\">シキ</reading>\n<meaning>style</meaning>\n<meaning>ceremony</meaning>\n<meaning>rite</meaning>\n<meaning>function</meaning>\n<meaning>method</meaning>\n<meaning>system</meaning>\n<meaning>form</meaning>\n<meaning>expression</meaning>\n<meaning m_lang=\"fr\">type</meaning>\n<meaning m_lang=\"fr\">protocole</meaning>\n<meaning m_lang=\"fr\">cérémonie</meaning>\n<meaning m_lang=\"fr\">rituel</meaning>\n<meaning m_lang=\"fr\">fonction</meaning>\n<meaning m_lang=\"fr\">processus</meaning>\n<meaning m_lang=\"fr\">système</meaning>\n<meaning m_lang=\"fr\">forme</meaning>\n<meaning m_lang=\"es\">ceremonia</meaning>\n<meaning m_lang=\"es\">método</meaning>\n<meaning m_lang=\"es\">sistema</meaning>\n<meaning m_lang=\"es\">forma</meaning>\n<meaning m_lang=\"pt\">estilo</meaning>\n<meaning m_lang=\"pt\">cerimônia</meaning>\n<meaning m_lang=\"pt\">rito</meaning>\n<meaning m_lang=\"pt\">método</meaning>\n<meaning m_lang=\"pt\">sistema</meaning>\n<meaning m_lang=\"pt\">formulário</meaning>\n</rmgroup>\n<nanori>のり</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 識 -->\n<character>\n<literal>識</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8b58</cp_value>\n<cp_value cp_type=\"jis208\">28-17</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">149</rad_value>\n</radical>\n<misc>\n<grade>5</grade>\n<stroke_count>19</stroke_count>\n<freq>496</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">4438</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5704</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1639</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">2070</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1086</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1477</dic_ref>\n<dic_ref dr_type=\"heisig\">482</dic_ref>\n<dic_ref dr_type=\"heisig6\">521</dic_ref>\n<dic_ref dr_type=\"gakken\">617</dic_ref>\n<dic_ref dr_type=\"oneill_names\">2810</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">486</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"10\" m_page=\"0588\">35974</dic_ref>\n<dic_ref dr_type=\"henshall\">698</dic_ref>\n<dic_ref dr_type=\"sh_kk\">681</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">694</dic_ref>\n<dic_ref dr_type=\"sakade\">627</dic_ref>\n<dic_ref dr_type=\"jf_cards\">911</dic_ref>\n<dic_ref dr_type=\"henshall3\">725</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">824</dic_ref>\n<dic_ref dr_type=\"crowley\">416</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">512</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1709</dic_ref>\n<dic_ref dr_type=\"maniette\">493</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-7-12</q_code>\n<q_code qc_type=\"sh_desc\">7a12.6</q_code>\n<q_code qc_type=\"four_corner\">0365.0</q_code>\n<q_code qc_type=\"deroo\">3059</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">shi4</reading>\n<reading r_type=\"pinyin\">zhi4</reading>\n<reading r_type=\"korean_r\">sig</reading>\n<reading r_type=\"korean_r\">ji</reading>\n<reading r_type=\"korean_h\">식</reading>\n<reading r_type=\"korean_h\">지</reading>\n<reading r_type=\"vietnam\">Thức</reading>\n<reading r_type=\"vietnam\">Chí</reading>\n<reading r_type=\"ja_on\">シキ</reading>\n<reading r_type=\"ja_kun\">し.る</reading>\n<reading r_type=\"ja_kun\">しる.す</reading>\n<meaning>discriminating</meaning>\n<meaning>know</meaning>\n<meaning>write</meaning>\n<meaning m_lang=\"fr\">discernement</meaning>\n<meaning m_lang=\"fr\">connaissance</meaning>\n<meaning m_lang=\"fr\">écrire</meaning>\n<meaning m_lang=\"es\">discernir</meaning>\n<meaning m_lang=\"es\">distinguir</meaning>\n<meaning m_lang=\"es\">símbolo</meaning>\n<meaning m_lang=\"pt\">discriminação</meaning>\n<meaning m_lang=\"pt\">saber</meaning>\n<meaning m_lang=\"pt\">escrever</meaning>\n</rmgroup>\n<nanori>さと</nanori>\n<nanori>さとる</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 鴫 -->\n<character>\n<literal>鴫</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">9d2b</cp_value>\n<cp_value cp_type=\"jis208\">28-18</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">102</rad_value>\n</radical>\n<misc>\n<stroke_count>16</stroke_count>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3013</dic_ref>\n<dic_ref dr_type=\"nelson_n\">6948</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"12\" m_page=\"0820\">46831</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-5-11</q_code>\n<q_code qc_type=\"sh_desc\">5f11.1</q_code>\n<q_code qc_type=\"four_corner\">6702.7</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"korean_r\">jeon</reading>\n<reading r_type=\"korean_h\">전</reading>\n<reading r_type=\"vietnam\">Dẽ</reading>\n<reading r_type=\"ja_kun\">しぎ</reading>\n<meaning>snipe</meaning>\n<meaning>(kokuji)</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 竺 -->\n<character>\n<literal>竺</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">7afa</cp_value>\n<cp_value cp_type=\"jis208\">28-19</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">118</rad_value>\n</radical>\n<misc>\n<grade>9</grade>\n<stroke_count>8</stroke_count>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3367</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4247</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">3248</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2280</dic_ref>\n<dic_ref dr_type=\"heisig\">2642</dic_ref>\n<dic_ref dr_type=\"heisig6\">2684</dic_ref>\n<dic_ref dr_type=\"oneill_names\">729</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"8\" m_page=\"0743\">25842</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-6-2</q_code>\n<q_code qc_type=\"sh_desc\">6f2.1</q_code>\n<q_code qc_type=\"four_corner\">8810.1</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zhu2</reading>\n<reading r_type=\"korean_r\">chug</reading>\n<reading r_type=\"korean_r\">dog</reading>\n<reading r_type=\"korean_h\">축</reading>\n<reading r_type=\"korean_h\">독</reading>\n<reading r_type=\"vietnam\">Trúc</reading>\n<reading r_type=\"vietnam\">Đốc</reading>\n<reading r_type=\"ja_on\">ジク</reading>\n<reading r_type=\"ja_on\">チク</reading>\n<reading r_type=\"ja_on\">トク</reading>\n<meaning>bamboo</meaning>\n</rmgroup>\n<nanori>あつし</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 軸 -->\n<character>\n<literal>軸</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8ef8</cp_value>\n<cp_value cp_type=\"jis208\">28-20</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">159</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>12</stroke_count>\n<freq>1261</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">4619</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5952</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1514</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">1908</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1014</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1371</dic_ref>\n<dic_ref dr_type=\"heisig\">1112</dic_ref>\n<dic_ref dr_type=\"heisig6\">1193</dic_ref>\n<dic_ref dr_type=\"gakken\">1719</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1258</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"10\" m_page=\"1008\">38269</dic_ref>\n<dic_ref dr_type=\"henshall\">1330</dic_ref>\n<dic_ref dr_type=\"sh_kk\">988</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1023</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1798</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1591</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1589</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1776</dic_ref>\n<dic_ref dr_type=\"maniette\">1121</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-7-5</q_code>\n<q_code qc_type=\"sh_desc\">7c5.1</q_code>\n<q_code qc_type=\"four_corner\">5506.0</q_code>\n<q_code qc_type=\"deroo\">1576</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zhou2</reading>\n<reading r_type=\"pinyin\">zhou4</reading>\n<reading r_type=\"pinyin\">zhu2</reading>\n<reading r_type=\"korean_r\">chug</reading>\n<reading r_type=\"korean_h\">축</reading>\n<reading r_type=\"vietnam\">Trục</reading>\n<reading r_type=\"ja_on\">ジク</reading>\n<meaning>axis</meaning>\n<meaning>pivot</meaning>\n<meaning>stem</meaning>\n<meaning>stalk</meaning>\n<meaning>counter for book scrolls</meaning>\n<meaning m_lang=\"fr\">axe</meaning>\n<meaning m_lang=\"fr\">pivot</meaning>\n<meaning m_lang=\"fr\">tige</meaning>\n<meaning m_lang=\"fr\">compteur de livres en rouleaux</meaning>\n<meaning m_lang=\"es\">eje</meaning>\n<meaning m_lang=\"es\">pivote</meaning>\n<meaning m_lang=\"es\">péndulo</meaning>\n<meaning m_lang=\"es\">mango</meaning>\n<meaning m_lang=\"pt\">eixo</meaning>\n<meaning m_lang=\"pt\">pivô</meaning>\n<meaning m_lang=\"pt\">talo</meaning>\n<meaning m_lang=\"pt\">caule</meaning>\n<meaning m_lang=\"pt\">sufixo para contagem de pergaminhos</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 宍 -->\n<character>\n<literal>宍</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">5b8d</cp_value>\n<cp_value cp_type=\"jis208\">28-21</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">40</rad_value>\n</radical>\n<misc>\n<stroke_count>7</stroke_count>\n<variant var_type=\"nelson_c\">3724</variant>\n<freq>2269</freq>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">1284</dic_ref>\n<dic_ref dr_type=\"nelson_n\">1312</dic_ref>\n<dic_ref dr_type=\"heisig\">2216</dic_ref>\n<dic_ref dr_type=\"heisig6\">2327</dic_ref>\n<dic_ref dr_type=\"oneill_names\">470</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"3\" m_page=\"0950\">7084</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-3-4</q_code>\n<q_code qc_type=\"sh_desc\">3m4.4</q_code>\n<q_code qc_type=\"four_corner\">3080.0</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">rou4</reading>\n<reading r_type=\"korean_r\">yug</reading>\n<reading r_type=\"korean_h\">육</reading>\n<reading r_type=\"vietnam\">Nhục</reading>\n<reading r_type=\"ja_on\">ニク</reading>\n<reading r_type=\"ja_on\">ジク</reading>\n<reading r_type=\"ja_kun\">しし</reading>\n<meaning>muscles</meaning>\n<meaning>meat</meaning>\n<meaning m_lang=\"es\">músculos</meaning>\n<meaning m_lang=\"es\">carne</meaning>\n</rmgroup>\n<nanori>し</nanori>\n<nanori>しん</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 雫 -->\n<character>\n<literal>雫</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">96eb</cp_value>\n<cp_value cp_type=\"jis208\">28-22</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">173</rad_value>\n</radical>\n<misc>\n<grade>9</grade>\n<stroke_count>11</stroke_count>\n<freq>2219</freq>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">5043</dic_ref>\n<dic_ref dr_type=\"nelson_n\">6519</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">2760</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">3430</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2405</dic_ref>\n<dic_ref dr_type=\"heisig\">2778</dic_ref>\n<dic_ref dr_type=\"heisig6\">2799</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1494</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"12\" m_page=\"0014\">42219</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-8-3</q_code>\n<q_code qc_type=\"sh_desc\">8d3.1</q_code>\n<q_code qc_type=\"four_corner\">1023.1</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">na3</reading>\n<reading r_type=\"vietnam\">Đà</reading>\n<reading r_type=\"ja_on\">ダ</reading>\n<reading r_type=\"ja_kun\">しずく</reading>\n<meaning>drop</meaning>\n<meaning>trickle</meaning>\n<meaning>dripping</meaning>\n<meaning>(kokuji)</meaning>\n<meaning m_lang=\"es\">gota</meaning>\n<meaning m_lang=\"es\">gotear</meaning>\n<meaning m_lang=\"es\">chorrear</meaning>\n<meaning m_lang=\"es\">calar</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 七 -->\n<character>\n<literal>七</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">4e03</cp_value>\n<cp_value cp_type=\"jis208\">28-23</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">1</rad_value>\n<rad_value rad_type=\"nelson_c\">5</rad_value>\n</radical>\n<misc>\n<grade>1</grade>\n<stroke_count>2</stroke_count>\n<variant var_type=\"deroo\">1474</variant>\n<freq>115</freq>\n<jlpt>4</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">261</dic_ref>\n<dic_ref dr_type=\"nelson_n\">3</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">3362</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">4169</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">2109</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2854</dic_ref>\n<dic_ref dr_type=\"heisig\">7</dic_ref>\n<dic_ref dr_type=\"heisig6\">7</dic_ref>\n<dic_ref dr_type=\"gakken\">44</dic_ref>\n<dic_ref dr_type=\"oneill_names\">17</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">9</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"1\" m_page=\"0081\">6</dic_ref>\n<dic_ref dr_type=\"henshall\">30</dic_ref>\n<dic_ref dr_type=\"sh_kk\">9</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">9</dic_ref>\n<dic_ref dr_type=\"sakade\">7</dic_ref>\n<dic_ref dr_type=\"jf_cards\">2</dic_ref>\n<dic_ref dr_type=\"henshall3\">7</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">3</dic_ref>\n<dic_ref dr_type=\"crowley\">147</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">7</dic_ref>\n<dic_ref dr_type=\"busy_people\">1.A</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">2</dic_ref>\n<dic_ref dr_type=\"maniette\">7</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">4-2-2</q_code>\n<q_code qc_type=\"sh_desc\">0a2.13</q_code>\n<q_code qc_type=\"four_corner\">4071.0</q_code>\n<q_code qc_type=\"deroo\">1456</q_code>\n<q_code qc_type=\"skip\" skip_misclass=\"posn\">4-2-4</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">qi1</reading>\n<reading r_type=\"korean_r\">chil</reading>\n<reading r_type=\"korean_h\">칠</reading>\n<reading r_type=\"vietnam\">Thất</reading>\n<reading r_type=\"ja_on\">シチ</reading>\n<reading r_type=\"ja_kun\">なな</reading>\n<reading r_type=\"ja_kun\">なな.つ</reading>\n<reading r_type=\"ja_kun\">なの</reading>\n<meaning>seven</meaning>\n<meaning m_lang=\"fr\">sept</meaning>\n<meaning m_lang=\"es\">siete</meaning>\n<meaning m_lang=\"es\">7</meaning>\n<meaning m_lang=\"pt\">Sete</meaning>\n</rmgroup>\n<nanori>し</nanori>\n<nanori>しっ</nanori>\n<nanori>な</nanori>\n<nanori>ひち</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 叱 -->\n<character>\n<literal>叱</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">53f1</cp_value>\n<cp_value cp_type=\"jis208\">28-24</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">30</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>5</stroke_count>\n<freq>2255</freq>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">873</dic_ref>\n<dic_ref dr_type=\"nelson_n\">691</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">182</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">213</dic_ref>\n<dic_ref dr_type=\"heisig\">2179</dic_ref>\n<dic_ref dr_type=\"heisig6\">477</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1886</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"2\" m_page=\"0760\">3248</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1323</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-3-2</q_code>\n<q_code qc_type=\"sh_desc\">3d2.2</q_code>\n<q_code qc_type=\"four_corner\">6401.0</q_code>\n<q_code qc_type=\"four_corner\">6201.0</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">chi4</reading>\n<reading r_type=\"korean_r\">jil</reading>\n<reading r_type=\"korean_h\">질</reading>\n<reading r_type=\"vietnam\">Sất</reading>\n<reading r_type=\"ja_on\">シツ</reading>\n<reading r_type=\"ja_on\">シチ</reading>\n<reading r_type=\"ja_kun\">しか.る</reading>\n<meaning>scold</meaning>\n<meaning>reprove</meaning>\n<meaning m_lang=\"es\">regañina</meaning>\n<meaning m_lang=\"es\">reproche</meaning>\n<meaning m_lang=\"es\">regañar</meaning>\n<meaning m_lang=\"es\">reprochar</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 執 -->\n<character>\n<literal>執</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">57f7</cp_value>\n<cp_value cp_type=\"jis208\">28-25</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">32</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>11</stroke_count>\n<variant var_type=\"nelson_c\">3699</variant>\n<freq>800</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">1097</dic_ref>\n<dic_ref dr_type=\"nelson_n\">1039</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1680</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">2114</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1102</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1501</dic_ref>\n<dic_ref dr_type=\"heisig\">1506</dic_ref>\n<dic_ref dr_type=\"heisig6\">1623</dic_ref>\n<dic_ref dr_type=\"gakken\">965</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1420</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1231</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"3\" m_page=\"0191\">5193</dic_ref>\n<dic_ref dr_type=\"henshall\">1332</dic_ref>\n<dic_ref dr_type=\"sh_kk\">686</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">699</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1152</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1418</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1823</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">351</dic_ref>\n<dic_ref dr_type=\"maniette\">1520</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-8-3</q_code>\n<q_code qc_type=\"sh_desc\">3b8.15</q_code>\n<q_code qc_type=\"four_corner\">4541.7</q_code>\n<q_code qc_type=\"four_corner\">4441.7</q_code>\n<q_code qc_type=\"deroo\">1457</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zhi2</reading>\n<reading r_type=\"korean_r\">jib</reading>\n<reading r_type=\"korean_h\">집</reading>\n<reading r_type=\"vietnam\">Chấp</reading>\n<reading r_type=\"ja_on\">シツ</reading>\n<reading r_type=\"ja_on\">シュウ</reading>\n<reading r_type=\"ja_kun\">と.る</reading>\n<meaning>tenacious</meaning>\n<meaning>take hold</meaning>\n<meaning>grasp</meaning>\n<meaning>take to heart</meaning>\n<meaning m_lang=\"fr\">prendre en charge</meaning>\n<meaning m_lang=\"fr\">saisir</meaning>\n<meaning m_lang=\"fr\">ténacité</meaning>\n<meaning m_lang=\"fr\">prendre à coeur</meaning>\n<meaning m_lang=\"es\">dirigir</meaning>\n<meaning m_lang=\"es\">hacer negocios</meaning>\n<meaning m_lang=\"es\">tomar el control</meaning>\n<meaning m_lang=\"pt\">tenaz</meaning>\n<meaning m_lang=\"pt\">segurar</meaning>\n<meaning m_lang=\"pt\">agarrar</meaning>\n<meaning m_lang=\"pt\">simpatizar</meaning>\n</rmgroup>\n<nanori>し</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 失 -->\n<character>\n<literal>失</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">5931</cp_value>\n<cp_value cp_type=\"jis208\">28-26</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">37</rad_value>\n<rad_value rad_type=\"nelson_c\">4</rad_value>\n</radical>\n<misc>\n<grade>4</grade>\n<stroke_count>5</stroke_count>\n<freq>447</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">178</dic_ref>\n<dic_ref dr_type=\"nelson_n\">1141</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">3511</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">4325</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">2189</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2947</dic_ref>\n<dic_ref dr_type=\"heisig\">845</dic_ref>\n<dic_ref dr_type=\"heisig6\">908</dic_ref>\n<dic_ref dr_type=\"gakken\">523</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">238</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"3\" m_page=\"0553\">5844</dic_ref>\n<dic_ref dr_type=\"henshall\">501</dic_ref>\n<dic_ref dr_type=\"sh_kk\">311</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">311</dic_ref>\n<dic_ref dr_type=\"sakade\">418</dic_ref>\n<dic_ref dr_type=\"jf_cards\">447</dic_ref>\n<dic_ref dr_type=\"henshall3\">529</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">452</dic_ref>\n<dic_ref dr_type=\"crowley\">346</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">594</dic_ref>\n<dic_ref dr_type=\"busy_people\">3.13</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">413</dic_ref>\n<dic_ref dr_type=\"maniette\">853</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">4-5-4</q_code>\n<q_code qc_type=\"sh_desc\">0a5.28</q_code>\n<q_code qc_type=\"four_corner\">2503.0</q_code>\n<q_code qc_type=\"deroo\">2463</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">shi1</reading>\n<reading r_type=\"korean_r\">sil</reading>\n<reading r_type=\"korean_h\">실</reading>\n<reading r_type=\"vietnam\">Thất</reading>\n<reading r_type=\"ja_on\">シツ</reading>\n<reading r_type=\"ja_kun\">うしな.う</reading>\n<reading r_type=\"ja_kun\">う.せる</reading>\n<meaning>lose</meaning>\n<meaning>error</meaning>\n<meaning>fault</meaning>\n<meaning>disadvantage</meaning>\n<meaning>loss</meaning>\n<meaning m_lang=\"fr\">perdre</meaning>\n<meaning m_lang=\"fr\">erreur</meaning>\n<meaning m_lang=\"fr\">faute</meaning>\n<meaning m_lang=\"fr\">désavantage</meaning>\n<meaning m_lang=\"es\">pérdida</meaning>\n<meaning m_lang=\"es\">error</meaning>\n<meaning m_lang=\"es\">defecto</meaning>\n<meaning m_lang=\"es\">fallo</meaning>\n<meaning m_lang=\"es\">perder</meaning>\n<meaning m_lang=\"es\">malograr</meaning>\n<meaning m_lang=\"es\">errar</meaning>\n<meaning m_lang=\"pt\">erro</meaning>\n<meaning m_lang=\"pt\">falta</meaning>\n<meaning m_lang=\"pt\">desvantagem</meaning>\n<meaning m_lang=\"pt\">perda</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 嫉 -->\n<character>\n<literal>嫉</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">5ac9</cp_value>\n<cp_value cp_type=\"jis208\">28-27</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">38</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>13</stroke_count>\n<variant var_type=\"nelson_c\">1205</variant>\n<freq>2317</freq>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">1248</dic_ref>\n<dic_ref dr_type=\"nelson_n\">1255</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">783</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">584</dic_ref>\n<dic_ref dr_type=\"heisig\">2202</dic_ref>\n<dic_ref dr_type=\"heisig6\">1820</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"3\" m_page=\"0746\">6611</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1955</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-3-10</q_code>\n<q_code qc_type=\"sh_desc\">3e10.8</q_code>\n<q_code qc_type=\"four_corner\">4043.4</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">ji2</reading>\n<reading r_type=\"korean_r\">jil</reading>\n<reading r_type=\"korean_h\">질</reading>\n<reading r_type=\"vietnam\">Tật</reading>\n<reading r_type=\"ja_on\">シツ</reading>\n<reading r_type=\"ja_kun\">そね.む</reading>\n<reading r_type=\"ja_kun\">ねた.む</reading>\n<reading r_type=\"ja_kun\">にく.む</reading>\n<meaning>jealous</meaning>\n<meaning>envy</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 室 -->\n\n<character>\n<literal>腫</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">816b</cp_value>\n<cp_value cp_type=\"jis208\">28-80</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">130</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>13</stroke_count>\n<freq>2145</freq>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3797</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4848</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">1310</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">951</dic_ref>\n<dic_ref dr_type=\"heisig\">2467</dic_ref>\n<dic_ref dr_type=\"heisig6\">1807</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"9\" m_page=\"0342\">29697</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">2106</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-4-9</q_code>\n<q_code qc_type=\"sh_desc\">4b9.1</q_code>\n<q_code qc_type=\"four_corner\">7221.4</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zhong3</reading>\n<reading r_type=\"korean_r\">jong</reading>\n<reading r_type=\"korean_h\">종</reading>\n<reading r_type=\"vietnam\">Thũng</reading>\n<reading r_type=\"vietnam\">Trũng</reading>\n<reading r_type=\"ja_on\">シュ</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<reading r_type=\"ja_kun\">は.れる</reading>\n<reading r_type=\"ja_kun\">は.れ</reading>\n<reading r_type=\"ja_kun\">は.らす</reading>\n<reading r_type=\"ja_kun\">く.む</reading>\n<reading r_type=\"ja_kun\">はれもの</reading>\n<meaning>tumor</meaning>\n<meaning>swelling</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 趣 -->\n<character>\n<literal>趣</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8da3</cp_value>\n<cp_value cp_type=\"jis208\">28-81</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">156</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>15</stroke_count>\n<freq>1153</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">4544</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5854</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">3317</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">4111</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">2087</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2827</dic_ref>\n<dic_ref dr_type=\"heisig\">820</dic_ref>\n<dic_ref dr_type=\"heisig6\">883</dic_ref>\n<dic_ref dr_type=\"gakken\">1193</dic_ref>\n<dic_ref dr_type=\"oneill_names\">2422</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1047</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"10\" m_page=\"0885\">37207</dic_ref>\n<dic_ref dr_type=\"henshall\">1350</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1002</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1039</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1790</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1805</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">310</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1758</dic_ref>\n<dic_ref dr_type=\"maniette\">828</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">3-7-8</q_code>\n<q_code qc_type=\"sh_desc\">6e9.1</q_code>\n<q_code qc_type=\"four_corner\">4180.4</q_code>\n<q_code qc_type=\"four_corner\">4780.4</q_code>\n<q_code qc_type=\"deroo\">1470</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">qu4</reading>\n<reading r_type=\"pinyin\">cu4</reading>\n<reading r_type=\"korean_r\">chwi</reading>\n<reading r_type=\"korean_r\">chug</reading>\n<reading r_type=\"korean_h\">취</reading>\n<reading r_type=\"korean_h\">축</reading>\n<reading r_type=\"vietnam\">Thú</reading>\n<reading r_type=\"vietnam\">Xúc</reading>\n<reading r_type=\"ja_on\">シュ</reading>\n<reading r_type=\"ja_kun\">おもむき</reading>\n<reading r_type=\"ja_kun\">おもむ.く</reading>\n<meaning>purport</meaning>\n<meaning>gist</meaning>\n<meaning>elegance</meaning>\n<meaning>interest</meaning>\n<meaning>proceed to</meaning>\n<meaning>tend</meaning>\n<meaning>become</meaning>\n<meaning m_lang=\"fr\">teneur</meaning>\n<meaning m_lang=\"fr\">fond</meaning>\n<meaning m_lang=\"fr\">aspect</meaning>\n<meaning m_lang=\"fr\">apparence</meaning>\n<meaning m_lang=\"fr\">sens</meaning>\n<meaning m_lang=\"fr\">tendance</meaning>\n<meaning m_lang=\"fr\">devenir</meaning>\n<meaning m_lang=\"es\">significado</meaning>\n<meaning m_lang=\"es\">sentido</meaning>\n<meaning m_lang=\"es\">apariencia</meaning>\n<meaning m_lang=\"es\">proceder</meaning>\n<meaning m_lang=\"pt\">essência</meaning>\n<meaning m_lang=\"pt\">continuar para</meaning>\n<meaning m_lang=\"pt\">tender</meaning>\n<meaning m_lang=\"pt\">tornar-se</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 酒 -->\n<character>\n<literal>酒</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">9152</cp_value>\n<cp_value cp_type=\"jis208\">28-82</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">85</rad_value>\n</radical>\n<misc>\n<grade>3</grade>\n<stroke_count>10</stroke_count>\n<freq>1006</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">2573</dic_ref>\n<dic_ref dr_type=\"nelson_n\">6160</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">444</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">532</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">328</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">403</dic_ref>\n<dic_ref dr_type=\"heisig\">1428</dic_ref>\n<dic_ref dr_type=\"heisig6\">1535</dic_ref>\n<dic_ref dr_type=\"gakken\">781</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1066</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">347</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"11\" m_page=\"0353\">39776</dic_ref>\n<dic_ref dr_type=\"henshall\">302</dic_ref>\n<dic_ref dr_type=\"sh_kk\">517</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">526</dic_ref>\n<dic_ref dr_type=\"sakade\">422</dic_ref>\n<dic_ref dr_type=\"jf_cards\">972</dic_ref>\n<dic_ref dr_type=\"henshall3\">318</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">356</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">144</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1789</dic_ref>\n<dic_ref dr_type=\"maniette\">1440</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-3-7</q_code>\n<q_code qc_type=\"sh_desc\">3a7.1</q_code>\n<q_code qc_type=\"four_corner\">3116.0</q_code>\n<q_code qc_type=\"deroo\">375</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">jiu3</reading>\n<reading r_type=\"korean_r\">ju</reading>\n<reading r_type=\"korean_h\">주</reading>\n<reading r_type=\"vietnam\">Tửu</reading>\n<reading r_type=\"ja_on\">シュ</reading>\n<reading r_type=\"ja_kun\">さけ</reading>\n<reading r_type=\"ja_kun\">さか-</reading>\n<meaning>sake</meaning>\n<meaning>alcohol</meaning>\n<meaning m_lang=\"fr\">saké</meaning>\n<meaning m_lang=\"fr\">alcool</meaning>\n<meaning m_lang=\"es\">sake</meaning>\n<meaning m_lang=\"es\">alcohol</meaning>\n<meaning m_lang=\"es\">vino de arroz</meaning>\n<meaning m_lang=\"pt\">sake</meaning>\n<meaning m_lang=\"pt\">álcool</meaning>\n</rmgroup>\n<nanori>き</nanori>\n<nanori>さ</nanori>\n<nanori>し</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 首 -->\n<character>\n<literal>首</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">9996</cp_value>\n<cp_value cp_type=\"jis208\">28-83</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">185</rad_value>\n</radical>\n<misc>\n<grade>2</grade>\n<stroke_count>9</stroke_count>\n<freq>98</freq>\n<jlpt>3</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">5186</dic_ref>\n<dic_ref dr_type=\"nelson_n\">6719</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">2265</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">2818</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1452</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1956</dic_ref>\n<dic_ref dr_type=\"heisig\">70</dic_ref>\n<dic_ref dr_type=\"heisig6\">74</dic_ref>\n<dic_ref dr_type=\"gakken\">208</dic_ref>\n<dic_ref dr_type=\"oneill_names\">920</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">138</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"12\" m_page=\"0438\">44489</dic_ref>\n<dic_ref dr_type=\"henshall\">139</dic_ref>\n<dic_ref dr_type=\"sh_kk\">148</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">148</dic_ref>\n<dic_ref dr_type=\"sakade\">239</dic_ref>\n<dic_ref dr_type=\"jf_cards\">281</dic_ref>\n<dic_ref dr_type=\"henshall3\">155</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">177</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">393</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1910</dic_ref>\n<dic_ref dr_type=\"maniette\">70</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-3-6</q_code>\n<q_code qc_type=\"sh_desc\">2o7.2</q_code>\n<q_code qc_type=\"four_corner\">8060.1</q_code>\n<q_code qc_type=\"deroo\">979</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">shou3</reading>\n<reading r_type=\"korean_r\">su</reading>\n<reading r_type=\"korean_h\">수</reading>\n<reading r_type=\"vietnam\">Thủ</reading>\n<reading r_type=\"vietnam\">Thú</reading>\n<reading r_type=\"ja_on\">シュ</reading>\n<reading r_type=\"ja_kun\">くび</reading>\n<meaning>neck</meaning>\n<meaning>counter for songs and poems</meaning>\n<meaning m_lang=\"fr\">cou</meaning>\n<meaning m_lang=\"fr\">compteur de chansons ou poèmes</meaning>\n<meaning m_lang=\"es\">cuello</meaning>\n<meaning m_lang=\"es\">principio</meaning>\n<meaning m_lang=\"pt\">pescoço</meaning>\n</rmgroup>\n<nanori>おびと</nanori>\n<nanori>こべ</nanori>\n<nanori>す</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 儒 -->\n<character>\n<literal>儒</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">5112</cp_value>\n<cp_value cp_type=\"jis208\">28-84</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">9</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>16</stroke_count>\n<freq>2162</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">561</dic_ref>\n<dic_ref dr_type=\"nelson_n\">330</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">174</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">197</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">127</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">153</dic_ref>\n<dic_ref dr_type=\"heisig\">1166</dic_ref>\n<dic_ref dr_type=\"heisig6\">1250</dic_ref>\n<dic_ref dr_type=\"gakken\">1968</dic_ref>\n<dic_ref dr_type=\"oneill_names\">2432</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1579</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"1\" m_page=\"0950\">1220</dic_ref>\n<dic_ref dr_type=\"henshall\">1352</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1417</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1506</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1072</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1820</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1891</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">138</dic_ref>\n<dic_ref dr_type=\"maniette\">1174</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-2-14</q_code>\n<q_code qc_type=\"sh_desc\">2a14.1</q_code>\n<q_code qc_type=\"four_corner\">2122.7</q_code>\n<q_code qc_type=\"deroo\">2153</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">ru2</reading>\n<reading r_type=\"korean_r\">yu</reading>\n<reading r_type=\"korean_h\">유</reading>\n<reading r_type=\"vietnam\">Nho</reading>\n<reading r_type=\"ja_on\">ジュ</reading>\n<meaning>Confucian</meaning>\n<meaning m_lang=\"fr\">confucéen</meaning>\n<meaning m_lang=\"es\">confucionismo</meaning>\n<meaning m_lang=\"pt\">Confucianista</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 受 -->\n<character>\n<literal>受</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">53d7</cp_value>\n<cp_value cp_type=\"jis208\">28-85</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">29</rad_value>\n<rad_value rad_type=\"nelson_c\">87</rad_value>\n</radical>\n<misc>\n<grade>3</grade>\n<stroke_count>8</stroke_count>\n<freq>136</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">2826</dic_ref>\n<dic_ref dr_type=\"nelson_n\">678</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">2421</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">3076</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1569</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2146</dic_ref>\n<dic_ref dr_type=\"heisig\">735</dic_ref>\n<dic_ref dr_type=\"heisig6\">794</dic_ref>\n<dic_ref dr_type=\"gakken\">223</dic_ref>\n<dic_ref dr_type=\"oneill_names\">730</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">272</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"2\" m_page=\"0706\">3159</dic_ref>\n<dic_ref dr_type=\"henshall\">303</dic_ref>\n<dic_ref dr_type=\"sh_kk\">260</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">260</dic_ref>\n<dic_ref dr_type=\"sakade\">240</dic_ref>\n<dic_ref dr_type=\"jf_cards\">394</dic_ref>\n<dic_ref dr_type=\"henshall3\">319</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">304</dic_ref>\n<dic_ref dr_type=\"crowley\">298</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">269</dic_ref>\n<dic_ref dr_type=\"busy_people\">2.9</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">270</dic_ref>\n<dic_ref dr_type=\"maniette\">743</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-4-4</q_code>\n<q_code qc_type=\"sh_desc\">2h6.2</q_code>\n<q_code qc_type=\"four_corner\">2040.7</q_code>\n<q_code qc_type=\"deroo\">2067</q_code>\n<q_code qc_type=\"skip\" skip_misclass=\"posn\">2-1-7</q_code>\n<q_code qc_type=\"skip\" skip_misclass=\"posn\">2-6-2</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">shou4</reading>\n<reading r_type=\"korean_r\">su</reading>\n<reading r_type=\"korean_h\">수</reading>\n<reading r_type=\"vietnam\">Thụ</reading>\n<reading r_type=\"ja_on\">ジュ</reading>\n<reading r_type=\"ja_kun\">う.ける</reading>\n<reading r_type=\"ja_kun\">-う.け</reading>\n<reading r_type=\"ja_kun\">う.かる</reading>\n<meaning>accept</meaning>\n<meaning>undergo</meaning>\n<meaning>answer (phone)</meaning>\n<meaning>take</meaning>\n<meaning>get</meaning>\n<meaning>catch</meaning>\n<meaning>receive</meaning>\n<meaning m_lang=\"fr\">subir</meaning>\n<meaning m_lang=\"fr\">recevoir</meaning>\n<meaning m_lang=\"fr\">accepter</meaning>\n<meaning m_lang=\"fr\">répondre (téléphone)</meaning>\n<meaning m_lang=\"fr\">prendre</meaning>\n<meaning m_lang=\"fr\">obtenir</meaning>\n<meaning m_lang=\"es\">recipiente</meaning>\n<meaning m_lang=\"es\">acepción</meaning>\n<meaning m_lang=\"es\">aceptar</meaning>\n<meaning m_lang=\"es\">recibir</meaning>\n<meaning m_lang=\"es\">tomar</meaning>\n<meaning m_lang=\"es\">aprobar examen</meaning>\n<meaning m_lang=\"pt\">aceitar</meaning>\n<meaning m_lang=\"pt\">sofrer</meaning>\n<meaning m_lang=\"pt\">atender (telefone)</meaning>\n<meaning m_lang=\"pt\">tomar</meaning>\n<meaning m_lang=\"pt\">obter</meaning>\n<meaning m_lang=\"pt\">pegar</meaning>\n<meaning m_lang=\"pt\">receber</meaning>\n</rmgroup>\n<nanori>じょ</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 呪 -->\n<character>\n<literal>呪</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">546a</cp_value>\n<cp_value cp_type=\"jis208\">28-86</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">30</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>8</stroke_count>\n<variant var_type=\"jis208\">50-80</variant>\n<freq>2131</freq>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">912</dic_ref>\n<dic_ref dr_type=\"nelson_n\">764</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">323</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">245</dic_ref>\n<dic_ref dr_type=\"heisig\">2169</dic_ref>\n<dic_ref dr_type=\"heisig6\">108</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"2\" m_page=\"0953\">3443</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1324</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-3-5</q_code>\n<q_code qc_type=\"sh_desc\">3d5.11</q_code>\n<q_code qc_type=\"four_corner\">6601.0</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zhou4</reading>\n<reading r_type=\"korean_r\">ju</reading>\n<reading r_type=\"korean_h\">주</reading>\n<reading r_type=\"vietnam\">Chú</reading>\n<reading r_type=\"ja_on\">ジュ</reading>\n<reading r_type=\"ja_on\">シュ</reading>\n<reading r_type=\"ja_on\">シュウ</reading>\n<reading r_type=\"ja_on\">ズ</reading>\n<reading r_type=\"ja_kun\">まじな.う</reading>\n<reading r_type=\"ja_kun\">のろ.い</reading>\n<reading r_type=\"ja_kun\">まじな.い</reading>\n<reading r_type=\"ja_kun\">のろ.う</reading>\n<meaning>spell</meaning>\n<meaning>curse</meaning>\n<meaning>charm</meaning>\n<meaning>malediction</meaning>\n<meaning m_lang=\"es\">maldición</meaning>\n<meaning m_lang=\"es\">hechizo</meaning>\n<meaning m_lang=\"es\">maldecir</meaning>\n<meaning m_lang=\"es\">hechizar</meaning>\n<meaning m_lang=\"es\">encantar</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 寿 -->\n<character>\n<literal>寿</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">5bff</cp_value>\n<cp_value cp_type=\"jis208\">28-87</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">41</rad_value>\n<rad_value rad_type=\"nelson_c\">4</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>7</stroke_count>\n<variant var_type=\"jis208\">52-72</variant>\n<freq>1245</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">194</dic_ref>\n<dic_ref dr_type=\"nelson_n\">1374</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">3557</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">4372</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">2215</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2979</dic_ref>\n<dic_ref dr_type=\"heisig\">1565</dic_ref>\n<dic_ref dr_type=\"heisig6\">1687</dic_ref>\n<dic_ref dr_type=\"gakken\">1132</dic_ref>\n<dic_ref dr_type=\"oneill_names\">539</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1786</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"4\" m_page=\"0006\">7419P</dic_ref>\n<dic_ref dr_type=\"henshall\">1351</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1550</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1652</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1221</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1115</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1327</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">501</dic_ref>\n<dic_ref dr_type=\"maniette\">1579</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">4-7-4</q_code>\n<q_code qc_type=\"sh_desc\">0a7.15</q_code>\n<q_code qc_type=\"four_corner\">5034.0</q_code>\n<q_code qc_type=\"four_corner\">5004.0</q_code>\n<q_code qc_type=\"deroo\">1448</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">shou4</reading>\n<reading r_type=\"korean_r\">su</reading>\n<reading r_type=\"korean_h\">수</reading>\n<reading r_type=\"vietnam\">Thọ</reading>\n<reading r_type=\"ja_on\">ジュ</reading>\n<reading r_type=\"ja_on\">ス</reading>\n<reading r_type=\"ja_on\">シュウ</reading>\n<reading r_type=\"ja_kun\">ことぶき</reading>\n<reading r_type=\"ja_kun\">ことぶ.く</reading>\n<reading r_type=\"ja_kun\">ことほ.ぐ</reading>\n<meaning>longevity</meaning>\n<meaning>congratulations</meaning>\n<meaning>one's natural life</meaning>\n<meaning m_lang=\"fr\">longévité</meaning>\n<meaning m_lang=\"fr\">félicitations</meaning>\n<meaning m_lang=\"fr\">vie</meaning>\n<meaning m_lang=\"es\">longevidad</meaning>\n<meaning m_lang=\"es\">felicitaciones</meaning>\n<meaning m_lang=\"pt\">longevidade</meaning>\n<meaning m_lang=\"pt\">congratulações</meaning>\n<meaning m_lang=\"pt\">vida natural</meaning>\n</rmgroup>\n<nanori>かず</nanori>\n<nanori>じ</nanori>\n<nanori>じゅう</nanori>\n<nanori>すっ</nanori>\n<nanori>すみ</nanori>\n<nanori>とし</nanori>\n<nanori>としかつ</nanori>\n<nanori>なが</nanori>\n<nanori>のぶ</nanori>\n<nanori>のり</nanori>\n<nanori>ひさ</nanori>\n<nanori>ひさし</nanori>\n<nanori>やす</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 授 -->\n<character>\n<literal>章</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">7ae0</cp_value>\n<cp_value cp_type=\"jis208\">30-47</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">117</rad_value>\n<rad_value rad_type=\"nelson_c\">180</rad_value>\n</radical>\n<misc>\n<grade>3</grade>\n<stroke_count>11</stroke_count>\n<freq>990</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">5112</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4235</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">2117</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">2624</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1342</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1819</dic_ref>\n<dic_ref dr_type=\"heisig\">433</dic_ref>\n<dic_ref dr_type=\"heisig6\">464</dic_ref>\n<dic_ref dr_type=\"gakken\">967</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1461</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">505</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"8\" m_page=\"0706\">25761</dic_ref>\n<dic_ref dr_type=\"henshall\">318</dic_ref>\n<dic_ref dr_type=\"sh_kk\">857</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">876</dic_ref>\n<dic_ref dr_type=\"sakade\">432</dic_ref>\n<dic_ref dr_type=\"jf_cards\">787</dic_ref>\n<dic_ref dr_type=\"henshall3\">334</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">376</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1027</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1460</dic_ref>\n<dic_ref dr_type=\"maniette\">440</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-2-9</q_code>\n<q_code qc_type=\"sh_desc\">5b6.3</q_code>\n<q_code qc_type=\"four_corner\">0040.6</q_code>\n<q_code qc_type=\"deroo\">455</q_code>\n<q_code qc_type=\"skip\" skip_misclass=\"posn\">2-5-6</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zhang1</reading>\n<reading r_type=\"korean_r\">jang</reading>\n<reading r_type=\"korean_h\">장</reading>\n<reading r_type=\"vietnam\">Chương</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<meaning>badge</meaning>\n<meaning>chapter</meaning>\n<meaning>composition</meaning>\n<meaning>poem</meaning>\n<meaning>design</meaning>\n<meaning m_lang=\"fr\">badge</meaning>\n<meaning m_lang=\"fr\">clairement visible</meaning>\n<meaning m_lang=\"fr\">composition</meaning>\n<meaning m_lang=\"fr\">poème</meaning>\n<meaning m_lang=\"fr\">chapitre</meaning>\n<meaning m_lang=\"fr\">dessin</meaning>\n<meaning m_lang=\"es\">distintivo</meaning>\n<meaning m_lang=\"es\">banda</meaning>\n<meaning m_lang=\"es\">capítulo</meaning>\n<meaning m_lang=\"es\">frase</meaning>\n<meaning m_lang=\"pt\">insígnia</meaning>\n<meaning m_lang=\"pt\">capítulo</meaning>\n<meaning m_lang=\"pt\">composição</meaning>\n<meaning m_lang=\"pt\">poema</meaning>\n<meaning m_lang=\"pt\">projeto</meaning>\n</rmgroup>\n<nanori>あき</nanori>\n<nanori>あきら</nanori>\n<nanori>あや</nanori>\n<nanori>ふみ</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 笑 -->\n<character>\n<literal>笑</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">7b11</cp_value>\n<cp_value cp_type=\"jis208\">30-48</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">118</rad_value>\n</radical>\n<misc>\n<grade>4</grade>\n<stroke_count>10</stroke_count>\n<freq>913</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3374</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4256</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">2646</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">3275</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1692</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2300</dic_ref>\n<dic_ref dr_type=\"heisig\">938</dic_ref>\n<dic_ref dr_type=\"heisig6\">1008</dic_ref>\n<dic_ref dr_type=\"gakken\">889</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1209</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1147</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"8\" m_page=\"0748\">25885</dic_ref>\n<dic_ref dr_type=\"henshall\">900</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1235</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1299</dic_ref>\n<dic_ref dr_type=\"jf_cards\">791</dic_ref>\n<dic_ref dr_type=\"henshall3\">537</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">548</dic_ref>\n<dic_ref dr_type=\"crowley\">482</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">251</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1472</dic_ref>\n<dic_ref dr_type=\"maniette\">947</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-6-4</q_code>\n<q_code qc_type=\"sh_desc\">6f4.1</q_code>\n<q_code qc_type=\"four_corner\">8843.2</q_code>\n<q_code qc_type=\"deroo\">2363</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">xiao4</reading>\n<reading r_type=\"korean_r\">so</reading>\n<reading r_type=\"korean_h\">소</reading>\n<reading r_type=\"vietnam\">Tiếu</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<reading r_type=\"ja_kun\">わら.う</reading>\n<reading r_type=\"ja_kun\">え.む</reading>\n<meaning>laugh</meaning>\n<meaning m_lang=\"fr\">rire</meaning>\n<meaning m_lang=\"es\">risa</meaning>\n<meaning m_lang=\"es\">sonrisa</meaning>\n<meaning m_lang=\"es\">reír</meaning>\n<meaning m_lang=\"es\">sonreír</meaning>\n<meaning m_lang=\"pt\">risada</meaning>\n</rmgroup>\n<nanori>えみ</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 粧 -->\n<character>\n<literal>粧</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">7ca7</cp_value>\n<cp_value cp_type=\"jis208\">30-49</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">119</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>12</stroke_count>\n<freq>1545</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3475</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4400</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1345</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">1703</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">909</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1232</dic_ref>\n<dic_ref dr_type=\"heisig\">923</dic_ref>\n<dic_ref dr_type=\"heisig6\">991</dic_ref>\n<dic_ref dr_type=\"gakken\">1218</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1595</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"8\" m_page=\"0901\">26945</dic_ref>\n<dic_ref dr_type=\"henshall\">1406</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1699</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1815</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1614</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1575</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1284</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1499</dic_ref>\n<dic_ref dr_type=\"maniette\">932</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-6-6</q_code>\n<q_code qc_type=\"sh_desc\">6b6.1</q_code>\n<q_code qc_type=\"four_corner\">9091.4</q_code>\n<q_code qc_type=\"deroo\">1072</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zhuang1</reading>\n<reading r_type=\"korean_r\">jang</reading>\n<reading r_type=\"korean_h\">장</reading>\n<reading r_type=\"vietnam\">Trang</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<meaning>cosmetics</meaning>\n<meaning>adorn (one's person)</meaning>\n<meaning m_lang=\"fr\">cosmétique</meaning>\n<meaning m_lang=\"fr\">se maquiller</meaning>\n<meaning m_lang=\"es\">maquillarse</meaning>\n<meaning m_lang=\"es\">arreglarse</meaning>\n<meaning m_lang=\"es\">embellecerse</meaning>\n<meaning m_lang=\"pt\">cosméticos</meaning>\n<meaning m_lang=\"pt\">enfeitar-se</meaning>\n</rmgroup>\n<nanori>さ</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 紹 -->\n<character>\n<literal>紹</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">7d39</cp_value>\n<cp_value cp_type=\"jis208\">30-50</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">120</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>11</stroke_count>\n<freq>963</freq>\n<jlpt>2</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3516</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4465</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1335</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">1691</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">902</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1222</dic_ref>\n<dic_ref dr_type=\"heisig\">1359</dic_ref>\n<dic_ref dr_type=\"heisig6\">1459</dic_ref>\n<dic_ref dr_type=\"gakken\">938</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1955</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1130</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"8\" m_page=\"1021\">27361</dic_ref>\n<dic_ref dr_type=\"henshall\">1400</dic_ref>\n<dic_ref dr_type=\"sh_kk\">456</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">463</dic_ref>\n<dic_ref dr_type=\"jf_cards\">813</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1473</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">694</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1527</dic_ref>\n<dic_ref dr_type=\"maniette\">1371</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-6-5</q_code>\n<q_code qc_type=\"sh_desc\">6a5.10</q_code>\n<q_code qc_type=\"four_corner\">2796.2</q_code>\n<q_code qc_type=\"deroo\">2777</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">shao4</reading>\n<reading r_type=\"korean_r\">so</reading>\n<reading r_type=\"korean_h\">소</reading>\n<reading r_type=\"vietnam\">Thiệu</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<meaning>introduce</meaning>\n<meaning>inherit</meaning>\n<meaning>help</meaning>\n<meaning m_lang=\"fr\">présentations</meaning>\n<meaning m_lang=\"fr\">introduction</meaning>\n<meaning m_lang=\"fr\">hériter</meaning>\n<meaning m_lang=\"fr\">aider</meaning>\n<meaning m_lang=\"es\">presentar</meaning>\n<meaning m_lang=\"es\">heredar</meaning>\n<meaning m_lang=\"es\">suceder a</meaning>\n<meaning m_lang=\"pt\">Introduzir</meaning>\n<meaning m_lang=\"pt\">herdar</meaning>\n<meaning m_lang=\"pt\">ajudar</meaning>\n</rmgroup>\n<nanori>つぐ</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 肖 -->\n<character>\n<literal>肖</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8096</cp_value>\n<cp_value cp_type=\"jis208\">30-51</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">130</rad_value>\n<rad_value rad_type=\"nelson_c\">42</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>7</stroke_count>\n<freq>1889</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">1360</dic_ref>\n<dic_ref dr_type=\"nelson_n\">4760</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">2205</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">2733</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1399</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1887</dic_ref>\n<dic_ref dr_type=\"heisig\">114</dic_ref>\n<dic_ref dr_type=\"heisig6\">119</dic_ref>\n<dic_ref dr_type=\"gakken\">1712</dic_ref>\n<dic_ref dr_type=\"oneill_names\">451</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1672</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"9\" m_page=\"0252\">29263P</dic_ref>\n<dic_ref dr_type=\"henshall\">1391</dic_ref>\n<dic_ref dr_type=\"sh_kk\">844</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">863</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1665</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1119</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1811</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1012</dic_ref>\n<dic_ref dr_type=\"maniette\">115</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-3-4</q_code>\n<q_code qc_type=\"sh_desc\">3n4.1</q_code>\n<q_code qc_type=\"four_corner\">9022.7</q_code>\n<q_code qc_type=\"deroo\">1046</q_code>\n<q_code qc_type=\"skip\" skip_misclass=\"posn\">3-5-2</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">xiao4</reading>\n<reading r_type=\"pinyin\">xiao1</reading>\n<reading r_type=\"korean_r\">cho</reading>\n<reading r_type=\"korean_r\">so</reading>\n<reading r_type=\"korean_h\">초</reading>\n<reading r_type=\"korean_h\">소</reading>\n<reading r_type=\"vietnam\">Tiếu</reading>\n<reading r_type=\"vietnam\">Tiêu</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<reading r_type=\"ja_kun\">あやか.る</reading>\n<meaning>resemblance</meaning>\n<meaning m_lang=\"fr\">ressemblance</meaning>\n<meaning m_lang=\"fr\">portrait</meaning>\n<meaning m_lang=\"es\">imitar</meaning>\n<meaning m_lang=\"es\">copiar</meaning>\n<meaning m_lang=\"es\">parecido</meaning>\n<meaning m_lang=\"pt\">semelhança</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 菖 -->\n<character>\n<literal>菖</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">83d6</cp_value>\n<cp_value cp_type=\"jis208\">30-52</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">140</rad_value>\n</radical>\n<misc>\n<grade>9</grade>\n<stroke_count>11</stroke_count>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3969</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5085</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">2881</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1487</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2005</dic_ref>\n<dic_ref dr_type=\"heisig\">2366</dic_ref>\n<dic_ref dr_type=\"heisig6\">2452</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1444</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"9\" m_page=\"0701\">31174X</dic_ref>\n<dic_ref dr_type=\"sh_kk\">2220</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-3-8</q_code>\n<q_code qc_type=\"sh_desc\">3k8.22</q_code>\n<q_code qc_type=\"four_corner\">4460.6</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">chang1</reading>\n<reading r_type=\"korean_r\">chang</reading>\n<reading r_type=\"korean_h\">창</reading>\n<reading r_type=\"vietnam\">Xương</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<meaning>iris</meaning>\n<meaning m_lang=\"es\">iris</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 蒋 -->\n<character>\n<literal>蒋</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">848b</cp_value>\n<cp_value cp_type=\"jis208\">30-53</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">140</rad_value>\n</radical>\n<misc>\n<stroke_count>13</stroke_count>\n<variant var_type=\"jis212\">57-22</variant>\n<freq>2251</freq>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">4036</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5132</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">2947</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"9\" m_page=\"0882\">31820X</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-3-10</q_code>\n<q_code qc_type=\"sh_desc\">3k11.5</q_code>\n<q_code qc_type=\"four_corner\">4424.2</q_code>\n<q_code qc_type=\"skip\" skip_misclass=\"stroke_diff\">2-4-10</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">jiang3</reading>\n<reading r_type=\"korean_r\">jang</reading>\n<reading r_type=\"korean_h\">장</reading>\n<reading r_type=\"vietnam\">Tương</reading>\n<reading r_type=\"vietnam\">Tưởng</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<reading r_type=\"ja_on\">ソウ</reading>\n<reading r_type=\"ja_kun\">まこも</reading>\n<reading r_type=\"ja_kun\">はげ.ます</reading>\n<meaning>reed</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 蕉 -->\n<character>\n<literal>蕉</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8549</cp_value>\n<cp_value cp_type=\"jis208\">30-54</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">140</rad_value>\n</radical>\n<misc>\n<grade>9</grade>\n<stroke_count>15</stroke_count>\n<freq>2033</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">4048</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5191</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">2994</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1529</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2087</dic_ref>\n<dic_ref dr_type=\"heisig\">2367</dic_ref>\n<dic_ref dr_type=\"heisig6\">2453</dic_ref>\n<dic_ref dr_type=\"oneill_names\">2372</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"9\" m_page=\"0903\">31937X</dic_ref>\n<dic_ref dr_type=\"sh_kk\">2229</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-3-12</q_code>\n<q_code qc_type=\"sh_desc\">3k12.6</q_code>\n<q_code qc_type=\"four_corner\">4433.1</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">jiao1</reading>\n<reading r_type=\"pinyin\">qiao2</reading>\n<reading r_type=\"korean_r\">cho</reading>\n<reading r_type=\"korean_h\">초</reading>\n<reading r_type=\"vietnam\">Tiêu</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<meaning>banana</meaning>\n<meaning>plantain</meaning>\n<meaning m_lang=\"es\">plátano</meaning>\n<meaning m_lang=\"es\">banana</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 衝 -->\n<character>\n<literal>衝</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">885d</cp_value>\n<cp_value cp_type=\"jis208\">30-55</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">144</rad_value>\n<rad_value rad_type=\"nelson_c\">60</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>15</stroke_count>\n<variant var_type=\"nelson_c\">3316</variant>\n<freq>972</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">1638</dic_ref>\n<dic_ref dr_type=\"nelson_n\">1772</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">725</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">893</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">509</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">658</dic_ref>\n<dic_ref dr_type=\"heisig\">1680</dic_ref>\n<dic_ref dr_type=\"heisig6\">1811</dic_ref>\n<dic_ref dr_type=\"gakken\">918</dic_ref>\n<dic_ref dr_type=\"oneill_names\">2264</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1117</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"10\" m_page=\"0157\">34069</dic_ref>\n<dic_ref dr_type=\"henshall\">1411</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1772</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1904</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1723</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1759</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1388</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1616</dic_ref>\n<dic_ref dr_type=\"maniette\">1696</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-3-12</q_code>\n<q_code qc_type=\"sh_desc\">3i12.1</q_code>\n<q_code qc_type=\"four_corner\">2110.4</q_code>\n<q_code qc_type=\"four_corner\">2122.1</q_code>\n<q_code qc_type=\"deroo\">2053</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">chong1</reading>\n<reading r_type=\"pinyin\">chong4</reading>\n<reading r_type=\"korean_r\">chung</reading>\n<reading r_type=\"korean_h\">충</reading>\n<reading r_type=\"vietnam\">Xung</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<reading r_type=\"ja_kun\">つ.く</reading>\n<meaning>collide</meaning>\n<meaning>brunt</meaning>\n<meaning>highway</meaning>\n<meaning>opposition (astronomy)</meaning>\n<meaning>thrust</meaning>\n<meaning>pierce</meaning>\n<meaning>stab</meaning>\n<meaning>prick</meaning>\n<meaning m_lang=\"fr\">collision</meaning>\n<meaning m_lang=\"fr\">choc</meaning>\n<meaning m_lang=\"fr\">route principale</meaning>\n<meaning m_lang=\"fr\">opposition (astronomie)</meaning>\n<meaning m_lang=\"fr\">point clé</meaning>\n<meaning m_lang=\"fr\">percer</meaning>\n<meaning m_lang=\"fr\">poignarder</meaning>\n<meaning m_lang=\"fr\">piquer</meaning>\n<meaning m_lang=\"es\">avenida</meaning>\n<meaning m_lang=\"es\">lugar importante</meaning>\n<meaning m_lang=\"es\">punto clave</meaning>\n<meaning m_lang=\"es\">chocar</meaning>\n<meaning m_lang=\"pt\">colidir</meaning>\n<meaning m_lang=\"pt\">o mais forte</meaning>\n<meaning m_lang=\"pt\">rodovia</meaning>\n<meaning m_lang=\"pt\">oposição (astronomia)</meaning>\n<meaning m_lang=\"pt\">atravessar</meaning>\n<meaning m_lang=\"pt\">furar</meaning>\n<meaning m_lang=\"pt\">apunhalar</meaning>\n<meaning m_lang=\"pt\">picar</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 裳 -->\n<character>\n<literal>裳</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">88f3</cp_value>\n<cp_value cp_type=\"jis208\">30-56</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">145</rad_value>\n<rad_value rad_type=\"nelson_c\">42</rad_value>\n</radical>\n<misc>\n<grade>9</grade>\n<stroke_count>14</stroke_count>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">1370</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5472</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">2615</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">3231</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2269</dic_ref>\n<dic_ref dr_type=\"heisig\">800</dic_ref>\n<dic_ref dr_type=\"heisig6\">863</dic_ref>\n<dic_ref dr_type=\"gakken\">1803</dic_ref>\n<dic_ref dr_type=\"oneill_names\">2376</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"10\" m_page=\"0231\">34357</dic_ref>\n<dic_ref dr_type=\"maniette\">808</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">2-5-9</q_code>\n<q_code qc_type=\"sh_desc\">3n11.2</q_code>\n<q_code qc_type=\"four_corner\">9073.2</q_code>\n<q_code qc_type=\"skip\" skip_misclass=\"posn\">2-3-11</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">chang2</reading>\n<reading r_type=\"pinyin\">shang5</reading>\n<reading r_type=\"korean_r\">sang</reading>\n<reading r_type=\"korean_h\">상</reading>\n<reading r_type=\"vietnam\">Thường</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<reading r_type=\"ja_kun\">も</reading>\n<reading r_type=\"ja_kun\">もすそ</reading>\n<meaning>skirt</meaning>\n<meaning m_lang=\"fr\">robe</meaning>\n<meaning m_lang=\"es\">falda</meaning>\n<meaning m_lang=\"es\">ropa</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 訟 -->\n<character>\n<literal>訟</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8a1f</cp_value>\n<cp_value cp_type=\"jis208\">30-57</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">149</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>11</stroke_count>\n<freq>1061</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">4320</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5565</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1472</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">1864</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">988</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1339</dic_ref>\n<dic_ref dr_type=\"heisig\">787</dic_ref>\n<dic_ref dr_type=\"heisig6\">850</dic_ref>\n<dic_ref dr_type=\"gakken\">1675</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1483</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"10\" m_page=\"0401\">35266</dic_ref>\n<dic_ref dr_type=\"henshall\">1401</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1403</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1492</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1742</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1485</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1208</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1665</dic_ref>\n<dic_ref dr_type=\"maniette\">795</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-7-4</q_code>\n<q_code qc_type=\"sh_desc\">7a4.6</q_code>\n<q_code qc_type=\"four_corner\">0863.2</q_code>\n<q_code qc_type=\"deroo\">3071</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">song4</reading>\n<reading r_type=\"korean_r\">song</reading>\n<reading r_type=\"korean_h\">송</reading>\n<reading r_type=\"vietnam\">Tụng</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<meaning>sue</meaning>\n<meaning>accuse</meaning>\n<meaning m_lang=\"fr\">accusation</meaning>\n<meaning m_lang=\"fr\">poursuites</meaning>\n<meaning m_lang=\"es\">declarar</meaning>\n<meaning m_lang=\"es\">pleitear</meaning>\n<meaning m_lang=\"es\">demandar</meaning>\n<meaning m_lang=\"es\">acusar</meaning>\n<meaning m_lang=\"pt\">processar</meaning>\n<meaning m_lang=\"pt\">acusar</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 証 -->\n<character>\n<literal>証</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8a3c</cp_value>\n<cp_value cp_type=\"jis208\">30-58</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">149</rad_value>\n</radical>\n<misc>\n<grade>5</grade>\n<stroke_count>12</stroke_count>\n<variant var_type=\"jis208\">75-90</variant>\n<freq>306</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">4341</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5589</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1506</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">1899</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1010</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1365</dic_ref>\n<dic_ref dr_type=\"heisig\">380</dic_ref>\n<dic_ref dr_type=\"heisig6\">406</dic_ref>\n<dic_ref dr_type=\"gakken\">430</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1660</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">697</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"10\" m_page=\"0423\">35341</dic_ref>\n<dic_ref dr_type=\"henshall\">715</dic_ref>\n<dic_ref dr_type=\"sh_kk\">484</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">493</dic_ref>\n<dic_ref dr_type=\"sakade\">816</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1746</dic_ref>\n<dic_ref dr_type=\"henshall3\">737</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">754</dic_ref>\n<dic_ref dr_type=\"crowley\">448</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">666</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1672</dic_ref>\n<dic_ref dr_type=\"maniette\">386</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-7-5</q_code>\n<q_code qc_type=\"sh_desc\">7a5.5</q_code>\n<q_code qc_type=\"four_corner\">0161.1</q_code>\n<q_code qc_type=\"deroo\">3073</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zheng4</reading>\n<reading r_type=\"korean_r\">jeung</reading>\n<reading r_type=\"korean_h\">증</reading>\n<reading r_type=\"vietnam\">Chứng</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<reading r_type=\"ja_kun\">あかし</reading>\n<meaning>evidence</meaning>\n<meaning>proof</meaning>\n<meaning>certificate</meaning>\n<meaning m_lang=\"fr\">preuve</meaning>\n<meaning m_lang=\"fr\">évidence</meaning>\n<meaning m_lang=\"fr\">certificat</meaning>\n<meaning m_lang=\"es\">evidencia</meaning>\n<meaning m_lang=\"es\">prueba</meaning>\n<meaning m_lang=\"es\">testimonio</meaning>\n<meaning m_lang=\"es\">certificado</meaning>\n<meaning m_lang=\"pt\">evidência</meaning>\n<meaning m_lang=\"pt\">prova</meaning>\n<meaning m_lang=\"pt\">certificado</meaning>\n</rmgroup>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 詔 -->\n<character>\n<literal>詔</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8a54</cp_value>\n<cp_value cp_type=\"jis208\">30-59</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">149</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>12</stroke_count>\n<freq>2239</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">4333</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5581</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1505</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">1900</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1009</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1366</dic_ref>\n<dic_ref dr_type=\"heisig\">342</dic_ref>\n<dic_ref dr_type=\"heisig6\">366</dic_ref>\n<dic_ref dr_type=\"gakken\">2023</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1658</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">1213</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"10\" m_page=\"0429\">35379</dic_ref>\n<dic_ref dr_type=\"henshall\">1407</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1885</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">2055</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1748</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1585</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">1935</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1673</dic_ref>\n<dic_ref dr_type=\"maniette\">348</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-7-5</q_code>\n<q_code qc_type=\"sh_desc\">7a5.10</q_code>\n<q_code qc_type=\"four_corner\">0766.2</q_code>\n<q_code qc_type=\"deroo\">3077</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">zhao4</reading>\n<reading r_type=\"korean_r\">jo</reading>\n<reading r_type=\"korean_h\">조</reading>\n<reading r_type=\"vietnam\">Chiếu</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<reading r_type=\"ja_kun\">みことのり</reading>\n<meaning>imperial edict</meaning>\n<meaning m_lang=\"fr\">décret impérial</meaning>\n<meaning m_lang=\"es\">edicto imperial</meaning>\n<meaning m_lang=\"pt\">decreto imperial</meaning>\n</rmgroup>\n<nanori>さとし</nanori>\n<nanori>のり</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 詳 -->\n<character>\n<literal>詳</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">8a73</cp_value>\n<cp_value cp_type=\"jis208\">30-60</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">149</rad_value>\n</radical>\n<misc>\n<grade>8</grade>\n<stroke_count>13</stroke_count>\n<freq>1178</freq>\n<jlpt>1</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">4357</dic_ref>\n<dic_ref dr_type=\"nelson_n\">5607</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">1526</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">1926</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">1026</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">1386</dic_ref>\n<dic_ref dr_type=\"heisig\">550</dic_ref>\n<dic_ref dr_type=\"heisig6\">589</dic_ref>\n<dic_ref dr_type=\"gakken\">1172</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1927</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">896</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"10\" m_page=\"0456\">35446</dic_ref>\n<dic_ref dr_type=\"henshall\">1409</dic_ref>\n<dic_ref dr_type=\"sh_kk\">1577</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">1683</dic_ref>\n<dic_ref dr_type=\"jf_cards\">1752</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">1667</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">944</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1682</dic_ref>\n<dic_ref dr_type=\"maniette\">556</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">1-7-6</q_code>\n<q_code qc_type=\"sh_desc\">7a6.12</q_code>\n<q_code qc_type=\"four_corner\">0865.1</q_code>\n<q_code qc_type=\"deroo\">3055</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">xiang2</reading>\n<reading r_type=\"korean_r\">sang</reading>\n<reading r_type=\"korean_r\">yang</reading>\n<reading r_type=\"korean_h\">상</reading>\n<reading r_type=\"korean_h\">양</reading>\n<reading r_type=\"vietnam\">Tường</reading>\n<reading r_type=\"ja_on\">ショウ</reading>\n<reading r_type=\"ja_kun\">くわ.しい</reading>\n<reading r_type=\"ja_kun\">つまび.らか</reading>\n<meaning>detailed</meaning>\n<meaning>full</meaning>\n<meaning>minute</meaning>\n<meaning>accurate</meaning>\n<meaning>well-informed</meaning>\n<meaning m_lang=\"fr\">détaillé</meaning>\n<meaning m_lang=\"fr\">complet</meaning>\n<meaning m_lang=\"fr\">précis</meaning>\n<meaning m_lang=\"fr\">bien informé</meaning>\n<meaning m_lang=\"es\">detallado</meaning>\n<meaning m_lang=\"es\">minucioso</meaning>\n<meaning m_lang=\"pt\">detalhado</meaning>\n<meaning m_lang=\"pt\">cheio</meaning>\n<meaning m_lang=\"pt\">bem-informado</meaning>\n<meaning m_lang=\"pt\">preciso</meaning>\n</rmgroup>\n<nanori>よし</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 土 -->\n<character>\n<literal>土</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">571f</cp_value>\n<cp_value cp_type=\"jis208\">37-58</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">32</rad_value>\n</radical>\n<misc>\n<grade>1</grade>\n<stroke_count>3</stroke_count>\n<freq>307</freq>\n<jlpt>4</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">1050</dic_ref>\n<dic_ref dr_type=\"nelson_n\">966</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">3403</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">4211</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">2127</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2875</dic_ref>\n<dic_ref dr_type=\"heisig\">150</dic_ref>\n<dic_ref dr_type=\"heisig6\">161</dic_ref>\n<dic_ref dr_type=\"gakken\">316</dic_ref>\n<dic_ref dr_type=\"oneill_names\">42</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">19</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"3\" m_page=\"0108\">4867</dic_ref>\n<dic_ref dr_type=\"henshall\">60</dic_ref>\n<dic_ref dr_type=\"sh_kk\">24</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">24</dic_ref>\n<dic_ref dr_type=\"sakade\">17</dic_ref>\n<dic_ref dr_type=\"jf_cards\">37</dic_ref>\n<dic_ref dr_type=\"henshall3\">19</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">22</dic_ref>\n<dic_ref dr_type=\"crowley\">360</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">22</dic_ref>\n<dic_ref dr_type=\"busy_people\">1.A</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">347</dic_ref>\n<dic_ref dr_type=\"maniette\">152</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">4-3-2</q_code>\n<q_code qc_type=\"sh_desc\">3b0.1</q_code>\n<q_code qc_type=\"four_corner\">4010.0</q_code>\n<q_code qc_type=\"deroo\">1472</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">tu3</reading>\n<reading r_type=\"korean_r\">to</reading>\n<reading r_type=\"korean_r\">du</reading>\n<reading r_type=\"korean_h\">토</reading>\n<reading r_type=\"korean_h\">두</reading>\n<reading r_type=\"vietnam\">Thổ</reading>\n<reading r_type=\"vietnam\">Độ</reading>\n<reading r_type=\"vietnam\">Đỗ</reading>\n<reading r_type=\"ja_on\">ド</reading>\n<reading r_type=\"ja_on\">ト</reading>\n<reading r_type=\"ja_kun\">つち</reading>\n<meaning>soil</meaning>\n<meaning>earth</meaning>\n<meaning>ground</meaning>\n<meaning>Turkey</meaning>\n<meaning m_lang=\"fr\">sol</meaning>\n<meaning m_lang=\"fr\">terre</meaning>\n<meaning m_lang=\"fr\">terrain</meaning>\n<meaning m_lang=\"fr\">Turquie</meaning>\n<meaning m_lang=\"es\">suelo</meaning>\n<meaning m_lang=\"es\">tierra</meaning>\n<meaning m_lang=\"es\">Turquía</meaning>\n<meaning m_lang=\"pt\">solo</meaning>\n<meaning m_lang=\"pt\">terra</meaning>\n<meaning m_lang=\"pt\">chão</meaning>\n<meaning m_lang=\"pt\">Turquia</meaning>\n</rmgroup>\n<nanori>つ</nanori>\n<nanori>つく</nanori>\n<nanori>は</nanori>\n<nanori>ひじ</nanori>\n</reading_meaning>\n</character>\n<!-- Entry for Kanji: 産 -->\n<character>\n<literal>産</literal>\n<codepoint>\n<cp_value cp_type=\"ucs\">7523</cp_value>\n<cp_value cp_type=\"jis208\">27-26</cp_value>\n</codepoint>\n<radical>\n<rad_value rad_type=\"classical\">100</rad_value>\n<rad_value rad_type=\"nelson_c\">117</rad_value>\n</radical>\n<misc>\n<grade>4</grade>\n<stroke_count>11</stroke_count>\n<freq>161</freq>\n<jlpt>3</jlpt>\n</misc>\n<dic_number>\n<dic_ref dr_type=\"nelson_c\">3354</dic_ref>\n<dic_ref dr_type=\"nelson_n\">3716</dic_ref>\n<dic_ref dr_type=\"halpern_njecd\">3298</dic_ref>\n<dic_ref dr_type=\"halpern_kkd\">4089</dic_ref>\n<dic_ref dr_type=\"halpern_kkld\">2075</dic_ref>\n<dic_ref dr_type=\"halpern_kkld_2ed\">2812</dic_ref>\n<dic_ref dr_type=\"heisig\">1560</dic_ref>\n<dic_ref dr_type=\"heisig6\">1681</dic_ref>\n<dic_ref dr_type=\"gakken\">142</dic_ref>\n<dic_ref dr_type=\"oneill_names\">1520</dic_ref>\n<dic_ref dr_type=\"oneill_kk\">317</dic_ref>\n<dic_ref dr_type=\"moro\" m_vol=\"7\" m_page=\"1041\">21684P</dic_ref>\n<dic_ref dr_type=\"henshall\">491</dic_ref>\n<dic_ref dr_type=\"sh_kk\">278</dic_ref>\n<dic_ref dr_type=\"sh_kk2\">278</dic_ref>\n<dic_ref dr_type=\"sakade\">408</dic_ref>\n<dic_ref dr_type=\"jf_cards\">218</dic_ref>\n<dic_ref dr_type=\"henshall3\">518</dic_ref>\n<dic_ref dr_type=\"tutt_cards\">567</dic_ref>\n<dic_ref dr_type=\"crowley\">92</dic_ref>\n<dic_ref dr_type=\"kanji_in_context\">574</dic_ref>\n<dic_ref dr_type=\"kodansha_compact\">1328</dic_ref>\n<dic_ref dr_type=\"maniette\">1574</dic_ref>\n</dic_number>\n<query_code>\n<q_code qc_type=\"skip\">3-6-5</q_code>\n<q_code qc_type=\"sh_desc\">5b6.4</q_code>\n<q_code qc_type=\"four_corner\">0021.4</q_code>\n<q_code qc_type=\"deroo\">472</q_code>\n<q_code qc_type=\"skip\" skip_misclass=\"posn\">2-2-9</q_code>\n<q_code qc_type=\"skip\" skip_misclass=\"posn\">2-4-7</q_code>\n</query_code>\n<reading_meaning>\n<rmgroup>\n<reading r_type=\"pinyin\">chan3</reading>\n<reading r_type=\"korean_r\">san</reading>\n<reading r_type=\"korean_h\">산</reading>\n<reading r_type=\"vietnam\">Sản</reading>\n<reading r_type=\"vietnam\">Sẵn</reading>\n<reading r_type=\"vietnam\">Sởn</reading>\n<reading r_type=\"ja_on\">サン</reading>\n<reading r_type=\"ja_kun\">う.む</reading>\n<reading r_type=\"ja_kun\">う.まれる</reading>\n<reading r_type=\"ja_kun\">うぶ-</reading>\n<reading r_type=\"ja_kun\">む.す</reading>\n<meaning>products</meaning>\n<meaning>bear</meaning>\n<meaning>give birth</meaning>\n<meaning>yield</meaning>\n<meaning>childbirth</meaning>\n<meaning>native</meaning>\n<meaning>property</meaning>\n<meaning m_lang=\"fr\">production</meaning>\n<meaning m_lang=\"fr\">porter (fruits)</meaning>\n<meaning m_lang=\"fr\">donner naissance</meaning>\n<meaning m_lang=\"fr\">produire</meaning>\n<meaning m_lang=\"fr\">natal</meaning>\n<meaning m_lang=\"fr\">propriété</meaning>\n<meaning m_lang=\"es\">producto</meaning>\n<meaning m_lang=\"es\">producir</meaning>\n<meaning m_lang=\"es\">propiedad</meaning>\n<meaning m_lang=\"es\">dar a luz</meaning>\n<meaning m_lang=\"es\">nacer</meaning>\n<meaning m_lang=\"pt\">produtos</meaning>\n<meaning m_lang=\"pt\">dar a luz</meaning>\n<meaning m_lang=\"pt\">nascer</meaning>\n<meaning m_lang=\"pt\">dar crias</meaning>\n<meaning m_lang=\"pt\">nascimento</meaning>\n<meaning m_lang=\"pt\">nativo</meaning>\n<meaning m_lang=\"pt\">bens</meaning>\n</rmgroup>\n<nanori>もと</nanori>\n</reading_meaning>\n</character>\n\n</kanjidic2>\n"
  },
  {
    "path": "test/logging.json",
    "content": "{\n    \"version\": 1,\n    \"disable_existing_loggers\": false,\n    \"formatters\": {\n        \"simple\": {\n            \"format\": \"%(asctime)s - %(name)s - %(levelname)s - %(message)s\"\n        }\n    },\n    \n    \"handlers\": {\n        \"console\": {\n            \"class\": \"logging.StreamHandler\",\n            \"level\": \"DEBUG\",\n            \"formatter\": \"simple\",\n            \"stream\": \"ext://sys.stdout\"\n        },\n\n        \"file_handler_important\": {\n            \"class\": \"logging.handlers.RotatingFileHandler\",\n            \"level\": \"WARNING\",\n            \"formatter\": \"simple\",\n            \"filename\": \"test/logs/logging_important.log\",\n            \"maxBytes\": 1000000,\n            \"backupCount\": 20,\n            \"encoding\": \"utf8\"\n        },\n\n        \"file_handler_verbose\": {\n            \"class\": \"logging.handlers.RotatingFileHandler\",\n            \"level\": \"DEBUG\",\n            \"formatter\": \"simple\",\n            \"filename\": \"test/logs/logging_details.log\",\n            \"maxBytes\": 1000000,\n            \"backupCount\": 20,\n            \"encoding\": \"utf8\"\n        }\n\n    },\n\n    \"loggers\": {\n        \"__main__\": {\n            \"level\": \"INFO\",\n            \"handlers\": [\"file_handler_verbose\"],\n            \"propagate\": \"no\"\n        }\n        ,\"test\": { \"level\": \"INFO\" }\n        ,\"jamdict.jmdict_sqlite\": { \"level\": \"INFO\" }\n        ,\"puchikarui\": { \"level\": \"ERROR\" }\n    },\n\n    \"root\": {\n        \"level\": \"WARNING\",\n        \"handlers\": [\"console\", \"file_handler_important\"],\n        \"propagate\": \"no\"\n    }\n}\n"
  },
  {
    "path": "test/test_jamdict.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\"\"\"\nScript for testing jamdict library\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport logging\nimport os\nimport unittest\nfrom pathlib import Path\n\nfrom jamdict import Jamdict, JMDictXML\nfrom jamdict import config\nfrom jamdict.jmdict import JMDictXMLParser, JMDEntry\nfrom jamdict.kanjidic2 import Kanjidic2XMLParser\nfrom jamdict.util import _JAMDICT_DATA_AVAILABLE\n\n\nMY_DIR = Path(os.path.abspath(os.path.dirname(__file__)))\nTEST_DATA = MY_DIR / 'data'\nMINI_JMD = TEST_DATA / 'JMdict_mini.xml'\nMINI_KD2 = TEST_DATA / 'kanjidic2_mini.xml'\nMINI_JMNE = TEST_DATA / 'jmendict_mini.xml'\nTEST_DB = TEST_DATA / 'jamdict_test.db'\n\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\ndef all_kana(result, forms=None):\n    if forms is None:\n        forms = set()\n    for e in result.entries:\n        forms.update(f.text for f in e.kana_forms)\n    return forms\n\n\ndef all_kanji(result, forms=None):\n    if forms is None:\n        forms = set()\n    for e in result.entries:\n        forms.update(f.text for f in e.kanji_forms)\n    return forms\n\n\nclass TestConfig(unittest.TestCase):\n\n    def test_config(self):\n        cfg = config.read_config()\n        self.assertIn('KD2_XML', cfg)\n        self.assertTrue(config.get_file('KD2_XML'))\n        getLogger().info(\"jamdict log file location: {}\".format(config._get_config_manager().locate_config()))\n\n\nclass TestModels(unittest.TestCase):\n\n    def test_basic_models(self):\n        parser = JMDictXMLParser()\n        entries = parser.parse_file(MINI_JMD)\n        self.assertEqual(len(entries), 230)  # there are 230 test entries\n        e = entries[0]\n        self.assertEqual(len(e), 1)  # there is only 1 sense\n        self.assertEqual(len(e[0].gloss), 1)  # there is only 1 sense\n        # first sense in entry e to string -> with POS\n        self.assertEqual(str(e[0]), 'repetition mark in katakana ((noun (common) (futsuumeishi)))')\n        self.assertEqual(str(e[0].text()), 'repetition mark in katakana')  # compact is enabled by default\n        self.assertEqual(str(e[0].gloss[0]), 'repetition mark in katakana')\n\n    def test_lookup_result(self):\n        jam = Jamdict(jmd_xml_file=MINI_JMD, kd2_xml_file=MINI_KD2, auto_config=False, auto_expand=False)\n        result = jam.lookup('おみやげ')\n        self.assertTrue(result.entries)\n        self.assertEqual(result.entries[0].kana_forms[0].text, 'おみやげ')\n        # test lookup by ID\n        res = jam.lookup('id#{}'.format(1002490))\n        self.assertTrue(res.entries)\n        self.assertEqual(res.entries[0].kana_forms[0].text, 'おとそ')\n\n\nclass TestJamdictXML(unittest.TestCase):\n\n    @classmethod\n    def setUpClass(cls):\n        if os.path.isfile(TEST_DB):\n            os.unlink(TEST_DB)\n\n    def test_jmdict_xml(self):\n        print(\"Test JMDict - lookup from XML\")\n        parser = JMDictXMLParser()\n        entries = parser.parse_file(MINI_JMD)\n        jmd = JMDictXML(entries)\n        self.assertTrue(jmd.lookup(u'おてんき'))\n\n    def test_jmdict_fields(self):\n        parser = JMDictXMLParser()\n        entries = parser.parse_file(MINI_JMD)\n        jmd = JMDictXML(entries)\n        results = jmd.lookup(u'おてんき')\n        self.assertTrue(results)\n        self.assertIsInstance(results[0], JMDEntry)\n\n    def test_jmdict_json(self):\n        print(\"Test JMDict - XML to JSON\")\n        # Load mini dict data\n        jmd = JMDictXML.from_file(MINI_JMD)\n        e = jmd[10]\n        self.assertIsNotNone(e)\n        self.assertTrue(e.to_dict())\n        self.assertTrue(jmd[-1].to_dict())\n\n    def test_kanjidic2_xml(self):\n        print(\"Test KanjiDic2 XML\")\n        # test module read kanjidic XML\n        parser = Kanjidic2XMLParser()\n        kd2 = parser.parse_file(MINI_KD2)\n        for c in kd2:\n            self.assertIsNotNone(c)\n            for g in c.rm_groups:\n                self.assertIsNotNone(g)\n                self.assertTrue(g.readings)\n                self.assertTrue(g.meanings)\n\n    def test_kanjidic2_json(self):\n        print(\"Test KanjiDic2 XML to JSON\")\n        parser = Kanjidic2XMLParser()\n        kd2 = parser.parse_file(MINI_KD2)\n        for c in kd2:\n            self.assertIsNotNone(c.to_dict())\n\n    def test_jamdict_xml(self):\n        print(\"Test Jamdict search in XML files\")\n        jam = Jamdict(\":memory:\", jmd_xml_file=MINI_JMD,\n                      kd2_xml_file=MINI_KD2,\n                      jmnedict_xml_file=MINI_JMNE, auto_config=True)\n        jam.import_data()\n        result = jam.lookup('おみやげ')\n        self.assertEqual(1, len(result.entries))\n        self.assertEqual(2, len(result.chars))\n        self.assertEqual({c.literal for c in result.chars}, {'土', '産'})\n\n\nclass TestConfig(unittest.TestCase):\n\n    _cfg_dir = TEST_DATA / '.jamdict'\n    _cfg_file = _cfg_dir / 'config.json'\n\n    @classmethod\n    def setUpClass(cls):\n        cls.clean_config_file()\n\n    @classmethod\n    def tearDownClass(cls):\n        cls.clean_config_file()\n\n    @classmethod\n    def clean_config_file(cls):\n        if cls._cfg_file.exists():\n            cls._cfg_file.unlink()\n        if cls._cfg_dir.exists():\n            cls._cfg_dir.rmdir()\n\n    def test_config_file(self):\n        # if configuration file doesn't exist\n        conf = config.read_config(ensure_config=False, force_refresh=True)\n        self.assertIsNotNone(conf)\n        # and force creating config\n        conf = config.read_config(ensure_config=True, force_refresh=True)\n        self.assertIsNotNone(conf)\n\n    def test_ensure_config(self):\n        self.clean_config_file()\n        self.assertFalse(self._cfg_file.is_file())\n        conf = config._ensure_config(self._cfg_file)\n        self.assertTrue(self._cfg_file.is_file())\n\n    def test_home_dir(self):\n        _orig_home = ''\n        if 'JAMDICT_HOME' in os.environ:\n            _orig_home = os.environ['JAMDICT_HOME']\n        # set a new home\n        os.environ['JAMDICT_HOME'] = str(self._cfg_dir)\n        # home_dir exist ...\n        if not self._cfg_dir.is_dir():\n            self._cfg_dir.mkdir(parents=True)\n        self.assertEqual(config.home_dir(), str(self._cfg_dir))\n        # home_dir does not exist ...\n        if self._cfg_dir.is_dir():\n            self.clean_config_file()\n        self.assertEqual(config.home_dir(), \"~/.jamdict\")\n        # no environ\n        del os.environ['JAMDICT_HOME']\n        self.assertEqual(config.home_dir(), \"~/.jamdict\")\n        os.environ['JAMDICT_HOME'] = _orig_home\n\n\nclass TestAPIWarning(unittest.TestCase):\n\n    def test_warn_to_json_deprecated(self):\n        print(\"Test Jamdict search in XML files\")\n        jam = Jamdict(\":memory:\", jmd_xml_file=MINI_JMD,\n                      kd2_xml_file=MINI_KD2,\n                      jmnedict_xml_file=MINI_JMNE)\n        jam.import_data()\n        with self.assertWarns(DeprecationWarning):\n            r = jam.lookup(\"おみやげ\")\n            self.assertTrue(r.to_json())\n        with self.assertWarns(DeprecationWarning):\n            r2 = jam.lookup(\"シェンロン\")\n            self.assertTrue(r2.to_json())\n\n\nclass TestJamdictSQLite(unittest.TestCase):\n\n    @classmethod\n    def tearDownClass(cls):\n        if os.path.isfile(TEST_DB):\n            os.unlink(TEST_DB)\n\n    def test_search_by_pos(self):\n        print(\"Test Jamdict search in XML files\")\n        jam = Jamdict(\":memory:\", jmd_xml_file=MINI_JMD,\n                      kd2_xml_file=MINI_KD2,\n                      jmnedict_xml_file=MINI_JMNE, auto_config=True)\n        jam.import_data()\n        # test get all pos\n        poses = jam.all_pos()\n        expected = {'Godan verb - -aru special class',\n                    \"Godan verb with `ku' ending\",\n                    \"Godan verb with `ru' ending\",\n                    \"Godan verb with `su' ending\",\n                    \"Godan verb with `u' ending\",\n                    'Ichidan verb',\n                    'adjectival nouns or quasi-adjectives (keiyodoshi)',\n                    'adjective (keiyoushi)',\n                    'adverb (fukushi)',\n                    \"adverb taking the `to' particle\",\n                    'auxiliary verb',\n                    'conjunction',\n                    'expressions (phrases, clauses, etc.)',\n                    'interjection (kandoushi)',\n                    'intransitive verb',\n                    'noun (common) (futsuumeishi)',\n                    'noun or participle which takes the aux. verb suru',\n                    'noun or verb acting prenominally',\n                    \"nouns which may take the genitive case particle `no'\",\n                    'pre-noun adjectival (rentaishi)',\n                    'pronoun',\n                    'transitive verb'}\n        self.assertEqual(expected, set(poses))\n        result = jam.lookup('おみやげ', pos=['noun (common) (futsuumeishi)'])\n        self.assertEqual(1, len(result.entries))\n        with self.assertLogs('jamdict.jmdict_sqlite', level=\"WARNING\") as cm:\n            result = jam.lookup('おみやげ', pos='noun (common) (futsuumeishi)')\n            self.assertEqual(1, len(result.entries))\n            warned_pos_as_str = False\n            for line in cm.output:\n                if \"POS filter should be a collection, not a string\" in line:\n                    warned_pos_as_str = True\n                    break\n            self.assertTrue(warned_pos_as_str)\n        result = jam.lookup('おみやげ', pos=['intransitive verb'])\n        self.assertFalse(result.entries)\n        result = jam.lookup('おみやげ', pos=['intransitive verb', 'noun (common) (futsuumeishi)'])\n        self.assertTrue(result.entries)\n\n    def test_search_by_ne_type(self):\n        print(\"Test Jamdict search in XML files\")\n        jam = Jamdict(\":memory:\", jmd_xml_file=MINI_JMD,\n                      kd2_xml_file=MINI_KD2,\n                      jmnedict_xml_file=MINI_JMNE, auto_config=True)\n        jam.import_data()\n        netypes = jam.all_ne_type()\n        expected = ['company', 'fem', 'given', 'organization', 'person', 'place', 'surname', 'unclass']\n        self.assertEqual(expected, netypes)\n        res = jam.lookup(\"place\")\n        actual = set()\n        for n in res.names:\n            actual.update(k.text for k in n.kanji_forms)\n        self.assertIn(\"厦門\", actual)\n        res = jam.lookup(\"company\")\n        actual = set()\n        for n in res.names:\n            actual.update(k.text for k in n.kanji_forms)\n        expected = {'埼銀', 'ＩＫＥＡ'}\n        self.assertTrue(expected.issubset(actual))\n\n    def test_find_all_verbs(self):\n        jam = Jamdict(\":memory:\", jmd_xml_file=MINI_JMD,\n                      kd2_xml_file=MINI_KD2,\n                      jmnedict_xml_file=MINI_JMNE, auto_config=True)\n        jam.import_data()\n        # cannot search for everything\n        self.assertRaises(ValueError, lambda: jam.lookup(\"\"))\n        self.assertRaises(ValueError, lambda: jam.lookup(\"%\"))\n        self.assertRaises(ValueError, lambda: jam.lookup(\"%\", pos=\"\"))\n        res = jam.lookup(\"\", pos=\"pronoun\")\n        actual = all_kana(res)\n        pronouns = {'おい', 'おまい', 'おたく', 'あのひと', 'かしこ', 'あのかた', 'おめえ',\n                    'おまえ', 'おおい', 'おーい', 'あそこ', 'あこ', 'あしこ', 'あすこ'}\n        self.assertTrue(pronouns.issubset(actual))\n        result = jam.lookup(\"%\", pos=[\"intransitive verb\", 'pronoun'])\n        forms = all_kana(result)\n        iverbs = {'いじける', 'イカす', 'うろたえる', 'いかす', 'おっこちる',\n                  'いらっしゃる', 'あぶれる', 'いななく', 'いちゃつく'}\n        self.assertTrue(iverbs.issubset(forms))\n        self.assertTrue(pronouns.issubset(forms))\n\n    @unittest.skipIf(not _JAMDICT_DATA_AVAILABLE, \"Jamdict data is not available. Data test is skipped\")\n    def test_jamdict_data(self):\n        jam = Jamdict()\n        # search verb kaeru\n        res = jam.lookup(\"かえる\", pos=\"transitive verb\")\n        actual = [e.idseq for e in res.entries]\n        self.assertIn(1510650, actual)\n        self.assertIn(1589780, actual)\n        forms = all_kanji(res)\n        expected = {'変える', '代える', '換える', '替える'}\n        self.assertTrue(expected.issubset(forms))\n        # search by noun kaeru\n        res2 = jam.lookup(\"かえる\", pos='noun (common) (futsuumeishi)')\n        actual2 = [e.idseq for e in res2.entries]\n        forms2 = all_kanji(res2)\n        self.assertIn(1577460, actual2)\n        expected2 = {'蛙', '蛤', '蝦'}\n        self.assertTrue(expected2.issubset(forms2))\n        # search both noun and verb\n        res3 = jam.lookup(\"かえる\", pos=['noun (common) (futsuumeishi)', \"transitive verb\"])\n        forms3 = all_kanji(res3)\n        self.assertTrue(expected.issubset(forms3))\n        self.assertTrue(expected2.issubset(forms3))\n\n    def test_jamdict_sqlite_all(self):\n        if os.path.isfile(TEST_DB):\n            os.unlink(TEST_DB)\n        TEST_DB.touch()\n        jam = Jamdict(db_file=TEST_DB,\n                      jmd_xml_file=MINI_JMD, kd2_xml_file=MINI_KD2, jmnedict_xml_file=MINI_JMNE)\n        # Lookup using XML\n        result = jam.jmdict_xml.lookup('おみやげ')\n        getLogger().debug(\"Results: {}\".format(result))\n        # Lookup using SQLite\n        jam.import_data()\n        # test lookup\n        result = jam.lookup('おみやげ')\n        self.assertIsNotNone(result.entries)\n        self.assertEqual(len(result.entries), 1)\n        self.assertEqual(len(result.chars), 2)\n        self.assertEqual({c.literal for c in result.chars}, {'土', '産'})\n        print(\"Test reading DB into RAM\")\n        ram_jam = Jamdict(TEST_DB, memory_mode=True)\n        print(\"1st lookup\")\n        result = ram_jam.lookup('おみやげ')\n        self.assertIsNotNone(result.entries)\n        self.assertEqual(len(result.entries), 1)\n        self.assertEqual(len(result.chars), 2)\n        self.assertEqual({c.literal for c in result.chars}, {'土', '産'})\n        print(\"2nd lookup\")\n        result = ram_jam.lookup('おみやげ')\n        self.assertIsNotNone(result.entries)\n        self.assertEqual(len(result.entries), 1)\n        self.assertEqual(len(result.chars), 2)\n        self.assertEqual({c.literal for c in result.chars}, {'土', '産'})\n        print(\"3rd lookup\")\n        result = ram_jam.lookup('おみやげ')\n        self.assertIsNotNone(result.entries)\n        self.assertEqual(len(result.entries), 1)\n        self.assertEqual(2, len(result.chars))\n        self.assertEqual({c.literal for c in result.chars}, {'土', '産'})\n\n    def test_lookup_iter(self):\n        jam = Jamdict(\":memory:\", jmd_xml_file=MINI_JMD,\n                      kd2_xml_file=MINI_KD2,\n                      jmnedict_xml_file=MINI_JMNE, auto_config=True)\n        jam.import_data()\n        # verify entries\n        res = jam.lookup_iter(\"おこ%\", pos=\"noun (common) (futsuumeishi)\")\n        entries = [e.text() for e in res.entries]\n        expected = ['おこのみやき (お好み焼き) : okonomiyaki/savoury pancake containing meat or seafood and '\n                    'vegetables',\n                    'おこさん (お子さん) : child',\n                    \"おこさま (お子様) : child (someone else's)\"]\n        self.assertEqual(expected, entries)\n        # verify characters\n        res = jam.lookup_iter(\"お土産\")\n        self.assertIsNotNone(res.entries)\n        self.assertIsNotNone(res.chars)\n        self.assertIsNotNone(res.names)\n        # verify characters\n        chars = [repr(c) for c in res.chars]\n        expected = ['土:3:soil,earth,ground,Turkey',\n                    '産:11:products,bear,give birth,yield,childbirth,native,property']\n        self.assertEqual(expected, chars)\n        # verify names\n        res = jam.lookup_iter(\"surname\")\n        names = [n.text() for n in res.names]\n        expected = ['しめたに (〆谷) : Shimetani (surname)',\n                    'しめき (〆木) : Shimeki (surname)',\n                    'しめの (〆野) : Shimeno (surname)']\n        self.assertEqual(expected, names)\n\n\n########################################################################\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "test/test_jmdict_sqlite.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\"\"\"\nTest script for JMDict SQLite\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport os\nimport unittest\nimport logging\nfrom pathlib import Path\n\nfrom chirptext.cli import setup_logging\n\nfrom jamdict import Jamdict\nfrom jamdict import JMDictXML\nfrom jamdict import JMDictSQLite\n\n\n# -------------------------------------------------------------------------------\n# Configuration\n# -------------------------------------------------------------------------------\n\nTEST_DIR = Path(os.path.realpath(__file__)).parent\nTEST_DATA = TEST_DIR / 'data'\nif not TEST_DATA.exists():\n    TEST_DATA.mkdir()\nTEST_DB = TEST_DATA / 'test.db'\nMINI_JMD = TEST_DATA / 'JMdict_mini.xml'\nokashi = 'お菓子'\n\n\nsetup_logging(TEST_DIR / 'logging.json', 'logs')\n\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\n# -------------------------------------------------------------------------------\n# Test cases\n# -------------------------------------------------------------------------------\n\nclass TestJamdictSQLite(unittest.TestCase):\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.db = JMDictSQLite(str(TEST_DB))\n        self.xdb = JMDictXML.from_file(str(MINI_JMD))\n        self.ramdb = JMDictSQLite(\":memory:\")\n\n    @classmethod\n    def setUpClass(cls):\n        if os.path.isfile(TEST_DB):\n            getLogger().info(\"Removing previous database file at {}\".format(TEST_DB))\n            os.unlink(TEST_DB)\n\n    def test_xml2sqlite(self):\n        print(\"Test JMDict: XML to SQLite\")\n        try:\n            self.db.insert_entries(self.xdb)\n        except Exception:\n            getLogger().exception(\"Error happened while inserting entries\")\n            raise\n        entries = self.db.Entry.select()\n        self.assertEqual(len(entries), len(self.xdb))\n        # test select entry by id\n        e = self.db.get_entry(1001710)\n        ejson = e.to_dict()\n        self.assertEqual(ejson['kanji'][0]['text'], 'お菓子')\n        getLogger().debug(e.to_dict())\n\n    def test_import_to_ram(self):\n        print(\"Testing XML to RAM\")\n        noe = len(self.xdb)\n        with self.ramdb.ctx() as ctx:\n            self.ramdb.insert_entries(self.xdb, ctx=ctx)\n            self.assertEqual(len(self.ramdb.Entry.select(ctx=ctx)), noe)\n\n    def test_import_function(self):\n        print(\"Testing JMDict import function\")\n        jd = Jamdict(db_file=\":memory:\", jmd_xml_file=MINI_JMD, auto_config=False, auto_expand=False)\n        jd.import_data()\n\n    def test_search(self):\n        print(\"Test searching JMDict SQLite\")\n        with self.ramdb.ds.open() as ctx:\n            self.ramdb.insert_entries(self.xdb, ctx=ctx)\n            entries = ctx.Entry.select()\n            # Search by kana\n            es = self.ramdb.search('あの', ctx)\n            self.assertEqual(len(es), 2)\n            getLogger().info('あの: {}'.format('|'.join([str(x) for x in es])))\n            # Search by kanji\n            es = self.db.search('%子%', ctx, exact_match=False)\n            self.assertEqual(len(es), 4)\n            getLogger().info('%子%: {}'.format('|'.join([str(x) for x in es])))\n            # search by meaning\n            es = self.db.search('%confections%', ctx, exact_match=False)\n            self.assertTrue(es)\n            getLogger().info('%confections%: {}'.format('|'.join([str(x) for x in es])))\n\n    def test_iter_search(self):\n        with self.ramdb.open() as ctx:\n            self.ramdb.insert_entries(self.xdb, ctx=ctx)\n            forms = set()\n            for e in self.ramdb.search_iter(\"%あの%\", iter_mode=True, ctx=ctx):\n                forms.update(f.text for f in e.kana_forms)\n            expected = {'あのー', 'あのう', 'あの', 'かの', 'あのかた', 'あのひと'}\n            self.assertTrue(expected.issubset(forms))\n\n\n# -------------------------------------------------------------------------------\n# Main\n# -------------------------------------------------------------------------------\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "test/test_jmnedict.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\"\"\"\nTest script for JMendict support\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2020 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport logging\nimport os\nimport unittest\n\nfrom jamdict.jmdict import JMENDICT_TYPE_MAP\nfrom jamdict.jmnedict_sqlite import JMNEDictSQLite\nfrom jamdict.util import JMNEDictXML, JamdictSQLite\n\n# -------------------------------------------------------------------------------\n# Configuration\n# -------------------------------------------------------------------------------\n\nTEST_DIR = os.path.dirname(os.path.realpath(__file__))\nTEST_DATA = os.path.join(TEST_DIR, 'data')\nif not os.path.isdir(TEST_DATA):\n    os.makedirs(TEST_DATA)\nTEST_DB = os.path.join(TEST_DATA, 'jamcha.db')\nMINI_JMNE = os.path.join(TEST_DATA, 'jmendict_mini.xml')\n\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\n# -------------------------------------------------------------------------------\n# Test cases\n# -------------------------------------------------------------------------------\n\nclass TestJMendictModels(unittest.TestCase):\n\n    xdb = JMNEDictXML.from_file(MINI_JMNE)\n    ramdb = JMNEDictSQLite(\":memory:\", auto_expand_path=False)\n    ramdb = JamdictSQLite(\":memory:\", auto_expand_path=False)\n\n    def extract_fields(self):\n        ''' Test JMnedict XML parser '''\n        entries = self.xdb.entries\n        expected_idseqs = ['1657560', '2092920', '2831743', '5000000',\n                           '5000001', '5000002', '5000003', '5000004',\n                           '5000005', '5000006', '5000007', '5000008',\n                           '5000009', '5741686', '5723538', '5741815', '5001644']\n        idseqs = [e.idseq for e in entries]\n        self.assertEqual(expected_idseqs, idseqs)\n\n    def test_ne_type_map(self):\n        ''' Test all name_type* '''\n        expected = {'person', 'organization', 'surname', 'company',\n                    'place', 'fem', 'unclass', 'masc', 'given', 'work',\n                    'product', 'ok', 'station'}\n        actual = set(JMENDICT_TYPE_MAP.keys())\n        self.assertEqual(expected, actual)\n\n    def test_jmne_support(self):\n        ''' Test metadata '''\n        ramdb = JMNEDictSQLite(\":memory:\", auto_expand_path=False)\n        with ramdb.ctx() as ctx:\n            self.ramdb.insert_name_entities(self.xdb, ctx=ctx)\n            m = ctx.meta.select_single('key=?', ('jmnedict.version',))\n            self.assertEqual(m.key, 'jmnedict.version')\n            self.assertEqual(m.value, '1.08')\n\n    def test_xml2ramdb(self):\n        print(\"Testing XML to RAM\")\n        ramdb = JMNEDictSQLite(\":memory:\", auto_expand_path=False)\n        with ramdb.ctx() as ctx:\n            ramdb.insert_name_entities(self.xdb, ctx=ctx)\n            # all entries were inserted\n            expected_idseqs = {int(e.idseq) for e in self.xdb}\n            inserted_idseqs = {e.idseq for e in ramdb.NEEntry.select(ctx=ctx)}\n            getLogger().info(\"Inserted entries: {}\".format(len(inserted_idseqs)))\n            self.assertEqual(expected_idseqs, inserted_idseqs)\n            # make sure that the kanjis are inserted\n            expected_kanjis = set()\n            for e in self.xdb.entries:\n                expected_kanjis.update(k.text for k in e.kanji_forms)\n            kanjis = {k.text for k in ctx.NEKanji.select()}\n            self.assertEqual(expected_kanjis, kanjis)\n            # make sure that the kanas were inserted\n            expected_readings = set()\n            for e in self.xdb.entries:\n                expected_readings.update(k.text for k in e.kana_forms)\n            readings = {k.text for k in ctx.NEKana.select()}\n            self.assertEqual(expected_readings, readings)\n            # make sure that the definitions were inserted\n            expected_glosses = set()\n            for e in self.xdb.entries:\n                for s in e.senses:\n                    expected_glosses.update(g.text for g in s.gloss)\n            glosses = {k.text for k in self.ramdb.NETransGloss.select(ctx=ctx)}\n            self.assertEqual(expected_glosses, glosses)\n            # make sure that the XML entries and the SQLite entries are the same\n            for idseq in inserted_idseqs:\n                ne_xml = self.xdb.lookup(\"id#{}\".format(idseq))[0]\n                ne_xml.idseq = int(ne_xml.idseq)\n                getLogger().debug(ne_xml.to_dict())\n                ne = ramdb.get_ne(idseq, ctx=ctx)\n                getLogger().debug(ne.to_dict())\n                self.assertEqual(ne_xml.to_dict(), ne.to_dict())\n            # test search by idseq\n            shenron = ramdb.search_ne('id#5741815', ctx=ctx)\n            self.assertEqual(len(shenron), 1)\n            self.assertEqual(shenron[0].idseq, 5741815)\n            # test exact search\n            shenron2 = ramdb.search_ne('神龍', ctx=ctx)\n            self.assertEqual(len(shenron2), 1)\n            self.assertEqual(shenron2[0].idseq, 5741815)\n            # test search by kana\n            shenron3 = ramdb.search_ne('シェンロン', ctx=ctx)\n            self.assertEqual(len(shenron3), 1)\n            self.assertEqual(shenron3[0].idseq, 5741815)\n            # test search by definition\n            shenron4 = ramdb.search_ne('%spiritual%', ctx=ctx)\n            self.assertEqual(len(shenron4), 1)\n            self.assertEqual(shenron4[0].idseq, 5741815)\n            # test search by wild card\n            all_shime_names = ramdb.search_ne('しめ%', ctx=ctx)\n            expected_idseqs = [5000001, 5000002, 5000003, 5000004, 5000005, 5000006, 5000007, 5000008, 5000009]\n            actual = [x.idseq for x in all_shime_names]\n            self.assertEqual(expected_idseqs, actual)\n            # test search by name_type\n            all_fems = ramdb.search_ne('person', ctx=ctx)\n            expected_idseqs = [2831743, 5001644]\n            actual = [x.idseq for x in all_fems]\n            self.assertEqual(expected_idseqs, actual)\n\n    def test_query_netype(self):\n        ramdb = JMNEDictSQLite(\":memory:\", auto_expand_path=False)\n        ctx = ramdb.ctx()\n        ramdb.insert_name_entities(self.xdb, ctx=ctx)\n        shenron = ctx.search_ne('id#5741815', ctx=ctx)[0]\n        self.assertTrue(shenron)\n\n\n# -------------------------------------------------------------------------------\n# Main\n# -------------------------------------------------------------------------------\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "test/test_kanjidic2_sqlite.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"\nTest script for Jamcha SQLite\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport os\nimport unittest\nimport logging\n\nfrom jamdict import KanjiDic2SQLite\nfrom jamdict import KanjiDic2XML\n\n\n# -------------------------------------------------------------------------------\n# Configuration\n# -------------------------------------------------------------------------------\n\nTEST_DIR = os.path.dirname(os.path.realpath(__file__))\nTEST_DATA = os.path.join(TEST_DIR, 'data')\nif not os.path.isdir(TEST_DATA):\n    os.makedirs(TEST_DATA)\nTEST_DB = os.path.join(TEST_DATA, 'jamcha.db')\nMINI_KD2 = os.path.join(TEST_DATA, 'kanjidic2_mini.xml')\n\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\n# -------------------------------------------------------------------------------\n# Test cases\n# -------------------------------------------------------------------------------\n\nclass TestJamdictSQLite(unittest.TestCase):\n\n    db = KanjiDic2SQLite(TEST_DB)\n    ramdb = KanjiDic2SQLite(\":memory:\", auto_expand_path=False)\n    xdb = KanjiDic2XML.from_file(MINI_KD2)\n\n    @classmethod\n    def setUpClass(cls):\n        if os.path.isfile(TEST_DB):\n            getLogger().info(\"Removing previous database file at {}\".format(TEST_DB))\n            os.unlink(TEST_DB)\n\n    def test_xml2sqlite(self):\n        print(\"Test KanjiDic2 - XML to SQLite DB in RAM\")\n        getLogger().info(\"Testing using {} test characters\".format(len(self.xdb)))\n        db = self.ramdb\n        with db.ctx() as ctx:\n            fv = self.xdb.kd2.file_version\n            dv = self.xdb.kd2.database_version\n            doc = self.xdb.kd2.date_of_creation\n            db.update_kd2_meta(fv, dv, doc, ctx)\n            metas = ctx.meta.select()\n            getLogger().debug(\"KanjiDic2 meta: {}\".format(metas))\n            for c in self.xdb:\n                db.insert_char(c, ctx)\n                c2 = db.char_by_id(c.ID, ctx)\n                getLogger().debug(\"c-xml\", c.to_dict())\n                getLogger().debug(\"c-sqlite\", c2.to_dict())\n                with self.assertWarns(DeprecationWarning):\n                    self.assertEqual(c.to_json(), c2.to_dict())\n            # test searching\n            # by id\n            c = ctx.char.select_single()\n            c = db.char_by_id(c.ID, ctx=ctx)\n            self.assertIsNotNone(c)\n            self.assertTrue(c.rm_groups[0].readings)\n            self.assertTrue(c.rm_groups[0].meanings)\n            # by literal\n            c = db.get_char('持', ctx=ctx)\n            self.assertEqual(c.literal, '持')\n            self.assertTrue(c.rm_groups[0].readings)\n            self.assertTrue(c.rm_groups[0].meanings)\n\n    def test_reading_order(self):\n        db = self.ramdb\n        with db.ctx() as ctx:\n            fv = self.xdb.kd2.file_version\n            dv = self.xdb.kd2.database_version\n            doc = self.xdb.kd2.date_of_creation\n            db.update_kd2_meta(fv, dv, doc, ctx)\n            metas = ctx.meta.select()\n            getLogger().debug(\"KanjiDic2 meta: {}\".format(metas))\n            for c in self.xdb:\n                db.insert_char(c, ctx)\n            c = db.get_char('持', ctx=ctx)\n            rmg = c.rm_groups[0]\n            self.assertEqual([\"ジ\"], [x.value for x in rmg.on_readings])\n            self.assertEqual(['も.つ', '-も.ち', 'も.てる'], [k.value for k in rmg.kun_readings])\n            self.assertEqual([('chi2', 'pinyin'), ('ji', 'korean_r'), ('지', 'korean_h'), ('Trì', 'vietnam')],\n                             [(x.value, x.r_type) for x in rmg.other_readings])\n            expected = [{'type': 'ja_on', 'value': 'ジ', 'on_type': '', 'r_status': ''},\n                        {'type': 'ja_kun', 'value': 'も.つ', 'on_type': '', 'r_status': ''},\n                        {'type': 'ja_kun', 'value': '-も.ち', 'on_type': '', 'r_status': ''},\n                        {'type': 'ja_kun', 'value': 'も.てる', 'on_type': '', 'r_status': ''},\n                        {'type': 'pinyin', 'value': 'chi2', 'on_type': '', 'r_status': ''},\n                        {'type': 'korean_r', 'value': 'ji', 'on_type': '', 'r_status': ''},\n                        {'type': 'korean_h', 'value': '지', 'on_type': '', 'r_status': ''},\n                        {'type': 'vietnam', 'value': 'Trì', 'on_type': '', 'r_status': ''}]\n            actual = c.rm_groups[0].to_dict()['readings']\n            self.assertEqual(expected, actual)\n\n\n# -------------------------------------------------------------------------------\n# Main\n# -------------------------------------------------------------------------------\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "test/test_krad.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\n\"\"\"\nScript for testing KRad module library\n\nReferences:\n     RADKFILE/KRADFILE\n        This project provides a decomposition of kanji into a number of visual elements\n        or radicals to support software which provides a lookup service using kanji components.\n        https://www.edrdg.org/krad/kradinf.html\n\"\"\"\n\n# This code is a part of jamdict library: https://github.com/neocl/jamdict\n# :copyright: (c) 2016 Le Tuan Anh <tuananh.ke@gmail.com>\n# :license: MIT, see LICENSE for more details.\n\nimport logging\nimport os\nimport unittest\n\nfrom jamdict import config\nfrom jamdict.krad import KRad\n\n########################################################################\n\nMY_DIR = os.path.abspath(os.path.dirname(__file__))\nTEST_DATA = os.path.join(MY_DIR, 'data')\nMINI_JMD = os.path.join(TEST_DATA, 'JMdict_mini.xml')\nMINI_KD2 = os.path.join(TEST_DATA, 'kanjidic2_mini.xml')\nTEST_DB = os.path.join(TEST_DATA, 'jamdict_test.db')\n\n\ndef getLogger():\n    return logging.getLogger(__name__)\n\n\nclass TestConfig(unittest.TestCase):\n\n    def test_config(self):\n        cfg = config.read_config()\n        self.assertIn('KD2_XML', cfg)\n        self.assertTrue(config.get_file('KD2_XML'))\n        getLogger().info(\"jamdict log file location: {}\".format(config._get_config_manager().locate_config()))\n\n\nclass TestModels(unittest.TestCase):\n\n    def test_read_krad(self):\n        krad = KRad()\n        self.assertEqual(krad.krad['㘅'], ['亅', '二', '口', '彳', '金'])\n        self.assertEqual(krad.krad['𪚲'], ['乙', '勹', '月', '田', '亀'])\n        self.assertEqual(krad.radk['龠'], {'籥', '鸙', '龢', '龠', '龡', '籲', '瀹', '龥', '禴', '鑰', '爚', '龣'})\n\n\n########################################################################\n\nif __name__ == \"__main__\":\n    logging.getLogger('jamdict').setLevel(logging.DEBUG)\n    unittest.main()\n"
  },
  {
    "path": "test.sh",
    "content": "#!/bin/bash\n\npython3 -m unittest discover\n"
  }
]