pax_global_header00006660000000000000000000000064124125173560014520gustar00rootroot0000000000000052 comment=71cd8d3ae7d417ff5077205183c976763b69c2cc ibus-table-1.9.1/000077500000000000000000000000001241251735600135575ustar00rootroot00000000000000ibus-table-1.9.1/.gitignore000066400000000000000000000004021241251735600155430ustar00rootroot00000000000000/INSTALL /ABOUT-NLS Makefile Makefile.in /aclocal.m4 /config.guess /config.log /config.rpath /config.status /config.sub /configure /ibus-typing-booster.pc /install-sh /autom4te.cache/ ibus-table.pc ibus-table.spec /missing /py-compile ibus-table-*.tar.gz *~ ibus-table-1.9.1/AUTHORS000066400000000000000000000002741241251735600146320ustar00rootroot00000000000000Original Author(s) YU Yuwei (acevery) Developer(s) Caius "kaio" CHANCE MA Xiaojun Mike FABIAN ibus-table-1.9.1/COPYING000066400000000000000000000635041241251735600146220ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ibus-table-1.9.1/ChangeLog000066400000000000000000006410041241251735600153360ustar00rootroot00000000000000commit 2be3e0cf2d90945df906865673bed0906a9b5755 Author: Mike FABIAN Date: Tue Sep 30 14:15:10 2014 +0200 Release v1.9.1 commit 616c93016c916d05555ad029768addfc12dbf548 Author: Mike FABIAN Date: Tue Sep 30 12:38:18 2014 +0200 Use proper fallback when reading the localized table name Try language and region (“xx_YY”) first, then only language (“xx”). Without this patch, NAME.ru = устаревшая would be ignored, only NAME.ru_RU = устаревшая would be used. commit 79bccdc39c6e233ea5081d011ef102bf2d7ef9ce Author: Mike FABIAN Date: Wed Sep 17 10:21:39 2014 +0200 Show pinyin mode as well in the input mode indicator commit 16e700192695fd75b392939abb34faccf1322639 Author: Mike FABIAN Date: Tue Sep 16 09:57:26 2014 +0200 Release v1.9.0 commit cf541b98b8a2fdb829efcbcd99701fa2e3130c16 Author: Mike FABIAN Date: Tue Sep 9 09:24:31 2014 +0200 Add a Japanese translation file I did not translate many messages, I mostly want that file because I run my desktop in Japanese and want to see whether the translation system is working correctly or not. commit 406685f717f76683dac68c54d7277a5dadd5558c Author: Mike FABIAN Date: Tue Sep 16 08:26:18 2014 +0200 Update Chinese .po files commit 741ab21b5a677604d4e47b3d03cd6345a2f78795 Author: Mike FABIAN Date: Tue Sep 16 08:23:51 2014 +0200 Update German translations commit 461ed20a4fec27b3603cc29323c2be36ce7fdf7d Author: Mike FABIAN Date: Mon Sep 8 14:14:58 2014 +0200 Redesign the property menus, use sub-menus instead of toggles The toogles are very confusing, one cannot easily see to which mode one will switch when a toggle is clicked. When the floating panel is shown, tooltips explain to which mode will switch. But the floating panel is never shown in Gnome3, so this does not help for Gnome3. User feedback also shows that many users are confused whether the currently visible menu entry in case of a toggles shows the state which is currently used or the state one will switch to when that toggle is clicked. For toggles which have more than 2 values, for example the Chinese mode: 0 means to show simplified Chinese only 1 means to show traditional Chinese only 2 means to show all characters but show simplified Chinese first 3 means to show all characters but show traditional Chinese first 4 means to show all characters it is tedious to change from mode 0 to mode 4 for example: Open the menu, click on the toggle, menu closes and one has changed to mode 1. Repeat 3 more times to get to mode 4. The new system to use sub-menus instead of toogles also agrees better with: https://wiki.gnome.org/AllanDay/IMEGuidelines > Avoid mutable menu items (menu items whose label changes after it has > been selected). Instead, consider providing two adjacent menu items > for the commands. Then make the items sensitive or insensitive as the > situation demands. > > Do not use mutable menu items to toggle a two-state setting (for > example, Show and Hide). Use a check box or radio buttons instead. Also included in this commit: - reset() not needed when switching Chinese mode commit 55b7b3b0c490397cd74610052345963f4f9ae982 Author: Mike FABIAN Date: Sun Sep 14 13:32:16 2014 +0200 Release v1.8.11 commit 6bfad0054a7d8fea292557984a985d57f68bc74f Author: Mike FABIAN Date: Tue Sep 9 20:34:21 2014 +0200 Fix typo in variable name self_onechar -> self._onechar This typo caused a Python backtrace when the dconf key /desktop/ibus/engine/table/wubi-jidian86/onechar was not set. commit 5bc44b0b45dfdfa5b0653625f37cd75e2533d927 Author: Mike FABIAN Date: Tue Sep 9 08:47:06 2014 +0200 Fix typo in e-mail address commit 2a0b323d0c052794964f8473c23a399a6743bfc4 Author: Mike FABIAN Date: Thu Sep 4 16:07:38 2014 +0200 Release v1.8.10 commit 2e30813032fe46c6df690a2ba68b38bf1dd3e68c Author: Mike FABIAN Date: Tue Sep 2 10:38:07 2014 +0200 Disable “onechar” (Phrase mode/Single char mode) option for non-CJK databases This option is only useful for Chinese. Some Chinese tables, for example wubi-jidian86 contain not only single Chinese characters but also longer phrases. When one wants to input a certain single character, longer phrases showing up as matches as well may make it more difficult to find the desired single character in the candidate list. I.e. to input single characters it may be sometimes useful to switch to single character mode. For non-Chinese tables, such a single character mode is useless. commit d489802af96db1d5c46cb2295728d475b4a3797f Author: Mike FABIAN Date: Mon Sep 1 16:50:28 2014 +0200 Disable hotkey to switch Chinese mode if database is not Chinese commit bbf7d0f3fcb73cb5ec777cb9fee30991fe3fcd53 Author: Mike FABIAN Date: Mon Sep 1 16:29:41 2014 +0200 Disable auto_commit option for tables which do not have RULES Resolves: rhbz#1135759 - The rusle is broken with "Normal commit mode" See: https://bugzilla.redhat.com/show_bug.cgi?id=1135759 If a table does not have USER_CAN_DEFINE_PHRASE=TRUE and a non-empty RULES, it makes no sense to use “commit to preedit” for that table. Therefore, for such tables, auto_commit should always be True (= “Direct commit mode”) and never False (= “Normal commit mode”). These tables have AUTO_COMMIT = TRUE in their source and this should never be changed by the user. “Normal commit mode”, i.e. committing to preedit makes sense only for tables like wubi-jidian86, wubi-haifeng86, and erbi-qs because only these 3 tables currently have RULES and USER_CAN_DEFINE_PHRASE=TRUE. For such tables, committing to preedit is used to define new user shortcuts semi-automatically. commit 3663711986a93b112a2f537b0c485620fc756106 Author: Mike FABIAN Date: Tue Aug 26 13:39:23 2014 +0200 Release v1.8.9 commit e43591313e619990c87dbfed91de25f1d34ab659 Author: Mike FABIAN Date: Sat Aug 23 14:18:43 2014 +0200 Pass IBus.KEY_KP_Enter to the application if the preedit is empty Resolves: rhbz#1133424 - With the new "rusle" table in ibus-table-cyrillic, Keypad Enter problem See: https://bugzilla.redhat.com/show_bug.cgi?id=1133424 If IBus.KEY_KP_Enter is typed: • if the preëdit is empty, we should always pass the key to the application. *Not* commit an empty string plus os.linesep because that behaves differently in some cases. For example when typing a message in Pidgin it would insert a linefeed into the message instead of sending the message. • if the preëdit is not empty: - when auto_select is true (typical for Russian input methods like “rusle” or “translit”), the pending preëdit should be committed and the IBus.KEY_KP_Enter key passed to the application. For example, when typing “C” with translit, the preëdit contains Ц because it is still possible that a “h” is typed next: C Ц 1000 Ch Ч 1000 CH Ч 1000 When IBus.KEY_KP_Enter is typed in this state, the Ц should be committed and the IBus.KEY_KP_Enter should be passed to the application. With the old code, typing “C” followed by IBus.KEY_KP_Enter inserted a Ц and a linefeed in Pidgin instead of sending the message ending with Ц. - when auto_select is false (typical for Chinese input methods), the typed tabkeys should be committed (not the Chinese characters in the preëdit) and IBus.KEY_KP_Enter should not be passed to the application. commit 48c2b7e9ac1a109b7b1cb77bc665f2a19b6fcbd4 Author: Mike FABIAN Date: Fri Aug 22 21:12:04 2014 +0200 Ignore Shift+Space hotkey to switch fullwidth/halfwidth if the database is not for CJK Resolves: rhbz#1133422 - With the new "rusle" table in ibus-table-cyrillic, Shift-Space does not work See: https://bugzilla.redhat.com/show_bug.cgi?id=1133422 commit 354acbd306780015d4e64219ca5fb6989f991016 Author: Mike FABIAN Date: Tue Aug 26 13:53:35 2014 +0200 Update Chinese .po files commit eb64958cbd55f6ce8288987900ccfd9dfd8c3bea Author: Mike FABIAN Date: Tue Aug 26 13:53:11 2014 +0200 Update German translations commit b9824969683c77278edbc45c9472092b96bf4b58 Author: Mike FABIAN Date: Sat Aug 9 17:47:36 2014 +0200 Move some options into a new tab “Details” commit c4842088ddf21aee02cef5808f3086a854c3ac39 Author: Mike FABIAN Date: Thu Aug 14 15:25:23 2014 +0200 Release v1.8.8 commit 72b75c5d32a9491b06f68d21ed08468d27416717 Author: Mike FABIAN Date: Thu Aug 14 14:37:59 2014 +0200 Disable properties related to fullwidth/halfwidth for non-CJK tables Resolves: rhbz#1128912 - With the new "rusle" table in ibus-table-cyrillic, typing space works strangely See: https://bugzilla.redhat.com/show_bug.cgi?id=1128912 commit 1fb4bffb7cb02962cc2453337a50445e06a236a5 Author: Mike FABIAN Date: Wed Aug 13 20:51:09 2014 +0200 If the database is not CJK, set sensitivity to comboboxes useful only for CJK to OFF commit 074a43e79475135e10ef0096498e48af512b339e Author: Mike FABIAN Date: Wed Aug 13 15:07:23 2014 +0200 Remove “Hide Candidates/Display Candidates” from the properties menu This is almost never changed while using ibus-table, either one keeps it always on or always off. It is changeable in the setup tool, that should be enough. Stuff which is used so rarely unnecessarily clutters the properties menu. commit c9895416e0ecef53c42f4af30c3b2a38eaa1b889 Author: Mike FABIAN Date: Tue Aug 12 19:55:24 2014 +0200 Show keyboard shortcuts also in the property menu entries To make them easier to discover. They are shown in the tooltips of the floating panel already, but Gnome3 does not have the floating panel. Therefore the keyboard shortcuts are not easy to discover when using Gnome3. See also https://bugzilla.redhat.com/show_bug.cgi?id=1128912 commit b8b0d2bcb9b21fc2a92a97758054aca7da16313c Author: Mike FABIAN Date: Mon Aug 11 19:00:23 2014 +0200 Release v1.8.7 commit 67faf246f7137cd901a042cf47f7a016ebf63f98 Author: Mike FABIAN Date: Mon Aug 11 18:40:33 2014 +0200 Use the “notify::text” signal instead of “activate” on GtkEntry widget To make it possible that any change of text in the GtkEntry widgets is applied immediately. The “activate” signal is only emitted when Enter/Return is typed, the “notify::text” signal is emitted on any sort of change in the text. commit e7a014318ba45239dc8f4b9409594d6e39c0c0bd Author: Mike FABIAN Date: Mon Aug 4 10:06:04 2014 +0200 Update Chinese .po files commit 7ded13e317f22cf0c97a2ee48819769c0d9024e9 Author: Mike FABIAN Date: Mon Aug 4 10:04:50 2014 +0200 Update German translation commit 64984f048d2dd578318769ee543265ee74b82947 Author: Mike FABIAN Date: Fri Aug 1 09:41:24 2014 +0200 Move the “Restore all defaults” button into the GtkButtonBox at bottom - Makes the dialog a little bit less tall (helps for small screens) - I want to add another tab for detailed settings, the “Restore all defaults” button restores the defaults for all options in all tabs, therefore it should not be part of a tab. commit 7a2d96a990f812cd62df2cd80abc29a1d78d9cf1 Author: Mike FABIAN Date: Fri Aug 1 09:11:40 2014 +0200 Fix typo in comment commit 85c59eb98465295dba2323aaec131bc5db3f9220 Author: Mike FABIAN Date: Wed Jul 30 09:44:01 2014 +0200 Apply fix for 同 again to Unihan_Variants.txt, it is both simplified *and* traditional Chinese This fix is not yet included in Unicode 7.0.0. It will be included in a future version though. commit edfa725889c6d68dce4eb41408976b83eed21430 Author: Mike FABIAN Date: Wed Jul 30 09:39:55 2014 +0200 Update Unihan_Variants.txt from “2013-02-25 Unicode 6.3.0” to “2014-05-09 Unicode 7.0.0” And regenerate engine/chinese_variants.py. New lines in Unihan_Variants.txt which are relevant for simplified and traditional detection: > U+9FC1 kSimplifiedVariant U+4724 > U+4724 kTraditionalVariant U+9FC1 U+4724 = 䜤 U+9FC1 = 鿁 commit 558aa047be78df18e85e2b58409a9a8f97d46d4f Author: Mike FABIAN Date: Mon Jul 28 21:08:40 2014 +0200 Release v1.8.6 commit 275d514e388afedce1a6c74525f671e6f287b3aa Author: Mike FABIAN Date: Mon Jul 28 21:04:21 2014 +0200 Escape % and _ if they are not intended as wildcards Resolves: rhbz#1123981 - With the new "rusle" table in ibus-table-cyrillic, typing '%' shows ':' in preëdit instead of committing it directly See: https://bugzilla.redhat.com/show_bug.cgi?id=1123981 commit fb4969c2f4ec9e5413322415ebe4b8c109dfe9c4 Author: Mike FABIAN Date: Tue Jul 22 16:41:16 2014 +0200 Require Python >= 3.3 When porting to Python3, I originally kept it working with Python2 as well. But I didn’t test with Python2 for a while and the current code would not work anymore with Python2. It doesn’t seem to make sense to invest effort to keep Python2 compatibility. Better require Python >= 3.3. commit fe79787880f451815efc86b7b9f7c35d6da27782 Author: Mike FABIAN Date: Mon Jul 21 15:38:17 2014 +0200 Release v1.8.5 commit 5a50f3e0e34ae61108cbf886bea2b7bbadc593fb Author: Mike FABIAN Date: Mon Jul 21 15:23:44 2014 +0200 Always write xml output in UTF-8 encoding, not in the encoding of the current locale Resolves: rhbz#1120919 - abrt] ibus-table: main.py:268:main:UnicodeEncodeError: 'ascii' codec can't encode characters in position 1150-1152: ordinal not in range(128) See: https://bugzilla.redhat.com/show_bug.cgi?id=1120919 commit 076063a362953a9fa75d72c97191c6651c0afabd Author: Caius "kaio" Chance Date: Mon Jul 7 16:37:19 2014 +1000 - Release v1.8.4 commit a87efc9f072114c47d9260cd779f923e5fca3c38 Merge: cd83314 e21444f Author: Caius "kaio" Chance Date: Mon Jul 7 16:36:07 2014 +1000 Merge pull request #43 from mike-fabian/tweak-defaults-for-chinese-mode-taken-from-locale Tweak defaults for Chinese mode taken from the locale commit e21444f8ea90661f387ce2e9fb15d1d799162b06 Author: Mike FABIAN Date: Sun Jul 6 07:32:52 2014 +0200 For cangjie* and quick* tables: Use big5 order if the freq from the table is the same In the cangjie5.txt table, all the frequency weights are 1000, for example: su 己 1000 su 已 1000 su  1000 su 㔾 1000 Currently, the Unicode code point is used as a last ditch fallback if all the other sort keys are the same (sort keys are: exact match, user frequency, Chinese variant, system frequency, length of input sequence, input sequence alphabetical, Unicode code point). In case of the above characters matching “su”, the Unicode code points and Big5 code points: 㔾 U+353E Big5 - Big5HKSCS 8BC8 己 U+5DF1 Big5 A476 Big5HKSCS A476 已 U+5DF2 Big5 A477 Big5HKSCS A477  U+E81D Big5 - Big5HKSCS - Sorting via the Unicode code points gives: 尸山 (1/9) 1. 㔾 2. 己 3. 已 4.  ... And sorting first via the Big5 code points and then via the Unicode code points for characters which do not have a Big5 code point gives: 尸山 (1/9) 1. 己 2. 已 3. 㔾 4.  ... This order seems to make more sense for Cangjie because: • https://en.wikipedia.org/wiki/Big5: “The original Big5 character set is sorted first by usage frequency, second by stroke count, lastly by Kangxi radical.” • some other popular operating system also uses Big5 order for Cangjie Therefore, for the cangjie* and quick* tables, this commit introduces another sort key sorting according to the Big5 code point just before sorting the final sort key using the Unicode code point. As the frequency data in the tables (which is currently always 1000 for cangjie5.txt, cangjie3.txt, and cangjie-big.txt) has higher priority, one could still tweak the frequency data in the table if the order is still not perfect for some characters. But it looks like Big5 order is quite reasonable. commit db062f794099e2c57d977c212418ef5506f78e24 Author: Mike FABIAN Date: Fri Jul 4 15:15:26 2014 +0200 Make it possible to use select keys like F1, F2, F3 ... Select keys like F1, F2, F3, ... are necessary for the ipa-x-sampa table which has: VALID_INPUT_CHARS == +!\%&'-./0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~" Therefore, using 1, 2, 3, ... as the select keys for ipa-x-sampa is bad because it makes it impossible to input the following entries of the ipa-x-sampa table: 1 ɨ 0 ### U+0268 LATIN SMALL LETTER I WITH STROKE 2 ø 0 ### U+00F8 LATIN SMALL LETTER O WITH STROKE 3 ɜ 0 ### U+025C LATIN SMALL LETTER REVERSED OPEN E 3\ ɞ 0 ### U+025E LATIN SMALL LETTER CLOSED REVERSED OPEN E 4 ɾ 0 ### U+027E LATIN SMALL LETTER R WITH FISHHOOK 5 ɫ 0 ### U+026B LATIN SMALL LETTER L WITH MIDDLE TILDE 6 ɐ 0 ### U+0250 LATIN SMALL LETTER TURNED A 7 ɤ 0 ### U+0264 LATIN SMALL LETTER RAMS HORN 8 ɵ 0 ### U+0275 LATIN SMALL LETTER BARRED O 9 œ 0 ### U+0153 LATIN SMALL LIGATURE OE _0 ̥ 0 ### U+0325 COMBINING RING BELOW _1 ₁ 0 ### U+2081 SUBSCRIPT ONE _2 ₂ 0 ### U+2082 SUBSCRIPT TWO _3 ₃ 0 ### U+2083 SUBSCRIPT THREE _4 ₄ 0 ### U+2084 SUBSCRIPT FOUR _5 ₅ 0 ### U+2085 SUBSCRIPT FIVE _6 ₆ 0 ### U+2086 SUBSCRIPT SIX Also, use the key codes of the select keys instead of the names of the select keys in the key even processing. One could of course keep using the names and still make using select keys like F1, F2, F3, ... possible. But other similar key lists like self._commit_keys, self._page_up_keys, and self._page_down_keys use key codes, it seems nicer make all these similar key lists use the same data types. commit 04accb2a5f7cf688d8455cadc18f28a8c4d0a2e6 Author: Mike FABIAN Date: Thu Jul 3 11:57:08 2014 +0200 Update NEWS file for ibus-table 1.8.x commit adb107ef2273acc2257226ac0c87ba8d915de421 Author: Mike FABIAN Date: Wed Jul 2 17:26:52 2014 +0200 Fix prompts for array30 table and don’t use prompts in pinyin mode The array 30 table has prompts which are longer than one character. Like this: BEGIN_CHAR_PROMPTS_DEFINITION q 1^ w 2^ e 3^ ... m 7v , 8v . 9v / 0v END_CHAR_PROMPTS_DEFINITION This did not work with my old code. Also, do not use the prompts in pinyin mode. This commit commit c9f6a2bfe833da6f6a3d67546a89e0cefd886d83 Author: Mike FABIAN Date: Wed Jun 4 12:45:19 2014 +0200 Don’t show the prompt characters defined in the table in pinyin mode in the auxiliary text already avoided using the prompts in pinyin mode in the auxiliary text. But prompt characters may also appear in the candidate list to show which characters are needed to complete a candidate (“remaining_tabkeys”) and also in the preëdit when no candidate can be found for the typed characters. Fix this for pinyin mode for these cases as well. commit 4adcd6fe8be21892b856f20948314e9c5ea08cb5 Author: Mike FABIAN Date: Tue Jul 1 18:28:44 2014 +0200 Tweak defaults for Chinese mode taken from the locale - detect also the locale zh_SG as simplified Chinese - if the Chinese variant is detected from the locale, set the Chinese mode to a mode which prefers a variant instead of showing that variant only. I.e., if zh_CN or zh_SG is in the locale, set the Chinese mode to 2 (“Show simplified Chinese first”) instead of 0 (“Show *only* simplified Chinese”). If one wants to show only one variant, one can easily change that later, but as a default it is better not to hide one variant, this seems to confuse some users who have not yet discovered that these options exist (see for example: https://code.google.com/p/ibus/issues/detail?id=1492 and https://code.google.com/p/ibus/issues/detail?id=1670 ) - if no Chinese locale is set (and the Chinese mode is neither set in the table nor in the user settings either), use mode 4 (“Show all Chinese characters”) by default. In this case we don’t really know whether the table is intended for simplified or for traditional Chinese, it makes no sense to just guess simplified Chinese then. commit cd83314cecc5d78fa5545611a8f5a313dc8d044f Merge: b570739 cb4233c Author: Caius "kaio" Chance Date: Fri Jun 27 14:46:43 2014 +1000 Merge pull request #42 from mike-fabian/do-not-add-wildcards-to-string-of-valid-input-chars Don’t add self._single_wildcard_char and self._multi_wildcard_char to se... commit cb4233ca63b4838580ce744cbe4048c9b095cf62 Author: Mike FABIAN Date: Thu Jun 26 15:37:22 2014 +0200 Don’t add self._single_wildcard_char and self._multi_wildcard_char to self._valid_input_chars and self._pinyin_valid_input_chars This is because the wildcard characters can be changed with the setup tool at runtime. If they are added to the string of valid input characters, the old wildcards would need to be removed from that string if the wildcards are changed. But the wildcard character may have been in that list already before it was added as a wildcard character. In that case, only one instance of the old wildcard character should be removed from the string of valid input characters if the wildcard character is changed. Replacing the wildcard characters in the string of valid input characters when they change seems more confusing that not adding them to that string in the first place. Therefore, I do not add the wildcard characters to the string of valid input characters anymore, but that means that when checking whether a character is a valid input character if c in self._valid_input_chars: is not enough anymore, now one needs if c in self._valid_input_chars + self._single_wildcard_char + self._multi_wildcard_char: That seems less confusing than adding the wildcard characters to self._valid_input_chars and replacing them there when they change. commit b570739aec426bebd166fb494d41d5f04cccb1aa Author: Caius "kaio" Chance Date: Wed Jun 25 22:46:53 2014 +1000 Release v1.8.3. commit 9dd5bd9c2f08c39143e3eea0ded8d34ce979bbcb Merge: 7cb2765 80c97fa Author: Caius "kaio" Chance Date: Wed Jun 25 22:23:22 2014 +1000 Merge pull request #41 from mike-fabian/improve-wildcard-support Improve wildcard support commit 80c97fad74ae8be835576be15c5913efed081190 Author: Mike FABIAN Date: Wed Jun 25 11:03:15 2014 +0200 Update Chinese .po files (Only to get the changed strings from the source synced with the .po files, I did neither change nor add any translations). commit 1816bb90295ff0bb44f11f3b85deb3ca5d4484a7 Author: Mike FABIAN Date: Wed Jun 25 11:02:25 2014 +0200 Update German translations commit 95851e5dc6e3491813ac6ea8e3927d608d375a04 Author: Mike FABIAN Date: Mon Jun 23 18:26:32 2014 +0200 Make wildchard characters configurable The options AUTO_WILDCARD, SINGLE_WILDCARD_CHAR, and MULTI_WILDCARD_CHAR are now not only configurable in the table sources but also in the setup tool and via dconf. The default for AUTO_WILDCARD if neither specified in the table source nor in the setup tool nor in dconf is TRUE, this is best for most tables. The defaults for SINGLE_WILDCARD_CHAR and MULTI_WILDCARD_CHAR are the empty strings, this means no wildcards are used. In some table sources default values for SINGLE_WILDCARD_CHAR and MULTI_WILDCARD_CHAR are defined, in most cases these are SINGLE_WILDCARD_CHAR = ? MULTI_WILDCARD_CHAR = * commit 77a1a5a7a683e463538387684dcc37268aab37e5 Author: Mike FABIAN Date: Mon Jun 23 15:24:47 2014 +0200 Insert a special candidate for the wildcard character itself if only a wildcard character has been typed Resolves: rhbz#1110325 - Unable to input question marks in Wubi-jidian See: https://bugzilla.redhat.com/show_bug.cgi?id=1110325 The same problem has been also reported here: https://code.google.com/p/ibus/issues/detail?id=1720 If only a wildcard character has been typed, insert a special candidate at the first position for the wildcard character itself. For example, if “?” is used as a wildcard character and this is the only character typed, add a candidate ('?', '?', 0, 1000000000) in halfwidth mode or a candidate ('?', '?', 0, 1000000000) in fullwidth mode. This is needed to make it possible to input the wildcard characters themselves, if “?” acted only as a wildcard it would be impossible to input a fullwidth question mark. commit 7cb27653cbabc05d393903c6721e0b1fecd7f19c Author: Caius "kaio" Chance Date: Mon Jun 9 13:12:00 2014 +1000 Release v1.8.2. commit a6f9c22dead6992d15b15cd356d86fbfd14ac629 Merge: b07c6ea e18f708 Author: Caius "kaio" Chance Date: Sat Jun 7 23:41:12 2014 +1000 Merge pull request #40 from mike-fabian/better-sorting-in-the-mixed-chinese-modes Better sorting in the mixed chinese modes commit e18f708fd9439e51ee115b578931f624852b53af Author: Mike FABIAN Date: Fri Jun 6 20:43:22 2014 +0200 Better sorting of the lookup table in the mixed Chinese modes In the mixed Chinese modes 2 and 3 (simplified Chinese first and traditional Chinese first), the filtering for simplified and traditional was done as a last step filtering the candidate list already sorted using the sort keys: - exact match? - user frequency - system frequency - length of input sequence - alphabetical order of input sequence - Unicode code point of first character of matched phrase But this simplified and traditional filtering is basically just another sort key. Doing this after the main sorting of the candidate list is inefficient and does not give nice results either. It is better to do all of the sorting in one place. The sort key for the desired Chinese variant (traditional or simplified) should have higher priority than the system frequency but lower priority than the user frequency. If the user selects a certain variant often, it should be preferred in future. An example for the behaviour after this commit is applied: wubi-jidian86.txt contains the following matches for 語 (as a single character): ygkg 語 204000000 It contains the following matches for 语 (as a single character): ygk 语 234000000 ygkg 语 234000000 And the following matches for the input sequence “ygkg”: ygkg 語 204000000 ygkg 语 234000000 ygkg 𢌐 0 ygkg 𣄟 0 ygkg 𩐕 0 After this commit, typing “ygkg” gives the following results in the lookup table (when all user frequencies are 0. For testing this can be achieved by removing the user database): Chinese mode 0, “simplified Chinese only”: ========================================== ygkg (1/4) 1. 语 234000000 0 2. 𢌐 0 0 3. 𣄟 0 0 4. 𩐕 0 0 Chinese mode 1, “traditional Chinese only”: =========================================== ygkg (1/4) 1. 語 204000000 0 2. 𢌐 0 0 3. 𣄟 0 0 4. 𩐕 0 0 Chinese mode 2, “simplified Chinese before traditional”: ======================================================== ygkg (1/5) 1. 语 234000000 0 2. 𢌐 0 0 3. 𣄟 0 0 4. 𩐕 0 0 5. 語 204000000 0 Chinese mode 3, “traditional Chinese before simplified”: ======================================================== ygkg (1/5) 1. 語 204000000 0 2. 𢌐 0 0 3. 𣄟 0 0 4. 𩐕 0 0 5. 语 234000000 0 Chinese mode 4, “All Chinese characters”: ========================================= ygkg (1/5) 1. 语 234000000 0 2. 語 204000000 0 3. 𢌐 0 0 4. 𣄟 0 0 5. 𩐕 0 0 commit b07c6ea38c6e60d82ffb96c0fd9c52103ab5b51b Merge: 9d94221 9c6840b Author: Caius "kaio" Chance Date: Sat Jun 7 01:48:08 2014 +1000 Merge pull request #39 from mike-fabian/do-not-create-useless-indexes Do not create useless indexes commit 9c6840ba52cd2320f4ceb03f7be99b9ae705b9fe Author: Mike FABIAN Date: Fri Jun 6 10:44:30 2014 +0200 Do not create useless indexes Resolves: rhbz#1105465 - Please avoid to create sqlite table index in ibus-table See: https://bugzilla.redhat.com/show_bug.cgi?id=1105465 Most of indexes which were created were not helpful at all because most queries are done using the SQL “LIKE” operator which does not benefit from indexes. And the SELECT statements which do not use “LIKE” are not doing anything where speed is critical. So we could not find a benefit in any of the existing indexes. Benchmarking showed no significant difference between having the indexes or not having them. I changed the functions create_indexes() and drop_indexes() to do nothing, if we ever find that some index is really useful, we can easily add it again. Not creating the indexes saves a lot of space: Sizes with indexes: $ du -h -c /usr/share/ibus-table/tables/*.db 8.6M /usr/share/ibus-table/tables/array30-big.db 3.7M /usr/share/ibus-table/tables/array30.db 3.7M /usr/share/ibus-table/tables/cangjie-big.db 2.1M /usr/share/ibus-table/tables/cangjie3.db 4.7M /usr/share/ibus-table/tables/cangjie5.db 572K /usr/share/ibus-table/tables/cantonese.db 700K /usr/share/ibus-table/tables/cantonhk.db 5.0M /usr/share/ibus-table/tables/cns11643.db 64K /usr/share/ibus-table/tables/compose.db 7.7M /usr/share/ibus-table/tables/easy-big.db 96K /usr/share/ibus-table/tables/emoji-table.db 6.6M /usr/share/ibus-table/tables/erbi-qs.db 3.0M /usr/share/ibus-table/tables/erbi.db 40K /usr/share/ibus-table/tables/ipa-x-sampa.db 640K /usr/share/ibus-table/tables/jyutping.db 60K /usr/share/ibus-table/tables/latex.db 312K /usr/share/ibus-table/tables/mathwriter-ibus.db 812K /usr/share/ibus-table/tables/quick-classic.db 2.0M /usr/share/ibus-table/tables/quick3.db 4.4M /usr/share/ibus-table/tables/quick5.db 40K /usr/share/ibus-table/tables/rustrad.db 5.0M /usr/share/ibus-table/tables/scj6.db 364K /usr/share/ibus-table/tables/stroke5.db 40K /usr/share/ibus-table/tables/thai.db 40K /usr/share/ibus-table/tables/translit-ua.db 40K /usr/share/ibus-table/tables/translit.db 40K /usr/share/ibus-table/tables/viqr.db 1000K /usr/share/ibus-table/tables/wu.db 11M /usr/share/ibus-table/tables/wubi-haifeng86.db 12M /usr/share/ibus-table/tables/wubi-jidian86.db 40K /usr/share/ibus-table/tables/yawerty.db 4.2M /usr/share/ibus-table/tables/yong.db 87M 合計 Sizes without indexes: $ du -h -c /usr/share/ibus-table/tables/*.db 4.6M /usr/share/ibus-table/tables/array30-big.db 2.0M /usr/share/ibus-table/tables/array30.db 1.5M /usr/share/ibus-table/tables/cangjie-big.db 1020K /usr/share/ibus-table/tables/cangjie3.db 2.1M /usr/share/ibus-table/tables/cangjie5.db 236K /usr/share/ibus-table/tables/cantonese.db 292K /usr/share/ibus-table/tables/cantonhk.db 2.1M /usr/share/ibus-table/tables/cns11643.db 32K /usr/share/ibus-table/tables/compose.db 3.2M /usr/share/ibus-table/tables/easy-big.db 48K /usr/share/ibus-table/tables/emoji-table.db 3.2M /usr/share/ibus-table/tables/erbi-qs.db 1.3M /usr/share/ibus-table/tables/erbi.db 24K /usr/share/ibus-table/tables/ipa-x-sampa.db 268K /usr/share/ibus-table/tables/jyutping.db 36K /usr/share/ibus-table/tables/latex.db 152K /usr/share/ibus-table/tables/mathwriter-ibus.db 332K /usr/share/ibus-table/tables/quick-classic.db 980K /usr/share/ibus-table/tables/quick3.db 2.0M /usr/share/ibus-table/tables/quick5.db 24K /usr/share/ibus-table/tables/rustrad.db 2.2M /usr/share/ibus-table/tables/scj6.db 156K /usr/share/ibus-table/tables/stroke5.db 24K /usr/share/ibus-table/tables/thai.db 24K /usr/share/ibus-table/tables/translit-ua.db 24K /usr/share/ibus-table/tables/translit.db 24K /usr/share/ibus-table/tables/viqr.db 424K /usr/share/ibus-table/tables/wu.db 4.8M /usr/share/ibus-table/tables/wubi-haifeng86.db 5.7M /usr/share/ibus-table/tables/wubi-jidian86.db 24K /usr/share/ibus-table/tables/yawerty.db 1.8M /usr/share/ibus-table/tables/yong.db 40M 合計 commit 9d942218061379a17972eaf18987e886ba23291b Author: Caius "kaio" Chance Date: Wed Jun 4 22:28:24 2014 +1000 Release 1.8.1 commit 21448804bd27a77e9385406b2064d762311624a1 Merge: 8ded23b c9f6a2b Author: Caius "kaio" Chance Date: Wed Jun 4 22:19:34 2014 +1000 Merge pull request #38 from mike-fabian/add-support-for-wildcards Add support for wildcards commit c9f6a2bfe833da6f6a3d67546a89e0cefd886d83 Author: Mike FABIAN Date: Wed Jun 4 12:45:19 2014 +0200 Don’t show the prompt characters defined in the table in pinyin mode in the auxiliary text commit 407d96f5e776f3543590fb2b459410892d64611b Author: Mike FABIAN Date: Wed Jun 4 12:29:55 2014 +0200 Add wildcard support also to pinyin mode The wildcards used are the same as for table mode. I.e. if the table defines: MULTI_WILDCARD_CHAR = * SINGLE_WILDCARD_CHAR = ? the same wildcards are used for pinyin as well. The AUTO_WILDCARD in the table is ignored for pinyin mode though, it is always treated as AUTO_WILDCARD = TRUE for pinyin mode, FALSE does not make any sense for pinyin mode. commit 42b68588fbf8a94892f4767f5a0180d987243d31 Author: Mike FABIAN Date: Tue Jun 3 16:43:04 2014 +0200 Add support for wildcards The options AUTO_WILDCARD, MULTI_WILDCARD_CHAR, and SINGLE_WILDCARD_CHAR are now read from the table and used. The defaults are: AUTO_WILDCARD = TRUE MULTI_WILDCARD_CHAR = * SINGLE_WILDCARD_CHAR = ? Now one can use wildcards as in the following example for cangjie5: “cangjie5.txt” contains: sqsf 馬 1000 Now typing something like “s*f” or “s?sf” will match 馬. If AUTO_WILDCARD = TRUE, a multi wildcard character will always be appended to the user input, for example typing “s” will match like “s*”. Until now, ibus-table was always working like that. Now it is possible to set AUTO_WILDCARD = FALSE to avoid that automatic final wildcard and get only exact matches. This is very rarely useful though, take care with that option, in most cases this should be TRUE! commit 8ded23bf3744468f6bf2867912c350e042a2e6dc Merge: 834b1db 58ab974 Author: Caius "kaio" Chance Date: Tue Jun 3 16:57:15 2014 +1000 Merge pull request #37 from mike-fabian/adapt-ibus-table-query-to-the-new-database-format Adapt ibus table query to the new database format commit 58ab974582df90cee45579cf3419034be07ccdb1 Author: Mike FABIAN Date: Mon Jun 2 22:29:02 2014 +0200 Adapt tools/ibus-table-query to work with the new database format commit 834b1db8b481cd82d647f00758c45f7bf95940fd Author: Caius "kaio" Chance Date: Mon Jun 2 22:34:24 2014 +1000 Update version number and authors contacts. commit 78564ac272fa3aca313d383a39073fcfa78375c7 Author: Caius "kaio" Chance Date: Mon Jun 2 22:19:05 2014 +1000 Revert "Merge branch 'master' into 1.7" This reverts commit 109872fdb45dc625906e0039efc0897dd9c64ca5, reversing changes made to 3d8ec4f62c77fd67882ea32075777b9d01c55864. commit 109872fdb45dc625906e0039efc0897dd9c64ca5 Merge: 3d8ec4f a414433 Author: Caius "kaio" Chance Date: Sun Jun 1 22:49:58 2014 +1000 Merge branch 'master' into 1.7 Conflicts: engine/main.py engine/tabsqlitedb.py commit 3d8ec4f62c77fd67882ea32075777b9d01c55864 Merge: 7600acb 063a61a Author: Caius "kaio" Chance Date: Fri May 30 08:46:49 2014 +1000 Merge pull request #36 from mike-fabian/use-unicode-code-point-as-a-last-sort-key Use Unicode code point as a last sort key commit 7600acb8dd81dfe703f3637646e9ed2518dd33b2 Merge: 217b8c5 39e44a2 Author: Caius "kaio" Chance Date: Fri May 30 08:46:09 2014 +1000 Merge pull request #35 from mike-fabian/exact-matches-at-the-top-and-support-prompts-for-cangjie Exact matches at the top and support prompts for cangjie commit 063a61ae9923de14ce880a1a444af81cff22e00e Author: Mike FABIAN Date: Wed May 28 18:38:31 2014 +0200 Add the Unicode code point of the first character of the phrase as a last ditch sort key for the candidates In some cases, where there are several matches for *exactly* the same input sequences *and* the system frequencies are also the same for example bmr 同 1000 bmr 𦚈 1000 in cangjie5.txt, instead of getting the order randomly, use the Unicode code point as a last ditch sort key. Some defined order is better than random. On top of that, this puts characters with code points above the BMP *after* characters with code points in the BMP. Usually this is the right thing to do because the characters from the BMP are usually more common. Should this not be the case and the character above the BMP really is the more common one, the system frequency should be added to reflect this. This does not always help: In cangjie5.txt there are also cases where *exactly* the same input sequences matches different characters which are all in the BMP, for example: bmso 豚 1000 bmso 冢 1000 bmso 䐁 1000 dhe 皮 1000 dhe 板 1000 But sorting the characters in the BMP to the top if all other sort keys are the same is better than nothing. commit 9598e12ef26407edad1241921eb7750b561d9d2e Author: Mike FABIAN Date: Wed May 28 18:18:58 2014 +0200 Fix bug in Unihan_Variants.txt, 同 is both simplified *and* traditional Chinese commit 0d929b3aaaa486383857fd3a1fb085c1b4bd6d67 Author: Mike FABIAN Date: Wed May 28 18:16:28 2014 +0200 Add a test case to make sure 同 is detected as both simplified *and* traditional Chinese commit 93e4781d91e94be3327bf2dae4be4b8859e41bff Author: Mike FABIAN Date: Wed May 28 18:01:29 2014 +0200 Update Unihan_Variants.txt from “2011-08-08 Unicode 6.1.0” to “2013-02-25 Unicode 6.3.0” And regenerate engine/chinese_variants.py. commit cce4212c91a69d76d4dc2af7f4b54e1134fe94c0 Author: Mike FABIAN Date: Wed May 28 17:52:55 2014 +0200 Add __pycache__/ to tools/.gitignore commit 39e44a2e2a98de1546f6ad30453f11ae6d7bcd63 Author: Mike FABIAN Date: Thu May 22 17:50:42 2014 +0200 Support prompt characters Some tables, e.g. cangjie5.txt contain prompt character definitions: BEGIN_CHAR_PROMPTS_DEFINITION a 日 b 月 c 金 ... Read these when creating a database and save it to the database. When typing, show these prompts instead of showing the typed Latin characters in the auxiliary text, the preëdit, or in the candidate list for the remaining keys to type to complete a match. commit 0351a5bb44ba9ab19425fdd783fda67c7d2bbc4e Author: Mike FABIAN Date: Fri May 23 17:13:46 2014 +0200 Don’t create an “ikeys” table The “ikeys” table created in tabsqlitedb.py is apparently never used anywhere. commit f795793bdaa28d06787c334b2acf7e9ad6223501 Author: Mike FABIAN Date: Fri May 23 00:35:28 2014 +0200 Put exact matches always at the top of the candidate list Change the filtering in Chinese mode 2 (All characters with simplified Chinese first) and Chinese mode 3 (All characters with traditional Chinese first) to keep that property of the candidate list. I.e. keep the exact matches on top and the completion matches below and do the Chinese filtering for mode 2 and 3 separately for the exact matches and the completion matches. Sees also https://bugzilla.redhat.com/show_bug.cgi?id=1050753#c2 Bo-Yin Yang> 1. Any character which has that precise key sequence as Bo-Yin Yang> the encoding must be listed ahead of any other Bo-Yin Yang> character. That is, if 同 and U+26688 are the two (and Bo-Yin Yang> the only two) Chinese characters whose encodings are Bo-Yin Yang> "bmr", then input of bmr must list 同 and U+26688 as the Bo-Yin Yang> first two characters in the preedit window for choice of Bo-Yin Yang> characters, no matter how unlikely to appear 同 and might Bo-Yin Yang> be deemed by the data table. That the encoding matches Bo-Yin Yang> the input sequence must outweigh any other factor in the Bo-Yin Yang> AI. commit 409a8d96c2d0a7ec0f902ae25e8c55d829387af8 Author: Mike FABIAN Date: Fri May 23 00:04:10 2014 +0200 Don’t try to call filter_candidates() if it is not necessary commit 60bc283ee7065542f0ac865dc9604d6bf1c4369e Author: Mike FABIAN Date: Fri May 23 00:02:17 2014 +0200 Fix typo in the filtering for chinese mode 3 (All characters with traditional Chinese first) commit 217b8c5055cd51deb4fb139d2e39239ae9be852f Merge: 081f61e 2392853 Author: Caius "kaio" Chance Date: Thu May 22 17:50:24 2014 +1000 Merge pull request #34 from mike-fabian/remove-tabdict-and-other-improvements-and-bugfixes Remove tabdict and other improvements and bugfixes commit 23928535f74e5a5f22ec5d97cf887ff89ac6e53b Author: Mike FABIAN Date: Tue May 13 10:20:40 2014 +0200 Update Chinese .po files (Only to get the changed strings from the source synced with the .po files, I did neither change nor add any translations). commit 7d8c023d2ce029c381259b4ccff88dfdaf027161 Author: Mike FABIAN Date: Tue May 13 08:55:43 2014 +0200 Update German translation commit e55172224a6e44211c32db25e883f23ef9f067a5 Author: Mike FABIAN Date: Tue May 20 20:34:15 2014 +0200 Add a “setup” property Apparently that was planned already, there was a comment which said “Need implementation”. I also think it is a good idea, especially under Gnome3 the setup for the input methods is quite difficult to reach, one has to start the “gnome-control-centre” first, then go to the “region” part, then to the input method, then click on the cogwheel icon. That is quite inconvenient if the setup is used regularly. If one wanted to reduce the number of entries in the properties, I think it would be better to remove other properties which are probably not used all the time and are available in the setup anyway. I guess the properties “Phrase mode/Single character mode”, “Direct commit mode/Normal commit mode” and “Display candidates/Hide candidates” are probably very rarely used and it might be good enough if they are accessible only in the setup tool. commit cec4f3f5f75b1846349eb5a81b81560911a1a177 Author: Mike FABIAN Date: Tue May 20 10:33:17 2014 +0200 Do not check whether the name in “NAME = ...” is a valid gconf key It is not used as a gconf key anyway. We use the basename of the table file as the gconf key, i.e. for /usr/share/ibus-table/tables/wubi-jidian86.db the gconf key is “wubi-jidian86”. The gconf key should be more or less constant, it should not change often. If it changes during an update, the old user settings may be lost. NAME = in the table source is more suitable for display to the user, here one can write a nice, user readable string. In the lastest master of ibus-table-chinese, wubi-jidian86.txt contains: NAME = WuBi-Jidian (JiShuag) 86 NAME.zh_CN = 极点五笔(极爽字库)86 NAME.zh_TW = 極點五筆(極爽字庫)86 NAME.zh_HK = 極點五筆(極爽字庫)86 which made tabcreatedb.py fail because it checked whether NAME is a valid gconf key. But we do not need that check. commit c5ec35f96c176f99a3d54d1acaf72534993ce968 Author: Mike FABIAN Date: Tue May 20 06:35:22 2014 +0200 Remove unused variable commit 55ccd674daaffb2e394748fdea0aa6daad29f0b7 Author: Mike FABIAN Date: Mon May 19 20:59:59 2014 +0200 Add option to the setup tool to show or hide the candidate list Already exists as a property and as a setting in the databases, should be in the setup tool as well. commit 91b22f1238b91df253d48c99131726feaf9c6aa3 Author: Mike FABIAN Date: Mon May 19 17:38:52 2014 +0200 Add tooltips to the widgets in the setup tool commit 196bbba3777475a096e913552be87cd313aab6ca Author: Mike FABIAN Date: Mon May 19 16:42:01 2014 +0200 Don’t try to write attributes into the system database unless the system database is created If the system database already exists, the user usually does not have write permissions there, so do not try to write into the system database in that case. commit 354becc353c42a28612df03a520af4432eef65a2 Author: Mike FABIAN Date: Mon May 19 12:29:33 2014 +0200 If the dconf key “lookuptablepagesize” changes to an invalid value, reset it to a valid value If the user sets the dconf key “lookuptablepagesize” to a value < 1 or > len(self._editor._select_keys), set it to a valid value again in the callback handler for dconf key changes. After this change, if the user tries to move the slider for the lookup table page size in the setup tool to 10 for a table like “stroke5” which has only 9 select keys (SELECT_KEYS = 1,2,3,4,5,6,7,8,9), the dconf key is set to 9 again and the slider moves back to 9. commit 0e97323ea267e81b8139db4074db63f9373acbee Author: Mike FABIAN Date: Sun May 18 22:24:24 2014 +0200 Add an option to the setup tool to restore the defaults from the database Useful if one messes up the input method by choosing weird options and wants to return to sane defaults. commit d7308655d5d293f7bd760a1675ef430d3c1e2ac1 Author: Mike FABIAN Date: Mon May 19 08:26:22 2014 +0200 Add *~ to .gitignore commit e0860a2d8ae1134cfef9227a6ca3fa4ca64a8268 Author: Mike FABIAN Date: Sun May 18 20:15:12 2014 +0200 Make the option in the setup tool to use “space” as a commit or page down key work And some more improvements in the handling of commit and page up/down keys. In future we might want to introduce separate options for commit keys and page up/down keys in the setup tool instead of the option for the space key behaviour. But this commit makes the existing option work which is enough for the moment. commit 57c98a3349282189e8bb23330610e752cc854488 Author: Mike FABIAN Date: Sun May 18 20:13:08 2014 +0200 Remove useless comment commit cce4419f154e3117958da7f1e471c2a9d2314575 Author: Mike FABIAN Date: Sun May 18 07:15:03 2014 +0200 Make the ids of the labels and the comboboxes more consistent in the setup ui If a combobox has id="comboboxfoo", give the label for that combobox id="labelfoo" to make it easier to find which label is used for which combobox when editing the English texts of the labels. commit 3cf6393af76d4d634fc5a5ae4281a21d1123bcc1 Author: Mike FABIAN Date: Sun May 18 06:39:20 2014 +0200 Add “auto_select” option to setup tool This option has a very misleading name. It does not really automatically select anything. When set to “True” does the following things: 1) commit the matched phrase and a line feed instead of the tabkeys and no line feed when Return is typed (apparently Chinese input methods like Wubi want to insert the tabkeys instead of the phrase on Return, this is used as a quick way to insert one Latin word without having to switch to direct input mode or another input method. But for non-Chinese input methods like the Russian “translit”, this makes of course no sense). 2) commit the matched phrase when Tab is typed 3) When committing by typing Space, commit the phrase followed by a “ ” instead of only the phrase. 4) if typing a valid input character has the result that there are no candidates anymore, but there were candidates before typing that character, pop that character from the input again, commit the first of the previous candidates and then reprocess the input character. This is also mainly needed for non-Chinese input methods like the Russian “translit”. The “translit” table contains: sh ш shh щ so typing “sh” matches “ш” and “щ”. The candidate with the shortest key sequence comes first in the lookup table, therefore “sh ш” is shown in the preëdit (The other candidate, “shh щ” comes second in the lookup table and could be selected using arrow-down. But “translit” hides the lookup table by default). Now, when after typing “sh” one types “s”, the key “shs” has no match, so add_input('s') returns “False” and we end up here. We pop the last character “s” which caused the match to fail, commit first of the previous candidates, i.e. “sh ш” and feed the “s” into the key event handler again. Maybe this option should be renamed because the name is really misleading? Maybe even split it in several options, maybe even a separate option for each of 1), 2), 3), and 4)? commit 727736b4a2821ed30d15a091652694e49e7918c2 Author: Mike FABIAN Date: Sat May 17 19:54:59 2014 +0200 Make the setup tool get the default from the database for settings which are not yet set in dconf The setup tool gets the the values for the options to show when it starts up from the following 3 places now: 1) dconf setting for this table 2) database of this table 3) Python dictionary OPTION_DEFAULTS in main.py of setup. So it prefers dconf settings, then the database, and finally the hardcoded values in the setup tool itself. Before this change it did fall back immediately to the hardcoded values OPTION_DEFAULTS if a setting was not yet set in dconf. I.e. it showed exactly the same defaults for all tables. But the defaults in the databases of the tables are usually there for a reason and they should of course be presented to the user before he first changes something in the setup tool. commit f461e78fabc1e58d728bd2d7d5a5cb1d64424463 Author: Mike FABIAN Date: Sat May 17 06:26:45 2014 +0200 Rename self._phrase_table_column_names to phrase_table_column_names It is only used locally when trying to open the user database to check whether the existing user database is incompatible. commit 9878c8da66a0132174bbc2e9c83aec51e012c4a4 Author: Mike FABIAN Date: Fri May 16 22:59:48 2014 +0200 Add a class to cache the ime properties It isn’t really necessary for speed, I removed the original property cache because it barely matters and the original code for the property cache was a bit ugly. But this new code taken from ibus-typing-booster looks quite nice. commit 34a9cd9a5893c4aea08625feed52230f0bce49a7 Author: Mike FABIAN Date: Fri May 16 22:09:32 2014 +0200 Fix typos in a docstring and in an error message commit d7111e64ada3224df4a9315e05f1975777bbacd8 Author: Mike FABIAN Date: Fri May 16 13:53:22 2014 +0200 Fix changing the number of candidates using the setup tool commit cdaa74331fa4ad96ba6b9becdd2db90138840cce Author: Mike FABIAN Date: Fri May 16 11:22:47 2014 +0200 Remove unused code to handle config changes config changes are handled in config_value_changed_cb(), this stuff is not used. commit 236a9349167c095f06c9162f445670da12270461 Author: Mike FABIAN Date: Fri May 16 11:20:07 2014 +0200 Improve coding style in key event handler commit 9527b265b7f4a46c220a9f223108fce93560ec86 Author: Mike FABIAN Date: Fri May 16 11:15:41 2014 +0200 Fix arrow-up and arrow-down keys in Table mode when preëdit is empty In that case, the arrow up and down keys should be passed to the application, for example arrow-up is useful to get the last command in bash. commit 83c1b00deea7e8aa120cea194af0773a5a2f7a13 Author: Mike FABIAN Date: Fri May 16 09:19:54 2014 +0200 Remove commented out line resetting self._editor_onechar in reset() The “onechar” option is even remembered in the config, it makes no sense to reset it in reset(). It was commented out of course already, but better remove it completely there to avoid confusion. commit 64c653cf37cb625764ad3d7b6e32e07aa0b0a707 Author: Mike FABIAN Date: Fri May 16 09:16:36 2014 +0200 Clean up code in do_property_activate commit 8551d2b393aac81a90e3f5078393d24d9bdc651c Author: Mike FABIAN Date: Fri May 16 07:29:30 2014 +0200 Add options to setup for fullwidth and halfwidth mode for direct input mode There are such options for “Table input” already but not for “Direct input”. But even for “Direct input”, when the fullwidth or halfwidth mode is changed using the property menu, the change is saved to the config and remembered, just as for “Table input”. There seems to be no reason for this is kind of “asymmetric” behaviour. So I added these options for “Direct mode” to the setup as well. commit d78936826897f17367d9581f62f90f126af44108 Author: Mike FABIAN Date: Thu May 15 16:52:39 2014 +0200 Improve texts in properties and setup - show “Table mode” ↔ “Pinyin mode” property only when the table really has a pinyin mode. - fix wrong key bindings mentioned in tooltip texts of properties. - improve texts of properties and in the setup tool. commit ed07db95f301c30440974b062624862cca310922 Author: Mike FABIAN Date: Thu May 15 14:25:00 2014 +0200 Fix the combobox in the setup tool to switch between direct input and table input The combobox in the setup tool which was labelled “Language:” and had the values “Chinese” and “English” did not do anything at all. Fix this and improve the names of the label, the options, and the variables to reflect better what it does. commit 7ec547dade8d5cd60ec149b93057a78c0accab3b Author: Mike FABIAN Date: Thu May 15 10:48:51 2014 +0200 Remove unused variable self._pt and unused function tabsqlitedb.get_phrase_table_index() Not needed anymore. After the database redesign, the number of columns does not depend on the table anymore, it is the same for all tables. commit f3c77c8978e2c88dce4b4c162809d8defb62dcfc Author: Mike FABIAN Date: Thu May 15 09:03:43 2014 +0200 Improve the code to recover user data from old, incompatible user databases Recover not only the frequency of phrases which are in the system database but also the frequency of user defined phrases. Code for upgrading from very old databases tested by upgrading from a user database from ibus-table-1.5.0.20140416-1.fc20. commit 39e4f964a427015704a24ae609e39bda39e9d331 Author: Mike FABIAN Date: Wed May 14 22:13:45 2014 +0200 When auto_commit is used and there is only one candidate, commit only when the typed characters match the tabkeys of the candidate completely Much better for non-Chinese tables like “latex”, “ipa-x-sampa”, ... For example, consider that “latex” table contains the following lines matching “\al”: \alpha α \aleph ℵ And the default for the “latex” table is to use auto_commit. That means that with the old code, after typing “\alp”, only the single candidate \alpha α matched and was committed immediately. That is annoying because this makes it necessary to look at the screen. It is easy to remember that “\alpha” means α in LaTeX and if these are commited only when typed completely, one does not have to look at the screen to type α. It is much harder to remember how many characters of \alpha one has to type to get a unique match. Of course committing at “\alp” already saves two key strokes. But even with the new code one can save a few keystrokes if one looks at the screen: Just type “\al”, notice that α is the first candidate, then commit it with space. The new code also avoids the distinction between Chinese/non-Chinese here: In a Chinese table, when len(self._editor._chars_valid) == self._max_key_length *and* there is only one candidate, it follows that the tabkeys for this candidate have been typed completely. That means one can just as well do the same check as for non-Chinese tables, i.e. self._editor._chars_valid == self._editor._candidates[0][0] instead of checking whether the maximum key length is reached. commit 6af47dc416842e3ecabc170c23006ddb215c106e Author: Mike FABIAN Date: Thu Apr 24 18:31:25 2014 +0200 Rewrite update_candidates() - simplify code in update_candidates() - remember both the valid and invalid characters when update_candidates() was last called and return immediately only when *both* are unchanged (Fixes a problem when removing invalid characters with backspace). - simplify add_input() - simplify section to handle valid input characters in key event handler - remove self._tabkeys, it is *always* identical to self._chars_valid commit 33aa9594a8da5022aee256528fcd40ec4e4e0199 Author: Mike FABIAN Date: Wed May 14 09:56:55 2014 +0200 auto_commit_to_preedit() is not needed There is no significant difference between auto_commit_to_preedit() and commit_to_preedit(). The only difference seems to be that auto_commit_to_preedit() tries to commit even when self._chars_valid is empty and even when self._candidates is empty. But in that case it will just fail with an “index out of range” error. To catch this, auto_commit_to_preedit() uses a “try: ... except: ...” instead of checking whether self._candidates is empty like commit_to_preedit() does, that seems to be the only real difference. commit c8eb0e31a375b81f083ae750cbcaf152235299ea Author: Mike FABIAN Date: Tue May 13 19:32:01 2014 +0200 Print some debug output in _table_mode_process_key_event() commit c60350c184622e283d6bfe296eb2db39f09d3a65 Author: Mike FABIAN Date: Tue May 13 19:11:02 2014 +0200 Remove redundant code when processing leading invalid input commit be3be5d02ddd491f16be93e94753064d9321d1c9 Author: Mike FABIAN Date: Tue May 13 17:09:47 2014 +0200 Fix handling of invalid trailing input - Improve documentation of _table_mode_process_key_event() - If invalid input characters came after some valid input characters, the old code committed the valid input and then the invalid character only if the key code of the invalid input was <= 127. Consider for example, for the cns11643 table, the valid input is “0123456789abcdef”. The Chinese character “一” has the table key “14421” in cns11643, it is the first character in that table with a key starting with “1442”. Both “A” and “☺” are invalid input for the cns11643 table. But as “A” has a key code <= 127, it would be committed after committing pending input whereas “☺” which has a key code > 127 would be passed through to the application. Therefore, typing “1442A” would commit “一A” but typing “1442☺” would pass “☹” to the application and keep “1442” in preedit, so the user sees “☺1442”. This makes no sense at all, instead of checking for <= 127, *all* typed keys where “IBus.keyval_to_unicode(key.code)” returns a result should be treated the same way here. Then typing “1442☺” commits “一☺”. - The added lines: if type(keychar) != type(u''): keychar = keychar.decode('UTF-8') are only for Python2 compatibility, they do nothing for Python3. (Maybe I should give up trying to keep Python2 compatibility?) commit 97b51bb779c55026b317ebdd52d4d0f0c24918f5 Author: Mike FABIAN Date: Tue May 13 10:00:50 2014 +0200 Improve wording of the label for the behaviour of the space key And use more consistent upper-case/lower-case spelling commit 614f7b03ea0df3df2781746557c7254441dad59a Author: Mike FABIAN Date: Tue May 13 09:28:32 2014 +0200 Mark 4 strings in the setup UI which should not be translated as untranslatable commit e40c0c9800be7f964bed5c4c72cb82db196a9ce8 Author: Mike FABIAN Date: Tue May 13 08:51:39 2014 +0200 Mark one string translatable and mark two others as untranslatable in main.py It does not make sense to translate "IBus Table %s" and "%s" but "IBus %s Preferences" can be translated. commit 83218dd2d4d07bf3f657ba969e627f233abd1b4a Author: Mike FABIAN Date: Tue May 13 08:47:52 2014 +0200 Improve three labels in the setup tool: “Half/full width:” → “Letter width:” (The combobox already says “Half/Full”, no need to repeat that in the label, better indicate that this is for letters, not for punctuation). “Punctuations:” → “Punctuation width” (“punctuation” is uncountable). “Number:” → “Number of candidates:” commit 075602335e0a1f0216588842a2ef886246e0afbf Author: Mike FABIAN Date: Tue May 13 08:23:58 2014 +0200 Add setup/main.py and setup/ibus-table-preferences.ui to POTFILES.in commit c267d7321b5f77dbaeb6e76e5c82911a498fbb92 Author: Mike FABIAN Date: Tue May 13 07:45:07 2014 +0200 Add names to “Contributors:” section in “About” commit f67e2dbacd77a1a840098ef887414c57401449c8 Author: Mike FABIAN Date: Mon May 12 17:52:48 2014 +0200 Colour invalid characters in preëdit magenta commit 7b16cc73ab02beebb5882058c06cd14ec38940b0 Author: Mike FABIAN Date: Mon May 12 17:35:08 2014 +0200 Improve readability _convert_to_full_width() Use the Unicode characters directly. For example, use u"¥" instead of u"\uffe5" commit d8e9543bac0427c6c079ebda186c28a48d1b7479 Author: Mike FABIAN Date: Mon May 12 16:38:47 2014 +0200 Improve readability in _table_mode_process_key_event() - Try not to use extremely long lines so much - more consistent use of parentheses - No need to check for “and(not self._editor._py_mode)” in “if key.code <32 ...”, pinyin mode does surely not use key codes < 32 either. - document why the Tab key is passed through to the application when auto select is used. Don’t use a very long chain of if ...: ... return True ... return False elif ...: ... <- jumps to the final “return False” here elif ...: ... return True elif ...: ... return True return False rather use if ...: ... return True ... return False if ...: ... return False if ...: ... return True if ...: ... return True return False That makes it easier to see immediately what is returned without always having to remember that there is a final “return False” at the end. commit 47d8ef00794c4bb4c0f2cb7fddcff530c35d8da9 Author: Mike FABIAN Date: Mon May 12 10:43:39 2014 +0200 Simplify code to commit everything in the key event handler There was a function space() which was not only used when committing by typing space but also in other cases. This function was hard too read, had a weird return value and the documentation was wrong. I think the new code is better readable. commit 4e0e598fce01909bf0531ddfb596049d90937c04 Author: Mike FABIAN Date: Mon May 12 05:23:18 2014 +0200 _check_phrase() can be called in commit_string() Makes the code a bit shorter and more readable. commit b9cc9547bed5831c92827c11127cc584675d18a0 Author: Mike FABIAN Date: Mon May 12 05:06:20 2014 +0200 _editor.clear_all_input_and_preedit() not needed here It is called by commit_string() already. commit 32fb67b28cba59a22bbebe550a36b95567a7a0dd Author: Mike FABIAN Date: Sun May 11 20:42:31 2014 +0200 Rename tabengine._ml and editor._max_key_len to tabengine._max_key_length and editor._max_key_length self._ml is not so readable. commit b64be0e575bb1d280c95c420d58166e338169f18 Author: Mike FABIAN Date: Sun May 11 17:39:13 2014 +0200 Remove function documentation which only repeats the function name commit de4d6b60ad1f49521b6aafe5e5d7b4fbc82547a0 Author: Mike FABIAN Date: Sun May 11 17:23:00 2014 +0200 Remove unreachable code in _english_mode_process_key_event() commit a9924b24e713aa4a1193ffb5f04b91c6c803ce9f Author: Mike FABIAN Date: Sun May 11 17:10:37 2014 +0200 Don’t repeat the definitions of cond_letter_translate() and cond_punct_translate() The same functions cond_letter_translate() and cond_punct_translate() are defined both in _english_mode_process_key_event() and _table_mode_process_key_event(). As they are exactly the same, it makes more sense to define these function in one place. commit 44f12df6375df59f6916fa02fec691b6d206fb1e Author: Mike FABIAN Date: Sun May 11 16:43:59 2014 +0200 Rename editor.clear() to editor.clear_all_input_and_preedit() and editor.clear_input() to editor.clear_input_not_committed_to_preedit() Make it more obvious what the different clear...() functions do. Also fix a typo: self._candidate_previous -> self._candidates_previous commit 559a4b399565f847351ef992e0a556a98c4bfefa Author: Mike FABIAN Date: Fri May 9 19:17:03 2014 +0200 rename tabsqlitedb.select_zi() to tabsqlitedb.select_chinese_characters_by_pinyin() commit d9c868670912cefdeffae5af9266d4eb986d3f2e Author: Mike FABIAN Date: Fri May 9 18:49:15 2014 +0200 Rename get_all_input_strings() to get_preedit_tabkeys_complete() To get the strings (= phrases) in the preëdit as parts are complete there are: get_preedit_string_parts() get_preedit_string_complete() For the functions to get the typed key sequences belonging to phrases in the preëdit, there were: get_preedit_tabkeys_parts() get_all_input_strings() which is a bit inconsistent. Better make it get_preedit_tabkeys_parts() get_preedit_tabkeys_complete() then the naming is more symmetric and it also describes better what it actually does (Because if strings in the preëdit have been split, get_preedit_tabkeys_complete() does not necessarily return the exact key sequence the user typed as the key sequences for the split phrases will have been recalculated) commit 889dc948c6211f2ed694e2500703ca926d81dcf6 Author: Mike FABIAN Date: Fri May 9 18:28:12 2014 +0200 Committing with the mouse or by typing Control+Number should not define new abbreviations I avoided defining new abbreviations when committing by typing “space” already, see: commit 56796c39c92697d4fcd233e42ebe8f208f0e1324 Author: Mike FABIAN Date: Wed May 7 14:07:56 2014 +0200 Don’t define new abbreviations automatically For example, the latex table system database contains: \alpha|α|0|0 If one types “\alp” and then selects the candidate “α” from the lookup table, do *not* automatically create (or update) an abbreviated entry \alp|α|0|1 in the user database, instead create (or update) an entry using the full length of the tabkeys: \alpha|α|0|1 Creating shortcuts automatically like this is useful in ibus-typing-booster but it seems useless and confusing in ibus-table. but it didn’t work when committing using Control+Number because the code for Control+Number got the input key sequence *before* committing to preedit and at this point it may not yet be the complete input key sequence of a candidate. During commit to preëdit, the really typed input key sequence is replaced by the input key sequence of the selected candidate, which may be longer. Committing with the mouse inherited this error from the code copied from committing with Control+Number. commit 694aa04ed256fafd13e66accd3a0526e5ed19fc5 Author: Mike FABIAN Date: Fri May 9 17:56:18 2014 +0200 Commit candidate clicked on with the mouse commit d19a2768ec09e5c038db512846678518c98f8daa Author: Mike FABIAN Date: Thu May 8 18:08:07 2014 +0200 Move toggle_tab_py_mode() method from class editor to class tabengine It seems to me it fits better there, because it is nice if it also calls the _refresh_properties() and _update_ui() methods of the class tabengine. commit d977c064a5e21bfc06c4f813d4cfe8a7e103f40f Author: Mike FABIAN Date: Thu May 8 17:46:14 2014 +0200 There is no need to check for differences in pinyin mode before and after commit_string() or editor.clear() commit_string() calls editor.clear() and clear() used to switch off pinyin mode. But we stopped doing that, see: commit 059061e3e76761dca6853610580c9c2549918fbb Author: Mike FABIAN Date: Tue Apr 8 16:34:58 2014 +0200 Don’t switch off pinyin mode in clear() clear() is called in do_focus_out(). And do_focus_out() is called after clicking into the gnome menu to switch to pinyin mode. This makes it almost impossible to enable pinyin mode and keep it when pinyin mode is switched off in clear(). Therefore, there is no need to check whether the pinyin mode has changed after commit_string() or editor.clear() anymore. commit 636aa6604003264cb0e26b77da9c8abb0f67e88b Author: Mike FABIAN Date: Thu May 8 16:43:28 2014 +0200 Show number of candidates and number of current candidate in the auxiliary text commit 64a1fcc13018d19079060dcc04646a08070744d6 Author: Mike FABIAN Date: Thu May 8 16:34:10 2014 +0200 Better variable name _ic -> aux_string in _update_aux() commit 2abd1c56ac3dddb6ff0a2e05595a601f9dba438a Author: Mike FABIAN Date: Thu May 8 16:29:37 2014 +0200 Remove meaningless comment commit 5c14c84d665fa9cd6a0b93ec516f0a18eb47194e Author: Mike FABIAN Date: Thu May 8 16:09:57 2014 +0200 Show the list of possible input key sequences for characters in the preëdit not only for pinyin If there are no input strings at the moment but there are strings committed to preëdit, some information about these may be shown in the auxiliary text. If the last character committed to preëdit was typed by using pinyin mode, a list of possible input sequences how this character could be typed using the current table (e.g. wubi-jidian86) was shown. This way, one can type a character using pinyin, commit it to preëdit and then see which table input key sequences could have been used to type the same character. It doesn’t really make sense to limit this to the last typed character and only if it has been typed using pinyin. Showing these table codes always is better. commit 75483fd33d139a8ccabfbe42b286a09b4e8e2f78 Author: Mike FABIAN Date: Thu May 8 15:01:31 2014 +0200 Do not hide the auxiliary text when there are no candidates, it might contain useful information The auxiliary text may contain useful information even when there are no candidates. For example, when committing a few characters to preëdit to define a user defined phrase, the auxiliary text shows what key sequence will be defined for that phrase. For example, when wubi-jidian86 is used and the phrase “王不各” is commited to preëdit and no further input is currently there, the auxiliary text shows “#: ggtk” Here “ggtk” is the key sequence which will be defined for that phrase, i.e. in future one can type “ggtk” to input “王不各”. The auxiliary text also shows the table keys if the last character committed to preëdit has been typed using pinyin. For example, if one uses wubi-jidian86 and has forgotten the table codes for 你 one can type it using pinyin by switching to pinyin mode (with the menu or the right shift key), type “ni + Shift + 3” to get 你, commit it to preëdit by selecting it with Control+Number in the lookup table, then the wubi-jidian86 table codes for 你 are displayed in the auxiliary text: wq wqi wqiy commit f7430ef738e3a236019a2a8f3a8bea98cb6ebee1 Author: Mike FABIAN Date: Wed May 7 22:44:06 2014 +0200 Use an integer self._cursor_precommit instead of an array self._cursor[] self._cursor[1] is never used anymore after my rewrite of the cursor movement code because I split the strings committed to preëdit already when the cursor is moved and not in add_input() anymore, so there is no need to keep track of a second cursor position. commit 7c6eb47bb0e9db76d1c21433e812f1cc7b0bd5b7 Author: Mike FABIAN Date: Wed May 7 14:07:56 2014 +0200 Don’t define new abbreviations automatically For example, the latex table system database contains: \alpha|α|0|0 If one types “\alp” and then selects the candidate “α” from the lookup table, do *not* automatically create (or update) an abbreviated entry \alp|α|0|1 in the user database, instead create (or update) an entry using the full length of the tabkeys: \alpha|α|0|1 Creating shortcuts automatically like this is useful in ibus-typing-booster but it seems useless and confusing in ibus-table. commit fe807080c31ca0b09ff46aaee6c9575c2e9bb1c9 Author: Mike FABIAN Date: Wed Apr 23 16:03:25 2014 +0200 Fix cursor movements in the strings committed to preëdit Rewrite most of the code for cursor movements in the preëdit because it did not work at all. The old non-working code tried to use wrap around when the cursor reached the ends of the preëdit. I think that is confusing and implemented it without wrap around. When there are strings committed to preëdit and a space is typed while the current input is empty, the preëdit should be committed (this was broken). commit 940e629c2fae386ea0f1532325c6a971b703cdf0 Author: Mike FABIAN Date: Wed May 7 09:29:41 2014 +0200 Remove useless “else:” when committing using space editor.space never returns (False, u' ', ...) so this “else:” part can never be reached. commit 193d2bbd20492e05f29290995aac0fe4ea73ad09 Author: Mike FABIAN Date: Wed May 7 09:26:15 2014 +0200 Remove comments mentioning self.add_string_len() because there is no such function anymore commit b7946d48de07ae6b6cca0d80519130d94b245337 Author: Mike FABIAN Date: Mon May 5 21:27:38 2014 +0200 Fix find_zi_code, it should return a list of possible tabkeys for a phrase The documentation “Check word freq and user_freq” was very misleading. Actually it should return a list of possible tabkeys for a phrase. For example, if “phrase” is “你” and the table is wubi-jidian.86.txt, the result will be ['wq', 'wqi', 'wqiy'] because that table contains the following 3 lines matching that phrase exactly: wq 你 597727619 wqi 你 1490000000 wqiy 你 1490000000 commit b55980f79ab6eb36ece9560b4c04b9bee5a21bce Author: Mike FABIAN Date: Mon May 5 16:30:25 2014 +0200 Add one space between the phrase and the remaining tabkeys in the lookup table Easier to read. commit 49be55f44ceb1d12c9e8d45d17163b0998234eeb Author: Mike FABIAN Date: Mon May 5 16:06:04 2014 +0200 Merge matches from the system database and the user database To avoid duplicates in the candidate list. For example, if we have the result ('aaaa', '工', 551000000, 0) from the system database and ('aaaa', '工', 0, 5) from the user database, these should be merged into one match ('aaaa', '工', 551000000, 5). commit bfe7932dc50f413ae7804e4f923acd08247264ac Author: Mike FABIAN Date: Sun May 4 19:17:36 2014 +0200 Improve documentation of select_key() commit e831737780d3284cfcea41ec5183ffdd38f03746 Author: Mike FABIAN Date: Sun May 4 18:45:17 2014 +0200 Handle start characters correctly Some tables (currently the “latex” table is the only one I know of) have special “start characters”. For example, in the latex table, the start character is “\”, i.e. every key in that table starts with a “\”, if the first character typed is anything else but “\”, no match is possible and therefore the typed character should be directly committed or directly passed to the application without attempting a match in the table. commit 77aee36498f6f17a28193de60b87fc28c33d0dba Author: Mike FABIAN Date: Fri May 2 11:38:39 2014 +0200 Remove self._t_chars self._t_chars seems to be just self._chars_valid + self._chars_invalid (possibly + u''.join(self._u_chars)?? Anyway, there is no need to have yet another variable for the same stuff. It is error prone to correctly keep it in sync with the other variables containing the same information. commit 754175b068c111211d6dad76e990f8e88ad173ec Author: Mike FABIAN Date: Thu May 1 18:59:03 2014 +0200 Rewrite _update_preedit() and get_preedit_strings() Instead of returning a complicated string in get_preedit_strings() and parse it again into parts using regular expressions in _update_preedit(), rather return a tuple of the parts _update_preedit() needs. Rename the function returning these parts from get_preedit_strings() to get_preedit_string_parts() and add a function get_preedit_string_complete() which joins these parts and is used where the distinction of the parts is not necessary. commit ab4bb95fb873febc52aa69cf2ad0f1cbc3c91fc0 Author: Mike FABIAN Date: Wed Apr 30 16:33:02 2014 +0200 over_input() should not clear self._u_chars[] It does this only to cause a weird side effect in get_preedit_strings(). But that is quite nonsensical, get_predit_strings() and _update_preedit() should be rewritten not to depend on this. Clearing only self._u_chars[] but not self._strings[] makes these two arrays have different lengths, but they should always have the same length. if clearing self._u_chars[] is removed from over_input(), over_input() becomes useless as it only calls clear_input() now and it can be removed. commit 2c10c727e2ee3ecfa92afe372f9f3ea424eee740 Author: Mike FABIAN Date: Wed Apr 30 09:26:06 2014 +0200 self._strings and self._u_chars should always have the same length As self._strings and self._u_chars *always* should have the same length, there is no need to check “if self._strings” before self._strings.pop() if self._u_chars is already known to be not empty. Of course the extra check doesn’t hurt, but if self._strings and self._u_chars ever happen to have a different length, I want it to fail and then figure out how this could happen. commit 73b836dd0212aac3dbe1be3d4d6f877e6382acd6 Author: Mike FABIAN Date: Wed Apr 30 09:46:22 2014 +0200 self._caret is never used outside of get_caret(), it should not be a member variable A local variable in get_caret() is enough and makes the code better readable. commit 4ced4cde39213d265b20e45a743069d1f697d55b Author: Mike FABIAN Date: Wed Apr 30 09:21:06 2014 +0200 Remove useless function add_caret() Only used once and it only adds the length of a string to self._caret, I think it is more readable to do that directly. commit d1b2489bbf72092c258ad76d74d23c9d8ba527f5 Author: Mike FABIAN Date: Wed Apr 30 08:43:31 2014 +0200 Remove useless line in pop_input() self._chars_invalid = self._chars_invalid[:-1] does nothing there because it is in the “else:” part of “if self._chars_invalid:”. commit af666b23c45e453bef07b2a2076e8849f0935d85 Author: Mike FABIAN Date: Wed Apr 30 07:46:37 2014 +0200 Improve readability of _update_preedit() and enable colours commit 2d1292994f5a133b5ad4a9a0cad7fb7f27315339 Author: Mike FABIAN Date: Wed Apr 30 07:49:27 2014 +0200 Remove unused function get_input_chars_string() commit 947f550135ab924e7fe722f6d4b68bb1cce523fd Author: Mike FABIAN Date: Tue Apr 29 17:26:34 2014 +0200 Remove arbitrary limit max_length = 64 in editor class commit b8a78e00cb18eb2d948c4865a068537dec18445b Author: Mike FABIAN Date: Tue Apr 29 17:24:47 2014 +0200 Remove useless uses of try: ... except: commit d1b76b3d388a879c543dc875cd4de43719fb27b5 Author: Mike FABIAN Date: Tue Apr 29 16:57:58 2014 +0200 Remove useless “pass” commit 021ed36dccf2c936cef580d376bd303e599237f9 Author: Mike FABIAN Date: Tue Apr 29 15:09:01 2014 +0200 self._u_chars needs to be an array of strings self._u_chars needs to be an array of strings, not a simple string because it needs to hold the key sequences which were used when the phrases in self._strings were automatically committed. commit 6d072baab9f33d2daa4adc8b7437c73cb5d558d2 Author: Mike FABIAN Date: Tue Apr 29 14:53:09 2014 +0200 Add debug information about self._u_chars into the aux strings commit a2f716ca1f238f4f78e90bf5c199e81c48b7a9fb Author: Mike FABIAN Date: Tue Apr 29 14:08:56 2014 +0200 Don’t use “pass” so much after “except:” Better print a backtrack to the debug log. It is better to at least see in the debug log what went wrong. commit 72cbde05efbc3b8c2e5fd847c00a2739fc7970d6 Author: Mike FABIAN Date: Mon Apr 28 15:35:59 2014 +0200 Split _candidates[[],[]] into two arrays _candidates[] and _candidates_previous[] Makes the code more readable. commit 45eb8d275d9dae573cd632e2efdc8e065c9f3fb1 Author: Mike FABIAN Date: Mon Apr 28 13:59:28 2014 +0200 Add comments about the meaning of “auto select” in the source code commit 288a1ccdf2a6b033e4977e1a526f7dfc08c43422 Author: Mike FABIAN Date: Sun Apr 27 06:10:13 2014 +0200 Improve documentation of tabsqlite commit 4600fc5b2c5dd129400650556b5dac7289c3836f Author: Mike FABIAN Date: Sun Apr 27 06:01:25 2014 +0200 Don’t try to open a user database if user_db = None in __init__() of tabsqlitedb If an in-memory user database is wanted, tabsqlitedb now needs to be constructed with user_db=':memory:', user_db=None now really means that no user database at all is needed. No user database is needed for example when creating a system database file or when just listing information about engines with /usr/libexec/ibus-engine-table --xml commit 51ea61a8b8df101019c7fd0e43c427dc69b918f6 Author: Mike FABIAN Date: Sat Apr 26 06:31:09 2014 +0200 Rename phrase_keys_len() to get_possible_tabkeys_lengths() and pkeylens to possible_tabkeys_lengths Also document it a bit and remove a useless try: ... except: commit 1ff41d6bae3ebc9014d17d12320f1c058daf7a3a Author: Mike FABIAN Date: Sat Apr 26 06:29:34 2014 +0200 Make sure the lookup table is hidden if there are no candidates to display commit 99d54e2ddb171f523ddbf73872617b40e05012b0 Author: Mike FABIAN Date: Fri Apr 25 17:46:13 2014 +0200 Improve code readability when writing and reading the ime properties Remove property cache, the performance benefit of this is completely negligible. commit 81ec0d8c8319da908d684ec05443557bc4c0ea8d Author: Mike FABIAN Date: Fri Apr 25 14:05:43 2014 +0200 Simplify get_start_chars() commit 93826f6508231a87eb93c8feba591eee849bd949 Author: Mike FABIAN Date: Fri Apr 25 14:02:43 2014 +0200 Simplify get_select_keys() commit f124f3fbcbdd778a80c99e8dc8ac90f3fc67205e Author: Mike FABIAN Date: Fri Apr 25 11:40:45 2014 +0200 Don’t use self._strings.pop() in pop_input() if self._strings is already empty commit 3d88a387de029616415d19236d2fb9b21894c8a8 Author: Mike FABIAN Date: Thu Apr 24 17:01:10 2014 +0200 Minor code cleanup commit 9b6359328ac0df9a37c32776672c708edc635161 Author: Mike FABIAN Date: Thu Apr 24 16:30:37 2014 +0200 Rename self._chars_valid to self._chars_valid_when_update_candidates_was_last_called Long name, but this makes the purpose of that variable clear. It is used *only* to make update_candidates() return fast when nothing has really changed. If the users input characters have not changed, usually no update_candidates() is necessary, but there are some exceptional cases for example when deleting a candidate from the user database when the candidate list changes while the user input has not changed. In these exceptional cases, an update of the lookup table needs to be forced. commit 1357f7468d9cd0dfa4adde7af623d614c0ae71f7 Author: Mike FABIAN Date: Thu Apr 24 14:03:59 2014 +0200 Fix remove_cand_from_userdb() and rename it to remove_candidate_from_user_database() After the database redesign, tabsqlitedb.remove_phrase() takes named arguments “tabkeys” and “phrase” instead of a complete candidate as an array. Also, instead of deleting a candidate from the user database only if it is user defined and thus not in the system database (candidates which have freq=-1 in the user database are user defined), delete the candidate always, if it is in the user database at all. This way, the user can not only use this function to remove user defined candidates but also to lower the priority of candidates which are already in the system database and have aquired a high priority by being used. Removing these candidates from the user database lowers their priority again. commit f6980e0d4a4c1176a5c4d3a88fcc979eac016b18 Author: Mike FABIAN Date: Thu Apr 24 10:18:29 2014 +0200 Small code readability improvement commit f89ecce98ae919c7f4077632c24c31fa0d216f3d Author: Mike FABIAN Date: Thu Apr 24 09:52:11 2014 +0200 Introduce an environment variable IBUS_TABLE_DEBUG_LEVEL for debugging Currently, if this variable is set to a number > 0, system frequency and user frequency data is shown in the lookup table. commit 79f12fcbbb9969f3b5f152407cafff350b4eb83b Author: Mike FABIAN Date: Thu Apr 24 09:02:59 2014 +0200 Instead of an array self._chars = [u'',u'',u''] use three separate strings Using self._chars_valid, self._chars_invalid, and self._chars_prevalid instead of self._chars[0], self._chars[1], self._chars[2] makes the code more readable because one does not have to remember what the indices 0, 1, 2 mean. commit 45823c5f7e0956d7070190f38236531ee4ddef29 Author: Mike FABIAN Date: Wed Apr 23 17:45:27 2014 +0200 Use strings instead of lists for the input characters typed by the user Makes the code more readable, avoids many complicated statements with join, list, map, ... The only places where it looks slightly less readable with strings is c = a[-1] a = a[:-1] when a is a string instead of c = a.pop() when a is a list. commit cd55dd5f2f0e79e4a5138858bdbab9a7590a6401 Author: Mike FABIAN Date: Thu Apr 24 05:37:45 2014 +0200 Remove unused function get_index() commit 313fee39a613c0d0391e636ea1d53b9cf8565208 Author: Mike FABIAN Date: Wed Apr 23 16:57:49 2014 +0200 Update copyright texts in headers commit 364307af21d3a15ab811acfdf81896ffd9038953 Author: Mike FABIAN Date: Wed Apr 23 17:44:41 2014 +0200 Remove unused functions get_invalid_input_chars() and get_invalid_input_string() commit 4fa966bc0651500bec38061ce4b33e22a15407dd Author: Mike FABIAN Date: Thu Apr 10 11:36:59 2014 +0200 Change the design of the database The old database used columns like id|mlen|clen|m0|m1|m2|m3|m4|category|phrase|freq|user_freq where “m0”, “m1”, “m2”, “m3”, “m4” did hold individual characters of the input string which was therefore limited to a fixed maximum (could be different for each table). In this case the maximum is 5 characters. “mlen” was the length of the input string actually used, for example if the input string was “adlt”, then “mlen = 3”, “m0 = a”, “m1 = d”, “m2 = l”, “m3 = t”, and “m4 = None”. “clen” was the length of the Chinese phrase matching this input string, for example, if “adlt” is the input string for the Chinese phrase “苦力”, then “clen = 2”. “category” was a bitmask indicating whether that Chinese phrase is simplified Chinese, traditional Chinese, used in both variants of Chinese, or is a mixture of simplified and traditional Chinese. Non-Chinese tables lacked that “category” column. I.e. in this example the database row in system database for the old design would have looked like: 345|4|2|a|d|l|t|None|1|苦力|3600000|0 (“345” is an abitrary row-id) The new database now uses only: id|tabkeys|phrase|freq|user_freq “tabkeys” is the combination of “m0” ... “m4”, it is of type TEXT and has no artificial limit (except the limit imposed by sqlite, which is huge). So the row in the above example would look like this in the new database design: 345|adlt|苦力|3600000|0 “mlen” and “clen” have been removed, they just duplicate information, the lengths can be calculated easily when needed. “category” has been removed as well, it can be calculated fast and easy at runtime, there is no need to save this at build time into the system database. Omitting “category” also makes the columns used in Chinese and non-Chinese databases identical, avoiding lots of special cases for Chinese and non-Chinese in the code. commit f973563cf3283a7adcff66c68068c2be3739a8a8 Author: Mike FABIAN Date: Wed Apr 23 16:51:30 2014 +0200 Remove useless “$Id: $” from comments in the file headers This is not used by git, it was only useful for older version control systems. commit 7cbf9e8a773c5d37bcad92f50b2f55d6a480c330 Author: Mike FABIAN Date: Thu Apr 17 09:40:56 2014 +0200 Don’t filter candidates in pinyin mode I may change that again later, but currently the format of the candidate tuples in pinyin mode is different from the format in non-pinyin mode which makes this filtering fail. Therefore, pinyin mode would not work at all at the moment if Chinese mode 2 or 3 is selected. commit 4b392e8c2723c5f20e4d13da5770204c53b9baa6 Author: Mike FABIAN Date: Wed Apr 16 17:07:38 2014 +0200 Simplify pinyin table commit 385e6df95830837cc0338d6bc7de5e32679a20a4 Author: Mike FABIAN Date: Thu Apr 17 13:04:56 2014 +0200 Don’t use try: and except: to decide whether to decode from UTF-8 in get_no_check_chars() commit ff310fb1f07eead2383461b22e6443dc93d78ef0 Author: Mike FABIAN Date: Wed Apr 16 08:49:16 2014 +0200 Simplify goucima database table and remove goucima cache The goucima cache is not really used anyway. Only in tabcreatedb.py db.cache_goucima() is called, but then not used there either. commit f5d77946d7acefdf89bb583036378354015c1071 Author: Mike FABIAN Date: Tue Apr 15 17:29:11 2014 +0200 Remove parse_phrase_to_tabkeys() and simplify parse_phrase() commit 117d2d3e3f68845940b146011b137a6acef7956f Author: Mike FABIAN Date: Tue Apr 1 17:51:16 2014 +0200 Remove tabdict Do not translate the typed characters into integers with tabdict. Use the characters themselves instead. Translating characters to integers doesn’t make anything faster, just more complicated. Even if a translation to integers were desirable, why use a custom table and not the Unicode code points? A custom table always needs to be extended when more characters are allowed as valid input characters. commit 081f61e5dc886dd8c897a9f4a2f5b75b7cb81cd6 Merge: 1347342 3f031f7 Author: Caius "kaio" Chance Date: Wed Apr 16 19:06:33 2014 +1000 Merge pull request #33 from mike-fabian/do-not-fail-when-home-is-not-set Do not fail when home is not set commit 3f031f799256bee9cf93800d7b844310e825fb6f Author: Mike FABIAN Date: Wed Apr 16 09:28:44 2014 +0200 Do not fail when the environment variable HOME is not set Resolves: rhbz#1088138 - [abrt] ibus-table: posixpath.py:83:join:TypeError: unsupported operand type(s) for +=: 'NoneType' and 'str' See: https://bugzilla.redhat.com/show_bug.cgi?id=1088138 commit 5f6cc149803dd876fb773d8653cc30d2424cd25f Author: Mike FABIAN Date: Tue Apr 15 16:57:28 2014 +0200 Remove unused code commit 52af130ae18d84b6611834a298d4c8a92c76621c Author: Mike FABIAN Date: Tue Apr 15 16:36:51 2014 +0200 Return only tabkeylist in parse_phrase() The other stuff returned is never used, just thrown away. commit f0dbeb54d65d72451b1c56d91677a1edf6c08703 Author: Mike FABIAN Date: Mon Apr 14 13:14:44 2014 +0200 Remove unused function add_new_phrases() commit e24302cc9e85786c044fc1dc0b79c3a7d724c3c5 Author: Mike FABIAN Date: Mon Apr 14 11:21:52 2014 +0200 remove unused regular expression in parse_extra() in tabcreatedb.py This regular expression would not work with Python3 anymore. But it is not used anyway, so it can be just removed. commit 1347342cc71a719a168526e62d19d859bb5b0d97 Merge: ccb4b1b bd30def Author: Caius "kaio" Chance Date: Mon Apr 14 19:02:28 2014 +1000 Merge pull request #32 from mike-fabian/fix-pinyin-mode-and-dconf-usage Fix pinyin mode and dconf usage commit bd30def611453ffbb065964006fe5a5c2ad525a0 Author: Mike FABIAN Date: Mon Apr 14 09:11:28 2014 +0200 Fix goucima parsing from the source, broken by Python3 port This regular expression: patt_s = re.compile(r' *([^\s]+) *\t *([\x00-\xff]{3}) *\t *[^\s]+ *$') which tries to match single Chinese characters as a sequence of 3 bytes does not match anymore after the Python3 port because Python strings are always unicode now and each Chinese character is thus a single character in a string. commit 599601db7fed46b6e21c227b62ec9145199ecef2 Author: Mike FABIAN Date: Wed Apr 9 16:03:07 2014 +0200 If keychar is empty, do not treat it as valid input This makes typing the right shift key toggle between pinyin mode and table mode, as intended. In Python >>> '' in 'abc' True Therefore, “keychar in self._valid_input_char” is True even if keychar is empty. But if keychar is empty, one should not treat it as valid input. This problem occured when pressing Shift-Right, it was treated as valid input and the following traceback was seen: Traceback (most recent call last): File "/local/mfabian/src/ibus-table/engine/table.py", line 1596, in do_process_key_event result = self._process_key_event (key) File "/local/mfabian/src/ibus-table/engine/table.py", line 1618, in _process_key_event return self._table_mode_process_key_event (key) File "/local/mfabian/src/ibus-table/engine/table.py", line 1856, in _table_mode_process_key_event res = self._editor.add_input ( keychar ) File "/local/mfabian/src/ibus-table/engine/table.py", line 398, in add_input res = self.update_candidates () File "/local/mfabian/src/ibus-table/engine/table.py", line 804, in update_candidates self.pop_input () File "/local/mfabian/src/ibus-table/engine/table.py", line 409, in pop_input self._tabkey_list.pop() IndexError: pop from empty list commit 2c145910964141a66724412e04d446c0298f0f6c Author: Mike FABIAN Date: Tue Apr 8 17:51:12 2014 +0200 Don’t try to colour system phrases and user phrases differently in pinyin mode In pinyin mode, there are no user defined phrases. Therefore, the array holding a candidate does not have two integers at the end, only one. candi[-2] is already the phrase, i.e. the chinese character in pinyin mode, not an integer specifying a frequency. Resolves: rhbz#1084684 - [abrt] ibus-table: table.py:670:ap_candidate:TypeError: unorderable types: str() < int() See: https://bugzilla.redhat.com/show_bug.cgi?id=1084684 commit f463ca439467ff29270fa09cd108fa8f02304385 Author: Mike FABIAN Date: Tue Apr 8 16:46:21 2014 +0200 Don’t use “try:” to call self._editor.clear() in do_focus_out() Why should self._editor.clear() ever fail? If problems can occur there, they should be handled properly there. commit 059061e3e76761dca6853610580c9c2549918fbb Author: Mike FABIAN Date: Tue Apr 8 16:34:58 2014 +0200 Don’t switch off pinyin mode in clear() clear() is called in do_focus_out(). And do_focus_out() is called after clicking into the gnome menu to switch to pinyin mode. This makes it almost impossible to enable pinyin mode and keep it when pinyin mode is switched off in clear(). commit 00a41b813adba4155f19a84706702f693c3e987c Author: Mike FABIAN Date: Tue Apr 8 11:16:16 2014 +0200 Make usage of engine name and dconf key consistent The setup tool did write to a different dconf key than the engine. Make this consistent. If the file name of the table is /usr/share/ibus-table/tables/wubi-jidian86.db use table:wubi-jidian as the ibus engine name (listed by “ibus list-engine” and used in the environment variable IBUS_ENGINE_NAME). As the dconf key, use: /desktop/ibus/engine/table/wubi-jidian86 The name found in the source of the table (i.e. in wubi-jidian86.txt in the source package of ibus-table-chinese), which looks like ### The default name of this table NAME = WuBi-Jidian (JiShuag) 86 should not be used for the dconf key or the engine name, it should only be used for display in the user interface. commit ccb4b1bc4a778381e013ef64838dc8292e61d436 Merge: 3255f48 8842b41 Author: Caius "kaio" Chance Date: Thu Apr 10 22:13:35 2014 +1000 Merge pull request #31 from mike-fabian/fix-regression-caused-by-python3-port-causing-the-build-of-ibus-table-chinese-to-fail Fix a regression caused by the Python3 port in tabcreatedb.py commit 8842b411e32a7c10dce22ee578974bc37ee8081c Author: Mike FABIAN Date: Tue Apr 1 18:18:11 2014 +0200 Fix a regression caused by the Python3 port in tabcreatedb.py This fixes the build of ibus-table-chinese. commit 3255f48cb6cdd6311ca9ae0dadaee349b6f6ce72 Merge: cd317b7 0df841f Author: Caius "kaio" Chance Date: Sat Mar 15 21:22:16 2014 +1000 Merge pull request #30 from mike-fabian/fix-bug1072940-comment18 filter returns a “filter object” in Python3, not a list directly as in Python2 commit 0df841f416f6bac13630c8eb6b6f711d312436a5 Author: Mike FABIAN Date: Wed Mar 12 15:04:30 2014 +0100 filter returns a “filter object” in Python3, not a list directly as in Python2 Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1072940#c18 commit cd317b7d473eb94554e79fe91f5417a4f9074b60 Merge: 1c437bf 19ee83e Author: Caius "kaio" Chance Date: Wed Mar 12 22:12:34 2014 +1000 Merge pull request #29 from mike-fabian/fix-setup-tool-for-use-with-gnome Fix setup tool for use with gnome commit 19ee83e6d762d71f4fde8cebd59735e4f0b31529 Author: Mike FABIAN Date: Wed Mar 12 07:31:47 2014 +0100 Add generated .tar.gz to .gitignore commit 4bb405e984934980940758d58c4e112ae7be3dd6 Author: Mike FABIAN Date: Wed Mar 12 07:18:22 2014 +0100 Fix a spelling error in a variable name, a regression introduced by the Python3 port commit 5d1e95aeb9b75583e9caa841f27c68ec5765814b Author: Mike FABIAN Date: Tue Mar 11 13:25:12 2014 +0100 Fix regression introduced by the Python3 port ascii.ispunct() from “from curses import ascii” can take both characters or integers as the argument. My replacement ascii_ispunct() takes only a character. commit 0f6561fea4c2ca9aa90106e4529bc8d32a2a261c Author: Mike FABIAN Date: Fri Mar 7 12:46:00 2014 +0100 Add a .desktop file and make the setup tool work with Gnome Previously, the setup tool could be called from the command line, for example: /usr/libexec/ibus-setup-table cangjie3 /usr/libexec/ibus-setup-table wubi-jidian86 ... But it could not be called from “gnome-control-center region”, not setup icon did appear for the ibus-table engines. To make this work, a desktop files /usr/share/applications/ibus-setup-{...}.desktop need to be added where {...} is the engine name up to the first “:” character. When the engine names are just the table names (“cangjie3”, “wubi-jidian86”, ...), each table would need to supply its own .desktop file /usr/share/applications/ibus-setup-cangjie3.desktop /usr/share/applications/ibus-setup-wubi-jidian86.desktop ... That is not nice, especially as many tables are in different rpm packages. It is better to have just a single .desktop file /usr/share/applications/ibus-setup-table.desktop This can be used for all engines if the ibus engine names are changed like: cangjie3 → table:cangjie3 wubi-jidian86 → table:wubi-jidian86 ... because only the part before the first “:” in the ibus engine name is used by gnome to decide which desktop file to use. The desktop file contains a line like: Exec=/usr/libexec/ibus-setup-table and the setup tool is is called by Gnome without any command line arguments. But Gnome sets the enviromnent variable IBUS_ENGINE_NAME to the engine name when calling the setup tool. So I changed the setup tool to work like this: IBUS_ENGINE_NAME=table:cangjie3 /usr/libexec/ibus-setup-table or /usr/libexec/ibus-setup-table --engine-name table:cangjie (The command line option is preferred over the environment variable when both are given). commit 491a83fad777e3c451ba1bdecc8a0452d71176fa Author: Mike FABIAN Date: Fri Mar 7 14:56:36 2014 +0100 Make it possible to interrupt the setup tool with Control-C from the command line commit 668469998fafc4be52b6a51a290f8e998caa8034 Author: Mike FABIAN Date: Fri Mar 7 12:46:57 2014 +0100 add autogenerated files table.xml and ibus-table-createdb.1 to .gitignore commit c295c6f9a1d7de2e82ee92b4a38499af6f54ff8c Author: Mike FABIAN Date: Thu Mar 6 14:29:14 2014 +0100 add autogenerated files version.py ibus-setup-table to setup/.gitignore commit 7284a2b96d1b3905a29b28034feffbf16941bac3 Author: Mike FABIAN Date: Thu Mar 6 14:26:52 2014 +0100 Remove trailing whitespace and fix some spelling mistakes in comments commit 0adf55500aac6cda98e43f08561f59c78b254080 Author: Mike FABIAN Date: Thu Mar 6 08:46:09 2014 +0100 Correct description of toggle_tab_py_mode() and cycle_next_cand() commit 72cd5718c8e912ba14be220e5be7421bede02303 Author: Mike FABIAN Date: Thu Mar 6 08:33:45 2014 +0100 Fix spelling mistake in variable name commit 29666688c03590f285307aface392071f0b1f800 Author: Mike FABIAN Date: Thu Mar 6 08:37:52 2014 +0100 Remove unused speedmeter code which has already been commented out commit f7e9ae9b96aa79fb71e30c6a4c004e3833f87b9c Author: Mike FABIAN Date: Wed Mar 5 16:35:41 2014 +0100 Don’t try to set _prev_char in commit_string() when an empty string is committed Without this fix one can produce a backtrace by using “wubi-haifeng86” and typing “dkl” followed by “Shift” and “Space”. After “Shift” the preëdit is empty and “Space” commits and empty string then. This leads to the following backtrace: Traceback (most recent call last): File "/local/mfabian/src/ibus-table/engine/table.py", line 1589, in do_process_key_event result = self._process_key_event (key) File "/local/mfabian/src/ibus-table/engine/table.py", line 1611, in _process_key_event return self._table_mode_process_key_event (key) File "/local/mfabian/src/ibus-table/engine/table.py", line 1824, in _table_mode_process_key_event self.commit_string (sp_res[1]) File "/local/mfabian/src/ibus-table/engine/table.py", line 1516, in commit_string self._prev_char = string[-1] IndexError: string index out of range commit 053a37ad1f19f5affd02befbe2af52adac1e46d7 Author: Mike FABIAN Date: Wed Mar 5 16:19:34 2014 +0100 use editor.commit_to_preedit() instead of deleted editor.l_shift () Resolves: rhbz#1072940 - Left Shift stopped work for ibus-table-1.5.0.20140218-1.fc20.noarch See also: https://bugzilla.redhat.com/show_bug.cgi?id=1072940 Was broken by: https://github.com/kaio/ibus-table/commit/fb11d92439fe4bd55fcad480d3998a17434f6870 commit fb11d92439fe4bd55fcad480d3998a17434f6870 Author: Caius "kaio" CHANCE Date: Mon May 6 21:05:35 2013 +1000 Issue #17: Removed excessive instance creation of IBusLookupTable in editor class. Removed commit 0ebecfd0c97966f6c9d0b462cc93868f0a8f4077 Author: Mike FABIAN Date: Mon Mar 3 17:15:54 2014 +0100 Port ibus-table from Python2 to Python3 I kept it working with Python2 for the moment, but in the long run it is probably not worth the maintenance effort to keep it working with Python2. - I added stuff like if type(s) != type(u''): s = s.decode('UTF-8') for compatibility with Python2. http://docs.python.org/3/whatsnew/3.3.html says: > • The u'unicode' syntax is accepted again for str objects. So the above compatibility hack does not work for Python3 < 3.3. - define our own compatibility function def ascii_ispunct(character): if character in '''!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~''': return True else: return False instead of using ascii.ispunct() from “from curses import ascii” to get the intended behaviour both in Python2 and Python3: $ python3 Python 3.3.2 (default, Feb 19 2014, 14:35:19) [GCC 4.8.2 20131212 (Red Hat 4.8.2-7)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from curses import ascii >>> ascii.ispunct('.') True >>> ascii.ispunct('a') False >>> ascii.ispunct('☺') True >>> ascii.ispunct(u'a') False >>> ascii.ispunct(u'☺') True >>> ascii.ispunct(u'あ') True >>> $ python2 Python 2.7.5 (default, Feb 19 2014, 13:47:28) [GCC 4.8.2 20131212 (Red Hat 4.8.2-7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from curses import ascii >>> ascii.ispunct('.') True >>> ascii.ispunct('a') False >>> ascii.ispunct('☺') Traceback (most recent call last): File "", line 1, in File "/usr/lib64/python2.7/curses/ascii.py", line 63, in ispunct def ispunct(c): return _ctoi(c) != 32 and not isalnum(c) File "/usr/lib64/python2.7/curses/ascii.py", line 50, in _ctoi return ord(c) TypeError: ord() expected a character, but string of length 3 found >>> ascii.ispunct(u'a') True >>> ascii.ispunct(u'☺') True >>> ascii.ispunct(u'あ') True >>> ascii.ispunct(u'a'.encode('ascii')) False >>> Python3 commit e52f7dfcf4c63024f3ab98084d7ddffeb5a8abdf Author: Mike FABIAN Date: Thu Mar 6 07:49:32 2014 +0100 Add profiling support Write profiling information into the debug log when started with “--profile”. The profiling information appears automatically in the debug log after “ibus restart” when profiling is enabled. commit 893b999bee1de649dd1864b551e43974e42808e8 Author: Mike FABIAN Date: Mon Mar 3 13:15:08 2014 +0100 Use @PYTHON@ instead of just 'python' in ibus-setup-table.in To get it replaced by the correct python interpreter when doing something like: PYTHON=python3 ./configure commit 18797b2f515c1669c89ff59fd0ab5050b741974f Author: Mike FABIAN Date: Tue Mar 4 13:57:01 2014 +0100 Fix directory for setup tool It is in /usr/libexec/ibus-setup-table on Fedora. commit 1c437bf6896874903a6c0b1b496b93b54790bcbc Merge: fc6ce51 16a4f1c Author: Caius "kaio" Chance Date: Mon Mar 3 21:21:53 2014 +1000 Merge pull request #27 from mike-fabian/fix-saving-database-periodically-for-gobject-introspection-and-a-patch-from-leftmostcat Fix saving database periodically for gobject introspection and a patch from leftmostcat commit 16a4f1c5691f20141fba2ecf363b66945012defb Author: Seán de Búrca Date: Wed Sep 4 23:41:15 2013 -0600 Allow tables to specify a symbol for display commit cca58cc8ab2e6bff3081454b6028bb6c0ac798bf Author: Mike FABIAN Date: Tue Feb 18 20:15:13 2014 +0100 Fix the commit “Save user database periodically to avoid data loss” to use gobject introspection This fixes the following commit to use gobject introspection: commit 5d88bb3fef806f4feaef239e4fd78970e19d115a Author: mozbugbox Date: Sun Oct 28 19:32:22 2012 +0800 Save user database periodically to avoid data loss Periodically sync mudb content to usrdb so we don't loss user created phrase and freq when crash. Currently the interval is set to 16 input ops or 30 seconds between saving. commit fc6ce511c7eb483e8bee8e9cf5bb2b8f9e3881f8 Merge: f68e73c c888c5d Author: Caius "kaio" Chance Date: Tue Feb 4 22:46:44 2014 -0800 Merge pull request #26 from mike-fabian/update-german-translations Update german translations commit c888c5d68d0fc03b9306520bec1528b168da0740 Author: Mike FABIAN Date: Mon Feb 3 11:14:27 2014 +0100 Update German translations commit 0ac3e535dd41db916ceebe73ef84b4e6fb7b98b6 Author: Mike FABIAN Date: Wed Feb 5 05:42:16 2014 +0100 Remove print statements for debugging I forgot to remove them in commit 7919d0326f1516164ea94b69137c88625b767f88 Author: Mike FABIAN Date: Tue Feb 4 15:52:45 2014 +0100 Make the property “Display Candidates/Hide Candidates” actually work commit f68e73c982dba42a984cd5cb7c497efb458b1b14 Merge: 9404fa6 0632dc9 Author: Caius "kaio" Chance Date: Tue Feb 4 15:20:32 2014 -0800 Merge pull request #20 from mozbugbox/ascii-with-empty-canadidate Ascii with empty canadidate commit a4144337912c6e9fce1e321b2b0d1b94db89d689 Merge: c01120b 20913ab Author: Caius "kaio" Chance Date: Tue Feb 4 15:18:38 2014 -0800 Merge pull request #21 from leftmostcat/master Allow tables to specify a symbol for display commit 9404fa6a9729d1b89524f7454bb7b6f4a3c43586 Merge: fe11a0c c5a60f6 Author: Caius "kaio" Chance Date: Tue Feb 4 15:16:32 2014 -0800 Merge pull request #25 from mike-fabian/add-check-for-input-purpose-for-passwords Add check for input purpose for gnome-shell password dialog commit fe11a0c32124618a35f21bcc5d31c7c54d9b6477 Merge: 1d2f442 7919d03 Author: Caius "kaio" Chance Date: Tue Feb 4 14:55:23 2014 -0800 Merge pull request #24 from mike-fabian/make-hide-candidates-work Make the property “Display Candidates/Hide Candidates” actually work commit 1d2f442be9754759339bdde90b6d492f67012bf5 Merge: d782b07 076bb39 Author: Caius "kaio" Chance Date: Tue Feb 4 14:55:03 2014 -0800 Merge pull request #23 from mike-fabian/print-usage-message-when-tabcreate-is-called-without-options Print usage message when tabcreate is called without options commit c5a60f60578f681059e821f476e8e9f61102718d Author: Mike FABIAN Date: Tue Feb 4 16:20:11 2014 +0100 Add check for input purpose for gnome-shell password dialog Resolves: rhbz#1061345 - ibus-table shows entered text in password fields (See: https://bugzilla.redhat.com/show_bug.cgi?id=1061345) commit 7919d0326f1516164ea94b69137c88625b767f88 Author: Mike FABIAN Date: Tue Feb 4 15:52:45 2014 +0100 Make the property “Display Candidates/Hide Candidates” actually work - There is no set_candidates_list_visible() in ibus 1.5.5. use hide_lookup_table() instead to hide the candidates if requested - also hide the auxiliary text if hiding of the candidates is requested - make changing of that property by changing the gconf key work (name == u'AlwaysShowLookup' won’t work it needs to be all lower case) - There was a typo here: “self._new_property(u'always_show_loopup')” (“lookup”, not “loopup”) - The property menus show the current state, not the state which will be switched to when the menu entry is pressed. For example, one property says “Half-width punctuation” when half-width punctuation is in use, clicking it switches to full-width punctuation and then the menu displays “Full-width punctuation”. The property menu for displaying and hiding candidates did that reversed. Make it behave like the other property menus do. commit 076bb390705d2b8477323236dd997032fdb48db5 Author: Mike FABIAN Date: Thu Jan 23 23:26:57 2014 +0100 When tabcreatedb.py is called without any options, print a usage message Do not just show a cryptic backtrace. Resolves: rhbz#1049760 See: https://bugzilla.redhat.com/show_bug.cgi?id=1049760 commit d67c3f032fe4fa493de334bf1b5d4907293409e9 Author: Mike FABIAN Date: Wed Jan 22 12:11:18 2014 +0100 Fix typo in ibus-table-createdb man-page "for for" -> "for" commit 20913ab847d393dfbce07fcac8b5538a5b351605 Author: Seán de Búrca Date: Wed Sep 4 23:41:15 2013 -0600 Allow tables to specify a symbol for display commit 0632dc94931f73cffa99b3163c2cf7b15e48111a Author: mozbugbox Date: Sat May 18 20:21:34 2013 +0800 Remove accidentally added engine/* files Somehow, the engine directory was added. clean it up. commit 2413853c1a2ffc708250d2548cafe95792b22678 Author: mozbugbox Date: Sat May 18 20:04:03 2013 +0800 remove vim backup files commit 05a065b34970cdeb71c2e3f80312e6d0be967b19 Author: mozbugbox Date: Sat May 18 19:56:41 2013 +0800 Update setup to dconf with lower case options commit acd03a472215d43dc17bed4a2b9dbe29f7aa5817 Merge: 4d18a67 d782b07 Author: mozbugbox Date: Sat May 18 17:55:30 2013 +0800 Merge remote-tracking branch 'kaio/1.7' into ascii-with-empty-canadidate Conflicts: engine/table.py commit 4d18a67d8b0bc0fbe0999f330769707611d11eea Merge: cd11209 2467638 Author: mozbugbox Date: Sat May 18 17:46:20 2013 +0800 Merge remote-tracking branch 'kaio/1.7' into ascii-with-empty-canadidate Conflicts: engine/main.py engine/table.py commit d782b07861c40b22aafa81aa779f4eb76ed08fce Author: Caius "kaio" CHANCE Date: Mon May 6 22:21:01 2013 +1000 Indent 4 spaces on README to support MarkDown on wiki page. commit 6f0702c742cd8ef30f375a3db28552b6e9bb9338 Author: Caius "kaio" CHANCE Date: Mon May 6 21:43:08 2013 +1000 Removed unused commented-out code. commit ba990fe42d0ebab241f35a1f4f7cd1e1a911cc3f Author: Caius "kaio" CHANCE Date: Mon May 6 21:37:15 2013 +1000 Clear all input when "focus-out" (switch to another window/input-fields, etc). commit cb6e11a222f44e985e0632f81c4b2622e25d215a Author: Caius "kaio" CHANCE Date: Mon May 6 21:17:06 2013 +1000 Fixed mis-refactor of cursor_up as cursor_down in editor class. commit fb11d92439fe4bd55fcad480d3998a17434f6870 Author: Caius "kaio" CHANCE Date: Mon May 6 21:05:35 2013 +1000 Issue #17: Removed excessive instance creation of IBusLookupTable in editor class. Removed commit 24676389e9f218b7972283493096acd3e1a13f8e Merge: 763f181 d246000 Author: Caius "kaio" CHANCE Date: Sun May 5 21:14:19 2013 +1000 Merge branch 'rename_editor_func_from_key_combo_to_behavioral_naming_base' into 1.7 commit d246000eb6686316026572fb65888ad29337dcf4 Author: Caius "kaio" CHANCE Date: Sun May 5 20:48:31 2013 +1000 Renamed funcs in editor class from keyboard-input based to behavior based. commit 763f181149dff0b84dc0dde0bb334903e40c0b8b Merge: 79fa67e d70d66f Author: Caius "kaio" CHANCE Date: Thu May 2 14:41:26 2013 +1000 Issue #14: Merge branch 'refactor_convert_to_full_width' into 1.7 commit d70d66f25f8a4e9be1bfd6558dfde11a40bf4202 Author: Caius "kaio" CHANCE Date: Thu May 2 14:35:21 2013 +1000 Added back unicode string spec to condition check in _convert_to_full_width (self, c). commit 2554d6091f413975dd4886b89c5d57776603f955 Author: Caius "kaio" CHANCE Date: Thu May 2 14:26:02 2013 +1000 WIP: Removed excessive condition check. commit 24091c51a67e8b134b7db3dbe613990fdc44ab6f Author: Caius "kaio" CHANCE Date: Thu May 2 14:21:23 2013 +1000 WIP: Combined two dicts into single dict. Simplified the condition checks. commit f748d5e51ad4b2c68c5d883b4819860389458c85 Author: Caius "kaio" CHANCE Date: Thu May 2 11:15:16 2013 +1000 WIP: Extracted more condition checks to dict. commit 7e826b7d4e7b30bdbcfe867be2ca744e22380142 Author: Caius "kaio" CHANCE Date: Thu May 2 10:22:12 2013 +1000 WIP: Jump right to later half of conditions when _mode isn't true. commit a2e6215d1fcf07aba6f03bc4b88bffee1a785884 Author: Caius "kaio" CHANCE Date: Thu May 2 09:40:05 2013 +1000 WIP: Removed excessive condition check on char eligiblity. commit 79fa67e529dff3562580f16c5138ff4c54309eb7 Author: Caius "kaio" CHANCE Date: Wed May 1 21:31:46 2013 +1000 Extract repeating code from _init_properties(self) to _new_property(self,key). commit c01120bb6856445327270b2e53ca36099196a326 Merge: 9745b53 a42c1d3 Author: Caius "kaio" CHANCE Date: Mon Apr 29 20:26:36 2013 +1000 Merge remote-tracking branch 'bernardn/master' into 1.6 Conflicts: engine/table.py commit 9745b5384c3328cd7db994baab7301f6367b5ee4 Merge: 764a8c7 757a88e Author: Caius "kaio" CHANCE Date: Sun Apr 28 22:05:24 2013 +1000 Merge remote-tracking branch 'origin/master' into 1.6 commit 757a88e4eee512e478c6692f39b8e346a95aba5a Merge: 7a3f0d9 04e3be2 Author: Caius "kaio" Chance Date: Sun Apr 28 05:04:07 2013 -0700 Merge pull request #7 from luolimao/master Explicit python2 for compatibility commit 764a8c7251a9078bda22c544796c77b81ec2d581 Merge: 68f25cb 367c146 Author: Caius "kaio" CHANCE Date: Sun Apr 28 21:25:56 2013 +1000 Merge remote-tracking branch 'anthonywong/master' into 1.6 commit 68f25cb5c82dc87bd18b84afc9146435c9490944 Merge: b7da6e8 02ddfba Author: Caius "kaio" CHANCE Date: Sun Apr 28 21:12:43 2013 +1000 Merge remote-tracking branch 'mozbugbox/tooltip-show-hotkey' into 1.6 Conflicts: engine/table.py commit b7da6e8a66a455fc0ed9270fe1f2c0638c1b1211 Author: Anthony Wong Date: Tue Dec 4 00:39:06 2012 +0800 Catch exception when reading ~/.ibus/byo-tables so the process won't halt. Conflicts: engine/main.py commit 5f274590b27068cc3dca08899a8831aa38f647e6 Merge: e32bda3 f5e8e37 Author: Caius "kaio" CHANCE Date: Sun Apr 28 20:36:52 2013 +1000 Merge remote-tracking branch 'bernardn/auto_select_two_candidates_inputs' into 1.6 commit e32bda3276868d140d74a9f4291b4bb475a2215d Merge: ea2795b 5d34900 Author: Caius "kaio" CHANCE Date: Thu Apr 25 21:51:36 2013 +1000 Merge remote-tracking branch 'bernardn/candidates_list_visible' into 1.6 Conflicts: engine/table.py commit ea2795bdcd5ab6d67e865f3e5fc715096d59d0a6 Merge: c029e9f 99b16e2 Author: Caius "kaio" Chance Date: Fri Apr 19 02:03:58 2013 -0700 Merge pull request #12 from mike-fabian/add-man-page-and-apply-autoselect-dconf-value-immediately Add man page and apply autoselect dconf value immediately commit 99b16e2159ba4234f4f804fe10348c9f3b2a8000 Author: Mike FABIAN Date: Thu Apr 18 12:10:50 2013 +0200 Add man page for ibus-table-createdb See https://bugzilla.redhat.com/show_bug.cgi?id=948454 commit 5d34900e60b4abd582b69feb3d843fe2e4cee695 Author: Bernard Nauwelaerts Date: Mon Mar 25 17:10:47 2013 +0100 Add always_show_lookup property commit f5e8e371d6738385e7a97b0f62994947c116a137 Author: Bernard Nauwelaerts Date: Mon Mar 25 12:22:51 2013 +0100 auto_select : commit when enter key pressed. commit ef81ce4ec029f3b03bda347e0e469d94d101937e Author: Bernard Nauwelaerts Date: Mon Mar 25 11:24:47 2013 +0100 auto_select : commit when tab key pressed. commit 3b78b86df6171ac4add0c4df7d7ae5eeb18a7e91 Author: Bernard Nauwelaerts Date: Mon Mar 25 11:23:51 2013 +0100 auto_select : commit previous entry when the last one has also candidates. commit c2fbde2fc7dcb0b2b09c8300ae079240ec790266 Author: Mike FABIAN Date: Tue Mar 5 07:37:43 2013 +0100 Apply change in autoselect dconf value immediately Changing the other dconf values was applied immediately but this did not yet work for the “autoselect” option, recently added by Bernard Nauwelaerts. commit 458420dda7e4a353b4d912641d12bda1731f01f0 Author: Mike FABIAN Date: Tue Mar 5 06:44:55 2013 +0100 Fix typos in comment commit c029e9f132a044265b92822e01e95df6165b9cd5 Merge: d31c8d9 9497457 Author: Caius "kaio" Chance Date: Sun Feb 17 01:26:48 2013 -0800 Merge pull request #10 from mike-fabian/mike-collected-changes-on-kaio-1.6-branch Mike collected changes on kaio 1.6 branch commit 949745757b8028c40c30d9fb8f230536faacb98b Author: Mike FABIAN Date: Mon Feb 4 19:33:59 2013 +0100 Support uppercase umlauts Needed for translit.txt and translit-ua.txt. This should be solved in a better, more generic way. But at the moment this patch is better than nothing. commit 9eb482d08c541ed042a3946be8c9a4a343b532b4 Author: Mike FABIAN Date: Thu Jan 10 11:37:59 2013 +0100 Changes in dconf values now get applied immediately Changing values of dconf keys for example with dconf write /desktop/ibus/engine/table/cangjie3/chinesemode 3 was not applied immediately to the ibus-table engine, only when changing to a different input method and back this change was applied. This commit fixes this problem. commit 3b7a3530c42766b801cded26b3bc269222c3fb0a Author: Mike FABIAN Date: Thu Feb 14 18:21:57 2013 +0100 Preedit needs to be updated on page-up and page-down When paging through the lookup table, the preedit needs to be updated to show the phrase selected by the cursor in the lookup table. Before this patch, the preedit was not updated and when commiting the character selected in the lookup table suddenly replaced the character in the preedit. This differed from the behaviour when moving through the lookup table with the arrow-up and arrow-down keys. Using page-up and page-down or the arrow icons at the bottom of the lookup table should also update the preedit just like it is done when the arrow-up and arrow-down keys are used. commit a42c1d351e3b1264186f99e5d0febc784063ffb9 Author: bnauwelaerts Date: Thu Feb 7 10:30:23 2013 +0100 Defaults _auto_select to False for tables that doesnt contain this attribute commit 3d03bd8f8c558392db42897370cef65bdbad57bd Author: Mike FABIAN Date: Tue Feb 5 09:11:17 2013 +0100 Fall back to auto_select = False if neither dconf nor the table have a value for auto_select commit 2baa9c3ff258c0623b4777f2c537467339cdcef6 Author: bnauwelaerts Date: Sat Feb 2 17:22:40 2013 +0100 Update cmode pproperty in chinese mode only commit a55783887e757f02078143c2d12031a33c9e9223 Author: bnauwelaerts Date: Sat Feb 2 13:03:48 2013 +0100 Add auto_select functionality to select the first phrase when typing. Useful for Cyrillic transliteration. commit a85b8b90c21cafc13079c17b35cf021dbf0a6475 Author: bnauwelaerts Date: Sat Feb 2 17:22:40 2013 +0100 Update cmode pproperty in chinese mode only commit f0f4ee216788fd901c3ef91c90f9ce4bede88862 Author: bnauwelaerts Date: Sat Feb 2 13:03:48 2013 +0100 Add auto_select functionality to select the first phrase when typing. Useful for Cyrillic transliteration. commit 03cba776da99b05218c2b1c86f3e93d3373f253e Author: Mike FABIAN Date: Wed Jan 30 07:41:54 2013 +0100 Fix typo, thanks to Mathieu Bridon commit 5b434df882093a3def36585582c84950ce7e3b52 Author: Mike FABIAN Date: Mon Jan 28 15:15:10 2013 +0100 add engine/chinese_variants.py to engine/Makefile.am Needed by commit f17e9b3aecea7b6646da689a466341936bce1ee3 Author: Mike FABIAN Date: Thu Jan 24 17:37:27 2013 +0100 Improve detection of simplified and traditional Chinese commit 04e3be2bb27cf4e088e7c41f01356f10b29660ce Author: Limao Luo Date: Sun Jan 27 12:19:41 2013 -0500 explicitly call python2 in shebang line for more portability commit f17e9b3aecea7b6646da689a466341936bce1ee3 Author: Mike FABIAN Date: Thu Jan 24 17:37:27 2013 +0100 Improve detection of simplified and traditional Chinese Resolves: #857967 https://bugzilla.redhat.com/show_bug.cgi?id=857967 see also http://code.google.com/p/ibus/issues/detail?id=1492 “unable to write 晞 with any of the two Wubi input methods” 晞 (wubi code = JQDH) cannot be written. - add a script generate-chinese-variants.py which parses Unihan_Variants.txt from the Unihan database and generates another Python script. The generated Python script contains a hash table with information which characters are simplified, which characters are traditional and which characters are both and a small function using that hash table to detect whether a string is traditional or simplified Chinese or both. - use the generated script and function in tabsqlitedb.py instead of the old way to distinguish between simplified and tradtional Chinese which used test encoding to legacy encodings like gb2312 and big5hkscs. The new way of simplified/traditional detection should give better results. 晞 from issue 1492 is now classified as both traditional and simplified Chinese, not only traditional as it was with the old detection code. commit 1c316e066f88f9555de5407f00b4be0b076fd42c Author: Mike FABIAN Date: Thu Jan 24 12:47:19 2013 +0100 Make comments about _chinese_mode clearer There was one obvious typo and the comments did not explain the meaning of _chinese_mode clearly. commit d31c8d94eb05a33c9eaf6c79b24cdb0b289bba76 Author: Caius "kaio" CHANCE Date: Wed Jan 16 07:54:56 2013 +1000 Fixed release flag check for if timestamp is suffixed. commit 7a3f0d9d75fd36575a5e581830c4a57b07b2e7ad Author: Caius "kaio" CHANCE Date: Wed Jan 16 07:45:35 2013 +1000 Update author list. commit e663a176bf797cc523be7541e0dc7318eef7466e Merge: dca5eda 0b8bec0 Author: Caius "kaio" Chance Date: Wed Jan 9 14:44:25 2013 -0800 Merge pull request #4 from mike-fabian/mike-fix-typo-in-chinese-mode-variable Mike fix typo in chinese mode variable commit dca5edae81cc70d82099e9ccdca38052523196f9 Merge: ea29e27 5ecc6d9 Author: Caius "kaio" Chance Date: Wed Jan 9 14:42:31 2013 -0800 Merge pull request #3 from mike-fabian/mike-make-cursor-in-lookup-table-visible Make cursor in lookup table always visible commit 0b8bec02a2f510e91f1ecd4febd67fe0132e4414 Author: Mike FABIAN Date: Wed Jan 9 16:59:13 2013 +0100 When detecting the Chinese mode from the environment, also check LC_ALL LC_ALL has even higher priority then LC_CTYPE and should be checked first. commit 9e963b5c813090ca389f78740e60965104944d93 Author: Mike FABIAN Date: Wed Jan 9 16:53:20 2013 +0100 Fix typo in self._chinese_mode variable When porting to GObjectIntrospection, I made a typing mistake in the self._chinese_mode variable. This caused a problem when the dconf key for “chinesemode” was not yet set. Then the property for selecting the Chinese mode in the ibus menu was empty and and selecting the empty line with the mouse just caused an error. This commit fixes this. commit 5ecc6d941cbce800c96438c8c57bb8dc6fcf4525 Author: Mike FABIAN Date: Tue Jan 8 17:53:09 2013 +0100 Make cursor in lookup table always visible The cursor in the lookup table was always visible before porting to GObjectIntrospection. So it should behave the same way after porting. commit ea29e278c90b55f910e656f1b192df288e59d563 Merge: b899a0a 526b8cf Author: Caius "kaio" Chance Date: Tue Jan 8 00:04:24 2013 -0800 Merge pull request #2 from mike-fabian/mike-porting Finished Xiaojun Ma’s work of porting to Gobject Introspection. commit 526b8cf4e395dd8c6333b3ed4185596b1196fad8 Author: Mike FABIAN Date: Mon Jan 7 01:49:09 2013 +0100 finish porting to gi commit 6d78cab7069d7873b90391a75aa5d2d15220913a Author: Mike FABIAN Date: Mon Jan 7 01:50:14 2013 +0100 add *.pyc to .gitignore commit ca049a01f21852586e5ebf894513a6e7a0539ba2 Author: Ma Xiaojun Date: Tue Nov 20 23:33:11 2012 -0600 start porting to gi commit b899a0a33f015606b43ee2b63eb999dadfbb3a0e Merge: 52ec65d 12abcdb Author: Caius 'kaio' Chance Date: Thu Jan 3 17:06:11 2013 +1000 Merge remote-tracking branch 'mike-fabian/some-fixes-for-rel20121101' into 1.5.0 commit 367c14657c203528dac72c085b10129c4a03f9f4 Author: Anthony Wong Date: Tue Dec 4 00:39:06 2012 +0800 Catch exception when reading ~/.ibus/byo-tables so the process won't halt. commit 52ec65d94b69f8f4e06325a7cb18f0d8ed4f707a Author: Caius 'kaio' Chance Date: Fri Nov 30 17:48:03 2012 +1000 Patch for regression of select_keys option on table sources. (bochecha) commit cd1120969f4a5cb1269f69b349f89b3b1c434e59 Author: mozbugbox Date: Wed Nov 21 01:04:13 2012 +0800 Direct input ascii char for English mode on empty Do the same input untranslated ascii directly when panel is empty for the English mode. commit 7a7c6fe600a917b989c514c1014047bf7c35e34f Author: mozbugbox Date: Tue Nov 20 23:53:15 2012 +0800 Input untranslated ascii directly when panel is empty Some applications only accept directly input ascii as command input. Character fed through xim commit will not work as intent. When there were no candidates, we treated all the un-translated (b/w half/full width) ascii chars as direct input chars. commit 5c5a2415680af7dee99e9bbce84872ba570ee1a4 Merge: b40c6f3 aadfdb0 Author: mozbugbox Date: Sun Nov 18 23:44:41 2012 +0800 Merge remote-tracking branch 'kaio/ibus-setup-table-639' into save-user-db Conflicts: engine/main.py commit b40c6f3c595498e55222ca126c2e808cabe145ee Merge: d5b9f9c d1b8d13 Author: mozbugbox Date: Sun Nov 18 21:44:22 2012 +0800 Merge remote-tracking branch 'kaio/1.5.0' into save-user-db Conflicts: engine/main.py commit 12abcdbdc55aa1f25fcbe725ce70765b8519674e Author: Mike FABIAN Date: Tue Nov 13 10:24:13 2012 +0100 Do not fail if the ~/.ibus/byo-tables/ directory does not exist “/usr/libexec/ibus-engine-table --xml” aborted with an error if ~/.ibus/byo-tables did not exist. commit 325158739a399c1137d48562bcee1550bd96953f Author: Mike FABIAN Date: Tue Nov 13 09:02:38 2012 +0100 Add some generated files to .gitignore commit 7fa914591d2f5be7b93100f7d5ef3798b1a41399 Author: Mike FABIAN Date: Tue Nov 13 08:34:54 2012 +0100 Add German translation commit 8099bc679dfb78f874d77a4188e34d572edae3b6 Author: Mike FABIAN Date: Tue Nov 13 08:32:24 2012 +0100 update zh_??.po files commit ab19e1a63f73040bd7f423923b0e886d8c87bd54 Author: Mike FABIAN Date: Tue Nov 13 07:59:07 2012 +0100 Fix marking of translatable strings for gettext was broken in: commit 6d2ab577c41c9b07a84c049137c8184bb67f5e30 Author: Caius 'kaio' Chance Date: Fri Oct 5 10:40:47 2012 +1000 Refactor _refresh_properties() function. commit d1b8d136a4371c77b377f9c4276c7783dc69df52 Merge: af0eb0a 37802fc Author: Caius 'kaio' Chance Date: Mon Nov 12 02:51:06 2012 +1000 Merge remote-tracking branch 'mozbugbox/tools' into rel201212 commit af0eb0a549a803d9bbfa297251bea2f3cf8ee440 Author: mozbugbox Date: Thu Nov 1 21:03:16 2012 +0800 Left ALT key to cycle candidates in the current page commit aadfdb095e313cc2446c1feb99f51cdaae40468d Merge: 56036a6 001ee4a Author: Caius 'kaio' Chance Date: Mon Nov 12 01:55:55 2012 +1000 Merge branch 'master' into ibus-setup-table-639 Conflicts: engine/main.py commit 001ee4acf2dc01e3b8291dbdb110bce005e4d0e8 Author: Caius 'kaio' Chance Date: Mon Nov 12 01:00:34 2012 +1000 Corrected release checking in configure.ac. commit d5b9f9caeb6cd5b0686590070d73ea8ac660b24b Author: mozbugbox Date: Thu Nov 1 12:22:16 2012 +0800 Sync user db on engine destroy commit b3e9a57f3dd8ac291adf3478a81ae8181e958e24 Author: mozbugbox Date: Sun Oct 28 23:30:54 2012 +0800 Avoid flashing by moving combobox renderer creation to front commit f78dffa470607b1137c629bac3f6ba01061acb47 Author: mozbugbox Date: Sun Oct 28 19:36:16 2012 +0800 Update debian/ content commit 5d88bb3fef806f4feaef239e4fd78970e19d115a Author: mozbugbox Date: Sun Oct 28 19:32:22 2012 +0800 Save user database periodically to avoid data loss Periodically sync mudb content to usrdb so we don't loss user created phrase and freq when crash. Currently the interval is set to 16 input ops or 30 seconds between saving. commit 06ea923b4dc989e7e18f14718a634c5712141207 Author: mozbugbox Date: Sun Oct 28 19:29:43 2012 +0800 Speedup sync_usrdb() * Remove unneeded commits * Clear in-memory mudb content once synced * return immediately if user_db is None (which means use in-memory db) commit 37802fc37ad8f559ffa16bcb4c59f3afa4f1e2a4 Author: mozbugbox Date: Sat Oct 20 15:38:37 2012 +0800 Skip None entries when print keyboard value. commit c642db82e2588a6b913a090c2b7ed0ed1cd220c4 Author: mozbugbox Date: Sat Oct 13 15:23:09 2012 +0800 Add a tool to dump ibus table database ibus-table-query is a handy tool to see what's in the phrase table database. $ ./ibus-table-query -t wubi-haifeng86 aeq Using table: /usr/share/ibus-table/tables/wubi-haifeng86.db mlen clen m0 m1 m2 m3 category user_freq freq phrase ================================================================== 4 2 a|1 e|5 q|17 d|4 3 0 2292000 菜肴 4 2 a|1 e|5 q|17 c|3 3 0 552200 菜色 4 2 a|1 e|5 q|17 n|14 1 0 1266000 菜馆 4 2 a|1 e|5 q|17 y|25 3 0 6350000 菜鸟 4 1 a|1 e|5 q|17 k|11 2 0 1000 葋[U+844B] $ ./ibus-table-query -t wubi-haifeng86 菜 Using table: /usr/share/ibus-table/tables/wubi-haifeng86.db mlen clen m0 m1 m2 m3 category user_freq freq phrase ================================================================== 2 1 a|1 e|5 3 0 1132 菜[U+83DC] 3 1 a|1 e|5 s|19 3 0 1132 菜[U+83DC] 4 1 a|1 e|5 s|19 u|21 3 0 1132 菜[U+83DC] commit bf91ed7464043b26fb9dbf4e33be220cb8dd09eb Merge: d4e9471 b60898c Author: Caius 'kaio' Chance Date: Fri Oct 12 07:56:49 2012 +1000 Merge branch 'byo-table-db-614' into rel20121101 commit b60898c58d4195cbfbd46f2de7b9adac9fb6cbc5 Author: Caius 'kaio' Chance Date: Fri Oct 12 07:54:18 2012 +1000 Improved naming of variables related to user provided (BYO) tables. commit cf17aa8d474f0f11141c9cf1a93bf2c1ca3cb1ae Author: Caius 'kaio' Chance Date: Fri Oct 12 00:08:06 2012 +1000 (WIP) Add database load in factory when it is not located in system table path, but in user's home directory. Path checking is still a dirty hack but worked at this stage. Need some tidy-up. commit 56036a6a755d133a65f56f08494b04de82ce73f2 Merge: d4e9471 7689c95 Author: Caius 'kaio' Chance Date: Thu Oct 11 22:07:40 2012 +1000 Merge remote-tracking branch 'mozbugbox/ibus-setup-table' into ibus-setup-table commit 7689c958238c18c86972cc7964d4cf7d26a29e51 Author: mozbugbox Date: Thu Oct 11 16:25:53 2012 +0800 Setup: Add table information to About page commit e05c13fecc7957433066e34027864f7fc6db66e7 Author: mozbugbox Date: Thu Oct 11 15:35:30 2012 +0800 Add an ibus-table-setup to set ibus table engine The setup app can be accessed from: ibus Preferences -> Input Method -> select a method -> Preferences The code and ui were adapted from * ibus-setup-pinyin * https://github.com/maxiaojun/ibus-table-setup commit d4e9471570481dd22a9a28e1473813ed4cf57582 Merge: e24b74a 87e2bf7 Author: Caius 'kaio' Chance Date: Thu Oct 11 10:29:14 2012 +1000 Merge branch 'space-key-for-lookup-next-page-861' into rel20121101 commit 87e2bf7288aae20a46cc76939a110b511fd60b79 Author: Caius 'kaio' Chance Date: Thu Oct 11 10:24:31 2012 +1000 Recognize space key as page_down/next-page, if a table specified it as one of the page_down_keys. commit e24b74a7243a946dff4639d9c686ac72d57e114e Merge: 7419897 eadb7bf Author: Caius 'kaio' Chance Date: Wed Oct 10 13:25:13 2012 +1000 Merge branch 'page-size-from-table' into rel20121101 commit eadb7bf9a833978a152d3537a73223ec45701025 Author: Caius 'kaio' Chance Date: Wed Oct 10 13:23:37 2012 +1000 Add fallback of lookup page size, determined by number of candidate select keys. commit 741989758a9f858897586158db18893a2bc0bab9 Author: mozbugbox Date: Tue Oct 9 00:11:45 2012 +0800 Add a "." to candidate label text commit 2ad241d7a32357b4783217be3035eb2597c30611 Author: mozbugbox Date: Mon Oct 8 17:26:24 2012 +0800 Make select_keys actually functional Tables can actually use the SELECT_KEYS setting to make select keys non-integer. Useful for Four Corner Input like IM. commit 02ddfba26e47bdffc5a6a22d299d06d49d7bc1ea Author: mozbugbox Date: Sun Oct 7 17:12:14 2012 +0800 Add button hotkey info to the input panel tooltip text commit 1c3d1d6be632539cbe05e5f7a51a907f4706285b Merge: 4f9689c b9cec4c Author: Caius 'kaio' Chance Date: Sun Oct 7 18:20:08 2012 +1000 Merge branch 'lookup-orient-from-table-1475' into rel20121101 commit b9cec4cef0d1ebf72a6922fd3c3a29315c0fd4eb Author: Caius 'kaio' Chance Date: Sun Oct 7 18:17:34 2012 +1000 Get default lookup orientation per table from table sources. commit 56bd4621e5f8713f790e5de0ed7b7740113bee1d Author: Caius 'kaio' Chance Date: Sat Oct 6 22:48:49 2012 +1000 WIP to get table .db files in user home directory. Path in factory.py also needs changes. commit 4f9689c395b78b22ae391d2e786f53670893bb20 Merge: 1925a75 97cee5a Author: Caius 'kaio' Chance Date: Sat Oct 6 18:16:29 2012 +1000 Merge branch 'page-size-from-table' into rel20121101 commit 1925a759c148147d508fb483a2b475cc2b3e931c Merge: 0d7670d 6d2ab57 Author: Caius 'kaio' Chance Date: Sat Oct 6 18:16:11 2012 +1000 Merge branch 'refactor-set-property' into rel20121101 commit 0d7670d32c86cd63a4f98beb05e095348607cb58 Author: Caius 'kaio' Chance Date: Sat Oct 6 18:15:11 2012 +1000 Update ChangeLog. commit 97cee5a8324ce2aca99f3465cc37a507bd8bbcf5 Author: Caius 'kaio' Chance Date: Sat Oct 6 17:35:09 2012 +1000 Add page_size property for the tables. commit 6d2ab577c41c9b07a84c049137c8184bb67f5e30 Author: Caius 'kaio' Chance Date: Fri Oct 5 10:40:47 2012 +1000 Refactor _refresh_properties() function. commit f118dba1b194a6adb6c4854da74d2fa297f077e7 Author: Caius 'kaio' Chance Date: Wed Oct 3 17:11:46 2012 +1000 Updated PO files. commit 3675a495799cfa68da825350e449c45f5ceeac68 Merge: f124c26 2cd1650 Author: Caius 'kaio' Chance Date: Wed Oct 3 17:01:32 2012 +1000 Merge remote-tracking branch 'mozbugbox/page-up-down-config' into rel20121001 commit 2cd1650663086e7a00f92a9eb7661c738351c39c Author: mozbugbox Date: Fri Sep 28 00:26:28 2012 +0800 Make page up/down keys configurable commit f124c2608e50796671ca518248dc68c716a7204d Author: mozbugbox Date: Thu Sep 27 22:45:30 2012 +0800 Fill input panel on demand. Huge GUI respond speedup Huge speedup on ibus-table GUI repsond time when using a large phrases table. Currently, all the candidate phrases are created in the input panel before shown to the users, while only 6 of the candidates actually show up on the panel. For a phrase table with a lot of phrases, the candidate list can contain more than 3000 entries, especially when only the 1st key is entried. 3000 candidates will cause 3000 input widgets being generated before the first 6 candidates were show to the users. This can make the GUI update lagging up to a few seconds depending on the speed of the CPU. This is at least O(n). In this optimzed code, only 6 candidate widgets were generated at a time. More candidate widgets will be generate on next-page/previous- page action. Now we are O(1) for the GUI part of panel update. commit 14d46a0f8cd9d565db3548166873548a0cff9f80 Author: mozbugbox Date: Thu Sep 27 22:41:25 2012 +0800 Remove unneeded sort in select_words(), speedup Since sql query statement already sorted (ORDER BY) the result, remove the unneeded sort operation. Sorting with a python compare function is terribly slow for large list. commit 2a9a21fc7da056dfd599145198f9d36b33171bd8 Merge: 4c358f7 9d8a722 Author: Caius 'kaio' Chance Date: Tue Sep 18 11:04:29 2012 +1000 Merge remote-tracking branch 'mike-fabian/acevery-master-fix-ipa-x-sampa-rhbz856903' into rel20121001 commit 4c358f755ddacf2117b91123490bad2fd85380cc Merge: e90dc05 c219fd9 Author: Caius 'kaio' Chance Date: Thu Sep 13 23:34:09 2012 +1000 Merge remote-tracking branch 'mike-fabian/acevery-master-improve-chinese-category-check-rhbz856320' into rel20121001 commit 9d8a7228fca7615b8a3b7f74f7bf8cfe7861fe8b Author: Mike FABIAN Date: Thu Sep 13 15:32:10 2012 +0200 Fix ipa-x-sampa table and phrases containing spaces in emoji-table Currently there is a regular expression which filters out several lines defining valid phrases. The emoji-table for example has phrases containing spaces which are currently filtered out and the ipa-x-sampa table has trailing comments which are filtered out as well. In phrase_parser, the phrases are parsed like: xingma, phrase, freq = unicode (l, "utf-8").strip ().split ('\t')[:3] Therefore, it seems reasonable to change the regular expression checking for a table line containing a phrase definition to accept every line which has 3 columns seperated by tabs followed optionally by more columns also separated by tabs (the optional columns are ignored, i.e. they are just comments in the table source). See: https://bugzilla.redhat.com/show_bug.cgi?id=856903 commit c219fd9aed3c24dc6405ef88991ef178caf29f91 Author: Mike FABIAN Date: Thu Sep 13 12:43:55 2012 +0200 Improve check whether a phrase is simplified or traditional Chinese The improvement is to ignore all non-Han characters when doing the check. This is to avoid classifying a simplified Chinese string as traditional just because it happens to include some non-Chinese characters, for example box drawing characters, which cannot be converted to gb2312 but happen to be convertible to big5hkscs. This fixes the problem in the emoji-table input method that most phrases cannot be input at all. See: https://bugzilla.redhat.com/show_bug.cgi?id=856320 commit e90dc055de4e5ecda91ae03144be9731c8376989 Merge: ce79966 84c287f Author: Caius 'kaio' Chance Date: Thu Sep 6 08:28:32 2012 +1000 Merge remote-tracking branch 'acevery/master' into rel20121001 Conflicts: engine/table.py commit 84c287f1a7e261c32e7b4a18d7f488ae3d78da75 Author: Yuwei Yu Date: Wed Sep 5 20:46:09 2012 +0800 exclude control characters from input range commit edd01646dca3599f1e9a838b9ab9813e1477bd3d Author: Yuwei Yu Date: Wed Sep 5 01:35:56 2012 +0800 remove repeat unichr; remove blank lines in table.py commit 50692ab9599c3845bc9f29cb0516ee78b6b0eda0 Author: Yuwei Yu Date: Wed Sep 5 01:22:55 2012 +0800 fix non-ASCII input key bug commit ce7996600810421020c6904749213b73a7eb2dff Merge: d4c5fad 3ba23ba Author: Caius 'kaio' Chance Date: Tue Sep 4 22:35:46 2012 +1000 Merge commit '3ba23ba4667818c096639acb3920b50994263ef4' into rel20120901 Conflicts: tables/additional/latex.txt commit d4c5fad5ad5bd80ad34d8e96bd1d1d48dc21973d Author: Caius 'kaio' Chance Date: Tue Sep 4 21:58:01 2012 +1000 Updated version number and ChangeLog. Rebuilt PO files. commit 3ba23ba4667818c096639acb3920b50994263ef4 Author: Xiaojun Ma Date: Sat Aug 11 15:00:27 2012 +0800 further remove 'additional' stuff commit 2b9fb58e532ea9ea51800e7e177fb9c30d0ccb8f Author: Xiaojun Ma Date: Sat Aug 11 14:38:08 2012 +0800 remove compose.db, latex.db; fix #1026 commit 1bc85cd6e72eb0e30cd413ad0f4dde65dd8fc73f Merge: 7a28618 e015065 Author: Xiaojun Ma Date: Sat Aug 11 13:16:04 2012 +0800 Merge branch 'master' of github.com:maxiaojun/ibus-table commit 7a28618143bf702ea52858df2d0a54b185e9c400 Author: Xiaojun Ma Date: Sat Aug 11 13:11:02 2012 +0800 respect language_filter property; a better way to fix #1188 commit e0150650b3fbbaf3d4b97a48d95620caa2342786 Author: Xiaojun Ma Date: Sat Aug 11 13:11:02 2012 +0800 respect language_filter project; a better way to fix #1188 commit 932abeea7511ae733d029f466260d3710a09b5e1 Author: Mathieu Bridon Date: Sat Aug 11 12:45:58 2012 +0800 trivial change commit cb0abbd63040dd37f78628d595905faabd55de7f Author: Mathieu Bridon Date: Sat Aug 11 12:45:17 2012 +0800 add language_filter property commit 6f90e9c27491f169138abde9c85350838d28104e Author: Xiaojun Ma Date: Sat Aug 11 11:42:28 2012 +0800 a better way to fix #1474 commit d752b0274768e6d593c32cefebecdc24e197dbf0 Merge: eaa6927 2c8d938 Author: Caius 'kaio' Chance Date: Thu Aug 9 17:04:33 2012 +1000 Merge remote-tracking branch 'fujiwarat/master' into rel20120901 commit eaa692761096f527c5ae7c663612cce0dbfb5b56 Merge: f3a8c98 13d3f16 Author: Caius 'kaio' Chance Date: Wed Aug 8 21:07:23 2012 +1000 Merge remote-tracking branch 'maxiaojun/master' into rel20120901 commit f3a8c98972877dee89ed51c1a0a067eb5c84b4a9 Merge: e31b470 277814c Author: Caius 'kaio' Chance Date: Tue Aug 7 23:32:23 2012 +1000 Merge branch 'menu-label' into rel20120901 Conflicts: engine/table.py commit 277814cac5d5dcd46bfb17574553a744f7a61e78 Author: Caius 'kaio' Chance Date: Tue Aug 7 21:41:20 2012 +1000 Add labels for property for self-descriptive, when menus are embedded in traybar. commit 13d3f16498efc3683d7392d5c0e2342a01f90d35 Author: Xiaojun Ma Date: Sun Jul 1 22:28:28 2012 +0800 trivial change commit 8506e81fde93c5136d63888f6408dc5a88e23b4c Author: Xiaojun Ma Date: Sun Jul 1 22:23:32 2012 +0800 add value-changed signal handler for config; prepare for #639 commit 225fe2f4477ab7798dbbb753de60a1f748646d47 Author: Xiaojun Ma Date: Sun Jul 1 11:11:49 2012 +0800 trivial change commit c3236d649a13329fdf8e5067a5421bfbb27be9d0 Author: Xiaojun Ma Date: Sun Jul 1 11:08:07 2012 +0800 add per table lookup table orientation; fix #1475 commit edf6fc4c80dc98869e5db692a3e5126996de1b58 Author: Xiaojun Ma Date: Sun Jul 1 10:41:09 2012 +0800 fix #704 commit e092b5b65393a6795361823a69959b6ab46c5eba Author: Xiaojun Ma Date: Wed Jun 27 23:18:16 2012 +0800 add per table chinese mode; fix #1188 commit d93a3ff13f69c431c851fe663138e143bfe953e7 Author: Xiaojun Ma Date: Wed Jun 27 23:01:02 2012 +0800 add per table page size; fix #1474 commit e31b4706825cbf1c1256c555323c4d87ec1610d8 Merge: e04a10b 0e89c17 Author: Caius Chance Date: Sat Mar 10 00:15:15 2012 +1000 Merge remote-tracking branch 'mvv/python-path-fix' into rel20120309 commit e04a10b15dff4b3322cbe752e99e761b372d2c5b Merge: 820ee65 418ea16 Author: Caius Chance Date: Sat Mar 10 00:14:42 2012 +1000 Merge remote-tracking branch 'mvv/coloncolon' into rel20120309 commit 820ee65a18e8f966372959bab88a542d084e0357 Merge: 6ac623b 5eef930 Author: Caius Chance Date: Fri Mar 9 23:48:09 2012 +1000 Merge remote-tracking branch 'seanf/master' into 2012-03-09 Conflicts: po/zh_CN.po po/zh_HK.po po/zh_TW.po commit 6ac623ba7b7a59b7032d1916ee53bd249801dd28 Author: Caius Chance Date: Fri Mar 9 19:06:05 2012 +1000 - Add direct input of Chinese bracket to mid-brackets and large-brackets. commit a44d50c6face110c7cd1252067eade3f8a9193e8 Author: Yuwei Yu Date: Wed Mar 7 15:16:49 2012 +0800 add _mo into locale test commit d4df7ed4c361a30f9c5d505e9ffc8b5fc7c163a7 Author: Yuwei Yu Date: Tue Mar 6 01:06:50 2012 +0800 modify locale detecting code commit 487d9b6825492498cfc1f49b66e243c2eb4c5bcf Author: Yuwei Yu Date: Mon Mar 5 08:57:08 2012 +0800 enable en_HK user to use chinese mode commit 24596c02c86a0453c59485f8b0031279803f1581 Author: Yuwei Yu Date: Sun Oct 2 11:53:53 2011 +0800 add some key for translit; fix #1318 commit 8b54742f9648366abe8690513289337a43254621 Author: Yuwei Yu Date: Mon Aug 1 23:53:46 2011 +0800 add NOSYMBOL to be a null target phrase commit 5eef930473edc31588444762bbbda5273fc6feff Author: Sean Flanigan Date: Tue Jul 26 17:31:19 2011 +1000 modify English text for clarity commit 418ea16b60614657285d23e31b511c41185322f8 Author: Mikhail Vorozhtsov Date: Sat Jun 18 17:10:31 2011 +0700 Added \coloncolon to the LaTeX table. commit 0e89c1738bf7722e1bd39c00b9d7f8e9214a05c5 Author: Mikhail Vorozhtsov Date: Sat Jun 18 16:20:49 2011 +0700 Use Python executable found by autotools in scripts. commit 4a35882e82c8d879252e4518974feba60ba802c1 Author: Yuwei Yu Date: Wed Apr 27 10:14:43 2011 +0800 update reg pattern in tabcreatedb.py to allow leading or trailing space in tab separated columns commit 2a1bb20de7fd3373d1c9bf1d7f5305a93d663cf9 Merge: 1850d89 8d6e9ff Author: Yu Yuwei Date: Tue Apr 26 18:39:25 2011 -0700 Merged pull request #4 from sagara-/master. Bugfix for issue 787 commit 8d6e9ff11307d05d336f696ceffa02ffb0a9cb8b Author: Kevin Tardif Date: Tue Apr 26 17:50:20 2011 -0400 Added detection of invalid table names - detects NAME attributes in table specifications that violate GConf keyname restrictions - see issue 787 (http://code.google.com/p/ibus/issues/detail?id=787) for details commit 1850d891300ce777b474d782b347ea1b05b8a7cc Author: Yuwei Yu Date: Fri Feb 18 08:50:57 2011 +0800 update latex.txt from Giuseppe Castagna (gc@pps.jussieu.fr) commit 1e3e9139378e751570e3046bc1bfa27e6517b70f Author: 余钰炜 Date: Thu Dec 30 23:51:35 2010 +0800 update README; fix pinyin mode under direct commit mode commit 932f8b25737ace30859abac8972adb381c7287ab Author: 余钰炜 Date: Tue Dec 7 10:20:02 2010 +0800 add goucima use non chinese character commit ea4397b69cc63572bdb8f42478bbe319bfab95d3 Author: 余钰炜 Date: Thu Nov 11 16:35:17 2010 +0800 fix remove before char bug commit 1c51b7bdcdcb59bdfaf7f050eeb84316b2551f0e Author: 余钰炜 Date: Sun Sep 12 23:12:20 2010 +0800 fix config saving bug in Cangjie commit c7de864861c1259409c97fe4d8d6634c46383cef Author: 余钰炜 Date: Mon Sep 6 18:12:34 2010 +0800 fix py_mode tabkey length bug commit 8790fc860ee043168c3995e78cd070e0ffee4f19 Author: 余钰炜 Date: Sun Sep 5 00:34:06 2010 +0800 fix py_mode update bug commit b95f174efe70dc39d9558a9fb13903b48753ba1a Author: 余钰炜 Date: Tue Aug 31 15:52:59 2010 +0800 little hack to allow ibus-table to import space in gvim commit f64cf33e2e40a6b78338cf3c6f6f8fde51c5d146 Author: 余钰炜 Date: Sun Jun 13 08:43:23 2010 +0800 comment out a debug print commit c42319f81d63f5e4bf6dedaf12e130bfd26f2b20 Author: 余钰炜 Date: Wed Apr 7 15:32:08 2010 +0800 fix typo in issue836, thanks fujiwarat commit 2c8d93828af175bf06a0b30dc1146547005f70f4 Author: fujiwarat Date: Tue Apr 6 13:03:14 2010 +0900 Fix self.db._is_chinese in table.py by issue 836 commit 57e985f1748d9376be2c4c77854fb273579d7058 Author: 余钰炜 Date: Mon Mar 29 23:29:45 2010 +0800 fix phrase rule parsing for p-11. see issuse 827 commit ac190e3990bb03f52091cdce8e98093e0c1fd135 Author: 余钰炜 Date: Fri Jan 8 15:41:01 2010 +0800 only extract first 3 element from table source commit c6a36522c5db68d67c90599d1a608663901aefab Author: 余钰炜 Date: Fri Nov 13 10:31:51 2009 +0800 remove speedmeter from am commit 26eb25fa9b7f8469ab9d1fc0f8b4e3330be48dc0 Author: 余钰炜 Date: Fri Nov 13 10:08:27 2009 +0800 remove speedmeter, which cause ibus hang; commit 170e0934de4e3e2a1a4b72f9bd4a3f7998c53554 Author: 余钰炜 Date: Mon Oct 19 09:27:20 2009 +0800 improve ibus-engine-table file commit ae527927f8d9895b026f87567084bb23b12a61ac Author: 余钰炜 Date: Mon Oct 19 07:43:55 2009 +0800 add START_CHARS to latex engine commit 8066019f30926c971361c4e9a78033daa761fb39 Author: 余钰炜 Date: Mon Oct 19 07:35:07 2009 +0800 fix typo in tabsqlite; fix broken behaivor in latex engine. commit d06720dd03032a66af791af5183827830a6ddb68 Author: 余钰炜 Date: Sun Oct 18 11:11:31 2009 +0800 fix pkelen type error which cause latex engine encounters error commit a57878713c8c8477cf2221c7c8cd9c868f6cf79b Author: 余钰炜 Date: Wed Oct 14 13:46:17 2009 +0800 fix issue 584, thanks Huang :) commit 96722e02aafcf096f71dacdbbb3e9970edc91626 Author: 余钰炜 Date: Wed Oct 14 13:28:20 2009 +0800 output when no db under tables dir commit 24852aba91f14006c924e70d7699cc941164908c Author: 余钰炜 Date: Sun Sep 27 15:24:08 2009 +0800 fix bug in tabsqlitedb, which stop ibus-table to start commit 9d64913a4c17ad368a10590f604406659cdc06ac Author: 余钰炜 Date: Sun Sep 27 15:10:22 2009 +0800 add least_commit_length to db, which allow "autocommit" feature in Compose IME commit 92524c12444354025690d30c0c7f861a7d883096 Author: 余钰炜 Date: Fri Sep 25 22:31:11 2009 +0800 add acknowledgement for Ye, Yuan commit 2ccb94af0e2c575c1b327a95854e70f359e78a88 Author: 余钰炜 Date: Fri Sep 25 22:26:23 2009 +0800 add some key use - and = back to compose.txt; change max_key_length to 3 in compose.txt commit b965e5204644c0aa310149fd7429a589f3caed0b Author: 余钰炜 Date: Fri Sep 25 22:04:27 2009 +0800 fix bug in tabcreate.py to allow = as input key; improve table.py to allow filter out =/- from page_down/up keys commit d0909f926112284db508e338aabbc0a82ce1f0ec Author: 袁野 Date: Fri Sep 25 16:45:13 2009 +0800 compose: add more characters Add more characters, most important a-z, A-Z and German letters. Also avoid using - and = in input keys, as they are default page chage hotkeys. Signed-off-by: 袁野 commit 05373eafe0f5a171222e52922b29dc3852d7508d Author: 余钰炜 Date: Sat Sep 12 22:37:06 2009 +0800 fix typo... commit d3739a81ddf14d2344053feff92afde2485a3f75 Author: 余钰炜 Date: Sat Sep 12 14:38:43 2009 +0800 Save user config to gconf module :) commit dc4bebd5c459226c2cde3c55cc723a0ec7b96e25 Author: 余钰炜 Date: Fri Aug 21 22:02:36 2009 +0800 allow use last code in phrase construction commit 0d5f89654244fa90cff877537b6dc127baffd9e7 Author: 余钰炜 Date: Thu Jul 30 20:05:42 2009 +0800 try to fix spec.in commit d64df85de06b3b2074b5f4926b93c076ba5a08c1 Author: 余钰炜 Date: Thu Jul 23 02:07:53 2009 +0800 fix a editor.commit_string bug commit 1fd5242306b954787a28d4ae2afeda392b835b6f Author: 余钰炜 Date: Fri Jul 17 02:43:01 2009 +0800 do not recreat index when load user_db commit 19d8c81b2bf70e6b57a2513e5f1cce476324863e Author: 余钰炜 Date: Thu Jul 9 22:43:36 2009 +0800 do syncing after normal return from MainLoop.run() commit 77da827f603e70b2d6c0578f460a490c665fafbf Author: 余钰炜 Date: Mon Jun 22 23:13:03 2009 +0800 add SIGINT handler for ibus exits sync commit 1522707acceec09a8f0bbf6fef0df4ff3b5b0b3a Author: 余钰炜 Date: Mon Jun 15 16:39:21 2009 +0800 update to ibus-1.2.0 commit a6679cd443365abf792895cd0f9ffc84acf5c784 Author: 余钰炜 Date: Mon Jun 15 00:57:44 2009 +0800 update process_key_events as ibus commit 7e41759b9ea37b7ede5da541d4599333de1182b7 Author: 余钰炜 Date: Mon Jun 15 00:41:51 2009 +0800 fall back for ibus-1.1.0.20090612 commit 19d6cdf9348e4ba6cb18a50e6c07fb349dd7e8cf Author: 余钰炜 Date: Mon Jun 15 00:29:28 2009 +0800 port to new process_key_event commit 83b433d3f696601413a5a5afa2d18c189290116e Author: 余钰炜 Date: Tue Jun 2 12:08:09 2009 +0800 update compose.txt commit 8dd226c87542f3f1c1f237bf81972970f2f611f6 Author: 余钰炜 Date: Tue Jun 2 12:03:20 2009 +0800 update icons/Makefile.am; update template.txt commit 4d07083b7fac8372f942ebfe064ad269a20e507b Author: 余钰炜 Date: Tue Jun 2 11:58:56 2009 +0800 rename direct_commit to auto_commit; allow auto_commit with one candidates in non-Chinese IME commit a2eaa3b6b1e4e443916590fd64b0c68e131abf1e Author: 余钰炜 Date: Mon Jun 1 10:37:47 2009 +0800 use LANG as LC_CTYPE fallback commit 366761995e13b8df21db2bcfa3e16c8b9a0a0c6f Author: 余钰炜 Date: Sun May 31 23:41:00 2009 +0800 fix fresh new ibus-table startup failure commit 1bb92eeef08e275998d323908fe34af2ade017f2 Author: 余钰炜 Date: Sat May 30 15:38:25 2009 +0800 merge from kaio.git; fix tabsqlitedb.compare, which cause wrong ordering in tabsqlitedb.select_words commit 638275afccc68bb3c397f2a3953034912ca158c0 Author: 余钰炜 Date: Tue May 26 11:16:45 2009 +0800 merge from kaio.git commit c07348108b6fc4b17ca617a06d76f2637edfa491 Author: 余钰炜 Date: Tue May 5 01:12:45 2009 +0800 fix user phrase check bug commit 96f89769c5c1365802ab495335e7fc52e6235aab Author: 余钰炜 Date: Fri May 1 23:30:14 2009 +0800 allow the create_engine to fail commit e3b22b14602b55a5054a0224834eac7e24a8049e Author: 余钰炜 Date: Fri May 1 22:59:52 2009 +0800 replace all invalid character in engine_path to under_score commit 490daacfdee8aa5f9af1e67a6ef3c90fd649bb7c Author: 余钰炜 Date: Fri May 1 22:04:20 2009 +0800 replace the "-" to "_" in engine_path commit 751296ceede357d5010864298f21e408446ed751 Author: 余钰炜 Date: Thu Apr 30 16:14:41 2009 +0800 add sigterm handler to sync userdb commit 1c792bcb904df77c4873302e2042abca8eb19d94 Author: 余钰炜 Date: Wed Apr 29 11:32:39 2009 +0800 fix pinyin mode bug commit 3fab1911c5055505dced11842555f07d050e5e9e Author: 余钰炜 Date: Wed Apr 29 01:04:03 2009 +0800 fix xml mode bug cause by debug commit 6a13b9a02919f011ec83e7e78968945d379c4c4f Author: 余钰炜 Date: Wed Apr 29 00:53:28 2009 +0800 redirect stdout,stderr to debug.log; readd arrow_up, arrow_down for candidates selection commit b21289c1af9301ad9f8a398db35870380d2b392b Author: 余钰炜 Date: Fri Apr 24 13:42:34 2009 +0800 remove the id from user_db.desc commit 8b2e0db12ddf5c2a72111187c40c3fb999345176 Author: 余钰炜 Date: Thu Apr 23 14:55:56 2009 +0800 fix check_phrase bug, which caused by recording tabkeys commit 9a5602a8a90fc4e4a5dc826720d15ce07570aabd Author: 余钰炜 Date: Wed Apr 22 14:38:31 2009 +0800 support record user_freq of phrases with user inputted keys; fix bugs cause by last commit commit da76aa709497859a6e3989637429331ee249eeb6 Author: 余钰炜 Date: Mon Apr 20 20:57:29 2009 +0800 add id key in db to allow better phrase ordering. Users need to regenerate the .db files. commit 1e894cf358814f0972159b9bd44fc282dad387c6 Author: 余钰炜 Date: Thu Mar 12 16:42:57 2009 +0800 fix digit ignore when digit in valid_input_chars commit d819c40a693b7afbe8c8ec4cbf3faf678ffd8a5d Author: LI Daobing Date: Sun Mar 8 22:14:50 2009 +0800 fix order in pkgconfig commit 8ef53eb84c9866e77bcc9c28940b98b9972ca274 Merge: 768e4b8 e926b14 Author: 余钰炜 Date: Fri Mar 6 14:19:01 2009 +0800 merge from kaio'tree commit 768e4b851b4b7d6f542fc11d424f2bf483a7f1d6 Author: 余钰炜 Date: Fri Mar 6 14:08:00 2009 +0800 update Changlog commit a8e019d4582db1d9142a1efbecd945c4470b3fb0 Author: 余钰炜 Date: Fri Mar 6 14:07:12 2009 +0800 add Caius into project commit e926b14b0718c3e02df28d1efd5490a715b7d9e9 Author: cchance Date: Fri Mar 6 15:23:47 2009 +1000 make pkgconfig noarch commit 193267080c33cd7aed19151f9199fbb35807d86b Author: cchance Date: Fri Mar 6 15:17:13 2009 +1000 Corrected .spec form GPLv2+ to LGPLv2+. commit b7f63b016d148991cade9c62ea61254fbd390e87 Author: cchance Date: Fri Mar 6 14:57:42 2009 +1000 Updated author list. Manually generate ChangeLog with `git log > ChangeLog`. commit a3f8a4667ace5be764973857f6833fff196d66e5 Merge: 2b0726c fe3f5dc Author: cchance Date: Fri Mar 6 14:39:46 2009 +1000 Merge commit 'acevery/master' commit fe3f5dc73f9b7f3655ab15c4cf52e8fac9dbef1d Author: 余钰炜 Date: Wed Mar 4 15:27:46 2009 +0800 hide speedmeter when engine is destroied commit df131abd2a9a71478437d2efccc8c22f44e19a62 Merge: 728bf4c 6b7ed8a Author: 余钰炜 Date: Wed Mar 4 00:47:54 2009 +0800 Merge branch 'master' of git@github.com:acevery/ibus-table commit 728bf4c45ccf1dd79e8afac937f2291b03cbfff4 Author: 余钰炜 Date: Wed Mar 4 00:44:12 2009 +0800 fix error included by last commit commit 69027a7aa8e5ca40ad67fe6e6afe11ae896cfa3b Author: 余钰炜 Date: Wed Mar 4 00:38:45 2009 +0800 fix -t .db mode bug commit 6b7ed8ab2ab27daef9656be741d667cfbf7a007a Author: Huang Peng Date: Sun Mar 1 11:17:31 2009 +0800 Test more arguments in ibus-engine-table script. commit dbdbbc6df91672f12748db17261dcf9789a2a909 Author: 余钰炜 Date: Sun Mar 1 08:11:55 2009 +0800 fix ibus-engine-table --xml bug commit c18330f7933e2c972b16a1cde4420d18d9fca21e Author: 余钰炜 Date: Mon Feb 23 19:29:32 2009 +0800 fix a bug reported by Wenping Guo commit 3780ce03d1cd430aab8ddb359541a046a5ce557f Author: 余钰炜 Date: Mon Feb 23 19:09:01 2009 +0800 hide speedmeter as default commit 95b2ae32e6a555c39a16dead658df0d08ce518cc Author: 余钰炜 Date: Fri Feb 20 23:11:57 2009 +0800 put sm.Quit() into try commit ded9214f0ec7fa1577a11d62211886984e0d4ff7 Author: 余钰炜 Date: Fri Feb 20 23:08:26 2009 +0800 fix ime_property cache bug commit 8e062065efff58de5303c3f96c4b49fbb279d394 Author: 余钰炜 Date: Fri Feb 20 22:47:56 2009 +0800 improve db file usage, try to fix issue271 commit 8c0d24fc98dd8ca68ce6aaf69362ebf2c61cb838 Author: 余钰炜 Date: Fri Feb 20 09:40:01 2009 +0800 add ctrl+' as hotkey to show/hide speedmeter commit 111eb3fa30d801c58871713ee269e81395d5d29d Author: 余钰炜 Date: Fri Feb 20 08:48:35 2009 +0800 fix xml generating bug with cangjie and erbi commit 1956d74253fa861283e09f6bced3ca401529e344 Author: 余钰炜 Date: Thu Feb 19 21:16:09 2009 +0800 use xml.etree instead of elementtree commit 2b0726ce00c2a9512d58b90cb94e3b95481a1ec1 Merge: 3a5330a e8ccd01 Author: Caius "kaio" Chance Date: Thu Feb 19 15:06:06 2009 +1000 RE-Merge commit 'acevery/master' Conflicts: doc/Makefile.am engine/Makefile.am engine/table.xml.in.in commit e8ccd0137d01f615dbd92fce41d1d49b77d39796 Author: 余钰炜 Date: Wed Feb 18 21:58:16 2009 +0800 fix typo commit 14e38433a759baf4d4559bfbbd0a598e310eea4f Author: 余钰炜 Date: Wed Feb 18 21:45:16 2009 +0800 add ibus version check commit 7742e4bb009d3872d38c888780fbf16b823fc127 Author: 余钰炜 Date: Wed Feb 18 21:36:24 2009 +0800 fix table/additional/Makefile.am commit 8b70a1596ad2802762394b358306f1280cfe3244 Author: 余钰炜 Date: Wed Feb 18 21:29:35 2009 +0800 update po commit 80fb3ff178e3bb85f759e1a9e9edf8969bcb13df Author: 余钰炜 Date: Wed Feb 18 21:27:14 2009 +0800 add Ctrl+; as chinese input mode hotkey commit 6fcc3a567746ab3fa17896dd46b873979cb36349 Author: 余钰炜 Date: Wed Feb 18 20:59:22 2009 +0800 fix speedmeter.py bug; readd latex.txt commit cb4192fc781003d04ca944e44cc21a497b337cec Author: 余钰炜 Date: Wed Feb 18 18:31:18 2009 +0800 update template.txt commit 9df5d19dab9762bd99caae496a0d5f5c4b2f194c Author: 余钰炜 Date: Wed Feb 18 16:55:52 2009 +0800 prepare to release commit 92103167a6ea103326d1dd00800e8f1a0c864bae Author: 余钰炜 Date: Wed Feb 18 15:52:16 2009 +0800 fix do_destroy bug commit 0193d86ae74ac34ee56d0038f426ffc759eb099a Merge: f7c1977 7c786b6 Author: 余钰炜 Date: Wed Feb 18 10:59:42 2009 +0800 update for ibus-1 commit 7c786b6d0e7e99252aa21ed7a5b3ede56e7fe654 Author: 余钰炜 Date: Wed Feb 18 10:14:08 2009 +0800 fix @VERSION@ commit e3a96308977de55853e0b6255f56d07572e5cdf6 Author: 余钰炜 Date: Wed Feb 18 10:07:34 2009 +0800 try to fix the xml eval bug commit 03db85e55a1b9c0ce5a4999ade7130e4a2195319 Author: 余钰炜 Date: Wed Feb 18 00:23:57 2009 +0800 fix configure.ac commit 0a0be88c6e33331491c50682fd13f550602af80b Author: 余钰炜 Date: Wed Feb 18 00:16:58 2009 +0800 step 4 commit 47f49932beac875f82fe93fc2b5ee9337c8e2d91 Author: 余钰炜 Date: Tue Feb 17 23:05:45 2009 +0800 step 3 commit 3a5330ace95f39020407492cdedf4262614a3042 Merge: f8b80b8 ffa04fe Author: Caius "kaio" Chance Date: Mon Feb 16 18:11:05 2009 +1000 Merge commit 'acevery/for_c_ibus_daemon' Conflicts: configure.ac data/Makefile.am doc/Makefile.am engine/Makefile.am engine/factory.py engine/ibus-engine-table.in engine/main.py engine/speedmeter.py engine/table.py icons/Makefile.am icons/additional/Makefile.am tables/Makefile.am tables/additional/Makefile.am commit ffa04fe490dd89a0ef8de2335ef5ad8971a2c265 Author: 余钰炜 Date: Mon Feb 16 00:07:01 2009 +0800 second step for ibus-1 commit f8b80b85b7a774a734720dd973574b9b77dee482 Merge: b1a8593 198cf85 Author: Caius Chance Date: Mon Feb 16 01:37:05 2009 +1000 Merge commit 'lidaobing/master' commit b1a85938c0aa38db91fb4d0c4f3835e7e4d9a3c0 Author: Caius Chance Date: Mon Feb 16 00:50:20 2009 +1000 added table spec xml commit 24f5090106d6c7ea8ec203bc428654d9db0b64de Author: 余钰炜 Date: Sun Feb 15 21:00:40 2009 +0800 remove something outdated commit bf272e43758e90a95ff8cda2c0256b3c02760ac5 Author: 余钰炜 Date: Sun Feb 15 16:26:11 2009 +0800 first step for ibus-1 commit e5ff74536114bde07ea4667921518f107c72f2e1 Author: 余钰炜 Date: Tue Jan 27 20:53:45 2009 +0800 fix pinyin mode bug when come to pinyin like "xiong" commit f7c1977a430bce98ceeb6ca2bfe01a4fe6c45b33 Author: 余钰炜 Date: Tue Jan 27 20:50:48 2009 +0800 fix pinyin mode bug when encounter pinyin like "xiong" commit c8784688bdb663440617117937bb6cde3387f758 Author: 余钰炜 Date: Mon Jan 5 18:20:06 2009 +0800 add maintainer mode; update pinyin to unihan 5.1 commit 497435380d9c3cfaccc563cff298802dcc78c838 Author: 余钰炜 Date: Mon Jan 5 18:12:33 2009 +0800 * Add Maintainer Mode; * update pinyin_table.txt.bz2 from Unihan Database 5.1 commit fa77370f08301b975277bc2ddb29547688dcbeda Author: 余钰炜 Date: Sun Jan 4 20:38:59 2009 +0800 fix License conflict commit 11f2139b46a8a8f11369965edbab0f30894052a3 Author: 余钰炜 Date: Sun Jan 4 20:06:56 2009 +0800 update README about new keys in PinYin mode commit b53e47565fc136f76a88f7dd0d76910c3243ede6 Author: 余钰炜 Date: Sun Jan 4 19:41:09 2009 +0800 remove latex.txt commit 5bc53da3bbe70a1b429833a4562fb058b4c8d74d Author: 余钰炜 Date: Sun Jan 4 19:40:28 2009 +0800 remove latex.txt commit ac65a87869cf4e7958c0c35e2d823859a5c8e9d4 Author: 余钰炜 Date: Sun Jan 4 17:28:49 2009 +0800 use new pinyin_table commit 6e5e93676bfbbfbcca9aaf1bade658a2269f7a33 Author: 余钰炜 Date: Sun Jan 4 19:10:22 2009 +0800 use new pinyin_table commit e279dde95643f76a6d70162e58dd472baa957864 Author: 余钰炜 Date: Sat Jan 3 23:31:21 2009 +0800 fix License conflict commit 198cf85c7ec2f498a95f49e49fd4af8ebce834c4 Author: LI Daobing Date: Sat Jan 3 14:52:37 2009 +0800 fix typo in README ChangJie -> CangJie commit 3d4042fd2ff4072ef29a1b806b88aadd018b0206 Author: 余钰炜 Date: Sun Dec 28 21:59:13 2008 +0800 fix focus bug commit cf3ca9b8f56843c4ebab2eafead986f6fc079b83 Author: 余钰炜 Date: Sat Dec 27 16:01:41 2008 +0800 port to ibus c daemon commit 2ee28efac54a3cc64c09d276e28085e60aee2025 Author: 余钰炜 Date: Wed Dec 17 00:54:29 2008 +0800 * fix get_preedit_string bug commit 246c8f0ead0b2c719b197c61ba23c71452fcbcd1 Author: 余钰炜 Date: Wed Dec 17 00:38:24 2008 +0800 * fix auto_commit bug under one candidate * fix get_preedit_string bug commit f4b959fc1028a45bd02c71937dbd3878a58869cc Author: 余钰炜 Date: Sun Dec 14 23:16:18 2008 +0800 Add MAINTAINERCLEANFILES commit bd3b567cdf86583b76c3f0f5241420fa2ce74bd1 Author: 余钰炜 Date: Sun Dec 14 21:38:44 2008 +0800 fix additional table icon bug commit 65a39b547317ed0cec1f7743d63d1ee4ebe1b8f6 Author: 余钰炜 Date: Sun Dec 14 16:25:05 2008 +0800 reset speedmeter when enable IME commit a06375e46132a020d8115e57121b38c7d99df14c Author: 余钰炜 Date: Fri Dec 12 12:10:13 2008 +0800 fix select_words but under Chinese filter commit 5eb048ee35e6e382ca5d281fac6cc303112dcfea Author: 余钰炜 Date: Thu Dec 11 01:03:40 2008 +0800 * use 60s as speed calculation time span * daemonize after dbus name checking commit 4783a0cbb63bade2c725da298ce473aeb7581d82 Author: 余钰炜 Date: Thu Dec 11 00:37:55 2008 +0800 add daemonize in speedmeter.py commit 0bc6cc3d88f1614b68f7d2eb4f91b235db63daec Author: 余钰炜 Date: Wed Dec 10 14:43:50 2008 +0800 modify icons commit c931507238526213b23f0278ab98ea93e2942d11 Author: 余钰炜 Date: Wed Dec 10 12:58:13 2008 +0800 fix gdk.Color init way, allow low version of gtk+ commit 3e699f3d45eb14c52a63d0225d8b51b7031a1b38 Author: 余钰炜 Date: Wed Dec 10 04:22:24 2008 +0800 record and restore SpeedMeter position when Hide/Show commit b503315133efa40a5a0c903b94414874f90917e8 Author: 余钰炜 Date: Wed Dec 10 03:39:46 2008 +0800 hide speedmeter when start commit 5acd9b0ac05f68d5a1f66d2fc7fbc39f254c3530 Author: 余钰炜 Date: Wed Dec 10 03:12:39 2008 +0800 Add speedmeter.py to calculate the input speed for user, and display it in a small widget via gtk+ and dbus :) now, we only take the the characters from tables into account, not include the punctuation After 3 days' learning about dbus-python and pygtk, Finally, complete my first GUI work, the speedmeter.py. Although it is very very tiny and simple :D commit d105e02394d7c74838173131933efe27ffcd4e96 Author: 余钰炜 Date: Sun Dec 7 13:30:24 2008 +0800 migrate user phrases to new user_db commit 33069172b63d0ca40b6ec69d325561fe12ff4f6b Author: Huang Peng Date: Fri Dec 5 16:24:05 2008 +0800 Remove tables from ibus-table. commit 35ca25ea97c083dccc6ce5de2f0b045047adc4ca Author: 余钰炜 Date: Fri Dec 5 14:48:11 2008 +0800 remove icons as well. commit 6bc4c99ae1067b7ca064f64d49e7a31bcf7a89fc Author: 余钰炜 Date: Fri Dec 5 14:45:58 2008 +0800 split Chinese tables out commit 05913922b0c8380526db4ffd34e356946ad60db5 Author: 余钰炜 Date: Thu Dec 4 16:44:51 2008 +0800 add $extradatadir in .pc commit 08ada5d9461c9b36fff4e0154f2983bb186b6ef2 Author: 余钰炜 Date: Thu Dec 4 16:35:19 2008 +0800 use pkgconfig to record metainfo commit 719c4f5dc8b30df8f95b4d0ade2dd464baef4b32 Merge: 814fd89 ea21559 Author: 余钰炜 Date: Wed Dec 3 21:43:38 2008 +0800 Merge branch 'master' of git@github.com:acevery/ibus-table commit ea21559409fa2210e9f9a9c58c960d951ff6da4e Author: acevery Date: Wed Dec 3 17:00:22 2008 +0800 fix direct commit bug; do not show cursor now and do not use arrow_up/down to move cursor in lookup_table commit 814fd89b777668515a72dfd56c246091a6162ae2 Author: 余钰炜 Date: Tue Dec 2 23:27:45 2008 +0800 allow specify icon file with runtime commit 59ae5f81c243b6b94161ca9d92f68e9805e1a227 Author: 余钰炜 Date: Tue Dec 2 22:44:37 2008 +0800 allow specify table database with abs path commit 55abf4d76d6aae602f86c33c6f1e6b3d76491329 Author: 余钰炜 Date: Tue Dec 2 20:01:04 2008 +0800 update_ui after arrow_up & arrow_down commit a0ed04e852259b058c7e9a26fe7f32e6853b9b8b Author: 余钰炜 Date: Tue Dec 2 15:31:12 2008 +0800 fix icon Makefile.am, fix a bit in wubi86.txt commit 51009d46e74121cc5e9cc37b5d35aae2c3efa08b Author: 余钰炜 Date: Tue Dec 2 09:20:47 2008 +0800 fix cm_mode property bug commit 2997f327acf3c2e2f4b95b861f8189cfa65c72f3 Author: 余钰炜 Date: Sun Nov 30 13:06:47 2008 +0800 fix duplicate chars in zhengma.txt commit c40588c5f92eecf9cd7a39fe9f4c04a84dab48e4 Author: 余钰炜 Date: Sat Nov 29 21:02:40 2008 +0800 fix pinyin mode bug, call update_ui before commit_string commit 59f65b0e5ab973d3e6ce36b14312d64e4ccafaaa Author: 余钰炜 Date: Sat Nov 29 15:22:35 2008 +0800 put back the two incompatible phrases into wubi86 only commit 69fc666c94d504f85a5bf4f3b38caa4691b637a3 Author: 余钰炜 Date: Sat Nov 29 14:59:08 2008 +0800 remove incompatible phrases commit 404fbcb0be0f22588d1a49b0ea3223a397c55f2b Author: 余钰炜 Date: Sat Nov 29 12:52:27 2008 +0800 update wubi86 and cangjie5 tables commit e48ffc05548489d1e29414b30a1e3b2761cc23b2 Author: 余钰炜 Date: Sat Nov 29 12:47:29 2008 +0800 Add Chinese punctuations and other un-need-checked chars into tabdict commit 68ec5e8295aab51a2404e2b77f7b0890cff8392b Author: 余钰炜 Date: Sat Nov 29 09:55:25 2008 +0800 fix filter_candidate bug commit af5bda974cde8436f4ac4523ddc1c33e96bc2369 Author: 余钰炜 Date: Sat Nov 29 09:21:44 2008 +0800 group 〇 as Simplify Chinese as well commit 0fbf8fb630362bada3a5353e04e801c87b8ce26c Author: 余钰炜 Date: Fri Nov 28 17:09:12 2008 +0800 update canjie5 table by issue 158 commit b74d405ea55038032e884a02835ba28fc781ab9f Author: 余钰炜 Date: Wed Nov 26 21:50:45 2008 +0800 Update zh_CN.po commit 9a694d934f89f2c6194a41115910e104f8268cac Author: 余钰炜 Date: Wed Nov 26 21:50:06 2008 +0800 fix remove_phrase bug cause by "category" key commit dcdef990b0744511f83981d2b5a1e6c24686bbe7 Author: 余钰炜 Date: Wed Nov 26 11:39:25 2008 +0800 fix chinese mode bug in check_phrase, add normal big charset mode commit 0b88176c15283511a3445d8d8a5359b55f5b54f7 Author: 余钰炜 Date: Wed Nov 26 11:18:33 2008 +0800 reset after change Chinese mode commit b3975772916c2d3854d53ec7093f05114bd783a8 Author: 余钰炜 Date: Wed Nov 26 11:06:27 2008 +0800 fix a bit logical miss :) commit b56ec3280ffc7d39bb0c9e709972c0f52b287e64 Author: 余钰炜 Date: Wed Nov 26 11:02:48 2008 +0800 Add Simplify/Traditional Chinese input mode commit 663223e93ddf3dea3f9fbf4e28cfa3d6c1a49361 Author: 余钰炜 Date: Wed Nov 26 02:26:08 2008 +0800 fix bugs come along with \"category\" key, fix sys.stderr bug, fix lookuptable color bug commit 439ea7577c35729f09426efaad26a9612f097dd2 Author: 余钰炜 Date: Tue Nov 25 00:13:56 2008 +0800 add category bitmask integer into phrases table commit 36972649aff0807404635b9cbb8082a3374fe1d7 Author: 余钰炜 Date: Mon Nov 24 22:19:28 2008 +0800 replace tab with 4 space commit 55bcbdf5c2298d0b269b222eaf6b62a77d82b29a Author: 余钰炜 Date: Sun Nov 16 13:18:27 2008 +0800 use possible phrase key lengths to determine commit or not, fix some phrase in extra_phrase commit 1f54e735af72265e768805837d5f2027e9f93ca5 Author: 余钰炜 Date: Sat Nov 15 20:47:47 2008 +0800 add CJK-B, CJK-C support for ZhengMa commit aa0284854899a0dba613fcf307b2cb28653151e0 Author: 余钰炜 Date: Sat Nov 15 20:34:08 2008 +0800 fix pharse_phrase bug when no goucima available commit da9f8c4a0c41e44869dad084ce476f7582f7d586 Author: 余钰炜 Date: Fri Nov 14 20:24:29 2008 +0800 fix COPYING and update README commit 0a5c3224405d06866b77a107282d8b9657c8a559 Author: 余钰炜 Date: Wed Oct 29 19:21:59 2008 +0800 fix contrl+space bug commit cbe11141cc1c762de1c008df40d4db2230f3b954 Author: 余钰炜 Date: Thu Oct 23 00:31:23 2008 +0800 support punctuation direct commit in IME like ErBi commit fafda37d74eb293117281c145e98e9fde9ac4b82 Author: Huang Peng Date: Fri Oct 17 15:34:01 2008 +0800 Add some new icons in spec file. And rename extra_phrases file name. commit 5d58230816adad3dd56a243a2cccc5d0475065e0 Author: 余钰炜 Date: Thu Oct 9 21:59:35 2008 +0800 fix add_phrases logic error commit b869de8b79de16e17a80acf0c576eb084d0b5a25 Author: 余钰炜 Date: Thu Oct 9 21:30:13 2008 +0800 fix typo commit d65231aafa3fd5707b2f8d2555ad030bb6ba5f20 Author: 余钰炜 Date: Thu Oct 9 20:56:05 2008 +0800 apply hashao's patch commit 6afe7a0933e97223a1cf5d6cc6ef07b191e5fc92 Author: 余钰炜 Date: Tue Sep 23 09:44:58 2008 +0800 fix extra_phrase rename error in Makefile.am commit 74107088584f5b8fc8e60a1c94f0e5e69172b1b1 Merge: 5a6a517 ed88e42 Author: 余钰炜 Date: Mon Sep 22 21:03:04 2008 +0800 Merge branch 'master' of git@github.com:acevery/ibus-table commit 5a6a517e719c3d017b94067e5c5c457bd449447a Author: 余钰炜 Date: Mon Sep 22 21:01:28 2008 +0800 compress extra_phrase.txt commit ed88e422aecd3cf4d6e4b4671785e9f3d35743f1 Author: Huang Peng Date: Sat Sep 20 08:03:10 2008 +0800 Fix syntax error. commit 5afe835152ff9a363536e45187645a8be1eac708 Author: 余钰炜 Date: Thu Sep 18 22:47:50 2008 +0800 fix a direct commit bug commit 8b0b8f773146f2212a8e700ac1093dff96060cda Merge: 8760d94 bcf8109 Author: 余钰炜 Date: Thu Sep 18 22:44:56 2008 +0800 Merge branch 'master' of git@github.com:acevery/ibus-table commit bcf8109b174f170562a1c9e9b4a9ce6c9818ff0e Merge: b07dbaf 40eda9c Author: Huang Peng Date: Sun Sep 14 16:44:56 2008 +0800 Merge commit 'acevery/master' commit b07dbaf7de9092213b5ec84635d08b1fc9c5ea43 Author: Huang Peng Date: Fri Sep 12 07:52:12 2008 +0800 Add debian packaging files by 一叶 . commit 8760d94ddcc5063a1433a7eed994cd85883f509d Author: 余钰炜 Date: Fri Sep 12 00:28:54 2008 +0800 use new Cangjie5 icons as Caius Chance provided commit 40eda9c1fe2e93f3f6fe352a84c45d908aeec303 Author: 余钰炜 Date: Thu Sep 11 21:27:14 2008 +0800 fix user_define phrase related bugs commit 635fbae81756548cb30bbf39e0ee2f6621f3faeb Author: 余钰炜 Date: Thu Sep 11 11:00:47 2008 +0800 fix max input length error commit f2d8600ac8164d29c6a3f97074b94111ac40da16 Author: 余钰炜 Date: Mon Sep 8 07:36:09 2008 +0800 fix typos, fix invalid input bug commit 275c364a2738bbf4e83cc9ade6c93cf4ffd4055d Author: 余钰炜 Date: Sun Sep 7 02:25:16 2008 +0800 enhance direct input mode and fix some bugs commit f3ff6b02ab4158c2871cd004a84e4040f883ea81 Author: 余钰炜 Date: Sat Sep 6 14:08:32 2008 +0800 fix pinyin mode icon error via numkey commit commit b0d3889cb263e132fd545b432fbcae1d37661a9d Author: 余钰炜 Date: Sat Sep 6 13:12:58 2008 +0800 fix typo commit 6592e19ebdaf72905fb5ded44ac6da4053400808 Author: acevery Date: Fri Sep 5 11:48:07 2008 +0800 ignore numlock mask commit 0f48addc70c9beef5cc1f9aa3c7f917c097305e0 Author: 余钰炜 Date: Fri Sep 5 02:41:17 2008 +0800 update po commit 43c42c7420cca1de98b4dc33a2516418dcbccddb Author: 余钰炜 Date: Fri Sep 5 02:32:48 2008 +0800 Add direct commit function, fix pinyin mode panel refresh bug commit cb2df9bea0cfd5e67fac30b52feebf99692f6534 Author: 余钰炜 Date: Fri Sep 5 00:43:39 2008 +0800 fix po typos commit 1ff713d982aa84cc6934b34f7cea99f33d89bde9 Author: 余钰炜 Date: Thu Sep 4 17:05:11 2008 +0800 Add missing icons commit ee0e4ceb9b60d7180255fa79d0521a18c0b4f92a Author: Huang Peng Date: Mon Sep 1 10:52:47 2008 +0800 Fix problem in spec file. commit a40f0ac150e4a7acf77070a64e229cee417b8dfd Author: Huang Peng Date: Mon Sep 1 10:52:09 2008 +0800 Update po file. commit c37ea4692abb7fc4aa2cbd802a20576d617a6c60 Author: Huang Peng Date: Mon Sep 1 10:34:35 2008 +0800 Do not install ibus-table.engine commit dd957df4bc51b571be49b715701fe2a53478d528 Author: 余钰炜 Date: Sun Aug 31 13:44:34 2008 +0800 fix str encode error commit f09ead162bdc94fcff000aec6ce997e2c9b5518f Author: 余钰炜 Date: Sun Aug 31 13:14:26 2008 +0800 convert some tables for extra_phrase commit 4e98c9e4531caaa7d8419a4d3304f53c5c12ca32 Author: 余钰炜 Date: Sun Aug 31 12:05:30 2008 +0800 use memory to cache goucima commit f4a9bd6a5c35689cf30753e072ae25a8962ed84e Author: 余钰炜 Date: Sun Aug 31 10:59:18 2008 +0800 Add tabcreatedb.py from origin commit f7289fb312ec8cb421b4101cd928ab7849e86408 Merge: fb6858a 62af461 Author: 余钰炜 Date: Sun Aug 31 10:51:49 2008 +0800 remove conflict one commit fb6858af2a479838d2b7ec7cdbb7ec9bd6fd0878 Author: 余钰炜 Date: Sun Aug 31 10:46:41 2008 +0800 merge from origin commit 8d138bb09dccae010bac91e40a0b62ded613872d Author: 余钰炜 Date: Sun Aug 31 10:16:46 2008 +0800 fix extra phrases add error commit 62af4617c95d882826b32b3449689a4824713111 Author: Huang Peng Date: Sun Aug 31 09:21:24 2008 +0800 Change name of wubi86.txt commit 6539c694f32fe02b912c0fdacde380bfcb42569b Author: Huang Peng Date: Sun Aug 31 09:20:01 2008 +0800 Fix problem when create db commit c823c14075231331f9789239e60bce7db8fd7ac7 Author: Huang Peng Date: Sun Aug 31 08:57:07 2008 +0800 Get Name from .txt table files. commit 020920c335d9cd332820caadfe129ed724f8364a Author: 余钰炜 Date: Sat Aug 30 14:23:27 2008 +0800 fix latex.txt format error, improve table.py commit a25477589afddb0a8f4c4615f7e10c64d202f4ac Author: 余钰炜 Date: Sat Aug 30 02:32:20 2008 +0800 fix cangjie5.db generating error commit 82c814ff4cbf699366208f2bcc0cc4c813eb43e0 Author: 余钰炜 Date: Sat Aug 30 01:50:49 2008 +0800 change word adding method for extra_phrases commit ab8eb60c7a0c790989b81208662b9edf7c181db5 Author: 余钰炜 Date: Fri Aug 29 23:29:06 2008 +0800 remove swp file commit b4c2492f0dc8ea769a419d5d3830f734834668ab Author: 余钰炜 Date: Fri Aug 29 23:28:42 2008 +0800 Add chinese.svg and english.svg from ibus-pinyin commit 403a743e2d3febd807b5a05d85abb7f58a2c31da Author: Huang Peng Date: Fri Aug 29 19:03:55 2008 +0800 Rename erbi-qs.txt to erbi_qs.txt. commit 97738a27e1d3b2f7edb04ae1fbacbb917cbaff4f Author: Huang Peng Date: Fri Aug 29 17:02:04 2008 +0800 Update rpm spec file. commit 479eb0eaff02c233d969bdf01a440876542f06a0 Author: Huang Peng Date: Fri Aug 29 16:52:38 2008 +0800 Refine code style. commit 9a6d01547b3b4a656e6da28787eeb17e00fdce83 Author: Huang Peng Date: Fri Aug 29 16:51:51 2008 +0800 Fix a typo. commit fd1add4d979c3b9dc0c9af87435fc6ca3d0fb881 Author: Huang Peng Date: Fri Aug 29 16:51:35 2008 +0800 Fix a typo. commit dcdbf15740a6f2a9b005754add1d44deb1c01469 Author: Huang Peng Date: Fri Aug 29 16:09:47 2008 +0800 Add MAKEDISTFLAGS. commit cfae572b72c4a83127fe4b3ab22563f18ba8cd49 Author: Huang Peng Date: Fri Aug 29 16:09:34 2008 +0800 Fix `make dist` error. commit 9becfd13ed005ee2919482f9d6fca704cb782090 Author: Huang Peng Date: Fri Aug 29 15:49:52 2008 +0800 Fix wrong icon names. commit 809ad15300671bac782834824608aa0bdd8477f5 Author: Huang Peng Date: Fri Aug 29 15:49:33 2008 +0800 Clean *.engine when 'make distclean' commit ec71b915a73d3fdb7bd95f58490726b2f96a3aec Author: Huang Peng Date: Fri Aug 29 13:19:16 2008 +0800 Fix build errors. commit 24c40894f94a8f4b4ee8ef8d32df76880b41e2d8 Author: 余钰炜 Date: Fri Aug 29 09:13:15 2008 +0800 show configure options commit 050b4d01b8dd44492ae52caeaceb964ec0dacb49 Author: 余钰炜 Date: Fri Aug 29 03:10:53 2008 +0800 put all message of tabcreatedb.py into debug_print. First time, buildable :) commit 59760cf8c55d4801b5d48143b78b3b5ad5afdc82 Author: 余钰炜 Date: Fri Aug 29 03:03:25 2008 +0800 try to fix makefile rules commit ef01e73c8997e4a50e1138bdddd3a060c2dc79ec Author: 余钰炜 Date: Fri Aug 29 02:59:24 2008 +0800 try to fix makefile rules commit c0b3c546d73c508bf3810e93c8a1db196120f8cb Author: 余钰炜 Date: Fri Aug 29 02:50:49 2008 +0800 try to fix makefile rules commit b8644788b8c24f8922036bb5f05b57c0a2b39dd1 Author: 余钰炜 Date: Fri Aug 29 02:48:11 2008 +0800 try to fix makefile rules commit 1fb85e462333cf867eb05b5af48ec6c147f1c534 Author: 余钰炜 Date: Fri Aug 29 02:41:34 2008 +0800 try to fix makefile rules commit e17e79b756449b91fdef7cedc8e42a0728df6156 Author: 余钰炜 Date: Fri Aug 29 02:39:27 2008 +0800 try to fix makefile rules commit a869c9cac7dfa70bcba07171ce971171c6d32223 Author: 余钰炜 Date: Fri Aug 29 02:11:07 2008 +0800 try to fix makefile rules commit 46f56275fe1a836a66763afca9fbfc1bc74de889 Author: 余钰炜 Date: Fri Aug 29 02:09:30 2008 +0800 try to fix makefile rules commit 0fd11974099aa26ef965a7c4f2bc2ec2f5e4d8b5 Author: 余钰炜 Date: Fri Aug 29 01:58:37 2008 +0800 fix some error in tabcreatdb.py and some Makefile.am commit 66a3d0135c84c93c4a4030001370dd64454907cc Author: 余钰炜 Date: Fri Aug 29 01:56:33 2008 +0800 fix some error in tabcreatdb.py and some Makefile.am commit 83d6a3ee501c10bae8e05373bce2979c6a4e7680 Author: 余钰炜 Date: Fri Aug 29 01:50:04 2008 +0800 fix Makefile.am error commit e3423d49ba74862c06eef66618f0d29ed4481c0b Author: 余钰炜 Date: Fri Aug 29 01:41:55 2008 +0800 fix some error in tabcreatdb.py and some Makefile.am commit 68f7ca3cec3489bdbe88d71a1e5917dc17a101aa Author: 余钰炜 Date: Fri Aug 29 01:22:19 2008 +0800 fix some Makefile.am error commit 37abb85e16ec950f9bad0db5da0196c8357a754a Author: 余钰炜 Date: Fri Aug 29 01:18:42 2008 +0800 fix some Makefile.am error commit 03adc49608f96e56752f9b66e571f9172bfb61d3 Author: 余钰炜 Date: Fri Aug 29 01:15:15 2008 +0800 fix some Makefile.am error commit f030d8659cbaffe72d7cad5767c4eb105a488292 Author: 余钰炜 Date: Fri Aug 29 00:54:55 2008 +0800 add tables and icons into respo commit 5788a2abe5571ead36cef99b87853ffbb90f9652 Author: 余钰炜 Date: Thu Aug 28 01:35:27 2008 +0800 fix 0 freq entry bug commit 2f099bdbc2592528554edf4af5c19db364605c28 Author: Huang Peng Date: Wed Aug 27 09:31:30 2008 +0800 Update zh_CN.ppo commit 957bc692030deb1073fa4d7c2c6cc5dabe1c8b1e Author: Huang Peng Date: Wed Aug 27 09:08:59 2008 +0800 Fix problem when generate .engine. commit 871d6209ff271a7de564db308326b945dab0863e Author: Huang Peng Date: Wed Aug 27 08:36:41 2008 +0800 Replace -k with -d. commit f93486774275a62bb77f4d665bce55e9cb348ce5 Author: Huang Peng Date: Wed Aug 27 08:34:24 2008 +0800 Use absolute path for Icon in engine. commit c0d3a99ba310c22d4f85fc02702fcb7358ab0649 Author: Huang Peng Date: Wed Aug 27 07:48:05 2008 +0800 Use @datarootdir@ replace @datadir@ commit c28de9d2bb926e5837acd20d63e66dd61aca271d Author: 余钰炜 Date: Tue Aug 26 23:54:38 2008 +0800 update po file commit e2db33b07a91289863f3792045d59f7f76ee50e4 Author: 余钰炜 Date: Tue Aug 26 23:13:10 2008 +0800 try to remove ibus-table.pot commit 86382f1b44c682e3b2f7f88f418abb39b28333d2 Author: 余钰炜 Date: Tue Aug 26 23:00:17 2008 +0800 subtitute some @prefix@ in .in files commit 941184834b8bf672b7361afa1f0a0dad1bcc0e5c Author: 余钰炜 Date: Tue Aug 26 22:29:25 2008 +0800 fix @bindir@ error commit 76870cde13e89807bfdd9ccab5fc9780683c1efe Author: 余钰炜 Date: Tue Aug 26 21:59:41 2008 +0800 fix path error commit 8ddd5057fa53c203200f9a31c83e033d84f6a741 Author: 余钰炜 Date: Tue Aug 26 20:55:55 2008 +0800 add dynamic_adjust attribute in table database commit 091b9801c24881f8a654ae56b8355e8bf1d6e4bb Author: 余钰炜 Date: Tue Aug 26 19:59:59 2008 +0800 Directly generate table.engine from tabcreatedb.py commit d9f0a97d5d70712c01d4c79417344a7bdfc905fb Author: 余钰炜 Date: Tue Aug 26 11:12:04 2008 +0800 Optional commit in add_phrase commit a27d4509f81f7f2b98a6e152261a74ea7c6430ef Author: Huang Peng Date: Tue Aug 26 07:33:37 2008 +0800 Add maintainor-mode. commit be9692a7e4719779172f80291e1b80a20e56ec91 Author: 余钰炜 Date: Mon Aug 25 02:07:44 2008 +0800 remove extra a.patch commit ed093d011d391e694e755c05dfca6409befff645 Author: 余钰炜 Date: Mon Aug 25 01:51:18 2008 +0800 fix do_destroy bug and add freq fix support for special chars commit 0b76604e236b358423737b21da94eb3ccaf8b955 Author: Huang Peng Date: Sun Aug 24 07:51:25 2008 +0800 Change table-createdb to ibus-table-createdb in spec file. commit dc09bc78702d42e5f74b13d86a1d665b58e4423e Author: 余钰炜 Date: Sun Aug 24 02:14:32 2008 +0800 fix Makefile.am error commit 73c7265bca2aee9602ad5809192ce285d0153dd3 Author: 余钰炜 Date: Sun Aug 24 02:10:12 2008 +0800 support single character/phrase shift on fly commit 478f30eafd1b6990938ec57dd817a9725d0b1dd9 Author: Huang Peng Date: Sat Aug 23 11:19:00 2008 +0800 Fix errors of rpmlint checking. commit 312417db8c8f51488f9e3592921e14593db1715f Author: Huang Peng Date: Sat Aug 23 11:05:39 2008 +0800 Refine spec file. commit ecafcc887dd5b6c891ae382e29e2ebc10a216ca8 Author: Huang Peng Date: Fri Aug 22 12:37:28 2008 +0800 Fix make rpm error. commit 5c13ed994e5f5a8275a6a204c5b12824753f424b Author: 余钰炜 Date: Fri Aug 22 01:15:31 2008 +0800 support adding extra words during creating dababase commit cffbb866304cdec1654251958d9610eaba6d5065 Merge: 7010cda 3f1ee02 Author: 余钰炜 Date: Fri Aug 22 00:30:01 2008 +0800 Merge git://github.com/phuang/ibus-table commit 7010cda24d92b6468dd939f39b80e42d88baeb19 Author: 余钰炜 Date: Fri Aug 22 00:29:37 2008 +0800 remove swp file commit 459987343e890b36710e73e22feb474e275754e2 Author: 余钰炜 Date: Fri Aug 22 00:29:13 2008 +0800 prepare to support extra words source commit e334c1ddd254eafdbc4fa555ff7a3b038cd4aacf Author: 余钰炜 Date: Thu Aug 21 22:59:29 2008 +0800 prepare to support extra db commit 3f1ee021d8507af8f527d28cce844ce1d2a05c17 Author: Huang Peng Date: Thu Aug 21 22:33:49 2008 +0800 Fix error during `make distcheck` commit b931da2efd3345acaba041f11c7bcad87a731113 Author: 余钰炜 Date: Wed Aug 20 22:49:24 2008 +0800 know how to fix gvim, so roll back commit b7382ac546cd0dd408d8f06f99dac99cad01ee48 Author: 余钰炜 Date: Wed Aug 20 21:13:47 2008 +0800 fix to input space in gvim-7.2 commit 8f7dd83421203bf311a2544049a2d65a195944b9 Author: 余钰炜 Date: Wed Aug 20 01:03:08 2008 +0800 fix IBUS_TABLE_LOCATION commit 933d3de3ac2e460bdbec0799f8dba87019fd53e2 Author: 余钰炜 Date: Wed Aug 20 00:47:51 2008 +0800 remove swp file commit cf9a773fbc5c206933ca56f6bacf9434562a3114 Author: 余钰炜 Date: Wed Aug 20 00:46:57 2008 +0800 fix gettext missing in factory.py commit 1e277eb72e11b9fddfa39874577fc3a5ea51fc96 Author: 余钰炜 Date: Wed Aug 20 00:31:54 2008 +0800 fix tabcreatedb commit 7313136c82d0a41d9f569650975dabb28d6ebba8 Author: 余钰炜 Date: Wed Aug 20 00:17:58 2008 +0800 fix tabsqlitedb error when creatding db commit 0ec24318dc9294e427a0008c918e5395726a39b0 Author: 余钰炜 Date: Tue Aug 19 22:55:53 2008 +0800 fix Makefile.am error commit 7d265d1c62b097449a0e61b0c8198b6523a01a99 Author: 余钰炜 Date: Tue Aug 19 22:53:50 2008 +0800 add pinyin_table into resipotory commit fda45a06aa61bc9f55e93595e9dd61c4c7750262 Author: 余钰炜 Date: Tue Aug 19 22:44:29 2008 +0800 add table-createdb.in for database creation commit 6cf3c2d28cea1d6a158b478bb0edb0b5fac10e1b Author: 余钰炜 Date: Tue Aug 19 22:18:54 2008 +0800 modify icon commit b29366276264537a5ce7a2259ff57989b8143003 Author: 余钰炜 Date: Tue Aug 19 21:12:02 2008 +0800 transform charctor to path in ibus-table.svg commit 956cb9073fba5a08681e7193f72c1192c06fac96 Author: 余钰炜 Date: Tue Aug 19 21:07:40 2008 +0800 Modify some icons commit 8e4c8f7aedc0a77dccaaf0e970ca404c14969dab Author: 余钰炜 Date: Tue Aug 19 18:41:17 2008 +0800 try to fix po version warming commit fc32e94722f4d82638427ea6f05bf2cbbaa57185 Author: 余钰炜 Date: Tue Aug 19 18:39:42 2008 +0800 add doc into root Makefile.am commit dc624433ac32e3faf3f5d532a72d050a1605a683 Author: 余钰炜 Date: Tue Aug 19 18:36:28 2008 +0800 remove swp file commit 5b0e5647901b7802763e64b71fb7b16941d6d500 Author: 余钰炜 Date: Tue Aug 19 18:36:03 2008 +0800 fix Makefile.am error commit c1efb1b9a67b090a68df132e0c9e98631b15fc1b Author: 余钰炜 Date: Tue Aug 19 18:29:21 2008 +0800 move table.engine as doc file commit 26856137e940fdab3e946e2677234e0a997a44b4 Author: 余钰炜 Date: Tue Aug 19 16:18:31 2008 +0800 fix configure error commit d25074c7e1a4b8a904933ba4f048fba72e4ca76c Author: 余钰炜 Date: Tue Aug 19 16:12:52 2008 +0800 fix po verion commit 748157a6de1099e1487892ed36315f81cb16e3cf Author: 余钰炜 Date: Tue Aug 19 16:10:16 2008 +0800 add tables dir into configure.ac commit fd4bbd80e6c0456eb92b3e0856a662cc35ceb28b Author: 余钰炜 Date: Tue Aug 19 16:06:18 2008 +0800 fix icons/Makefile.am commit ee04390b1f8c2081317a551d47def5ca76498ff1 Author: 余钰炜 Date: Tue Aug 19 16:05:46 2008 +0800 Add ibus-table.svg commit cd3c5583987b2677098cdb72b6ede1791f251a05 Author: 余钰炜 Date: Tue Aug 19 15:36:15 2008 +0800 fix name error commit 9973c8f6953f02fb4855aa1d7baf5e48d694f8f7 Author: 余钰炜 Date: Tue Aug 19 15:28:44 2008 +0800 few correction commit a2d13d711ec725616b67d2b4a8f847e34cc6c357 Author: 余钰炜 Date: Tue Aug 19 15:25:27 2008 +0800 prepare to try the first make commit fd49ded87284c0a7d46282cb8f26d8f387161dcc Author: 余钰炜 Date: Tue Aug 19 10:20:48 2008 +0800 Add some files commit 3924a9befdb6a50b3e9344079242ae338488ccec Author: 余钰炜 Date: Tue Aug 19 09:51:48 2008 +0800 prepare to run aclocal and autoconf commit 4f68472801951c9cd9537c850d3d681571833908 Author: 余钰炜 Date: Tue Aug 19 09:25:32 2008 +0800 Init repository ibus-table-1.9.1/Makefile.am000066400000000000000000000036441241251735600156220ustar00rootroot00000000000000# vim:set noet ts=4 # # ibus-table - The Table engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # DISTCHECK_CONFIGURE_FLAGS = \ --enable-additional \ $(NULL) SUBDIRS = \ engine \ icons \ m4 \ tables \ data \ po \ setup \ $(NULL) ACLOCAL_AMFLAGS = -I m4 pkgconfig_DATA = \ ibus-table.pc \ $(NULL) pkgconfigdir = $(libdir)/pkgconfig AUX_DIST = \ config.guess \ config.sub \ install-sh \ missing \ py-compile \ $(NULL) MAINTAINERCLEANFILES = \ Makefile.in \ aclocal.m4 \ configure \ $(AUX_DIST) \ $(NULL) EXTRA_DIST = \ config.rpath \ autogen.sh \ @PACKAGE_NAME@.spec \ $(NULL) noinst_DIST = \ $(NULL) #DISTCLEANFILES = \ # po/stamp-it \ # $(NULL) rpm: dist @PACKAGE_NAME@.spec rpmbuild -bb \ --define "_sourcedir `pwd`" \ --define "_builddir `pwd`" \ --define "_specdir `pwd`" \ --define "_rpmdir `pwd`" \ --define "_srcrpmdir `pwd`" \ @PACKAGE_NAME@.spec srpm: dist @PACKAGE_NAME@.spec rpmbuild -bs \ --define "_sourcedir `pwd`" \ --define "_builddir `pwd`" \ --define "_srcrpmdir `pwd`" \ --define "_rpmdir `pwd`" \ --define "_specdir `pwd`" \ @PACKAGE_NAME@.spec clean-rpm: $(RM) -r "`uname -i`" clean-local: clean-rpm ibus-table-1.9.1/NEWS000066400000000000000000000042261241251735600142620ustar00rootroot00000000000000July 3, 2014: ibus-table >= 1.8.x has many improvements over 1.5.x • The database format is simplified which makes better matching possible. But because of the changed database format, the tables have to be rebuilt, i.e. packages like ibus-table-chinese and ibus-table-others have to be rebuilt against ibus-table > 1.8.0. • Wildcard support added, wildcards like ? for single characters or * for many characters can be used. The wildcards can be configured in the setup tool, for example one can also use 'z' as a single character wildcard if desired. • Setup tool improved, several new options added, works with Gnome3 now. • Prompt characters are supported now, for example when using Cangjie, 日, 月, 金, ... are displayed while typing instead of a, b, c, ... • Moving around in the preëdit works correctly now. One can commit the current candidate to preëdit with the left shift key or with the arrow keys, commit more characters to preëdit that way, then move around in the preëdit and see the full key sequences of the characters in the preëdit. This way one can check the key sequences if one used wildcards or pinyin mode to enter the characters. • Fix many bugs. June 2, 2009: add auto_commit key into tabsqlitedb; only check phrase length during auto_commit mode in Chinese IME; rename dcommit.svg -> acommit.svg. May 26, 2009: merge from kaio.git -- add zh_TW.po, zh_HK.po; remove unused module in engine/table.py May 1, 2009: allow the create_engine to fail, so that ibus won't hang due to ibus-table failure. Apr 30, 2009: add sigterm handler to sync userdb Apr 29, 2009: redirect stdout,stderr to debug.log; readd arrow_up, arrow_down for candidates selection. Apr 24, 2009: remove id colomun from user_db.desc. Apr 22, 2009: add id key in db to allow better phrase ordering. ##################################################################### # Users need to regenerate the .db files. by recompile ibus-table-* # ##################################################################### ibus-table-1.9.1/README000066400000000000000000000063441241251735600144460ustar00rootroot00000000000000 == Introduction == IBus-Table is the IM Engine framework for table-based input methods, such as ZhengMa, WuBi, ErBi, CangJie and so on. The aim of IBus-Table is to make the users of table-based input methods can enjoy the typing on Linux environment. Definitly, it is far from perfect, so if you have any wish or any suggestion, please file a issue on http://code.google.com/p/ibus/issues or send me an email , I would be very please to hear from you :) == Key Bindings == Notice: Ctrl is "Control Key", Shift_L is the left "Shift Key", Shift_R is the right "Shift Key", Alt is the "Alt Key", Arrow_Left is the "Arrow Key" point to left, Arrow_Right is the "Arrow Key" point to right, similarly as Arrow_Up and Arrow_Down. Cursor is the one in preedit string. [Num1~Num9] means one key in Num1, Num2, Num3, ... ,Num9 Space commit inputted string. Shift_L when no key inputted: shift the input mode between English and Table mode. during input: commit the first candidate into preedit string. Shift_R shift between PinYin mode and Normal mode under Table mode. Shift_L/Shift_R + 1 input tunes under PinYin mode. the tunes display in 2 aux string area as ↑1, ↑2, ↑3, ↑4, ↑5. 3 1 is YinPin, 2 is YangPin, 3 is ShangSheng, 4 4 is QuSheng, 5 is QingSheng 5 Arrow_Left move cursor one character left in preedit string. Arrow_Right move cursor one character right in preedit string. Backspace remove the last input key or last character in preeidt string. Delete remove one character after the cursor in preedit string. Ctrl + Arrow_Lelf move the cursor to the front of preedit string. Ctrl + Arrow_Right move the cursor to the end of preedit string. Ctrl + Backspace delete from cursor to the front of preedit string. Ctrl + Delete delete from cursor to the end of preedit string. Arrow_Down mext candidate. Arrow_Up previous candidate. Esc reset the input method. Num1 ~ Num9 select the correspondent candidate and commit inputted string Ctrl + [Num1~Num9] select the correspondent candidate and commit it into preedit string Alt + [Num1~Num9] remove the correspondent user-defined phrase. Page_Up/Page_Down page up/down the lookup table of candidates. -/+ when not been used as valid input keys, the same as Page_Up and Page_Down. Ctrl + , open/close Single Character Mode, only show single character not phrases. Ctrl + . shift between full/half punctuation. Ctrl + / shift between direct/normal commit mode. Ctrl + ; shift between different SubCharset in Chinese ibus-table-1.9.1/autogen.sh000077500000000000000000000002151241251735600155560ustar00rootroot00000000000000#!/bin/sh set -e set -x autopoint aclocal -I m4 # autoheader automake --add-missing --copy autoconf ./configure --enable-maintainer-mode $* ibus-table-1.9.1/configure.ac000066400000000000000000000046041241251735600160510ustar00rootroot00000000000000# Process this file with autoconf to produce a configure script. # vim:set et ts=4: # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # m4_define([package_name], [ibus-table]) # if not 1, append datestamp to the version number. m4_define([ibus_released], [1]) m4_define([ibus_major_version], [1]) m4_define([ibus_minor_version], [9]) m4_define([ibus_micro_version], [1]) m4_define(ibus_maybe_datestamp, m4_esyscmd([if test ]ibus_released[ != 1; then date +.%Y%m%d | tr -d '\n\r'; fi])) m4_define([ibus_version], ibus_major_version.ibus_minor_version.ibus_micro_version[]ibus_maybe_datestamp) AC_INIT([package_name], [ibus_version], [http://code.google.com/p/ibus/issues/entry], [package_name]) AM_INIT_AUTOMAKE([1.10]) AM_MAINTAINER_MODE # AC_GNU_SOURCE # AC_CONFIG_HEADERS([config.h]) AC_CONFIG_MACRO_DIR([m4]) #check python AM_PATH_PYTHON([3.3]) # check for ibus PKG_CHECK_MODULES([IBUS],[ibus-1.0 >= 1.1.0]) # define GETTEXT_* variables GETTEXT_PACKAGE=ibus-table AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Define to the read-only architecture-independent data directory.]) AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION(0.16.1) # OUTPUT files AC_CONFIG_FILES([po/Makefile.in Makefile engine/Makefile engine/ibus-engine-table engine/ibus-table-createdb engine/table.xml.in data/Makefile icons/Makefile tables/Makefile m4/Makefile setup/Makefile setup/ibus-setup-table setup/version.py ibus-table.spec ibus-table.pc] ) AC_OUTPUT AC_MSG_RESULT([ Build options: Version $VERSION Install prefix $prefix ]) ibus-table-1.9.1/data/000077500000000000000000000000001241251735600144705ustar00rootroot00000000000000ibus-table-1.9.1/data/Makefile.am000066400000000000000000000020111241251735600165160ustar00rootroot00000000000000# vim:set noet ts=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # $Id: $ # pytable_DATA = pinyin_table.txt.bz2 pytabledir = $(pkgdatadir)/data EXTRA_DIST = \ pinyin_table.txt.bz2 \ $(NULL) MAINTAINERCLEANFILES = \ Makefile.in \ $(NULL) ibus-table-1.9.1/data/pinyin_table.txt.bz2000066400000000000000000004226161241251735600204150ustar00rootroot00000000000000BZh91AY&SY@xt0Lg{ޠ?cx(P(p]JiTFKCB$jPTB  P(JHM`*EhP `QBP(((  RRPP )AJP@@(( U ()Z+ (PP *`d v+@ +Np@  Z4,7g66mBLep4AZ4((HMҺ馨:[4ʥ T݅4@iAm@@ c6hM DBTP6ƅBBE$PE B(B $P(@(QE n!B(BA@( P (|¹mjRYr[*4xzT@Qv" Ri6Vj78 PXvpHPn;f pӵmusI =,`BB(lM UҢlM6ZR<P PP % BK=<: uwi+VMCh(O@ @@ @@  @ @ @ @# h0@  ` @ @ @@ @xʪ0 ` P af!P5O""$#)@)iR 6d 4 ɛ 4RR"z4I꒒I=5OI156bLF C 0&<5OA$"D BI(SOPd@@hi=CF $$I,n5JRT$-!`HN[ ͺ0C1!P:Bș1Jj8Qj^`EYV2f\`65ꥫ#Mp4Peilv!4:2N7kjjbP`q:˅Ěv5cChY39ӚpbhZՊ!6raxM"%rc:CY0a8*v1 kXelNf!E'ʜ1U"֫SSѰa25T]B\4S"YNDEIFƄ!k"'2d 216@ ˧;C)0Q4"KeX6XyXrlY238i4:04@ qSjF E"R 4֙ALqJgcx@yϗ'xo.LlÇtzcŋ F0 : .6NB3RY4s#Tay*5 #98kb6 ljS6rBCJC cM=&yUq3 <9irk/Zl0fl$GSC4'*ӑiUAt읨-9Y]L.' ^iy}D0\Tδ4FºBA%.m':L\ӡA7 pV Z$Z u.ϯY B/gy5»:ɠс3\-Y3&I8ӝdc00ЦB"u\\e;"A)Q9-dYEI9\lHxB 8G¶4[IZW!APӌFQLN'%0,NLrIS("dHyc &KE27k#Z ^AsadP y@ (0kPC81%XD `mYs4*F)&['xVܐT [0p.]m&Xt1Γ(abִME$:a$=syf Xa1b68s׽x}{=×([9B0lR R9:ˣBXVtpgˣIaqgn%q\á"БSlYځz#YPj9LHMXXM :RkI S]-'YV);F5@L-VC{gLE<&VРv$88HbH鲩2b 6lr'2 ˜q1dĈu8$ g3LdÁGPr≀D䀤\M<.Kz88}bqjY+0)Ό1"63rqLQ1z xծ$IMɱgMɮ aPy^R"\Eū @N+ 8!m(e4/z|٬G8zYqPq0fC-:Fե6(:Z rjE3OSXtY8 ),d@\@,g&ԺqjŠV G*`p8bI.͍tS-c ä HgGvv&WD NLZI pDi Y:YJ'\ZS+ڭXrFv9k#1'9)P9᜺V֧#p)A\FXÆrVL!l2hƒh38ڎ4؝K!Te1[HU ̦&1%EuqЃi$#[VDd%IdVq9S16ʖrpc@-FutK؅S啳+49ɰKR8H1Aγ&p`9WhE4i5E qɁ0xLX5 .DDWom͚t-E1.g3Xr+,3RMA.:&-:.N :͍D)ٔfbYFj2'FA% jc5I)hte1r4Vu¸lⴠ .hBSjKl#tPTb``Ƨ-&T$-+6V&$I,tv6PASrK3 r`gAJjmMf ū.=Kh*ʚ-b!j!*i"®138CHdqZ*Mga : F8'P+!q"4UgD%,ҧ'9V'-a1g;J.*8!ufUF hJ8uc[,4XQF0VF6-jfqR9bb@A]J(Њ9,X0$ptp(hiU1kReirq<zca+9HBhZxpSКX"J7ibM5 *GDW! 8kAj[Ù2F\iVo1r̄Fqfy6uu9Өԕftx*,Nlc l9"vg"$AFP@uIZ,Ό;,@`-F@ W` uKX@8Y F- h 6qrsOF"SZ#)6j-i*Цmd86Uz1ɪU\h9(dˎ]l$XeچB cF4\p&]rkzY32bLudG m0gPK,Snf\<#ɤ̈́Ӑ.KD$c/CJ`M 4.\:",9 SGmeZౡ@Zюfk=]B8lA`@tk"HLi; k8v,1U!&Jsd@ɪXs{:G?~??C~?~~'??O36/ LbI 2+PU"Lc?A"?&l_(PbT63HMJחIK樳=nu&.A m?CiRT ^gYTen3Ny:@39 9}4Q[ቬل %f3%;'r[V@ ${m "F ye~bjWEpSṄ5럟9r{?T07'"e>΋ *0; J!+|+q}i_R5NMÿdGDI@4%i Oi\8L ծc,B= i`FL,ۥ繴x}OzvA/_=p 5mYݥ*+ǐ|a׾y},k6xI_hUĒ?]5yX fL(o 9Z=,FyoR+_E" 5|Є4H<ˎ`S_]CfW5Ogw㱚Q3?AןЪ '"6Ky6D`JN2Ze:RpӃWؽet?]`c'i҈pxGTY{%qi Ǥeŧn:tOc֩c"[Ӆ[_3lSӏձf7W'APNmNbbY#LD0^ UΡ<ӿ26A Ee>Z޾Nk loCQ`NMJT>AnNk0gjBx NޒgI^gNM> b8U[D,V ^^B:**F$paqX88@X5I@69b6ib3ʟhs!KY kQW7F/t"q"NG;C_/|2H2`2QKZl,τWw-3XO6ڮ;Ŵ/[md'yRZ \8QZ(JJ=ݘs2~ӏ̣ݞ 4^&ն&xXt^!`VU+7ko*R.6;'~^ơIQR3ŲZȱ*^# ӇWf< M| Uo@%"č 60Y$NOXE5&U~OՂ6PSr y 2VƭG]8VKKM ]9byAialׯ'KjI7j.K"1a^-h[LfObs!?e{5䴝2KPl`Q =}nԇpX3PBֆ?#tc^^aIw<5.Z HPIM؛{HNK"LtCMK!yĹ\*~6kJ1 ܱ8P`5`N |vmXa >5;zҸi錳鎾wj7 %CmsVdz@nGj rL-lPp֥O=y#QwrᡴyD"LѲ6e Y-{mf:46P_VF-)=UV23"^dW:Ku/`^oAINWkjܗ u&VJ6WƂOxhlrM egoS."#{ACtz]&XJd$Iw2~s!4aN%!Bm-5K@0]YBmF \t\WY54oc@/Bw +w6u/3Ђ Q%nBߏ;yBŎv߳ݱwQl?p/$*QH^/ȘO@%D" 1YY b1k+鼽6tUV(P|%!-&!+$yD6(wls>6(@&;J5L d.#,)覫I ?>wƳ4iپHMF[@\(lحN٬r5P@메W^ CIU}9VRAM$ (օf(Y6yf KS[ᢧ׺4yit48j2B'|9YhQlvʍhrMTj怾ӾqK2)J@?i&}g V 5UDB]ʓf3T) ?nYoE GSJY^~ݪ-Q dGr1@¡h0/npОMPM'cId2| 1=5A KjVu_=4=&P+4haPjKzdcr͵4}Y9!8v9N}㬵MHfxۄa%Yx'dO?~U†9xHP%׊QCaoS7[u[(L*ď8M)BwDb  3Tq10| :yvK׌Yt4 jW\`gcڧ{}׈13,ꀩkt|v(ϟ1'l#?“:7 e3hzN4wL2FdsFJ}4!L}/w,kTCC8O/Hnd[8xAӒWXm(&@ů%# vSC1+;X2r:y3b+sl{{QG>W۩ꑊJ΢)($pX[%X8J(14A-u3$ ʭ]."IoɑtyݺGk9n^NOo0W/݉YyUbHLw<,-nnY·#y2bY>ʦ21tx ,]TtQp]y8m[;ߌZUh'k:lai)P99K;Hz{zT &(#AHq6TTN ] :=0{Az KV4kLe}wA-0جqysKu{"/&4\da!Z&kUɖ7&Fa[(B40jȼwl0\ M+A.#OzSЅW޻^gOzsWCPL,2tu]c;$ Z9gE@'_F"; "u}hB&*lt( ɑ[20+'րM:%׫zgtz /)YXz=owZVQJ͜qQɾu&-\4}|&2~ժÎ I;/i-NJrQZTR9HmS9[`%W^^+$ҟhDO4Z`b^/Ȓ u۹B}]H@Sr6\ pHf޸??0r>U)] IܯjWiGөz|+[=rߢMoyf9c0gg8ccO=inH@vZ T0ŔZ[ HC$w'<2 %=9Y.w֗΄9i<"ъMo@ t%cX8ZX!1MşJFt%x.%(ht~yp L^@b.=d! <>dݻ3ZftkBU ӟ,)c[5 IEG) dЗ8ϞXT;s&|* 424Jy*Jۇ} O p#r vN)"",]*vdz¤\CmRi,q3, 5-`n؉.u79k2 N W&a$|KtNun:PlKR =Ŵ.HZ6 Ɇ{ ?GKB1ıUxX9s@LVSlF!T7oV&a6>GMdK%"r95swKIcc~>|)`<֓6-*qҬדjzOS޾Dσ05NuӉ p16lu霪RbKHڐ#u/?B,w|%vz4S$g9,*!ZeQJ">$5kݼaK!G$2V%8C.gUEP[1{,U_sU䬊'-ZEX4QovaAi"5 Xb=ӬޱF!|iƶO`B¢뱞Y G UW'3G3xEˊ oQD= w4l`J+%LEQydeIHlvWdMe i;^ x a>"8G 9nc=6BWDākQO}3 r}],xVS'UtJW)%w֘fմzU*ao4 mWM]FxHgNe MyDRR5X`}4E¡8z* M=t3fnzyA Eѝƌ`_X77`CD!2!Я*dZ/>* f2ֆ(fz=kR*F;tjC˅zb6Rh`hڡ ˢ_|*QII9 (rlzBrO˧EOy,|sem4Q3ޏL?\+C/fb*zmU- l&RcJ& "cJ$clc6&>A+㓒E̎&͐@]bwJo^ƒE7 {oz4=,էZSE) cɧviP A ܵxde͎=m/ FEkP`AL0Pn;3'H>jmqq. H5о*$!r'"H @4 %Կi@ְ;u,G©cy,ĕ>^!wk7ᑕ9uWf-z jD8yd aj_ 9(ҺڿXGAg/[88KDn.&G9Wy >Ά"]R,v{#!^ћ?#2jNS֋J8e:vUz6ŋIG`rSM4NiāaGd:yޣpDbRo܂vSt|lGa7dqNdg#O|= P>)/XU|#JZ +:EY,] %MܝԸ6jyJ( j"n 5vԒc;|&SK#p&U):-x4u^Yc|-L+yFu8p C-D֫oͽ$]}gb\dqtsQP3WmwQݏ*n_ܳ+ġs+R!\JI%;v=^|iuz"i!^ Vcٕ`]Hr?=y)SB/}`bnÖlQz-Km0Fސ`+.+dC;u@/9шw8@n$S^g>t!z|=gϮa{@ GK\Tj:c߄S'EMǥ@Hc Ǧ Z]3FEaD[AKw AcMml~vC߱d I|S`NufwMN:}Lz},橗ʼn&ˤ d[Nư=NhGGM[ Z])= !2 %-f,Øa):ە 1Ҙ}H˵`GR7o/#y/FlRپOCY& qĠ)8}Hmܯ))_7 IvC_(7FN#܀TMªz%ҵi N%t%FffZۏ^@P Lir)E[_!Ӹ9 GC##)?Q&OՌ#ALNdI! R;xG"D|2kҀtZ\qǓM] ZfD?G/kCt'tM&f<+ Ts 7wK^zxWӮFA{Um-V M|9Nw%`74WKF?o)% rd[#qlKY=e9xNxsgK'|>(vmshQ{Sσ|nqH^E.,RZsWy% vB W1jv7ŮBlC~F$9AE M=c9+)4ƞ;=yc|2;-6^biǤՇ+St'z6js*9x6\>XS6O{Gi ^U *{]Q-@:婘/Ǡ cӊK=cRw/bCwTr'VRSϠMDTx5Z6n 3E/OנLxx&tY|_fV'@Tʸ >vˆQ,fM$Ydq%)2WhYn[c Phx#):svvXJ\xIU0ɚx>Cr*95u>六>2aM?$T%=߈ k3O8bĊ=EklU s-7QG!uSLc;/ck*X5 MƯD WFׁ`^e>mXuM*I$Ư k0' ;;ب(5$1dMf+,`DM>n)#PT(A 7v [1:uےkĶf^[K7Yl^d9d6*-VҨ0, ħ?Y0к,[[~\:-ʃG!.COKAF%# ,Mo}|6^UkV5 e@)-wnqP!k]LJJW7@rwtт8f4K \E"R)[C9p==Yqg&_Fƺ fSa3p.7p< m~<a#lWVG#vYv4ڝDi(i)a7]+) dUgN%J?|KVբ/v`|5KiH=p-m9~:X9Z5ރUKw-Иv4u0ὤ p VJ,|%zpԻ:p8Rf7F<y =qpЙD-R۬z1A ^VR}Gxz9OhH|Q5ӣF6ÂIZ{UnW! !r ﺅ,Z=Kޥ}3x jSq_'^He֜`߹ɝ +8UlVVB3i035 ^/$_@jtmWQW9G^ [D`J7DU;\G' 5TboR"˜q+:(<)ȓ@-}Eqq\lֆ^ę:.47chGtڍ֣,RZ ΀AHШXGKщ+$?IۅЇЃվ@ña)s =+ea:vZZΐK`RJ+oO<,c1xm0܄!M=ApJVoI{  PQ!gb+JLӵX@MqZs94KN}Cӂ( ΙDʼ|̞7epPNYs;t L9^g{|w@y>؆pjdEb sc2=,WF_zkY0DÌŦu3pn{? %K甅~°𧇓!/oz4T;N9.+"1먒PȎZ\ I YW &Y we|Վ<3<% w{Wi?  c_fyJ E=Cu)sq85^'sJ)oƓgヽiDn6(lG=4ECK/kƅaqpxc33gfb.w= OK-RpX69QrFnGWo#wD\, hBgYsnZthIPޠ!Vif'5$%r#ä_TG' 5+ue DQ>L*䊄)nwll 3O!!qߑ5|]9;ݡٮ RU}GRxn~s fp̟+Ӕ@wF`D×CkV_;t6A'D&u ;KX #{y Emdx7qz9bj x6'ɝb$A̴4$U0bV29{CZi$DG Pd*~Aa%T}?f{KmXbnUr_0{ω2`C&ŀ#^J+?C؂FH8ffp]O Bh#`*;qsxrʢʉXp,PVÖa҅'lj eD aYmA<2琉LpiCM@wo'(TSJ3[6Kvw "'o9A HZ3fWJU-<ƨOb<^f-Qw膱Aɖe/ܨ'5a0js̑ roײ裳^]=[{-Il)F6U$xՎXGBۗ&+d05j[@ =m=A$,/*DeIco4e-Y 2fډ= o܆[L(kH`>mDx, u|p\$n9,ǃg]}zު.F2n~a0׍,c&vd}-v^Ba@IB#hY1&]=˟MMTI#ӂ|K5n"aW\mk>u Z1i7ta $hmI]h|@=DAshq 5M\g&P<?V|Gz-Db?YA#1\Q郚@puY2D͏$k~7称>?7?knEےfEqD|v* jECR`jbS]8U *a Zhqk#j 3D/cuAFT&vXNv"Cƚ5ᒜن~1]{DS?36 `C %w |P7afbYܖ ETԤɈCjzh_2+T3 >c3džg;1I\ıφ_Mbprx! YC㈏CvH lo8Y2:8Nx15;*S=>y@_S#"D;D U2Z>)"ZyPUmO#eK֟;M!`b!Z%# :b{g>/-5 D ^ZĊ!u HQ'6ozoI&/q >52xإq@x91(asP}f; kRuՠAx)40l~z&щW `7g9g<TNKp`&Q~/n]VNvCD+C% 4U_+}J`o^239 u%ÌͤZG8*pMSyap= Lx2svo=AP xr슌ܜlQybrPޓWn4&RdO>TAQs#>: #og5[cbn{HFr4t+_ zRAY@Ҏ٧Z:G[Qwy6n*rϤ{Z-/btT*=#;<@B̻`oCiw{)|h%T )ԑ; zeOOXD;! .Kɸ6\{y6`#86:pXP = m:5'T >rH pL18$@3}טWFE=w {%4sBlx5~\ p2'~њwL@OM4%BVG&8{,+?&-Z&%zTpS紤ѳ?4]<|H#!Jly7!u3yͿ՜ #1 eW@`^DBpHѸޯ=; f{\ِ4 !3 {grka@[;e8J|Ep/,V }lC8&*C(@qy22|:|5ac2`RVҐNA?"SKΛ)eB\RD};:~]T=@(kC,81΁{b<\V;k }*E3lSWZG۩ "]@1(O{pB^[jpl}gF{p$H8_#v7R*bh ]1k9;51'W `': Vިw 7uFx"~C+5%pTKn`sLCQRuF :&]}Z#+6u1BUpZ3*3U7@0(D$(H {V[)Ykw]W«yWu8-y-PXA;:3G6RλUNW`X+zv45 $mT*3pvk-bd ۞/Vs,@'mP1ƧilwI>Ӥt~"w;LV&Zh| okw>Į;I?Fr2{?K?=FEE0hC]A-q'e~GFJtfZm\,k3&hv^8q#n`5 :_BV9$ K̤㻑e9Km1 0#ݗVsh1 {*$?P:}B%(LՃBp~鈻!z&6ӏh: yf _euI/@L% t{ >qj.Gjx{S97$LY(< yx>P -d1" K$5QZ6xl{4&ƸûKڸ! ptN }ltXQ&"1d4 7Md{l)&kgMFrT=%s㴍;/ m~!(g+N|Oalx׿~bs:Sj@uHD0(}_˽mw-5Y~شdXFUzt6SP2ܴ&FUd`EΒv65 ;V 9p u20nߕ bA?x/4*W& TQhO'9;r[W#qX0mnDkPf wAG"6BI}4ζU跢̠][4Q1f#4W\ z$DBh%{BxS~qDB.*L|TLKց~zջy(-|nLXC|(d)*e)%G{In%(^cnV[滑v]&1 BxM@?DWtBM LRGSx=_ g \YDq_ v xs A2#d%^>B֕l~Z 8F* |M.M'Tw,IH<%Y$}NCt- 7wtO=6!}G#vqN -C/CFXBҁ33aVV)0 ^ v7%}"6iB->Be:֯'BݿqvEc 濥?F!qf萲G,@T+c^B0H|'3RZo ڙ&T(tPCl^D%u{ߡgu%o@J)<,bLṀtJ|Fj>`"f:ם҆2`3S)F+'$APxv<^T!!y>@%: ('J4*?A{ vyHc G,!*s1Q~< H=? Mһz]Fn|hb4I9jhtu m[G(2{'z.&OўS5fow!fg̥egB.id[_-iǖu>zBWi]`Jyh"},jDtf3UcwU1qi_!fF=ݪ[85D* !)Dș]`]Nm]2ܹ҇J:4&7@HVZ'Ca>r}.gV%V;A:=_D"iS $ƦG 1_%u<$pz;^D1O{n"fݎ}v!zqsCu*{u?4n^V =O,V=(-Ad7z̊|~_",I_?Þܶ~ѧ"5wЂq mlH` vBo)Q"#AuaСĭ萧8wI9AͳS)qdxֵ#Lɠh1 2s5ڰQNЬܜ,t@:/P[q\p3q=$kßG2S{PiX wϘΑ|` ݹ&n vL{<{^ Yhν> S2z @q[ӟ=^>h5sπxpM>TP —S3Yh˨#.Z=p#҉bLu&2\cA|zr\4#1i5kz벫澱|kL`V S= φP#G{G 8(WH}ɵz %GN͆uϔAPO*qژDch'dohNR nԘow6:mw>wr:q끎;ݔlyYz0z1=16{)x5>١H1E~xClOZ6ѝ͍ IsSaʌ[Y]Hwdv ̣ݏd@Nj-:ݥd*=uGΧy[, `tڗRbk_)4LnsZ_[=|VG U E?5NnbNeӧ]mHk®a󕝅>p]^2@^0QAY \P%Zº)Ͷ>&@{) pج}/AKNE,gg,SHNZU1̫yAXy=M4>aÏO6,J Ҿ`xڃ@LkPqa4MNO3Bko6&Tfk kXDt”sQ*k+ K Q,cېujEDv$~K4QLG C/^C)A g,Wl/MTnf"wsQUsQ"=g% >Z0e@]KO6Uf=Q9V͂Cl阱FUl|Z8!8=OnQGF< V ~oF:C8Hi+-G t"()[~S(yO?{&Il:}^&/8gɽ A zZkspQ=(vXQ[Ƭ&.{޳EsS(`?~s7U[U~ڶ2m6B HOĿnlmsnKbIywޡ'|v˼V-2cNrͭ(@8JYs"K2FZ!o{A0e_.ꠌ㩢&-['1ΨhC Oyք%3{c X@ SRF5D,C3rw$G݅!9 p"6o5!>d4<=Oo`ެWFx+87})QH0p@ >h%M< 㷣λ.x05 m96;98 s>t `ːcUA)he"u-Kλ@BZNɃ(WCn 鉮Rw{zW){ϸ]s SP\`{RrhsYe{ȩ9,"czVgq9֒lWr*nL Y&{#K bK(a8NYH7<`Mme)'{8ǝ]:z0RPgxÌhɲⳲ`33,X IPJVeNɣ^vGTRӴl]nE{s,b6ws==5\r *u^cOcz*D޲FC ; hLz@^ Lh *eq˗4FN9Z.ݳ :: tnv\du&x= c92tvNE&8v*Gco4kƇ>.N@q{Ee61/`<0PMk;|OWwAF7$<ܹbwmUˉPn NZ&5` --͹;[GGNNtblίy7٠ѣCgwYG "R1,x3QyDsb1l`K '8pwXhc0`@uN{&˓+N VOIKxFq 𾱷˒Ǝ=F6o ch$\FLD8nMmprȺ8½GvDG'hLT6 appnyd4`rc󢹷sˢ6생HB`g;erm%ctۖ9@k/+k_"n\hۻlFܫ1!QE BX*EK5 ¸fvBSD:tc`;z1wi݂2F!W`4rvɓn U@G W9^< rc1rhɧRclH.Se t+69y03Z㝇r$ y;INN{&O3Q4jBD[h`\0c3k:#Myr<뛁n9OhHdɷ`W2e\fLӜvpO&;+Cck4 rTF˗*ȷt묤]%\F- 31Fg` R&vWv1}^pɸ5;nwܴu+ʽ^W1nFiח˘ƹ/5Wwe;w]]I`AHj`bVES+\1Z0N)5V;F *6k<6{<+96g۶srs\܈{(1h{׎.@w`LeFwɣd=뮮pCk(c,a,\ѱ;t-rraќ3>Jă:FFg+0,-2KXeSrʻyú//36 stb 1ן^ 6L]Qi.0wǝ%MѰ17v݃wyw`\NEWa\!^t^,z,`ݕ61 2 syw7<7eEж"-ݔvʩ#0tgctNM^J(܌Uo75.C|sō+p15+v{nV'-熙vbrbh\yת7ϝ>utLiw]4lkd퓃 v`p]wfDQnUv.܌W9%wAN.Fh\e\r]F i(Fcdw[;9_NH] Ƈx79ŸW74s_WwWw]&#r7Mv%Fp*G.EtdXlvv)O`ɹTd8jguG9^=2vD|'odoy52ss ʸs+(nks\tn0.|SV QБKbX4>8!pcG'&;xӗkG+ʹnU5˧m;1M.^zpwkvYݮ%ιkrص$J5wv"ы\P 79bhcoTɇ~ŭ4aKL}-װ\3FxBMgiCƌ1vƐ1fTgàjxMr/)RBzgVz_ oQ~svs9q# 2a\WWF lacYI 4t%c$iE5v ]MZr14)f.i1Q+U-8D_8w(DTժ:q]8ӕƐΖIDZR)3.*n0YƊ[.NMBʘiUwB gPMZfnx<ɜiASه/{H*Y{Xi)͛QLVJeLݨ,8l8\M:G=~9WCݨ@֪8fslM(aՕvTɓVBD,l,%sF&0H-ŀivj#6CjQ̫cd{6]11::GY&ɞ5-J0Z2A"CpƒL9#YuAC$fÉpc-9 88Z]iseƉ"s.r 0H2cH8s] XֺteFnamK߲}m#9"@cd&Q\v;㰹#1bdywkm(X ͪ8!8Rּo$u@q+J¥*baÌH흚ڱΟ!nWDeR4!pc`64\9\.vDof 㽯88\gAy :$<ΐr.SdA\<;\khɴd@Dv S; Gh+("̭+vfNC\EE6E2(9/^_*vMtq vywĦcqKIT߱ZTe_9r\qW'-zZ0s=Y̗.y&˙u\<&yOL4]skQʮX3cW=6Le8t1<"4hDtO'&4Rd/.p#SZZ`1,=154,9vA!duc1'2֓6Nl$ct&tpK*uj2q"Z2q53V1EhFqM$8ͅząd՝XaFRg16RҷC1/`. l GUL;6 "ڶNz*wMhY)L@@oM&ufrdW.ڃ(f@ct;e>{xC.qTә|cA.(#w[ϷE[3[v*}󝼰F^cwZ`5SS!.̘;-¬avpZL쓱AަvaQ+zESGݐuy2h㈽5k;M`8e#jÌ/BՊܕ235UwN9{kU*9K]4WeuZytP9Wu[|gț}/'ͱmZoIc&ҙGbon9#7AKDytrɲ@J9۶axoAb%a_3%ZAL.![&ۭ|0gBfqy;u/Zi,Z7ǍRe w]Cof t/ξLu~W݋wgdjMz@lod]HNi[e4wJUnMtѷyV"Jʛc]ײ.,rgWcɻǯEUlBvk1!u(-wXڶo-VѕnŷTnEݥviݧZN3_=Ǘ5T]Uˎ| ;他JYʫRճmm:,eP THj;辎)V[¨CTvn,YUu[ĕUnSb^z\n㨲dM%aKKvr]cUT8dFZ RVaέǣ =6L jQ݋:',fMrZRfe ,4|Oo[ymv :8UU]Qak-eK;o"f6+_$1f4~UgR/XK+n;{U"Qgh4ۮ* U jgQZbѠYǹIu\]丶y:7`ˑڊ7UUMbk}4.5Z# h3Q*8|,qb6])YcfflQaɓa4.\D%JQ#H|c@qdUC!"~^FX n.퇒eoM7r &Z#;)՞2\g J<}H͚_y@7Yᰠ8!jȰ5qU@>|1i̠Xٮ9IWk10QDFI=ΖYmhUԠ t<`J#폞dͣgGD[XH/1 8omCp>-VAX,W/0v񑫥G>]@8*>LM|KIX{%+O1!aD3+ I1t}׻(G1P|*0#$:Yil0U8Kd{k MA۽+~QBC1WX]֮[<qƆ#( U)zQbîySw,n$ѢPX 6soMmIgXNy|}2cl*Vgd ^ß6"Ր90ѼUA4vxY0ұV mωa.#YkC>;͚_,4PPԢ:wP{`;("L#zi#Q4\pX}/^t^4^KJ>N51Y@ ZZK' pu0CҠ#U$bhas i*;U/7F6eF|E$J[.ۻbu)xHg{q㹶wk g镞#.=uho{*o:鲌/9o wKݦ. uf3U\W*T.Qf9)Bo f^73A]YB>h0UVJ=v3+Q5+|(q2pB40ʎ ,vI!Q yv#W(KhprҲNJ_FyÔ[viCHO!#6Ǒg'k]LGd咡`5y•2 k:smD#Da>QW@&N]4e'HI {Y݆苫hU G qY*q6ЁkU2 bKD&R#9K #Wٛb?<B+|h4PVv# Y`w1> jjɪ/V"vQ3wwQ@~H SbYڴĢ=+[ZEmO51Wrlٸ䪒P' |H-(6g8r[ۤWG51f[GG"> p7j˽:pۺ r3vPWyuL)B4RfVZVv =:F;|~!šsZWY0θʄf\h1At{w&•l.7:;!U)a$73paB8l5[QZu]Jb ޱVK0[gnڠk]v \→e@e^4@wr<#] AjX4"*QeY̻zp"`>V]0jloVM^q duSE:vB̻[J8ݟ%.θt%j %zȯdu}N0=0OLu5x0ܧ.,u>v晌d@ f"Iv+TE]ldi$)tA$A yB+ sCSOjtoUQCj~^xR%/`R2[DLaH hY8W R0j3!gCDBU#;UyFYcpUOPE5 [S5AY xv;i;vO7 ?ɇ4Ǚ2%Dn;7M p8@H%7.iIOLB:zD*jm?'l N\G<͢C,KV!^5hhZ@^6.xi:Yqنh;)kClB1N>x!ρTU@9arh:Zx T^O4SA9i)w&K1/}G\ZcX (-=-8,eT{]^ k^!Ѧ M|E0<]0o/Xrv㼤8v|G!y >B<'<ֈ2qb2HR@˅lHPƦӆƻBiIltuFᕖuL5[~Z+3rEUno:}ټ;{2g T5T;;/yVu淛o48oR8B"tr<9f`z-iUt.EJ40n/"[RHpC!ψZZQ|^]sW{ \3(&EݴW[]زpPl5IubУ[[fn*Hc6T=Rh;40U\vnwEXMW Q]+#OCE0m7Ŧ#*yPfunPjmp5 ঍|][\QJs);0\``@UѠUQz3FntW%̹gox<  uwI+Qɨs] mN!۹oDR֙՛̭Me;@zBuEIX5k6V]Fi4 wh4&VͦNⱫ5ɨ5ZB5Q׫cG`Bт#EX,Uts;k<'lbu^2ڬj #$ )C<.Ϛ1,~Qt^nlXl,[.f.1o=af"{:<=y<}wqzAzX(% i]* tͧb-6d,FL0UZYE<;|F+ۡ ڹw ^rA(K-5uTm^$CG:G ffswޛcSvѻnIA96@>L@.G)DiNp5MriKZ!-JV 3sQgQRwO޺.s)sD$57)*Էj@D)5:xSG۹$T%(qS{|.JP\f&G2:UM&󠟕J}CfeY~sai'>Qͭ\s\gRtK'5B7G|ǫ`I]<39~m+Ҵ12{U# \?"yrD η+#NbT>3.RIw'+:Fyix2fz.,ͯi;]7;.bcGح^NZ]Wc-i"]( yƶ//i/Q?/f[{ك.yԄSDs|h\tO(ʯLk5scNr$>cwm+PGnύJBI\Tj#oLqH|.KΏ9ĶGS)xu{ރRc~+/QC":usʢ^/iuT ʎK[,VƓOvWuJGpNCRqG}cYE6k(tJIKΨIn(jxӢ +.^9kWJ{VY/<*-\"K'HP^Obg3>xCL,}$d޾4Mj'.sFss($Ny_4TmM;W] UӢC48ϒ|&I sun*'9l|˘ڳ6-[ZMM9Nپy8򓓊ʮZwNa4:܎Z{!-5¶6K:Mÿ=wޓ/wHȆ~͒Zi׹>:&Wbyׇ("rіNΊĤzbj++Hs#Qw\Ki펙+wgTE|S1NܺۚϣSqg xu_&2|z_{1jWqmZIY:sIE]S]\ouJ۶kkȽ\5TURȲ\ϑl͐,3rVӱ9tur9JRY0u`sQE~::">=WZj>z-Lӑ㇏Sroͺ //sHNd7ZBHhJ8}1n}ȟr(.K.Cϝp6Fm3g |LU %R.'\Bˢ?uM߂7uγ8/4))'u"^ &̺Wy8ܑ,Z<:!F`(H0I0).Q"^9lJ-[e[,Ok5.y=Lԝi#6y M 3q;әw XvN q՜"d;G˻32욇g3ji76A!d;g%9N &vY7L8屔s;sy&yp͕q3,:Pz)*7,uz7$=Y W2r ک]fv{Rk.VSowBstЦKf6nx0Mm32eVVTtzy/XJ72>M#6T;fu2xeE9uP0F9벉z ީԍu&[uڨ^=j 憖lWYDog #&xj^=V]72t=v˲8镐{Eef 1^!r̳٘kymFbW{tJsѪnd몱̬4_Mw)ys+9A=ɤ,en,rD̬6V>wT]Z}3n՞mI%nylF`iu^ݵ ӿYӈaB#s;+p/zy<tl\pB*(`wT|=/`gu +b˓a|Ckj$Vs&V)( `;_y}s>Q娷]UL@!=Rb(#>GAHS>ɾLb2C|ZWu 6~9u!%WM*%A!|'JTZjC:?.He@2eȯJ/A #-Qs!PU+='ɫo[Y*Ct(HJ n4hKBTVm 4 [l,y /k6$r++akOct| BH8򢢈=żk8`"oYۣ(Iy'P>,P ZĎ/k p}۲cU̺Ɇxj".@v!܉QNkM],L#K" KtG&<<Թq~qJaqc5E2 * ;ۑO $YeF[ AB4 IF<1Anڪʺ1 DH>ewwqjmr`Wt/p6 3I; SO-N#v92Rȴ!qxltC:ʹ~ce#.QPqj{,Tu%!X]VG[q1)! Mܼ雫\Cu#OLV!&@f9 ː\Bl甄~n*3 4DQknxY ߈2xoZK`%ӗlH "X-HrDthش ,a,WdYķE5t0¸O(I!"z)SawF ~'pZuQ =ĔW nVYsOC\aS*'o,QD0{<|{2UK1Agn( !W$ ,!d9 {fjt $> 0 K:mXJIV8 ̻U"m 0">")vHY3tGO=ʫKcc)ɲNAv4utdy$~Uv/ W97bC`7p7j.˔ LUHSLiϫeϊEĕZ!B jwAv״D !z̝/Iەg+_VIۤ׬:S<~Ȼcbd"ȁ&n8-N SJ˧&"yw'hQH)kUk k\$.9^65F*Ԗ)Z*xv='&vx1ij3Dީ٤wNU+NKMT%9Fs 2.uv/$ew4N.[&ɮ)?sS!9EW*:ro&WYL74C%R5$Ku:kii\NӲy:93K\j%6th]D#eןfڔy_m]*sҪWa$Tk0?|-0!VOeK*ʡ;|9nq$m;6ŗk톯%HG9h^g8rr]KF^؝ϱ9s?={}G$,/d]Uq-@xR-M3N'+*)c ^|g=ʫ]g2%K''l>"r4=46ޑY vپܠx=XrtgWג`?9O~MWɾm4Z޾+}TvVsK%fV}_jP*Ag.{tjt;;z̈́Vl*ה:rg)]>ˤS'Zy^ >}ڑ/}/ODL xB JDnUOz|5W?M¦EAH/kvHiIN MZKv#0p] Vtp kPV^Ϫ\MӣkuiWېbzwb/79{?nBebOɲ#K&HeN qb\7ϩVWp;fޕdxW1^Ș 2f m$ʝbϱg^uٗ(M%9$k>G:upV.^*4Nf`?,$f$ dQ9mioL'rMn,8hyv*[(' 2swWpۼ =?n뤋mJGyU.VEɂ]$2zgȗIEe$&VpI~7][+L^:β/OHYGo\`H.̵ˆ-h̕uZ3/řM9XQkm׈ל6@-x٭Φ[*卋+ʶNsN:KOTpQ"vN>E+l0Ͷ\rH~W#~9sWO.ȫTYHJK[RIڽ:[dsX|!)y벮vwYj; 9eӮkqT$*X453"вRU?MY0neGSO>zehӜw'Ri^Q3esJ~'F͞mNG ux2Uw;3i(I]$JY'7[tcg]4*~;3oHms\g--ks;dMҭ;r^Ȭ+ \VDuZ[r Ӛjui5^5 Hϯ='nZHEtm)"k_,銞Wt$bxZrr/: "B"AR! UY+P^g.Vfyļj={yjmG-Y$ ^r'.B 5W M-M1q⑮C EX5dѺn"g(gˤe2gnzxPJE/Y'6ڎLM=tnԺvKŽNb7DLjg!Dj(\vѵQZV\_H܋O]كFys[:b[lVXnYUNtZ6܉EGkwLo].J%񰭅Sv^;TKٱ=fRY"^^L@n1Lͤvo7zlݹp4^rIPY;1+G6nm6Kၜ-o9r*mݓW0g2,ۘ^`wDh ќ 2bӰݬ] ᦆǚKdfFsl+c%NRvp%\V,x+ÝJib'IN$Sv٬s-prA;n<}pAa%9YVIn46bJ0Lt/ۖfuiJӠPÎGyd:If)gU㧌}v]kVƾ2X{1;. |֐Mfp¦'vPJ9ڨ3FEfaTq'"*oPm^Z=&&cfgl >y9O%4MӏútX6)Y,ad3 U;18V`uKutg.󷦺Cd*MQ089%JM\z$M{P7 WrcwiNM$pİ:e8r.%BUCgDYPFi[Sͽ(Lg\ACCRXg{^,z,vWZpEUކYeEbi#ɒhXzh!9\)簽o޸f,vu͛x&sw? _.CFeu/;vilFUk76=koVWr[bB4[,rf v_̡|S%uDlMY((uuѻR\ueۗHS5혫EľՃdfUy[Ӫ9˫beV:qe yHUV , .+cDyR!`f+ 8|Gá:eH5E$+US wەgs9HJnl\쬳h63 ;_grtbץ,7* y+]V+n@b,fz;q[ȩIeح,Scءn4 b3n2ª&y3[LJSu5yJwe幯)lz ȬjV;ɼvsjCݩ=7`f -z9:-֙MŻ!bzW&(UU\gUy^0vuս+m-4($ܫu6YoM^x$gl 2!4$NXDb`fu/{^ Q<8WS+1;\XppҠti xl;Mnwjp/V)ktա=;eygYxtnJw8¬VخXkbIȮ(nUD!%$xb؈t봬lnUCsvLVۚ9ynJyґ3IkVc9Wq5$N7/qo 9*fNu,L~j&ٗPKﺋXkOjx_!YG"֭R x6; h9R&κV^x)TnچpZM^Paƽ~ݨ]gSwTy P.׻鮋BM,gR@>2Oh#|,ʩ *vijNlc!&cP|^iEV`%EhGF qgB{&a)>v:MDS2߄q] 'ÉL>CYE +X䄶t0;K2d,hIW܃V*,6Z07i&59_k 0FsG32IHu[jgoeD8¥u[[-b^f&pخ]杢Iz sN >(hx0SîeR(@xzӵ)-kꈇ#3s|xO,[AG)Jܸh՛[ͦԾ*^I&JL^ڷx.wD-ԡ Qm՞iQVבh Pt҄G*x 巗ImY zp ȼsHvxĘ'l:%"+hFl٣a98xU j1!vE]YCN *56gXjY]Jۺ W1|CV] x<-CJ"tC`mόV]T.!svg)K2NxS)->cHio']F=8mM Rp(H!bTBja+x^MED-l,яv2HFK~Q"TG`kX*TrTxŊ֨5VdobzPÓ_F7,,z}0|,LLʡP'\E" \eЮ^"Ը*IHiR2^0TZEՊ FfƮ`@9t 'ylUN# d6:H@Shvnn^`@~ Z/Mm9$툵H(~TcNybuF- Wz޼k]˲E}Z.w@d*ۦs bE  yhcf+UDi!e NI XF6K`@x]I^i针IH$^3em?/Na8@մUQ6`T.*R;L6<۳iW<ۖZSWJ')K+<%Wt5 [$) aX\UQ$3#"d#x4I4/ 0֕eshn+E,7wwnL`x(}R,4'C8x BqBI2 hdlQ jR|rH`NH#IaPBURK8ӤSixOgޚW[O!ϟA5_SY;Z}"^R[ҵ.XMsÉm|Ǟyot^'Ѽy$kp6Q;R$(}^B1*ӷAƇc FN(~ g.K+ͷ91ܢ9A2UZؼSjE]Q׭XI.^ЊtC/5D{t }`>r)'QLDoyL4DdbHdkm3_>;ǏϜm2HyzU#v֋ڑOqHߞ5{^7XSZ(mΗ6UUKUz+^+"X/\Ӭ;od/7{7<+ϣy%s(POk}>\r_.m|wC-y3)o>q%%6 F)D L VmZ-S/i{x{x$Ix|h^ A4g~ t>ֲl`go{qx=_'K;B%em^xNxxEOyʑz{$cW+ģ*UݕUsȗDK57kn0JXnN]yk{._ҹl_e Kݦ㝟 z**DT9!c$½/BsI$itUm>CZܜHJtVsDC~{ɼcuNGɼyb}";Ѝ>$u)oDS>^Y޺cNp l+a .\4gy3M0μ!lXdk̲Lsƞp*e3w9r" :x{{ʳ*xjMIJmf)g17a9 p@|^<9N"wg;aa:Badn;ͧOn9x."Cacn>rsr %vwwIէCNf$׌@YS:kpXeA2QhR:~$jRVhŚ)1d 3 3kyYG!MS) ,'lp38s{5%d 9;;ETk0`F!eG-6C cso7EFCd[7rTq4׭qwre*G?ٿ`?ܘvNG_ k:N Bȭ$wu&I%ݚs=<pʧvҁio]Xj)]Aו ]UPuD$dYR9;p"UŖm7V݊ηOGA>l*z`ُ oo.7Webf:Rrs\T,Ǻ;Y18h3Z DaƉ> `#@|nUEʥWڷu͚[zr[|bX6.엳%Ru҆g"J凄[u]}Q;!7/N;+(ԙ]Ym[ѣW睶e"ԃFl!yI8j9<=:맽v Z7`qdLʺD\ӥB!ۨeZ6ХT;eX'gM<ɥ1F׶ Vm^ݍ]UuCbU{G87Gseq|ޢCyб=^ǦRsѵ «s]+ۆCfLtR5UzzTW:vib̰\+E^il#UǮk鉾rڝ%:,ʾۦ6+[Av݊QC7rUM+qL#.U=@,\[WO .8Tpr#/(q.sJJh1ZNTSʍ n"6ުF8^3^Cڸ>|դ葚=X9jUgv NMŎ,{H%(nRoW`S\Ŵ+wMuVnOkM;Sx'UALH*:CTUػ,惩UNWPa4FFtbE1YfUcN|ф.ڎ,k1yK1ӡ{u.4{ypsۣRU@upܧdw|=hYԁQ;^gkkv UC}e DY~eYe׺=Q=L9^/v]CviUoT0%s~Hr;}6.D+qU릍u=0(0mtmeߵ^ebqgSeNofYc] lqRk^sR/GMw.zW^g4&yuھ>L^iɞ~﷯`e{dU)w'9翏~sr|`$9젢Q(Зy5om!]OVkøK",ψ2v6jQ'=#)%TB =6WH(A81Y( kc֬s5,݅Uj!dqBo=mgWƎ<ǒuQdե$jk ^̙9ˮ1ur^ޑ*w<ʪ˱k*vE,CJq1q ϙK26PAё0ֱ 졖1fa=R@#d!!=U\!.um %2MVPgh T5P;5L&֜T-e"[kKvQK#2^Z:[ޗ =v+x#rqxnO7rȣ)pF'V:p@{9IؽCOAJhܺGnPBt-"U]Vtt^^yaѵ_ -<@/wpo åy%dfJCش9XV0H%V.ƐoU̒*]YxlsuFJϛx'mrK(7EX3͵O/sIĨBzN28sߊw0>. _ @}3R";ć|oSxm̳ByMnB$$m/c$kNέ@h]b ŊaݺFHWP#i Q2u:)|kg6! OBxXiXp$k R'^thҶ˧4$7h" ⳋؗ]u$>:|5'+[R sQAjQmRR_n6yRET[y|O2C}g}g2y|ҪtJV{/5gJws9||"nW+R ^FV%fY<˰&/ uk9pWVG:NbZbebBe(3&@}Uέ2`SS!; C !GIT\uq8\ncvn}af.>q%:xS]<=gN͟hLXXm&$4zڵ"ۉ.OZxgX}}889&ף[C'\[ F>vBڱt+CE|?'_=WAIxRqMEAz Ij&a}NQ1QC4YyήbJqzhWo|EU$N>sFr ŤڼYޘ\}#>l'JyϚJUi#Q},@zWQt]gb Zp뭏.i]-{҃K:;v6=tTZO yA4Q"L*e $(4Oon&ngjj7w&}WYf/op/UUr꣒U:Xx<\um\{.Vf][|x8ܫ&C5ueq(wc҆lWkQx>AGu6kcwTD\s2=˺М.ݓ\Y"綻IIoR*߄xI3mS2qչ$Ꮶ U%Ui6^'Fs-{;:#۹)W,mR^1ɏ9oZiUE:]+Zkt+W:;׽ln\ oKʲ^{zÛBYG^|'R󫘹tN#ĬQU97KND!QusFQ5˼4DNf\m],+d2ZTP$"`i]%Sg~]Uy3\Ugr~aI]N%,#GgQrM(8vڷ7/m-bgYg>%*%H HBElp*, =[G v){yy^<8TLɉIu58|.j?=M[Ѣ3~YA{6~N* v_<{ *E\e&^uEKe6rIf煋!%7We:Bъ'J*Ww8tWVݨ/O'Mk1s .m>!̏q{9m\GRt}R䢍Kϐ]a{XMp-FO=8NUua 9^J~%WUP7RAʶ[l}y! %C:#)|UepR>Ov/g BSlFd >XjBO+.q%R'%^^K$o>ފYrr)vW'!vqcN7YcŜ &W˟e#+lSWG蒋m!K-Bx,WW9JźچS҄NN{;T참U6m.>Z9:||όkvKGôi,,.iLv N|kl˒ 7.kɹ'E^f]/>B3ͤ:WF;'MhsabG3A*>jxnJT#n(S>o َ6[7^¾w7B:Ԍ;g:+ gOE+ vTaDe:xt.nlg\S!eA2JQ"L aaMx@E㪧 r>~H֋3qxIŒImZUXyەϙ˚]N:.pjW:d4n%ʭ:)9 Sg`3;j- 8@V(-r\EܗkaH`;LO/Hn5*rEdqW܊:s_o{:Ǵd~>]CĠC^RtyE9kgjf|ⷫzS9lhʐ7)~eE0inSyj]a5];vKι$᝽"A'YXU|猜 e6&9<6彻nfnf"zMr)LMMy9w 0 6V̛45I&$*y .^ެy9UܙsNugf[<*.s ^,8蓈pK(жvGGӍ34xc 7W<xw]nLe8onw N3N\N#J^9gY-T agkn|{/ɛ#(RosƽNK3\3U8ӧs{VESEL9`aرq qyx0wX `g)q)xӍ~~/;T:\Z5.g.uV=鬚ՙԄYy~E•t;k8QY+37K]VnV,|Oj_h n@UV欵0SI;tZڲkZ/B.ϝqF|q=۩p'yzMQmVnnfnX˹V-ۋ4aW.mA9iuQ[0U-Gl"<יy8gLh{a*yr>)ad]Pou8tiB-*]Qxo7.d˺d5*઻<2%~weꕥP)v[w@]`pX4qڸaaN㋦]۵ptkvWCS}Yy[o]5bAEܷ="ؑ&pՎuEwP̝:ڼ^ 4 w^rӳ6^M૶Ъs㼯z:[ZqD͗өi6됼uJA ۇ3iMtZQr3d+Mګ`ޅۭ3kvU }Hh]9=4ÛKfŎVj6iKLaEWE*] n%r'׷eѨfl4!{`Է0/_/oհtY_gui.+WBN m᎖)}suٛ(N]z걽j>xXvFߦU^Pٷy uU4_x7V:R\YD1^ cP zǺe-M,YuV[:\)4^F&.n.k*U(dUZ4B'dB4(߭ev+± y ޝ)]-3W"n p8Y[EuGC ,k|T^ Τ b1,]s#iu׬W)˕BI!P=,8=h}pS'|\//yb1;VAW@.D=nVc's;&;nQ#;hp/H#tG-`$\An)<Ǜ'Ɠ=PQCߞic39q&Zda:iAl;9K-+׸㺫쎆 "Yn'=(466,Z=r˖vCө'+x@\0[C5-4-8Nڰ,I$ `еiE6Fz-Vk JSG̋>QyJ. \omc ӻJf/r2MaG<#dlhb+`QmxHHbV|C$E>/N3sEշR.SmS`y2 ՛tFJTby}m爲`yJ'c۶m{dUBu93)<57:SIZ}ìVշen ˉ}uc 狙0l4Qf!5j;^]We Z^,QW<ŇRy@V]֫lu Ur]O{"&S7 G*<#3%ȥP9WuϵTj$`FRoB뎬`ӝ Ùӏ^[N9fz2h{tm]C76W`7K ҭ]P^+.Ct<- TWrybue*cN:o>ψP Ao C]ƩlDxѾk)[7euty9tqQY⦌kd1/&Vr)-j]d{]{ͥ݉!+S.j!R=U& ѕ22.w+q\d.:,4.Ƅ*.~޷:@x^ UeU*URzCswRWÿvI.)5^3:cn]^eS2uMCPrGYAzFnq{ѫT_y-+%9;-|McŮ ؆6Nu{0Gˍ>T׾dXVmͪ/x@ýv/%vj"/ M7Yf+(zCx=qRՉ;lmv{UYU`9wowm7RókYԑ흧9Koze[Z<hYXfbCΐS={_NͶe1 հBa&! kY n>1R4VZX0n+\S36 |%˅K1"pj[E笗Gt1e=44c"A>Mѣ=Rӆq4!B׎iݒȭBb˩odk6"j䆞;OR!) †f.}3s(Ba"m ݑxq%n"J^ , bdU:¾T8ݸtO%u2f.Ji$=ې+פ4<ɤ xEV&% `l׭:±9ߔdB$ (ш_z]"3tO5⦕-Yl, Il gu\ZHf] 9KB7Jy"!hh *$xDcqTRopgMTQn*86"rI3n{aڃ ?j[bnBҺzi>;ic3quJ:_]mGg^_vL #t)=gz'bWnmGV]%n_{;8c)fVv ꮗYU%pF:]6_?^N[願sŕϺŋj`</ >~i5 O3R7 Ӈ?LX@Q?ۂR A[^DH9iq6BlwtwevQUZp/׏8\Y$4Epdx!4&^?/I8QHeuX"$ Rn#On&M YɆ^A#J݆~ncv$xCt p9c!P=Xo^\葫n 0%Y wq4% h"k-y!m% <)I ba Ƶ-e!%;aVeh0wd!\;mIZ > `4뀒|躌x@$QNɚɒW)  I$ҶU2KTAC>Rj\$L [V5SU)IQ䯛|gǾRB&ήmGѼ# ~$V2aX\P4!Ny%I* V*U-0[ۦo2>c "DQu2`5). D@B4JJ$pjTx ŷ3:qiюR<2n<<:۱EHC*DZbL&A4P(esw1e H]\ EGeg6A"+P(5XXU͚prI7Uˏ1(-x>\(@9YU0'YXr[oٷ ߙW6> 2.x8xiA8P5veEH4'edViߛhEit/|lƵBǞyR֚X.1]B5K1&F]Dut(Ѵ޽^}4[xJ_uڃ3E|U}m+r$yz{RkΫf8*}BDTln݇ה'R;{&5һ%;WVu4##iUlS{Tq4jKNkl2o$3)}!(IX|4Mu 9r \;u@blΠrZespz{>\ (٫-Cn0E(Mx $B@klxD0rsnfbNU *6*nV5YuF($:wCuص+5zB^dak04zfv Ȏ*ptm躢Ǻvr,s㖕RD{x^D(++RN/]ɘ&JctWRq۾fe^kK78lзU5.UabY$|6/sN69)%귶1c+,A5zDOkyrR˅)rN9T=K2SL-d>+ui-t|t*Yg6{v>{^}8햆4#Mnلˮᗶ- } lv}랊YS ;zc/sRhcxJpߋ9n4a̲@ mmi*H|ioKiN)Ldy`F졊Bغ OgJݠ`}#0vdGQ[eVTcqIN*lh=6оL&r6RTZ ڃ[}V{ 9بG՗(# "NF#]m΍.b 6TR< P @ESrj Qrw!@muvNx`FOzq=}^!X].+=z3v*]FtowFm\D1T]h+F h$w\,Ӌ(%hֲv[ڣʩkIsCLtC n4<k,PO'nQʙ!p÷ZQxKj|Zu. nr]rT[eyѳ(g9SgyurEPo'z-*w<>:BduI!Eզ]wrlaެ!&Z۸ss4Zp CN\'ݖX3;u 0ThTz8u].=g3ûX(HWcW6 +Y]p]qqܥN+k̜ uƇ,Y%փ{o0fgm::֑h!`K-P؈dkcrȭ5k$͘[ T r:r%/VX]!U\ 4^3SV:3J0d'jVUܲai.iWffKedWQQ@ZuZjwׇo)u >o0L*qFuV%Ûݒ]Rfr :nL"_՚ݣ0+Buam^irIST庪nwį]{޺9g GV:z'Ltr,Z5ӔeZuIdpU+v%^H }Ԯj!ޢ^WCaW^(jdž-OM![7hNb6qHł֫zb% ȇeI3UFJTpN8pꔯ7iܓ]s]FfѰ}XK2Nzm/]teκ+]$H+LW{^ ]=gb+w ys&Y;MsZ|V QgTt:}+ PtsZ1Ϊ|Pf8v;,vWhk01=m]QR6^o8w*MhYmwRҗ3s`~nL>UB>݀Βh:d諲ZJ- .:7S}ۏM&/ e|3ɫ١fR/fS1˃GgwuVz@ѰXƆ{M[!}7'JuĆ:47os rn~WyeuկT}# 3|X>㧫m TWՅi+ w:> {9=>yrK.!x WKv6b/ .qaYj,TyL}q.wLw<*ZYXGc7aowgmTM pTaeyu\ Z ޾/bAD6J;m^ܯ*8H; !X,vXU|JzDatơ ̺a,( r0'2̉UU~n8XUu5*:-KX\AчJ8x %eX=x\l6"ݶ1VfDBs.TL c6RYYwMu9+r| ! =; ]gZci6ƤATYƚ+01 Jr`|=5 ]a8,%ѐoЅ9#MqT<x _4ne)O=S6g^ L6sv\-y8ͭkq!AϋD4)^̬Ffr8o:*gURv&8Z3s+0fJUz9rw=b)nvάcY\82mk}(p, V {ueͷ#i ܨN~gc6i6a&RcFOqÃ;=^a{Mr|y" kX*|quv$ R4Wbdh{-Pp,v}Lx7+X7w.ygV3k/l(iZ+k72{[[Wz<*R&-p#ry׮I Y<퇍QŻ;ADuдq \0PKY]+ZlegVt.[ڳ7g QH=:yw^ t͉/̕T4fWqn8ZL̃hYbg/nAEh/298]ory4=bHj"٪>7U^Dĸرvpnsnnuem]hwbuBm>.eQdGa97aOoY~W=DOTn{X_;ܮWs+ڗgzu1oUVQ|\s,^Y']uj;&g 6 [7̺(VVwn%@&55wsVKhݬՕVeB ]S%̻j,hΓCBY^(st7/E+VxNv )#WZ}[S;4\.ƩonMkV\u;SbmZSqC䋯8jwnC3 Aww)YNL0C96]_j|v쬽}\/d:K7XWI}׻SxkV HV!vA3իn[-󦏚H [;gOwقQa[lm-J6M$1JHY}v N2]֮IBz BxD;}:#0m6e* گj}i⃧E}j:c|d[cumyWέ-oN *UUe[ӽ3]*`ъȻ)T9g*Olm,dKxI| UZR*G;*х ;ͮD5LT'ܿDXyxq `s6h(E?3=ytȡ @21qvM׆ĊGAQbi1VWW:VLO rO$;Sˡ$6lSJKKA`q;dP,D|1bj)liBOj#jKA*p뱡}u20mnZ+: OobH_2Ʈ3*C=e;p84Tӛ[/Pd#f>Å$KIFֽVH(.]<(R^0zV?x*G)O.lBujUM%Y,5 D9ei̓\5B" Y1,B)4|5V2 =k=O~=UGU7Ky|70Qr!d/XㇱWa_4}=m}'ՈI}~z4Q~C?'HH}L<?'?'r}sd +7^\o϶ Kյ-$B~鈾N|֧c$9p߮^J&6;V} bX4o+aH_l '/֘$Qlҷ[+zN.$En&"ZPƆ1'>O9߶OYK }T+.Z}=cg3/^~}}[_>~J_?^~dne4ۦU}z`uYra ?k`|Og1=z|Q+>Q}|p!aELAA>ow )?Dfȶˏͺ(軭ꌱf,!s<_͡V#X̔p?sˆu#t.H)mC˄~`DWԅoޕb+].ߓ_n5D=ϧg?40>COo~~~ŧϟÀaC!c3*z)kWk }aͷᄏוt[uāV]y8I=z(85z?5O}cʟŏ샛٤13Dۍu}_TDؽ a넗l;u 6h=_Ǎ$Gs%%SI zcߩ}?3vKz }w=<9p{q |$IU_?k0U|۹ߝ߿~ssߙ=ˠ4p/ܭ>>rl|dzϼ@O|Mۼ{_6`c6, |1~/W௟}}^(A+/1?>|W>rexϟ ג=ư~^]O=^XC8D WP?B"Om?i#L#[ܙuy{gZ)9Y͈O[XpJU{ħΗ(x"|!>1$ Iq)=W.31ac럕Sr?gw}XK?5|?9Q.8z"'O߹DI#k/mz<~4Ouϟ~eWUD$HUuFC?q}sEΒ(yfCZ'l|`֔ܧB }EK_<ϝ-w~\{z8N9~,il~,(afqܠbG/;ex?ZHoDp%ڢYI{M˟!}nzv_?7YȂ,|DMy>!˹cpmkCҕKRF.չjs"if{/=¨@ː#lOOʿ'xT?azsQ)~/~3ߟr|k?ոUr{6E^}2SosL(~@p?/rI wsr((ޠ?U?ӿ~~,48%I ! ^/((?!:}2`=,>|OS/~VwZK=./X~~?KԚ4;f^L?kڤ$] pVS`~OΞ~r{ ca>3|a?o֏ghڔ0g4?]ԟ*/'a.6؊S9H}Nc9!'+R1(}3 IE$i"G@dl Fw@}шHGϔz_/"o^E ]w*#zݏ2ic PiR>a[h/OY%K7@/bhV\B i~#@2VPDѽD0֟]qg02'J eqh _F^Xbr ?^~=~D%!"6>~?r_0|6Gۋg4d2B0K?5"_/۳PVO;qAu?O6 G~v?5P?͝G謹0İ?od8¼h *_gEտogw߆(!k`Yu?T'$?uq4V|D}@5Q"Co|3> .wd5ۋ ,zMdr_O;Se鬧/}f3FY>r *1l3I<,%ן· Y\ܙsnQO*7=Ov7^_b*% gHXx7rJwUFZH*2gmbM8hGLh`ĭiu$8EF?}(hCgCjF#R)>o0~P*x 2I~y>~`s,X>n'@8P?3չ=kݳ%}>DO.U}?h"/޺zZ_=ul3, J\~ #̌${kiSqv}A~{%+WӵVwPRoP>gk{U +՝/p˟S.uuwA5'L'Kv<.(} =>/Iǿi|?絘x6˗0O{>cYyY&/ٲBϥc.ҩ<(>%wmmG7/ŽÝWK"D~ҔH]#ۦ++b?(ݕság|?'|} r~}|La|]~7)oJSUb{H)}j򟲱,+wz>+> *V/1Ѓł3 }UTyy c"V!z6,ߞ k$oş6G bl"7׺d=Qi?ߛZKJW@U.x'<2V9 Lϟg?=Wa~WͧPe'Ӊq7@fzs=8Ϥ:+?o¡]nlS)a5qq9}R"$OB=>i!g{⠆$a)/ ?nCHB@z$Q!YM ωک'ۓD>U+ @P|},Ȯƿ{ρI={"XTT穇5nܞ#3uiU<, p>?}\2]Պ }B,a^P^A^AЇ=?c? =6.Tu? 9QgX,)3ِ4{z;ʺ#!G_}ه \Wlfץ~Nxüw<ogڞ*C=2![ [JUأ?σ*L4W}{4OPdWe?ZB4PlaE)FLA K籌 |(H ϗ?O>AC>sϯ~&X>}{>*D;ߔR>MY>!Hxϡ~ύ'` >P^wHR84F ~Mϐojw}rk+Y5A^[^bybGz:^A'c8sŐ¿ jD_ç'o 4m .C)}A/w_] 9'.~hy/!^`Jac{}}UPg_]0;ٞ.'"G֟Y`^q~O/s?+GX#__~ 2A|r'ކh߶}O/ԟnQXV+7;dgZ|ϾYlF(P%KlhlV(تdI&QP5,h4XH j,Hj2bd%2XD@Q1!61a2j1QƋFEAFƊ41M#TIZ5m4Qh1011"ZM -P 7ǯoXLͥT[ b6b4C2!_{8I$Xcw#}Fb1j(ҚI3iQRXMO\&IoLEQ6S"@ƨm0Y-D6,FѱIh̚ʼn6M2`lAlmIFţRdL[D$hZAPTʒ1-"FH5(1Af dQmEQRQ HTQ6FFPj4m%4,lQ4FD-43h2jB4H&ƓQ%A`MOz1`cH3i" VhI%QIhk̄2Y!EId/_Q&lj&)"X$ dDɑQIŤ bh 2M5V,&Lj HQ L$xhbK%WbKjLIP&X& 2QjE dIh1e ƄE1F1j_bX"&Ѧ$DFƴlbj!6,Ph XőQIKi2!J h+I$UbdPQz~#?>WߏE?[\]ys0晋\!^\3]n)q ׽vq³ { Loj@# 4e.T$y_ۿ2 eYK;3z{[[J^3/9?../(7cib̢sKfog9.1Zzh,ҍ@ FϓٖR ゆSW<{^sv-.]`xpy+{];e`ĉ]NBӬr'o=h9yL\1^op<))!$O4T+HJFm}o8\*- dB7lCƏrfۅeY6>a)qa(2KB42iad U;Yg57&2aVJ3Ȱd΃cZV ZwNd8c3~b,ma al01Ļ9?2,\M}zsGj?8M+M&$i4 d& 'Ϯ q2Li咇rggP&=q>ϰ}kj|>g,b¤_!Yb}kM|\<8I_JIa]B~ }f"U !dOm}cٯN>o wyWͩ*>fά1x~RHR$؋{cz]jED_D}.}N'ߓg w_%/qOÀ4I~?QqLB(.DbK߲YD};,*?O&HE fbj2{VH$K >1Z|>O!3=b>KCzߟ+k#[dB )~T$^&E?^)|P9ʨ_ @$~"|xB~wϻ 'R;ݟ/;#4>0 Mϸ>|:yKKy0"_@Fxj1+6ZK΅Qޝ3wNc7sPwMݵ$O ʿcp~~Ԅ:u- NS(4?ncN9ƷLk׃~y$",zQ@49n˖ZQAuwѸdy9g3֨%xTk(p<0EbrsjgNsyt1 TLJ@P8˙Mv'W">rjŃ 1 ܆dGL~/mll}yjruƱy"^Ј/n?ӥ@ʋD ھ‰X@CJ١TMy{Ɍ^GsN f{0eZ`DbrѤoI1:p³FYڍN#ɀÄ~\ϳ }}*(đy󮾩}pyWN |,4RDU^HiXeP*N4\"X^]8w{f/`6n0J>([Bׄ4(hVp4 ӀޓЎO& b+E$lf5nTdžlm4$ N_=u i0xr+fsߌ&d2>F=ExT,5liu|?. ̌߰i$גwPgiߗpdxr${yU$ (-{o}d4h1TjKDhƤ6PlC2Z(%b6#`b1TQlma+B d {z6ڋB&M2XV6466Fe&ϟvj_7Ȇ-4cb&F %Lb6F-cDʍC2Œ#&RbCTdbł4V ){|QT[E"fRDFmb,g]()b5b2*6V(4b+J6" *hPBRbX6b(؂5 Jj5ƈ߄q28ˀ8vUA9>yIb0XLI|W_Tsr^mE`iÀC(3ps'KwΐWw/R3d<<8jj^bQr5p6BѬ@:_ymP86[wIss3܃F <pX aX+'>r868meD@Mo:^{Fw+0ޱ`9 ^UTS9NJm!UN]6ml:7P_Z-*Vm`Pl+DKg9{gLFl9|dM’=bν %Ry{C <390q e9O<vOq^[0eyɽgR̵Ͱ+S.9R[9pS56\Riٜ2bֳV"n1D3Wdr 4N5sn!kȋPem tib ^HA^! DLr$|yR=q`(wnn iTVdpōdwwur)Dvو[h(eBі1+RPm*CP62YQ4l h@;B\4'w8\wp⋜J<( ܻ*QC.W9vpzw\L tj 7Uj/tǽӺܢX)p]K(Jsӻz;x1}hÔEL^TLP/(<c]!%ܧNu9ˮ;9nctsn㤜;Ls 91]]]ݹtS츖ܜ]rw9$hL*Ds]s%ݝvLd1Fww+\p rlc6eȊww\vsG';.m ?_wTKV,Kt<փPi\Ӯlww4:@#GKӇYStsuvqضykKoɕA&ۍHi+$q,Db0P]jK ͹ᇍ "8Nɝ_- bE]-o@ ~x)u Q֣z.ra'GOO❟>}=Yu~)-wGk[=jϰB>~[| u~ڛ,_u?  {{]NJ ?_һ>P>gsCPCߵ>|FJN5¾  @'B=(O;8s3ޜ1O>{M:2Y5_| ϛ#c3}YG~^ml*tlUוW^^ `y=M9SV[t}_B>~]\`\`RZ׵TYO>w~z/W<~vy'`}1ޝ7~ϐY z~I~|~7z~撱+}3ƶo \ߙ̘?'fÏZ@O400X?,Pk4AE϶@]>2?w=?۳\h1_+8m{{C7UQ3ι=pp)~Pyy|;LNcӡ>پL_N>oo5_y+'ςcio寿~{ɹ>`orщ~ﲿsx ퟙsOϨU ߟ+~__~_+_ϕ~AoO^zセSVM*ǧ?7OR+ˮEx|~z{0{(ӝ{ߟeB!4F=[Wc{vwgρ|,oeѵl]v?3n~oIz5.s7dt.7(ϳE_=jpk?]Q ڵ>}eXZW?OQd&1~|4>mP_/QyvW{p0W3Ϣ~w_Øk˺}6+pI٦J>+.O$YZ/,ٳik'ܹtϕL5FLa䳯?=?^M_">+5Tth~~~cs}avd>/}~:ͮO*[k}};k &Y~|'^%"stc&}O ]҇SO<:ډb ù3SYOĄDO?-;6^[?^bzn*qOƼb;ÏBl!ϥuS~/3}eCijyϐsNﱙώ?7ݺ ϋoU]_ૃmEJQϿ[4 ^Ue?kݾw,{7v ?rY$<+ο =ɔ_*!u,"oxB>r/Ĵ WϞ?~i?v1 _f2)]ߏ+/_ _O_ۃHg򸏗!i!~;l; f? ?ۥFͪwT,^G.t>ɻ[Oc jn_Lf8? ~(\y,؅NeKAm|}1{z*}(Qc~W,Kc囬/gЏ{Y}Oʞr`~S[~ǟ}2ճ[_zo"v='844|V|G/0ϫϣQ.E>y]W?<^1_(A(E~~~ÿ ҝJϵP ŖϪ5QWW^>}biV+=_~:F?M~ ߌ{)z?kE"2bo3b|<;!YwHW}?]\W{ng_U}?km VˢN{۷_~;GC;V67HT&=b+Sogp'?,omY5 mw圧-/g)fX:|>E>{{C3},5o}dW?=y}[e}4ZBWo }3E ; G~&??O'}Yˢk (w߃ُ,y䕿buw wagx(sn}C~딩8>WQWY'Gr.\j&EDUD;}vqy^Iݿ/Oޟ_}T~_ʬ5)~FBH9 DSuA-to̞?ϷRc?/ͲC> ϗ%+0f6-+=^l_&en㱥)}?kM?~/2ڟ~gg>5;WT{U[+=[|3[d5fgWڮO OwO'WYg߹~u:׾ӧ Sd{oB>]%nh(gǵA'i}ۿf"}#qWn~wM??/Nf^t=>U_o?ݘد17c1먾~_JVEcSQ s$=Q,=n[CN9l=ӷNB˿wOȽ&{r}~>!n8WT/}'_ȯ:.הݓw`Ԛpi>úW?O?(W?𮫯~zN'߲U+c_׷]G?~~U]|+NU>|}=_?-"'Ow"x|ʈ4BY2nu_?cn_a>6~oԨ}}_QESy߯nZyK|cQq*Ojzَ2_c~0,YpO}YϵSsG| G "{>4>y#>}/qC.LEСÙDyfow>~;?*v6;T|_]ct_!}}|(^>$O3hΆ|~;e!_7Kqmn3#E$)$sr(IQaP 仦i $ʜ/S<~g* D% dAB"|"V*[i{Namϟ=O;קR?G$ܽ pXOɛ9iT#Ü%/g攐BĆ /Ba$>JF ^mr7ĵu۽Q+"DgmNr]kʄ3ș$o?}|;ûʣ{ 9A9Y4){6+ ;rгi# [[U5rfEY($3xVwg1Ȉ43&/^\Ɇ&WD lQZvln鋚ɺ<Ӯk CkːkTDa=Y>j,=,R 7ΌxlE9TUV-wk`6e:x6l:ga"K=gD=t=31"\ qoxG( 9\c`(66UHRg1yNv0M[HZXNS*"qv7ȦR&DP!!qC0xsV\G<]oDjd.^it2ciRs/Ν[vqðk>>NYT}`FS% @^%|UΣ9ESt.<6U9 |i<$Bx3LiyQ&oO 6ܶx|uMEi㌼/Nzv 8R Þ{γc@t;CaOS].D,X ]Xc5/f5Z뜂7m?!&TxyA\ӾtOf^}f0sx&RäG1c>SDۭiApٖQ˳ uw4< :#̩L(ao.uQ0:X"-xiνH\YmΥGZ9P.;xc5 \6$ɮZN Fև^#C 79],]:=N:9Mûn"R?o?} y)o˴k[Kڌ]%\wg#m%}O%t& yk &ndj"!/0omg1wpswS/6f/~x9~ҧɍq4],ꃢ󜥾YR"vx_?_{Vڅdf5/6dvf]s>T(4#A5 d {ϗBl޽csv/g'T͎gA HVe: T^ZFisJΝe*SN:Spf}\ߞMe2K3'geZUwbyx̳#9X:睂`I6?*-cժ-LgyLyUO[rZF E4--4 دdA"l\>~*]xf {\CA-7I<@d"ʵM ^SN "89 -D*XAʔD9ޢV鯬 _*z%NoqدoJ]θc0y +J+~vj +N&e(֘L|wAD$\ 4FazW^>^'Ba{ϙ*xl4v8]kliD,b\88ltO_>XU"i2XBQ&4RlZ(ح1F)(dPP$ EF IPDDI**M$Mcf4VCbYZHS 5cd0b h jLb)6ɓA(ѣF-ř$ K4j,j Fы C F X2%cĔli(J+HF"LبecQb5i"L6(EM`Ѩc&Ŷ$XY$HDԄXdZ-F,hHej"نVM-& @DXeD$&TX AcL4DFE1FDɲmL &,@Y6S)dE4(J\#(آ  l,Dhf,Tb$,F2"6L4hEDb4)JL"$IbcbEd(o[}f"*"PT MlbƢhh+-T&-E!b!& 4&=FSbPZScMH-.vBTLTXƴhƒȅcXlFQm6,hѲkXɈԑcbF4FID$!IX$B- 13Ph6) 4EDMD1ۺTY4I4j5/(FHV6LeՋlj#R!be a d3}kd(宙D(ALZcQhX-cFV#lhѴIT3M3`L4L4QLQ$b e61y6hC)h,D#hرo눨ĉZ1A`-* eAcBTk5j4IQci6)IHMDfDm2RS$0`@I-F $C*$ѱI`#J IfQdej#IFd%ThJ+I%,$J( FiMIFD(K&~7"Kkb"<~L~,)^tk sHՒrhU]T\8NN 7irq2m;4h l2`̋]NĦqrc0Hhc+6Jc"iΛdN1ml{DlANѕN .y4l(6NdO.\t%avԊ[]֊N9vBh;'`2gW'&M0Lqbm#.ɩ r`YCțSѬFɸXјA2eF, V:6 .1ɷ,Mpij[^rI*1ƯS{)<]Y7" ޺I3ʹ&R-0Snv \ҹ֔TӞBL\EхN2wphT%S,]Ō9+ !]Qݸ+mpsyK&ݰ$09ywu|k$QܣtwW^l1_=ޒD,O;IRhb"1fZK"IIF+j ʃ^t#$Ao)M5ܬZ+0-\dXMJ3SA1L>{'y0 "E:WI yv]<9>;BO;˞t#ggBk*12rqLeLKrac q*KX4$o^IÓ<]CrRe n6!XQ)Z3lṉ(q* \h7)wX#qi̢Dp  qG ҆:&ð!Swu˜\ &;h ( ,r]2J *ISXmlܓ'$*[yp ILVq1S1[_/n2KݮCca)}ߊq_??IoOnus3!NsXvYT@LV^V!LT:H%nU#rK 4LyQm5i1`02ƘDGFΜ;1N\}=[1: QZڬbBnk,ηOp̻Ӏz`7]IlϞmW.fm6}{!wox2D~al|oӖ>_e?({brWSr[qQ&$*V*VD*Tz=#۱]0bN dG׮U_ߐ ܛ?_Χ?ch(oU++{ұUB|__ni>9)ȢPI1`TD@IR!Svcdd# 4 7P6@Q6F#mļ&͗RDU| ɥEhtK +yľJ \9%D. ?]˗oW=bo-o5LZ}>˥Q&?P-_-#|~ _?UJzU GY! CPTOT(K-/ cK;xiO=} Ŀ&lӇR>lvQKZHN&|$A$!u+: 0:.85>$/oQ_e0'= S~ݘQ>힯uPb"J,$R%@IaF 2& !B0&62s$FAPF$d6LaLkF$ch˜v層 S3I!(1664E͊ 3FJ&*$Lb(2"1Aɢ*J *CQF~'te2`BHZCDE#CR"; 13Ie6*D%\l3"lQRXi ƈj-%A٘I1 e!$Y TX҈QK$Jf(,fS&ChT!fL&@h2j10f&)5f%B0TV0aDhƍ1ejD4FI*!$FDŒA,D1X,m&,mFCXư[2hb1%*)%LJƄ!bKF32i dFƤ$neZ׾,Q*BJ$A5)?_ٟpA'~82,"- d ]}V h-b}[@ ,(f-#K5̰hfg5=zAU c1&1IZSch™~>wP-+~")AJT "" L6$&e5FYŃELQe1ad!dB%"&iSKbœILbMb4Z*BIcdѢea1lE I)2֍ 4m%%FMAK1E" F1(`(`EbƱZ4Zb~-MXlj4Tw~Ʃ**FF($%hL  4DL(FE ",S |DTt̔RX=ɚɩ,Fah4Y@4A&Li3S 3P0"LQQb4+&I5cG׭5V# ?nR "10EQ,hAaaHI0a,h(ԛ$X%Ab hBa2hfci4i1M/ۖ[&XD64dRY56%Pli i3&j"d&C%-H3d6#XJ4c$s?(gTCn_ﳼ{/y}z= τѠ~/z ~:hDV?a*>?{:?v%6_NjmZ)UDmMgo ߷?>۾| OzDvOcZ7AogeS񯸿>aPߴ/8=\#.|ϮY_Mڳ&x9z h 3D3齫JJ׿oaϧ)}s>z;[.OG$e :¶W^J9HGyC ye>iٌ̹7>ϧ2a]Ε38ip~_12ykHl\WBOnAdm/BƾUz?_[':̨HYzvta?Tuno>#ӿ (оCIﺽ az??*Yo|1^z6|~)/;_=*t)1sKxl>߾м__x wuK7ǿgyω8Aޱ[Qv/|lY-z{ ~V~w͒>21Hcr{_?l?|Nݟ]/}?eO7g|1̵_/} X9TE\׶3??|īGg1Ќ:Ƌݩ*|?{?ϛ:ϫSG>;Pt)lC?~UQ+ߟ0ͰQʭ?Fg-_|W{V|~c?_ߢ_}O˭z_Hcr~h|R- zSfd=􇿴=Al>5\r}rtTR!6CwIW_A_ ?GEݨ~QIS~5=7r&{9a| X"j nk_ӟ_Q~>p~j~5,A>NcXڑ~G_ߟa]o_s ?~lGMک׳={c~РOЉ~oԧ_]~s~Q}B>}#ߛvGV=/_L56?)xܥ-{wE寑mwS 1{X!_{ !e_7rgGXz|b_AOTx?ۖ??Gawϝ/YM>VA!_g|MQ=ߺ}Ow6og-VdwGpaGsOG>^ͱUcwڋԻg?? ,mgݡ;۸3 1~#xZ3[/^>Y>IW0r/ e//~jI'O7?߫Y~1ymu9:O;?ϬkɧOl~,_}دWGr~W^}ow`ޱ? ۧ˯?˯p*Tob_wщ޼庨I譾az}@ه?-,? S+q]1g6o/s+o/~,jpg_@_IZ:]fW>!cWT|oc_u[rvF!*_ԯ;~^|[??__?`NNo ~ N4 ͡R'9{>Z?~W{SϢ_??S͠}^{pI{Wz>,z??+oOןծw~o݋+i?_]|Y{)R@Ao+.l9t~GáT ^^=3@{?ew:ɦy_|$5!=HH^Iox@>ԧ['xB_ mE98U[f?\l9ϑHߟV2G?ۋoXb, |Ϳ7¬Y(URpӝ8;u]wQss5ucI.3M09_}obN~ 8yKU[o文OL"_֟}_{ޥ{R()rtT>8d O4`Y}Օ ʪJƚ{ʬ_@4h)DfHP՛Y#<&Be+zڕ&I';օMPbaƢ3}ʼ/AQ%pL v!yB{ o Y1!DG1n9lXϳxsQ?iur-ɧWr*]tZ(&wv,t(F빉`E$;-u2c1̵W!bR,PF0lQ Ql,Fgyp/wƻ2s.L:Gwa`` 0jQs&e,Pğ^)Í [ Y ,/k˄ח8mB㒾柂!rFĨeH+Ȱ#3Nf9njU+[6>y:?u}8.bW,)s16]D1dKO>Ku䧮7bC*e\wV淏ɑ=soKX׀)"44bn pj8f<5JCH[t@/k>}‰T1pj>a%^KN]b ZF rYəVd`j ѣJ׌j2;Y7W˜-qv3 #PbD&/==^m<(=! OUpR1꺖&lUԀ,Oڪ%,V'`Tt $x[TQ $їF\'_KFiC~Y[jyDU6VYaЇm^\*{U!kT}!ğzUi#Q6 )b}׀CxtWxJ`aP8) ]Ba!4;9ʢ}Gl%zLQZxs րi~/ؼ^iyQu+ 0 HM 0f>'ᕯ__pǨeEl#(̺[F(NULd~54rW< x2.ԁ,\J Wž jby:'~3ee5\^;_{ߓ_Z* "ɿ1\F}_BT Ē*)0A&"TQP )~F (+ff`3-$Ѣ4fb066 k3Ei D"ت&$@fT hJ64h*- `6Ƃ5ForZLdc%Ph&dR4QiP#1+X@BdC0lPQPffb1hj 1DlBd2bɲ2`5Ij,FXd@ QEI"FiQAE-F#dhQ!"#cFdجFbQ! I%b"R"P$JLRFLPZĔZ,V6dFaF4V(b!,TIQb+10LcX6FEb44I b!L6DY(lEY lPT@DȢ*"K$hI($EQ~Oۇ|bAe5 b&EAQBʒ""Bh1EM-id0T0EBbH !K61X5"ЛE3DC6%)AY61b Y,RE "(Q`đ3@lmԉY(D&FІ )4Q%2eBc`2fJ" TQRhB"6bm(10i4X#bń6T1i6 `ԚKcS1D0DV!*HH& ebڋ`ь[TibfRIi~C)li&D1 cE Db%C1XL5F}.cDb&PkIѢhTX4(EM- #(FPHTci H)@%c- " 1Y1DBIT  &"h5Q2HƤJ"aBQdY(6d S f̩KH P 4i-d(EcBCLfB@#)a$Ģ"MJDPM HVdS !IZ &HM""ef!!JDX6&DJ",heDCdZ4Y!HeHhBbLVdIARE%&lE,hB,Dj$,cd*eج F$d"1&LA3@EDRZ R4٤ U%%,2F(ђ",J#d i`A"ѱfDkM$ (6LIBS")3#0-D%LFJɒ6EJ& H5)!c%m e)c,*LHQbĔȊ!$bd4`ؑ(?;'?o_ook?_@ig` TkK-jXHdC| ??KP2h7ځ_'U6?oG96YEϬ}ɳ^Ҹ0l,Q_ v<>rُI.%zptJ}+xP*Yq8Z0۪NlLkati#*|JjrLb[ٻV'b.V@[ qb>ubh^)W?g}G~g^e BaidlYEm65%òD OIhks%PР((BG*VX: Ie re+%HP%]X۵K(7mS)su%%e8-8OMwGІ^֌IϭU|?c#~χ4W,C}mqgwiܞ(΀c_ڀ-]M KI} `~ LmE L~_")&G6Ҍא>fM^+-ni)FM/&ɗø&:%[t0֣ҀV9U֋C쑶/T,|n(( -.ps]M5zIKHF/ܴnP2a(䡪,R]un2~2uN(hͿ:'_b SRDiKh`B% Ie ZݠWA-tRJ1rNERQ#t%}rYJV%(6ʜVP%eB@WBrԩE G\, $[rPPA1`聮>_5Z,/l?t?jBD;bh^_Y`R؁I~.k~ {w@?M.ƬoS֑EVP#ߘӏWLqq@H#z:߷Prb IMsӍV),Oaڮɋ;17)/Eh ƭ98޺m  QPOᣲ%oc90؊T5`A~"!E5Oe6R!ӓη }o$q ;-fԚ_~g//W|?2BB85 YeJt -$CVs]`WKl*r mz0": %4 B,$ •J %vDeJt7g߿~ْOpƾo{n)-&vwgzNtP 'Ei}Uv#MU+xHVX$[@ouKR/-ݸ¸R)迹Iӛ3O)w{D{ߧO{oiޕ;oh]ۻ' d'K9zFw u$«ԉ,]7vxX^Kz"*^k牦8Dվm=NtKO(NvWISٺۓB ((b:Q8R I->w IJ@l}v9G S2VZN-r@NʐVd8lP[HFuIdp)),)Ѐ8R9)lS)~O}}ďy|3WY[+ Sv0_8o*qdN4h$CVn \; 1 R H_(=dO#A`rse0 1EJL: =>agR{NHkn|ݻn)XvO+*tqGcfI[YlŨ[P0[lǶV;?f )]w?IlZꌈ:00Ʉ>*.ΕJ ՙZ5jhNiuhC~`Y6i㣗(BDP:b뵠`Q9m,PLB g)B*nP KJ)B9jШ[(0L2%eKBXPh ?mw Z"p @d_ a-\8Z:$G߯Xg},G8N1߯Kj6[a.c"~3s3DYGG|8ki螏?nj!!nL_e! !2N4f~&D=rldl#CqM` '|{w;νž*T33\k.oޙ&wX a6h?k`C vh:4Xr1{~p؁~KN Gȼ?w?/ e9IG E)NAHB!)SK&lv1! 9Aڤ(JRjХTdrW( IGH PPdФndF Ykvr@PADQDAP]gP i"{v}qIkc_n!5Nzamx(߉ٮEXT?W0X,WlS?zjPIr)yR膺m6k-|CfcfR]gH~Y8~rOhB>ޯf:ٌW=wM_zhNF9ǐ|3+B b b l)Dmit Y`sݽ:%cc(JBܠ8P@+6r-$`Lt:*J(ZFZTF9lm$p%tJ-AA?~'}|8W:$wHV KM*12{ 8*W%LSyz`1ZB׆U_D]wЖ_yʿ#So|+^.w)G4:`lcdl% `/KRr1q|C/YbWߋmD(j%x]S':${Ŭt[ y]QXI嘖5$te S$ 8KaǢ.3Kcn\I&4q~H6w_T׫& D%7ʲ b%90])%9l!H Z7`EJ"A R\8 @RABJs%G%J6Z')JriрөҊZ ]+(Zh?v._ d'n?"gU>`za2l6n0V4,T')#;ezo;~7Htْ'wo߫&"Z:chj^QEv6LI9c``QD}9R-ܻm-C=C'^)/^p]}a{ק.ґQK4 Nj6& R y] ^1|@ୡm/ˠqꒄ;A5ʀL:%$+(7R01Tsw|jV ?K~a%(l() JZrp9-8t#!-o(Q!̮ )j`2Z %-RI-vWKJYzE-Rڜ5iIC[J@)֖(( }lIHmLzj/ r|ۇK?¹ϯZ~*{7m~$NUJZ6]ĦB]Rtzd=~Ө_xߘY4%&}@nm})3v\:,5be1!l=i`| N8㦥 K'H!}q=(p9tw`2KQtu,{* SKJ-=8F>bh3\4O VG$Hy#-69g/ϙe0P%S$Kh^`RJteZQ'C"PX7@'@+VzXC(+C$ Xhe +(&H @a)š$aE6Z҄R- !( b b QRUJla.z 6C'aiO?Sa >{TE|a}S.ɭ D׶[l.QQxeH0tI<3@mQ#z+fbizCNn~z=.%9[rDŽQIf iRuȮIWVWAʮY%j6ѓKKmfٔ 0^ T\|Ac)t3w|`8iΔG[WBG)dL+IeQ%X eeDNe[+MT) )[ih:rpAv4vXܮG(Z̔Zge 2ePHAQs!+)DQPPQ8u_،zyp6M>}}${a(C,EOup[u_$Ȧafی!玟# )OeOg}&c#oGQޤOLSvk8\0X'~oXJI JMʛ+Tl:# 6m!`86L h(QРJX9-pQe(Pfԛ ` ImNpRvJ -pm (! wD5bƖq"GZEC|T!?ׯ$ki%(WI2X[=ꙞR p}b^7K>_۹0ustX/|P*րMѩC 3%JM AEAQPҒ $r FPrZVZtrZ$\-]XQ(8 D ,(9DYNs.ɒ2$p2-*n?Mq%+WHfPJZr9,P?q;>}a؝s0|<`UI,Z!A!ΛgKX\H۹Wy̙Uÿ[}6n0xҥ+,WoٕhDS?+oL9#u+b*z$)i~k_z,Qgfۡh5wdts |xaH1b MCbʉGN%B6Ce m"@3!FLA;4nRQC9ِMN>xpԌAp:Q*l7͠9*rQ(WBhՖФ% YHJoY/K-eN`2#- J)[))췫9iiidi#hg@̖JRp 7dd҅mB &}~𶟥MZB @1"Aҽ/4L~lGI?K+δ&H.th9 (T`qϋxJc'1^*Էl8g~$3w^QDf>=5Cmp\>Pu1˗ 0&tFI*"ʍNP~)h68z=I/Wwi?gCm`x޻Ό!Lg}u,Vг|6ܤ PPJ^P`- )G, 8INВ)i)Qhݡ\de pi)J2XBZ'(,@ X eJJB9:ݗ>7-:G$H( (bA!(3䤈 uW0VA+G6I8^=~O~_O THCM`ꣿ-Ի!jV_ խAǨkɄ: 9湶9|_!ve. -kݮ)g$oT'`nrX Uv ͝B͜_H`GL>?_?_nal)3v-hdL8m5A.˶m%+ zYg;src`fv _w: 8 s15j{Ko@/)mG1.63x B QFAP1Fx#_Ia"s!:.CI_| s7A[tᐛiLYvw0.]H)sb8|M\hsMMGRZoR_p m07ƟMN˷c4d3g\(9t&-պ7bAH]#M֚:W|w=g޹r==‰]s-/mspFbo:NM!0_Q8/L)ɿ(\sa$pw :G0 (b0(0A^rڶ+'!{jl9YCGo\vRBGCZk]Su -ܠ"mG6ٌLM )5.3Mv(҅@ BSLx'CU(l+9%50aaQPEQ0Z0X$NĞ&>e6Cuie)_I|ksNeD?@/5,`> +WFeWHC_ӺqfI!u1xk4r0ׯR[տ4 $R"BdTrUIdIns^\ ˾2KvrM`g]Qϳ̘sPmcV= M]g t]b6 ~=&f1(P|EM-NGvJ3x_aآ(/(Ghm%7;BvxbhlhJͶrmnI.\XқPhM0Bۮ&kvZmu3X M.rKaL PRo6{= rt -%7ClJ( ;v{z@QQa_ģ_ 8rD@KH4_CίV?d5geΰAVkuBh ߡiԅLJ۽D"[ۧ}z_XK-ߨ)p~:_<Vn!(RQ0ۙv́[cr&1oluҚm1i4Ͳ'=c0eٳ6͵vvЃs/-ZT En-53m]Ʀ͗/~7ǿeRK6.9BݱT0lP0ŏ3jgUWׅLq|2jO?EObS} C7PzQf0߶h߽OZv_ۜFR &* 5gSOH奚J>}5y5Hm8uъ#ХY7ˬ_&]C1𣩚i%k=EokR~C0p(ݤy01v!7CrS@T_O 9mrMhHm,5)K  tp*J-1wm1f3abSr1tr+`uviW1 d=I6}=`lƲYocYD2R-JKw-)7in(j@ 00΢=̖5TdbCWp{jGτ;W5^+{,kꆘ.:羃ksfnIm(&n7͓g9~GF'tC}Nfq &Z j6h\I:u Q3;l%+L_(sy98o #Rz RWy~t=YNr_">(/}H'4Yxx~31c/Dg}߃ v_`hsd{ p(pr0ͅ$PQ5]Пά h{2Q\V h %{2)QK}r\.qMJ֨>|1~s$IGpE}!)cn a 79(ƶ˖+7zc_kW.4,-.I`5 PfYv@ݮW\M6ҁԯj˕][;Uƺ/njcdT2(xS+E0"%Z@vs9<+iHIG@ =zF kG 2 zfTqIpU_1 zPò)Yj" +o'݃{|{qҷ"jzh=KLNoyf(%~}/H LkeKw2Jzo-kM2,鱝l7)0Y)ڙj vj2v퇶K(Ke:3RK~ nߧEMkfXȏ~/g">QLCdHl {;/ §,ۗCuz! ws+ Y8w@7}|%) Hv?տYrvm65}ˏ.0te&+ºnuL#0?)j(Z+~8Y3,9 1ϛB[~ 8ULv.qԤno <J Ֆb%VBHTQp/'WӯB/_EJ<Ns*lUX^ȴUjcxKTK66r87Sf {몳{l}Un}M={XcKh|x{Jaנo]4]뷽4==x=ފ[{ R<!mv=).Z{۷} pcS{Y}?~6o{lL)i i|zz5}//5?G}_3''5UV6`3s?2%_,(H7㭰iL%cw,s^1GT*1wp)O=vs6e^5sPZe1ʕ>=!os} 6+3&"srb݅44JP}ޭAQS6(ޠߖ(RyW^E~> rT?SggV30a?ϰ2]W۸ՌAрO֖?z /&_\ڝ/!u~w4a/p91+]Tq"1{܆Xd9;zhyCн0 #$7k:/:O~ )RΈPs sPuLHfAA>Y [T]&e< /Ђ j(7"{齙`woZmo\iM5=ޛScKN@ltKss=ݽL.tnR+g}۽+8M@_rto{8doܯfoc৾̈́P¯ݸ cl.J sF6FѲޖjgOcKn0a!`Aa~ʺm6i]e??. ё3N&8 [ u?WZ?$l|s(|uI 4fTƔ~_n\60q}7WzXoT~Uv]0 }sBa4c)5-ϭH '6b},ly@sé,4vEH۬lM#4uZ͖uͷ80'+,3:̛-vcMWB PcL{| `sc>g}ϱ?Oʤ›Bǰ6R=6]{v޳mmLnRPRӭєow;v166%f01n$.vA˶](Q⇷$1 +)&g ]FGe`aF!AFPlt@}ql;}dڳ7z*'(qkOv˪Ƽ~{c"R{,0tb{Wy8xјgsaYC%Zlƒr[e;>G|"lLO 4(;d,_[vݩhv3#s nnyr;9Q 7_&. |. h0=R> M;s__O7CV)p1YMv=6G7[a!6_WΗyT^yXʺiM3onjkvSKPmOcr.0@ޢ}&,SNn)(6ޒw˲E6Je& iݶ0w3m oWzb(QFQAaUR+3O?; mE/ _SC[5Hu c pmAJo}HT&O >q] U/b ?9j\_D? iOO>EjN=D ק|ԮҚ6!#R %=ů(ݜK<a ,Pz-t=Sefr,Ma|Qbo}׸f2g-7ꑇ{J;y %K²k" d|z0__ 0B 7G1(O}C l{Ӹ{=ُU})v @U9M3Z{ov?ߏ/ǾݍLofsҎ7BmC]7v.CoF_wmػEԶ6!-a96m e3fsQA Q]51ݯ֫zL-%gv͌<!G搎ԛZ?Lq HG_'5]ohW~?j=1KFI|$bAm-6l$R3ďZ. R| 鋰b|1׶)h?]V5& g@μ &CW#ǙS~o&&.սF!>BYUt;7h. %=0n7AѤ<ćlDky3xa"y_}_O1+s0I}٥]{nvc} v勷Ջ;ޔ6$SS*˛l;0r%viOkMo}l?a=/~gU!:C5\fTeeqՁ6§@B Exmrpa9LZҌw%2jxPQU)9P׭+>Eȏ,$AiXGLOkR /G5gx'{> "`P›{JaF1r|( LjH7zn1aQQxڨٽ鎦) vsm}/^jx2ܨmJ1%(osrjm{[Th%rkn44ͮ s)`A[n,o-bۘ=mm%;Cmއﴤ}u;Z]Y o~γ}3O(s?N'ظK$B?w_e??Oݣu$ȝX%,Mf~E"R' [v`aQIՈI&o\ sPUsm| ).1noV.ZHS=5lW[A8k{|X`~Om3#rRݰYQpZ"jH?՘T!pT np\}Vyc#Y⼎oj ư+Ȍx,Ai=v˻醴iuY0  cd휴 $Ol9i  -~Yǿ>>|z>>4zUwZdʽ{[fVU\k*^^]Ve^b3ʕy̗23.VQCmHq=Ԕـ{}vw0ݶ{={j{9k0iMq1iwSon=bߟݮ~y.򽞅x*|yg?ϕ%_Dy?[s3[3?]$!>b/*EH6k/l;{1C#d` oKS(gKnn %»=2Qatl/8#`-ETeofQuveE՞g@;D5:OjM>nzٕcD;j %OGUrx< zjA v6lQioGݷgZcA1ƏU㩠[5x7?ϿAER (қawmz2})si.iiR[n@g6зav)%7ԺC}56 s qi`2[zRc{ J;meck Nk\&>z{ = oL)LAgt ӄ?۩l֯ʦ(}Of~C!?y{BcH/HMWz%q0;#?ƓgZ oJu 5eS})ʆd紇Ǖ.E܎Vyn"%PQ>sH ~nn+x4sP RhecdUjYY 2mx 1kw\%s萑 -)[t]lŨ#%'yeGt3[}>_/bv ~^= Eʆߺ͏jaŷmԸ}齖{Sm52LƗzS{)~[$nm4] n݌QUnP R_KzJ ,ˇi$YNS;c'd\SIv4]veJc+n AAaCQAQg ]i{+rH=[RC%M0 `FbUXd-(JWUs%33{暬9ॠ,_{*?kTBeG~nS?EzNwj X?Q$Pu6w_Фhw q.ىa | G*iՠXn;P"x)44;}(-]G̪ր懯=K_)IQAX6;aY(i~|+6ޯfӜ"0A`QM@2j[P(.Sd;i1l޲݇M(n10mn҂:k-{]MKۑhHm %9mc$Xis7S].5nKцq@Fa1E`DaF!FQAr1>nK~n+SM^g.OI0][c Oed떪̈kMM%@Rw3P9xa?T&>̬G|o<5l:XbFT"eJOJ=S?9huͯ}#ǰnRzWHXrwM`JPn4pi%o d*SVqQBwڣGEo CqPw6niǺL12V r!Chzq/2r| Ӑl- Ozء ~  (m^+`jW u&5mvUi dfZݔ.ɹM9%!Xƺ]}~Cm$)@4.Z56lnCmpmwIn1f?z{fҲam:0(A( Ša(#0;c1yn4(y? Gh }8}'JʱM91~Q+4^U;FN1/3r!</HϷ\a 5jD=qSDw"_nkwn r錪4`f[{O.]]9 >_E׬U-ii۪*g~g'͘L/xajT]X klev lwl箉?Z8 /Ű+Tmzgu49Z1z vnC%r;L{j}}} 00 a0 (j=4ŒGi1.5L7KBm+kuĚ$`y͓(K(vpۭ6Ʀ%x7nz[+(`' i Cmht퓷npt6%2RݹˌG\#(l( jhPd2bm?o|}|ƫ67zx(lߔuF!cl`U{ܤ ~?0?eyxJ})gw)T;A.{1?=Xl?MlHCnI_ E읉? t- ,1NQ?C?~_SgηVզmXmf /!L) n6 v=b[tˇ8ac ىpDuEţ㽄 M w<mBTthz-Bm{l B';5$=(N{s;pyΉ'ccTӞDωɣTt%xnRߧo?_q[ԍ `t5P{/Y X!|n& ŻmΞm7? Sm6E1 ]Pojhj>׻wv-5[S;i6DɺlZ^]i6ۣRû=.֒v-c-62ƴ)fbGC˷0n.61hmNZdmRPVKPEbfeIwцnΪ\B|4&G:EЯԿkY(` G9|WXB2YUr-(})}:?-EJK Mtg;_Е@?lǡSO Q-}~|£.*  RS>[`g̓F.oiHF2)e82'-1<69w_&ZS]#YH17yOD֏fܮh?w"cWa˕~ p2b]c# rey!&mwAAJס%}O>Kpݷwx\W1 #iQF2iJ=*X-p/6}ǤLHg?Ͽ`e&ڔ! +n J@S$Q6mqO/ga:":U9+D܌h]Dy>Ov۶fIn4(Cd6Ř-)^ ,ط] #t2[])t)m]up h2@ܫZq)WΔijzcdSn'Cl]zҲ +i$6횘6c L"\KV1~rۂK(+kn)Z#,-~ cSQlmY$,6y#W1QW?U#݌tN3!uY ?dGߙ:Zۡ37)?t}f_j7{v`ZJEŮ]q^t-TŒkہN:jwv(2bS֯ЎG1./:eQz!@g^\"]eiN,7N5;X|#__2> |\mU$U$X5Ҳβ|&~70^/ם&Oe)6m%ۣ.:]-tBYUٰcu67MژZI rmۥet*T H,r58F*ܦ]D 't\Ӂ3Ёt ֆ0L[LBm1Œ(WGwD؎pAT?9vsquk؉m^3M_ʨ+o~Ǡ L}֋!{Ce[8dy~ISCѮg$Vd>-Kyw l3hOqOM]A>GHg|3_`hߺߠ/-`h4U.$1ag_ /$S˶cr+HyLOC־[g89 sF_^:C^}w>}#ͶCkM)a-RLLr0m,))ںS+2Avuh [)dݵp)e즁XvZlܻ06464fmchjW]ƒ[/f2 ut`;KnaPaFaaF|d3?Ǻk4&I?_qkao| i(גˈumٸ[MIpo kskogMZ9KS079JߐܕƯF&dE/dA>Ǜg4y[.TOaz7NrrFXM-'G׻- ƔoRthZɖ /3b1}<{s ɓ"F66l5֗]96C\ݡ:vhZ z~;|_O>1"P6zVaq@9cb́8e8}t% ;Ml1 evG V\fYdCg{)7A۲VfIK Jlێ Jᇈei[oq},a֘*rʂRFPs ADAyNB'er:JmjJ ̋L-o?y6[X GOcza5t?ߥ"Oj/\vl^ Iʹ': w9JnK>/y>Xk6W8 vk ݧ(@Mq4ڽ޶,K `#t;R!VC }b[!L:S!4J``oȾxS<0/˖v\!u:ͦ["eJ$"jqccp Cx=RyE/|:&Ĵ-+mtRPd- :Jr 6V֤Kg%VPn R lv8K`s,rC;*VBp-!EQE1 o)܇41oBЗG,1n2˼?f_Q]ʵ Q]~Bn|l(-DYC_xtUg8A yKM_W}5$_mB{%$6 \|<W\횉pۤxMQUZ P;:g0}KFSl6'ϋﵪk${{|شjT*g }h?+یIy7jn`C??}9@ط=fåKe];6c(ڭ lb:6ˁvCPo=-R J9n\S( y=lwl FvJiޚkeиZQSLAmva6vl#mxClܱM?{~F:yY; 5>~7&ҍzÐ?^,+_tiN8^cp/p(a៵ߴYFd̒}CfQ~Y!k'"AШ+}4:L^/=_pڮ}-LĔО D?Bmo:a>6y$ۜ U'Ih+;\DĪzeMStc!ҾD܃ʜT0(Б ,XΜX;"Ju.z;*G]|*NQdFӽ j" !jl.ԖL91kMcT͵r3D̔֐8(mmmƭ`rkx ݀ոH&XH9M46NѲhZX::K^JnzK Kvm)vi&P!G56{@a{ŗwdyX||'% H?;Xu~~iO2}Qe077=y#[=Qom$J^btdO#֕aG~;"grNt*+=;)Ƒi4utʮViDr ~bc<n<T1V/pl1 1}a*7?{(+B[YU1#xzZG >T`)mffJaHV5 o3ԝq}{}}>M.g6P$ޖRiqiZݵ$b]KL"!aݓz lgM j9s'e5.۴JZKH!1Δ ;hmbQ3W@󍷾Md[lLAEPBaPK6_"|*dSU8Q,^a0g1!|'c( $_c9q?VFP^JOj(tFEL8SΩN3F$v>75^}v9kcN7(I̓@hȽ4WU3d&9^-΢K/Q##K#ce߶zU==2k .F57C`|mU ۋj'!eLi nۛlJl&@C7M Te-'02Cct u8%*rXN`\lID)nf`Bٍ&]mԠe& +݉p)[JX0R%@rцaaEADf^?RYf˸kC;rR[ '__N&;9s !o/K{hۜbmq#Ix0T ݗ$SW#;~R>ѽzobL//kǚъ*(rO|f۾h c_k$F{ +d,1hLL9^%1낖CD15SiJ\M3l4O0H8R7鞅,!Z2K?x7 Lu&?ǿ3'}#?x:Y%o.]rݪ3vKqCh"m\k܂m%l]LjmvKjjkLn4EdͶƖܤ6h%kqLdi] s }1罹p4 ml%e^sr]tH.(~DzzC= /<Ѽ{&.G% n#L [R g8,l߆қҼ&X”OрU#%zX=&=̯0vɟ۱ola;OljðT"gPkO7Ze+S%r}v1>\p^"U]6,iT]ᾫM[KdAbyuY"r; :&NpՓfCTI(0ʹ|'$sn Ňx̿ Ee}%ٹM.eSM.- &Zijji&ٽMTvV]ZFJhl)55uK&i [61Jn1cJ5J6e1l 6͛qlxǨ65p ez{v)z 2Q`A!_3\V3N]nJE|K>_u!78cuXD[yAZ?~}}:&~ kwC r{N@ ٛ<MSK1['k[ڹ^G^]X}o~O˥*`ږP¹(N$ aNWhhF EaN!IFe ABѻKlD l-X r`Xv*JUhW(suQPV[\kr+t{sx7H$rE8P@xtibus-table-1.9.1/debian/000077500000000000000000000000001241251735600150015ustar00rootroot00000000000000ibus-table-1.9.1/debian/README.Debian000066400000000000000000000002631241251735600170430ustar00rootroot00000000000000ibus-table for Debian --------------------- -- oneleaf Thu, 11 Sep 2008 10:45:56 +0800 ibus-table-1.9.1/debian/changelog000066400000000000000000000006151241251735600166550ustar00rootroot00000000000000ibus-table (1.4.99.20121012-1) unstable; urgency=low * Update version to git 1.4.99.20121012 * simplify rules with debhelper > 7. -- oneleaf Sun, 28 Oct 2012 09:19:59 +0000 ibus-table (0.1.1.20080901-1) unstable; urgency=low * Initial release (Closes: #nnnn) -- oneleaf Thu, 11 Sep 2008 10:45:56 +0800 ibus-table-1.9.1/debian/compat000066400000000000000000000000021241251735600161770ustar00rootroot000000000000005 ibus-table-1.9.1/debian/control000066400000000000000000000010431241251735600164020ustar00rootroot00000000000000Source: ibus-table Section: unknown Priority: extra Maintainer: oneleaf Build-Depends: debhelper (>= 7.0.50~), autotools-dev Standards-Version: 3.7.2 Package: ibus-table Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends}, ibus Description: IBus-Table IBus-Table is the IM Engine framework for table-based input methods, such as ZhengMa, WuBi, ErBi, ChangJie and so on. This package only provide the framwork and the specific input engine database need be install from ibus-table-zhengma, ibus-table-wubi and etc. ibus-table-1.9.1/debian/copyright000066400000000000000000000010761241251735600167400ustar00rootroot00000000000000This package was debianized by oneleaf on Thu, 11 Sep 2008 09:58:03 +0800. It was downloaded from Upstream Author(s): Shawn.P.Huang Copyright: License: GNU Lesser General Public License The Debian packaging is (C) 2008, oneleaf and is licensed under the GPL, see `/usr/share/common-licenses/GPL'. # Please also look if there are files or directories which have a # different copyright/license attached and list them here. ibus-table-1.9.1/debian/cron.d.ex000066400000000000000000000001311241251735600165150ustar00rootroot00000000000000# # Regular cron jobs for the ibus-table package # 0 4 * * * root ibus-table_maintenance ibus-table-1.9.1/debian/dirs000066400000000000000000000000211241251735600156560ustar00rootroot00000000000000usr/bin usr/sbin ibus-table-1.9.1/debian/docs000066400000000000000000000000141241251735600156470ustar00rootroot00000000000000NEWS README ibus-table-1.9.1/debian/emacsen-install.ex000066400000000000000000000023321241251735600204160ustar00rootroot00000000000000#! /bin/sh -e # /usr/lib/emacsen-common/packages/install/ibus-table # Written by Jim Van Zandt , borrowing heavily # from the install scripts for gettext by Santiago Vila # and octave by Dirk Eddelbuettel . FLAVOR=$1 PACKAGE=ibus-table if [ ${FLAVOR} = emacs ]; then exit 0; fi echo install/${PACKAGE}: Handling install for emacsen flavor ${FLAVOR} #FLAVORTEST=`echo $FLAVOR | cut -c-6` #if [ ${FLAVORTEST} = xemacs ] ; then # SITEFLAG="-no-site-file" #else # SITEFLAG="--no-site-file" #fi FLAGS="${SITEFLAG} -q -batch -l path.el -f batch-byte-compile" ELDIR=/usr/share/emacs/site-lisp/${PACKAGE} ELCDIR=/usr/share/${FLAVOR}/site-lisp/${PACKAGE} # Install-info-altdir does not actually exist. # Maybe somebody will write it. if test -x /usr/sbin/install-info-altdir; then echo install/${PACKAGE}: install Info links for ${FLAVOR} install-info-altdir --quiet --section "" "" --dirname=${FLAVOR} /usr/share/info/${PACKAGE}.info.gz fi install -m 755 -d ${ELCDIR} cd ${ELDIR} FILES=`echo *.el` cp ${FILES} ${ELCDIR} cd ${ELCDIR} cat << EOF > path.el (setq load-path (cons "." load-path) byte-compile-warnings nil) EOF ${FLAVOR} ${FLAGS} ${FILES} rm -f *.el path.el exit 0 ibus-table-1.9.1/debian/emacsen-remove.ex000066400000000000000000000007401241251735600202460ustar00rootroot00000000000000#!/bin/sh -e # /usr/lib/emacsen-common/packages/remove/ibus-table FLAVOR=$1 PACKAGE=ibus-table if [ ${FLAVOR} != emacs ]; then if test -x /usr/sbin/install-info-altdir; then echo remove/${PACKAGE}: removing Info links for ${FLAVOR} install-info-altdir --quiet --remove --dirname=${FLAVOR} /usr/share/info/ibus-table.info.gz fi echo remove/${PACKAGE}: purging byte-compiled files for ${FLAVOR} rm -rf /usr/share/${FLAVOR}/site-lisp/${PACKAGE} fi ibus-table-1.9.1/debian/emacsen-startup.ex000066400000000000000000000022231241251735600204510ustar00rootroot00000000000000;; -*-emacs-lisp-*- ;; ;; Emacs startup file, e.g. /etc/emacs/site-start.d/50ibus-table.el ;; for the Debian ibus-table package ;; ;; Originally contributed by Nils Naumann ;; Modified by Dirk Eddelbuettel ;; Adapted for dh-make by Jim Van Zandt ;; The ibus-table package follows the Debian/GNU Linux 'emacsen' policy and ;; byte-compiles its elisp files for each 'emacs flavor' (emacs19, ;; xemacs19, emacs20, xemacs20...). The compiled code is then ;; installed in a subdirectory of the respective site-lisp directory. ;; We have to add this to the load-path: (let ((package-dir (concat "/usr/share/" (symbol-name flavor) "/site-lisp/ibus-table"))) ;; If package-dir does not exist, the ibus-table package must have ;; removed but not purged, and we should skip the setup. (when (file-directory-p package-dir) (setq load-path (cons package-dir load-path)) (autoload 'ibus-table-mode "ibus-table-mode" "Major mode for editing ibus-table files." t) (add-to-list 'auto-mode-alist '("\\.ibus-table$" . ibus-table-mode)))) ibus-table-1.9.1/debian/ibus-table-default.ex000066400000000000000000000003641241251735600210130ustar00rootroot00000000000000# Defaults for ibus-table initscript # sourced by /etc/init.d/ibus-table # installed at /etc/default/ibus-table by the maintainer scripts # # This is a POSIX shell fragment # # Additional options that are passed to the Daemon. DAEMON_OPTS="" ibus-table-1.9.1/debian/ibus-table.doc-base.EX000066400000000000000000000010501241251735600207360ustar00rootroot00000000000000Document: ibus-table Title: Debian ibus-table Manual Author: Abstract: This manual describes what ibus-table is and how it can be used to manage online manuals on Debian systems. Section: unknown Format: debiandoc-sgml Files: /usr/share/doc/ibus-table/ibus-table.sgml.gz Format: postscript Files: /usr/share/doc/ibus-table/ibus-table.ps.gz Format: text Files: /usr/share/doc/ibus-table/ibus-table.text.gz Format: HTML Index: /usr/share/doc/ibus-table/html/index.html Files: /usr/share/doc/ibus-table/html/*.html ibus-table-1.9.1/debian/init.d.ex000066400000000000000000000100111241251735600165150ustar00rootroot00000000000000#! /bin/sh # # skeleton example file to build /etc/init.d/ scripts. # This file should be used to construct scripts for /etc/init.d. # # Written by Miquel van Smoorenburg . # Modified for Debian # by Ian Murdock . # Further changes by Javier Fernandez-Sanguino # # Version: @(#)skeleton 1.9 26-Feb-2001 miquels@cistron.nl # PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/ibus-table NAME=ibus-table DESC=ibus-table test -x $DAEMON || exit 0 LOGDIR=/var/log/ibus-table PIDFILE=/var/run/$NAME.pid DODTIME=1 # Time to wait for the server to die, in seconds # If this value is set too low you might not # let some servers to die gracefully and # 'restart' will not work # Include ibus-table defaults if available if [ -f /etc/default/ibus-table ] ; then . /etc/default/ibus-table fi set -e running_pid() { # Check if a given process pid's cmdline matches a given name pid=$1 name=$2 [ -z "$pid" ] && return 1 [ ! -d /proc/$pid ] && return 1 cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1` # Is this the expected child? [ "$cmd" != "$name" ] && return 1 return 0 } running() { # Check if the process is running looking at /proc # (works for all users) # No pidfile, probably no daemon present [ ! -f "$PIDFILE" ] && return 1 # Obtain the pid and check it against the binary name pid=`cat $PIDFILE` running_pid $pid $NAME || return 1 return 0 } force_stop() { # Forcefully kill the process [ ! -f "$PIDFILE" ] && return if running ; then kill -15 $pid # Is it really dead? [ -n "$DODTIME" ] && sleep "$DODTIME"s if running ; then kill -9 $pid [ -n "$DODTIME" ] && sleep "$DODTIME"s if running ; then echo "Cannot kill $LABEL (pid=$pid)!" exit 1 fi fi fi rm -f $PIDFILE return 0 } case "$1" in start) echo -n "Starting $DESC: " start-stop-daemon --start --quiet --pidfile $PIDFILE \ --exec $DAEMON -- $DAEMON_OPTS if running then echo "$NAME." else echo " ERROR." fi ;; stop) echo -n "Stopping $DESC: " start-stop-daemon --stop --quiet --pidfile $PIDFILE \ --exec $DAEMON echo "$NAME." ;; force-stop) echo -n "Forcefully stopping $DESC: " force_stop if ! running then echo "$NAME." else echo " ERROR." fi ;; #reload) # # If the daemon can reload its config files on the fly # for example by sending it SIGHUP, do it here. # # If the daemon responds to changes in its config file # directly anyway, make this a do-nothing entry. # # echo "Reloading $DESC configuration files." # start-stop-daemon --stop --signal 1 --quiet --pidfile \ # /var/run/$NAME.pid --exec $DAEMON #;; force-reload) # # If the "reload" option is implemented, move the "force-reload" # option to the "reload" entry above. If not, "force-reload" is # just the same as "restart" except that it does nothing if the # daemon isn't already running. # check wether $DAEMON is running. If so, restart start-stop-daemon --stop --test --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON \ && $0 restart \ || exit 0 ;; restart) echo -n "Restarting $DESC: " start-stop-daemon --stop --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON [ -n "$DODTIME" ] && sleep $DODTIME start-stop-daemon --start --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS echo "$NAME." ;; status) echo -n "$LABEL is " if running ; then echo "running" else echo " not running." exit 1 fi ;; *) N=/etc/init.d/$NAME # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2 echo "Usage: $N {start|stop|restart|force-reload|status|force-stop}" >&2 exit 1 ;; esac exit 0 ibus-table-1.9.1/debian/init.d.lsb.ex000066400000000000000000000205771241251735600173160ustar00rootroot00000000000000#!/bin/sh # # Example init.d script with LSB support. # # Please read this init.d carefully and modify the sections to # adjust it to the program you want to run. # # Copyright (c) 2007 Javier Fernandez-Sanguino # # This is free software; you may redistribute it and/or modify # it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2, # or (at your option) any later version. # # This is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License with # the Debian operating system, in /usr/share/common-licenses/GPL; if # not, write to the Free Software Foundation, Inc., 59 Temple Place, # Suite 330, Boston, MA 02111-1307 USA # ### BEGIN INIT INFO # Provides: ibus-table # Required-Start: $network $local_fs # Required-Stop: # Should-Start: $named # Should-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: # Description: # <...> # <...> ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/ibus-table # Introduce the server's location here NAME=#PACKAGE # Introduce the short server's name here DESC=#PACKAGE # Introduce a short description here LOGDIR=/var/log/ibus-table # Log directory to use PIDFILE=/var/run/$NAME.pid test -x $DAEMON || exit 0 test -x $DAEMON_WRAPPER || exit 0 . /lib/lsb/init-functions # Default options, these can be overriden by the information # at /etc/default/$NAME DAEMON_OPTS="" # Additional options given to the server DODTIME=10 # Time to wait for the server to die, in seconds # If this value is set too low you might not # let some servers to die gracefully and # 'restart' will not work LOGFILE=$LOGDIR/$NAME.log # Server logfile #DAEMONUSER=ibus-table # Users to run the daemons as. If this value # is set start-stop-daemon will chuid the server # Include defaults if available if [ -f /etc/default/$NAME ] ; then . /etc/default/$NAME fi # Use this if you want the user to explicitly set 'RUN' in # /etc/default/ #if [ "x$RUN" != "xyes" ] ; then # log_failure_msg "$NAME disabled, please adjust the configuration to your needs " # log_failure_msg "and then set RUN to 'yes' in /etc/default/$NAME to enable it." # exit 1 #fi # Check that the user exists (if we set a user) # Does the user exist? if [ -n "$DAEMONUSER" ] ; then if getent passwd | grep -q "^$DAEMONUSER:"; then # Obtain the uid and gid DAEMONUID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $3}'` DAEMONGID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $4}'` else log_failure_msg "The user $DAEMONUSER, required to run $NAME does not exist." exit 1 fi fi set -e running_pid() { # Check if a given process pid's cmdline matches a given name pid=$1 name=$2 [ -z "$pid" ] && return 1 [ ! -d /proc/$pid ] && return 1 cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1` # Is this the expected server [ "$cmd" != "$name" ] && return 1 return 0 } running() { # Check if the process is running looking at /proc # (works for all users) # No pidfile, probably no daemon present [ ! -f "$PIDFILE" ] && return 1 pid=`cat $PIDFILE` running_pid $pid $DAEMON_WRAPPER || return 1 return 0 } start_server() { # Start the process using the wrapper if [ -z "$DAEMONUSER" ] ; then start-stop-daemon --start --quiet --pidfile $PIDFILE \ --exec $DAEMON -- $DAEMON_OPTS errcode=$? else # if we are using a daemonuser then change the user id start-stop-daemon --start --quiet --pidfile $PIDFILE \ --chuid $DAEMONUSER \ --exec $DAEMON -- $DAEMON_OPTS errcode=$? fi return $errcode } stop_server() { # Stop the process using the wrapper if [ -z "$DAEMONUSER" ] ; then start-stop-daemon --stop --quiet --pidfile $PIDFILE \ --exec $DAEMON errcode=$ else # if we are using a daemonuser then look for process that match start-stop-daemon --stop --quiet --pidfile $PIDFILE \ --user $DAEMONUSER \ --exec $DAEMON errcode=$ fi return $errcode } reload_server() { [ ! -f "$PIDFILE" ] && return 1 pid=`cat $PIDFILE` # This is the daemon's pid # Send a SIGHUP kill -1 $pid return $? } force_stop() { # Force the process to die killing it manually [ ! -e "$PIDFILE" ] && return if running ; then kill -15 $pid # Is it really dead? sleep "$DIETIME"s if running ; then kill -9 $pid sleep "$DIETIME"s if running ; then echo "Cannot kill $NAME (pid=$pid)!" exit 1 fi fi fi rm -f $PIDFILE } case "$1" in start) log_daemon_msg "Starting $DESC " "$NAME" # Check if it's running first if running ; then log_progress_msg "apparently already running" log_end_msg 0 exit 0 fi if start_server && running ; then # It's ok, the server started and is running log_end_msg 0 else # Either we could not start it or it is not running # after we did # NOTE: Some servers might die some time after they start, # this code does not try to detect this and might give # a false positive (use 'status' for that) log_end_msg 1 fi ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" if running ; then # Only stop the server if we see it running stop_server log_end_msg $? else # If it's not running don't do anything log_progress_msg "apparently not running" log_end_msg 0 exit 0 fi ;; force-stop) # First try to stop gracefully the program $0 stop if running; then # If it's still running try to kill it more forcefully log_daemon_msg "Stopping (force) $DESC" "$NAME" force_stop log_end_msg $? fi ;; restart|force-reload) log_daemon_msg "Restarting $DESC" "$NAME" stop_server # Wait some sensible amount, some server need this [ -n "$DIETIME" ] && sleep $DIETIME start_server running log_end_msg $? ;; status) log_daemon_msg "Checking status of $DESC" "$NAME" if running ; then log_progress_msg "running" log_end_msg 0 else log_progress_msg "apparently not running" log_end_msg 1 exit 1 fi ;; # Use this if the daemon cannot reload reload) log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon" log_warning_msg "cannot re-read the config file (use restart)." ;; # And this if it cann #reload) # # If the daemon can reload its config files on the fly # for example by sending it SIGHUP, do it here. # # If the daemon responds to changes in its config file # directly anyway, make this a do-nothing entry. # # log_daemon_msg "Reloading $DESC configuration files" "$NAME" # if running ; then # reload_server # if ! running ; then # Process died after we tried to reload # log_progress_msg "died on reload" # log_end_msg 1 # exit 1 # fi # else # log_progress_msg "server is not running" # log_end_msg 1 # exit 1 # fi #;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2 exit 1 ;; esac exit 0 ibus-table-1.9.1/debian/manpage.1.ex000066400000000000000000000033411241251735600171070ustar00rootroot00000000000000.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH IBUS-TABLE SECTION "九月 11, 2008" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME ibus-table \- program to do something .SH SYNOPSIS .B ibus-table .RI [ options ] " files" ... .br .B bar .RI [ options ] " files" ... .SH DESCRIPTION This manual page documents briefly the .B ibus-table and .B bar commands. .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBibus-table\fP is a program that... .SH OPTIONS These programs follow the usual GNU command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. For a complete description, see the Info files. .TP .B \-h, \-\-help Show summary of options. .TP .B \-v, \-\-version Show version of program. .SH SEE ALSO .BR bar (1), .BR baz (1). .br The programs are documented fully by .IR "The Rise and Fall of a Fooish Bar" , available via the Info system. .SH AUTHOR ibus-table was written by . .PP This manual page was written by oneleaf , for the Debian project (but may be used by others). ibus-table-1.9.1/debian/manpage.sgml.ex000066400000000000000000000110461241251735600177120ustar00rootroot00000000000000 manpage.1'. You may view the manual page with: `docbook-to-man manpage.sgml | nroff -man | less'. A typical entry in a Makefile or Makefile.am is: manpage.1: manpage.sgml docbook-to-man $< > $@ The docbook-to-man binary is found in the docbook-to-man package. Please remember that if you create the nroff version in one of the debian/rules file targets (such as build), you will need to include docbook-to-man in your Build-Depends control field. --> FIRSTNAME"> SURNAME"> 九月 11, 2008"> SECTION"> oneleaf@gmail.com"> IBUS-TABLE"> Debian"> GNU"> GPL"> ]>
&dhemail;
&dhfirstname; &dhsurname; 2003 &dhusername; &dhdate;
&dhucpackage; &dhsection; &dhpackage; program to do something &dhpackage; DESCRIPTION This manual page documents briefly the &dhpackage; and bar commands. This manual page was written for the &debian; distribution because the original program does not have a manual page. Instead, it has documentation in the &gnu; Info format; see below. &dhpackage; is a program that... OPTIONS These programs follow the usual &gnu; command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. For a complete description, see the Info files. Show summary of options. Show version of program. SEE ALSO bar (1), baz (1). The programs are documented fully by The Rise and Fall of a Fooish Bar available via the Info system. AUTHOR This manual page was written by &dhusername; &dhemail; for the &debian; system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the &gnu; General Public License, Version 2 any later version published by the Free Software Foundation. On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL.
ibus-table-1.9.1/debian/manpage.xml.ex000066400000000000000000000106721241251735600175540ustar00rootroot00000000000000 .
will be generated. You may view the manual page with: nroff -man .
| less'. A typical entry in a Makefile or Makefile.am is: DB2MAN=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/\ manpages/docbook.xsl XP=xsltproc -''-nonet manpage.1: manpage.dbk $(XP) $(DB2MAN) $< The xsltproc binary is found in the xsltproc package. The XSL files are in docbook-xsl. Please remember that if you create the nroff version in one of the debian/rules file targets (such as build), you will need to include xsltproc and docbook-xsl in your Build-Depends control field. --> FIRSTNAME"> SURNAME"> 九月 11, 2008"> SECTION"> oneleaf@gmail.com"> IBUS-TABLE"> Debian"> GNU"> GPL"> ]>
&dhemail;
2007 &dhusername; &dhdate;
&dhucpackage; &dhsection; &dhpackage; program to do something &dhpackage; DESCRIPTION This manual page documents briefly the &dhpackage; and bar commands. This manual page was written for the &debian; distribution because the original program does not have a manual page. Instead, it has documentation in the &gnu; Info format; see below. &dhpackage; is a program that... OPTIONS These programs follow the usual &gnu; command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. For a complete description, see the Info files. Show summary of options. Show version of program. SEE ALSO bar (1), baz (1). The programs are documented fully by The Rise and Fall of a Fooish Bar available via the Info system. AUTHOR This manual page was written by &dhusername; &dhemail; for the &debian; system (but may be used by others). Permission is granted to copy, distribute and/or modify this document under the terms of the &gnu; General Public License, Version 2 any later version published by the Free Software Foundation. On Debian systems, the complete text of the GNU General Public License can be found in /usr/share/common-licenses/GPL.
ibus-table-1.9.1/debian/menu.ex000066400000000000000000000002071241251735600163020ustar00rootroot00000000000000?package(ibus-table):needs="X11|text|vc|wm" section="Applications/see-menu-manual"\ title="ibus-table" command="/usr/bin/ibus-table" ibus-table-1.9.1/debian/postinst.ex000066400000000000000000000017021241251735600172220ustar00rootroot00000000000000#!/bin/sh # postinst script for ibus-table # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `configure' # * `abort-upgrade' # * `abort-remove' `in-favour' # # * `abort-remove' # * `abort-deconfigure' `in-favour' # `removing' # # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package case "$1" in configure) ;; abort-upgrade|abort-remove|abort-deconfigure) ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 1 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 ibus-table-1.9.1/debian/postrm.ex000066400000000000000000000016471241251735600166730ustar00rootroot00000000000000#!/bin/sh # postrm script for ibus-table # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `remove' # * `purge' # * `upgrade' # * `failed-upgrade' # * `abort-install' # * `abort-install' # * `abort-upgrade' # * `disappear' # # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package case "$1" in purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) ;; *) echo "postrm called with unknown argument \`$1'" >&2 exit 1 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 ibus-table-1.9.1/debian/preinst.ex000066400000000000000000000012671241251735600170310ustar00rootroot00000000000000#!/bin/sh # preinst script for ibus-table # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `install' # * `install' # * `upgrade' # * `abort-upgrade' # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package case "$1" in install|upgrade) ;; abort-upgrade) ;; *) echo "preinst called with unknown argument \`$1'" >&2 exit 1 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 ibus-table-1.9.1/debian/prerm.ex000066400000000000000000000015621241251735600164700ustar00rootroot00000000000000#!/bin/sh # prerm script for ibus-table # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `remove' # * `upgrade' # * `failed-upgrade' # * `remove' `in-favour' # * `deconfigure' `in-favour' # `removing' # # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package case "$1" in remove|upgrade|deconfigure) ;; failed-upgrade) ;; *) echo "prerm called with unknown argument \`$1'" >&2 exit 1 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 ibus-table-1.9.1/debian/rules000077500000000000000000000000541241251735600160600ustar00rootroot00000000000000#!/usr/bin/make -f %: dh $@ --with python2 ibus-table-1.9.1/debian/watch.ex000066400000000000000000000012611241251735600164450ustar00rootroot00000000000000# Example watch control file for uscan # Rename this file to "watch" and then you can run the "uscan" command # to check for upstream updates and more. # See uscan(1) for format # Compulsory line, this is a version 3 file version=3 # Uncomment to examine a Webpage # #http://www.example.com/downloads.php ibus-table-(.*)\.tar\.gz # Uncomment to examine a Webserver directory #http://www.example.com/pub/ibus-table-(.*)\.tar\.gz # Uncommment to examine a FTP server #ftp://ftp.example.com/pub/ibus-table-(.*)\.tar\.gz debian uupdate # Uncomment to find new files on sourceforge, for debscripts >= 2.9 # http://sf.net/ibus-table/ibus-table-(.*)\.tar\.gz ibus-table-1.9.1/engine/000077500000000000000000000000001241251735600150245ustar00rootroot00000000000000ibus-table-1.9.1/engine/.gitignore000066400000000000000000000001311241251735600170070ustar00rootroot00000000000000table.xml table.xml.in ibus-engine-table ibus-table-createdb ibus-table-createdb.1 *.pyc ibus-table-1.9.1/engine/Makefile.am000066400000000000000000000036571241251735600170730ustar00rootroot00000000000000# vim:set noet ts=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # DOC2MAN = docbook2man SGML = ibus-table-createdb.sgml BUILT_MANS = ibus-table-createdb.1 man_MANS = $(BUILT_MANS) engine_table_PYTHON = \ chinese_variants.py \ factory.py \ main.py \ table.py \ tabcreatedb.py \ tabsqlitedb.py \ $(NULL) engine_table_DATA = \ $(NULL) engine_tabledir = $(datadir)/ibus-table/engine bin_SCRIPTS = ibus-table-createdb libexec_SCRIPTS = ibus-engine-table engine_DATA = table.xml enginedir = $(datadir)/ibus/component EXTRA_DIST = \ ibus-table-createdb.in \ ibus-engine-table.in \ table.xml.in \ $(SGML) \ $(BUILT_MANS) \ $(NULL) CLEANFILES = \ *.pyc \ *.pyo \ ibus-engine-table \ ibus-table-createdb \ table.xml \ $(NULL) MAINTAINERCLEANFILES = \ Makefile.in \ $(NULL) ${man_MANS}: ${SGML} $(AM_V_GEN) $(RM) $@; \ $(DOC2MAN) ${SGML}; \ $(RM) manpage.* table.xml: table.xml.in ( \ libexecdir=${libexecdir}; \ pkgdatadir=${pkgdatadir}; \ s=`cat $<`; \ eval "echo \"$${s}\""; \ ) > $@ test: $(ENV) \ IBUS_TABLE_LOCATION=$(abs_top_srcdir) \ DBUS_DEBUG=true \ LANG=en_US \ PYTHONPATH=$(abs_top_srcdir) \ $(PYTHON) $(srcdir)/main.py ibus-table-1.9.1/engine/chinese_variants.py000066400000000000000000002711121241251735600207270ustar00rootroot00000000000000#!/usr/bin/python # vim:fileencoding=utf-8:sw=4:et # auto-generated by “generate-chinese-variants.py”, do not edit here! # # Copyright (c) 2013 Mike FABIAN # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 3.0 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import sys if sys.version_info < (3,0,0): reload (sys) sys.setdefaultencoding('utf-8') variants_table = { # Meaning of the bits in the values: # 1 = 1 << 0 simplified Chinese # 2 = 1 << 1 traditional Chinese # 3 = (1 | 1 << 1) used both in simplified *and* traditional Chinese # 4 = 1 << 2 mixture of simplified and traditional Chinese u'〇': 3, u'㐽': 1, u'㑇': 1, u'㑈': 1, u'㑔': 1, u'㑩': 1, u'㑯': 2, u'㑳': 2, u'㒓': 2, u'㓥': 1, u'㓨': 2, u'㔉': 1, u'㖊': 1, u'㖞': 1, u'㗲': 2, u'㘎': 1, u'㘚': 2, u'㚯': 1, u'㛀': 1, u'㛟': 1, u'㛠': 1, u'㛣': 1, u'㛤': 1, u'㛿': 1, u'㜄': 2, u'㜏': 2, u'㜢': 2, u'㜷': 2, u'㞞': 2, u'㟆': 1, u'㟜': 1, u'㠏': 2, u'㢝': 2, u'㤘': 1, u'㥮': 2, u'㦎': 2, u'㧏': 1, u'㧐': 1, u'㧑': 1, u'㧟': 1, u'㧰': 1, u'㨫': 1, u'㩜': 2, u'㩳': 2, u'㭎': 1, u'㭏': 1, u'㭣': 1, u'㭤': 1, u'㭴': 1, u'㱩': 1, u'㱮': 1, u'㲿': 1, u'㳔': 1, u'㳕': 1, u'㳠': 1, u'㳡': 1, u'㳢': 1, u'㳽': 1, u'㶉': 1, u'㶶': 1, u'㶽': 1, u'㷿': 2, u'㺍': 1, u'㺏': 2, u'㻅': 1, u'㻏': 1, u'㻘': 1, u'㿧': 2, u'䀥': 1, u'䀹': 2, u'䁖': 1, u'䁪': 2, u'䁻': 2, u'䂵': 1, u'䅉': 1, u'䅪': 1, u'䇲': 1, u'䉙': 2, u'䉤': 1, u'䉬': 2, u'䉲': 2, u'䊭': 2, u'䊷': 2, u'䋙': 2, u'䋚': 2, u'䋻': 2, u'䋿': 2, u'䌈': 2, u'䌋': 2, u'䌖': 2, u'䌝': 2, u'䌟': 2, u'䌥': 2, u'䌰': 2, u'䌶': 1, u'䌷': 1, u'䌸': 1, u'䌹': 1, u'䌺': 1, u'䌻': 1, u'䌼': 1, u'䌽': 1, u'䌾': 1, u'䍀': 1, u'䍁': 1, u'䓕': 1, u'䕳': 2, u'䗖': 1, u'䗿': 2, u'䘛': 1, u'䘞': 1, u'䙊': 1, u'䙌': 1, u'䙓': 1, u'䙡': 2, u'䜀': 2, u'䜣': 1, u'䜤': 1, u'䜥': 1, u'䜧': 1, u'䜩': 1, u'䝙': 1, u'䝻': 2, u'䝼': 2, u'䞈': 2, u'䞌': 1, u'䞍': 1, u'䞎': 1, u'䞐': 1, u'䟢': 1, u'䢀': 1, u'䢁': 1, u'䢂': 1, u'䢨': 2, u'䥇': 2, u'䥩': 2, u'䥱': 2, u'䥺': 1, u'䥽': 1, u'䥾': 1, u'䥿': 1, u'䦀': 1, u'䦁': 1, u'䦂': 1, u'䦃': 1, u'䦅': 1, u'䦘': 2, u'䦛': 2, u'䦟': 2, u'䦳': 2, u'䦶': 1, u'䦷': 1, u'䧢': 2, u'䪏': 2, u'䪗': 2, u'䪘': 2, u'䫴': 2, u'䬘': 2, u'䬝': 2, u'䬞': 2, u'䭀': 2, u'䭃': 2, u'䭪': 1, u'䭿': 2, u'䮝': 2, u'䮞': 2, u'䮠': 2, u'䮫': 2, u'䮳': 2, u'䮾': 2, u'䯀': 2, u'䯃': 1, u'䯄': 1, u'䯅': 1, u'䰾': 2, u'䱙': 2, u'䱬': 2, u'䱰': 2, u'䱷': 2, u'䱽': 2, u'䲁': 2, u'䲖': 2, u'䲝': 1, u'䲞': 1, u'䲟': 1, u'䲠': 1, u'䲡': 1, u'䲢': 1, u'䲣': 1, u'䲰': 2, u'䴉': 2, u'䴓': 1, u'䴔': 1, u'䴕': 1, u'䴖': 1, u'䴗': 1, u'䴘': 1, u'䴙': 1, u'䴬': 2, u'䴴': 2, u'䶮': 1, u'万': 1, u'与': 1, u'丑': 1, u'专': 1, u'业': 1, u'丛': 1, u'东': 1, u'丝': 1, u'丟': 2, u'丢': 1, u'两': 1, u'严': 1, u'並': 2, u'丧': 1, u'个': 1, u'丰': 1, u'临': 1, u'为': 1, u'丽': 1, u'举': 1, u'么': 1, u'义': 1, u'乌': 1, u'乐': 1, u'乔': 1, u'习': 1, u'乡': 1, u'书': 1, u'买': 1, u'乱': 1, u'乾': 2, u'亂': 2, u'争': 1, u'于': 1, u'亏': 1, u'云': 1, u'亚': 1, u'亞': 2, u'产': 1, u'亩': 1, u'亲': 1, u'亵': 1, u'亸': 1, u'亿': 1, u'仅': 1, u'仆': 1, u'从': 1, u'仑': 1, u'仓': 1, u'仪': 1, u'们': 1, u'价': 1, u'众': 1, u'优': 1, u'会': 1, u'伛': 1, u'伞': 1, u'伟': 1, u'传': 1, u'伡': 1, u'伣': 1, u'伤': 1, u'伥': 1, u'伦': 1, u'伧': 1, u'伪': 1, u'伫': 1, u'佇': 2, u'体': 1, u'余': 3, u'佣': 1, u'佥': 1, u'併': 2, u'來': 2, u'侖': 2, u'侠': 1, u'侣': 1, u'侥': 1, u'侦': 1, u'侧': 1, u'侨': 1, u'侩': 1, u'侪': 1, u'侬': 1, u'侶': 2, u'俁': 2, u'係': 2, u'俔': 2, u'俠': 2, u'俣': 1, u'俥': 2, u'俦': 1, u'俨': 1, u'俩': 1, u'俪': 1, u'俫': 1, u'俭': 1, u'倀': 2, u'倆': 2, u'倈': 2, u'倉': 2, u'個': 2, u'們': 2, u'倫': 2, u'倲': 2, u'债': 1, u'倾': 1, u'偉': 2, u'偑': 2, u'偬': 1, u'側': 2, u'偵': 2, u'偻': 1, u'偽': 2, u'偾': 1, u'偿': 1, u'傑': 2, u'傖': 2, u'傘': 2, u'備': 2, u'傥': 1, u'傧': 1, u'储': 1, u'傩': 1, u'傭': 2, u'傯': 2, u'傳': 2, u'傴': 2, u'債': 2, u'傷': 2, u'傾': 2, u'僂': 2, u'僅': 2, u'僉': 2, u'僑': 2, u'僕': 2, u'僞': 2, u'僥': 2, u'僨': 2, u'價': 2, u'儀': 2, u'儂': 2, u'億': 2, u'儈': 2, u'儉': 2, u'儐': 2, u'儔': 2, u'儕': 2, u'儘': 2, u'償': 2, u'儣': 2, u'優': 2, u'儲': 2, u'儷': 2, u'儸': 2, u'儺': 2, u'儻': 2, u'儼': 2, u'儿': 1, u'克': 1, u'兌': 2, u'兑': 1, u'兒': 2, u'兖': 1, u'兗': 2, u'党': 1, u'內': 2, u'兩': 2, u'兰': 1, u'关': 1, u'兴': 1, u'兹': 1, u'养': 1, u'兽': 1, u'冁': 1, u'内': 1, u'冈': 1, u'冊': 2, u'册': 1, u'写': 1, u'军': 1, u'农': 1, u'冪': 2, u'冯': 1, u'冲': 1, u'决': 1, u'况': 1, u'冻': 1, u'净': 1, u'准': 1, u'凈': 2, u'凉': 1, u'凍': 2, u'减': 1, u'凑': 1, u'凙': 2, u'凛': 1, u'凜': 2, u'几': 1, u'凤': 1, u'凫': 1, u'凭': 1, u'凯': 1, u'凱': 2, u'击': 1, u'凿': 1, u'刍': 1, u'划': 1, u'刘': 1, u'则': 1, u'刚': 1, u'创': 1, u'删': 1, u'別': 2, u'刪': 2, u'别': 1, u'刬': 1, u'刭': 1, u'刮': 1, u'制': 1, u'刹': 1, u'刽': 1, u'刾': 1, u'刿': 1, u'剀': 1, u'剂': 1, u'剄': 2, u'則': 2, u'剋': 2, u'剎': 2, u'剐': 1, u'剑': 1, u'剗': 2, u'剛': 2, u'剝': 2, u'剥': 1, u'剧': 1, u'剮': 2, u'剴': 2, u'創': 2, u'剾': 2, u'劃': 2, u'劇': 2, u'劉': 2, u'劊': 2, u'劌': 2, u'劍': 2, u'劏': 2, u'劑': 2, u'劚': 2, u'劝': 1, u'办': 1, u'务': 1, u'劢': 1, u'动': 1, u'励': 1, u'劲': 1, u'劳': 1, u'势': 1, u'勁': 2, u'勋': 1, u'動': 2, u'務': 2, u'勚': 1, u'勛': 2, u'勝': 2, u'勞': 2, u'勢': 2, u'勩': 2, u'勱': 2, u'勵': 2, u'勸': 2, u'勻': 2, u'匀': 1, u'匦': 1, u'匭': 2, u'匮': 1, u'匯': 2, u'匱': 2, u'区': 1, u'医': 1, u'區': 2, u'华': 1, u'协': 1, u'協': 2, u'单': 1, u'卖': 1, u'卢': 1, u'卤': 1, u'卫': 1, u'却': 1, u'卻': 2, u'厂': 1, u'厅': 1, u'历': 1, u'厉': 1, u'压': 1, u'厌': 1, u'厍': 1, u'厐': 1, u'厕': 1, u'厘': 1, u'厙': 2, u'厢': 1, u'厣': 1, u'厦': 1, u'厨': 1, u'厩': 1, u'厭': 2, u'厮': 1, u'厲': 2, u'厴': 2, u'县': 1, u'叁': 1, u'参': 1, u'參': 2, u'叄': 2, u'双': 1, u'发': 1, u'变': 1, u'叙': 1, u'叠': 1, u'叢': 2, u'只': 1, u'台': 3, u'叶': 1, u'号': 1, u'叹': 1, u'叽': 1, u'同': 3, u'后': 3, u'向': 1, u'吒': 2, u'吓': 1, u'吕': 1, u'吗': 1, u'吣': 1, u'吨': 1, u'听': 1, u'启': 1, u'吳': 2, u'吴': 1, u'吶': 2, u'呂': 2, u'呐': 1, u'呒': 1, u'呓': 1, u'呕': 1, u'呖': 1, u'呗': 1, u'员': 1, u'呙': 1, u'呛': 1, u'呜': 1, u'咏': 1, u'咙': 1, u'咛': 1, u'咝': 1, u'咤': 1, u'咸': 1, u'咼': 2, u'响': 1, u'哑': 1, u'哒': 1, u'哓': 1, u'哔': 1, u'哕': 1, u'哗': 1, u'哙': 1, u'哜': 1, u'哝': 1, u'哟': 1, u'員': 2, u'哯': 2, u'唄': 2, u'唚': 2, u'唛': 1, u'唝': 1, u'唠': 1, u'唡': 1, u'唢': 1, u'唤': 1, u'問': 2, u'啞': 2, u'啟': 2, u'啢': 2, u'啧': 1, u'啬': 1, u'啭': 1, u'啮': 1, u'啯': 1, u'啰': 1, u'啴': 1, u'啸': 1, u'喎': 2, u'喚': 2, u'喪': 2, u'喬': 2, u'單': 2, u'喲': 2, u'喷': 1, u'喽': 1, u'喾': 1, u'嗆': 2, u'嗇': 2, u'嗊': 2, u'嗎': 2, u'嗚': 2, u'嗩': 2, u'嗫': 1, u'嗳': 1, u'嗶': 2, u'嗹': 2, u'嘆': 2, u'嘍': 2, u'嘓': 2, u'嘔': 2, u'嘖': 2, u'嘗': 2, u'嘘': 1, u'嘜': 2, u'嘤': 1, u'嘩': 2, u'嘮': 2, u'嘯': 2, u'嘰': 2, u'嘱': 1, u'嘵': 2, u'嘸': 2, u'嘽': 2, u'噅': 2, u'噓': 2, u'噚': 2, u'噜': 1, u'噝': 2, u'噠': 2, u'噥': 2, u'噦': 2, u'噯': 2, u'噲': 2, u'噴': 2, u'噸': 2, u'噹': 2, u'嚀': 2, u'嚇': 2, u'嚌': 2, u'嚕': 2, u'嚙': 2, u'嚣': 1, u'嚦': 2, u'嚨': 2, u'嚲': 2, u'嚳': 2, u'嚴': 2, u'嚶': 2, u'囀': 2, u'囁': 2, u'囂': 2, u'囅': 2, u'囈': 2, u'囉': 2, u'囑': 2, u'团': 1, u'囪': 2, u'园': 1, u'困': 1, u'囱': 1, u'围': 1, u'囵': 1, u'国': 1, u'图': 1, u'圆': 1, u'圇': 2, u'國': 2, u'圍': 2, u'園': 2, u'圓': 2, u'圖': 2, u'團': 2, u'圞': 2, u'圣': 1, u'圹': 1, u'场': 1, u'坂': 1, u'坏': 1, u'块': 1, u'坚': 1, u'坛': 1, u'坜': 1, u'坝': 1, u'坞': 1, u'坟': 1, u'坠': 1, u'垄': 1, u'垅': 1, u'垆': 1, u'垒': 1, u'垦': 1, u'垩': 1, u'垫': 1, u'垭': 1, u'垱': 1, u'垲': 1, u'垴': 1, u'垵': 2, u'埘': 1, u'埙': 1, u'埚': 1, u'埡': 2, u'埯': 1, u'埰': 2, u'執': 2, u'堅': 2, u'堊': 2, u'堑': 1, u'堕': 1, u'堖': 2, u'堝': 2, u'堯': 2, u'報': 2, u'場': 2, u'塊': 2, u'塋': 2, u'塏': 2, u'塒': 2, u'塗': 2, u'塢': 2, u'塤': 2, u'塵': 2, u'塹': 2, u'墊': 2, u'墙': 1, u'墜': 2, u'墮': 2, u'墳': 2, u'墾': 2, u'壇': 2, u'壈': 2, u'壋': 2, u'壓': 2, u'壘': 2, u'壙': 2, u'壚': 2, u'壞': 2, u'壟': 2, u'壠': 2, u'壢': 2, u'壩': 2, u'壮': 1, u'壯': 2, u'声': 1, u'壳': 1, u'壶': 1, u'壸': 1, u'壺': 2, u'壼': 2, u'壽': 2, u'处': 1, u'备': 1, u'复': 1, u'够': 1, u'夠': 2, u'夢': 2, u'头': 1, u'夸': 1, u'夹': 1, u'夺': 1, u'夾': 2, u'奁': 1, u'奂': 1, u'奋': 1, u'奐': 2, u'奖': 1, u'奥': 1, u'奧': 2, u'奩': 2, u'奪': 2, u'奮': 2, u'奸': 1, u'奼': 2, u'妆': 1, u'妇': 1, u'妈': 1, u'妝': 2, u'妩': 1, u'妪': 1, u'妫': 1, u'姍': 2, u'姗': 1, u'姦': 2, u'姹': 1, u'娄': 1, u'娅': 1, u'娆': 1, u'娇': 1, u'娈': 1, u'娛': 2, u'娱': 1, u'娲': 1, u'娴': 1, u'婁': 2, u'婦': 2, u'婭': 2, u'婳': 1, u'婴': 1, u'婵': 1, u'婶': 1, u'媧': 2, u'媪': 1, u'媭': 1, u'媯': 2, u'媰': 2, u'媼': 2, u'媽': 2, u'嫒': 1, u'嫔': 1, u'嫗': 2, u'嫱': 1, u'嫵': 2, u'嫻': 2, u'嫿': 2, u'嬃': 2, u'嬈': 2, u'嬋': 2, u'嬌': 2, u'嬙': 2, u'嬡': 2, u'嬤': 2, u'嬪': 2, u'嬰': 2, u'嬷': 1, u'嬸': 2, u'孋': 2, u'孌': 2, u'孙': 1, u'学': 1, u'孪': 1, u'孫': 2, u'學': 2, u'孿': 2, u'宁': 1, u'宝': 1, u'实': 1, u'宠': 1, u'审': 1, u'宪': 1, u'宫': 1, u'宮': 2, u'宽': 1, u'宾': 1, u'寝': 1, u'寢': 2, u'實': 2, u'寧': 2, u'審': 2, u'寫': 2, u'寬': 2, u'寵': 2, u'寶': 2, u'对': 1, u'寻': 1, u'导': 1, u'寿': 1, u'将': 1, u'將': 2, u'專': 2, u'尋': 2, u'對': 2, u'導': 2, u'尔': 1, u'尘': 1, u'尝': 1, u'尧': 1, u'尴': 1, u'尷': 2, u'尸': 1, u'尽': 1, u'层': 1, u'屃': 1, u'屆': 2, u'屉': 1, u'届': 1, u'屍': 2, u'屓': 2, u'屜': 2, u'属': 1, u'屡': 1, u'屢': 2, u'層': 2, u'屦': 1, u'屨': 2, u'屩': 2, u'屬': 2, u'屿': 1, u'岁': 1, u'岂': 1, u'岖': 1, u'岗': 1, u'岘': 1, u'岙': 1, u'岚': 1, u'岛': 1, u'岡': 2, u'岭': 1, u'岽': 1, u'岿': 1, u'峄': 1, u'峡': 1, u'峣': 1, u'峤': 1, u'峥': 1, u'峦': 1, u'峴': 2, u'島': 2, u'峽': 2, u'崂': 1, u'崃': 1, u'崄': 1, u'崍': 2, u'崗': 2, u'崢': 2, u'崬': 2, u'崭': 1, u'嵐': 2, u'嵘': 1, u'嵚': 1, u'嵝': 1, u'嵼': 2, u'嶁': 2, u'嶄': 2, u'嶇': 2, u'嶔': 2, u'嶗': 2, u'嶠': 2, u'嶢': 2, u'嶧': 2, u'嶮': 2, u'嶴': 2, u'嶸': 2, u'嶺': 2, u'嶼': 2, u'巅': 1, u'巋': 2, u'巒': 2, u'巔': 2, u'巩': 1, u'巯': 1, u'巰': 2, u'币': 1, u'帅': 1, u'师': 1, u'帏': 1, u'帐': 1, u'帘': 1, u'帜': 1, u'帥': 2, u'带': 1, u'帧': 1, u'師': 2, u'帮': 1, u'帱': 1, u'帳': 2, u'帶': 2, u'帻': 1, u'帼': 1, u'幀': 2, u'幂': 1, u'幃': 2, u'幗': 2, u'幘': 2, u'幟': 2, u'幣': 2, u'幫': 2, u'幬': 2, u'干': 1, u'并': 1, u'幹': 2, u'幺': 2, u'幾': 2, u'广': 1, u'庄': 1, u'庆': 1, u'庐': 1, u'庑': 1, u'库': 1, u'应': 1, u'庙': 1, u'庞': 1, u'废': 1, u'庫': 2, u'廁': 2, u'廂': 2, u'廄': 2, u'廈': 2, u'廚': 2, u'廝': 2, u'廟': 2, u'廠': 2, u'廡': 2, u'廢': 2, u'廣': 2, u'廩': 2, u'廪': 1, u'廬': 2, u'廳': 2, u'开': 1, u'异': 1, u'弃': 1, u'弑': 1, u'弒': 2, u'张': 1, u'弥': 1, u'弪': 1, u'弯': 1, u'弳': 2, u'張': 2, u'強': 2, u'弹': 1, u'强': 1, u'彈': 2, u'彌': 2, u'彎': 2, u'归': 1, u'当': 1, u'录': 1, u'彙': 2, u'彝': 1, u'彞': 2, u'彟': 1, u'彠': 2, u'彥': 2, u'彦': 1, u'彨': 1, u'彲': 2, u'彻': 1, u'征': 3, u'径': 1, u'後': 2, u'徑': 2, u'徕': 1, u'從': 2, u'徠': 2, u'御': 1, u'復': 2, u'徵': 3, u'徹': 2, u'忆': 1, u'忏': 1, u'志': 3, u'忧': 1, u'忾': 1, u'怀': 1, u'态': 1, u'怂': 1, u'怃': 1, u'怄': 1, u'怅': 1, u'怆': 1, u'怜': 1, u'总': 1, u'怼': 1, u'怿': 1, u'恆': 2, u'恋': 1, u'恒': 1, u'恥': 2, u'恳': 1, u'恶': 1, u'恸': 1, u'恹': 1, u'恺': 1, u'恻': 1, u'恼': 1, u'恽': 1, u'悅': 2, u'悞': 2, u'悦': 1, u'悫': 1, u'悬': 1, u'悭': 1, u'悮': 1, u'悯': 1, u'悵': 2, u'悶': 2, u'惊': 1, u'惡': 2, u'惧': 1, u'惨': 1, u'惩': 1, u'惫': 1, u'惬': 1, u'惭': 1, u'惮': 1, u'惯': 1, u'惱': 2, u'惲': 2, u'惻': 2, u'愛': 2, u'愜': 2, u'愠': 1, u'愤': 1, u'愦': 1, u'愨': 2, u'愴': 2, u'愷': 2, u'愾': 2, u'愿': 3, u'慄': 2, u'態': 2, u'慍': 2, u'慑': 1, u'慘': 2, u'慚': 2, u'慟': 2, u'慣': 2, u'慪': 2, u'慫': 2, u'慮': 2, u'慳': 2, u'慶': 2, u'憂': 2, u'憊': 2, u'憐': 2, u'憑': 2, u'憒': 2, u'憚': 2, u'憤': 2, u'憫': 2, u'憮': 2, u'憲': 2, u'憶': 2, u'懀': 2, u'懇': 2, u'應': 2, u'懌': 2, u'懍': 2, u'懑': 1, u'懒': 1, u'懔': 1, u'懟': 2, u'懣': 2, u'懨': 2, u'懲': 2, u'懶': 2, u'懷': 2, u'懸': 2, u'懺': 2, u'懼': 2, u'懾': 2, u'戀': 2, u'戆': 1, u'戇': 2, u'戋': 1, u'戏': 1, u'戔': 2, u'戗': 1, u'战': 1, u'戧': 2, u'戩': 2, u'戬': 1, u'戯': 1, u'戰': 2, u'戱': 2, u'戲': 2, u'戶': 2, u'户': 1, u'扑': 1, u'执': 1, u'扩': 1, u'扪': 1, u'扫': 1, u'扬': 1, u'扰': 1, u'抚': 1, u'抛': 1, u'抟': 1, u'抠': 1, u'抡': 1, u'抢': 1, u'护': 1, u'报': 1, u'担': 1, u'拋': 2, u'拟': 1, u'拢': 1, u'拣': 1, u'拥': 1, u'拦': 1, u'拧': 1, u'拨': 1, u'择': 1, u'挂': 1, u'挚': 1, u'挛': 1, u'挜': 1, u'挝': 1, u'挞': 1, u'挟': 1, u'挠': 1, u'挡': 1, u'挢': 1, u'挣': 1, u'挤': 1, u'挥': 1, u'挦': 1, u'挩': 2, u'挽': 1, u'挾': 2, u'捝': 1, u'捞': 1, u'损': 1, u'捡': 1, u'换': 1, u'捣': 1, u'捨': 2, u'捫': 2, u'据': 1, u'掃': 2, u'掄': 2, u'掆': 2, u'掗': 2, u'掙': 2, u'掛': 2, u'採': 2, u'掳': 1, u'掴': 1, u'掷': 1, u'掸': 1, u'掺': 1, u'掼': 1, u'揀': 2, u'揚': 2, u'換': 2, u'揮': 2, u'揽': 1, u'揾': 1, u'揿': 1, u'搀': 1, u'搁': 1, u'搂': 1, u'搅': 1, u'損': 2, u'搖': 2, u'搗': 2, u'搵': 2, u'搶': 2, u'携': 1, u'摄': 1, u'摅': 1, u'摆': 1, u'摇': 1, u'摈': 1, u'摊': 1, u'摋': 2, u'摑': 2, u'摜': 2, u'摟': 2, u'摯': 2, u'摳': 2, u'摶': 2, u'摻': 2, u'撄': 1, u'撈': 2, u'撏': 2, u'撐': 2, u'撑': 1, u'撓': 2, u'撝': 2, u'撟': 2, u'撣': 2, u'撥': 2, u'撫': 2, u'撲': 2, u'撳': 2, u'撵': 1, u'撷': 1, u'撸': 1, u'撺': 1, u'撻': 2, u'撾': 2, u'撿': 2, u'擁': 2, u'擄': 2, u'擇': 2, u'擊': 2, u'擋': 2, u'擓': 2, u'擔': 2, u'據': 2, u'擞': 1, u'擠': 2, u'擣': 2, u'擬': 2, u'擯': 2, u'擰': 2, u'擱': 2, u'擲': 2, u'擴': 2, u'擷': 2, u'擺': 2, u'擻': 2, u'擼': 2, u'擽': 2, u'擾': 2, u'攄': 2, u'攆': 2, u'攏': 2, u'攒': 1, u'攔': 2, u'攖': 2, u'攙': 2, u'攛': 2, u'攜': 2, u'攝': 2, u'攢': 2, u'攣': 2, u'攤': 2, u'攪': 2, u'攬': 2, u'敌': 1, u'敗': 2, u'敘': 2, u'敛': 1, u'敩': 1, u'数': 1, u'敵': 2, u'數': 2, u'斂': 2, u'斃': 2, u'斅': 2, u'斆': 2, u'斋': 1, u'斓': 1, u'斕': 2, u'斗': 1, u'斩': 1, u'斬': 2, u'断': 1, u'斷': 2, u'於': 2, u'无': 1, u'旧': 1, u'时': 1, u'旷': 1, u'旸': 1, u'昙': 1, u'昼': 1, u'昽': 1, u'显': 1, u'時': 2, u'晉': 2, u'晋': 1, u'晒': 1, u'晓': 1, u'晔': 1, u'晕': 1, u'晖': 1, u'晝': 2, u'暂': 1, u'暈': 2, u'暉': 2, u'暘': 2, u'暢': 2, u'暧': 1, u'暫': 2, u'曄': 2, u'曆': 2, u'曇': 2, u'曉': 2, u'曏': 2, u'曖': 2, u'曠': 2, u'曥': 2, u'曨': 2, u'曬': 2, u'書': 2, u'會': 2, u'朥': 2, u'朧': 2, u'术': 1, u'朴': 1, u'机': 1, u'杀': 1, u'杂': 1, u'权': 1, u'杆': 1, u'条': 1, u'来': 1, u'杨': 1, u'杩': 1, u'杰': 1, u'東': 2, u'杴': 2, u'松': 1, u'板': 1, u'极': 3, u'构': 1, u'枞': 1, u'枢': 1, u'枣': 1, u'枥': 1, u'枧': 1, u'枨': 1, u'枪': 1, u'枫': 1, u'枭': 1, u'柜': 1, u'柠': 1, u'柵': 2, u'柽': 1, u'栀': 1, u'栅': 1, u'标': 1, u'栈': 1, u'栉': 1, u'栊': 1, u'栋': 1, u'栌': 1, u'栎': 1, u'栏': 1, u'树': 1, u'栖': 1, u'栗': 1, u'样': 1, u'栾': 1, u'桠': 1, u'桡': 1, u'桢': 1, u'档': 1, u'桤': 1, u'桥': 1, u'桦': 1, u'桧': 1, u'桨': 1, u'桩': 1, u'桪': 1, u'桿': 2, u'梔': 2, u'梘': 2, u'條': 2, u'梟': 2, u'梦': 1, u'梲': 2, u'梼': 1, u'梾': 1, u'梿': 1, u'检': 1, u'棁': 1, u'棂': 1, u'棄': 2, u'棖': 2, u'棗': 2, u'棟': 2, u'棡': 2, u'棧': 2, u'棲': 2, u'棶': 2, u'椁': 1, u'椏': 2, u'椝': 1, u'椟': 1, u'椠': 1, u'椢': 1, u'椤': 1, u'椫': 1, u'椭': 1, u'椲': 2, u'楊': 2, u'楓': 2, u'楨': 2, u'業': 2, u'極': 2, u'楼': 1, u'榄': 1, u'榅': 1, u'榇': 1, u'榈': 1, u'榉': 1, u'榪': 2, u'榮': 2, u'榲': 2, u'榿': 2, u'構': 2, u'槍': 2, u'槚': 1, u'槛': 1, u'槟': 1, u'槠': 1, u'槤': 2, u'槧': 2, u'槨': 2, u'槳': 2, u'槶': 2, u'槼': 2, u'樁': 2, u'樂': 2, u'樅': 2, u'樓': 2, u'標': 2, u'樞': 2, u'樢': 2, u'樣': 2, u'横': 1, u'樫': 2, u'樯': 1, u'樱': 1, u'樳': 2, u'樸': 2, u'樹': 2, u'樺': 2, u'樿': 2, u'橈': 2, u'橋': 2, u'機': 2, u'橢': 2, u'橥': 1, u'橫': 2, u'橱': 1, u'橹': 1, u'橼': 1, u'檁': 2, u'檉': 2, u'檔': 2, u'檜': 2, u'檟': 2, u'檢': 2, u'檣': 2, u'檩': 1, u'檭': 2, u'檮': 2, u'檯': 2, u'檳': 2, u'檸': 2, u'檻': 2, u'櫃': 2, u'櫓': 2, u'櫚': 2, u'櫛': 2, u'櫝': 2, u'櫞': 2, u'櫟': 2, u'櫥': 2, u'櫧': 2, u'櫨': 2, u'櫪': 2, u'櫫': 2, u'櫬': 2, u'櫱': 2, u'櫳': 2, u'櫸': 2, u'櫻': 2, u'欄': 2, u'權': 2, u'欍': 2, u'欏': 2, u'欒': 2, u'欓': 2, u'欖': 2, u'欞': 2, u'欢': 1, u'欤': 1, u'欧': 1, u'欽': 2, u'歐': 2, u'歟': 2, u'歡': 2, u'歲': 2, u'歷': 2, u'歸': 2, u'歼': 1, u'歿': 2, u'殁': 1, u'殇': 1, u'残': 1, u'殒': 1, u'殓': 1, u'殘': 2, u'殚': 1, u'殞': 2, u'殡': 1, u'殤': 2, u'殨': 2, u'殫': 2, u'殮': 2, u'殯': 2, u'殰': 2, u'殲': 2, u'殴': 1, u'殺': 2, u'殼': 2, u'毀': 2, u'毁': 1, u'毂': 1, u'毆': 2, u'毕': 1, u'毙': 1, u'毡': 1, u'毵': 1, u'毿': 2, u'氂': 2, u'氇': 1, u'氈': 2, u'氌': 2, u'气': 1, u'氢': 1, u'氣': 2, u'氩': 1, u'氫': 2, u'氬': 2, u'氲': 1, u'氳': 2, u'汇': 1, u'汉': 1, u'汤': 1, u'汹': 1, u'決': 2, u'沈': 1, u'沒': 2, u'沖': 2, u'沟': 1, u'没': 1, u'沣': 1, u'沤': 1, u'沥': 1, u'沦': 1, u'沧': 1, u'沨': 1, u'沩': 1, u'沪': 1, u'況': 2, u'泞': 1, u'注': 1, u'泪': 1, u'泶': 1, u'泷': 1, u'泸': 1, u'泺': 1, u'泻': 1, u'泼': 1, u'泽': 1, u'泾': 1, u'洁': 1, u'洒': 1, u'洶': 2, u'洼': 1, u'浃': 1, u'浅': 1, u'浆': 1, u'浇': 1, u'浈': 1, u'浊': 1, u'测': 1, u'浍': 1, u'济': 1, u'浏': 1, u'浐': 1, u'浑': 1, u'浒': 1, u'浓': 1, u'浔': 1, u'浕': 1, u'浹': 2, u'涂': 1, u'涇': 2, u'涛': 1, u'涝': 1, u'涞': 1, u'涟': 1, u'涠': 1, u'涡': 1, u'涢': 1, u'涣': 1, u'涤': 1, u'润': 1, u'涧': 1, u'涨': 1, u'涩': 1, u'涼': 2, u'淀': 1, u'淚': 2, u'淥': 2, u'淪': 2, u'淵': 2, u'淶': 2, u'淺': 2, u'渊': 1, u'渌': 1, u'渍': 1, u'渎': 1, u'渐': 1, u'渑': 1, u'渔': 1, u'渗': 1, u'渙': 2, u'減': 2, u'渢': 2, u'渦': 2, u'温': 1, u'測': 2, u'渾': 2, u'湊': 2, u'湞': 2, u'湯': 2, u'湾': 1, u'湿': 1, u'溃': 1, u'溅': 1, u'溆': 1, u'溇': 1, u'溈': 2, u'準': 2, u'溝': 2, u'溫': 2, u'溳': 2, u'滄': 2, u'滅': 2, u'滌': 2, u'滎': 2, u'滗': 1, u'滚': 1, u'滞': 1, u'滟': 1, u'滠': 1, u'满': 1, u'滢': 1, u'滤': 1, u'滥': 1, u'滦': 1, u'滨': 1, u'滩': 1, u'滪': 1, u'滬': 2, u'滯': 2, u'滲': 2, u'滸': 2, u'滻': 2, u'滾': 2, u'滿': 2, u'漁': 2, u'漊': 2, u'漓': 1, u'漚': 2, u'漢': 2, u'漣': 2, u'漤': 1, u'漬': 2, u'漲': 2, u'漵': 2, u'漸': 2, u'漿': 2, u'潁': 2, u'潆': 1, u'潇': 1, u'潋': 1, u'潍': 1, u'潑': 2, u'潔': 2, u'潛': 2, u'潜': 1, u'潤': 2, u'潯': 2, u'潰': 2, u'潴': 1, u'潷': 2, u'潿': 2, u'澀': 2, u'澅': 2, u'澆': 2, u'澇': 2, u'澗': 2, u'澛': 1, u'澜': 1, u'澠': 2, u'澤': 2, u'澦': 2, u'澩': 2, u'澮': 2, u'澱': 2, u'澾': 2, u'濁': 2, u'濃': 2, u'濄': 2, u'濆': 2, u'濑': 1, u'濒': 1, u'濕': 2, u'濘': 2, u'濜': 2, u'濟': 2, u'濤': 2, u'濧': 2, u'濫': 2, u'濰': 2, u'濱': 2, u'濺': 2, u'濼': 2, u'濾': 2, u'瀂': 2, u'瀃': 2, u'瀅': 2, u'瀆': 2, u'瀇': 2, u'瀉': 2, u'瀋': 2, u'瀏': 2, u'瀕': 2, u'瀘': 2, u'瀝': 2, u'瀟': 2, u'瀠': 2, u'瀦': 2, u'瀧': 2, u'瀨': 2, u'瀰': 2, u'瀲': 2, u'瀾': 2, u'灃': 2, u'灄': 2, u'灏': 1, u'灑': 2, u'灕': 2, u'灘': 2, u'灙': 2, u'灝': 2, u'灠': 2, u'灡': 2, u'灣': 2, u'灤': 2, u'灧': 2, u'灭': 1, u'灯': 1, u'灵': 1, u'災': 2, u'灾': 1, u'灿': 1, u'炀': 1, u'炉': 1, u'炜': 1, u'炝': 1, u'点': 1, u'為': 2, u'炼': 1, u'炽': 1, u'烁': 1, u'烂': 1, u'烃': 1, u'烏': 2, u'烛': 1, u'烟': 1, u'烦': 1, u'烧': 1, u'烨': 1, u'烩': 1, u'烫': 1, u'烬': 1, u'热': 1, u'烴': 2, u'焕': 1, u'焖': 1, u'焘': 1, u'無': 2, u'煉': 2, u'煒': 2, u'煙': 2, u'煢': 2, u'煥': 2, u'煩': 2, u'煬': 2, u'煱': 2, u'煴': 1, u'熅': 2, u'熉': 2, u'熌': 2, u'熒': 2, u'熓': 2, u'熗': 2, u'熡': 2, u'熱': 2, u'熲': 2, u'熾': 2, u'燁': 2, u'燈': 2, u'燒': 2, u'燙': 2, u'燜': 2, u'營': 2, u'燦': 2, u'燭': 2, u'燴': 2, u'燶': 2, u'燼': 2, u'燾': 2, u'爄': 2, u'爍': 2, u'爐': 2, u'爛': 2, u'爭': 2, u'爱': 1, u'爷': 1, u'爺': 2, u'爾': 2, u'牆': 2, u'牍': 1, u'牘': 2, u'牦': 1, u'牵': 1, u'牺': 1, u'牽': 2, u'犊': 1, u'犖': 2, u'犢': 2, u'犧': 2, u'状': 1, u'犷': 1, u'犸': 1, u'犹': 1, u'狀': 2, u'狈': 1, u'狝': 1, u'狞': 1, u'独': 1, u'狭': 1, u'狮': 1, u'狯': 1, u'狰': 1, u'狱': 1, u'狲': 1, u'狹': 2, u'狽': 2, u'猃': 1, u'猎': 1, u'猕': 1, u'猙': 2, u'猡': 1, u'猪': 1, u'猫': 1, u'猬': 1, u'献': 1, u'猶': 2, u'猻': 2, u'獁': 2, u'獄': 2, u'獅': 2, u'獎': 2, u'獨': 2, u'獪': 2, u'獫': 2, u'獭': 1, u'獮': 2, u'獰': 2, u'獱': 2, u'獲': 2, u'獵': 2, u'獷': 2, u'獸': 2, u'獺': 2, u'獻': 2, u'獼': 2, u'玀': 2, u'玁': 2, u'玑': 1, u'玚': 1, u'玛': 1, u'玮': 1, u'环': 1, u'现': 1, u'玱': 1, u'玺': 1, u'珐': 1, u'珑': 1, u'珰': 1, u'珲': 1, u'現': 2, u'琏': 1, u'琐': 1, u'琺': 2, u'琼': 1, u'琿': 2, u'瑋': 2, u'瑒': 2, u'瑣': 2, u'瑤': 2, u'瑩': 2, u'瑪': 2, u'瑲': 2, u'瑶': 1, u'瑷': 1, u'瑽': 2, u'璉': 2, u'璎': 1, u'璣': 2, u'璦': 2, u'璫': 2, u'璯': 2, u'環': 2, u'璽': 2, u'瓊': 2, u'瓏': 2, u'瓒': 1, u'瓔': 2, u'瓕': 2, u'瓚': 2, u'瓯': 1, u'甌': 2, u'產': 2, u'电': 1, u'画': 1, u'畅': 1, u'畝': 2, u'畢': 2, u'畫': 2, u'異': 2, u'畴': 1, u'當': 2, u'疇': 2, u'疊': 2, u'疖': 1, u'疗': 1, u'疟': 1, u'疠': 1, u'疡': 1, u'疬': 1, u'疭': 1, u'疮': 1, u'疯': 1, u'疱': 1, u'疴': 1, u'症': 1, u'痈': 1, u'痉': 1, u'痒': 1, u'痖': 1, u'痙': 2, u'痨': 1, u'痪': 1, u'痫': 1, u'痾': 2, u'瘂': 2, u'瘅': 1, u'瘆': 1, u'瘋': 2, u'瘍': 2, u'瘓': 2, u'瘗': 1, u'瘘': 1, u'瘞': 2, u'瘡': 2, u'瘧': 2, u'瘪': 1, u'瘫': 1, u'瘮': 2, u'瘲': 2, u'瘺': 2, u'瘾': 1, u'瘿': 1, u'療': 2, u'癆': 2, u'癇': 2, u'癉': 2, u'癘': 2, u'癞': 1, u'癟': 2, u'癢': 2, u'癣': 1, u'癤': 2, u'癥': 2, u'癧': 2, u'癩': 2, u'癫': 1, u'癬': 2, u'癭': 2, u'癮': 2, u'癰': 2, u'癱': 2, u'癲': 2, u'發': 2, u'皑': 1, u'皚': 2, u'皟': 2, u'皰': 2, u'皱': 1, u'皲': 1, u'皸': 2, u'皺': 2, u'盏': 1, u'盐': 1, u'监': 1, u'盖': 1, u'盗': 1, u'盘': 1, u'盜': 2, u'盞': 2, u'盡': 2, u'監': 2, u'盤': 2, u'盧': 2, u'盪': 2, u'眍': 1, u'眥': 2, u'眦': 1, u'眬': 1, u'眾': 2, u'着': 1, u'睁': 1, u'睍': 2, u'睏': 2, u'睐': 1, u'睑': 1, u'睜': 2, u'睞': 2, u'瞆': 1, u'瞒': 1, u'瞘': 2, u'瞜': 2, u'瞞': 2, u'瞤': 2, u'瞩': 1, u'瞶': 2, u'瞼': 2, u'矓': 2, u'矚': 2, u'矫': 1, u'矯': 2, u'矶': 1, u'矾': 1, u'矿': 1, u'砀': 1, u'码': 1, u'砖': 1, u'砗': 1, u'砚': 1, u'砜': 1, u'砺': 1, u'砻': 1, u'砾': 1, u'础': 1, u'硁': 1, u'硕': 1, u'硖': 1, u'硗': 1, u'硙': 1, u'硚': 1, u'硜': 2, u'硤': 2, u'硨': 2, u'确': 1, u'硯': 2, u'硵': 1, u'硷': 1, u'碍': 1, u'碙': 2, u'碛': 1, u'碜': 1, u'碩': 2, u'碭': 2, u'碸': 2, u'確': 2, u'碼': 2, u'碽': 2, u'磑': 2, u'磚': 2, u'磠': 2, u'磣': 2, u'磧': 2, u'磯': 2, u'磽': 2, u'礄': 2, u'礆': 2, u'礎': 2, u'礒': 2, u'礙': 2, u'礦': 2, u'礪': 2, u'礫': 2, u'礬': 2, u'礱': 2, u'礼': 1, u'祃': 1, u'祎': 1, u'祢': 1, u'祯': 1, u'祷': 1, u'祸': 1, u'祿': 2, u'禀': 1, u'禄': 1, u'禅': 1, u'禍': 2, u'禎': 2, u'禕': 2, u'禡': 2, u'禦': 2, u'禪': 2, u'禮': 2, u'禰': 2, u'禱': 2, u'离': 1, u'禿': 2, u'秃': 1, u'秆': 1, u'秈': 2, u'种': 1, u'积': 1, u'称': 1, u'秽': 1, u'秾': 1, u'稅': 2, u'稆': 1, u'稈': 2, u'税': 1, u'稏': 2, u'稟': 2, u'稣': 1, u'種': 2, u'稱': 2, u'稳': 1, u'穀': 2, u'穌': 2, u'積': 2, u'穎': 2, u'穑': 1, u'穠': 2, u'穡': 2, u'穢': 2, u'穩': 2, u'穫': 2, u'穭': 2, u'穷': 1, u'窃': 1, u'窍': 1, u'窎': 1, u'窑': 1, u'窜': 1, u'窝': 1, u'窥': 1, u'窦': 1, u'窩': 2, u'窪': 2, u'窭': 1, u'窮': 2, u'窯': 2, u'窵': 2, u'窶': 2, u'窺': 2, u'竄': 2, u'竅': 2, u'竇': 2, u'竊': 2, u'竖': 1, u'竞': 1, u'競': 2, u'笃': 1, u'笋': 1, u'笔': 1, u'笕': 1, u'笺': 1, u'笼': 1, u'笾': 1, u'筆': 2, u'筍': 2, u'筑': 1, u'筚': 1, u'筛': 1, u'筜': 1, u'筝': 1, u'筧': 2, u'筴': 2, u'筹': 1, u'筼': 1, u'签': 1, u'简': 1, u'箋': 2, u'箏': 2, u'箓': 1, u'箦': 1, u'箧': 1, u'箨': 1, u'箩': 1, u'箪': 1, u'箫': 1, u'節': 2, u'範': 2, u'築': 2, u'篋': 2, u'篑': 1, u'篓': 1, u'篔': 2, u'篘': 2, u'篤': 2, u'篩': 2, u'篮': 1, u'篯': 1, u'篱': 1, u'篳': 2, u'簀': 2, u'簍': 2, u'簖': 1, u'簞': 2, u'簡': 2, u'簣': 2, u'簫': 2, u'簹': 2, u'簽': 2, u'簾': 2, u'籁': 1, u'籃': 2, u'籋': 2, u'籌': 2, u'籔': 2, u'籙': 2, u'籛': 2, u'籜': 2, u'籟': 2, u'籠': 2, u'籩': 2, u'籪': 2, u'籬': 2, u'籮': 2, u'籴': 1, u'类': 1, u'籼': 1, u'粜': 1, u'粝': 1, u'粤': 1, u'粪': 1, u'粮': 1, u'粵': 2, u'糁': 1, u'糇': 1, u'糝': 2, u'糞': 2, u'糧': 2, u'糲': 2, u'糴': 2, u'糶': 2, u'糹': 2, u'系': 1, u'糾': 2, u'紀': 2, u'紂': 2, u'約': 2, u'紅': 2, u'紆': 2, u'紇': 2, u'紈': 2, u'紉': 2, u'紋': 2, u'納': 2, u'紐': 2, u'紓': 2, u'純': 2, u'紕': 2, u'紖': 2, u'紗': 2, u'紘': 2, u'紙': 2, u'級': 2, u'紛': 2, u'紜': 2, u'紝': 2, u'紡': 2, u'紧': 1, u'紬': 2, u'累': 1, u'細': 2, u'紱': 2, u'紲': 2, u'紳': 2, u'紵': 2, u'紹': 2, u'紺': 2, u'紼': 2, u'紿': 2, u'絀': 2, u'終': 2, u'組': 2, u'絅': 2, u'絆': 2, u'絎': 2, u'結': 2, u'絕': 2, u'絛': 2, u'絝': 2, u'絞': 2, u'絡': 2, u'絢': 2, u'給': 2, u'絨': 2, u'絰': 2, u'統': 2, u'絲': 2, u'絳': 2, u'絷': 1, u'絹': 2, u'絺': 2, u'綀': 2, u'綁': 2, u'綃': 2, u'綆': 2, u'綇': 2, u'綈': 2, u'綌': 2, u'綏': 2, u'綐': 2, u'經': 2, u'綜': 2, u'綞': 2, u'綠': 2, u'綢': 2, u'綣': 2, u'綬': 2, u'維': 2, u'綯': 2, u'綰': 2, u'綱': 2, u'網': 2, u'綴': 2, u'綵': 2, u'綸': 2, u'綹': 2, u'綺': 2, u'綻': 2, u'綽': 2, u'綾': 2, u'綿': 2, u'緄': 2, u'緇': 2, u'緊': 2, u'緋': 2, u'緍': 2, u'緒': 2, u'緓': 2, u'緗': 2, u'緘': 2, u'緙': 2, u'線': 2, u'緝': 2, u'緞': 2, u'締': 2, u'緡': 2, u'緣': 2, u'緦': 2, u'編': 2, u'緩': 2, u'緬': 2, u'緯': 2, u'緰': 2, u'緱': 2, u'緲': 2, u'練': 2, u'緶': 2, u'緷': 2, u'緸': 2, u'緹': 2, u'緻': 2, u'縈': 2, u'縉': 2, u'縊': 2, u'縋': 2, u'縎': 2, u'縐': 2, u'縑': 2, u'縕': 2, u'縗': 2, u'縛': 2, u'縝': 2, u'縞': 2, u'縟': 2, u'縣': 2, u'縫': 2, u'縬': 2, u'縭': 2, u'縮': 2, u'縱': 2, u'縲': 2, u'縳': 2, u'縵': 2, u'縶': 2, u'縷': 2, u'縹': 2, u'縺': 2, u'總': 2, u'績': 2, u'繃': 2, u'繅': 2, u'繆': 2, u'繏': 2, u'繒': 2, u'繓': 2, u'織': 2, u'繕': 2, u'繚': 2, u'繞': 2, u'繟': 2, u'繡': 2, u'繢': 2, u'繩': 2, u'繪': 2, u'繫': 2, u'繭': 2, u'繯': 2, u'繰': 2, u'繳': 2, u'繸': 2, u'繹': 2, u'繻': 2, u'繼': 2, u'繽': 2, u'繾': 2, u'繿': 2, u'纁': 2, u'纇': 2, u'纈': 2, u'纊': 2, u'續': 2, u'纍': 2, u'纏': 2, u'纓': 2, u'纖': 2, u'纘': 2, u'纜': 2, u'纟': 1, u'纠': 1, u'纡': 1, u'红': 1, u'纣': 1, u'纤': 1, u'纥': 1, u'约': 1, u'级': 1, u'纨': 1, u'纩': 1, u'纪': 1, u'纫': 1, u'纬': 1, u'纭': 1, u'纮': 1, u'纯': 1, u'纰': 1, u'纱': 1, u'纲': 1, u'纳': 1, u'纴': 1, u'纵': 1, u'纶': 1, u'纷': 1, u'纸': 1, u'纹': 1, u'纺': 1, u'纻': 1, u'纼': 1, u'纽': 1, u'纾': 1, u'线': 1, u'绀': 1, u'绁': 1, u'绂': 1, u'练': 1, u'组': 1, u'绅': 1, u'细': 1, u'织': 1, u'终': 1, u'绉': 1, u'绊': 1, u'绋': 1, u'绌': 1, u'绍': 1, u'绎': 1, u'经': 1, u'绐': 1, u'绑': 1, u'绒': 1, u'结': 1, u'绔': 1, u'绕': 1, u'绖': 1, u'绗': 1, u'绘': 1, u'给': 1, u'绚': 1, u'绛': 1, u'络': 1, u'绝': 1, u'绞': 1, u'统': 1, u'绠': 1, u'绡': 1, u'绢': 1, u'绣': 1, u'绤': 1, u'绥': 1, u'绦': 1, u'继': 1, u'绨': 1, u'绩': 1, u'绪': 1, u'绫': 1, u'绬': 1, u'续': 1, u'绮': 1, u'绯': 1, u'绰': 1, u'绱': 1, u'绲': 1, u'绳': 1, u'维': 1, u'绵': 1, u'绶': 1, u'绷': 1, u'绸': 1, u'绹': 1, u'绺': 1, u'绻': 1, u'综': 1, u'绽': 1, u'绾': 1, u'绿': 1, u'缀': 1, u'缁': 1, u'缂': 1, u'缃': 1, u'缄': 1, u'缅': 1, u'缆': 1, u'缇': 1, u'缈': 1, u'缉': 1, u'缊': 1, u'缋': 1, u'缌': 1, u'缍': 1, u'缎': 1, u'缏': 1, u'缑': 1, u'缒': 1, u'缓': 1, u'缔': 1, u'缕': 1, u'编': 1, u'缗': 1, u'缘': 1, u'缙': 1, u'缚': 1, u'缛': 1, u'缜': 1, u'缝': 1, u'缞': 1, u'缟': 1, u'缠': 1, u'缡': 1, u'缢': 1, u'缣': 1, u'缤': 1, u'缥': 1, u'缦': 1, u'缧': 1, u'缨': 1, u'缩': 1, u'缪': 1, u'缫': 1, u'缬': 1, u'缭': 1, u'缮': 1, u'缯': 1, u'缰': 1, u'缱': 1, u'缲': 1, u'缳': 1, u'缴': 1, u'缵': 1, u'缽': 2, u'罂': 1, u'罈': 2, u'罌': 2, u'网': 1, u'罗': 1, u'罚': 1, u'罢': 1, u'罰': 2, u'罴': 1, u'罵': 2, u'罷': 2, u'羁': 1, u'羅': 2, u'羆': 2, u'羈': 2, u'羋': 2, u'羟': 1, u'羥': 2, u'義': 2, u'習': 2, u'翘': 1, u'翙': 1, u'翚': 1, u'翬': 2, u'翹': 2, u'翽': 2, u'耢': 1, u'耧': 1, u'耬': 2, u'耮': 2, u'耸': 1, u'耻': 1, u'聂': 1, u'聋': 1, u'职': 1, u'聍': 1, u'联': 1, u'聖': 2, u'聞': 2, u'聩': 1, u'聪': 1, u'聯': 2, u'聰': 2, u'聲': 2, u'聳': 2, u'聵': 2, u'聶': 2, u'職': 2, u'聹': 2, u'聽': 2, u'聾': 2, u'肃': 1, u'肅': 2, u'肠': 1, u'肤': 1, u'肮': 1, u'肴': 1, u'肾': 1, u'肿': 1, u'胀': 1, u'胁': 1, u'胆': 1, u'胜': 1, u'胡': 1, u'胧': 1, u'胨': 1, u'胪': 1, u'胫': 1, u'胶': 1, u'脅': 2, u'脈': 2, u'脉': 1, u'脍': 1, u'脏': 1, u'脐': 1, u'脑': 1, u'脓': 1, u'脔': 1, u'脚': 1, u'脛': 2, u'脥': 2, u'脫': 2, u'脱': 1, u'脶': 1, u'脸': 1, u'脹': 2, u'腊': 1, u'腎': 2, u'腖': 2, u'腘': 1, u'腡': 2, u'腦': 2, u'腪': 2, u'腫': 2, u'腭': 1, u'腳': 2, u'腸': 2, u'腻': 1, u'腼': 1, u'腽': 1, u'腾': 1, u'膃': 2, u'膑': 1, u'膕': 2, u'膚': 2, u'膠': 2, u'膢': 2, u'膩': 2, u'膽': 2, u'膾': 2, u'膿': 2, u'臉': 2, u'臍': 2, u'臏': 2, u'臗': 2, u'臘': 2, u'臚': 2, u'臜': 1, u'臟': 2, u'臠': 2, u'臢': 2, u'臨': 2, u'致': 1, u'臺': 2, u'舆': 1, u'與': 2, u'興': 2, u'舉': 2, u'舊': 2, u'舍': 1, u'舣': 1, u'舰': 1, u'舱': 1, u'舻': 1, u'艙': 2, u'艤': 2, u'艦': 2, u'艫': 2, u'艰': 1, u'艱': 2, u'艳': 1, u'艷': 2, u'艺': 1, u'节': 1, u'芈': 1, u'芗': 1, u'芜': 1, u'芦': 1, u'芸': 1, u'芻': 2, u'苁': 1, u'苇': 1, u'苈': 1, u'苋': 1, u'苌': 1, u'苍': 1, u'苎': 1, u'苏': 1, u'苧': 2, u'苹': 1, u'范': 1, u'茎': 1, u'茏': 1, u'茑': 1, u'茔': 1, u'茕': 1, u'茧': 1, u'茲': 2, u'荆': 1, u'荊': 2, u'荐': 1, u'荙': 1, u'荚': 1, u'荛': 1, u'荜': 1, u'荝': 1, u'荞': 1, u'荟': 1, u'荠': 1, u'荡': 1, u'荣': 1, u'荤': 1, u'荥': 1, u'荦': 1, u'荧': 1, u'荨': 1, u'荩': 1, u'荪': 1, u'荫': 1, u'荬': 1, u'荭': 1, u'荮': 1, u'药': 1, u'莅': 1, u'莊': 2, u'莖': 2, u'莢': 2, u'莧': 2, u'莱': 1, u'莲': 1, u'莳': 1, u'莴': 1, u'莶': 1, u'获': 1, u'莸': 1, u'莹': 1, u'莺': 1, u'莼': 1, u'華': 2, u'萇': 2, u'萊': 2, u'萝': 1, u'萤': 1, u'营': 1, u'萦': 1, u'萧': 1, u'萨': 1, u'萬': 2, u'萴': 2, u'萵': 2, u'葉': 2, u'葒': 2, u'著': 2, u'葤': 2, u'葦': 2, u'葱': 1, u'葷': 2, u'蒇': 1, u'蒉': 1, u'蒋': 1, u'蒌': 1, u'蒔': 2, u'蒞': 2, u'蒼': 2, u'蓀': 2, u'蓋': 2, u'蓝': 1, u'蓟': 1, u'蓠': 1, u'蓣': 1, u'蓥': 1, u'蓦': 1, u'蓮': 2, u'蓯': 2, u'蓴': 2, u'蓽': 2, u'蔂': 1, u'蔞': 2, u'蔣': 2, u'蔥': 2, u'蔦': 2, u'蔭': 2, u'蔷': 1, u'蔹': 1, u'蔺': 1, u'蔼': 1, u'蕁': 2, u'蕆': 2, u'蕎': 2, u'蕒': 2, u'蕓': 2, u'蕕': 2, u'蕘': 2, u'蕢': 2, u'蕩': 2, u'蕪': 2, u'蕭': 2, u'蕰': 1, u'蕲': 1, u'蕴': 1, u'蕷': 2, u'薀': 2, u'薈': 2, u'薊': 2, u'薌': 2, u'薔': 2, u'薘': 2, u'薟': 2, u'薦': 2, u'薩': 2, u'薮': 1, u'薳': 2, u'薴': 2, u'薺': 2, u'藍': 2, u'藎': 2, u'藓': 1, u'藝': 2, u'藥': 2, u'藪': 2, u'藶': 2, u'藹': 2, u'藺': 2, u'蘄': 2, u'蘆': 2, u'蘇': 2, u'蘊': 2, u'蘋': 2, u'蘖': 1, u'蘚': 2, u'蘞': 2, u'蘢': 2, u'蘭': 2, u'蘺': 2, u'蘿': 2, u'虆': 2, u'虏': 1, u'虑': 1, u'處': 2, u'虚': 1, u'虛': 2, u'虜': 2, u'號': 2, u'虧': 2, u'虫': 1, u'虬': 1, u'虮': 1, u'虯': 2, u'虽': 1, u'虾': 1, u'虿': 1, u'蚀': 1, u'蚁': 1, u'蚂': 1, u'蚃': 1, u'蚕': 1, u'蚬': 1, u'蛊': 1, u'蛎': 1, u'蛏': 1, u'蛮': 1, u'蛰': 1, u'蛱': 1, u'蛲': 1, u'蛳': 1, u'蛴': 1, u'蛺': 2, u'蛻': 2, u'蜆': 2, u'蜕': 1, u'蜗': 1, u'蜡': 3, u'蝇': 1, u'蝈': 1, u'蝉': 1, u'蝕': 2, u'蝟': 2, u'蝦': 2, u'蝸': 2, u'蝼': 1, u'蝾': 1, u'螀': 1, u'螄': 2, u'螞': 2, u'螢': 2, u'螨': 1, u'螮': 2, u'螻': 2, u'螿': 2, u'蟄': 2, u'蟈': 2, u'蟎': 2, u'蟏': 1, u'蟣': 2, u'蟬': 2, u'蟯': 2, u'蟲': 2, u'蟶': 2, u'蟻': 2, u'蠁': 2, u'蠅': 2, u'蠆': 2, u'蠐': 2, u'蠑': 2, u'蠟': 2, u'蠣': 2, u'蠨': 2, u'蠱': 2, u'蠶': 2, u'蠻': 2, u'衅': 1, u'術': 2, u'衔': 1, u'衕': 2, u'衚': 2, u'衛': 2, u'衝': 2, u'补': 1, u'表': 1, u'衬': 1, u'衮': 1, u'袄': 1, u'袅': 1, u'袆': 1, u'袜': 1, u'袞': 2, u'袭': 1, u'袯': 1, u'装': 1, u'裆': 1, u'裈': 1, u'裊': 2, u'補': 2, u'裝': 2, u'裡': 2, u'裢': 1, u'裣': 1, u'裤': 1, u'裥': 1, u'製': 2, u'複': 2, u'褌': 2, u'褘': 2, u'褛': 1, u'褲': 2, u'褳': 2, u'褴': 1, u'褸': 2, u'褻': 2, u'襀': 2, u'襉': 2, u'襏': 2, u'襕': 1, u'襖': 2, u'襝': 2, u'襠': 2, u'襤': 2, u'襪': 2, u'襬': 2, u'襯': 2, u'襲': 2, u'襴': 2, u'覆': 2, u'見': 2, u'覎': 2, u'規': 2, u'覓': 2, u'視': 2, u'覘': 2, u'覡': 2, u'覥': 2, u'覦': 2, u'親': 2, u'覬': 2, u'覯': 2, u'覲': 2, u'覷': 2, u'覺': 2, u'覼': 2, u'覽': 2, u'覿': 2, u'觀': 2, u'见': 1, u'观': 1, u'觃': 1, u'规': 1, u'觅': 1, u'视': 1, u'觇': 1, u'览': 1, u'觉': 1, u'觊': 1, u'觋': 1, u'觌': 1, u'觍': 1, u'觎': 1, u'觏': 1, u'觐': 1, u'觑': 1, u'觞': 1, u'触': 1, u'觯': 1, u'觴': 2, u'觶': 2, u'觸': 2, u'訁': 2, u'訂': 2, u'訃': 2, u'計': 2, u'訊': 2, u'訌': 2, u'討': 2, u'訐': 2, u'訑': 2, u'訒': 2, u'訓': 2, u'訕': 2, u'訖': 2, u'託': 2, u'記': 2, u'訚': 1, u'訛': 2, u'訝': 2, u'訟': 2, u'訢': 2, u'訣': 2, u'訥': 2, u'訩': 2, u'訪': 2, u'設': 2, u'許': 2, u'訴': 2, u'訶': 2, u'診': 2, u'註': 2, u'詀': 2, u'詁': 2, u'詆': 2, u'詎': 2, u'詐': 2, u'詑': 2, u'詒': 2, u'詔': 2, u'評': 2, u'詖': 2, u'詗': 2, u'詘': 2, u'詛': 2, u'詞': 2, u'詟': 1, u'詠': 2, u'詡': 2, u'詢': 2, u'詣': 2, u'試': 2, u'詩': 2, u'詫': 2, u'詬': 2, u'詭': 2, u'詮': 2, u'詰': 2, u'話': 2, u'該': 2, u'詳': 2, u'詵': 2, u'詼': 2, u'詿': 2, u'誄': 2, u'誅': 2, u'誆': 2, u'誇': 2, u'誉': 1, u'誊': 1, u'誌': 2, u'認': 2, u'誑': 2, u'誒': 2, u'誕': 2, u'誘': 2, u'誚': 2, u'語': 2, u'誠': 2, u'誡': 2, u'誣': 2, u'誤': 2, u'誥': 2, u'誦': 2, u'誨': 2, u'說': 2, u'誰': 2, u'課': 2, u'誶': 2, u'誹': 2, u'誼': 2, u'誾': 2, u'調': 2, u'諂': 2, u'諄': 2, u'談': 2, u'諉': 2, u'請': 2, u'諍': 2, u'諏': 2, u'諑': 2, u'諒': 2, u'論': 2, u'諗': 2, u'諛': 2, u'諜': 2, u'諝': 2, u'諞': 2, u'諢': 2, u'諤': 2, u'諦': 2, u'諧': 2, u'諫': 2, u'諭': 2, u'諮': 2, u'諰': 2, u'諱': 2, u'諳': 2, u'諶': 2, u'諷': 2, u'諸': 2, u'諺': 2, u'諼': 2, u'諾': 2, u'謀': 2, u'謁': 2, u'謂': 2, u'謄': 2, u'謅': 2, u'謊': 2, u'謎': 2, u'謏': 2, u'謐': 2, u'謔': 2, u'謖': 2, u'謗': 2, u'謙': 2, u'謚': 2, u'講': 2, u'謝': 2, u'謠': 2, u'謨': 2, u'謫': 2, u'謬': 2, u'謳': 2, u'謹': 2, u'謾': 2, u'證': 2, u'譊': 2, u'譎': 2, u'譏': 2, u'譖': 2, u'識': 2, u'譙': 2, u'譚': 2, u'譜': 2, u'譫': 2, u'譯': 2, u'議': 2, u'譴': 2, u'護': 2, u'譸': 2, u'譽': 2, u'譾': 2, u'讀': 2, u'變': 2, u'讋': 2, u'讌': 2, u'讎': 2, u'讒': 2, u'讓': 2, u'讕': 2, u'讖': 2, u'讜': 2, u'讞': 2, u'讠': 1, u'计': 1, u'订': 1, u'讣': 1, u'认': 1, u'讥': 1, u'讦': 1, u'讧': 1, u'讨': 1, u'让': 1, u'讪': 1, u'讫': 1, u'讬': 1, u'训': 1, u'议': 1, u'讯': 1, u'记': 1, u'讱': 1, u'讲': 1, u'讳': 1, u'讴': 1, u'讵': 1, u'讶': 1, u'讷': 1, u'许': 1, u'讹': 1, u'论': 1, u'讻': 1, u'讼': 1, u'讽': 1, u'设': 1, u'访': 1, u'诀': 1, u'证': 1, u'诂': 1, u'诃': 1, u'评': 1, u'诅': 1, u'识': 1, u'诇': 1, u'诈': 1, u'诉': 1, u'诊': 1, u'诋': 1, u'诌': 1, u'词': 1, u'诎': 1, u'诏': 1, u'诐': 1, u'译': 1, u'诒': 1, u'诓': 1, u'诔': 1, u'试': 1, u'诖': 1, u'诗': 1, u'诘': 1, u'诙': 1, u'诚': 1, u'诛': 1, u'诜': 1, u'话': 1, u'诞': 1, u'诟': 1, u'诠': 1, u'诡': 1, u'询': 1, u'诣': 1, u'诤': 1, u'该': 1, u'详': 1, u'诧': 1, u'诨': 1, u'诩': 1, u'诪': 1, u'诫': 1, u'诬': 1, u'语': 1, u'诮': 1, u'误': 1, u'诰': 1, u'诱': 1, u'诲': 1, u'诳': 1, u'说': 1, u'诵': 1, u'诶': 1, u'请': 1, u'诸': 1, u'诹': 1, u'诺': 1, u'读': 1, u'诼': 1, u'诽': 1, u'课': 1, u'诿': 1, u'谀': 1, u'谁': 1, u'谂': 1, u'调': 1, u'谄': 1, u'谅': 1, u'谆': 1, u'谇': 1, u'谈': 1, u'谊': 1, u'谋': 1, u'谌': 1, u'谍': 1, u'谎': 1, u'谏': 1, u'谐': 1, u'谑': 1, u'谒': 1, u'谓': 1, u'谔': 1, u'谕': 1, u'谖': 1, u'谗': 1, u'谘': 1, u'谙': 1, u'谚': 1, u'谛': 1, u'谜': 1, u'谝': 1, u'谞': 1, u'谟': 1, u'谠': 1, u'谡': 1, u'谢': 1, u'谣': 1, u'谤': 1, u'谥': 1, u'谦': 1, u'谧': 1, u'谨': 1, u'谩': 1, u'谪': 1, u'谫': 1, u'谬': 1, u'谭': 1, u'谮': 1, u'谯': 1, u'谰': 1, u'谱': 1, u'谲': 1, u'谳': 1, u'谴': 1, u'谵': 1, u'谶': 1, u'谷': 1, u'豈': 2, u'豎': 2, u'豐': 2, u'豬': 2, u'豮': 1, u'豶': 2, u'貓': 2, u'貙': 2, u'貝': 2, u'貞': 2, u'貟': 2, u'負': 2, u'財': 2, u'貢': 2, u'貧': 2, u'貨': 2, u'販': 2, u'貪': 2, u'貫': 2, u'責': 2, u'貯': 2, u'貰': 2, u'貲': 2, u'貳': 2, u'貴': 2, u'貶': 2, u'買': 2, u'貸': 2, u'貺': 2, u'費': 2, u'貼': 2, u'貽': 2, u'貿': 2, u'賀': 2, u'賁': 2, u'賂': 2, u'賃': 2, u'賄': 2, u'賅': 2, u'資': 2, u'賈': 2, u'賊': 2, u'賑': 2, u'賒': 2, u'賓': 2, u'賕': 2, u'賙': 2, u'賚': 2, u'賜': 2, u'賞': 2, u'賟': 2, u'賠': 2, u'賡': 2, u'賢': 2, u'賣': 2, u'賤': 2, u'賦': 2, u'賧': 2, u'質': 2, u'賬': 2, u'賭': 2, u'賰': 2, u'賴': 2, u'賵': 2, u'賺': 2, u'賻': 2, u'購': 2, u'賽': 2, u'賾': 2, u'贃': 2, u'贄': 2, u'贅': 2, u'贇': 2, u'贈': 2, u'贊': 2, u'贍': 2, u'贏': 2, u'贐': 2, u'贓': 2, u'贔': 2, u'贖': 2, u'贗': 2, u'贛': 2, u'贝': 1, u'贞': 1, u'负': 1, u'贠': 1, u'贡': 1, u'财': 1, u'责': 1, u'贤': 1, u'败': 1, u'账': 1, u'货': 1, u'质': 1, u'贩': 1, u'贪': 1, u'贫': 1, u'贬': 1, u'购': 1, u'贮': 1, u'贯': 1, u'贰': 1, u'贱': 1, u'贲': 1, u'贳': 1, u'贴': 1, u'贵': 1, u'贶': 1, u'贷': 1, u'贸': 1, u'费': 1, u'贺': 1, u'贻': 1, u'贼': 1, u'贽': 1, u'贾': 1, u'贿': 1, u'赀': 1, u'赁': 1, u'赂': 1, u'赃': 1, u'资': 1, u'赅': 1, u'赆': 1, u'赇': 1, u'赈': 1, u'赉': 1, u'赊': 1, u'赋': 1, u'赌': 1, u'赍': 1, u'赎': 1, u'赏': 1, u'赐': 1, u'赑': 1, u'赒': 1, u'赓': 1, u'赔': 1, u'赕': 1, u'赖': 1, u'赗': 1, u'赘': 1, u'赙': 1, u'赚': 1, u'赛': 1, u'赜': 1, u'赝': 1, u'赞': 1, u'赟': 1, u'赠': 1, u'赡': 1, u'赢': 1, u'赣': 1, u'赪': 1, u'赬': 2, u'赵': 1, u'赶': 1, u'趋': 1, u'趕': 2, u'趙': 2, u'趨': 2, u'趱': 1, u'趲': 2, u'趸': 1, u'跃': 1, u'跄': 1, u'跞': 1, u'跡': 2, u'践': 1, u'跶': 1, u'跷': 1, u'跸': 1, u'跹': 1, u'跻': 1, u'踊': 1, u'踌': 1, u'踐': 2, u'踪': 1, u'踬': 1, u'踯': 1, u'踴': 2, u'蹌': 2, u'蹑': 1, u'蹒': 1, u'蹕': 2, u'蹣': 2, u'蹤': 2, u'蹰': 1, u'蹺': 2, u'蹻': 2, u'蹿': 1, u'躂': 2, u'躉': 2, u'躊': 2, u'躋': 2, u'躍': 2, u'躎': 2, u'躏': 1, u'躑': 2, u'躒': 2, u'躓': 2, u'躕': 2, u'躚': 2, u'躜': 1, u'躝': 2, u'躡': 2, u'躥': 2, u'躦': 2, u'躪': 2, u'躯': 1, u'軀': 2, u'軉': 2, u'車': 2, u'軋': 2, u'軌': 2, u'軍': 2, u'軏': 2, u'軑': 2, u'軒': 2, u'軔': 2, u'軗': 2, u'軛': 2, u'軟': 2, u'軤': 2, u'軨': 2, u'軫': 2, u'軲': 2, u'軸': 2, u'軹': 2, u'軺': 2, u'軻': 2, u'軼': 2, u'軾': 2, u'較': 2, u'輄': 2, u'輅': 2, u'輇': 2, u'輈': 2, u'載': 2, u'輊': 2, u'輒': 2, u'輓': 2, u'輔': 2, u'輕': 2, u'輗': 2, u'輛': 2, u'輜': 2, u'輝': 2, u'輞': 2, u'輟': 2, u'輥': 2, u'輦': 2, u'輩': 2, u'輪': 2, u'輬': 2, u'輮': 2, u'輯': 2, u'輳': 2, u'輸': 2, u'輻': 2, u'輾': 2, u'輿': 2, u'轀': 2, u'轂': 2, u'轄': 2, u'轅': 2, u'轆': 2, u'轉': 2, u'轍': 2, u'轎': 2, u'轔': 2, u'轟': 2, u'轡': 2, u'轢': 2, u'轣': 2, u'轤': 2, u'车': 1, u'轧': 1, u'轨': 1, u'轩': 1, u'轪': 1, u'轫': 1, u'转': 1, u'轭': 1, u'轮': 1, u'软': 1, u'轰': 1, u'轱': 1, u'轲': 1, u'轳': 1, u'轴': 1, u'轵': 1, u'轶': 1, u'轷': 1, u'轸': 1, u'轹': 1, u'轺': 1, u'轻': 1, u'轼': 1, u'载': 1, u'轾': 1, u'轿': 1, u'辀': 1, u'辁': 1, u'辂': 1, u'较': 1, u'辄': 1, u'辅': 1, u'辆': 1, u'辇': 1, u'辈': 1, u'辉': 1, u'辊': 1, u'辋': 1, u'辌': 1, u'辍': 1, u'辎': 1, u'辏': 1, u'辐': 1, u'辑': 1, u'辒': 1, u'输': 1, u'辔': 1, u'辕': 1, u'辖': 1, u'辗': 1, u'辘': 1, u'辙': 1, u'辚': 1, u'辞': 1, u'辦': 2, u'辩': 1, u'辫': 1, u'辭': 2, u'辮': 2, u'辯': 2, u'農': 2, u'边': 1, u'辽': 1, u'达': 1, u'迁': 1, u'过': 1, u'迈': 1, u'运': 1, u'还': 1, u'这': 1, u'进': 1, u'远': 1, u'违': 1, u'连': 1, u'迟': 1, u'迩': 1, u'迳': 1, u'迹': 1, u'适': 1, u'选': 1, u'逊': 1, u'递': 1, u'逕': 2, u'這': 2, u'連': 2, u'逦': 1, u'進': 2, u'逻': 1, u'運': 2, u'過': 2, u'達': 2, u'違': 2, u'遗': 1, u'遙': 2, u'遜': 2, u'遞': 2, u'遠': 2, u'遥': 1, u'適': 2, u'遲': 2, u'遷': 2, u'選': 2, u'遺': 2, u'遼': 2, u'邁': 2, u'還': 2, u'邇': 2, u'邊': 2, u'邏': 2, u'邐': 2, u'邓': 1, u'邝': 1, u'邬': 1, u'邮': 1, u'邹': 1, u'邺': 1, u'邻': 1, u'郁': 1, u'郏': 1, u'郐': 1, u'郑': 1, u'郓': 1, u'郟': 2, u'郦': 1, u'郧': 1, u'郵': 2, u'郸': 1, u'鄆': 2, u'鄉': 2, u'鄒': 2, u'鄔': 2, u'鄖': 2, u'鄧': 2, u'鄭': 2, u'鄰': 2, u'鄲': 2, u'鄴': 2, u'鄶': 2, u'鄺': 2, u'酂': 1, u'酇': 2, u'酈': 2, u'酝': 1, u'酦': 1, u'酱': 1, u'酽': 1, u'酾': 1, u'酿': 1, u'醜': 2, u'醞': 2, u'醫': 2, u'醬': 2, u'醱': 2, u'釀': 2, u'釁': 2, u'釃': 2, u'釅': 2, u'采': 1, u'释': 1, u'釋': 2, u'里': 1, u'釐': 2, u'釒': 2, u'釓': 2, u'釔': 2, u'釕': 2, u'釗': 2, u'釘': 2, u'釙': 2, u'針': 2, u'釣': 2, u'釤': 2, u'釧': 2, u'釩': 2, u'釳': 2, u'釵': 2, u'釷': 2, u'釹': 2, u'釺': 2, u'釾': 2, u'鈀': 2, u'鈁': 2, u'鈃': 2, u'鈄': 2, u'鈇': 2, u'鈈': 2, u'鈉': 2, u'鈋': 2, u'鈍': 2, u'鈐': 2, u'鈑': 2, u'鈒': 2, u'鈔': 2, u'鈕': 2, u'鈞': 2, u'鈠': 2, u'鈣': 2, u'鈥': 2, u'鈦': 2, u'鈧': 2, u'鈮': 2, u'鈯': 2, u'鈰': 2, u'鈲': 2, u'鈳': 2, u'鈴': 2, u'鈷': 2, u'鈸': 2, u'鈹': 2, u'鈺': 2, u'鈽': 2, u'鈾': 2, u'鈿': 2, u'鉀': 2, u'鉁': 2, u'鉅': 2, u'鉈': 2, u'鉉': 2, u'鉋': 2, u'鉍': 2, u'鉑': 2, u'鉕': 2, u'鉗': 2, u'鉚': 2, u'鉛': 2, u'鉞': 2, u'鉤': 2, u'鉦': 2, u'鉬': 2, u'鉭': 2, u'鉴': 1, u'鉶': 2, u'鉸': 2, u'鉺': 2, u'鉻': 2, u'鉿': 2, u'銀': 2, u'銃': 2, u'銅': 2, u'銍': 2, u'銑': 2, u'銓': 2, u'銖': 2, u'銘': 2, u'銚': 2, u'銛': 2, u'銜': 2, u'銠': 2, u'銣': 2, u'銥': 2, u'銦': 2, u'銨': 2, u'銩': 2, u'銪': 2, u'銫': 2, u'銬': 2, u'銮': 1, u'銱': 2, u'銳': 2, u'銶': 2, u'銷': 2, u'銻': 2, u'銼': 2, u'鋁': 2, u'鋃': 2, u'鋅': 2, u'鋇': 2, u'鋉': 2, u'鋌': 2, u'鋏': 2, u'鋒': 2, u'鋙': 2, u'鋝': 2, u'鋟': 2, u'鋣': 2, u'鋤': 2, u'鋥': 2, u'鋦': 2, u'鋨': 2, u'鋩': 2, u'鋪': 2, u'鋮': 2, u'鋯': 2, u'鋰': 2, u'鋱': 2, u'鋶': 2, u'鋸': 2, u'鋼': 2, u'錁': 2, u'錂': 2, u'錄': 2, u'錆': 2, u'錇': 2, u'錈': 2, u'錏': 2, u'錐': 2, u'錒': 2, u'錕': 2, u'錘': 2, u'錙': 2, u'錚': 2, u'錛': 2, u'錟': 2, u'錠': 2, u'錡': 2, u'錢': 2, u'錦': 2, u'錨': 2, u'錩': 2, u'錫': 2, u'錮': 2, u'錯': 2, u'錳': 2, u'錶': 2, u'錸': 2, u'錾': 1, u'鍀': 2, u'鍃': 2, u'鍄': 2, u'鍆': 2, u'鍇': 2, u'鍈': 2, u'鍋': 2, u'鍍': 2, u'鍔': 2, u'鍘': 2, u'鍚': 2, u'鍛': 2, u'鍠': 2, u'鍤': 2, u'鍥': 2, u'鍩': 2, u'鍬': 2, u'鍮': 2, u'鍰': 2, u'鍵': 2, u'鍶': 2, u'鍺': 2, u'鍾': 2, u'鎂': 2, u'鎄': 2, u'鎇': 2, u'鎊': 2, u'鎔': 2, u'鎖': 2, u'鎘': 2, u'鎛': 2, u'鎝': 2, u'鎡': 2, u'鎢': 2, u'鎣': 2, u'鎦': 2, u'鎧': 2, u'鎩': 2, u'鎪': 2, u'鎬': 2, u'鎮': 2, u'鎯': 2, u'鎰': 2, u'鎲': 2, u'鎳': 2, u'鎵': 2, u'鎷': 2, u'鎿': 2, u'鏃': 2, u'鏆': 2, u'鏇': 2, u'鏈': 2, u'鏉': 2, u'鏌': 2, u'鏍': 2, u'鏐': 2, u'鏑': 2, u'鏗': 2, u'鏘': 2, u'鏜': 2, u'鏝': 2, u'鏞': 2, u'鏟': 2, u'鏡': 2, u'鏢': 2, u'鏤': 2, u'鏦': 2, u'鏨': 2, u'鏰': 2, u'鏵': 2, u'鏷': 2, u'鏹': 2, u'鏺': 2, u'鏽': 2, u'鐃': 2, u'鐄': 2, u'鐋': 2, u'鐍': 2, u'鐎': 2, u'鐏': 2, u'鐐': 2, u'鐒': 2, u'鐓': 2, u'鐔': 2, u'鐘': 2, u'鐙': 2, u'鐠': 2, u'鐥': 2, u'鐦': 2, u'鐧': 2, u'鐨': 2, u'鐫': 2, u'鐮': 2, u'鐯': 2, u'鐲': 2, u'鐳': 2, u'鐵': 2, u'鐶': 2, u'鐸': 2, u'鐺': 2, u'鐿': 2, u'鑄': 2, u'鑊': 2, u'鑌': 2, u'鑒': 2, u'鑔': 2, u'鑕': 2, u'鑞': 2, u'鑠': 2, u'鑣': 2, u'鑥': 2, u'鑭': 2, u'鑰': 2, u'鑱': 2, u'鑲': 2, u'鑷': 2, u'鑹': 2, u'鑼': 2, u'鑽': 2, u'鑾': 2, u'鑿': 2, u'钁': 2, u'钅': 1, u'钆': 1, u'钇': 1, u'针': 1, u'钉': 1, u'钊': 1, u'钋': 1, u'钌': 1, u'钍': 1, u'钎': 1, u'钏': 1, u'钐': 1, u'钑': 1, u'钒': 1, u'钓': 1, u'钔': 1, u'钕': 1, u'钖': 1, u'钗': 1, u'钘': 1, u'钙': 1, u'钚': 1, u'钛': 1, u'钜': 1, u'钝': 1, u'钞': 1, u'钟': 1, u'钠': 1, u'钡': 1, u'钢': 1, u'钣': 1, u'钤': 1, u'钥': 1, u'钦': 1, u'钧': 1, u'钨': 1, u'钩': 1, u'钪': 1, u'钫': 1, u'钬': 1, u'钭': 1, u'钮': 1, u'钯': 1, u'钰': 1, u'钱': 1, u'钲': 1, u'钳': 1, u'钴': 1, u'钵': 1, u'钶': 1, u'钷': 1, u'钸': 1, u'钹': 1, u'钺': 1, u'钻': 1, u'钼': 1, u'钽': 1, u'钾': 1, u'钿': 1, u'铀': 1, u'铁': 1, u'铂': 1, u'铃': 1, u'铄': 1, u'铅': 1, u'铆': 1, u'铇': 1, u'铈': 1, u'铉': 1, u'铊': 1, u'铋': 1, u'铌': 1, u'铍': 1, u'铎': 1, u'铏': 1, u'铐': 1, u'铑': 1, u'铒': 1, u'铓': 1, u'铔': 1, u'铕': 1, u'铖': 1, u'铗': 1, u'铘': 1, u'铙': 1, u'铚': 1, u'铛': 1, u'铜': 1, u'铝': 1, u'铞': 1, u'铟': 1, u'铠': 1, u'铡': 1, u'铢': 1, u'铣': 1, u'铤': 1, u'铥': 1, u'铦': 1, u'铧': 1, u'铨': 1, u'铩': 1, u'铪': 1, u'铫': 1, u'铬': 1, u'铭': 1, u'铮': 1, u'铯': 1, u'铰': 1, u'铱': 1, u'铲': 1, u'铳': 1, u'铴': 1, u'铵': 1, u'银': 1, u'铷': 1, u'铸': 1, u'铹': 1, u'铺': 1, u'铻': 1, u'铼': 1, u'铽': 1, u'链': 1, u'铿': 1, u'销': 1, u'锁': 1, u'锂': 1, u'锃': 1, u'锄': 1, u'锅': 1, u'锆': 1, u'锇': 1, u'锈': 1, u'锉': 1, u'锊': 1, u'锋': 1, u'锌': 1, u'锍': 1, u'锎': 1, u'锏': 1, u'锐': 1, u'锑': 1, u'锒': 1, u'锓': 1, u'锔': 1, u'锕': 1, u'锖': 1, u'锗': 1, u'锘': 1, u'错': 1, u'锚': 1, u'锛': 1, u'锜': 1, u'锝': 1, u'锞': 1, u'锟': 1, u'锠': 1, u'锡': 1, u'锢': 1, u'锣': 1, u'锤': 1, u'锥': 1, u'锦': 1, u'锧': 1, u'锨': 1, u'锩': 1, u'锪': 1, u'锫': 1, u'锬': 1, u'锭': 1, u'键': 1, u'锯': 1, u'锰': 1, u'锱': 1, u'锲': 1, u'锳': 1, u'锴': 1, u'锵': 1, u'锶': 1, u'锷': 1, u'锸': 1, u'锹': 1, u'锺': 1, u'锻': 1, u'锼': 1, u'锽': 1, u'锾': 1, u'锿': 1, u'镀': 1, u'镁': 1, u'镂': 1, u'镃': 1, u'镄': 1, u'镅': 1, u'镆': 1, u'镇': 1, u'镈': 1, u'镉': 1, u'镊': 1, u'镋': 1, u'镌': 1, u'镍': 1, u'镎': 1, u'镏': 1, u'镐': 1, u'镑': 1, u'镒': 1, u'镓': 1, u'镔': 1, u'镕': 1, u'镖': 1, u'镗': 1, u'镘': 1, u'镙': 1, u'镚': 1, u'镛': 1, u'镜': 1, u'镝': 1, u'镞': 1, u'镟': 1, u'镠': 1, u'镡': 1, u'镢': 1, u'镣': 1, u'镤': 1, u'镥': 1, u'镦': 1, u'镧': 1, u'镨': 1, u'镩': 1, u'镪': 1, u'镫': 1, u'镬': 1, u'镭': 1, u'镮': 1, u'镯': 1, u'镰': 1, u'镱': 1, u'镲': 1, u'镳': 1, u'镴': 1, u'镵': 1, u'镶': 1, u'長': 2, u'长': 1, u'門': 2, u'閂': 2, u'閃': 2, u'閆': 2, u'閈': 2, u'閉': 2, u'開': 2, u'閌': 2, u'閍': 2, u'閎': 2, u'閏': 2, u'閐': 2, u'閑': 2, u'間': 2, u'閔': 2, u'閘': 2, u'閡': 2, u'閣': 2, u'閥': 2, u'閨': 2, u'閩': 2, u'閫': 2, u'閬': 2, u'閭': 2, u'閱': 2, u'閶': 2, u'閹': 2, u'閻': 2, u'閼': 2, u'閽': 2, u'閾': 2, u'閿': 2, u'闃': 2, u'闆': 2, u'闈': 2, u'闊': 2, u'闋': 2, u'闌': 2, u'闍': 2, u'闐': 2, u'闒': 2, u'闓': 2, u'闔': 2, u'闕': 2, u'闖': 2, u'關': 2, u'闞': 2, u'闠': 2, u'闡': 2, u'闤': 2, u'闥': 2, u'门': 1, u'闩': 1, u'闪': 1, u'闫': 1, u'闬': 1, u'闭': 1, u'问': 1, u'闯': 1, u'闰': 1, u'闱': 1, u'闲': 1, u'闳': 1, u'间': 1, u'闵': 1, u'闶': 1, u'闷': 1, u'闸': 1, u'闹': 1, u'闺': 1, u'闻': 1, u'闼': 1, u'闽': 1, u'闾': 1, u'闿': 1, u'阀': 1, u'阁': 1, u'阂': 1, u'阃': 1, u'阄': 1, u'阅': 1, u'阆': 1, u'阇': 1, u'阈': 1, u'阉': 1, u'阊': 1, u'阋': 1, u'阌': 1, u'阍': 1, u'阎': 1, u'阏': 1, u'阐': 1, u'阑': 1, u'阒': 1, u'阓': 1, u'阔': 1, u'阕': 1, u'阖': 1, u'阗': 1, u'阘': 1, u'阙': 1, u'阚': 1, u'阛': 1, u'队': 1, u'阪': 2, u'阳': 1, u'阴': 1, u'阵': 1, u'阶': 1, u'际': 1, u'陆': 1, u'陇': 1, u'陈': 1, u'陉': 1, u'陕': 1, u'陘': 2, u'陝': 2, u'陣': 2, u'陧': 1, u'陨': 1, u'险': 1, u'陰': 2, u'陳': 2, u'陸': 2, u'陽': 2, u'隉': 2, u'隊': 2, u'階': 2, u'随': 1, u'隐': 1, u'隕': 2, u'際': 2, u'隨': 2, u'險': 2, u'隱': 2, u'隴': 2, u'隶': 1, u'隸': 2, u'隻': 2, u'隽': 1, u'难': 1, u'雋': 2, u'雏': 1, u'雖': 2, u'雙': 2, u'雛': 2, u'雜': 2, u'雞': 2, u'雠': 1, u'離': 2, u'難': 2, u'雲': 2, u'雳': 1, u'電': 2, u'雾': 1, u'霁': 1, u'霡': 1, u'霢': 2, u'霧': 2, u'霭': 1, u'霽': 2, u'靂': 2, u'靄': 2, u'靈': 2, u'靓': 1, u'静': 1, u'靚': 2, u'靜': 2, u'面': 1, u'靥': 1, u'靦': 2, u'靨': 2, u'鞀': 2, u'鞏': 2, u'鞑': 1, u'鞒': 1, u'鞝': 2, u'鞯': 1, u'鞽': 2, u'韁': 2, u'韃': 2, u'韉': 2, u'韋': 2, u'韌': 2, u'韍': 2, u'韓': 2, u'韙': 2, u'韜': 2, u'韞': 2, u'韦': 1, u'韧': 1, u'韨': 1, u'韩': 1, u'韪': 1, u'韫': 1, u'韬': 1, u'韵': 1, u'韻': 2, u'響': 2, u'頁': 2, u'頂': 2, u'頃': 2, u'項': 2, u'順': 2, u'頇': 2, u'須': 2, u'頊': 2, u'頌': 2, u'頎': 2, u'頏': 2, u'預': 2, u'頑': 2, u'頒': 2, u'頓': 2, u'頗': 2, u'領': 2, u'頜': 2, u'頡': 2, u'頤': 2, u'頦': 2, u'頭': 2, u'頮': 2, u'頰': 2, u'頲': 2, u'頴': 2, u'頷': 2, u'頸': 2, u'頹': 2, u'頻': 2, u'顃': 2, u'顆': 2, u'題': 2, u'額': 2, u'顎': 2, u'顏': 2, u'顒': 2, u'顓': 2, u'願': 2, u'顙': 2, u'顛': 2, u'類': 2, u'顢': 2, u'顥': 2, u'顧': 2, u'顫': 2, u'顬': 2, u'顯': 2, u'顰': 2, u'顱': 2, u'顳': 2, u'顴': 2, u'页': 1, u'顶': 1, u'顷': 1, u'顸': 1, u'项': 1, u'顺': 1, u'须': 1, u'顼': 1, u'顽': 1, u'顾': 1, u'顿': 1, u'颀': 1, u'颁': 1, u'颂': 1, u'颃': 1, u'预': 1, u'颅': 1, u'领': 1, u'颇': 1, u'颈': 1, u'颉': 1, u'颊': 1, u'颋': 1, u'颌': 1, u'颍': 1, u'颎': 1, u'颏': 1, u'颐': 1, u'频': 1, u'颒': 1, u'颓': 1, u'颔': 1, u'颕': 1, u'颖': 1, u'颗': 1, u'题': 1, u'颙': 1, u'颚': 1, u'颛': 1, u'颜': 1, u'额': 1, u'颞': 1, u'颟': 1, u'颠': 1, u'颡': 1, u'颢': 1, u'颣': 1, u'颤': 1, u'颥': 1, u'颦': 1, u'颧': 1, u'風': 2, u'颭': 2, u'颮': 2, u'颯': 2, u'颰': 2, u'颱': 2, u'颳': 2, u'颶': 2, u'颷': 2, u'颸': 2, u'颺': 2, u'颻': 2, u'颼': 2, u'颾': 2, u'飀': 2, u'飄': 2, u'飆': 2, u'飈': 2, u'风': 1, u'飏': 1, u'飐': 1, u'飑': 1, u'飒': 1, u'飓': 1, u'飔': 1, u'飕': 1, u'飖': 1, u'飗': 1, u'飘': 1, u'飙': 1, u'飚': 1, u'飛': 2, u'飞': 1, u'飠': 2, u'飢': 2, u'飣': 2, u'飥': 2, u'飨': 1, u'飩': 2, u'飪': 2, u'飫': 2, u'飭': 2, u'飯': 2, u'飲': 2, u'飴': 2, u'飼': 2, u'飽': 2, u'飾': 2, u'飿': 2, u'餃': 2, u'餄': 2, u'餅': 2, u'餉': 2, u'養': 2, u'餌': 2, u'餍': 1, u'餎': 2, u'餏': 2, u'餑': 2, u'餒': 2, u'餓': 2, u'餔': 2, u'餕': 2, u'餖': 2, u'餗': 2, u'餘': 2, u'餚': 2, u'餛': 2, u'餜': 2, u'餞': 2, u'餡': 2, u'餦': 2, u'館': 2, u'餭': 2, u'餱': 2, u'餳': 2, u'餶': 2, u'餷': 2, u'餸': 2, u'餺': 2, u'餼': 2, u'餾': 2, u'餿': 2, u'饁': 2, u'饃': 2, u'饅': 2, u'饈': 2, u'饉': 2, u'饊': 2, u'饋': 2, u'饌': 2, u'饒': 2, u'饗': 2, u'饘': 2, u'饜': 2, u'饞': 2, u'饢': 2, u'饣': 1, u'饤': 1, u'饥': 1, u'饦': 1, u'饧': 1, u'饨': 1, u'饩': 1, u'饪': 1, u'饫': 1, u'饬': 1, u'饭': 1, u'饮': 1, u'饯': 1, u'饰': 1, u'饱': 1, u'饲': 1, u'饳': 1, u'饴': 1, u'饵': 1, u'饶': 1, u'饷': 1, u'饸': 1, u'饹': 1, u'饺': 1, u'饻': 1, u'饼': 1, u'饽': 1, u'饾': 1, u'饿': 1, u'馀': 1, u'馁': 1, u'馂': 1, u'馃': 1, u'馄': 1, u'馅': 1, u'馆': 1, u'馇': 1, u'馈': 1, u'馉': 1, u'馊': 1, u'馋': 1, u'馌': 1, u'馍': 1, u'馎': 1, u'馏': 1, u'馐': 1, u'馑': 1, u'馒': 1, u'馓': 1, u'馔': 1, u'馕': 1, u'馬': 2, u'馭': 2, u'馮': 2, u'馱': 2, u'馳': 2, u'馴': 2, u'馹': 2, u'駁': 2, u'駃': 2, u'駎': 2, u'駐': 2, u'駑': 2, u'駒': 2, u'駔': 2, u'駕': 2, u'駘': 2, u'駙': 2, u'駚': 2, u'駛': 2, u'駝': 2, u'駟': 2, u'駢': 2, u'駧': 2, u'駩': 2, u'駭': 2, u'駰': 2, u'駱': 2, u'駶': 2, u'駸': 2, u'駻': 2, u'駿': 2, u'騁': 2, u'騂': 2, u'騃': 2, u'騅': 2, u'騌': 2, u'騍': 2, u'騎': 2, u'騏': 2, u'騔': 2, u'騖': 2, u'騙': 2, u'騚': 2, u'騝': 2, u'騟': 2, u'騠': 2, u'騤': 2, u'騧': 2, u'騪': 2, u'騫': 2, u'騭': 2, u'騮': 2, u'騰': 2, u'騶': 2, u'騷': 2, u'騸': 2, u'騾': 2, u'驀': 2, u'驁': 2, u'驂': 2, u'驃': 2, u'驄': 2, u'驅': 2, u'驊': 2, u'驋': 2, u'驌': 2, u'驍': 2, u'驏': 2, u'驕': 2, u'驗': 2, u'驚': 2, u'驛': 2, u'驟': 2, u'驢': 2, u'驤': 2, u'驥': 2, u'驦': 2, u'驪': 2, u'驫': 2, u'马': 1, u'驭': 1, u'驮': 1, u'驯': 1, u'驰': 1, u'驱': 1, u'驲': 1, u'驳': 1, u'驴': 1, u'驵': 1, u'驶': 1, u'驷': 1, u'驸': 1, u'驹': 1, u'驺': 1, u'驻': 1, u'驼': 1, u'驽': 1, u'驾': 1, u'驿': 1, u'骀': 1, u'骁': 1, u'骂': 1, u'骃': 1, u'骄': 1, u'骅': 1, u'骆': 1, u'骇': 1, u'骈': 1, u'骉': 1, u'骊': 1, u'骋': 1, u'验': 1, u'骍': 1, u'骎': 1, u'骏': 1, u'骐': 1, u'骑': 1, u'骒': 1, u'骓': 1, u'骔': 1, u'骕': 1, u'骖': 1, u'骗': 1, u'骘': 1, u'骙': 1, u'骚': 1, u'骛': 1, u'骜': 1, u'骝': 1, u'骞': 1, u'骟': 1, u'骠': 1, u'骡': 1, u'骢': 1, u'骣': 1, u'骤': 1, u'骥': 1, u'骦': 1, u'骧': 1, u'骯': 2, u'髅': 1, u'髋': 1, u'髌': 1, u'髏': 2, u'髒': 2, u'體': 2, u'髕': 2, u'髖': 2, u'髮': 2, u'鬆': 2, u'鬍': 2, u'鬓': 1, u'鬚': 2, u'鬢': 2, u'鬥': 2, u'鬧': 2, u'鬩': 2, u'鬮': 2, u'鬱': 2, u'鬶': 1, u'鬹': 2, u'魇': 1, u'魉': 1, u'魎': 2, u'魘': 2, u'魚': 2, u'魛': 2, u'魟': 2, u'魢': 2, u'魥': 2, u'魨': 2, u'魯': 2, u'魴': 2, u'魷': 2, u'魺': 2, u'鮁': 2, u'鮃': 2, u'鮄': 2, u'鮊': 2, u'鮋': 2, u'鮍': 2, u'鮐': 2, u'鮑': 2, u'鮒': 2, u'鮓': 2, u'鮚': 2, u'鮜': 2, u'鮞': 2, u'鮟': 2, u'鮣': 2, u'鮦': 2, u'鮪': 2, u'鮫': 2, u'鮭': 2, u'鮮': 2, u'鮰': 2, u'鮳': 2, u'鮶': 2, u'鮸': 2, u'鮺': 2, u'鯀': 2, u'鯁': 2, u'鯄': 2, u'鯆': 2, u'鯇': 2, u'鯉': 2, u'鯊': 2, u'鯒': 2, u'鯔': 2, u'鯕': 2, u'鯖': 2, u'鯗': 2, u'鯛': 2, u'鯝': 2, u'鯡': 2, u'鯢': 2, u'鯤': 2, u'鯧': 2, u'鯨': 2, u'鯪': 2, u'鯫': 2, u'鯱': 2, u'鯴': 2, u'鯶': 2, u'鯷': 2, u'鯽': 2, u'鯿': 2, u'鰁': 2, u'鰂': 2, u'鰃': 2, u'鰆': 2, u'鰈': 2, u'鰉': 2, u'鰌': 2, u'鰍': 2, u'鰏': 2, u'鰒': 2, u'鰓': 2, u'鰜': 2, u'鰟': 2, u'鰠': 2, u'鰣': 2, u'鰤': 2, u'鰥': 2, u'鰧': 2, u'鰨': 2, u'鰩': 2, u'鰭': 2, u'鰮': 2, u'鰱': 2, u'鰲': 2, u'鰳': 2, u'鰵': 2, u'鰷': 2, u'鰹': 2, u'鰺': 2, u'鰻': 2, u'鰼': 2, u'鰾': 2, u'鱂': 2, u'鱅': 2, u'鱇': 2, u'鱈': 2, u'鱉': 2, u'鱒': 2, u'鱔': 2, u'鱖': 2, u'鱗': 2, u'鱘': 2, u'鱝': 2, u'鱟': 2, u'鱠': 2, u'鱣': 2, u'鱤': 2, u'鱧': 2, u'鱨': 2, u'鱭': 2, u'鱮': 2, u'鱯': 2, u'鱷': 2, u'鱸': 2, u'鱺': 2, u'鱼': 1, u'鱽': 1, u'鱾': 1, u'鱿': 1, u'鲀': 1, u'鲁': 1, u'鲂': 1, u'鲃': 1, u'鲄': 1, u'鲅': 1, u'鲆': 1, u'鲈': 1, u'鲉': 1, u'鲊': 1, u'鲋': 1, u'鲌': 1, u'鲍': 1, u'鲎': 1, u'鲏': 1, u'鲐': 1, u'鲑': 1, u'鲒': 1, u'鲓': 1, u'鲔': 1, u'鲕': 1, u'鲖': 1, u'鲗': 1, u'鲘': 1, u'鲙': 1, u'鲚': 1, u'鲛': 1, u'鲜': 1, u'鲝': 1, u'鲞': 1, u'鲟': 1, u'鲠': 1, u'鲡': 1, u'鲢': 1, u'鲣': 1, u'鲤': 1, u'鲥': 1, u'鲦': 1, u'鲧': 1, u'鲨': 1, u'鲩': 1, u'鲪': 1, u'鲫': 1, u'鲬': 1, u'鲭': 1, u'鲮': 1, u'鲯': 1, u'鲰': 1, u'鲱': 1, u'鲲': 1, u'鲳': 1, u'鲴': 1, u'鲵': 1, u'鲷': 1, u'鲸': 1, u'鲹': 1, u'鲺': 1, u'鲻': 1, u'鲼': 1, u'鲽': 1, u'鲾': 1, u'鲿': 1, u'鳀': 1, u'鳁': 1, u'鳂': 1, u'鳃': 1, u'鳄': 1, u'鳅': 1, u'鳆': 1, u'鳇': 1, u'鳈': 1, u'鳉': 1, u'鳊': 1, u'鳋': 1, u'鳌': 1, u'鳍': 1, u'鳎': 1, u'鳏': 1, u'鳐': 1, u'鳑': 1, u'鳒': 1, u'鳓': 1, u'鳔': 1, u'鳕': 1, u'鳖': 1, u'鳗': 1, u'鳘': 1, u'鳙': 1, u'鳚': 1, u'鳛': 1, u'鳜': 1, u'鳝': 1, u'鳞': 1, u'鳟': 1, u'鳠': 1, u'鳡': 1, u'鳢': 1, u'鳣': 1, u'鳥': 2, u'鳧': 2, u'鳩': 2, u'鳲': 2, u'鳳': 2, u'鳴': 2, u'鳶': 2, u'鳷': 2, u'鳼': 2, u'鳾': 2, u'鴃': 2, u'鴆': 2, u'鴇': 2, u'鴉': 2, u'鴒': 2, u'鴕': 2, u'鴗': 2, u'鴛': 2, u'鴜': 2, u'鴝': 2, u'鴞': 2, u'鴟': 2, u'鴣': 2, u'鴦': 2, u'鴨': 2, u'鴯': 2, u'鴰': 2, u'鴲': 2, u'鴴': 2, u'鴷': 2, u'鴻': 2, u'鴿': 2, u'鵁': 2, u'鵂': 2, u'鵃': 2, u'鵐': 2, u'鵑': 2, u'鵒': 2, u'鵓': 2, u'鵚': 2, u'鵜': 2, u'鵝': 2, u'鵠': 2, u'鵡': 2, u'鵪': 2, u'鵬': 2, u'鵮': 2, u'鵯': 2, u'鵲': 2, u'鵷': 2, u'鵾': 2, u'鶄': 2, u'鶇': 2, u'鶉': 2, u'鶊': 2, u'鶒': 2, u'鶓': 2, u'鶖': 2, u'鶗': 2, u'鶘': 2, u'鶚': 2, u'鶡': 2, u'鶥': 2, u'鶩': 2, u'鶪': 2, u'鶬': 2, u'鶯': 2, u'鶲': 2, u'鶴': 2, u'鶹': 2, u'鶺': 2, u'鶻': 2, u'鶼': 2, u'鶿': 2, u'鷁': 2, u'鷂': 2, u'鷈': 2, u'鷊': 2, u'鷓': 2, u'鷔': 2, u'鷖': 2, u'鷗': 2, u'鷙': 2, u'鷚': 2, u'鷥': 2, u'鷦': 2, u'鷨': 2, u'鷫': 2, u'鷯': 2, u'鷲': 2, u'鷳': 2, u'鷸': 2, u'鷹': 2, u'鷺': 2, u'鷽': 2, u'鷿': 2, u'鸂': 2, u'鸇': 2, u'鸋': 2, u'鸌': 2, u'鸏': 2, u'鸕': 2, u'鸘': 2, u'鸚': 2, u'鸛': 2, u'鸝': 2, u'鸞': 2, u'鸟': 1, u'鸠': 1, u'鸡': 1, u'鸢': 1, u'鸣': 1, u'鸤': 1, u'鸥': 1, u'鸦': 1, u'鸧': 1, u'鸨': 1, u'鸩': 1, u'鸪': 1, u'鸫': 1, u'鸬': 1, u'鸭': 1, u'鸮': 1, u'鸯': 1, u'鸰': 1, u'鸱': 1, u'鸲': 1, u'鸳': 1, u'鸴': 1, u'鸵': 1, u'鸶': 1, u'鸷': 1, u'鸸': 1, u'鸹': 1, u'鸺': 1, u'鸻': 1, u'鸼': 1, u'鸽': 1, u'鸾': 1, u'鸿': 1, u'鹀': 1, u'鹁': 1, u'鹂': 1, u'鹃': 1, u'鹄': 1, u'鹅': 1, u'鹆': 1, u'鹇': 1, u'鹈': 1, u'鹉': 1, u'鹊': 1, u'鹋': 1, u'鹌': 1, u'鹍': 1, u'鹎': 1, u'鹏': 1, u'鹐': 1, u'鹑': 1, u'鹒': 1, u'鹓': 1, u'鹔': 1, u'鹕': 1, u'鹖': 1, u'鹗': 1, u'鹘': 1, u'鹙': 1, u'鹚': 1, u'鹛': 1, u'鹜': 1, u'鹝': 1, u'鹞': 1, u'鹟': 1, u'鹠': 1, u'鹡': 1, u'鹢': 1, u'鹣': 1, u'鹤': 1, u'鹥': 1, u'鹦': 1, u'鹧': 1, u'鹨': 1, u'鹩': 1, u'鹪': 1, u'鹫': 1, u'鹬': 1, u'鹭': 1, u'鹮': 1, u'鹯': 1, u'鹰': 1, u'鹱': 1, u'鹲': 1, u'鹳': 1, u'鹴': 1, u'鹵': 2, u'鹹': 2, u'鹺': 2, u'鹼': 2, u'鹽': 2, u'鹾': 1, u'麗': 2, u'麥': 2, u'麦': 1, u'麨': 2, u'麩': 2, u'麲': 2, u'麵': 2, u'麸': 1, u'麼': 2, u'麽': 2, u'黃': 2, u'黄': 1, u'黉': 1, u'黌': 2, u'點': 2, u'黡': 1, u'黨': 2, u'黩': 1, u'黪': 1, u'黲': 2, u'黶': 2, u'黷': 2, u'黽': 2, u'黾': 1, u'黿': 2, u'鼉': 2, u'鼋': 1, u'鼍': 1, u'鼗': 1, u'鼴': 2, u'鼹': 1, u'齊': 2, u'齋': 2, u'齎': 2, u'齏': 2, u'齐': 1, u'齑': 1, u'齒': 2, u'齔': 2, u'齕': 2, u'齗': 2, u'齙': 2, u'齜': 2, u'齟': 2, u'齠': 2, u'齡': 2, u'齦': 2, u'齪': 2, u'齬': 2, u'齲': 2, u'齶': 2, u'齷': 2, u'齿': 1, u'龀': 1, u'龁': 1, u'龂': 1, u'龃': 1, u'龄': 1, u'龅': 1, u'龆': 1, u'龇': 1, u'龈': 1, u'龉': 1, u'龊': 1, u'龋': 1, u'龌': 1, u'龍': 2, u'龎': 2, u'龐': 2, u'龑': 2, u'龔': 2, u'龕': 2, u'龙': 1, u'龚': 1, u'龛': 1, u'龜': 2, u'龟': 1, u'龭': 2, u'龯': 2, u'鿁': 2, u'𠆲': 1, u'𠆿': 1, u'𠉂': 1, u'𠉗': 1, u'𠌥': 2, u'𠏢': 2, u'𠚳': 1, u'𠛅': 1, u'𠛆': 1, u'𠞆': 2, u'𠠎': 2, u'𠯟': 1, u'𠯠': 1, u'𠲥': 1, u'𠴢': 1, u'𠵸': 1, u'𠵾': 1, u'𡄔': 2, u'𡄣': 2, u'𡅏': 2, u'𡋀': 1, u'𡋗': 1, u'𡑭': 2, u'𡒄': 1, u'𡓾': 2, u'𡝠': 1, u'𡞱': 1, u'𡞵': 2, u'𡠹': 2, u'𡢃': 2, u'𡭜': 1, u'𡭬': 1, u'𡮉': 2, u'𡮣': 2, u'𡶴': 1, u'𡾱': 2, u'𢋈': 1, u'𢘝': 1, u'𢘞': 1, u'𢙓': 1, u'𢛯': 1, u'𢣚': 2, u'𢣭': 2, u'𢫊': 1, u'𢫞': 1, u'𢫬': 1, u'𢬦': 1, u'𢭏': 1, u'𢶫': 2, u'𢷮': 2, u'𢹿': 2, u'𢽾': 1, u'𣆐': 1, u'𣍨': 1, u'𣍯': 1, u'𣍰': 1, u'𣎑': 1, u'𣐤': 1, u'𣑶': 1, u'𣗋': 1, u'𣘓': 1, u'𣘴': 1, u'𣘷': 1, u'𣙎': 2, u'𣝕': 2, u'𣞻': 2, u'𣠲': 2, u'𣭤': 1, u'𣯴': 2, u'𣶩': 1, u'𣶫': 1, u'𣸣': 1, u'𣺼': 1, u'𣺽': 1, u'𣽷': 1, u'𣾷': 2, u'𣿉': 2, u'𤁣': 2, u'𤆡': 1, u'𤇃': 1, u'𤇄': 1, u'𤈶': 1, u'𤈷': 1, u'𤊀': 1, u'𤋏': 1, u'𤒎': 2, u'𤞤': 1, u'𤠋': 1, u'𤦀': 1, u'𤪺': 2, u'𤫩': 2, u'𤳄': 1, u'𤳸': 2, u'𤶧': 1, u'𤸫': 2, u'𤽯': 1, u'𤾀': 1, u'𥅘': 1, u'𥅴': 1, u'𥆧': 1, u'𥇢': 1, u'𥌃': 2, u'𥐟': 1, u'𥐯': 1, u'𥐰': 1, u'𥐻': 1, u'𥕥': 2, u'𥖅': 2, u'𥢢': 2, u'𥧂': 1, u'𥨐': 2, u'𥬀': 1, u'𥬞': 1, u'𥬠': 1, u'𥭉': 1, u'𥮋': 1, u'𥮜': 1, u'𥱔': 1, u'𥵃': 2, u'𥵊': 2, u'𥸠': 2, u'𥹥': 1, u'𥺅': 1, u'𥺇': 1, u'𥼽': 2, u'𥽖': 2, u'𥿊': 2, u'𦂅': 2, u'𦃄': 2, u'𦈈': 1, u'𦈉': 1, u'𦈋': 1, u'𦈌': 1, u'𦈎': 1, u'𦈏': 1, u'𦈐': 1, u'𦈑': 1, u'𦈒': 1, u'𦈓': 1, u'𦈔': 1, u'𦈕': 1, u'𦈖': 1, u'𦈗': 1, u'𦈘': 1, u'𦈙': 1, u'𦈚': 1, u'𦈛': 1, u'𦈜': 1, u'𦈝': 1, u'𦈞': 1, u'𦈟': 1, u'𦈠': 1, u'𦈡': 1, u'𦛨': 1, u'𦝼': 1, u'𦟗': 1, u'𦢈': 2, u'𦣎': 2, u'𦨩': 1, u'𦪽': 2, u'𦰴': 1, u'𧉞': 1, u'𧒭': 1, u'𧔥': 2, u'𧜗': 2, u'𧜵': 2, u'𧝞': 2, u'𧩙': 2, u'𧮪': 1, u'𧳕': 1, u'𧳟': 2, u'𧵳': 2, u'𧶔': 2, u'𧶧': 2, u'𧹑': 1, u'𧹓': 1, u'𧹕': 1, u'𧹖': 1, u'𧹗': 1, u'𧿈': 1, u'𨀱': 1, u'𨁴': 1, u'𨂺': 1, u'𨄄': 1, u'𨄣': 2, u'𨅍': 2, u'𨅫': 1, u'𨅬': 1, u'𨇁': 2, u'𨇞': 2, u'𨈊': 2, u'𨈌': 2, u'𨉗': 1, u'𨊰': 2, u'𨊸': 2, u'𨊻': 2, u'𨋢': 2, u'𨎮': 2, u'𨏠': 2, u'𨏥': 2, u'𨐅': 1, u'𨐆': 1, u'𨐇': 1, u'𨐈': 1, u'𨐉': 1, u'𨐊': 1, u'𨑹': 1, u'𨤰': 1, u'𨤻': 2, u'𨥛': 2, u'𨦫': 2, u'𨧜': 2, u'𨧱': 2, u'𨫒': 2, u'𨮂': 2, u'𨯅': 2, u'𨰾': 1, u'𨰿': 1, u'𨱀': 1, u'𨱁': 1, u'𨱂': 1, u'𨱃': 1, u'𨱄': 1, u'𨱅': 1, u'𨱆': 1, u'𨱇': 1, u'𨱈': 1, u'𨱉': 1, u'𨱊': 1, u'𨱋': 1, u'𨱌': 1, u'𨱍': 1, u'𨱎': 1, u'𨱏': 1, u'𨱐': 1, u'𨱑': 1, u'𨱒': 1, u'𨱓': 1, u'𨱔': 1, u'𨱕': 1, u'𨱖': 1, u'𨳑': 2, u'𨳕': 2, u'𨴗': 2, u'𨵩': 2, u'𨵸': 2, u'𨶀': 2, u'𨶏': 2, u'𨶮': 2, u'𨶲': 2, u'𨷲': 2, u'𨷿': 1, u'𨸀': 1, u'𨸁': 1, u'𨸂': 1, u'𨸃': 1, u'𨸄': 1, u'𨸅': 1, u'𨸆': 1, u'𨸇': 1, u'𨸉': 1, u'𨸊': 1, u'𨸋': 1, u'𨸌': 1, u'𨸎': 1, u'𨸘': 1, u'𨸟': 1, u'𨽏': 2, u'𩎢': 2, u'𩏪': 2, u'𩏼': 1, u'𩏽': 1, u'𩏾': 1, u'𩏿': 1, u'𩐀': 1, u'𩓣': 2, u'𩖕': 1, u'𩖖': 1, u'𩖗': 1, u'𩗀': 2, u'𩘀': 2, u'𩘝': 2, u'𩘹': 2, u'𩘺': 2, u'𩙈': 2, u'𩙥': 1, u'𩙦': 1, u'𩙧': 1, u'𩙨': 1, u'𩙩': 1, u'𩙪': 1, u'𩙫': 1, u'𩙬': 1, u'𩙭': 1, u'𩙮': 1, u'𩙯': 1, u'𩙰': 1, u'𩚛': 2, u'𩚥': 2, u'𩚵': 2, u'𩛆': 2, u'𩛩': 2, u'𩜇': 2, u'𩜦': 2, u'𩜵': 2, u'𩝔': 2, u'𩞄': 2, u'𩞦': 2, u'𩞯': 2, u'𩟐': 2, u'𩟿': 1, u'𩠀': 1, u'𩠁': 1, u'𩠂': 1, u'𩠃': 1, u'𩠅': 1, u'𩠆': 1, u'𩠇': 1, u'𩠈': 1, u'𩠉': 1, u'𩠊': 1, u'𩠋': 1, u'𩠌': 1, u'𩠎': 1, u'𩠏': 1, u'𩠠': 1, u'𩠴': 2, u'𩡺': 2, u'𩢡': 2, u'𩢴': 2, u'𩢸': 2, u'𩢾': 2, u'𩣏': 2, u'𩣑': 2, u'𩣺': 2, u'𩤊': 2, u'𩤙': 2, u'𩤲': 2, u'𩤸': 2, u'𩥄': 2, u'𩥇': 2, u'𩥉': 2, u'𩥑': 2, u'𩧆': 2, u'𩧦': 1, u'𩧨': 1, u'𩧩': 1, u'𩧪': 1, u'𩧫': 1, u'𩧬': 1, u'𩧭': 1, u'𩧮': 1, u'𩧯': 1, u'𩧰': 1, u'𩧱': 1, u'𩧲': 1, u'𩧳': 1, u'𩧴': 1, u'𩧵': 1, u'𩧶': 1, u'𩧺': 1, u'𩧼': 1, u'𩧿': 1, u'𩨀': 1, u'𩨁': 1, u'𩨃': 1, u'𩨄': 1, u'𩨅': 1, u'𩨆': 1, u'𩨇': 1, u'𩨈': 1, u'𩨉': 1, u'𩨊': 1, u'𩨋': 1, u'𩨌': 1, u'𩨍': 1, u'𩨎': 1, u'𩨏': 1, u'𩨐': 1, u'𩬣': 1, u'𩬤': 1, u'𩭙': 2, u'𩯒': 1, u'𩯳': 2, u'𩰀': 2, u'𩲒': 1, u'𩳤': 2, u'𩵩': 2, u'𩵹': 2, u'𩶘': 2, u'𩶰': 2, u'𩶱': 2, u'𩷰': 2, u'𩸃': 2, u'𩸦': 2, u'𩽹': 1, u'𩽺': 1, u'𩽻': 1, u'𩽼': 1, u'𩽽': 1, u'𩽾': 1, u'𩽿': 1, u'𩾁': 1, u'𩾂': 1, u'𩾃': 1, u'𩾄': 1, u'𩾅': 1, u'𩾆': 1, u'𩾇': 1, u'𩾈': 1, u'𩾊': 1, u'𩾋': 1, u'𩾌': 1, u'𩿪': 2, u'𪀦': 2, u'𪀾': 2, u'𪁈': 2, u'𪁖': 2, u'𪂆': 2, u'𪃍': 2, u'𪃏': 2, u'𪄆': 2, u'𪄕': 2, u'𪇳': 2, u'𪉂': 1, u'𪉃': 1, u'𪉄': 1, u'𪉅': 1, u'𪉆': 1, u'𪉈': 1, u'𪉉': 1, u'𪉊': 1, u'𪉋': 1, u'𪉌': 1, u'𪉍': 1, u'𪉎': 1, u'𪉏': 1, u'𪉐': 1, u'𪉑': 1, u'𪉒': 1, u'𪉔': 1, u'𪉕': 1, u'𪋿': 2, u'𪎈': 1, u'𪎉': 1, u'𪎊': 1, u'𪎋': 1, u'𪎍': 1, u'𪔭': 1, u'𪔵': 2, u'𪘀': 2, u'𪘯': 2, u'𪚏': 1, u'𪚐': 1, u'𪞝': 1, u'𪡏': 1, u'𪢮': 1, u'𪨊': 1, u'𪨗': 1, u'𪻐': 1, u'𪾢': 1, u'𫁡': 1, u'𫂈': 1, u'𫄨': 1, u'𫄸': 1, u'𫌀': 1, u'𫌨': 1, u'𫍙': 1, u'𫍟': 1, u'𫍢': 1, u'𫍰': 1, u'𫍲': 1, u'𫏋': 1, u'𫐄': 1, u'𫐆': 1, u'𫐉': 1, u'𫐐': 1, u'𫐓': 1, u'𫓧': 1, u'𫓩': 1, u'𫔎': 1, u'𫖸': 1, u'𫗠': 1, u'𫗦': 1, u'𫗧': 1, u'𫗮': 1, u'𫗴': 1, u'𫘝': 1, u'𫘣': 1, u'𫘤': 1, u'𫘨': 1, u'𫚈': 1, u'𫚉': 1, u'𫚒': 1, u'𫚔': 1, u'𫚕': 1, u'𫚙': 1, u'𫛛': 1, u'𫛞': 1, u'𫛢': 1, u'𫛶': 1, u'𫛸': 1, } def detect_chinese_category(phrase): ''' New function using Unihan data to guess whether a text is simplified Chinese, traditional Chinese, both, or something rare like a mixture of exclusively simplified with exclusively traditional characters. Meaning of the bits in the category value returned by this function: 1 = 1 << 0 simplified Chinese 2 = 1 << 1 traditional Chinese 3 = (1 | 1 << 1) used both in simplified *and* traditional Chinese 4 = 1 << 2 mixture of simplified and traditional Chinese ''' # make sure that we got a unicode string if type(phrase) != type(u''): phrase = phrase.decode('utf8') if phrase in variants_table: # the complete phrase is in variants_table, just return the # value found: return variants_table[phrase] category = 0xFF; for c in phrase: if c in variants_table: category &= variants_table[c] else: # If it is not listed in variants_table, assume it is # both simplified and traditional Chinese. # It could be something non-Chinese as well then, but # if it is non-Chinese, it should also be allowed to # occur in any Chinese text and thus classified as # both simplified *and* traditional Chinese (the emoji # table for example uses many non-Chinese characters) category &= (1 | 1 << 1) if category == 0: # If category is 0 after binary & of the categories of all the # characters in the phrase, it means that the phrase contained # exclusively simplified *and* exclusively traditional # characters at the same time. For example if the phrase is # “乌烏” then “乌” gets category 1 (simplified Chinese) # and “烏” gets category 2 (traditional Chinese), the result # of the binary & is thus 0. In that case, classify it as # category 4 which is for weird, excentric, rare stuff. If the # user selects one of the modes “all characters but # simplified Chinese first” or “all characters but # traditional Chinese first”, phrases with category 4 will be # shown but filtered to be shown only at the end of the # candidate list. category = 1 << 2 return category ibus-table-1.9.1/engine/factory.py000066400000000000000000000075251241251735600170560ustar00rootroot00000000000000# -*- coding: utf-8 -*- # vim:et sw=4 sts=4 sw=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # Copyright (c) 2009-2014 Caius "kaio" CHANCE # Copyright (c) 2012-2014 Mike FABIAN # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # from gi.repository import IBus import table import tabsqlitedb import os import re from gettext import dgettext _ = lambda a : dgettext ("ibus-table", a) N_ = lambda a : a class EngineFactory (IBus.Factory): """Table IM Engine Factory""" def __init__ (self, bus, db="", icon=""): # db is the full path to the sql database if db: self.dbusname = os.path.basename(db).replace('.db','') udb = os.path.basename(db).replace('.db','-user.db') self.db = tabsqlitedb.tabsqlitedb(filename = db, user_db = udb) self.db.db.commit() self.dbdict = {self.dbusname:self.db} else: self.db = None self.dbdict = {} # init factory self.bus = bus super(EngineFactory,self).__init__ (connection=bus.get_connection(), object_path=IBus.PATH_FACTORY) self.engine_id=0 def do_create_engine(self, engine_name): engine_name = re.sub(r'^table:', '', engine_name) engine_base_path = "/com/redhat/IBus/engines/table/%s/engine/" path_patt = re.compile(r'[^a-zA-Z0-9_/]') self.engine_path = engine_base_path % path_patt.sub ('_', engine_name) try: if not self.db: # first check self.dbdict if not engine_name in self.dbdict: try: db_dir = os.path.join (os.getenv('IBUS_TABLE_LOCATION'),'tables') except: db_dir = "/usr/share/ibus-table/tables" db = os.path.join (db_dir, engine_name+'.db') udb = engine_name+'-user.db' if not os.path.exists(db): byo_db_dir = os.path.join(os.getenv('HOME'), '.ibus/byo-tables') db = os.path.join(byo_db_dir, engine_name + '.db') _sq_db = tabsqlitedb.tabsqlitedb(filename = db, user_db = udb) _sq_db.db.commit() self.dbdict[engine_name] = _sq_db else: name = self.dbusname engine = table.tabengine(self.bus, self.engine_path \ + str(self.engine_id), self.dbdict[engine_name]) self.engine_id += 1 #return engine.get_dbus_object() return engine except: print("failed to create engine %s" %engine_name) import traceback traceback.print_exc () raise Exception("Cannot create engine %s" %engine_name) def do_destroy (self): '''Destructor, which finish some task for IME''' # ## we need to sync the temp userdb in memory to the user_db on disk for _db in self.dbdict: self.dbdict[_db].sync_usrdb () ##print "Have synced user db\n" super(EngineFactory,self).destroy() ibus-table-1.9.1/engine/ibus-engine-table.in000066400000000000000000000035331241251735600206520ustar00rootroot00000000000000#!/bin/sh # vim:set et sts=4 sw=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # prefix=@prefix@ exec_prefix=@prefix@ datarootdir=@datarootdir@ datadir=@datadir@ export IBUS_TABLE_LOCATION=@datarootdir@/ibus-table export IBUS_TABLE_LIB_LOCATION=@libexecdir@ # Set this variable to something > 0 to get more debug output. # (Debug output may show up in the log file and/or in the lookup table): # export IBUS_TABLE_DEBUG_LEVEL=1 # # Set this to something if you want benchmarking (The profiling output # will appear in the debug long when "ibus restart" is executed): # export IBUS_TABLE_PROFILE=yes for arg in $@; do case $arg in --xml | -x) exec @PYTHON@ @datarootdir@/ibus-table/engine/main.py --xml;; --help | -h) exec @PYTHON@ @datarootdir@/ibus-table/engine/main.py $@;; *) if [ "x${IBUS_TABLE_PROFILE}" != "x" ]; then exec @PYTHON@ @datarootdir@/ibus-table/engine/main.py --profile $@ else exec @PYTHON@ @datarootdir@/ibus-table/engine/main.py $@ fi exit 0 esac done ibus-table-1.9.1/engine/ibus-table-createdb.in000066400000000000000000000021261241251735600211530ustar00rootroot00000000000000#!/bin/sh # vim:set et sts=4 sw=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # prefix=@prefix@ exec_prefix=@exec_prefix@ bindir=@bindir@ datarootdir=@datarootdir@ datadir=@datadir@ export IBUS_TABLE_DATA_DIR=@datarootdir@ export IBUS_TABLE_BIN_PATH=@bindir@ exec @PYTHON@ @datarootdir@/ibus-table/engine/tabcreatedb.py $@ ibus-table-1.9.1/engine/ibus-table-createdb.sgml000066400000000000000000000161001241251735600215040ustar00rootroot00000000000000 manpage.1'. You may view the manual page with: `docbook-to-man manpage.sgml | nroff -man | less'. A typical entry in a Makefile or Makefile.am is: manpage.1: manpage.sgml docbook-to-man $< > $@ The docbook-to-man binary is found in the docbook-to-man package. Please remember that if you create the nroff version in one of the debian/rules file targets (such as build), you will need to include docbook-to-man in your Build-Depends control field. --> Mike"> FABIAN"> Apr 18, 2013"> 1"> mfabian@redhat.com"> ibus-table-createdb"> Debian"> GNU"> GPL"> ]>
&dhemail;
&dhfirstname; &dhsurname; 2013 &dhusername; &dhdate;
&dhucpackage; &dhsection; &dhpackage; create ibus-table database from table source &dhpackage; DESCRIPTION &dhpackage; creates a database for ibus-table from a source table. OPTIONS This program follows the usual &gnu; command line syntax, with long options starting with two dashes (`-'). A summary of options is included below. database-file specifies the file name for the binary database for the IME. The default is ''. If the file name of the database is not specified, the file name of the source file before the first '.' will be appended with '.db' and that will be used as the file name of the database. source-file specifies the file which contains the source of the IME. The default is ''. extra-words-file specifies the file name for the extra words for the IME. The default is ''. pinyin-file specifies the source file for the pinyin. The default is '/usr/share/ibus-table/data/pinyin_table.txt.bz2'. Do not create an index for a database (Only for distribution purposes, a normal user should not use this flag!) Only create an index for an existing database. Specifying the file name of the binary database with the -n or --name option is required when this option is used. Print extra debug messages. EXAMPLES ibus-table-createdb -n ipa-x-sampa.db -s ipa-x-sampa.txt Create the binary database ipa-x-sampa.db from the source file ipa-x-sampa.txt. ibus-table-createdb -i -n ipa-x-sampa.db Create an index for the database ipa-x-sampa.db. AUTHOR This manual page was written by &dhusername; &dhemail;.
ibus-table-1.9.1/engine/main.py000066400000000000000000000262411241251735600163270ustar00rootroot00000000000000# vim:et sts=4 sw=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # Copyright (c) 2009-2014 Caius "kaio" CHANCE # Copyright (c) 2012-2014 Mike FABIAN # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # import os import sys import optparse from gi.repository import IBus from gi.repository import GLib import re from signal import signal, SIGTERM, SIGINT import factory import tabsqlitedb ibus_dir = os.getenv('IBUS_TABLE_LOCATION') ibus_lib_dir = os.getenv('IBUS_TABLE_LIB_LOCATION') if os.getenv('HOME'): home_ibus_dir = os.path.join(os.getenv('HOME'), ".ibus") else: home_ibus_dir = '' if not ibus_dir or not os.path.exists(ibus_dir): ibus_dir = "/usr/share/ibus-table/" if not ibus_lib_dir or not os.path.exists(ibus_lib_dir): ibus_lib_dir = "/usr/libexec" if not home_ibus_dir or not os.path.exists(home_ibus_dir): home_ibus_dir = os.path.expanduser("~/.ibus") db_dir = os.path.join (ibus_dir, 'tables') byo_db_dir = os.path.join(home_ibus_dir, "byo-tables") icon_dir = os.path.join (ibus_dir, 'icons') setup_cmd = os.path.join(ibus_lib_dir, "ibus-setup-table") opt = optparse.OptionParser() opt.set_usage ('%prog --table a_table.db') opt.add_option('--table', '-t', action = 'store',type = 'string',dest = 'db',default = '', help = 'Set the IME table file, default: %default') opt.add_option('--daemon','-d', action = 'store_true',dest = 'daemon',default=False, help = 'Run as daemon, default: %default') opt.add_option('--ibus', '-i', action = 'store_true',dest = 'ibus',default = False, help = 'Set the IME icon file, default: %default') opt.add_option('--xml', '-x', action = 'store_true',dest = 'xml',default = False, help = 'output the engines xml part, default: %default') opt.add_option('--no-debug', '-n', action = 'store_false',dest = 'debug',default = True, help = 'redirect stdout and stderr to ~/.ibus/tables/debug.log, default: %default') opt.add_option('--profile', '-p', action = 'store_true', dest = 'profile', default = False, help = 'print profiling information into the debug log. Works only together with --debug.') (options, args) = opt.parse_args() #if not options.db: # opt.error('no db found!') if (not options.xml) and options.debug: if not os.access ( os.path.expanduser('~/.ibus/tables'), os.F_OK): os.system ('mkdir -p ~/.ibus/tables') logfile = os.path.expanduser('~/.ibus/tables/debug.log') sys.stdout = open (logfile, mode='a', buffering=1) sys.stderr = open (logfile, mode='a', buffering=1) from time import strftime print('--- %s ---' %strftime('%Y-%m-%d: %H:%M:%S')) if options.profile: import cProfile, pstats profile = cProfile.Profile() class IMApp: def __init__(self, dbfile, exec_by_ibus): self.__mainloop = GLib.MainLoop() self.__bus = IBus.Bus() self.__bus.connect("disconnected", self.__bus_destroy_cb) self.__factory = factory.EngineFactory(self.__bus, dbfile) self.destroyed = False if exec_by_ibus: self.__bus.request_name("org.freedesktop.IBus.Table", 0) else: self.__component = IBus.Component(name="org.freedesktop.IBus.Table", description="Table Component", version="0.1.0", license="GPL", author="Yuwei Yu ", homepage="http://code.google.com/p/ibus/", textdomain="ibus-table") # now we get IME info from self.__factory.db engine_name = os.path.basename(self.__factory.db.filename).replace('.db', '') name = 'table:'+engine_name longname = self.__factory.db.ime_properties.get("name") description = self.__factory.db.ime_properties.get("description") language = self.__factory.db.ime_properties.get("languages") license = self.__factory.db.ime_properties.get("credit") author = self.__factory.db.ime_properties.get("author") icon = self.__factory.db.ime_properties.get("icon") if icon: icon = os.path.join (icon_dir, icon) if not os.access( icon, os.F_OK): icon = '' layout = self.__factory.db.ime_properties.get("layout") symbol = self.__factory.db.ime_properties.get("symbol") setup_arg = "{} --engine-name {}".format(setup_cmd, name) engine = IBus.EngineDesc(name=name, longname=longname, description=description, language=language, license=license, author=author, icon=icon, layout=layout, symbol=symbol, setupdsis=setup_arg) self.__component.add_engines(engine) self.__bus.register_component(self.__component) def run(self): if options.profile: profile.enable() self.__mainloop.run() self.__bus_destroy_cb() def quit(self): self.__bus_destroy_cb() def __bus_destroy_cb(self, bus=None): if self.destroyed: return print("finalizing:)") self.__factory.do_destroy() self.destroyed = True self.__mainloop.quit() if options.profile: profile.disable() p = pstats.Stats(profile) p.strip_dirs() p.sort_stats('cumulative') p.print_stats('main', 25) p.print_stats('factory', 25) p.print_stats('tabsqlite', 25) p.print_stats('table', 25) def cleanup (ima_ins): ima_ins.quit() sys.exit() def indent(elem, level=0): '''Use to format xml Element pretty :)''' i = "\n" + level*" " if len(elem): if not elem.text or not elem.text.strip(): elem.text = i + " " for e in elem: indent(e, level+1) if not e.tail or not e.tail.strip(): e.tail = i + " " if not e.tail or not e.tail.strip(): e.tail = i else: if level and (not elem.tail or not elem.tail.strip()): elem.tail = i def main(): if options.xml: from locale import getdefaultlocale from xml.etree.ElementTree import Element, SubElement, tostring # we will output the engines xml and return. # 1. we find all dbs in db_dir and extract the infos into # Elements dbs = os.listdir(db_dir) dbs = filter (lambda x: x.endswith('.db'), dbs) _all_dbs = [] for _db in dbs: _all_dbs.append(os.path.join (db_dir, _db)) try: byo_dbs = os.listdir(byo_db_dir) byo_dbs = filter (lambda x: x.endswith('.db'), byo_dbs) for _db in byo_dbs: _all_dbs.append(os.path.join (byo_db_dir, _db)) except OSError: # byo_db_dir does not exist or is not accessible pass egs = Element('engines') for _db in _all_dbs: _sq_db = tabsqlitedb.tabsqlitedb (_db, user_db=None) _engine = SubElement (egs,'engine') _name = SubElement (_engine, 'name') engine_name = os.path.basename(_db).replace ('.db','') _name.text = 'table:'+engine_name setup_arg = "{} --engine-name {}".format(setup_cmd, _name.text) _longname = SubElement (_engine, 'longname') _longname.text = '' # getdefaultlocale() returns something like ('ja_JP', 'UTF-8'). _locale = getdefaultlocale()[0].lower() _longname.text = _sq_db.ime_properties.get( '.'.join(['name', _locale])) if not _longname.text: _longname.text = _sq_db.ime_properties.get( '.'.join(['name', _locale.split('_')[0]])) if not _longname.text: _longname.text = _sq_db.ime_properties.get('name') if not _longname.text: _longname.text = engine_name _language = SubElement (_engine, 'language') _langs = _sq_db.ime_properties.get('languages') if _langs: _langs = _langs.split (',') if len (_langs) == 1: _language.text = _langs[0].strip() else: # we ignore the place _language.text = _langs[0].strip().split('_')[0] _license = SubElement (_engine, 'license') _license.text = _sq_db.ime_properties.get('license') _author = SubElement (_engine, 'author') _author.text = _sq_db.ime_properties.get('author') _icon = SubElement (_engine, 'icon') _icon_basename = _sq_db.ime_properties.get('icon') if _icon_basename: _icon.text = os.path.join (icon_dir, _icon_basename) _layout = SubElement (_engine, 'layout') _layout.text = _sq_db.ime_properties.get('layout') _symbol = SubElement (_engine, 'symbol') _symbol.text = _sq_db.ime_properties.get('symbol') _desc = SubElement (_engine, 'description') _desc.text = _sq_db.ime_properties.get('description') _setup = SubElement (_engine, 'setup') _setup.text = setup_arg # now format the xmlout pretty indent (egs) egsout = tostring (egs, encoding='utf8').decode('utf-8') patt = re.compile (r'<\?.*\?>\n') egsout = patt.sub ('',egsout) sys.stdout.buffer.write((egsout+'\n').encode('utf-8')) return 0 if options.daemon : if os.fork(): sys.exit() if options.db: if os.access( options.db, os.F_OK): db = options.db else: db = '%s%s%s' % (db_dir,os.path.sep, os.path.basename(options.db) ) else: db="" ima=IMApp(db, options.ibus) signal (SIGTERM, lambda signum, stack_frame: cleanup(ima)) signal (SIGINT, lambda signum, stack_frame: cleanup(ima)) try: ima.run() except KeyboardInterrupt: ima.quit() if __name__ == "__main__": main() ibus-table-1.9.1/engine/tabcreatedb.py000066400000000000000000000347051241251735600176470ustar00rootroot00000000000000#!/usr/bin/python3 # -*- coding: utf-8 -*- # vim:et sts=4 sw=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # Copyright (c) 2009-2014 Caius "kaio" CHANCE # Copyright (c) 2012-2014 Mike FABIAN # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # import os import sys sys.path.append( os.path.dirname(os.path.abspath(__file__)) ) import tabsqlitedb import bz2 import re from optparse import OptionParser _invalid_keyname_chars = " \t\r\n\"$&<>,+=#!()'|{}[]?~`;%\\" def gconf_valid_keyname(kn): """ Keynames must be ascii, and must not contain any invalid characters >>> gconf_valid_keyname('nyannyan') True >>> gconf_valid_keyname('nyan nyan') False >>> gconf_valid_keyname('nyannyan[') False >>> gconf_valid_keyname('nyan\tnyan') False """ return not any(c in _invalid_keyname_chars or ord(c) > 127 for c in kn) class InvalidTableName(Exception): """ Raised when an invalid table name is given """ def __init__(self, name): self.table_name = name def __str__(self): return 'Value of NAME attribute (%s) cannot contain any of %r and must be all ascii' % (self.table_name, _invalid_keyname_chars) # we use OptionParser to parse the cmd arguments :) usage = "usage: %prog [options]" opt_parser = OptionParser(usage=usage) opt_parser.add_option( '-n', '--name', action = 'store', dest='name',default = '', help = "specifies the file name for the binary database for the IME. The default is '%default'. If the file name of the database is not specified, the file name of the source file before the first '.' will be appended with '.db' and that will be used as the file name of the database.") opt_parser.add_option( '-s', '--source', action = 'store', dest='source', default = '', help = "specifies the file which contains the source of the IME. The default is '%default'.") opt_parser.add_option( '-e', '--extra', action = 'store', dest='extra', default = '', help = "specifies the file name for the extra words for the IME. The default is '%default'.") opt_parser.add_option( '-p', '--pinyin', action = 'store', dest='pinyin', default = '/usr/share/ibus-table/data/pinyin_table.txt.bz2', help = "specifies the source file for the pinyin. The default is '%default'.") opt_parser.add_option( '-o', '--no-create-index', action = 'store_false', dest='index', default = True, help = 'Do not create an index for a database (Only for distrubution purposes, a normal user should not use this flag!)') opt_parser.add_option( '-i', '--create-index-only', action = 'store_true', dest='only_index', default = False, help = 'Only create an index for an existing database. Specifying the file name of the binary database with the -n or --name option is required when this option is used.') opt_parser.add_option( '-d', '--debug', action = 'store_true', dest='debug', default = False, help = 'Print extra debug messages.') opts,args = opt_parser.parse_args() if opts.only_index: if not opts.name: opt_parser.print_help() print('\nPlease specify the file name of the database you want to create an index on!') sys.exit(2) if not os.path.exists(opts.name) or not os.path.isfile(opts.name): opt_parser.print_help() print("\nThe database file '%s' does not exist." %opts.name) sys.exit(2) if not opts.name and opts.source: opts.name = os.path.basename(opts.source).split('.')[0] + '.db' if not opts.name: opt_parser.print_help() print('\nYou need to specify the file which contains the source of the IME!') sys.exit(2) def main (): def debug_print ( message ): if opts.debug: print(message) if not opts.only_index: try: os.unlink (opts.name) except: pass debug_print ("Processing Database") db = tabsqlitedb.tabsqlitedb(filename = opts.name, user_db = None, create_database = True) def parse_source (f): _attri = [] _table = [] _gouci = [] patt_com = re.compile(r'^###.*') patt_blank = re.compile(r'^[ \t]*$') patt_conf = re.compile(r'[^\t]*=[^\t]*') patt_table = re.compile(r'([^\t]+)\t([^\t]+)\t([^t]+)(\t.*)?$') patt_gouci = re.compile(r' *[^\s]+ *\t *[^\s]+ *$') for l in f: if ( not patt_com.match(l) ) and ( not patt_blank.match(l) ): for _patt, _list in ( (patt_table,_table),(patt_gouci,_gouci),(patt_conf,_attri) ): if _patt.match(l): _list.append(l) break if not _gouci: # The user didn’t provide goucima (goucima = 構詞碼 = # “word formation keys”) in the table source, so we use # the longest encoding for a single character as the # goucima for that character. # # Example: # # wubi-jidian86.txt contains: # # a 工 99454797 # aaa 工 551000000 # aaaa 工 551000000 # aaad 工期 5350000 # ... and more matches for compounds containing 工 # # The longest key sequence to type 工 as a single # character is “aaaa”. Therefore, the goucima of 工 is # “aaaa” (There is one other character with the same goucima # in wubi-jidian86.txt, 㠭 also has the goucima “aaaa”). gouci_dict = {} for line in _table: res = patt_table.match(line) if res and len(res.group(2)) == 1: if res.group(2) in gouci_dict: if len(res.group(1)) > len(gouci_dict[res.group(2)]): gouci_dict[res.group(2)] = res.group(1) else: gouci_dict[res.group(2)] = res.group(1) for key in gouci_dict: _gouci.append('%s\t%s' %(key,gouci_dict[key] ) ) _gouci.sort() return (_attri, _table, _gouci) def parse_pinyin (f): _pinyins = [] patt_com = re.compile(r'^#.*') patt_blank = re.compile(r'^[ \t]*$') patt_py = re.compile(r'(.*)\t(.*)\t(.*)') patt_yin = re.compile(r'[a-z]+[1-5]') for l in f: if type(l) != type(u''): l = l.decode('utf-8') if ( not patt_com.match(l) ) and ( not patt_blank.match(l) ): res = patt_py.match(l) if res: yins = patt_yin.findall(res.group(2)) for yin in yins: _pinyins.append("%s\t%s\t%s" \ % (res.group(1), yin, res.group(3))) return _pinyins[:] def parse_extra (f): _extra = [] patt_com = re.compile(r'^###.*') patt_blank = re.compile(r'^[ \t]*$') patt_extra = re.compile(r'(.*)\t(.*)') for l in f: if ( not patt_com.match(l) ) and ( not patt_blank.match(l) ): if patt_extra.match(l): _extra.append(l) return _extra def pinyin_parser (f): for py in f: if type(py) != type(u''): py = py.decode('utf-8') _zi, _pinyin, _freq = py.strip().split() yield (_pinyin, _zi, _freq) def phrase_parser (f): list=[] for l in f: if type(l) != type(u''): l = l.decode('utf-8') xingma, phrase, freq = l.strip().split('\t')[:3] if phrase == 'NOSYMBOL': phrase = u'' list.append ( (xingma, phrase, int(freq), 0) ) return list def goucima_parser (f): for l in f: if type(l) != type(u''): l = l.decode('utf-8') zi,gcm = l.strip().split() yield (zi, gcm) def attribute_parser (f): for l in f: if type(l) != type(u''): l = l.decode('utf-8') try: attr,val = l.strip().split('=') except: attr,val = l.strip().split('==') attr = attr.strip().lower() val = val.strip() yield (attr,val) def extra_parser (f): list = [] for l in f: if type(l) != type(u''): l = l.decode('utf-8') phrase, freq = l.strip().split () _tabkey = db.parse_phrase(phrase) if _tabkey: list.append((_tabkey,phrase,freq,0)) else: print('No tabkeys found for “%s”, not adding.\n' %phrase) return list def get_char_prompts(f): ''' Returns something like ("char_prompts", "{'a': '日', 'b': '日', 'c': '金', ...}") i.e. the attribute name "char_prompts" and as its value the string representation of a Python dictionary. ''' char_prompts = {} start = False for l in f: if type(l) != type(u''): l = l.decode('utf-8') if re.match(r'^BEGIN_CHAR_PROMPTS_DEFINITION', l): start = True continue if not start: continue if re.match(r'^END_CHAR_PROMPTS_DEFINITION', l): break match = re.search(r'^(?P[^\s]+)[\s]+(?P[^\s]+)', l) if match: char_prompts[match.group('char')] = match.group('prompt') return ("char_prompts", repr(char_prompts)) if opts.only_index: debug_print ('Only create Indexes') debug_print ( "Optimizing database " ) db.optimize_database () debug_print ('Create Indexes ') db.create_indexes ('main') debug_print ('Done! :D') return 0 # now we parse the ime source file debug_print ("\tLoad sources \"%s\"" % opts.source) patt_s = re.compile( r'.*\.bz2' ) _bz2s = patt_s.match(opts.source) if _bz2s: source = bz2.BZ2File(opts.source, "r").read() else: source = open(opts.source, mode='r', encoding='UTF-8').read() source = source.replace('\r\n', '\n') source = source.split('\n') # first get config line and table line and goucima line respectively debug_print ('\tParsing table source file ') attri,table,gouci = parse_source ( source ) debug_print('\t get attribute of IME :)') attributes = list(attribute_parser(attri)) attributes.append(get_char_prompts(source)) debug_print('\t add attributes into DB ') db.update_ime( attributes ) db.create_tables('main') # second, we use generators for database generating: debug_print ('\t get phrases of IME :)') phrases = phrase_parser ( table) # now we add things into db debug_print('\t add phrases into DB ') db.add_phrases(phrases) if db.ime_properties.get('user_can_define_phrase').lower() == u'true': debug_print ('\t get goucima of IME :)') goucima = goucima_parser (gouci) debug_print ('\t add goucima into DB ') db.add_goucima ( goucima ) if db.ime_properties.get('pinyin_mode').lower() == u'true': debug_print ('\tLoad pinyin source \"%s\"' % opts.pinyin) _bz2p = patt_s.match(opts.pinyin) if _bz2p: pinyin_s = bz2.BZ2File ( opts.pinyin, "r" ) else: pinyin_s = file ( opts.pinyin, 'r' ) debug_print ('\tParsing pinyin source file ') pyline = parse_pinyin (pinyin_s) debug_print ('\tPreapring pinyin entries') pinyin = pinyin_parser (pyline) debug_print ('\t add pinyin into DB ') db.add_pinyin ( pinyin ) debug_print ("Optimizing database ") db.optimize_database () if db.ime_properties.get('user_can_define_phrase').lower() == u'true' and opts.extra: debug_print( '\tPreparing for adding extra words' ) db.create_indexes ('main') debug_print ('\tLoad extra words source \"%s\"' % opts.extra) _bz2p = patt_s.match(opts.extra) if _bz2p: extra_s = bz2.BZ2File ( opts.extra, "r" ) else: extra_s = file ( opts.extra, 'r' ) debug_print ('\tParsing extra words source file ') extraline = parse_extra (extra_s) debug_print ('\tPreparing extra words lines') extrawds = extra_parser (extraline) debug_print( '\t we have %d extra phrases from source' % len(extrawds)) # first get the entry of original phrases from # phrases-[(xingma, phrase, int(freq), 0)] orig_phrases = {} for x in phrases: orig_phrases.update({"%s\t%s"%(x[0],x[1]):x}) debug_print( '\t the len of orig_phrases is: %d' % len(orig_phrases) ) extra_phrases = {} for x in extrawds: extra_phrases.update({"%s\t%s" %(x[0],x[1]):x}) debug_print ( '\t the len of extra_phrases is: %d' % len(extra_phrases) ) # pop duplicated keys for x in extra_phrases: if x in orig_phrases: extra_phrases.pop(x) debug_print( '\t %d extra phrases will be added' % len(extra_phrases)) new_phrases = list(extra_phrases.values()) debug_print ('\tAdding extra words into DB ') db.add_phrases (new_phrases) debug_print ("Optimizing database ") db.optimize_database () if opts.index: debug_print ('Create Indexes ') db.create_indexes ('main') else: debug_print ("We don't create index on database, you should only active this function only for distribution purpose") db.drop_indexes ('main') debug_print ('Done! :D') if __name__ == "__main__": main () ibus-table-1.9.1/engine/table.py000066400000000000000000003254451241251735600165020ustar00rootroot00000000000000# -*- coding: utf-8 -*- # vim:et sts=4 sw=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # Copyright (c) 2009-2014 Caius "kaio" CHANCE # Copyright (c) 2012-2014 Mike FABIAN # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # __all__ = ( "tabengine", ) import sys import os import string from gi.repository import IBus from gi.repository import GLib #import tabsqlitedb import re from gi.repository import GObject import time import chinese_variants debug_level = int(0) from gettext import dgettext _ = lambda a : dgettext ("ibus-table", a) N_ = lambda a : a def ascii_ispunct(character): ''' Use our own function instead of ascii.ispunct() from “from curses import ascii” because the behaviour of the latter is kind of weird. In Python 3.3.2 it does for example: >>> from curses import ascii >>> ascii.ispunct('.') True >>> ascii.ispunct(u'.') True >>> ascii.ispunct('a') False >>> ascii.ispunct(u'a') False >>> >>> ascii.ispunct(u'あ') True >>> ascii.ispunct('あ') True >>> あ isn’t punctuation. ascii.ispunct() only really works in the ascii range, it returns weird results when used over the whole unicode range. Maybe we should better use unicodedata.category(), which works fine to figure out what is punctuation for all of unicode. But at the moment I am only porting from Python2 to Python3 and just want to preserve the original behaviour for the moment. ''' if character in '''!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~''': return True else: return False def variant_to_value(variant): if type(variant) != GLib.Variant: return variant type_string = variant.get_type_string() if type_string == 's': return variant.get_string() elif type_string == 'i': return variant.get_int32() elif type_string == 'b': return variant.get_boolean() elif type_string == 'as': # In the latest pygobject3 3.3.4 or later, g_variant_dup_strv # returns the allocated strv but in the previous release, # it returned the tuple of (strv, length) if type(GLib.Variant.new_strv([]).dup_strv()) == tuple: return variant.dup_strv()[0] else: return variant.dup_strv() else: print('error: unknown variant type: %s' %type_string) return variant def argb(a, r, g, b): return ((a & 0xff)<<24) + ((r & 0xff) << 16) + ((g & 0xff) << 8) + (b & 0xff) def rgb(r, g, b): return argb(255, r, g, b) __half_full_table = [ (0x0020, 0x3000, 1), (0x0021, 0xFF01, 0x5E), (0x00A2, 0xFFE0, 2), (0x00A5, 0xFFE5, 1), (0x00A6, 0xFFE4, 1), (0x00AC, 0xFFE2, 1), (0x00AF, 0xFFE3, 1), (0x20A9, 0xFFE6, 1), (0xFF61, 0x3002, 1), (0xFF62, 0x300C, 2), (0xFF64, 0x3001, 1), (0xFF65, 0x30FB, 1), (0xFF66, 0x30F2, 1), (0xFF67, 0x30A1, 1), (0xFF68, 0x30A3, 1), (0xFF69, 0x30A5, 1), (0xFF6A, 0x30A7, 1), (0xFF6B, 0x30A9, 1), (0xFF6C, 0x30E3, 1), (0xFF6D, 0x30E5, 1), (0xFF6E, 0x30E7, 1), (0xFF6F, 0x30C3, 1), (0xFF70, 0x30FC, 1), (0xFF71, 0x30A2, 1), (0xFF72, 0x30A4, 1), (0xFF73, 0x30A6, 1), (0xFF74, 0x30A8, 1), (0xFF75, 0x30AA, 2), (0xFF77, 0x30AD, 1), (0xFF78, 0x30AF, 1), (0xFF79, 0x30B1, 1), (0xFF7A, 0x30B3, 1), (0xFF7B, 0x30B5, 1), (0xFF7C, 0x30B7, 1), (0xFF7D, 0x30B9, 1), (0xFF7E, 0x30BB, 1), (0xFF7F, 0x30BD, 1), (0xFF80, 0x30BF, 1), (0xFF81, 0x30C1, 1), (0xFF82, 0x30C4, 1), (0xFF83, 0x30C6, 1), (0xFF84, 0x30C8, 1), (0xFF85, 0x30CA, 6), (0xFF8B, 0x30D2, 1), (0xFF8C, 0x30D5, 1), (0xFF8D, 0x30D8, 1), (0xFF8E, 0x30DB, 1), (0xFF8F, 0x30DE, 5), (0xFF94, 0x30E4, 1), (0xFF95, 0x30E6, 1), (0xFF96, 0x30E8, 6), (0xFF9C, 0x30EF, 1), (0xFF9D, 0x30F3, 1), (0xFFA0, 0x3164, 1), (0xFFA1, 0x3131, 30), (0xFFC2, 0x314F, 6), (0xFFCA, 0x3155, 6), (0xFFD2, 0x315B, 9), (0xFFE9, 0x2190, 4), (0xFFED, 0x25A0, 1), (0xFFEE, 0x25CB, 1)] def unichar_half_to_full(c): code = ord(c) for half, full, size in __half_full_table: if code >= half and code < half + size: if sys.version_info >= (3,0,0): return chr(full + code - half) else: return unichr(full + code - half) return c def unichar_full_to_half(c): code = ord(c) for half, full, size in __half_full_table: if code >= full and code < full + size: if sys.version_info >= (3,0,0): return chr(half + code - full) else: return unichr(half + code - full) return c SAVE_USER_COUNT_MAX = 16 SAVE_USER_TIMEOUT = 30 # in seconds class KeyEvent: def __init__(self, keyval, is_press, state): self.code = keyval self.mask = state if not is_press: self.mask |= IBus.ModifierType.RELEASE_MASK def __str__(self): return "%s 0x%08x" % (IBus.keyval_name(self.code), self.mask) class editor(object): '''Hold user inputs chars and preedit string''' def __init__ (self, config, valid_input_chars, pinyin_valid_input_chars, single_wildcard_char, multi_wildcard_char, auto_wildcard, full_width_letter, full_width_punct, max_key_length, database): self.db = database self._config = config engine_name = os.path.basename(self.db.filename).replace('.db', '') self._config_section = "engine/Table/%s" %engine_name.replace(' ','_') self._max_key_length = int(max_key_length) self._max_key_length_pinyin = 7 self._valid_input_chars = valid_input_chars self._pinyin_valid_input_chars = pinyin_valid_input_chars self._single_wildcard_char = single_wildcard_char self._multi_wildcard_char = multi_wildcard_char self._auto_wildcard = auto_wildcard self._full_width_letter = full_width_letter self._full_width_punct = full_width_punct # # The values below will be reset in self.clear_input_not_committed_to_preedit() self._chars_valid = u'' # valid user input in table mode self._chars_invalid = u'' # invalid user input in table mode self._chars_valid_update_candidates_last = u'' self._chars_invalid_update_candidates_last = u'' # self._candidates holds the “best” candidates matching the user input # [(tabkeys, phrase, freq, user_freq), ...] self._candidates = [] self._candidates_previous = [] # self._u_chars: holds the user input of the phrases which # have been automatically committed to preedit (but not yet # “really” committed). self._u_chars = [] # self._strings: holds the phrases which have been # automatically committed to preedit (but not yet “really” # committed). # # self._u_chars and self._strings should always have the same # length, if I understand it correctly. # # Example when using the wubi-jidian86 table: # # self._u_chars = ['gaaa', 'gggg', 'ihty'] # self._strings = ['形式', '王', '小'] # # I.e. after typing 'gaaa', '形式' is in the preedit and # both self._u_chars and self._strings are empty. When typing # another 'g', the maximum key length of the wubi table (which is 4) # is exceeded and '形式' is automatically committed to the preedit # (but not yet “really” committed, i.e. not yet committed into # the application). The key 'gaaa' and the matching phrase '形式' # are stored in self._u_chars and self._strings respectively # and 'gaaa' is removed from self._chars_valid. Now self._chars_valid # contains only the 'g' which starts a new search for candidates ... # When removing the 'g' with backspace, the 'gaaa' is moved # back from self._u_chars into self._chars_valid again and # the same candidate list is shown as before the last 'g' had # been entered. self._strings = [] # self._cursor_precommit: The cursor # position inthe array of strings which have already been # committed to preëdit but not yet “really” committed. self._cursor_precommit = 0 self._prompt_characters = eval(self.db.ime_properties.get('char_prompts')) select_keys_csv = variant_to_value(self._config.get_value( self._config_section, "LookupTableSelectKeys")) if select_keys_csv == None: select_keys_csv = self.db.get_select_keys() if select_keys_csv == None: select_keys_csv = '1,2,3,4,5,6,7,8,9' self._select_keys = [ IBus.keyval_from_name(y) for y in [x.strip() for x in select_keys_csv.split(",")]] self._page_size = variant_to_value(self._config.get_value( self._config_section, "lookuptablepagesize")) if self._page_size == None or self._page_size > len(self._select_keys): self._page_size = len(self._select_keys) self._orientation = variant_to_value(self._config.get_value( self._config_section, "LookupTableOrientation")) if self._orientation == None: self._orientation = self.db.get_orientation() self._lookup_table = self.get_new_lookup_table( page_size = self._page_size, select_keys = self._select_keys, orientation = self._orientation) # self._py_mode: whether in pinyin mode self._py_mode = False # self._onechar: whether we only select single character self._onechar = variant_to_value(self._config.get_value( self._config_section, "OneChar")) if self._onechar == None: self._onechar = False # self._chinese_mode: the candidate filter mode, # 0 means to show simplified Chinese only # 1 means to show traditional Chinese only # 2 means to show all characters but show simplified Chinese first # 3 means to show all characters but show traditional Chinese first # 4 means to show all characters # we use LC_CTYPE or LANG to determine which one to use if # no default comes from the config. self._chinese_mode = variant_to_value(self._config.get_value( self._config_section, "ChineseMode")) if self._chinese_mode == None: self._chinese_mode = self.get_chinese_mode() # If auto select is true, then the first candidate phrase will # be selected automatically during typing. Auto select is true # by default for the stroke5 table for example. self._auto_select = variant_to_value(self._config.get_value( self._config_section, "AutoSelect")) if self._auto_select == None: if self.db.ime_properties.get('auto_select') != None: self._auto_select = self.db.ime_properties.get('auto_select').lower() == u'true' else: self._auto_select = False def get_new_lookup_table(self, page_size=10, select_keys=[49, 50, 51, 52, 53, 54, 55, 56, 57, 48], orientation=True): ''' [49, 50, 51, 52, 53, 54, 55, 56, 57, 48] are the key codes for the characters ['1', '2', '3', '4', '5', '6', '7', '8', '0'] ''' if page_size < 1: page_size = 1 if page_size > len(select_keys): page_size = len(select_keys) lookup_table = IBus.LookupTable.new( page_size=page_size, cursor_pos=0, cursor_visible=True, round=True) for keycode in select_keys: lookup_table.append_label( IBus.Text.new_from_string("%s." %IBus.keyval_name(keycode))) lookup_table.set_orientation(orientation) return lookup_table def get_select_keys(self): """ Returns the list of key codes for the select keys. For example, if the select keys are ["1", "2", ...] the key codes are [49, 50, ...]. If the select keys are ["F1", "F2", ...] the key codes are [65470, 65471, ...] """ return self._select_keys def get_chinese_mode (self): '''Use db value or LC_CTYPE in your box to determine the _chinese_mode''' # use db value, if applicable __db_chinese_mode = self.db.get_chinese_mode() if __db_chinese_mode >= 0: return __db_chinese_mode # otherwise try: if 'LC_ALL' in os.environ: __lc = os.environ['LC_ALL'].split('.')[0].lower() elif 'LC_CTYPE' in os.environ: __lc = os.environ['LC_CTYPE'].split('.')[0].lower() else: __lc = os.environ['LANG'].split('.')[0].lower() if '_cn' in __lc or '_sg' in __lc: # CN and SG should prefer traditional Chinese by default return 2 # show simplified Chinese first elif '_hk' in __lc or '_tw' in __lc or '_mo' in __lc: # HK, TW, and MO should prefer traditional Chinese by default return 3 # show traditional Chinese first else: if self.db._is_chinese: # This table is used for Chinese, but we don’t # know for which variant. Therefore, better show # all Chinese characters and don’t prefer any # variant: return 4 # show all Chinese characters else: return -1 except: import traceback traceback.print_exc() return -1 def clear_all_input_and_preedit(self): ''' Clear all input, whether committed to preëdit or not. ''' self.clear_input_not_committed_to_preedit() self._u_chars = [] self._strings = [] self._cursor_precommit = 0 self.update_candidates() def is_empty(self): return u'' == self._chars_valid + self._chars_invalid def clear_input_not_committed_to_preedit(self): ''' Clear the input which has not yet been committed to preëdit. ''' self._chars_valid = u'' self._chars_invalid = u'' self._chars_valid_update_candidates_last = u'' self._chars_invalid_update_candidates_last = u'' self._lookup_table.clear() self._lookup_table.set_cursor_visible(True) self._candidates = [] self._candidates_previous = [] def add_input(self,c): ''' Add input character and update candidates. Returns “True” if candidates were found, “False” if not. ''' if (self._chars_invalid or (not self._py_mode and (c not in self._valid_input_chars + self._single_wildcard_char + self._multi_wildcard_char)) or (self._py_mode and (c not in self._pinyin_valid_input_chars + self._single_wildcard_char + self._multi_wildcard_char))): self._chars_invalid += c else: self._chars_valid += c res = self.update_candidates() return res def pop_input(self): '''remove and display last input char held''' _c ='' if self._chars_invalid: _c = self._chars_invalid[-1] self._chars_invalid = self._chars_invalid[:-1] elif self._chars_valid: _c = self._chars_valid[-1] self._chars_valid = self._chars_valid[:-1] if (not self._chars_valid) and self._u_chars: self._chars_valid = self._u_chars.pop(self._cursor_precommit - 1) self._strings.pop(self._cursor_precommit - 1) self._cursor_precommit -= 1 self.update_candidates () return _c def get_input_chars (self): '''get characters held, valid and invalid''' return self._chars_valid + self._chars_invalid def split_strings_committed_to_preedit(self, index, index_in_phrase): head = self._strings[index][:index_in_phrase] tail = self._strings[index][index_in_phrase:] self._u_chars.pop(index) self._strings.pop(index) self._u_chars.insert(index, self.db.parse_phrase(head)) self._strings.insert(index, head) self._u_chars.insert(index+1, self.db.parse_phrase(tail)) self._strings.insert(index+1, tail) def remove_preedit_before_cursor(self): '''Remove preëdit left of cursor''' if self._chars_invalid: return if self.get_input_chars(): self.commit_to_preedit() if not self._strings: return if self._cursor_precommit <= 0: return self._u_chars = self._u_chars[self._cursor_precommit:] self._strings = self._strings[self._cursor_precommit:] self._cursor_precommit = 0 def remove_preedit_after_cursor(self): '''Remove preëdit right of cursor''' if self._chars_invalid: return if self.get_input_chars(): self.commit_to_preedit() if not self._strings: return if self._cursor_precommit >= len(self._strings): return self._u_chars = self._u_chars[:self._cursor_precommit] self._strings = self._strings[:self._cursor_precommit] self._cursor_precommit = len(self._strings) def remove_preedit_character_before_cursor(self): '''Remove character before cursor in strings comitted to preëdit''' if self._chars_invalid: return if self.get_input_chars(): self.commit_to_preedit() if not self._strings: return if self._cursor_precommit < 1: return self._cursor_precommit -= 1 self._chars_valid = self._u_chars.pop(self._cursor_precommit) self._strings.pop(self._cursor_precommit) self.update_candidates() def remove_preedit_character_after_cursor (self): '''Remove character after cursor in strings committed to preëdit''' if self._chars_invalid: return if self.get_input_chars(): self.commit_to_preedit() if not self._strings: return if self._cursor_precommit > len(self._strings) - 1: return self._u_chars.pop(self._cursor_precommit) self._strings.pop(self._cursor_precommit) def get_preedit_tabkeys_parts(self): '''Returns the tabkeys which were used to type the parts of the preëdit string. Such as “(left_of_current_edit, current_edit, right_of_current_edit)” “left_of_current_edit” and “right_of_current_edit” are strings of tabkeys which have been typed to get the phrases which have already been committed to preëdit, but not “really” committed yet. “current_edit” is the string of tabkeys of the part of the preëdit string which is not committed at all. For example, the return value could look like: (('gggg', 'aahw'), 'adwu', ('ijgl', 'jbus')) See also get_preedit_string_parts() which might return something like (('王', '工具'), '其', ('漫画', '最新')) when the wubi-jidian86 table is used. ''' left_of_current_edit = () current_edit = u'' right_of_current_edit = () if self.get_input_chars(): current_edit = self.get_input_chars() if self._u_chars: left_of_current_edit = tuple(self._u_chars[:self._cursor_precommit]) right_of_current_edit = tuple(self._u_chars[self._cursor_precommit:]) return (left_of_current_edit, current_edit, right_of_current_edit) def get_preedit_tabkeys_complete(self): '''Returns the tabkeys which belong to the parts of the preëdit string as a single string''' (left_tabkeys, current_tabkeys, right_tabkeys) = self.get_preedit_tabkeys_parts() return u''.join(left_tabkeys) + current_tabkeys + u''.join(right_tabkeys) def get_preedit_string_parts(self): '''Returns the phrases which are parts of the preëdit string. Such as “(left_of_current_edit, current_edit, right_of_current_edit)” “left_of_current_edit” and “right_of_current_edit” are tuples of strings which have already been committed to preëdit, but not “really” committed yet. “current_edit” is the phrase in the part of the preëdit string which is not yet committed at all. For example, the return value could look like: (('王', '工具'), '其', ('漫画', '最新')) See also get_preedit_tabkeys_parts() which might return something like (('gggg', 'aahw'), 'adwu', ('ijgl', 'jbus')) when the wubi-jidian86 table is used. ''' left_of_current_edit = () current_edit = u'' right_of_current_edit = () if self._candidates: current_edit = self._candidates[ int(self._lookup_table.get_cursor_pos())][1] elif self.get_input_chars(): current_edit = self.get_input_chars() if self._strings: left_of_current_edit = tuple(self._strings[:self._cursor_precommit]) right_of_current_edit = tuple(self._strings[self._cursor_precommit:]) return (left_of_current_edit, current_edit, right_of_current_edit) def get_preedit_string_complete(self): '''Returns the phrases which are parts of the preëdit string as a single string''' (left_strings, current_string, right_strings) = self.get_preedit_string_parts() return u''.join(left_strings) + current_string + u''.join(right_strings) def get_caret (self): '''Get caret position in preëdit string''' caret = 0 if self._cursor_precommit and self._strings: for x in self._strings[:self._cursor_precommit]: caret += len(x) if self._candidates: caret += len( self._candidates[int(self._lookup_table.get_cursor_pos())][1]) else: caret += len(self.get_input_chars()) return caret def arrow_left(self): '''Move cursor left in the preëdit string.''' if self._chars_invalid: return if self.get_input_chars(): self.commit_to_preedit() if not self._strings: return if self._cursor_precommit <= 0: return if len(self._strings[self._cursor_precommit-1]) <= 1: self._cursor_precommit -= 1 else: self.split_strings_committed_to_preedit(self._cursor_precommit-1, -1) self.update_candidates() def arrow_right(self): '''Move cursor right in the preëdit string.''' if self._chars_invalid: return if self.get_input_chars(): self.commit_to_preedit() if not self._strings: return if self._cursor_precommit >= len(self._strings): return self._cursor_precommit += 1 if len(self._strings[self._cursor_precommit-1]) > 1: self.split_strings_committed_to_preedit(self._cursor_precommit-1, 1) self.update_candidates() def control_arrow_left(self): '''Move cursor to the beginning of the preëdit string.''' if self._chars_invalid: return if self.get_input_chars(): self.commit_to_preedit() if not self._strings: return self._cursor_precommit = 0 self.update_candidates () def control_arrow_right(self): '''Move cursor to the end of the preëdit string''' if self._chars_invalid: return if self.get_input_chars(): self.commit_to_preedit() if not self._strings: return self._cursor_precommit = len(self._strings) self.update_candidates () def append_candidate_to_lookup_table(self, tabkeys=u'', phrase=u'', freq=0, user_freq=0): '''append candidate to lookup_table''' if not tabkeys or not phrase: return regexp = self._chars_valid if self._multi_wildcard_char: regexp = regexp.replace( self._multi_wildcard_char, '_multi_wildchard_char_') if self._single_wildcard_char: regexp = regexp.replace( self._single_wildcard_char, '_single_wildchard_char_') regexp = re.escape(regexp) regexp = regexp.replace('_multi_wildchard_char_', '.*') regexp = regexp.replace('_single_wildchard_char_', '.?') match = re.match(r'^'+regexp, tabkeys) if match: remaining_tabkeys = tabkeys[match.end():] else: # This should never happen! For the candidates # added to the lookup table here, a match has # been found for self._chars_valid in the database. # In that case, the above regular expression should # match as well. remaining_tabkeys = tabkeys if self.db._is_chinese and self._py_mode: # restore tune symbol remaining_tabkeys = remaining_tabkeys.replace('!','↑1').replace('@','↑2').replace('#','↑3').replace('$','↑4').replace('%','↑5') if not self._py_mode: remaining_tabkeys_new = u'' for char in remaining_tabkeys: if char in self._prompt_characters: remaining_tabkeys_new += self._prompt_characters[char] else: remaining_tabkeys_new += char remaining_tabkeys = remaining_tabkeys_new candidate_text = phrase + u' ' + remaining_tabkeys attrs = IBus.AttrList () attrs.append(IBus.attr_foreground_new( rgb(0x19,0x73,0xa2), 0, len(candidate_text))) if not self._py_mode and freq < 0: # this is a user defined phrase: attrs.append(IBus.attr_foreground_new(rgb(0x77,0x00,0xc3), 0, len(phrase))) elif not self._py_mode and user_freq > 0: # this is a system phrase which has already been used by the user: attrs.append(IBus.attr_foreground_new(rgb(0x00,0x00,0x00), 0, len(phrase))) else: # this is a system phrase that has not been used yet: attrs.append(IBus.attr_foreground_new(rgb(0x00,0x00,0x00), 0, len(phrase))) if debug_level > 0: debug_text = u' ' + str(freq) + u' ' + str(user_freq) candidate_text += debug_text attrs.append(IBus.attr_foreground_new( rgb(0x00,0xff,0x00), len(candidate_text) - len(debug_text), len(candidate_text))) text = IBus.Text.new_from_string(candidate_text) i = 0 while attrs.get(i) != None: attr = attrs.get(i) text.append_attribute(attr.get_attr_type(), attr.get_value(), attr.get_start_index(), attr.get_end_index()) i += 1 self._lookup_table.append_candidate (text) self._lookup_table.set_cursor_visible(True) def update_candidates (self): ''' Searches for candidates and updates the lookuptable. Returns “True” if candidates were found and “False” if not. ''' if (self._chars_valid == self._chars_valid_update_candidates_last and self._chars_invalid == self._chars_invalid_update_candidates_last): # The input did not change since we came here last, do nothing and leave # candidates and lookup table unchanged: if self._candidates: return True else: return False self._chars_valid_update_candidates_last = self._chars_valid self._chars_invalid_update_candidates_last = self._chars_invalid self._lookup_table.clear() self._lookup_table.set_cursor_visible(True) if self._chars_invalid or not self._chars_valid: self._candidates = [] self._candidates_previous = self._candidates return False if self._py_mode and self.db._is_chinese: self._candidates = self.db.select_chinese_characters_by_pinyin( tabkeys=self._chars_valid, chinese_mode=self._chinese_mode, single_wildcard_char=self._single_wildcard_char, multi_wildcard_char=self._multi_wildcard_char) else: self._candidates = self.db.select_words( tabkeys=self._chars_valid, onechar=self._onechar, chinese_mode=self._chinese_mode, single_wildcard_char=self._single_wildcard_char, multi_wildcard_char=self._multi_wildcard_char, auto_wildcard=self._auto_wildcard) # If only a wildcard character has been typed, insert a # special candidate at the first position for the wildcard # character itself. For example, if “?” is used as a # wildcard character and this is the only character typed, add # a candidate ('?', '?', 0, 1000000000) in halfwidth mode or a # candidate ('?', '?', 0, 1000000000) in fullwidth mode. # This is needed to make it possible to input the wildcard # characters themselves, if “?” acted only as a wildcard # it would be impossible to input a fullwidth question mark. if (self._chars_valid in [self._single_wildcard_char, self._multi_wildcard_char]): wildcard_key = self._chars_valid wildcard_phrase = self._chars_valid if ascii_ispunct(wildcard_key): if self._full_width_punct[1]: wildcard_phrase = unichar_half_to_full(wildcard_phrase) else: wildcard_phrase = unichar_full_to_half(wildcard_phrase) else: if self._full_width_letter[1]: wildcard_phrase = unichar_half_to_full(wildcard_phrase) else: wildcard_phrase = unichar_full_to_half(wildcard_phrase) self._candidates.insert( 0, (wildcard_key, wildcard_phrase, 0, 1000000000)) if self._candidates: self.fill_lookup_table() self._candidates_previous = self._candidates return True # There are only valid and no invalid input characters but no # matching candidates could be found from the databases. The # last of self._chars_valid must have caused this. That # character is valid in the sense that it is listed in # self._valid_input_chars, it is only invalid in the sense # that after adding this character, no candidates could be # found anymore. Add this character to self._chars_invalid # and remove it from self._chars_valid. self._chars_invalid += self._chars_valid[-1] self._chars_valid = self._chars_valid[:-1] self._chars_valid_update_candidates_last = self._chars_valid self._chars_invalid_update_candidates_last = self._chars_invalid return False def commit_to_preedit(self): '''Add selected phrase in lookup table to preëdit string''' if not self._chars_valid: return False if self._candidates: self._u_chars.insert(self._cursor_precommit, self._candidates[self.get_cursor_pos()][0]) self._strings.insert(self._cursor_precommit, self._candidates[self.get_cursor_pos()][1]) self._cursor_precommit += 1 self.clear_input_not_committed_to_preedit() self.update_candidates() return True def commit_to_preedit_current_page(self, index): ''' Commits the candidate at position “index” in the current page of the lookup table to the preëdit. Does not yet “really” commit the candidate, only to the preëdit. ''' cursor_pos = self._lookup_table.get_cursor_pos() cursor_in_page = self._lookup_table.get_cursor_in_page() current_page_start = cursor_pos - cursor_in_page real_index = current_page_start + index if real_index >= len(self._candidates): # the index given is out of range we do not commit anything return False self._lookup_table.set_cursor_pos(real_index) return self.commit_to_preedit() def get_aux_strings (self): '''Get aux strings''' input_chars = self.get_input_chars () if input_chars: aux_string = input_chars if debug_level > 0 and self._u_chars: (tabkeys_left, tabkeys_current, tabkeys_right) = self.get_preedit_tabkeys_parts() (strings_left, string_current, strings_right) = self.get_preedit_string_parts() aux_string = u'' for i in range(0, len(strings_left)): aux_string += u'('+tabkeys_left[i]+u' '+strings_left[i]+u') ' aux_string += input_chars for i in range(0, len(strings_right)): aux_string += u' ('+tabkeys_right[i]+u' '+strings_right[i]+u')' if self._py_mode: aux_string = aux_string.replace('!','1').replace('@','2').replace('#','3').replace('$','4').replace('%','5') else: aux_string_new = u'' for char in aux_string: if char in self._prompt_characters: aux_string_new += self._prompt_characters[char] else: aux_string_new += char aux_string = aux_string_new return aux_string # There are no input strings at the moment. But there could # be stuff committed to the preëdit. If there is something # committed to the preëdit, show some information in the # auxiliary text. # # For the character at the position of the cursor in the # preëdit, show a list of possible input key sequences which # could be used to type that character at the left side of the # auxiliary text. # # If the preëdit is longer than one character, show the input # key sequence which will be defined for the complete current # contents of the preëdit, if the preëdit is committed. aux_string = u'' if self._strings: if self._cursor_precommit >= len(self._strings): char = self._strings[-1][0] else: char = self._strings[self._cursor_precommit][0] aux_string = u' '.join(self.db.find_zi_code(char)) cstr = u''.join(self._strings) if self.db.user_can_define_phrase: if len(cstr) > 1: aux_string += (u'\t#: ' + self.db.parse_phrase(cstr)) aux_string_new = u'' for char in aux_string: if char in self._prompt_characters: aux_string_new += self._prompt_characters[char] else: aux_string_new += char return aux_string_new def fill_lookup_table(self): '''Fill more entries to self._lookup_table if needed. If the cursor in _lookup_table moved beyond current length, add more entries from _candidiate[0] to _lookup_table.''' looklen = self._lookup_table.get_number_of_candidates() psize = self._lookup_table.get_page_size() if (self._lookup_table.get_cursor_pos() + psize >= looklen and looklen < len(self._candidates)): endpos = looklen + psize batch = self._candidates[looklen:endpos] for x in batch: self.append_candidate_to_lookup_table( tabkeys=x[0], phrase=x[1], freq=x[2], user_freq=x[3]) def cursor_down(self): '''Process Arrow Down Key Event Move Lookup Table cursor down''' self.fill_lookup_table() res = self._lookup_table.cursor_down() self.update_candidates () if not res and self._candidates: return True return res def cursor_up(self): '''Process Arrow Up Key Event Move Lookup Table cursor up''' res = self._lookup_table.cursor_up() self.update_candidates () if not res and self._candidates: return True return res def page_down(self): '''Process Page Down Key Event Move Lookup Table page down''' self.fill_lookup_table() res = self._lookup_table.page_down() self.update_candidates () if not res and self._candidates: return True return res def page_up(self): '''Process Page Up Key Event move Lookup Table page up''' res = self._lookup_table.page_up() self.update_candidates () if not res and self._candidates: return True return res def select_key(self, keycode): ''' Commit a candidate which was selected by typing a selection key from the lookup table to the preedit. Does not yet “really” commit the candidate, only to the preedit. ''' if keycode not in self._select_keys: return False return self.commit_to_preedit_current_page( self._select_keys.index(keycode)) def remove_candidate_from_user_database(self, keycode): '''Remove a candidate displayed in the lookup table from the user database. The candidate indicated by the selection key with the key code “keycode” is removed, if possible. If it is not in the user database at all, nothing happens. If this is a candidate which is also in the system database, removing it from the user database only means that its user frequency data is reset. It might still appear in subsequent matches but with much lower priority. If this is a candidate which is user defined and not in the system database, it will not match at all anymore after removing it. ''' if keycode not in self._select_keys: return False index = self._select_keys.index(keycode) cursor_pos = self._lookup_table.get_cursor_pos() cursor_in_page = self._lookup_table.get_cursor_in_page() current_page_start = cursor_pos - cursor_in_page real_index = current_page_start + index if len(self._candidates) > real_index: # this index is valid candidate = self._candidates[real_index] self.db.remove_phrase(tabkeys=candidate[0], phrase=candidate[1], commit=True) # call update_candidates() to get a new SQL query. The # input has not really changed, therefore we must clear # the remembered list of characters to # force update_candidates() to really do something and not # return immediately: self._chars_valid_update_candidates_last = u'' self._chars_invalid_update_candidates_last = u'' self.update_candidates() return True else: return False def get_cursor_pos (self): '''get lookup table cursor position''' return self._lookup_table.get_cursor_pos() def get_lookup_table (self): '''Get lookup table''' return self._lookup_table def remove_char(self): '''Process remove_char Key Event''' if self.get_input_chars(): self.pop_input () return self.remove_preedit_character_before_cursor() def delete(self): '''Process delete Key Event''' if self.get_input_chars(): return self.remove_preedit_character_after_cursor() def cycle_next_cand(self): '''Cycle cursor to next candidate in the page.''' total = len(self._candidates) if total > 0: page_size = self._lookup_table.get_page_size() pos = self._lookup_table.get_cursor_pos() page = int(pos/page_size) pos += 1 if pos >= (page+1)*page_size or pos >= total: pos = page*page_size res = self._lookup_table.set_cursor_pos(pos) return True else: return False def one_candidate (self): '''Return true if there is only one candidate''' return len(self._candidates) == 1 ######################## ### Engine Class ##### #################### class tabengine (IBus.Engine): '''The IM Engine for Tables''' def __init__ (self, bus, obj_path, db ): super(tabengine,self).__init__ (connection=bus.get_connection(), object_path=obj_path) global debug_level try: debug_level = int(os.getenv('IBUS_TABLE_DEBUG_LEVEL')) except: debug_level = int(0) self._input_purpose = 0 self._has_input_purpose = False if hasattr(IBus, 'InputPurpose'): self._has_input_purpose = True self._bus = bus # this is the backend sql db we need for our IME # we receive this db from IMEngineFactory #self.db = tabsqlitedb.tabsqlitedb( name = dbname ) self.db = db self._setup_pid = 0 self._icon_dir = '%s%s%s%s' % (os.getenv('IBUS_TABLE_LOCATION'), os.path.sep, 'icons', os.path.sep) # name for config section self._engine_name = os.path.basename(self.db.filename).replace('.db', '') self._config_section = "engine/Table/%s" %self._engine_name.replace(' ','_') # config module self._config = self._bus.get_config () self._config.connect ("value-changed", self.config_value_changed_cb) # self._ime_py: Indicates whether this table supports pinyin mode self._ime_py = self.db.ime_properties.get('pinyin_mode') if self._ime_py: if self._ime_py.lower() == u'true': self._ime_py = True else: self._ime_py = False else: print('We could not find "pinyin_mode" entry in database, is it an outdated database?') self._ime_py = False self._symbol = self.db.ime_properties.get('symbol') if self._symbol == None or self._symbol == u'': self._symbol = self.db.ime_properties.get('status_prompt') if self._symbol == None: self._symbol = u'' # some Chinese tables have “STATUS_PROMPT = CN” replace it # with the shorter and nicer “中”: if self._symbol == u'CN': self._symbol = u'中' # workaround for the translit and translit-ua tables which # have 2 character symbols. '☑' + self._symbol then is # 3 characters and currently gnome-shell ignores symbols longer # than 3 characters: if self._symbol == u'Ya': self._symbol = u'Я' if self._symbol == u'Yi': self._symbol = u'Ї' # now we check and update the valid input characters self._valid_input_chars = self.db.ime_properties.get('valid_input_chars') self._pinyin_valid_input_chars = u'abcdefghijklmnopqrstuvwxyz!@#$%' self._single_wildcard_char = variant_to_value(self._config.get_value( self._config_section, "singlewildcardchar")) if self._single_wildcard_char == None: self._single_wildcard_char = self.db.ime_properties.get('single_wildcard_char') if self._single_wildcard_char == None: self._single_wildcard_char = u'' if len(self._single_wildcard_char) > 1: self._single_wildcard_char = self._single_wildcard_char[0] self._multi_wildcard_char = variant_to_value(self._config.get_value( self._config_section, "multiwildcardchar")) if self._multi_wildcard_char == None: self._multi_wildcard_char = self.db.ime_properties.get('multi_wildcard_char') if self._multi_wildcard_char == None: self._multi_wildcard_char = u'' if len(self._multi_wildcard_char) > 1: self._multi_wildcard_char = self._multi_wildcard_char[0] self._auto_wildcard = variant_to_value(self._config.get_value( self._config_section, "autowildcard")) if self._auto_wildcard == None: self._auto_wildcard = self.db.ime_properties.get('auto_wildcard') if self._auto_wildcard and self._auto_wildcard.lower() == u'false': self._auto_wildcard = False else: self._auto_wildcard = True self._max_key_length = int(self.db.ime_properties.get('max_key_length')) self._max_key_length_pinyin = 7 self._page_up_keys = [ IBus.KEY_Page_Up, IBus.KEY_KP_Page_Up, IBus.KEY_minus ] self._page_down_keys = [ IBus.KEY_Page_Down, IBus.KEY_KP_Page_Down, IBus.KEY_equal ] # If page up or page down keys are defined in the database, # use the values from the database instead of the above # hardcoded defaults: page_up_keys_csv = self.db.ime_properties.get('page_up_keys') page_down_keys_csv = self.db.ime_properties.get('page_down_keys') if page_up_keys_csv: self._page_up_keys = [ IBus.keyval_from_name(x) for x in page_up_keys_csv.split(',')] if page_down_keys_csv: self._page_down_keys = [ IBus.keyval_from_name(x) for x in page_down_keys_csv.split(',')] # Remove keys from the page up/down keys if they are needed # for input (for example, '=' or '-' could well be needed for # input. Input is more important): for character in self._valid_input_chars + self._single_wildcard_char + self._multi_wildcard_char: keyval = IBus.unicode_to_keyval(character) if keyval in self._page_up_keys: self._page_up_keys.remove(keyval) if keyval in self._page_down_keys: self._page_down_keys.remove(keyval) self._commit_keys = [IBus.KEY_space] # If commit keys are are defined in the database, use the # value from the database instead of the above hardcoded # default: commit_keys_csv = self.db.ime_properties.get('commit_keys') if commit_keys_csv: self._commit_keys = [ IBus.keyval_from_name(x) for x in commit_keys_csv.split(',')] # If commit keys conflict with page up/down keys, remove them # from the page up/down keys (They cannot really be used for # both at the same time. Theoretically, keys from the page # up/down keys could still be used to commit when the number # of candidates is 0 because then there is nothing to # page. But that would be only confusing): for keyval in self._commit_keys: if keyval in self._page_up_keys: self._page_up_keys.remove(keyval) if keyval in self._page_down_keys: self._page_down_keys.remove(keyval) # Finally, check the user setting, i.e. the config value # “spacekeybehavior” and let the user have the last word # how to use the space key: spacekeybehavior = variant_to_value(self._config.get_value( self._config_section, "spacekeybehavior")) if spacekeybehavior == True: # space is used as a page down key and not as a commit key: if IBus.KEY_space not in self._page_down_keys: self._page_down_keys.append(IBus.KEY_space) if IBus.KEY_space in self._commit_keys: self._commit_keys.remove(IBus.KEY_space) if spacekeybehavior == False: # space is used as a commit key and not used as a page down key: if IBus.KEY_space in self._page_down_keys: self._page_down_keys.remove(IBus.KEY_space) if IBus.KEY_space not in self._commit_keys: self._commit_keys.append(IBus.KEY_space) # 0 = Direct input, i.e. table input OFF (aka “English input mode”), # most characters are just passed through to the application # (but some fullwidth ↔ halfwidth conversion may be done even # in this mode, depending on the settings) # 1 = Table input ON (aka “Table input mode”, “Chinese mode”) self._input_mode = variant_to_value(self._config.get_value( self._config_section, "inputmode")) if self._input_mode == None: self._input_mode = 1 # self._prev_key: hold the key event last time. self._prev_key = None self._prev_char = None self._double_quotation_state = False self._single_quotation_state = False self._full_width_letter = [ variant_to_value(self._config.get_value( self._config_section, "EnDefFullWidthLetter")), variant_to_value(self._config.get_value( self._config_section, "TabDefFullWidthLetter")) ] if self._full_width_letter[0] == None: self._full_width_letter[0] = False if self._full_width_letter[1] == None: self._full_width_letter[1] = self.db.ime_properties.get('def_full_width_letter').lower() == u'true' self._full_width_punct = [ variant_to_value(self._config.get_value( self._config_section, "EnDefFullWidthPunct")), variant_to_value(self._config.get_value( self._config_section, "TabDefFullWidthPunct")) ] if self._full_width_punct[0] == None: self._full_width_punct[0] = False if self._full_width_punct[1] == None: self._full_width_punct[1] = self.db.ime_properties.get('def_full_width_punct').lower() == u'true' self._auto_commit = variant_to_value(self._config.get_value( self._config_section, "AutoCommit")) if self._auto_commit == None: self._auto_commit = self.db.ime_properties.get('auto_commit').lower() == u'true' # If auto select is true, then the first candidate phrase will # be selected automatically during typing. Auto select is true # by default for the stroke5 table for example. self._auto_select = variant_to_value(self._config.get_value( self._config_section, "AutoSelect")) if self._auto_select == None: if self.db.ime_properties.get('auto_select') != None: self._auto_select = self.db.ime_properties.get('auto_select').lower() == u'true' else: self._auto_select = False self._always_show_lookup = variant_to_value(self._config.get_value( self._config_section, "AlwaysShowLookup")) if self._always_show_lookup == None: if self.db.ime_properties.get('always_show_lookup') != None: self._always_show_lookup = self.db.ime_properties.get('always_show_lookup').lower() == u'true' else: self._always_show_lookup = True self._editor = editor(self._config, self._valid_input_chars, self._pinyin_valid_input_chars, self._single_wildcard_char, self._multi_wildcard_char, self._auto_wildcard, self._full_width_letter, self._full_width_punct, self._max_key_length, self.db) self.chinese_mode_properties = { 'ChineseMode.Simplified': { # show simplified Chinese only 'number': 0, 'symbol': '簡', 'icon': 'sc-mode.svg', 'label': _('Simplified Chinese'), 'tooltip': _('Switch to “Simplified Chinese only”.')}, 'ChineseMode.Traditional': { # show traditional Chinese only 'number': 1, 'symbol': '繁', 'icon': 'tc-mode.svg', 'label': _('Traditional Chinese'), 'tooltip': _('Switch to “Traditional Chinese only”.')}, 'ChineseMode.SimplifiedFirst': { # show all but simplified first 'number': 2, 'symbol': '簡/大', 'icon': 'scb-mode.svg', 'label': _('Simplified Chinese first'), 'tooltip': _('Switch to “Simplified Chinese before traditional”.')}, 'ChineseMode.TraditionalFirst': { # show all but traditional first 'number': 3, 'symbol': '繁/大', 'icon': 'tcb-mode.svg', 'label': _('Traditional Chinese first'), 'tooltip': _('Switch to “Traditional Chinese before simplified”.')}, 'ChineseMode.All': { # show all Chinese characters, no particular order 'number': 4, 'symbol': '大', 'icon': 'cb-mode.svg', 'label': _('All Chinese characters'), 'tooltip': _('Switch to “All Chinese characters”.')} } self.chinese_mode_menu = { 'key': 'ChineseMode', 'label': _('Chinese mode'), 'tooltip': _('Switch Chinese mode'), 'shortcut_hint': '(Ctrl-;)', 'sub_properties': self.chinese_mode_properties } if self.db._is_chinese: self.input_mode_properties = { 'InputMode.Direct': { 'number': 0, 'symbol': '英', 'icon': 'english.svg', 'label': _('English'), 'tooltip': _('Switch to English input')}, 'InputMode.Table': { 'number': 1, 'symbol': '中', 'symbol_table': '中', 'symbol_pinyin': '拼音', 'icon': 'chinese.svg', 'label': _('Chinese'), 'tooltip': _('Switch to Chinese input')} } else: self.input_mode_properties = { 'InputMode.Direct': { 'number': 0, 'symbol': '☐' + self._symbol, 'icon': 'english.svg', 'label': _('Direct'), 'tooltip': _('Switch to direct input')}, 'InputMode.Table': { 'number': 1, 'symbol': '☑' + self._symbol, 'icon': 'ibus-table.svg', 'label': _('Table'), 'tooltip': _('Switch to table input')} } # The symbol of the property “InputMode” is displayed # in the input method indicator of the Gnome3 panel. # This depends on the property name “InputMode” and # is case sensitive! self.input_mode_menu = { 'key': 'InputMode', 'label': _('Input mode'), 'tooltip': _('Switch Input mode'), 'shortcut_hint': '(Left Shift)', 'sub_properties': self.input_mode_properties } self.letter_width_properties = { 'LetterWidth.Half': { 'number': 0, 'symbol': '◑', 'icon': 'half-letter.svg', 'label': _('Half'), 'tooltip': _('Switch to halfwidth letters')}, 'LetterWidth.Full': { 'number': 1, 'symbol': '●', 'icon': 'full-letter.svg', 'label': _('Full'), 'tooltip': _('Switch to fullwidth letters')} } self.letter_width_menu = { 'key': 'LetterWidth', 'label': _('Letter width'), 'tooltip': _('Switch letter width'), 'shortcut_hint': '(Shift-Space)', 'sub_properties': self.letter_width_properties } self.punctuation_width_properties = { 'PunctuationWidth.Half': { 'number': 0, 'symbol': ',.', 'icon': 'half-punct.svg', 'label': _('Half'), 'tooltip': _('Switch to halfwidth punctuation')}, 'PunctuationWidth.Full': { 'number': 1, 'symbol': '、。', 'icon': 'full-punct.svg', 'label': _('Full'), 'tooltip': _('Switch to fullwidth punctuation')} } self.punctuation_width_menu = { 'key': 'PunctuationWidth', 'label': _('Punctuation width'), 'tooltip': _('Switch punctuation width'), 'shortcut_hint': '(Ctrl-.)', 'sub_properties': self.punctuation_width_properties } self.pinyin_mode_properties = { 'PinyinMode.Table': { 'number': 0, 'symbol': '☐ 拼音', 'icon': 'tab-mode.svg', 'label': _('Table'), 'tooltip': _('Switch to table mode')}, 'PinyinMode.Pinyin': { 'number': 1, 'symbol': '☑ 拼音', 'icon': 'py-mode.svg', 'label': _('Pinyin'), 'tooltip': _('Switch to pinyin mode')} } self.pinyin_mode_menu = { 'key': 'PinyinMode', 'label': _('Pinyin mode'), 'tooltip': _('Switch pinyin mode'), 'shortcut_hint': '(Right Shift)', 'sub_properties': self.pinyin_mode_properties } self.onechar_mode_properties = { 'OneCharMode.Phrase': { 'number': 0, 'symbol': '☐ 1', 'icon': 'phrase.svg', 'label': _('Multiple character match'), 'tooltip': _('Switch to matching multiple characters at once')}, 'OneCharMode.OneChar': { 'number': 1, 'symbol': '☑ 1', 'icon': 'onechar.svg', 'label': _('Single character match'), 'tooltip': _('Switch to matching only single characters')} } self.onechar_mode_menu = { 'key': 'OneCharMode', 'label': _('Onechar mode'), 'tooltip': _('Switch onechar mode'), 'shortcut_hint': '(Ctrl-,)', 'sub_properties': self.onechar_mode_properties } self.autocommit_mode_properties = { 'AutoCommitMode.Direct': { 'number': 0, 'symbol': '☐ ↑', 'icon': 'ncommit.svg', 'label': _('Normal'), 'tooltip': _('Switch to normal commit mode (automatic commits go into the preedit instead of into the application. This enables automatic definitions of new shortcuts)')}, 'AutoCommitMode.Normal': { 'number': 1, 'symbol': '☑ ↑', 'icon': 'acommit.svg', 'label': _('Direct'), 'tooltip': _('Switch to direct commit mode (automatic commits go directly into the application)')} } self.autocommit_mode_menu = { 'key': 'AutoCommitMode', 'label': _('Auto commit mode'), 'tooltip': _('Switch autocommit mode'), 'shortcut_hint': '(Ctrl-/)', 'sub_properties': self.autocommit_mode_properties } self._prop_dict = {} self._init_properties() self._on = False self._save_user_count = 0 self._save_user_start = time.time() self._save_user_count_max = SAVE_USER_COUNT_MAX self._save_user_timeout = SAVE_USER_TIMEOUT self.reset() self.sync_timeout_id = GObject.timeout_add_seconds(1, self._sync_user_db) def reset(self): self._editor.clear_all_input_and_preedit() self._double_quotation_state = False self._single_quotation_state = False self._prev_key = None self._update_ui() def do_destroy(self): if self.sync_timeout_id > 0: GObject.source_remove(self.sync_timeout_id) self.sync_timeout_id = 0 self.reset () self.do_focus_out () if self._save_user_count > 0: self.db.sync_usrdb() self._save_user_count = 0 super(tabengine,self).destroy() def set_input_mode(self, mode=0): if mode == self._input_mode: return self._input_mode = mode # Not saved to config on purpose. In the setup tool one # can select whether “Table input” or “Direct input” should # be the default when the input method starts. But when # changing this input mode using the property menu, # the change is not remembered. self._init_or_update_property_menu( self.input_mode_menu, self._input_mode) # Letter width and punctuation width depend on the input mode. # Therefore, the properties for letter width and punctuation # width need to be updated here: self._init_or_update_property_menu( self.letter_width_menu, self._full_width_letter[self._input_mode]) self._init_or_update_property_menu( self.punctuation_width_menu, self._full_width_punct[self._input_mode]) self.reset() def set_pinyin_mode(self, mode=False): if mode == self._editor._py_mode: return # The pinyin mode is never saved to config on purpose self._editor.commit_to_preedit() self._editor._py_mode = mode self._init_or_update_property_menu( self.pinyin_mode_menu, mode) if mode: self.input_mode_properties['InputMode.Table']['symbol'] = self.input_mode_properties['InputMode.Table']['symbol_pinyin'] else: self.input_mode_properties['InputMode.Table']['symbol'] = self.input_mode_properties['InputMode.Table']['symbol_table'] self._init_or_update_property_menu( self.input_mode_menu, self._input_mode) self._update_ui() def set_onechar_mode(self, mode=False): if mode == self._editor._onechar: return self._editor._onechar = mode self._init_or_update_property_menu( self.onechar_mode_menu, mode) self._config.set_value( self._config_section, "OneChar", GLib.Variant.new_boolean(mode)) def set_autocommit_mode(self, mode=False): if mode == self._auto_commit: return self._auto_commit = mode self._init_or_update_property_menu( self.autocommit_mode_menu, mode) self._config.set_value( self._config_section, "AutoCommit", GLib.Variant.new_boolean(mode)) def set_letter_width(self, mode=False, input_mode=0): if mode == self._full_width_letter[input_mode]: return self._full_width_letter[input_mode] = mode self._editor._full_width_letter[input_mode] = mode if input_mode == self._input_mode: self._init_or_update_property_menu( self.letter_width_menu, mode) if input_mode: self._config.set_value( self._config_section, "TabDefFullWidthLetter", GLib.Variant.new_boolean(mode)) else: self._config.set_value( self._config_section, "EnDefFullWidthLetter", GLib.Variant.new_boolean(mode)) def set_punctuation_width(self, mode=False, input_mode=0): if mode == self._full_width_punct[input_mode]: return self._full_width_punct[input_mode] = mode self._editor._full_width_punct[input_mode] = mode if input_mode == self._input_mode: self._init_or_update_property_menu( self.punctuation_width_menu, mode) if input_mode: self._config.set_value( self._config_section, "TabDefFullWidthPunct", GLib.Variant.new_boolean(mode)) else: self._config.set_value( self._config_section, "EnDefFullWidthPunct", GLib.Variant.new_boolean(mode)) def set_chinese_mode(self, mode=0): if mode == self._editor._chinese_mode: return self._editor._chinese_mode = mode self._init_or_update_property_menu( self.chinese_mode_menu, mode) self._config.set_value( self._config_section, "ChineseMode", GLib.Variant.new_int32(mode)) def _init_or_update_property_menu(self, menu, current_mode=0): key = menu['key'] if key in self._prop_dict: update_prop = True else: update_prop = False sub_properties = menu['sub_properties'] for prop in sub_properties: if sub_properties[prop]['number'] == int(current_mode): symbol = sub_properties[prop]['symbol'] icon = sub_properties[prop]['icon'] label = '%(label)s (%(symbol)s) %(shortcut_hint)s' %{ 'label': menu['label'], 'symbol': symbol, 'shortcut_hint': menu['shortcut_hint']} tooltip = '%(tooltip)s\n%(shortcut_hint)s' %{ 'tooltip': menu['tooltip'], 'shortcut_hint': menu['shortcut_hint']} self._prop_dict[key] = IBus.Property( key=key, prop_type=IBus.PropType.MENU, label=IBus.Text.new_from_string(label), symbol=IBus.Text.new_from_string(symbol), icon=os.path.join(self._icon_dir, icon), tooltip=IBus.Text.new_from_string(tooltip), sensitive=True, visible=True, state=IBus.PropState.UNCHECKED, sub_props=None) self._prop_dict[key].set_sub_props( self._init_sub_properties( sub_properties, current_mode=current_mode)) if update_prop: self.properties.update_property(self._prop_dict[key]) self.update_property(self._prop_dict[key]) else: self.properties.append(self._prop_dict[key]) def _init_sub_properties(self, modes, current_mode=0): sub_props = IBus.PropList() for mode in sorted(modes, key=lambda x: (modes[x]['number'])): sub_props.append(IBus.Property( key=mode, prop_type=IBus.PropType.RADIO, label=IBus.Text.new_from_string(modes[mode]['label']), icon=os.path.join(modes[mode]['icon']), tooltip=modes[mode]['tooltip'], sensitive=True, visible=True, state=IBus.PropState.UNCHECKED, sub_props=None)) i = 0 while sub_props.get(i) != None: prop = sub_props.get(i) key = prop.get_key() self._prop_dict[key] = prop if modes[key]['number'] == int(current_mode): prop.set_state(IBus.PropState.CHECKED) else: prop.set_state(IBus.PropState.UNCHECKED) self.update_property(prop) # important! i += 1 return sub_props def _init_properties(self): self._prop_dict = {} self.properties = IBus.PropList() self._init_or_update_property_menu( self.input_mode_menu, self._input_mode) if self.db._is_chinese and self._editor._chinese_mode != -1: self._init_or_update_property_menu( self.chinese_mode_menu, self._editor._chinese_mode) if self.db._is_cjk: self._init_or_update_property_menu( self.letter_width_menu, self._full_width_letter[self._input_mode]) self._init_or_update_property_menu( self.punctuation_width_menu, self._full_width_punct[self._input_mode]) if self._ime_py: self._init_or_update_property_menu( self.pinyin_mode_menu, self._editor._py_mode) if self.db._is_cjk: self._init_or_update_property_menu( self.onechar_mode_menu, self._editor._onechar) if self.db.user_can_define_phrase and self.db.rules: self._init_or_update_property_menu( self.autocommit_mode_menu, self._auto_commit) self._setup_property = IBus.Property( key = u'setup', label = _('Setup'), icon = 'gtk-preferences', tooltip = _('Configure ibus-table “%(engine-name)s”') %{ 'engine-name': self._engine_name}, sensitive = True, visible = True) self.properties.append(self._setup_property) self.register_properties(self.properties) def do_property_activate(self, property, prop_state = IBus.PropState.UNCHECKED): ''' Handle clicks on properties ''' if property == "setup": self._start_setup() return if prop_state != IBus.PropState.CHECKED: # If the mouse just hovered over a menu button and # no sub-menu entry was clicked, there is nothing to do: return if property.startswith(self.input_mode_menu['key']+'.'): self.set_input_mode( self.input_mode_properties[property]['number']) return if property.startswith(self.pinyin_mode_menu['key']+'.') and self._ime_py: self.set_pinyin_mode( bool(self.pinyin_mode_properties[property]['number'])) return if property.startswith(self.onechar_mode_menu['key']+'.') and self.db._is_cjk: self.set_onechar_mode( bool(self.onechar_mode_properties[property]['number'])) return if (property.startswith(self.autocommit_mode_menu['key']+'.') and self.db.user_can_define_phrase and self.db.rules): self.set_autocommit_mode( bool(self.autocommit_mode_properties[property]['number'])) return if property.startswith(self.letter_width_menu['key']+'.') and self.db._is_cjk: self.set_letter_width( bool(self.letter_width_properties[property]['number']), input_mode=self._input_mode) return if (property.startswith(self.punctuation_width_menu['key']+'.') and self.db._is_cjk): self.set_punctuation_width( bool(self.punctuation_width_properties[property]['number']), input_mode=self._input_mode) return if (property.startswith(self.chinese_mode_menu['key']+'.') and self.db._is_chinese and self._editor._chinese_mode != -1): self.set_chinese_mode( self.chinese_mode_properties[property]['number']) return def _start_setup(self): if self._setup_pid != 0: pid, state = os.waitpid(self._setup_pid, os.P_NOWAIT) if pid != self._setup_pid: # If the last setup tool started from here is still # running the pid returned by the above os.waitpid() # is 0. In that case just return, don’t start a # second setup tool. return self._setup_pid = 0 setup_cmd = os.path.join( os.getenv('IBUS_TABLE_LIB_LOCATION'), 'ibus-setup-table') self._setup_pid = os.spawnl( os.P_NOWAIT, setup_cmd, 'ibus-setup-table', '--engine-name table:%s' %self._engine_name) def _update_preedit(self): '''Update Preedit String in UI''' preedit_string_parts = self._editor.get_preedit_string_parts() left_of_current_edit = u''.join(preedit_string_parts[0]) current_edit = preedit_string_parts[1] right_of_current_edit = u''.join(preedit_string_parts[2]) if not self._editor._py_mode: current_edit_new = u'' for char in current_edit: if char in self._editor._prompt_characters: current_edit_new += self._editor._prompt_characters[char] else: current_edit_new += char current_edit = current_edit_new preedit_string_complete = ( left_of_current_edit + current_edit + right_of_current_edit) if not preedit_string_complete: super(tabengine, self).update_preedit_text(IBus.Text.new_from_string(u''), 0, False) return color_left = rgb(0xf9, 0x0f, 0x0f) # bright red color_right = rgb(0x1e, 0xdc, 0x1a) # light green color_invalid = rgb(0xff, 0x00, 0xff) # magenta attrs = IBus.AttrList() attrs.append( IBus.attr_foreground_new( color_left, 0, len(left_of_current_edit))) attrs.append( IBus.attr_foreground_new( color_right, len(left_of_current_edit) + len(current_edit), len(preedit_string_complete))) if self._editor._chars_invalid: attrs.append( IBus.attr_foreground_new( color_invalid, len(left_of_current_edit) + len(current_edit) - len(self._editor._chars_invalid), len(left_of_current_edit) + len(current_edit) )) attrs.append( IBus.attr_underline_new( IBus.AttrUnderline.SINGLE, 0, len(preedit_string_complete))) text = IBus.Text.new_from_string(preedit_string_complete) i = 0 while attrs.get(i) != None: attr = attrs.get(i) text.append_attribute(attr.get_attr_type(), attr.get_value(), attr.get_start_index(), attr.get_end_index()) i += 1 super(tabengine, self).update_preedit_text(text, self._editor.get_caret(), True) def _update_aux (self): '''Update Aux String in UI''' aux_string = self._editor.get_aux_strings() if len(self._editor._candidates) > 0: aux_string += u' (%d / %d)' %( self._editor._lookup_table.get_cursor_pos() +1, self._editor._lookup_table.get_number_of_candidates()) if aux_string: attrs = IBus.AttrList() attrs.append(IBus.attr_foreground_new(rgb(0x95,0x15,0xb5),0, len(aux_string))) text = IBus.Text.new_from_string(aux_string) i = 0 while attrs.get(i) != None: attr = attrs.get(i) text.append_attribute(attr.get_attr_type(), attr.get_value(), attr.get_start_index(), attr.get_end_index()) i += 1 visible = True if not aux_string or not self._always_show_lookup: visible = False super(tabengine, self).update_auxiliary_text(text, visible) else: self.hide_auxiliary_text() def _update_lookup_table (self): '''Update Lookup Table in UI''' if len(self._editor._candidates) == 0: # Also make sure to hide lookup table if there are # no candidates to display. On f17, this makes no # difference but gnome-shell in f18 will display # an empty suggestion popup if the number of candidates # is zero! self.hide_lookup_table() return if self._editor.is_empty (): self.hide_lookup_table() return if not self._always_show_lookup: self.hide_lookup_table() return self.update_lookup_table(self._editor.get_lookup_table(), True) def _update_ui (self): '''Update User Interface''' self._update_lookup_table () self._update_preedit () self._update_aux () def _check_phrase (self, tabkeys=u'', phrase=u''): """Check the given phrase and update save user db info""" if not tabkeys or not phrase: return self.db.check_phrase(tabkeys=tabkeys, phrase=phrase) if self._save_user_count <= 0: self._save_user_start = time.time() self._save_user_count += 1 def _sync_user_db(self): """Save user db to disk""" if self._save_user_count >= 0: now = time.time() time_delta = now - self._save_user_start if (self._save_user_count > self._save_user_count_max or time_delta >= self._save_user_timeout): self.db.sync_usrdb() self._save_user_count = 0 self._save_user_start = now return True def commit_string (self, phrase, tabkeys=u''): self._editor.clear_all_input_and_preedit() self._update_ui() super(tabengine,self).commit_text(IBus.Text.new_from_string(phrase)) if len(phrase) > 0: self._prev_char = phrase[-1] else: self._prev_char = None self._check_phrase(tabkeys=tabkeys, phrase=phrase) def commit_everything_unless_invalid(self): ''' Commits the current input to the preëdit and then commits the preëdit to the application unless there are invalid input characters. Returns “True” if something was committed, “False” if not. ''' if self._editor._chars_invalid: return False if not self._editor.is_empty(): self._editor.commit_to_preedit() self.commit_string(self._editor.get_preedit_string_complete(), tabkeys=self._editor.get_preedit_tabkeys_complete()) return True def _convert_to_full_width(self, c): '''Convert half width character to full width''' # This function handles punctuation that does not comply to the # Unicode convesion formula in unichar_half_to_full(c). # For ".", "\"", "'"; there are even variations under specific # cases. This function should be more abstracted by extracting # that to another handling function later on. special_punct_dict = {u"<": u"《", # 《 U+300A LEFT DOUBLE ANGLE BRACKET u">": u"》", # 》 U+300B RIGHT DOUBLE ANGLE BRACKET u"[": u"「", # 「 U+300C LEFT CORNER BRACKET u"]": u"」", # 」U+300D RIGHT CORNER BRACKET u"{": u"『", # 『 U+300E LEFT WHITE CORNER BRACKET u"}": u"』", # 』U+300F RIGHT WHITE CORNER BRACKET u"\\": u"、", # 、 U+3001 IDEOGRAPHIC COMMA u"^": u"……", # … U+2026 HORIZONTAL ELLIPSIS u"_": u"——", # — U+2014 EM DASH u"$": u"¥" # ¥ U+FFE5 FULLWIDTH YEN SIGN } # special puncts w/o further conditions if c in special_punct_dict.keys(): if c in [u"\\", u"^", u"_", u"$"]: return special_punct_dict[c] elif self._input_mode: return special_punct_dict[c] # special puncts w/ further conditions if c == u".": if self._prev_char and self._prev_char.isdigit() \ and self._prev_key and chr(self._prev_key.code) == self._prev_char: return u"." else: return u"。" # 。U+3002 IDEOGRAPHIC FULL STOP elif c == u"\"": self._double_quotation_state = not self._double_quotation_state if self._double_quotation_state: return u"“" # “ U+201C LEFT DOUBLE QUOTATION MARK else: return u"”" # ” U+201D RIGHT DOUBLE QUOTATION MARK elif c == u"'": self._single_quotation_state = not self._single_quotation_state if self._single_quotation_state: return u"‘" # ‘ U+2018 LEFT SINGLE QUOTATION MARK else: return u"’" # ’ U+2019 RIGHT SINGLE QUOTATION MARK return unichar_half_to_full(c) def _match_hotkey (self, key, code, mask): if key.code == code and key.mask == mask: if self._prev_key and key.code == self._prev_key.code and key.mask & IBus.ModifierType.RELEASE_MASK: return True if not key.mask & IBus.ModifierType.RELEASE_MASK: return True return False def do_candidate_clicked(self, index, button, state): if self._editor.commit_to_preedit_current_page(index): # commits to preëdit self.commit_string(self._editor.get_preedit_string_complete(), tabkeys=self._editor.get_preedit_tabkeys_complete()) return True return False def do_process_key_event(self, keyval, keycode, state): '''Process Key Events Key Events include Key Press and Key Release, modifier means Key Pressed ''' if self._has_input_purpose and self._input_purpose in [IBus.InputPurpose.PASSWORD, IBus.InputPurpose.PIN]: return False key = KeyEvent(keyval, state & IBus.ModifierType.RELEASE_MASK == 0, state) # ignore NumLock mask key.mask &= ~IBus.ModifierType.MOD2_MASK result = self._process_key_event (key) self._prev_key = key return result def _process_key_event (self, key): '''Internal method to process key event''' # Match mode switch hotkey if self._editor.is_empty() and (self._match_hotkey(key, IBus.KEY_Shift_L, IBus.ModifierType.SHIFT_MASK | IBus.ModifierType.RELEASE_MASK)): self.set_input_mode(int(not self._input_mode)) return True # Match full half letter mode switch hotkey if self._match_hotkey (key, IBus.KEY_space, IBus.ModifierType.SHIFT_MASK) and self.db._is_cjk: self.set_letter_width( not self._full_width_letter[self._input_mode], input_mode = self._input_mode) return True # Match full half punct mode switch hotkey if self._match_hotkey (key, IBus.KEY_period, IBus.ModifierType.CONTROL_MASK) and self.db._is_cjk: self.set_punctuation_width( not self._full_width_punct[self._input_mode], input_mode = self._input_mode) return True if self._input_mode: return self._table_mode_process_key_event (key) else: return self._english_mode_process_key_event (key) def cond_letter_translate(self, char): if self._full_width_letter[self._input_mode] and self.db._is_cjk: return self._convert_to_full_width(char) else: return char def cond_punct_translate(self, char): if self._full_width_punct[self._input_mode] and self.db._is_cjk: return self._convert_to_full_width(char) else: return char def _english_mode_process_key_event(self, key): # Ignore key release event if key.mask & IBus.ModifierType.RELEASE_MASK: return True if key.code >= 128: return False # we ignore all hotkeys here if key.mask & (IBus.ModifierType.CONTROL_MASK|IBus.ModifierType.MOD1_MASK): return False keychar = IBus.keyval_to_unicode(key.code) if type(keychar) != type(u''): keychar = keychar.decode('UTF-8') if ascii_ispunct(keychar): trans_char = self.cond_punct_translate(keychar) else: trans_char = self.cond_letter_translate(keychar) if trans_char == keychar: return False self.commit_string(trans_char) return True def _table_mode_process_key_event(self, key): if debug_level > 0: sys.stderr.write('_table_mode_process_key_event() ') sys.stderr.write('repr(key)=%(key)s\n' %{'key': key}) # We have to process the pinyin mode change key event here, # because we ignore all Release event below. if (self._ime_py and self._match_hotkey( key, IBus.KEY_Shift_R, IBus.ModifierType.SHIFT_MASK | IBus.ModifierType.RELEASE_MASK)): self.set_pinyin_mode(not self._editor._py_mode) return True # process commit to preedit if (self._match_hotkey( key, IBus.KEY_Shift_R, IBus.ModifierType.SHIFT_MASK | IBus.ModifierType.RELEASE_MASK) or self._match_hotkey( key, IBus.KEY_Shift_L, IBus.ModifierType.SHIFT_MASK | IBus.ModifierType.RELEASE_MASK)): res = self._editor.commit_to_preedit() self._update_ui() return res # Left ALT key to cycle candidates in the current page. if self._match_hotkey( key, IBus.KEY_Alt_L, IBus.ModifierType.MOD1_MASK | IBus.ModifierType.RELEASE_MASK): res = self._editor.cycle_next_cand() self._update_ui() return res # Match single char mode switch hotkey if self._match_hotkey(key, IBus.KEY_comma, IBus.ModifierType.CONTROL_MASK) and self.db._is_cjk: self.set_onechar_mode(not self._editor._onechar) return True # Match direct commit mode switch hotkey if self._match_hotkey(key, IBus.KEY_slash, IBus.ModifierType.CONTROL_MASK) and self.db.user_can_define_phrase and self.db.rules: self.set_autocommit_mode(not self._auto_commit) return True # Match Chinese mode shift if self._match_hotkey(key, IBus.KEY_semicolon, IBus.ModifierType.CONTROL_MASK) and self.db._is_chinese: self.set_chinese_mode((self._editor._chinese_mode+1) % 5) return True if key.mask & IBus.ModifierType.RELEASE_MASK: return True keychar = IBus.keyval_to_unicode(key.code) if type(keychar) != type(u''): keychar = keychar.decode('UTF-8') # Section to handle leading invalid input: # # This is the first character typed, if it is invalid # input, handle it immediately here, if it is valid, continue. if self._editor.is_empty() and not self._editor.get_preedit_string_complete(): if ((keychar not in self._valid_input_chars + self._single_wildcard_char + self._multi_wildcard_char or (self.db.startchars and keychar not in self.db.startchars)) and (not key.mask & (IBus.ModifierType.MOD1_MASK | IBus.ModifierType.CONTROL_MASK))): if debug_level > 0: sys.stderr.write('_table_mode_process_key_event() leading invalid input: ') sys.stderr.write('repr(keychar)=%(keychar)s\n' %{'keychar': keychar}) if ascii_ispunct(keychar): trans_char = self.cond_punct_translate(keychar) else: trans_char = self.cond_letter_translate(keychar) if trans_char == keychar: return False else: self.commit_string(trans_char) return True if key.code == IBus.KEY_Escape: self.reset() self._update_ui() return True if key.code in (IBus.KEY_Return, IBus.KEY_KP_Enter): if self._editor.is_empty() and not self._editor.get_preedit_string_complete(): # When IBus.KEY_Return is typed, # IBus.keyval_to_unicode(key.code) returns a non-empty # string. But when IBus.KEY_KP_Enter is typed it # returns an empty string. Therefore, when typing # IBus.KEY_KP_Enter as leading input, the key is not # handled by the section to handle leading invalid # input but it ends up here. If it is leading input # (i.e. the preëdit is empty) we should always pass # IBus.KEY_KP_Enter to the application: return False if self._auto_select: self._editor.commit_to_preedit() commit_string = self._editor.get_preedit_string_complete() self.commit_string(commit_string) return False else: commit_string = self._editor.get_preedit_tabkeys_complete() self.commit_string(commit_string) return True if key.code in (IBus.KEY_Tab, IBus.KEY_KP_Tab) and self._auto_select: # Used for example for the Russian transliteration method # “translit”, which uses “auto select”. If for example # a file with the name “шшш” exists and one types in # a bash shell: # # “ls sh” # # the “sh” is converted to “ш” and one sees # # “ls ш” # # in the shell where the “ш” is still in preëdit # because “shh” would be converted to “щ”, i.e. there # is more than one candidate and the input method is still # waiting whether one more “h” will be typed or not. But # if the next character typed is a Tab, the preëdit is # committed here and “False” is returned to pass the Tab # character through to the bash to complete the file name # to “шшш”. self._editor.commit_to_preedit() self.commit_string(self._editor.get_preedit_string_complete()) return False if key.code in (IBus.KEY_Down, IBus.KEY_KP_Down) : if not self._editor.get_preedit_string_complete(): return False res = self._editor.cursor_down() self._update_ui() return res if key.code in (IBus.KEY_Up, IBus.KEY_KP_Up): if not self._editor.get_preedit_string_complete(): return False res = self._editor.cursor_up() self._update_ui() return res if (key.code in (IBus.KEY_Left, IBus.KEY_KP_Left) and key.mask & IBus.ModifierType.CONTROL_MASK): if not self._editor.get_preedit_string_complete(): return False self._editor.control_arrow_left() self._update_ui() return True if (key.code in (IBus.KEY_Right, IBus.KEY_KP_Right) and key.mask & IBus.ModifierType.CONTROL_MASK): if not self._editor.get_preedit_string_complete(): return False self._editor.control_arrow_right() self._update_ui() return True if key.code in (IBus.KEY_Left, IBus.KEY_KP_Left): if not self._editor.get_preedit_string_complete(): return False self._editor.arrow_left() self._update_ui() return True if key.code in (IBus.KEY_Right, IBus.KEY_KP_Right): if not self._editor.get_preedit_string_complete(): return False self._editor.arrow_right() self._update_ui() return True if (key.code == IBus.KEY_BackSpace and key.mask & IBus.ModifierType.CONTROL_MASK): if not self._editor.get_preedit_string_complete(): return False self._editor.remove_preedit_before_cursor() self._update_ui() return True if key.code == IBus.KEY_BackSpace: if not self._editor.get_preedit_string_complete(): return False self._editor.remove_char() self._update_ui() return True if (key.code == IBus.KEY_Delete and key.mask & IBus.ModifierType.CONTROL_MASK): if not self._editor.get_preedit_string_complete(): return False self._editor.remove_preedit_after_cursor() self._update_ui() return True if key.code == IBus.KEY_Delete: if not self._editor.get_preedit_string_complete(): return False self._editor.delete() self._update_ui() return True if (key.code in self._editor.get_select_keys() and self._editor._candidates and key.mask & IBus.ModifierType.CONTROL_MASK): res = self._editor.select_key(key.code) self._update_ui() return res if (key.code in self._editor.get_select_keys() and self._editor._candidates and key.mask & IBus.ModifierType.MOD1_MASK): res = self._editor.remove_candidate_from_user_database(key.code) self._update_ui() return res # now we ignore all other hotkeys if key.mask & (IBus.ModifierType.CONTROL_MASK|IBus.ModifierType.MOD1_MASK): return False if key.mask & IBus.ModifierType.MOD1_MASK: return False # Section to handle valid input characters: # # All keys which could possibly conflict with the valid input # characters should be checked below this section. These are # SELECT_KEYS, PAGE_UP_KEYS, PAGE_DOWN_KEYS, and COMMIT_KEYS. # # For example, consider a table has # # SELECT_KEYS = 1,2,3,4,5,6,7,8,9,0 # # and # # VALID_INPUT_CHARS = 0123456789abcdef # # (Currently the cns11643 table has this, for example) # # Then the digit “1” could be interpreted either as an input # character or as a select key but of course not both. If the # meaning as a select key or page down key were preferred, # this would make some input impossible which probably makes # the whole input method useless. If the meaning as an input # character is preferred, this makes selection using that key # impossible. Making selection by key impossible is not nice # either, but it is not a complete show stopper as there are # still other possibilities to select, for example using the # arrow-up/arrow-down keys or click with the mouse. # # Of course one should maybe consider fixing the conflict # between the keys by using different SELECT_KEYS and/or # PAGE_UP_KEYS/PAGE_DOWN_KEYS in that table ... if (keychar and (keychar in self._valid_input_chars + self._single_wildcard_char + self._multi_wildcard_char or (self._editor._py_mode and keychar in self._pinyin_valid_input_chars + self._single_wildcard_char + self._multi_wildcard_char))): if debug_level > 0: sys.stderr.write('_table_mode_process_key_event() valid input: ') sys.stderr.write('repr(keychar)=%(keychar)s\n' %{'keychar': keychar}) if self._editor._py_mode: if ((len(self._editor._chars_valid) == self._max_key_length_pinyin) or (len(self._editor._chars_valid) > 1 and self._editor._chars_valid[-1] in '!@#$%')): if self._auto_commit: self.commit_everything_unless_invalid() else: self._editor.commit_to_preedit() else: if ((len(self._editor._chars_valid) == self._max_key_length) or (len(self._editor._chars_valid) in self.db.possible_tabkeys_lengths)): if self._auto_commit: self.commit_everything_unless_invalid() else: self._editor.commit_to_preedit() res = self._editor.add_input(keychar) if not res: if self._auto_select and self._editor._candidates_previous: # Used for example for the Russian transliteration method # “translit”, which uses “auto select”. # The “translit” table contains: # # sh ш # shh щ # # so typing “sh” matches “ш” and “щ”. The # candidate with the shortest key sequence comes # first in the lookup table, therefore “sh ш” # is shown in the preëdit (The other candidate, # “shh щ” comes second in the lookup table and # could be selected using arrow-down. But # “translit” hides the lookup table by default). # # Now, when after typing “sh” one types “s”, # the key “shs” has no match, so add_input('s') # returns “False” and we end up here. We pop the # last character “s” which caused the match to # fail, commit first of the previous candidates, # i.e. “sh ш” and feed the “s” into the # key event handler again. self._editor.pop_input() self.commit_everything_unless_invalid() return self._table_mode_process_key_event(key) self.commit_everything_unless_invalid() self._update_ui() return True else: if (self._auto_commit and self._editor.one_candidate() and (self._editor._chars_valid == self._editor._candidates[0][0])): self.commit_everything_unless_invalid() self._update_ui() return True if key.code in self._commit_keys: if self.commit_everything_unless_invalid(): if self._editor._auto_select: self.commit_string(u' ') return True if key.code in self._page_down_keys and self._editor._candidates: res = self._editor.page_down() self._update_ui() return res if key.code in self._page_up_keys and self._editor._candidates: res = self._editor.page_up() self._update_ui() return res if key.code in self._editor.get_select_keys() and self._editor._candidates: if self._editor.select_key(key.code): # commits to preëdit self.commit_string(self._editor.get_preedit_string_complete(), tabkeys=self._editor.get_preedit_tabkeys_complete()) return True # Section to handle trailing invalid input: # # If the key has still not been handled when this point is # reached, it cannot be a valid input character. Neither can # it be a select key nor a page-up/page-down key. Adding this # key to the tabkeys and search for matching candidates in the # table would thus be pointless. # # So we commit all pending input immediately and then commit # this invalid input character as well, possibly converted to # fullwidth or halfwidth. if keychar: if debug_level > 0: sys.stderr.write('_table_mode_process_key_event() trailing invalid input: ') sys.stderr.write('repr(keychar)=%(keychar)s\n' %{'keychar': keychar}) if not self._editor._candidates: self.commit_string(self._editor.get_preedit_tabkeys_complete()) else: self._editor.commit_to_preedit() self.commit_string(self._editor.get_preedit_string_complete()) if ascii_ispunct(keychar): self.commit_string(self.cond_punct_translate(keychar)) else: self.commit_string(self.cond_letter_translate(keychar)) return True # What kind of key was this?? # # keychar = IBus.keyval_to_unicode(key.code) # # returned no result. So whatever this was, we cannot handle it, # just pass it through to the application by returning “False”. return False def do_focus_in (self): if self._on: self.register_properties(self.properties) self._init_or_update_property_menu( self.input_mode_menu, self._input_mode) self._update_ui () def do_focus_out (self): if self._has_input_purpose: self._input_purpose = 0 self._editor.clear_all_input_and_preedit() def do_set_content_type(self, purpose, hints): if self._has_input_purpose: self._input_purpose = purpose def do_enable (self): self._on = True self.do_focus_in() def do_disable (self): self._on = False def do_page_up (self): if self._editor.page_up (): self._update_ui () return True return False def do_page_down (self): if self._editor.page_down (): self._update_ui () return True return False def config_section_normalize(self, section): # This function replaces _: with - in the dconf # section and converts to lower case to make # the comparison of the dconf sections work correctly. # I avoid using .lower() here because it is locale dependent, # when using .lower() this would not achieve the desired # effect of comparing the dconf sections case insentively # in some locales, it would fail for example if Turkish # locale (tr_TR.UTF-8) is set. if sys.version_info >= (3,0,0): # Python3 return re.sub(r'[_:]', r'-', section).translate( ''.maketrans( string.ascii_uppercase, string.ascii_lowercase)) else: # Python2 return re.sub(r'[_:]', r'-', section).translate( string.maketrans( string.ascii_uppercase, string.ascii_lowercase).decode('ISO-8859-1')) def config_value_changed_cb(self, config, section, name, value): if self.config_section_normalize(self._config_section) != self.config_section_normalize(section): return print("config value %(n)s for engine %(en)s changed" %{'n': name, 'en': self._engine_name}) value = variant_to_value(value) if name == u'inputmode': self.set_input_mode(value) return if name == u'autoselect': self._editor._auto_select = value self._auto_select = value return if name == u'autocommit': self.set_autocommit_mode(value) return if name == u'chinesemode': self.set_chinese_mode(value) return if name == u'endeffullwidthletter': self.set_letter_width(value, input_mode=0) return if name == u'endeffullwidthpunct': self.set_punctuation_width(value, input_mode=0) return if name == u'lookuptableorientation': self._editor._orientation = value self._editor._lookup_table.set_orientation(value) return if name == u'lookuptablepagesize': if value > len(self._editor._select_keys): value = len(self._editor._select_keys) self._config.set_value( self._config_section, 'lookuptablepagesize', GLib.Variant.new_int32(value)) if value < 1: value = 1 self._config.set_value( self._config_section, 'lookuptablepagesize', GLib.Variant.new_int32(value)) self._editor._page_size = value self._editor._lookup_table = self._editor.get_new_lookup_table( page_size = self._editor._page_size, select_keys = self._editor._select_keys, orientation = self._editor._orientation) self.reset() return if name == u'lookuptableselectkeys': self._editor.set_select_keys(value) return if name == u'onechar': self.set_onechar_mode(value) return if name == u'tabdeffullwidthletter': self.set_letter_width(value, input_mode=1) return if name == u'tabdeffullwidthpunct': self.set_punctuation_width(value, input_mode=1) return if name == u'alwaysshowlookup': self._always_show_lookup = value return if name == u'spacekeybehavior': if value == True: # space is used as a page down key and not as a commit key: if IBus.KEY_space not in self._page_down_keys: self._page_down_keys.append(IBus.KEY_space) if IBus.KEY_space in self._commit_keys: self._commit_keys.remove(IBus.KEY_space) if value == False: # space is used as a commit key and not used as a page down key: if IBus.KEY_space in self._page_down_keys: self._page_down_keys.remove(IBus.KEY_space) if IBus.KEY_space not in self._commit_keys: self._commit_keys.append(IBus.KEY_space) return if name == u'singlewildcardchar': self._single_wildcard_char = value self._editor._single_wildcard_char = value return if name == u'multiwildcardchar': self._multi_wildcard_char = value self._editor._multi_wildcard_char = value return if name == u'autowildcard': self._auto_wildcard = value self._editor._auto_wildcard = value return ibus-table-1.9.1/engine/table.xml.in.in000066400000000000000000000011261241251735600176470ustar00rootroot00000000000000 org.freedesktop.IBus.Table Table Component ${libexecdir}/ibus-engine-table --ibus @VERSION@ Yuwei Yu <acevery@gmail.com> LGPL http://code.google.com/p/ibus ibus-table ${pkgdatadir}/tables/ ibus-table-1.9.1/engine/tabsqlitedb.py000066400000000000000000001464441241251735600177110ustar00rootroot00000000000000# -*- coding: utf-8 -*- # vim:et sts=4 sw=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # Copyright (c) 2009-2014 Caius "kaio" CHANCE # Copyright (c) 2012-2014 Mike FABIAN # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # import sys if sys.version_info < (3,0,0): reload (sys) sys.setdefaultencoding('utf-8') import os import os.path as path import sqlite3 import uuid import time import re import chinese_variants database_version = '1.00' patt_r = re.compile(r'c([ea])(\d):(.*)') patt_p = re.compile(r'p(-{0,1}\d)(-{0,1}\d)') chinese_nocheck_chars=u"“”‘’《》〈〉〔〕「」『』【】〖〗()[]{}"\ u".。,、;:?!…—·ˉˇ¨々~‖∶"'`|"\ u"⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛"\ u"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯЁ"\ u"ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ"\ u"⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛"\ u"㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕"\ u"ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"\ u"⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇"\ u"€$¢£¥"\ u"¤→↑←↓↖↗↘↙"\ u"ァアィイゥウェエォオカガキギクグケゲコゴサザシジ"\ u"スズセゼソゾタダチヂッツヅテデトドナニヌネノハバパ"\ u"ヒビピフブプヘベペホボポマミムメモャヤュユョヨラ"\ u"リルレロヮワヰヱヲンヴヵヶーヽヾ"\ u"ぁあぃいぅうぇえぉおかがきぎぱくぐけげこごさざしじ"\ u"すずせぜそぞただちぢっつづてでとどなにぬねのはば"\ u"ひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらり"\ u"るれろゎわゐゑをん゛゜ゝゞ"\ u"勹灬冫艹屮辶刂匚阝廾丨虍彐卩钅冂冖宀疒肀丿攵凵犭"\ u"亻彡饣礻扌氵纟亠囗忄讠衤廴尢夂丶"\ u"āáǎàōóǒòêēéěèīíǐìǖǘǚǜüūúǔù"\ u"+-<=>±×÷∈∏∑∕√∝∞∟∠∣∥∧∨∩∪∫∮"\ u"∴∵∶∷∽≈≌≒≠≡≤≥≦≧≮≯⊕⊙⊥⊿℃°‰"\ u"♂♀§№☆★○●◎◇◆□■△▲※〓#&@\^_ ̄"\ u"абвгдежзийклмнопрстуфхцчшщъыьэюяё"\ u"ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹβγδεζηαικλμνξοπρστυφθψω"\ u"①②③④⑤⑥⑦⑧⑨⑩①②③④⑤⑥⑦⑧⑨⑩"\ u"㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩"\ u"ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄧㄨㄩ"\ u"ㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦ" class ImeProperties: def __init__(self, db=None, default_properties={}): ''' “db” is the handle of the sqlite3 database file obtained by sqlite3.connect(). ''' if not db: return None self.ime_property_cache = default_properties sqlstr = 'SELECT attr, val FROM main.ime;' try: results = db.execute(sqlstr).fetchall() except: import traceback traceback.print_exc() for result in results: self.ime_property_cache[result[0]] = result[1] def get(self, key): if key in self.ime_property_cache: return self.ime_property_cache[key] else: return None class tabsqlitedb: '''Phrase database for tables The phrases table in the database has columns with the names: “id”, “tabkeys”, “phrase”, “freq”, “user_freq” There are 2 databases, sysdb, userdb. sysdb: System database for the input method, for example something like /usr/share/ibus-table/tables/wubi-jidian86.db “user_freq” is always 0 in a system database. “freq” is some number in a system database indicating a frequency of use of that phrase relative to the other phrases in that database. user_db: Database on disk where the phrases used or defined by the user are stored. “user_freq” is a counter which counts how many times that combination of “tabkeys” and “phrase” has been used. “freq” is equal to 0 for all combinations of “tabkeys” and “phrase” where an entry for that phrase is already in the system database which starts with the same “tabkeys”. For combinations of “tabkeys” and “phrase” which do not exist at all in the system database, “freq” is equal to -1 to indidated that this is a user defined phrase. ''' def __init__(self, filename = None, user_db = None, create_database = False): self.old_phrases=[] self.filename = filename self._user_db = user_db if create_database or os.path.isfile(self.filename): self.db = sqlite3.connect(self.filename) else: print('Cannot open database file %s' %self.filename) try: self.db.execute('PRAGMA encoding = "UTF-8";') self.db.execute('PRAGMA case_sensitive_like = true;') self.db.execute('PRAGMA page_size = 4096;') # 20000 pages should be enough to cache the whole database self.db.execute('PRAGMA cache_size = 20000;') self.db.execute('PRAGMA temp_store = MEMORY;') self.db.execute('PRAGMA journal_size_limit = 1000000;') self.db.execute('PRAGMA synchronous = NORMAL;') except: import traceback traceback.print_exc() print('Error while initializing database.') # create IME property table self.db.executescript('CREATE TABLE IF NOT EXISTS main.ime (attr TEXT, val TEXT);') # Initalize missing attributes in the ime table with some # default values, they should be updated using the attributes # found in the source when creating a system database with # tabcreatedb.py self._default_ime_attributes = { 'name':'', 'name.zh_cn':'', 'name.zh_hk':'', 'name.zh_tw':'', 'author':'somebody', 'uuid':'%s' %uuid.uuid4(), 'serial_number':'%s' %time.strftime('%Y%m%d'), 'icon':'ibus-table.svg', 'license':'LGPL', 'languages':'', 'language_filter':'', 'valid_input_chars':'abcdefghijklmnopqrstuvwxyz', 'max_key_length':'4', 'commit_keys':'space', # 'forward_keys':'Return', 'select_keys':'1,2,3,4,5,6,7,8,9,0', 'page_up_keys':'Page_Up,minus', 'page_down_keys':'Page_Down,equal', 'status_prompt':'', 'def_full_width_punct':'true', 'def_full_width_letter':'false', 'user_can_define_phrase':'false', 'pinyin_mode':'false', 'dynamic_adjust':'false', 'auto_select':'false', 'auto_commit':'false', # 'no_check_chars':u'', 'description':'A IME under IBus Table', 'layout':'us', 'symbol':'', 'rules':'', 'least_commit_length':'0', 'start_chars':'', 'orientation':'true', 'always_show_lookup':'true', 'char_prompts':'{}' # we use this entry for those IME, which don't # have rules to build up phrase, but still need # auto commit to preedit } if create_database: select_sqlstr = ''' SELECT val FROM main.ime WHERE attr = :attr;''' insert_sqlstr = ''' INSERT INTO main.ime (attr, val) VALUES (:attr, :val);''' for attr in self._default_ime_attributes: sqlargs = { 'attr': attr, 'val': self._default_ime_attributes[attr] } if not self.db.execute(select_sqlstr, sqlargs).fetchall(): self.db.execute(insert_sqlstr, sqlargs) self.ime_properties = ImeProperties( db=self.db, default_properties=self._default_ime_attributes) # shared variables in this class: self._mlen = int(self.ime_properties.get("max_key_length")) self._is_chinese = self.is_chinese() self._is_cjk = self.is_cjk() self.user_can_define_phrase = self.ime_properties.get('user_can_define_phrase') if self.user_can_define_phrase: if self.user_can_define_phrase.lower() == u'true' : self.user_can_define_phrase = True else: self.user_can_define_phrase = False else: print('Could not find "user_can_define_phrase" entry from database, is it an outdated database?') self.user_can_define_phrase = False self.dynamic_adjust = self.ime_properties.get('dynamic_adjust') if self.dynamic_adjust: if self.dynamic_adjust.lower() == u'true' : self.dynamic_adjust = True else: self.dynamic_adjust = False else: print('Could not find "dynamic_adjust" entry from database, is it an outdated database?') self.dynamic_adjust = False self.rules = self.get_rules () self.possible_tabkeys_lengths = self.get_possible_tabkeys_lengths() self.startchars = self.get_start_chars () if not user_db or create_database: # No user database requested or we are # just creating the system database and # we do not need a user database for that return if user_db != ":memory:": home_path = os.getenv("HOME") tables_path = path.join(home_path, ".ibus", "tables") if not path.isdir(tables_path): os.makedirs(tables_path) user_db = path.join(tables_path, user_db) if not path.exists(user_db): sys.stderr.write("The user database %(udb)s does not exist yet.\n" %{'udb': user_db}) else: try: desc = self.get_database_desc(user_db) phrase_table_column_names = ['id', 'tabkeys', 'phrase','freq','user_freq'] if desc == None \ or desc["version"] != database_version \ or self.get_number_of_columns_of_phrase_table(user_db) != len(phrase_table_column_names): sys.stderr.write("The user database %(udb)s seems to be incompatible.\n" %{'udb': user_db}) if desc == None: sys.stderr.write("There is no version information in the database.\n") self.old_phrases = self.extract_user_phrases(user_db, old_database_version = "0.0") elif desc["version"] != database_version: sys.stderr.write("The version of the database does not match (too old or too new?).\n") sys.stderr.write("ibus-table wants version=%s\n" %database_version) sys.stderr.write("But the database actually has version=%s\n" %desc["version"]) self.old_phrases = self.extract_user_phrases(user_db, old_database_version = desc["version"]) elif self.get_number_of_columns_of_phrase_table(user_db) != len(phrase_table_column_names): sys.stderr.write("The number of columns of the database does not match.\n") sys.stderr.write("ibus-table expects %(col)s columns.\n" %{'col': len(phrase_table_column_names)}) sys.stderr.write("But the database actually has %(col)s columns.\n" %{'col': self.get_number_of_columns_of_phrase_table(user_db)}) sys.stderr.write("But the versions of the databases are identical.\n") sys.stderr.write("This should never happen!\n") self.old_phrases = None from time import strftime timestamp = strftime('-%Y-%m-%d_%H:%M:%S') sys.stderr.write("Renaming the incompatible database to \"%(name)s\".\n" %{'name': user_db+timestamp}) if os.path.exists(user_db): os.rename(user_db, user_db+timestamp) if os.path.exists(user_db+'-shm'): os.rename(user_db+'-shm', user_db+'-shm'+timestamp) if os.path.exists(user_db+'-wal'): os.rename(user_db+'-wal', user_db+'-wal'+timestamp) sys.stderr.write("Creating a new, empty database \"%(name)s\".\n" %{'name': user_db}) self.init_user_db(user_db) sys.stderr.write("If user phrases were successfully recovered from the old,\n") sys.stderr.write("incompatible database, they will be used to initialize the new database.\n") else: sys.stderr.write("Compatible database %(db)s found.\n" %{'db': user_db}) except: import traceback traceback.print_exc() # open user phrase database try: sys.stderr.write("Connect to the database %(name)s.\n" %{'name': user_db}) self.db.execute('ATTACH DATABASE "%s" AS user_db;' % user_db) self.db.execute('PRAGMA user_db.encoding = "UTF-8";') self.db.execute('PRAGMA user_db.case_sensitive_like = true;') self.db.execute('PRAGMA user_db.page_size = 4096; ') self.db.execute('PRAGMA user_db.cache_size = 20000;') self.db.execute('PRAGMA user_db.temp_store = MEMORY;') self.db.execute('PRAGMA user_db.journal_mode = WAL;') self.db.execute('PRAGMA user_db.journal_size_limit = 1000000;') self.db.execute('PRAGMA user_db.synchronous = NORMAL;') except: sys.stderr.write("Could not open the database %(name)s.\n" %{'name': user_db}) from time import strftime timestamp = strftime('-%Y-%m-%d_%H:%M:%S') sys.stderr.write("Renaming the incompatible database to \"%(name)s\".\n" %{'name': user_db+timestamp}) if os.path.exists(user_db): os.rename(user_db, user_db+timestamp) if os.path.exists(user_db+'-shm'): os.rename(user_db+'-shm', user_db+'-shm'+timestamp) if os.path.exists(user_db+'-wal'): os.rename(user_db+'-wal', user_db+'-wal'+timestamp) sys.stderr.write("Creating a new, empty database \"%(name)s\".\n" %{'name': user_db}) self.init_user_db(user_db) self.db.execute('ATTACH DATABASE "%s" AS user_db;' % user_db) self.db.execute('PRAGMA user_db.encoding = "UTF-8";') self.db.execute('PRAGMA user_db.case_sensitive_like = true;') self.db.execute('PRAGMA user_db.page_size = 4096; ') self.db.execute('PRAGMA user_db.cache_size = 20000;') self.db.execute('PRAGMA user_db.temp_store = MEMORY;') self.db.execute('PRAGMA user_db.journal_mode = WAL;') self.db.execute('PRAGMA user_db.journal_size_limit = 1000000;') self.db.execute('PRAGMA user_db.synchronous = NORMAL;') self.create_tables("user_db") if self.old_phrases: sqlargs = [] for x in self.old_phrases: sqlargs.append( {'tabkeys': x[0], 'phrase': x[1], 'freq': x[2], 'user_freq': x[3]}) sqlstr = ''' INSERT INTO user_db.phrases (tabkeys, phrase, freq, user_freq) VALUES (:tabkeys, :phrase, :freq, :user_freq) ''' try: self.db.executemany(sqlstr, sqlargs) except: import traceback traceback.print_exec() self.db.commit () self.db.execute('PRAGMA wal_checkpoint;') # try create all tables in user database self.create_indexes ("user_db",commit=False) self.generate_userdb_desc () def update_phrase (self, tabkeys=u'', phrase=u'', user_freq=0, database='user_db', commit=True): '''update phrase freqs''' if not tabkeys or not phrase: return sqlstr = ''' UPDATE %s.phrases SET user_freq = :user_freq WHERE tabkeys = :tabkeys AND phrase = :phrase ;''' %database sqlargs = {'user_freq': user_freq, 'tabkeys': tabkeys, 'phrase': phrase} try: self.db.execute(sqlstr, sqlargs) if commit: self.db.commit() except: import traceback traceback.print_exc() def sync_usrdb (self): ''' Trigger a checkpoint operation. ''' if self._user_db is None: return self.db.commit() self.db.execute('PRAGMA wal_checkpoint;') def is_chinese (self): __lang = self.ime_properties.get('languages') if __lang: __langs = __lang.split(',') for _l in __langs: if _l.lower().find('zh') != -1: return True return False def is_cjk(self): languages = self.ime_properties.get('languages') if languages: languages = languages.split(',') for language in languages: for lang in ['zh', 'ja', 'ko']: if language.strip().startswith(lang): return True return False def get_chinese_mode (self): try: __dict = {'cm0':0,'cm1':1,'cm2':2,'cm3':3,'cm4':4} __filt = self.ime_properties.get('language_filter') return __dict[__filt] except: return -1 def get_select_keys (self): ret = self.ime_properties.get("select_keys") if ret: return ret return "1,2,3,4,5,6,7,8,9,0" def get_orientation (self): try: return int(self.ime_properties.get('orientation')) except: return 1 def create_tables (self, database): '''Create tables that contain all phrase''' if database == 'main': sqlstr = ''' CREATE TABLE IF NOT EXISTS %s.goucima (zi TEXT PRIMARY KEY, goucima TEXT); ''' %database self.db.execute (sqlstr) sqlstr = ''' CREATE TABLE IF NOT EXISTS %s.pinyin (pinyin TEXT, zi TEXT, freq INTEGER); ''' %database self.db.execute(sqlstr) sqlstr = ''' CREATE TABLE IF NOT EXISTS %s.phrases (id INTEGER PRIMARY KEY, tabkeys TEXT, phrase TEXT, freq INTEGER, user_freq INTEGER); ''' % database self.db.execute (sqlstr) self.db.commit() def update_ime (self, attrs): '''Update or insert attributes in ime table, attrs is a iterable object Like [(attr,val), (attr,val), ...] This is called only by tabcreatedb.py. ''' select_sqlstr = 'SELECT val from main.ime WHERE attr = :attr' update_sqlstr = 'UPDATE main.ime SET val = :val WHERE attr = :attr;' insert_sqlstr = 'INSERT INTO main.ime (attr, val) VALUES (:attr, :val);' for attr,val in attrs: sqlargs = {'attr': attr, 'val': val} if self.db.execute(select_sqlstr, sqlargs).fetchall(): self.db.execute(update_sqlstr, sqlargs) else: self.db.execute(insert_sqlstr, sqlargs) self.db.commit() # update ime properties cache: self.ime_properties = ImeProperties( db=self.db, default_properties=self._default_ime_attributes) # The self variables used by tabcreatedb.py need to be updated now: self._mlen = int(self.ime_properties.get('max_key_length')) self._is_chinese = self.is_chinese() self.user_can_define_phrase = self.ime_properties.get('user_can_define_phrase') if self.user_can_define_phrase: if self.user_can_define_phrase.lower() == u'true' : self.user_can_define_phrase = True else: self.user_can_define_phrase = False else: print('Could not find "user_can_define_phrase" entry from database, is it a outdated database?') self.user_can_define_phrase = False self.rules = self.get_rules() def get_rules (self): '''Get phrase construct rules''' rules={} if self.user_can_define_phrase: try: _rules = self.ime_properties.get('rules') if _rules: _rules = _rules.strip().split(';') for rule in _rules: res = patt_r.match (rule) if res: cms = [] if res.group(1) == 'a': rules['above'] = int(res.group(2)) _cms = res.group(3).split('+') if len(_cms) > self._mlen: print('rule: "%s" over max key length' %rule) break for _cm in _cms: cm_res = patt_p.match(_cm) cms.append(( int(cm_res.group(1)),int(cm_res.group(2)) )) rules[int(res.group(2))]=cms else: print('not a legal rule: "%s"' %rule) except Exception: import traceback traceback.print_exc () return rules else: return "" def get_possible_tabkeys_lengths(self): '''Return a list of the possible lengths for tabkeys in this table. Example: If the table source has rules like: RULES = ce2:p11+p12+p21+p22;ce3:p11+p21+p22+p31;ca4:p11+p21+p31+p41 self._rules will be set to self._rules={2: [(1, 1), (1, 2), (2, 1), (2, 2)], 3: [(1, 1), (1, 2), (2, 1), (3, 1)], 4: [(1, 1), (2, 1), (3, 1), (-1, 1)], 'above': 4} and then this function returns “[4, 4, 4]” Or, if the table source has no RULES but LEAST_COMMIT_LENGTH=2 and MAX_KEY_LENGTH = 4, then it returns “[2, 3, 4]” I cannot find any tables which use LEAST_COMMIT_LENGTH though. ''' if self.rules: max_len = self.rules["above"] return [len(self.rules[x]) for x in range(2, max_len+1)][:] else: try: least_commit_len = int(self.ime_properties.get('least_commit_length')) except: least_commit_len = 0 if least_commit_len > 0: return list(range(least_commit_len, self._mlen + 1)) else: return [] def get_start_chars (self): '''return possible start chars of IME''' return self.ime_properties.get('start_chars') def get_no_check_chars (self): '''Get the characters which engine should not change freq''' _chars= self.ime_properties.get('no_check_chars') if type(_chars) != type(u''): _chars = _chars.decode('utf-8') return _chars def add_phrases (self, phrases, database = 'main'): '''Add many phrases to database fast. Used by tabcreatedb.py when creating the system database from scratch. “phrases” is a iterable object which looks like: [(tabkeys, phrase, freq ,user_freq), (tabkeys, phrase, freq, user_freq), ...] This function does not check whether phrases are already there. As this function is only used while creating the system database, it is not really necessary to check whether phrases are already there because the database is initially empty anyway. And the caller should take care that the “phrases” argument does not contain duplicates. ''' insert_sqlstr = ''' INSERT INTO %(database)s.phrases (tabkeys, phrase, freq, user_freq) VALUES (:tabkeys, :phrase, :freq, :user_freq); ''' %{'database': database} insert_sqlargs = [] for (tabkeys, phrase, freq, user_freq) in phrases: insert_sqlargs.append({'tabkeys': tabkeys, 'phrase': phrase, 'freq': freq, 'user_freq': user_freq}) self.db.executemany(insert_sqlstr, insert_sqlargs) self.db.commit() self.db.execute('PRAGMA wal_checkpoint;') def add_phrase(self, tabkeys=u'', phrase=u'', freq=0, user_freq=0, database='main',commit=True): '''Add phrase to database, phrase is a object of (tabkeys, phrase, freq ,user_freq) ''' if not tabkeys or not phrase: return select_sqlstr = ''' SELECT * FROM %(database)s.phrases WHERE tabkeys = :tabkeys AND phrase = :phrase; ''' %{'database': database} select_sqlargs = {'tabkeys': tabkeys, 'phrase': phrase} results = self.db.execute(select_sqlstr, select_sqlargs).fetchall() if results: # there is already such a phrase, i.e. add_phrase was called # in error, do nothing to avoid duplicate entries. return insert_sqlstr = ''' INSERT INTO %(database)s.phrases (tabkeys, phrase, freq, user_freq) VALUES (:tabkeys, :phrase, :freq, :user_freq); ''' %{'database': database} insert_sqlargs = {'tabkeys': tabkeys, 'phrase': phrase, 'freq': freq, 'user_freq': user_freq} try: self.db.execute (insert_sqlstr, insert_sqlargs) if commit: self.db.commit() except: import traceback traceback.print_exc() def add_goucima (self, goucimas): '''Add goucima into database, goucimas is iterable object Like goucimas = [(zi,goucima), (zi,goucima), ...] ''' sqlstr = ''' INSERT INTO main.goucima (zi, goucima) VALUES (:zi, :goucima); ''' sqlargs = [] for zi,goucima in goucimas: sqlargs.append({'zi': zi, 'goucima': goucima}) try: self.db.commit() self.db.executemany(sqlstr, sqlargs) self.db.commit() self.db.execute('PRAGMA wal_checkpoint;') except: import traceback traceback.print_exc() def add_pinyin (self, pinyins, database = 'main'): '''Add pinyin to database, pinyins is a iterable object Like: [(zi,pinyin, freq), (zi, pinyin, freq), ...] ''' sqlstr = ''' INSERT INTO %s.pinyin (pinyin, zi, freq) VALUES (:pinyin, :zi, :freq); ''' %database count = 0 for pinyin,zi,freq in pinyins: count += 1 pinyin = pinyin.replace('1','!').replace('2','@').replace('3','#').replace('4','$').replace('5','%') try: self.db.execute(sqlstr, {'pinyin': pinyin, 'zi': zi, 'freq': freq}) except Exception: sys.stderr.write( 'Error when inserting into pinyin table. count=%(c)s pinyin=%(p)s zi=%(z)s freq=%(f)s\n' %{'c': count, 'p': pinyin, 'z': zi, 'f': freq}) import traceback traceback.print_exc() self.db.commit() def optimize_database (self, database='main'): sqlstr = ''' CREATE TABLE tmp AS SELECT * FROM %(database)s.phrases; DELETE FROM %(database)s.phrases; INSERT INTO %(database)s.phrases SELECT * FROM tmp ORDER BY tabkeys ASC, phrase ASC, user_freq DESC, freq DESC, id ASC; DROP TABLE tmp; CREATE TABLE tmp AS SELECT * FROM %(database)s.goucima; DELETE FROM %(database)s.goucima; INSERT INTO %(database)s.goucima SELECT * FROM tmp ORDER BY zi, goucima; DROP TABLE tmp; CREATE TABLE tmp AS SELECT * FROM %(database)s.pinyin; DELETE FROM %(database)s.pinyin; INSERT INTO %(database)s.pinyin SELECT * FROM tmp ORDER BY pinyin ASC, freq DESC; DROP TABLE tmp; ''' %{'database':database} self.db.executescript (sqlstr) self.db.executescript ("VACUUM;") self.db.commit() def drop_indexes(self, database): '''Drop the indexes in the database to reduce its size We do not use any indexes at the moment, therefore this function does nothing. ''' return def create_indexes(self, database, commit=True): '''Create indexes for the database. We do not use any indexes at the moment, therefore this function does nothing. We used indexes before, but benchmarking showed that none of them was really speeding anything up, therefore we deleted all of them to get much smaller databases (about half the size). If some index turns out to be very useful in future, it could be created here (and dropped in “drop_indexes()”). ''' return def big5_code(self, phrase): try: big5 = phrase.encode('Big5') except: big5 = b'\xff\xff' # higher than any Big5 code return big5 def best_candidates(self, typed_tabkeys=u'', candidates=[], chinese_mode=-1): ''' “candidates” is an array containing something like: [(tabkeys, phrase, freq, user_freq), ...] “typed_tabkeys” is key sequence the user really typed, which maybe only the beginning part of the “tabkeys” in a matched candidate. ''' maximum_number_of_candidates = 100 engine_name = os.path.basename(self.filename).replace('.db', '') if engine_name in [ 'cangjie3', 'cangjie5', 'cangjie-big', 'quick-classic', 'quick3', 'quick5']: code_point_function = self.big5_code else: code_point_function = lambda x: (1) if chinese_mode in (2, 3) and self._is_chinese: if chinese_mode == 2: bitmask = (1 << 0) # used in simplified Chinese else: bitmask = (1 << 1) # used in traditional Chinese return sorted(candidates, key=lambda x: ( - int( typed_tabkeys == x[0] ), # exact matches first! -1*x[3], # user_freq descending # prefer characters used in the desired Chinese variant: -(bitmask & chinese_variants.detect_chinese_category(x[1])), -1*x[2], # freq descending len(x[0]), # len(tabkeys) ascending x[0], # tabkeys alphabetical code_point_function(x[1][0]), ord(x[1][0]) # Unicode codepoint of first character of phrase ))[:maximum_number_of_candidates] return sorted(candidates, key=lambda x: ( - int( typed_tabkeys == x[0] ), # exact matches first! -1*x[3], # user_freq descending -1*x[2], # freq descending len(x[0]), # len(tabkeys) ascending x[0], # tabkeys alphabetical code_point_function(x[1][0]), ord(x[1][0]) # Unicode codepoint of first character of phrase ))[:maximum_number_of_candidates] def select_words(self, tabkeys=u'', onechar=False, chinese_mode=-1, single_wildcard_char=u'', multi_wildcard_char=u'', auto_wildcard=False): ''' Get matching phrases for tabkeys from the database. ''' if not tabkeys: return [] one_char_condition = '' if onechar: # for some users really like to select only single characters one_char_condition = ' AND length(phrase)=1 ' sqlstr = ''' SELECT tabkeys, phrase, freq, user_freq FROM ( SELECT tabkeys, phrase, freq, user_freq FROM main.phrases WHERE tabkeys LIKE :tabkeys ESCAPE :escapechar %(one_char_condition)s UNION ALL SELECT tabkeys, phrase, freq, user_freq FROM user_db.phrases WHERE tabkeys LIKE :tabkeys ESCAPE :escapechar %(one_char_condition)s ) ''' % {'one_char_condition': one_char_condition} escapechar = '☺' for c in '!@#': if c not in [single_wildcard_char, multi_wildcard_char]: escapechar = c tabkeys_for_like = tabkeys tabkeys_for_like = tabkeys_for_like.replace(escapechar, escapechar+escapechar) if '%' not in [single_wildcard_char, multi_wildcard_char]: tabkeys_for_like = tabkeys_for_like.replace('%', escapechar+'%') if '_' not in [single_wildcard_char, multi_wildcard_char]: tabkeys_for_like = tabkeys_for_like.replace('_', escapechar+'_') if single_wildcard_char: tabkeys_for_like = tabkeys_for_like.replace(single_wildcard_char, '_') if multi_wildcard_char: tabkeys_for_like = tabkeys_for_like.replace(multi_wildcard_char, '%%') if auto_wildcard: tabkeys_for_like += '%%' sqlargs = {'tabkeys': tabkeys_for_like, 'escapechar': escapechar} unfiltered_results = self.db.execute(sqlstr, sqlargs).fetchall() bitmask = None if chinese_mode == 0: bitmask = (1 << 0) # simplified only elif chinese_mode == 1: bitmask = (1 << 1) # traditional only if not bitmask: results = unfiltered_results else: results = [] for result in unfiltered_results: if bitmask & chinese_variants.detect_chinese_category(result[1]): results.append(result) # merge matches from the system database and from the user # database to avoid duplicates in the candidate list for # example, if we have the result ('aaaa', '工', 551000000, 0) # from the system database and ('aaaa', '工', 0, 5) from the # user database, these should be merged into one match # ('aaaa', '工', 551000000, 5). phrase_frequencies = {} for result in results: key = (result[0], result[1]) if key not in phrase_frequencies: phrase_frequencies[key] = result else: phrase_frequencies.update([( key, key + ( max(result[2], phrase_frequencies[key][2]), max(result[3], phrase_frequencies[key][3])) )]) best = self.best_candidates( typed_tabkeys=tabkeys, candidates=phrase_frequencies.values(), chinese_mode=chinese_mode) return best def select_chinese_characters_by_pinyin(self, tabkeys=u'', chinese_mode=-1, single_wildcard_char=u'', multi_wildcard_char=u''): ''' Get Chinese characters matching the pinyin given by tabkeys from the database. ''' if not tabkeys: return [] sqlstr = ''' SELECT pinyin, zi, freq FROM main.pinyin WHERE pinyin LIKE :tabkeys ORDER BY freq DESC, pinyin ASC ;''' tabkeys_for_like = tabkeys if single_wildcard_char: tabkeys_for_like = tabkeys_for_like.replace(single_wildcard_char, '_') if multi_wildcard_char: tabkeys_for_like = tabkeys_for_like.replace(multi_wildcard_char, '%%') tabkeys_for_like += '%%' sqlargs = {'tabkeys': tabkeys_for_like} results = self.db.execute(sqlstr, sqlargs).fetchall() # now convert the results into a list of candidates in the format # which was returned before I simplified the pinyin database table. bitmask = None if chinese_mode == 0: bitmask = (1 << 0) # simplified only elif chinese_mode == 1: bitmask = (1 << 1) # traditional only phrase_frequencies = [] for (pinyin, zi, freq) in results: if not bitmask: phrase_frequencies.append(tuple([pinyin, zi, freq, 0])) else: if bitmask & chinese_variants.detect_chinese_category(zi): phrase_frequencies.append(tuple([pinyin, zi, freq, 0])) return self.best_candidates( typed_tabkeys=tabkeys, candidates=phrase_frequencies, chinese_mode=chinese_mode) def generate_userdb_desc (self): try: sqlstring = 'CREATE TABLE IF NOT EXISTS user_db.desc (name PRIMARY KEY, value);' self.db.executescript (sqlstring) sqlstring = 'INSERT OR IGNORE INTO user_db.desc VALUES (?, ?);' self.db.execute (sqlstring, ('version', database_version)) sqlstring = 'INSERT OR IGNORE INTO user_db.desc VALUES (?, DATETIME("now", "localtime"));' self.db.execute (sqlstring, ("create-time", )) self.db.commit () except: import traceback traceback.print_exc () def init_user_db(self,db_file): if not path.exists(db_file): db = sqlite3.connect(db_file) db.execute('PRAGMA encoding = "UTF-8";') db.execute('PRAGMA case_sensitive_like = true;') db.execute('PRAGMA page_size = 4096;') # 20000 pages should be enough to cache the whole database db.execute('PRAGMA cache_size = 20000;') db.execute('PRAGMA temp_store = MEMORY;') db.execute('PRAGMA journal_mode = WAL;') db.execute('PRAGMA journal_size_limit = 1000000;') db.execute('PRAGMA synchronous = NORMAL;') db.commit() def get_database_desc (self, db_file): if not path.exists (db_file): return None try: db = sqlite3.connect (db_file) desc = {} for row in db.execute ("SELECT * FROM desc;").fetchall(): desc [row[0]] = row[1] db.close() return desc except: return None def get_number_of_columns_of_phrase_table(self, db_file): ''' Get the number of columns in the 'phrases' table in the database in db_file. Determines the number of columns by parsing this: sqlite> select sql from sqlite_master where name='phrases'; CREATE TABLE phrases (id INTEGER PRIMARY KEY, tabkeys TEXT, phrase TEXT, freq INTEGER, user_freq INTEGER) sqlite> This result could be on a single line, as above, or on multiple lines. ''' if not path.exists (db_file): return 0 try: db = sqlite3.connect (db_file) tp_res = db.execute( "select sql from sqlite_master where name='phrases';" ).fetchall() # Remove possible line breaks from the string where we # want to match: str = ' '.join(tp_res[0][0].splitlines()) res = re.match(r'.*\((.*)\)', str) if res: tp = res.group(1).split(',') return len(tp) else: return 0 except: return 0 def get_goucima (self, zi): '''Get goucima of given character''' if not zi: return u'' sqlstr = 'SELECT goucima FROM main.goucima WHERE zi = :zi;' results = self.db.execute(sqlstr, {'zi': zi}).fetchall() if results: goucima = results[0][0] else: goucima = u'' return goucima def parse_phrase (self, phrase): '''Parse phrase to get its table code Example: Let’s assume we use wubi-jidian86. The rules in the source of that table are: RULES = ce2:p11+p12+p21+p22;ce3:p11+p21+p31+p32;ca4:p11+p21+p31+p-11 “ce2” is a rule for phrases of length 2, “ce3” is a rule for phrases of length 3, “ca4” is a rule for phrases of length 4 *and* for all phrases with a length greater then 4. “pnm” in such a rule means to use the n-th character of the phrase and take the m-th character of the table code of that character. I.e. “p-11” is the first character of the table code of the last character in the phrase. Let’s assume the phrase is “天下大事”. The goucima (構詞碼 = “word formation keys”) for these 4 characters are: character goucima 天 gdi 下 ghi 大 dddd 事 gkvh (If no special goucima are defined by the user, the longest encoding for a single character in a table is the goucima for that character). The length of the phrase “天下大事” is 4 characters, therefore the rule ca4:p11+p21+p31+p-11 applies, i.e. the table code for “天下大事” is calculated by using the first, second, third and last character of the phrase and taking the first character of the goucima for each of these. Therefore, the table code for “天下大事” is “ggdg”. ''' if type(phrase) != type(u''): phrase = phrase.decode('UTF-8') # Shouldn’t this function try first whether the system database # already has an entry for this phrase and if yes return it # instead of constructing a new entry according to the rules? # And construct a new entry only when no entry already exists # in the system database?? if len(phrase) == 0: return u'' if len(phrase) == 1: return self.get_goucima(phrase) if not self.rules: return u'' if len(phrase) in self.rules: rule = self.rules[len(phrase)] elif len(phrase) > self.rules['above']: rule = self.rules[self.rules['above']] else: sys.stderr.write( 'No rule for this phrase length. phrase=%(p)s rules=%(r)s\n' %{'p': phrase, 'r': rules}) return u'' if len(rule) > self._mlen: sys.stderr.write( 'Rule exceeds maximum key length. rule=%(r)s self._mlen=%(m)s\n' %{'r': rule, 'm': self._mlen}) return u'' tabkeys = u'' for (zi, ma) in rule: if zi > 0: zi -= 1 if ma > 0: ma -= 1 tabkey = self.get_goucima(phrase[zi])[ma] if not tabkey: return u'' tabkeys += tabkey return tabkeys def is_in_system_database(self, tabkeys=u'', phrase=u''): ''' Checks whether “phrase” can be matched in the system database with a key sequence *starting* with “tabkeys”. ''' if not tabkeys or not phrase: return False sqlstr = ''' SELECT * FROM main.phrases WHERE tabkeys LIKE :tabkeys AND phrase = :phrase; ''' sqlargs = {'tabkeys': tabkeys+'%%', 'phrase': phrase} results = self.db.execute(sqlstr, sqlargs).fetchall() if results: return True else: return False def user_frequency(self, tabkeys=u'', phrase=u''): if not tabkeys or not phrase: return 0 sqlstr = ''' SELECT sum(user_freq) FROM user_db.phrases WHERE tabkeys = :tabkeys AND phrase = :phrase GROUP BY tabkeys, phrase; ''' sqlargs = {'tabkeys': tabkeys, 'phrase': phrase} result = self.db.execute(sqlstr, sqlargs).fetchall() if result: return result[0][0] else: return 0; def check_phrase(self, tabkeys=u'', phrase=u''): '''Adjust user_freq in user database if necessary. Also, if the phrase is not in the system database, and it is a Chinese table, and defining user phrases is allowed, add it as a user defined phrase to the user database if it is not yet there. ''' if type(phrase) != type(u''): phrase = phrase.decode('utf8') if type(tabkeys) != type(u''): tabkeys = tabkeys.decode('utf8') if not tabkeys or not phrase: return if self._is_chinese and phrase in chinese_nocheck_chars: return if not self.dynamic_adjust: if not self.user_can_define_phrase or not self.is_chinese: return tabkeys = self.parse_phrase(phrase) if not tabkeys: return # no tabkeys could be constructed from the rules in the table if self.is_in_system_database(tabkeys=tabkeys, phrase=phrase): return # if it is in the system database, it does not need to be defined if self.user_frequency(tabkeys=tabkeys, phrase=phrase) > 0: return # if it is in the user database, it has been defined before # add this user defined phrase to the user database: self.add_phrase(tabkeys=tabkeys, phrase=phrase, freq=-1, user_freq=1, database='user_db') else: if self.is_in_system_database(tabkeys=tabkeys, phrase=phrase): user_freq = self.user_frequency(tabkeys=tabkeys, phrase=phrase) if user_freq > 0: self.update_phrase(tabkeys=tabkeys, phrase=phrase, user_freq=user_freq+1) else: self.add_phrase(tabkeys=tabkeys, phrase=phrase, freq=0, user_freq=1, database='user_db') else: if not self.user_can_define_phrase or not self.is_chinese: return tabkeys = self.parse_phrase(phrase) if not tabkeys: return # no tabkeys could be constructed from the rules in the table user_freq = self.user_frequency(tabkeys=tabkeys, phrase=phrase) if user_freq > 0: self.update_phrase(tabkeys=tabkeys, phrase=phrase, user_freq=user_freq+1) else: self.add_phrase(tabkeys=tabkeys, phrase=phrase, freq=-1, user_freq=1, database='user_db') def find_zi_code (self, phrase): ''' Return the list of possible tabkeys for a phrase. For example, if “phrase” is “你” and the table is wubi-jidian.86.txt, the result will be ['wq', 'wqi', 'wqiy'] because that table contains the following 3 lines matching that phrase exactly: wq 你 597727619 wqi 你 1490000000 wqiy 你 1490000000 ''' if type(phrase) != type(u''): phrase = phrase.decode('utf8') sqlstr = ''' SELECT tabkeys FROM main.phrases WHERE phrase = :phrase ORDER by length(tabkeys) ASC; ''' sqlargs = {'phrase': phrase} results = self.db.execute(sqlstr, sqlargs).fetchall() list_of_possible_tabkeys = [x[0] for x in results] return list_of_possible_tabkeys def remove_phrase (self, tabkeys=u'', phrase=u'', database='user_db', commit=True): '''Remove phrase from database ''' if not phrase: return if tabkeys: delete_sqlstr = ''' DELETE FROM %(database)s.phrases WHERE tabkeys = :tabkeys AND phrase = :phrase; ''' %{'database': database} else: delete_sqlstr = ''' DELETE FROM %(database)s.phrases WHERE phrase = :phrase; ''' %{'database': database} delete_sqlargs = {'tabkeys': tabkeys, 'phrase': phrase} self.db.execute(delete_sqlstr, delete_sqlargs) if commit: self.db.commit() def extract_user_phrases(self, database_file='', old_database_version="0.0"): '''extract user phrases from database''' sys.stderr.write("Trying to recover the phrases from the old, incompatible database.\n") try: db = sqlite3.connect(database_file) db.execute('PRAGMA wal_checkpoint;') if old_database_version >= "1.00": phrases = db.execute( ''' SELECT tabkeys, phrase, freq, sum(user_freq) FROM phrases GROUP BY tabkeys, phrase, freq; ''' ).fetchall() db.close() phrases = sorted(phrases, key=lambda x: (x[0], x[1], x[2], x[3])) sys.stderr.write("Recovered phrases from the old database: phrases=%s\n" %repr(phrases)) return phrases[:] else: # database is very old, it may still use many columns # of type INTEGER for the tabkeys. Therefore, ignore # the tabkeys in the database and try to get them # from the system database instead. phrases = [] results = db.execute( 'SELECT phrase, sum(user_freq) FROM phrases GROUP BY phrase;' ).fetchall() for result in results: sqlstr = ''' SELECT tabkeys FROM main.phrases WHERE phrase = :phrase ORDER BY length(tabkeys) DESC; ''' sqlargs = {'phrase': result[0]} tabkeys_results = self.db.execute(sqlstr, sqlargs).fetchall() if tabkeys_results: phrases.append((tabkeys_results[0][0], result[0], 0, result[1])) else: # No tabkeys for that phrase could not be # found in the system database. Try to get # tabkeys by calling self.parse_phrase(), that # might return something if the table has # rules to construct user defined phrases: tabkeys = self.parse_phrase(result[0]) if tabkeys: # for user defined phrases, the “freq” column is -1: phrases.append((tabkeys, result[0], -1, result[1])) db.close() phrases = sorted(phrases, key=lambda x: (x[0], x[1], x[2], x[3])) sys.stderr.write("Recovered phrases from the very old database: phrases=%s\n" %repr(phrases)) return phrases[:] except: import traceback traceback.print_exc() return [] ibus-table-1.9.1/ibus-table.pc.in000066400000000000000000000007041241251735600165400ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ datarootdir=@datarootdir@ libdir=@datadir@ datadir=@datadir@ extradatadir=@datadir@/ibus-table/data tabledir=@datadir@/ibus-table/tables icondir=@datadir@/ibus-table/icons enginedir=@datadir@/ibus/engine ibus_table_version=@PACKAGE_VERSION@ Name: IBus-Table Description: Table Based Input Method Framework for Intelligent Input Bus for Linux / Unix OS Version: @PACKAGE_VERSION@ Requires: Libs: Cflags: ibus-table-1.9.1/ibus-table.spec.in000066400000000000000000000052061241251735600170720ustar00rootroot00000000000000Name: @PACKAGE_NAME@ Version: @PACKAGE_VERSION@ Release: 1%{?dist} Summary: The Table engine for IBus platform License: LGPLv2+ Group: System Environment/Libraries URL: http://code.google.com/p/ibus/ Source0: http://ibus.googlecode.com/files/%{name}-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildArch: noarch BuildRequires: gettext-devel Requires: ibus %description The package contains general Table engine for IBus platform. %package additional Summary: Additional tables for general table engine of IBus. Group: System Environment/Libraries Requires: %{name} = %{version}-%{release} %description additional This package contains additional tables. %prep %setup -q %build %configure \ --disable-static \ --enable-additional make %{?_smp_mflags} %install rm -rf $RPM_BUILD_ROOT make DESTDIR=${RPM_BUILD_ROOT} NO_INDEX=true install %find_lang %{name} %clean rm -rf $RPM_BUILD_ROOT %post additional ibus-table-createdb -i -n %{_datadir}/ibus-table/tables/additional/compose.db ibus-table-createdb -i -n %{_datadir}/ibus-table/tables/additional/latex.db %files -f %{name}.lang %defattr(-,root,root,-) %doc AUTHORS COPYING README %{_libdir}/pkgconfig/ibus-table.pc %{_datadir}/ibus-table/engine %{_datadir}/ibus-table/data %{_datadir}/ibus-table/setup %{_datadir}/ibus-table/tables/template.txt %dir %{_datadir}/ibus-table/tables %{_datadir}/ibus-table/icons/ibus-table.svg %{_datadir}/ibus-table/icons/full-letter.svg %{_datadir}/ibus-table/icons/full-punct.svg %{_datadir}/ibus-table/icons/half-letter.svg %{_datadir}/ibus-table/icons/half-punct.svg %{_datadir}/ibus-table/icons/onechar.svg %{_datadir}/ibus-table/icons/phrase.svg %{_datadir}/ibus-table/icons/py-mode.svg %{_datadir}/ibus-table/icons/tab-mode.svg %{_datadir}/ibus-table/icons/chinese.svg %{_datadir}/ibus-table/icons/dcommit.svg %{_datadir}/ibus-table/icons/english.svg %{_datadir}/ibus-table/icons/ncommit.svg %{_datadir}/ibus-table/icons/cb-mode.svg %{_datadir}/ibus-table/icons/sc-mode.svg %{_datadir}/ibus-table/icons/scb-mode.svg %{_datadir}/ibus-table/icons/tc-mode.svg %{_datadir}/ibus-table/icons/tcb-mode.svg %dir %{_datadir}/ibus-table/icons %{_bindir}/ibus-engine-table %{_bindir}/ibus-table-createdb %{_bindir}/ibus-setup-table %files additional %defattr(-,root,root,-) %{_datadir}/ibus-table/tables/compose.db %{_datadir}/ibus-table/tables/latex.db %{_datadir}/ibus-table/icons/compose.svg %{_datadir}/ibus-table/icons/latex.svg %{_datadir}/ibus/engine/compose.engine %{_datadir}/ibus/engine/latex.engine %changelog * Wed Aug 19 2008 Yu Yuwei - @VERSION@-1 - The first version. ibus-table-1.9.1/icons/000077500000000000000000000000001241251735600146725ustar00rootroot00000000000000ibus-table-1.9.1/icons/Makefile.am000066400000000000000000000024421241251735600167300ustar00rootroot00000000000000# vim:set noet ts=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # SUBDIRS = \ $(NULL) icons_DATA = \ ibus-table.svg \ full-letter.svg \ half-letter.svg \ full-punct.svg \ half-punct.svg \ tab-mode.svg \ py-mode.svg \ onechar.svg \ phrase.svg \ chinese.svg \ english.svg \ acommit.svg \ ncommit.svg \ cb-mode.svg \ sc-mode.svg \ tc-mode.svg \ scb-mode.svg \ tcb-mode.svg \ $(NULL) iconsdir = $(pkgdatadir)/icons EXTRA_DIST = \ $(icons_DATA) \ $(NULL) MAINTAINERCLEANFILES = \ Makefile.in \ $(NULL) ibus-table-1.9.1/icons/acommit.svg000066400000000000000000000166311241251735600170530ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/cb-mode.svg000066400000000000000000000162651241251735600167330ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/chinese.svg000066400000000000000000000204721241251735600170360ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/english.svg000066400000000000000000000251211241251735600170450ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/full-letter.svg000066400000000000000000000154461241251735600176640ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/full-punct.svg000066400000000000000000000242221241251735600175060ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/half-letter.svg000066400000000000000000000103671241251735600176310ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/half-punct.svg000066400000000000000000000214451241251735600174620ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/ibus-table.svg000066400000000000000000000112671241251735600174510ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/ncommit.svg000066400000000000000000000145151241251735600170670ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/onechar.svg000066400000000000000000000160171241251735600170370ustar00rootroot00000000000000 image/svg+xml 1 ibus-table-1.9.1/icons/phrase.svg000066400000000000000000000145121241251735600167000ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/py-mode.svg000066400000000000000000000267261241251735600170020ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/sc-mode.svg000066400000000000000000000217641241251735600167540ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/scb-mode.svg000066400000000000000000000302601241251735600171050ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/tab-mode.svg000066400000000000000000000131751241251735600171120ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/tc-mode.svg000066400000000000000000000313551241251735600167520ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/icons/tcb-mode.svg000066400000000000000000000426241241251735600171150ustar00rootroot00000000000000 image/svg+xml ibus-table-1.9.1/m4/000077500000000000000000000000001241251735600140775ustar00rootroot00000000000000ibus-table-1.9.1/m4/.gitignore000066400000000000000000000000051241251735600160620ustar00rootroot00000000000000*.m4 ibus-table-1.9.1/m4/Makefile.am000066400000000000000000000016701241251735600161370ustar00rootroot00000000000000# vim:set noet ts=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # EXTRA_DIST = \ as-version.m4 \ $(NULL) MAINTAINERCLEANFILES = \ Makefile.in \ $(NULL) ibus-table-1.9.1/m4/as-version.m4000066400000000000000000000037701241251735600164360ustar00rootroot00000000000000dnl as-version.m4 0.2.0 dnl autostars m4 macro for versioning dnl Thomas Vander Stichele dnl $Id: as-version.m4,v 1.4 2004/06/01 09:40:05 thomasvs Exp $ dnl AS_VERSION dnl example dnl AS_VERSION dnl this macro dnl - AC_SUBST's PACKAGE_VERSION_MAJOR, _MINOR, _MICRO dnl - AC_SUBST's PACKAGE_VERSION_RELEASE, dnl which can be used for rpm release fields dnl - doesn't call AM_INIT_AUTOMAKE anymore because it prevents dnl maintainer mode from running correctly dnl dnl don't forget to put #undef PACKAGE_VERSION_RELEASE in acconfig.h dnl if you use acconfig.h AC_DEFUN([AS_VERSION], [ PACKAGE_VERSION_MAJOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f1) PACKAGE_VERSION_MINOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f2) PACKAGE_VERSION_MICRO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f3) AC_SUBST(PACKAGE_VERSION_MAJOR) AC_SUBST(PACKAGE_VERSION_MINOR) AC_SUBST(PACKAGE_VERSION_MICRO) ]) dnl AS_NANO(ACTION-IF-NO-NANO, [ACTION-IF-NANO]) dnl requires AC_INIT to be called before dnl For projects using a fourth or nano number in your versioning to indicate dnl development or prerelease snapshots, this macro allows the build to be dnl set up differently accordingly. dnl this macro: dnl - parses AC_PACKAGE_VERSION, set by AC_INIT, and extracts the nano number dnl - sets the variable PACKAGE_VERSION_NANO dnl - sets the variable PACKAGE_VERSION_RELEASE, which can be used dnl for rpm release fields dnl - executes ACTION-IF-NO-NANO or ACTION-IF-NANO dnl example: dnl AS_NANO(RELEASE="yes", RELEASE="no") AC_DEFUN([AS_NANO], [ AC_MSG_CHECKING(nano version) NANO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f4) if test x"$NANO" = x || test "x$NANO" = "x0" ; then AC_MSG_RESULT([0 (release)]) NANO=0 PACKAGE_VERSION_RELEASE=1 ifelse([$1], , :, [$1]) else AC_MSG_RESULT($NANO) PACKAGE_VERSION_RELEASE=0.`date +%Y%m%d.%H%M%S` ifelse([$2], , :, [$2]) fi PACKAGE_VERSION_NANO=$NANO AC_SUBST(PACKAGE_VERSION_NANO) AC_SUBST(PACKAGE_VERSION_RELEASE) ]) ibus-table-1.9.1/po/000077500000000000000000000000001241251735600141755ustar00rootroot00000000000000ibus-table-1.9.1/po/.gitignore000066400000000000000000000003321241251735600161630ustar00rootroot00000000000000*.gmo Makefile Makefile.in Makefile.in.in Makevars.template POTFILES Rules-quot boldquot.sed en@boldquot.header en@quot.header insert-header.sin quot.sed remove-potcdate.sed remove-potcdate.sin stamp-po ibus-table.pot ibus-table-1.9.1/po/LINGUAS000066400000000000000000000000301241251735600152130ustar00rootroot00000000000000de ja zh_CN zh_TW zh_HK ibus-table-1.9.1/po/Makevars000066400000000000000000000034411241251735600156730ustar00rootroot00000000000000# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = $(PACKAGE) # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Yu Yuwei # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = $(PACKAGE_BUGREPORT) # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = ibus-table-1.9.1/po/POTFILES.in000066400000000000000000000002131241251735600157460ustar00rootroot00000000000000engine/table.py engine/main.py engine/tabsqlitedb.py engine/tabcreatedb.py engine/factory.py setup/main.py setup/ibus-table-preferences.ui ibus-table-1.9.1/po/de.po000066400000000000000000000522651241251735600151370ustar00rootroot00000000000000# IBus-Table Translation file: de.po # Copyright (C) 2012 Mike FABIAN # This file is distributed under the same license as the ibus-table package. # Mike FABIAN , 2012. # msgid "" msgstr "" "Project-Id-Version: ibus-table 1.4.99\n" "Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n" "POT-Creation-Date: 2014-09-16 07:25+0200\n" "PO-Revision-Date: 2014-09-16 08:23+0200\n" "Last-Translator: Mike FABIAN \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: engine/table.py:1325 setup/ibus-table-preferences.ui:75 msgid "Simplified Chinese" msgstr "Vereinfachtes Chinesisch" #: engine/table.py:1326 msgid "Switch to “Simplified Chinese only”." msgstr "Wechseln zu “Vereinfachtes Chinesisch”" #: engine/table.py:1331 setup/ibus-table-preferences.ui:78 msgid "Traditional Chinese" msgstr "Traditionelles Chinesisch" #: engine/table.py:1332 msgid "Switch to “Traditional Chinese only”." msgstr "Wechseln zu “Traditionelles Chinesisch”" #: engine/table.py:1337 msgid "Simplified Chinese first" msgstr "Vereinfachtes Chinesisch zuerst" #: engine/table.py:1338 msgid "Switch to “Simplified Chinese before traditional”." msgstr "Wechseln zu “Vereinfachtes Chinesisch vor traditionellem”" #: engine/table.py:1343 msgid "Traditional Chinese first" msgstr "Traditionelles Chinesisch zuerst" #: engine/table.py:1344 msgid "Switch to “Traditional Chinese before simplified”." msgstr "Wechseln zu “Traditionelles Chinesisch vor vereinfachtem”" #: engine/table.py:1349 setup/ibus-table-preferences.ui:87 msgid "All Chinese characters" msgstr "Alle chinesischen Zeichen" #: engine/table.py:1350 msgid "Switch to “All Chinese characters”." msgstr "Wechseln zu “Alle chinesischen Zeichen”" #: engine/table.py:1354 msgid "Chinese mode" msgstr "Chinesischer Modus" #: engine/table.py:1355 msgid "Switch Chinese mode" msgstr "Chinesischen Modus ändern" #: engine/table.py:1365 msgid "English" msgstr "Englisch" #: engine/table.py:1366 msgid "Switch to English input" msgstr "Wechseln zur Eingabe von Englisch" #: engine/table.py:1371 msgid "Chinese" msgstr "Chinesisch" #: engine/table.py:1372 msgid "Switch to Chinese input" msgstr "Wechseln zur Eingabe von Chinesisch" #: engine/table.py:1380 engine/table.py:1495 #: setup/ibus-table-preferences.ui:36 msgid "Direct" msgstr "Direkt" #: engine/table.py:1381 msgid "Switch to direct input" msgstr "Wechseln zum “Direkteingabe Modus”" #: engine/table.py:1386 engine/table.py:1447 msgid "Table" msgstr "Tabelleneingabe" #: engine/table.py:1387 msgid "Switch to table input" msgstr "Tabelleneingabemodus" #: engine/table.py:1395 msgid "Input mode" msgstr "Eingabemodus" #: engine/table.py:1396 msgid "Switch Input mode" msgstr "Eingabemodus ändern" #: engine/table.py:1405 engine/table.py:1426 #: setup/ibus-table-preferences.ui:98 setup/ibus-table-preferences.ui:112 #: setup/ibus-table-preferences.ui:182 setup/ibus-table-preferences.ui:196 msgid "Half" msgstr "Halbe Breite" #: engine/table.py:1406 msgid "Switch to halfwidth letters" msgstr "Wechseln zu “Buchstaben in halber Breite”" #: engine/table.py:1411 engine/table.py:1432 #: setup/ibus-table-preferences.ui:101 setup/ibus-table-preferences.ui:115 #: setup/ibus-table-preferences.ui:185 setup/ibus-table-preferences.ui:199 msgid "Full" msgstr "Volle Breite" #: engine/table.py:1412 msgid "Switch to fullwidth letters" msgstr "Wechseln zu “Buchstaben in voller Breite”" #: engine/table.py:1416 msgid "Letter width" msgstr "Buchstabenbreite" #: engine/table.py:1417 msgid "Switch letter width" msgstr "Buchstabenbreite ändern" #: engine/table.py:1427 msgid "Switch to halfwidth punctuation" msgstr "Wechseln zu “Zeichensetzung in halber Breite”" #: engine/table.py:1433 msgid "Switch to fullwidth punctuation" msgstr "Wechseln zu “Zeichensetzung in voller Breite”" #: engine/table.py:1437 msgid "Punctuation width" msgstr "Zeichensetzungsbreite" #: engine/table.py:1438 msgid "Switch punctuation width" msgstr "Zeichensetzungsbreite ändern" #: engine/table.py:1448 msgid "Switch to table mode" msgstr "Zum “Tabellen Modus” wechseln" #: engine/table.py:1453 msgid "Pinyin" msgstr "Pinyin" #: engine/table.py:1454 msgid "Switch to pinyin mode" msgstr "Zum “Pinyin Modus” Modus wechseln" #: engine/table.py:1458 msgid "Pinyin mode" msgstr "Pinyin Modus" #: engine/table.py:1459 msgid "Switch pinyin mode" msgstr "Pinyinmodus ändern" #: engine/table.py:1468 msgid "Multiple character match" msgstr "Mehrere Zeichen auf einmal" #: engine/table.py:1469 msgid "Switch to matching multiple characters at once" msgstr "Zur Eingabe mehrerer Zeichen auf einmal wechseln" #: engine/table.py:1474 msgid "Single character match" msgstr "Nur einzelne Zeichen" #: engine/table.py:1475 msgid "Switch to matching only single characters" msgstr "Zur Eingabe einzelner Zeichen wechseln" #: engine/table.py:1479 msgid "Onechar mode" msgstr "Einzelzeichenmodus" #: engine/table.py:1480 msgid "Switch onechar mode" msgstr "Einzelzeichenmodus ändern" #: engine/table.py:1489 setup/ibus-table-preferences.ui:33 msgid "Normal" msgstr "Normal" #: engine/table.py:1490 msgid "" "Switch to normal commit mode (automatic commits go into the preedit instead " "of into the application. This enables automatic definitions of new shortcuts)" msgstr "" "Wechseln zum normallen Commitmodus (automatische Commits gehen in das " "Preedit\n" "anstatt in die Applikation. Das ermöglicht automatische Definitionen neuer\n" "Kürzel)" #: engine/table.py:1496 msgid "" "Switch to direct commit mode (automatic commits go directly into the " "application)" msgstr "" "Wechseln zum direkten Commitmodus (automatische Commits gehen direkt in\n" "die Applikation)" #: engine/table.py:1500 msgid "Auto commit mode" msgstr "Autocommitmodus" #: engine/table.py:1501 msgid "Switch autocommit mode" msgstr "Autocommitmodus ändern" #: engine/table.py:1743 msgid "Setup" msgstr "Einstellungen" #: engine/table.py:1745 #, python-format msgid "Configure ibus-table “%(engine-name)s”" msgstr "Konfiguration von ibus-table “%(engine-name)s”" #: setup/main.py:125 msgid "IBUS_ENGINE_NAME environment variable is not set." msgstr "Die Umgebungsvariable IBUS_ENGINE_NAME ist nicht gesetzt." #: setup/main.py:129 msgid "Cannot determine the engine name. Please use the --engine-name option." msgstr "" "Der Name für diesen Input-Engine kann nicht gefunden werden. Bitte benutzen " "Sie die --engine-name Option." #: setup/main.py:143 #, python-format msgid "IBus Table engine %s is not available" msgstr "IBus Table Engine %s ist nicht verfügbar" #: setup/main.py:271 #, python-format msgid "IBus Table %s Preferences" msgstr "IBus Table %s Einstellungen" #: setup/ibus-table-preferences.ui:19 setup/ibus-table-preferences.ui:47 #: setup/ibus-table-preferences.ui:61 msgid "No" msgstr "Nein" #: setup/ibus-table-preferences.ui:22 setup/ibus-table-preferences.ui:50 #: setup/ibus-table-preferences.ui:64 msgid "Yes" msgstr "Ja" #: setup/ibus-table-preferences.ui:81 msgid "Simplified Chinese before traditional" msgstr "Vereinfachtes Chinesisch zuerst" #: setup/ibus-table-preferences.ui:84 msgid "Traditional Chinese before simplified" msgstr "Traditionelles Chinesisch zuerst" #: setup/ibus-table-preferences.ui:126 msgid "Direct input" msgstr "Direkteingabemodus" #: setup/ibus-table-preferences.ui:129 msgid "Table input" msgstr "Tabelleneingabemodus" #: setup/ibus-table-preferences.ui:140 msgid "Horizontal" msgstr "Horizontal" #: setup/ibus-table-preferences.ui:143 msgid "Vertical" msgstr "Vertikal" #: setup/ibus-table-preferences.ui:154 msgid "Phrase" msgstr "Satzmodus" #: setup/ibus-table-preferences.ui:157 msgid "Single Char" msgstr "Einzelzeichenmodus" #: setup/ibus-table-preferences.ui:168 msgid "Commit" msgstr "Commit" #: setup/ibus-table-preferences.ui:171 msgid "Next Page" msgstr "Nächste Seite" #: setup/ibus-table-preferences.ui:223 msgid "Restore all defaults" msgstr "Alles auf Standardeinstellungen zurücksetzen" #: setup/ibus-table-preferences.ui:227 msgid "Restore defaults as specified in the database for this engine." msgstr "" "Auf Standardeinstellungen zurücksetzen, so\n" "wie sie in der Datenbank für diesen Inputengine\n" "definiert sind." #: setup/ibus-table-preferences.ui:302 msgid "Input mode:" msgstr "Eingabemodus" #: setup/ibus-table-preferences.ui:315 msgid "" "“Simplified Chinese” shows only characters \n" "used in simplified Chinese. “Traditional Chinese”\n" "shows only characters used in traditional Chinese.\n" "“Simplified Chinese before traditional” shows all\n" "characters but puts the simplified characters higher\n" "up in the candidate list. “Traditional Chinese before\n" "simplified” puts the traditional characters higher up\n" "in the candidate list. “All characters” just shows all\n" "matches without any particular filtering on traditional\n" "versus simplified Chinese." msgstr "" "“Vereinfachtes Chinesisch” zeigt nur Zeichen, die in\n" "vereinfachtem Chinesisch benutzt werden. “Traditionelles\n" "Chinesisch” zeigt nur Zeichen, die in traditionellem\n" "Chinesisch benutzt werden. “Vereinfachtes Chinesisch zuerst”\n" "zeigt die vereinfachten Zeichen höher oben in der\n" "Kandidatenliste. “Traditionelles Chinesisch zuerst” zeigt\n" "die traditionellen Zeichen höher in der Kandidatenliste.\n" "“Alle chinesischen Zeichen” zeigt alle Kandidaten ohne\n" "daß die Reihenfolge irgendwie gefiltert wird." #: setup/ibus-table-preferences.ui:340 msgid "" "Whether to use fullwidth or halfwidth\n" "letters in table input mode." msgstr "" "Ob Buchstaben in voller oder halber\n" "Breite im Tabelleneingabemodus benutzt werden\n" "sollen." #: setup/ibus-table-preferences.ui:357 msgid "" "Whether to use fullwidth or halfwidth\n" "punctuation in table input mode." msgstr "" "Ob Zeichensetzung in voller oder halber\n" "Breite im Tabelleneingabemodus benutzt\n" "werden soll." #: setup/ibus-table-preferences.ui:374 msgid "" "Whether to use fullwidth or halfwidth\n" "letters in direct input mode." msgstr "" "Ob Buchstaben in voller oder halber\n" "Breite im Direkteingabemodus benutzt werden\n" "sollen." #: setup/ibus-table-preferences.ui:391 msgid "" "Whether to use fullwidth or halfwidth\n" "punctuation in direct input mode." msgstr "" "Ob Zeichensetzung in voller oder halber\n" "Breite im Direkteingabemodus benutzt\n" "werden soll." #: setup/ibus-table-preferences.ui:411 msgid "Chinese mode:" msgstr "Chinesischer Modus:" #: setup/ibus-table-preferences.ui:427 msgid "Table input letter width:" msgstr "Buchstabenbreite im Tabelleneingabemodus" #: setup/ibus-table-preferences.ui:443 msgid "Table input punctuation width:" msgstr "Zeichensetzungsbreite im Tabelleneingabemodus" #: setup/ibus-table-preferences.ui:459 msgid "Direct input letter width:" msgstr "Buchstabenbreite im Direkteingabemodus" #: setup/ibus-table-preferences.ui:475 msgid "Direct input punctuation width:" msgstr "Zeichensetzungsbreite im Direkteingabemodus" #: setup/ibus-table-preferences.ui:488 msgid "" "“Direct input” is almost the same as if the\n" "input method were off, i.e. not used at all, most\n" "characters just get passed to the application.\n" "But some conversion between fullwidth and\n" "halfwidth may still happen in direct input mode.\n" "“Table input” means the input method is on." msgstr "" "“Direkteingabemodus” ist beinahe dasselbe als ob\n" "die Eingabemethode überhaupt nicht verwendet würde,\n" "die meisten Zeichen werden einfach an die Applikation\n" "durchgereicht. Aber auch im Direkteingabemodus\n" "werden Zeichen in voller Breite eventuell in Zeichen\n" "in halber Breite konvertiert oder umgekehrt.\n" "“Tabelleneingabemodus” bedeutet, daß die Eingabemethode\n" "aktiv ist." #: setup/ibus-table-preferences.ui:514 msgid "Inital state" msgstr "Zustand beim Start" #: setup/ibus-table-preferences.ui:551 msgid "" "Whether the lookup table showing the candidates\n" "should be vertical or horizontal." msgstr "" "Ob die Kandidatenliste horizontal oder\n" "vertikal angezeigt werden soll." #: setup/ibus-table-preferences.ui:568 msgid "" "The maximum number of candidates in\n" "one page of the lookup table. You can switch\n" "pages in the lookup table using the page up/down\n" "keys or the arrow up/down keys." msgstr "" "Die maximale Anzahl an Kandidaten in einer\n" "Seite der Kandidatenliste. Man kann in der\n" "Kandidatenliste mit den Seite hoch/runter oder\n" "den Pfeil hoch/runter Tasten blättern." #: setup/ibus-table-preferences.ui:592 msgid "Orientation:" msgstr "Orientierung" #: setup/ibus-table-preferences.ui:608 msgid "Page size:" msgstr "Kandidaten pro Seite:" #: setup/ibus-table-preferences.ui:624 msgid "Show candidate list" msgstr "Kandidatenliste zeigen" #: setup/ibus-table-preferences.ui:637 msgid "" "Whether candidate lists should be shown or hidden.\n" "For Chinese input methods one usually wants the\n" "candidate lists to be shown. But for some non-Chinese\n" "input methods like the Russian “translit”, hiding the\n" "candidate lists is better." msgstr "" "Ob Kandidatenlisten gezeigt werden sollen oder nicht.\n" "Für chinesische Inputmethoden will man Kandidatenlisten\n" "normalerweise sehen. Aber für einige nicht-chinesische\n" "Inputmethode, wie zum Beispiel die russische Inputmethode\n" "“translit” ist es besser die Kandidatenlisten zu\n" "verstecken." #: setup/ibus-table-preferences.ui:661 msgid "Candidate list" msgstr "Kandidatenliste" #: setup/ibus-table-preferences.ui:681 msgid "Settings" msgstr "Einstellungen" #: setup/ibus-table-preferences.ui:724 msgid "" "If this is set to “single char”, only single\n" "character candidates will be shown. If it is\n" "set to “Phrase” candidates consisting of\n" "several characters may be shown." msgstr "" "Wenn dies auf “Einzelzeichenmodus” gesetzt wird,\n" "werden nur Kandidaten gezeigt, die nur aus einem\n" "einzigen Zeichen bestehen. Wenn dies auf\n" "“Satz- bzw. Wortmodus” gesetzt wird, können auch\n" "längere Kandidaten angezeigt werden, ganze Wörter\n" "oder gar Sätze." #: setup/ibus-table-preferences.ui:743 msgid "" "If set to “Yes”, this does the following 4 things:\n" "1) When typing “Return”, commit the \n" " candidate + line-feed\n" "2) When tying Tab, commit the candidate\n" "3) When committing using a commit key, commit\n" " the candidate + \" \"\n" "4) If typing the next character matches no candidates,\n" " commit the first candidate of the previous match.\n" " (Mostly needed for non-Chinese input methods like\n" " the Russian “translit”)" msgstr "" "Wenn diese Option auf “Ja” gesetzt ist, werden die\n" "folgenden 4 Dinge gemacht, bei “Nein” nicht:\n" "1) Beim tippen der “Return”-Taste wird der Kandidat\n" " und ein Zeilenumbruch committed.\n" "2) Beim tippen der “Tab”-wird der Kandidat committed.\n" "3) Beim Committen mittels einer “Commit-Taste” (meist\n" " Leertaste) wird der Kandidat gefolgt von “ ” committed.\n" "4) Wenn das Tippen eines weiteren Zeichens dazu führt,\n" " daß es keine Kandidaten mehr gibt, wird der erste\n" " Kandidat der Kandidatenliste vor dem Tippen diese\n" " Zeichens committed (Hauptsächlich nützlich für\n" " nicht-chinesische Eingabemethoden, zum Beispiel die\n" " Russische Eingabemethode “translit”)" #: setup/ibus-table-preferences.ui:768 msgid "" "Committing with the commit keys or with the mouse\n" "always commits to the application. This option is about\n" "“automatic” commits which may happen when\n" "one just continues typing input without committing\n" "manually. From time to time, “automatic” commits will\n" "happen then.\n" "“Direct” means such “automatic” commits go directly\n" "into the application, “Normal” means they get committed\n" "to preëdit." msgstr "" "Wenn man manuell mittels Commit-Tasten oder mit der\n" "Maus committed, geht der Text immer direkt in die\n" "Applikation. In dieser Option geht es um\n" "“automatische” Commits, die ab und zu vorkommen wenn\n" "man einfach immer weiter tippt ohne manuell zu\n" "committen.\n" "“Direkt” bedeutet, daß solche “automatischen” Commits\n" "direkt in die Applikation committed werden, “Normal”\n" "bedeutet, daß sie zunächst nur ins “Preedit” committed\n" "werden, wo sie weiter editiert werden können und später\n" "manuell committed." #: setup/ibus-table-preferences.ui:792 msgid "" "If you choose the space key to do “Next page”,\n" " you can only commit using the selection keys\n" "(i.e. the labels in front of the candidates in the\n" "lookup table) or using the mouse." msgstr "" "Wenn man die Leertaste benutzt um zur nächsten Seite\n" "in der Kandidatenliste zu blättern, kann man nur noch\n" "mit den Auswahltasten (d.h. die Tasten, die in der\n" "Kandidatenliste vor den Kandidaten angezeigt werden)\n" "oder mit der Maus committen." #: setup/ibus-table-preferences.ui:814 msgid "Compose:" msgstr "Komposition" #: setup/ibus-table-preferences.ui:830 msgid "Auto select:" msgstr "Automatische Auswahl" #: setup/ibus-table-preferences.ui:846 msgid "Auto commit mode:" msgstr "Autocommitmodus" #: setup/ibus-table-preferences.ui:862 msgid "Behavior of space key:" msgstr "Verhalten der Leertaste" #: setup/ibus-table-preferences.ui:878 msgid "Auto wildcard:" msgstr "Automatischer Platzhalter" #: setup/ibus-table-preferences.ui:891 msgid "" "If yes, a multi wildcard will be automatically\n" "appended to the end of the input string." msgstr "" "Wenn diese Option auf “ja” gesetzt ist wird\n" "automatich ein Platzhalter für beliebig viele\n" "Zeichen ans Ende des Eingabetextes angehängt." #: setup/ibus-table-preferences.ui:911 msgid "Single wildchard character:" msgstr "Platzhalter für ein Zeichen:" #: setup/ibus-table-preferences.ui:924 msgid "" "The wildcard to match any single character.\n" "Type RETURN or ENTER to confirm after changing the wildcard." msgstr "" "Das Platzhalterzeichen für ein beliebiges einzelnes\n" "Zeichen. Nach Ändern dieser Option mit RETURN oder ENTER bestätigen." #: setup/ibus-table-preferences.ui:943 msgid "Multi wildcard character:" msgstr "Platzhalter für beliebig viele Zeichen:" #: setup/ibus-table-preferences.ui:956 msgid "" "The wildcard used to match any number of characters.\n" "Type RETURN or ENTER to confirm after changing the wildcard." msgstr "" "Das Platzhalterzeichen für beliebig viele Zeichen.\n" "Nach Ändern dieser Option mit RETURN oder ENTER bestätigen." #: setup/ibus-table-preferences.ui:976 msgid "Details" msgstr "Details" #: setup/ibus-table-preferences.ui:999 msgid "Details" msgstr "Details" #: setup/ibus-table-preferences.ui:1055 msgid "Table input method for IBus" msgstr "Tabellenbasierte Eingabemethode für IBus" #: setup/ibus-table-preferences.ui:1087 msgid "" "\n" "Authors:\n" "Yuwei YU (‘acevery’)\n" "Peng Huang\n" "BYVoid\n" "Peng Wu\n" "\n" "Contributors:\n" "koterpilla\n" "Zerng07\n" "Caius ‘kaio’ Chance\n" "Mike FABIAN\n" "Bernard Nauwelaerts\n" "Xiaojun Ma\n" "mozbugbox\n" "Seán de Búrca\n" "" msgstr "" "\n" "Autoren:\n" "Yuwei YU (‘acevery’)\n" "Peng Huang\n" "BYVoid\n" "Peng Wu\n" "\n" "Mitwirkende:\n" "koterpilla\n" "Zerng07\n" "Caius ‘kaio’ Chance\n" "Mike FABIAN\n" "Bernard Nauwelaerts\n" "Xiaojun Ma\n" "mozbugbox\n" "Seán de Búrca\n" "" #: setup/ibus-table-preferences.ui:1186 msgid "About" msgstr "Info über IBus Table" #~ msgid "Chinese input (Left Shift)" #~ msgstr "Chinesische Eingabe (Linke Shift Taste)" #~ msgid "Direct input (Left Shift)" #~ msgstr "Direkteingabe Modus (Linke Shift Taste)" #~ msgid "Switch to %s (“Table input”) (Left Shift)" #~ msgstr "Wechseln zu %s (“Tabelleneingabe Modus”) (Linke Shift Taste)" #~ msgid "Fullwidth letters (Shift-Space)" #~ msgstr "Buchstaben in voller Breite (Ctrl-Space)" #~ msgid "Halfwidth letters (Shift-Space)" #~ msgstr "Buchstaben in halber Breite (Ctrl-Space)" #~ msgid "Fullwidth punctuation (Ctrl-.)" #~ msgstr "Zeichensetzung in voller Breite (Ctrl-.)" #~ msgid "Halfwidth punctuation (Ctrl-.)" #~ msgstr "Zeichensetzung in halber Breite (Ctrl-.)" #~ msgid "Table mode (Right Shift)" #~ msgstr "Tabellenmodus (Rechte Shift Taste)" #~ msgid "Switch to “Phrase mode” (Ctrl-,)" #~ msgstr "Wechseln zum “Satz- bzw. Wortmodus” (Ctrl-,)" #~ msgid "Phrase mode (Ctrl-,)" #~ msgstr "Satz- bzw. Wortmodus (Ctrl-,)" #~ msgid "Direct commit mode (Ctrl-/)" #~ msgstr "Direkter Commitmodus (Ctrl-/)" #~ msgid "Switch to “Normal commit mode” (uses space to commit) (Ctrl-/)" #~ msgstr "" #~ "Wechseln zum normalen Commitmodus (Commit beim Tippen des Leerzeichens) " #~ "(Ctrl-/)" #~ msgid "Normal commit mode (Ctrl-/)" #~ msgstr "Normaler Commitmodus (Ctrl-/)" #~ msgid "Simplified Chinese (Ctrl-;)" #~ msgstr "Vereinfachtes Chinesisch (Ctrl-;)" #~ msgid "Traditional Chinese (Ctrl-;)" #~ msgstr "Traditionelles Chinesisch (Ctrl-;)" #~ msgid "Simplified Chinese before traditional (Ctrl-;)" #~ msgstr "Vereinfachtes Chinesisch zuerst (Ctrl-;)" #~ msgid "Traditional Chinese before simplified (Ctrl-;)" #~ msgstr "Traditionelles Chinesisch zuerst (Ctrl-;)" #~ msgid "All Chinese characters (Ctrl-;)" #~ msgstr "Alle chinesischen Zeichen (Ctrl-;)" ibus-table-1.9.1/po/ja.po000066400000000000000000000306061241251735600151340ustar00rootroot00000000000000# IBus-Table Translation file: ja.po # Copyright (C) 2014 Mike FABIAN # This file is distributed under the same license as the PACKAGE package. # Mike FABIAN , 2014. # msgid "" msgstr "" "Project-Id-Version: ibus-table 1.8.10\n" "Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n" "POT-Creation-Date: 2014-09-16 07:25+0200\n" "PO-Revision-Date: 2014-09-16 09:51+0200\n" "Last-Translator: Mike FABIAN \n" "Language-Team: Japanese \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: engine/table.py:1325 setup/ibus-table-preferences.ui:75 msgid "Simplified Chinese" msgstr "" #: engine/table.py:1326 msgid "Switch to “Simplified Chinese only”." msgstr "" #: engine/table.py:1331 setup/ibus-table-preferences.ui:78 msgid "Traditional Chinese" msgstr "" #: engine/table.py:1332 msgid "Switch to “Traditional Chinese only”." msgstr "" #: engine/table.py:1337 msgid "Simplified Chinese first" msgstr "" #: engine/table.py:1338 msgid "Switch to “Simplified Chinese before traditional”." msgstr "" #: engine/table.py:1343 msgid "Traditional Chinese first" msgstr "" #: engine/table.py:1344 msgid "Switch to “Traditional Chinese before simplified”." msgstr "" #: engine/table.py:1349 setup/ibus-table-preferences.ui:87 msgid "All Chinese characters" msgstr "" #: engine/table.py:1350 msgid "Switch to “All Chinese characters”." msgstr "" #: engine/table.py:1354 msgid "Chinese mode" msgstr "" #: engine/table.py:1355 msgid "Switch Chinese mode" msgstr "" #: engine/table.py:1365 msgid "English" msgstr "英語" #: engine/table.py:1366 msgid "Switch to English input" msgstr "" #: engine/table.py:1371 msgid "Chinese" msgstr "中国語" #: engine/table.py:1372 msgid "Switch to Chinese input" msgstr "" #: engine/table.py:1380 engine/table.py:1495 #: setup/ibus-table-preferences.ui:36 msgid "Direct" msgstr "" #: engine/table.py:1381 msgid "Switch to direct input" msgstr "" #: engine/table.py:1386 engine/table.py:1447 msgid "Table" msgstr "" #: engine/table.py:1387 msgid "Switch to table input" msgstr "" #: engine/table.py:1395 msgid "Input mode" msgstr "入力モード" #: engine/table.py:1396 msgid "Switch Input mode" msgstr "" #: engine/table.py:1405 engine/table.py:1426 #: setup/ibus-table-preferences.ui:98 setup/ibus-table-preferences.ui:112 #: setup/ibus-table-preferences.ui:182 setup/ibus-table-preferences.ui:196 msgid "Half" msgstr "" #: engine/table.py:1406 msgid "Switch to halfwidth letters" msgstr "" #: engine/table.py:1411 engine/table.py:1432 #: setup/ibus-table-preferences.ui:101 setup/ibus-table-preferences.ui:115 #: setup/ibus-table-preferences.ui:185 setup/ibus-table-preferences.ui:199 msgid "Full" msgstr "" #: engine/table.py:1412 msgid "Switch to fullwidth letters" msgstr "" #: engine/table.py:1416 msgid "Letter width" msgstr "" #: engine/table.py:1417 msgid "Switch letter width" msgstr "" #: engine/table.py:1427 msgid "Switch to halfwidth punctuation" msgstr "" #: engine/table.py:1433 msgid "Switch to fullwidth punctuation" msgstr "" #: engine/table.py:1437 msgid "Punctuation width" msgstr "" #: engine/table.py:1438 msgid "Switch punctuation width" msgstr "" #: engine/table.py:1448 msgid "Switch to table mode" msgstr "" #: engine/table.py:1453 msgid "Pinyin" msgstr "" #: engine/table.py:1454 msgid "Switch to pinyin mode" msgstr "" #: engine/table.py:1458 msgid "Pinyin mode" msgstr "" #: engine/table.py:1459 msgid "Switch pinyin mode" msgstr "" #: engine/table.py:1468 msgid "Multiple character match" msgstr "" #: engine/table.py:1469 msgid "Switch to matching multiple characters at once" msgstr "" #: engine/table.py:1474 msgid "Single character match" msgstr "" #: engine/table.py:1475 msgid "Switch to matching only single characters" msgstr "" #: engine/table.py:1479 msgid "Onechar mode" msgstr "" #: engine/table.py:1480 msgid "Switch onechar mode" msgstr "" #: engine/table.py:1489 setup/ibus-table-preferences.ui:33 msgid "Normal" msgstr "" #: engine/table.py:1490 msgid "" "Switch to normal commit mode (automatic commits go into the preedit instead " "of into the application. This enables automatic definitions of new shortcuts)" msgstr "" #: engine/table.py:1496 msgid "" "Switch to direct commit mode (automatic commits go directly into the " "application)" msgstr "" #: engine/table.py:1500 msgid "Auto commit mode" msgstr "" #: engine/table.py:1501 msgid "Switch autocommit mode" msgstr "" #: engine/table.py:1743 msgid "Setup" msgstr "設定" #: engine/table.py:1745 #, python-format msgid "Configure ibus-table “%(engine-name)s”" msgstr "" #: setup/main.py:125 msgid "IBUS_ENGINE_NAME environment variable is not set." msgstr "" #: setup/main.py:129 msgid "Cannot determine the engine name. Please use the --engine-name option." msgstr "" #: setup/main.py:143 #, python-format msgid "IBus Table engine %s is not available" msgstr "" #: setup/main.py:271 #, python-format msgid "IBus Table %s Preferences" msgstr "" #: setup/ibus-table-preferences.ui:19 setup/ibus-table-preferences.ui:47 #: setup/ibus-table-preferences.ui:61 msgid "No" msgstr "" #: setup/ibus-table-preferences.ui:22 setup/ibus-table-preferences.ui:50 #: setup/ibus-table-preferences.ui:64 msgid "Yes" msgstr "" #: setup/ibus-table-preferences.ui:81 msgid "Simplified Chinese before traditional" msgstr "" #: setup/ibus-table-preferences.ui:84 msgid "Traditional Chinese before simplified" msgstr "" #: setup/ibus-table-preferences.ui:126 msgid "Direct input" msgstr "" #: setup/ibus-table-preferences.ui:129 msgid "Table input" msgstr "" #: setup/ibus-table-preferences.ui:140 msgid "Horizontal" msgstr "" #: setup/ibus-table-preferences.ui:143 msgid "Vertical" msgstr "" #: setup/ibus-table-preferences.ui:154 msgid "Phrase" msgstr "" #: setup/ibus-table-preferences.ui:157 msgid "Single Char" msgstr "" #: setup/ibus-table-preferences.ui:168 msgid "Commit" msgstr "" #: setup/ibus-table-preferences.ui:171 msgid "Next Page" msgstr "" #: setup/ibus-table-preferences.ui:223 msgid "Restore all defaults" msgstr "" #: setup/ibus-table-preferences.ui:227 msgid "Restore defaults as specified in the database for this engine." msgstr "" #: setup/ibus-table-preferences.ui:302 msgid "Input mode:" msgstr "" #: setup/ibus-table-preferences.ui:315 msgid "" "“Simplified Chinese” shows only characters \n" "used in simplified Chinese. “Traditional Chinese”\n" "shows only characters used in traditional Chinese.\n" "“Simplified Chinese before traditional” shows all\n" "characters but puts the simplified characters higher\n" "up in the candidate list. “Traditional Chinese before\n" "simplified” puts the traditional characters higher up\n" "in the candidate list. “All characters” just shows all\n" "matches without any particular filtering on traditional\n" "versus simplified Chinese." msgstr "" #: setup/ibus-table-preferences.ui:340 msgid "" "Whether to use fullwidth or halfwidth\n" "letters in table input mode." msgstr "" #: setup/ibus-table-preferences.ui:357 msgid "" "Whether to use fullwidth or halfwidth\n" "punctuation in table input mode." msgstr "" #: setup/ibus-table-preferences.ui:374 msgid "" "Whether to use fullwidth or halfwidth\n" "letters in direct input mode." msgstr "" #: setup/ibus-table-preferences.ui:391 msgid "" "Whether to use fullwidth or halfwidth\n" "punctuation in direct input mode." msgstr "" #: setup/ibus-table-preferences.ui:411 msgid "Chinese mode:" msgstr "" #: setup/ibus-table-preferences.ui:427 msgid "Table input letter width:" msgstr "" #: setup/ibus-table-preferences.ui:443 msgid "Table input punctuation width:" msgstr "" #: setup/ibus-table-preferences.ui:459 msgid "Direct input letter width:" msgstr "" #: setup/ibus-table-preferences.ui:475 msgid "Direct input punctuation width:" msgstr "" #: setup/ibus-table-preferences.ui:488 msgid "" "“Direct input” is almost the same as if the\n" "input method were off, i.e. not used at all, most\n" "characters just get passed to the application.\n" "But some conversion between fullwidth and\n" "halfwidth may still happen in direct input mode.\n" "“Table input” means the input method is on." msgstr "" #: setup/ibus-table-preferences.ui:514 msgid "Inital state" msgstr "" #: setup/ibus-table-preferences.ui:551 msgid "" "Whether the lookup table showing the candidates\n" "should be vertical or horizontal." msgstr "" #: setup/ibus-table-preferences.ui:568 msgid "" "The maximum number of candidates in\n" "one page of the lookup table. You can switch\n" "pages in the lookup table using the page up/down\n" "keys or the arrow up/down keys." msgstr "" #: setup/ibus-table-preferences.ui:592 msgid "Orientation:" msgstr "" #: setup/ibus-table-preferences.ui:608 msgid "Page size:" msgstr "" #: setup/ibus-table-preferences.ui:624 msgid "Show candidate list" msgstr "" #: setup/ibus-table-preferences.ui:637 msgid "" "Whether candidate lists should be shown or hidden.\n" "For Chinese input methods one usually wants the\n" "candidate lists to be shown. But for some non-Chinese\n" "input methods like the Russian “translit”, hiding the\n" "candidate lists is better." msgstr "" #: setup/ibus-table-preferences.ui:661 msgid "Candidate list" msgstr "" #: setup/ibus-table-preferences.ui:681 msgid "Settings" msgstr "" #: setup/ibus-table-preferences.ui:724 msgid "" "If this is set to “single char”, only single\n" "character candidates will be shown. If it is\n" "set to “Phrase” candidates consisting of\n" "several characters may be shown." msgstr "" #: setup/ibus-table-preferences.ui:743 msgid "" "If set to “Yes”, this does the following 4 things:\n" "1) When typing “Return”, commit the \n" " candidate + line-feed\n" "2) When tying Tab, commit the candidate\n" "3) When committing using a commit key, commit\n" " the candidate + \" \"\n" "4) If typing the next character matches no candidates,\n" " commit the first candidate of the previous match.\n" " (Mostly needed for non-Chinese input methods like\n" " the Russian “translit”)" msgstr "" #: setup/ibus-table-preferences.ui:768 msgid "" "Committing with the commit keys or with the mouse\n" "always commits to the application. This option is about\n" "“automatic” commits which may happen when\n" "one just continues typing input without committing\n" "manually. From time to time, “automatic” commits will\n" "happen then.\n" "“Direct” means such “automatic” commits go directly\n" "into the application, “Normal” means they get committed\n" "to preëdit." msgstr "" #: setup/ibus-table-preferences.ui:792 msgid "" "If you choose the space key to do “Next page”,\n" " you can only commit using the selection keys\n" "(i.e. the labels in front of the candidates in the\n" "lookup table) or using the mouse." msgstr "" #: setup/ibus-table-preferences.ui:814 msgid "Compose:" msgstr "" #: setup/ibus-table-preferences.ui:830 msgid "Auto select:" msgstr "" #: setup/ibus-table-preferences.ui:846 msgid "Auto commit mode:" msgstr "" #: setup/ibus-table-preferences.ui:862 msgid "Behavior of space key:" msgstr "" #: setup/ibus-table-preferences.ui:878 msgid "Auto wildcard:" msgstr "" #: setup/ibus-table-preferences.ui:891 msgid "" "If yes, a multi wildcard will be automatically\n" "appended to the end of the input string." msgstr "" #: setup/ibus-table-preferences.ui:911 msgid "Single wildchard character:" msgstr "" #: setup/ibus-table-preferences.ui:924 msgid "" "The wildcard to match any single character.\n" "Type RETURN or ENTER to confirm after changing the wildcard." msgstr "" #: setup/ibus-table-preferences.ui:943 msgid "Multi wildcard character:" msgstr "" #: setup/ibus-table-preferences.ui:956 msgid "" "The wildcard used to match any number of characters.\n" "Type RETURN or ENTER to confirm after changing the wildcard." msgstr "" #: setup/ibus-table-preferences.ui:976 msgid "Details" msgstr "" #: setup/ibus-table-preferences.ui:999 msgid "Details" msgstr "" #: setup/ibus-table-preferences.ui:1055 msgid "Table input method for IBus" msgstr "" #: setup/ibus-table-preferences.ui:1087 msgid "" "\n" "Authors:\n" "Yuwei YU (‘acevery’)\n" "Peng Huang\n" "BYVoid\n" "Peng Wu\n" "\n" "Contributors:\n" "koterpilla\n" "Zerng07\n" "Caius ‘kaio’ Chance\n" "Mike FABIAN\n" "Bernard Nauwelaerts\n" "Xiaojun Ma\n" "mozbugbox\n" "Seán de Búrca\n" "" msgstr "" #: setup/ibus-table-preferences.ui:1186 msgid "About" msgstr "" ibus-table-1.9.1/po/zh_CN.po000066400000000000000000000374571241251735600155560ustar00rootroot00000000000000# IBus-Table Translation file: zh_CN.po # Copyright (C) YEAR Yu Yuwei # This file is distributed under the same license as the ibus-table package. # Yu Yuwei , 2008.09.05 # msgid "" msgstr "" "Project-Id-Version: 0.1.20080819\n" "Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n" "POT-Creation-Date: 2014-09-16 07:25+0200\n" "PO-Revision-Date: 2012-11-13 08:18+0100\n" "Last-Translator: Yu Yuwei \n" "Language-Team: Yu Yuwei \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: engine/table.py:1325 setup/ibus-table-preferences.ui:75 #, fuzzy msgid "Simplified Chinese" msgstr "简体模式" #: engine/table.py:1326 #, fuzzy msgid "Switch to “Simplified Chinese only”." msgstr "切换到简体模式" #: engine/table.py:1331 setup/ibus-table-preferences.ui:78 #, fuzzy msgid "Traditional Chinese" msgstr "繁体模式" #: engine/table.py:1332 #, fuzzy msgid "Switch to “Traditional Chinese only”." msgstr "切换到繁体模式" #: engine/table.py:1337 #, fuzzy msgid "Simplified Chinese first" msgstr "简体模式" #: engine/table.py:1338 #, fuzzy msgid "Switch to “Simplified Chinese before traditional”." msgstr "切换到简体模式" #: engine/table.py:1343 #, fuzzy msgid "Traditional Chinese first" msgstr "繁体模式" #: engine/table.py:1344 #, fuzzy msgid "Switch to “Traditional Chinese before simplified”." msgstr "切换到繁体模式" #: engine/table.py:1349 setup/ibus-table-preferences.ui:87 msgid "All Chinese characters" msgstr "" #: engine/table.py:1350 #, fuzzy msgid "Switch to “All Chinese characters”." msgstr "切换到繁体模式" #: engine/table.py:1354 #, fuzzy msgid "Chinese mode" msgstr "中文模式" #: engine/table.py:1355 #, fuzzy msgid "Switch Chinese mode" msgstr "中文模式" #: engine/table.py:1365 #, fuzzy msgid "English" msgstr "英文模式" #: engine/table.py:1366 msgid "Switch to English input" msgstr "" #: engine/table.py:1371 #, fuzzy msgid "Chinese" msgstr "中文模式" #: engine/table.py:1372 #, fuzzy msgid "Switch to Chinese input" msgstr "中文模式" #: engine/table.py:1380 engine/table.py:1495 #: setup/ibus-table-preferences.ui:36 msgid "Direct" msgstr "" #: engine/table.py:1381 #, fuzzy msgid "Switch to direct input" msgstr "切换到拼音反查模式" #: engine/table.py:1386 engine/table.py:1447 #, fuzzy msgid "Table" msgstr "形码模式" #: engine/table.py:1387 #, fuzzy msgid "Switch to table input" msgstr "切换到形码模式" #: engine/table.py:1395 #, fuzzy msgid "Input mode" msgstr "直接提交模式" #: engine/table.py:1396 #, fuzzy msgid "Switch Input mode" msgstr "直接提交模式" #: engine/table.py:1405 engine/table.py:1426 #: setup/ibus-table-preferences.ui:98 setup/ibus-table-preferences.ui:112 #: setup/ibus-table-preferences.ui:182 setup/ibus-table-preferences.ui:196 msgid "Half" msgstr "" #: engine/table.py:1406 #, fuzzy msgid "Switch to halfwidth letters" msgstr "半角字符" #: engine/table.py:1411 engine/table.py:1432 #: setup/ibus-table-preferences.ui:101 setup/ibus-table-preferences.ui:115 #: setup/ibus-table-preferences.ui:185 setup/ibus-table-preferences.ui:199 msgid "Full" msgstr "" #: engine/table.py:1412 #, fuzzy msgid "Switch to fullwidth letters" msgstr "全角字符" #: engine/table.py:1416 msgid "Letter width" msgstr "" #: engine/table.py:1417 #, fuzzy msgid "Switch letter width" msgstr "全角字符" #: engine/table.py:1427 #, fuzzy msgid "Switch to halfwidth punctuation" msgstr "切换到半角标点" #: engine/table.py:1433 #, fuzzy msgid "Switch to fullwidth punctuation" msgstr "切换到全角标点" #: engine/table.py:1437 msgid "Punctuation width" msgstr "" #: engine/table.py:1438 #, fuzzy msgid "Switch punctuation width" msgstr "全角标点" #: engine/table.py:1448 #, fuzzy msgid "Switch to table mode" msgstr "切换到形码模式" #: engine/table.py:1453 msgid "Pinyin" msgstr "" #: engine/table.py:1454 #, fuzzy msgid "Switch to pinyin mode" msgstr "切换到英文模式" #: engine/table.py:1458 #, fuzzy msgid "Pinyin mode" msgstr "切换到英文模式" #: engine/table.py:1459 msgid "Switch pinyin mode" msgstr "" #: engine/table.py:1468 msgid "Multiple character match" msgstr "" #: engine/table.py:1469 #, fuzzy msgid "Switch to matching multiple characters at once" msgstr "切换到单字模式" #: engine/table.py:1474 #, fuzzy msgid "Single character match" msgstr "单字模式" #: engine/table.py:1475 msgid "Switch to matching only single characters" msgstr "" #: engine/table.py:1479 #, fuzzy msgid "Onechar mode" msgstr "词组模式" #: engine/table.py:1480 msgid "Switch onechar mode" msgstr "" #: engine/table.py:1489 setup/ibus-table-preferences.ui:33 msgid "Normal" msgstr "" #: engine/table.py:1490 msgid "" "Switch to normal commit mode (automatic commits go into the preedit instead " "of into the application. This enables automatic definitions of new shortcuts)" msgstr "" #: engine/table.py:1496 msgid "" "Switch to direct commit mode (automatic commits go directly into the " "application)" msgstr "" #: engine/table.py:1500 #, fuzzy msgid "Auto commit mode" msgstr "直接提交模式" #: engine/table.py:1501 #, fuzzy msgid "Switch autocommit mode" msgstr "切换到直接提交模式" #: engine/table.py:1743 msgid "Setup" msgstr "" #: engine/table.py:1745 #, python-format msgid "Configure ibus-table “%(engine-name)s”" msgstr "" #: setup/main.py:125 msgid "IBUS_ENGINE_NAME environment variable is not set." msgstr "" #: setup/main.py:129 msgid "Cannot determine the engine name. Please use the --engine-name option." msgstr "" #: setup/main.py:143 #, python-format msgid "IBus Table engine %s is not available" msgstr "" #: setup/main.py:271 #, python-format msgid "IBus Table %s Preferences" msgstr "" #: setup/ibus-table-preferences.ui:19 setup/ibus-table-preferences.ui:47 #: setup/ibus-table-preferences.ui:61 msgid "No" msgstr "" #: setup/ibus-table-preferences.ui:22 setup/ibus-table-preferences.ui:50 #: setup/ibus-table-preferences.ui:64 msgid "Yes" msgstr "" #: setup/ibus-table-preferences.ui:81 #, fuzzy msgid "Simplified Chinese before traditional" msgstr "简体模式" #: setup/ibus-table-preferences.ui:84 #, fuzzy msgid "Traditional Chinese before simplified" msgstr "繁体模式" #: setup/ibus-table-preferences.ui:126 #, fuzzy msgid "Direct input" msgstr "直接提交模式" #: setup/ibus-table-preferences.ui:129 msgid "Table input" msgstr "" #: setup/ibus-table-preferences.ui:140 msgid "Horizontal" msgstr "" #: setup/ibus-table-preferences.ui:143 msgid "Vertical" msgstr "" #: setup/ibus-table-preferences.ui:154 #, fuzzy msgid "Phrase" msgstr "词组模式" #: setup/ibus-table-preferences.ui:157 #, fuzzy msgid "Single Char" msgstr "单字模式" #: setup/ibus-table-preferences.ui:168 msgid "Commit" msgstr "" #: setup/ibus-table-preferences.ui:171 msgid "Next Page" msgstr "" #: setup/ibus-table-preferences.ui:223 msgid "Restore all defaults" msgstr "" #: setup/ibus-table-preferences.ui:227 msgid "Restore defaults as specified in the database for this engine." msgstr "" #: setup/ibus-table-preferences.ui:302 #, fuzzy msgid "Input mode:" msgstr "直接提交模式" #: setup/ibus-table-preferences.ui:315 msgid "" "“Simplified Chinese” shows only characters \n" "used in simplified Chinese. “Traditional Chinese”\n" "shows only characters used in traditional Chinese.\n" "“Simplified Chinese before traditional” shows all\n" "characters but puts the simplified characters higher\n" "up in the candidate list. “Traditional Chinese before\n" "simplified” puts the traditional characters higher up\n" "in the candidate list. “All characters” just shows all\n" "matches without any particular filtering on traditional\n" "versus simplified Chinese." msgstr "" #: setup/ibus-table-preferences.ui:340 msgid "" "Whether to use fullwidth or halfwidth\n" "letters in table input mode." msgstr "" #: setup/ibus-table-preferences.ui:357 msgid "" "Whether to use fullwidth or halfwidth\n" "punctuation in table input mode." msgstr "" #: setup/ibus-table-preferences.ui:374 msgid "" "Whether to use fullwidth or halfwidth\n" "letters in direct input mode." msgstr "" #: setup/ibus-table-preferences.ui:391 msgid "" "Whether to use fullwidth or halfwidth\n" "punctuation in direct input mode." msgstr "" #: setup/ibus-table-preferences.ui:411 #, fuzzy msgid "Chinese mode:" msgstr "中文模式" #: setup/ibus-table-preferences.ui:427 msgid "Table input letter width:" msgstr "" #: setup/ibus-table-preferences.ui:443 msgid "Table input punctuation width:" msgstr "" #: setup/ibus-table-preferences.ui:459 msgid "Direct input letter width:" msgstr "" #: setup/ibus-table-preferences.ui:475 msgid "Direct input punctuation width:" msgstr "" #: setup/ibus-table-preferences.ui:488 msgid "" "“Direct input” is almost the same as if the\n" "input method were off, i.e. not used at all, most\n" "characters just get passed to the application.\n" "But some conversion between fullwidth and\n" "halfwidth may still happen in direct input mode.\n" "“Table input” means the input method is on." msgstr "" #: setup/ibus-table-preferences.ui:514 msgid "Inital state" msgstr "" #: setup/ibus-table-preferences.ui:551 msgid "" "Whether the lookup table showing the candidates\n" "should be vertical or horizontal." msgstr "" #: setup/ibus-table-preferences.ui:568 msgid "" "The maximum number of candidates in\n" "one page of the lookup table. You can switch\n" "pages in the lookup table using the page up/down\n" "keys or the arrow up/down keys." msgstr "" #: setup/ibus-table-preferences.ui:592 msgid "Orientation:" msgstr "" #: setup/ibus-table-preferences.ui:608 msgid "Page size:" msgstr "" #: setup/ibus-table-preferences.ui:624 msgid "Show candidate list" msgstr "" #: setup/ibus-table-preferences.ui:637 msgid "" "Whether candidate lists should be shown or hidden.\n" "For Chinese input methods one usually wants the\n" "candidate lists to be shown. But for some non-Chinese\n" "input methods like the Russian “translit”, hiding the\n" "candidate lists is better." msgstr "" #: setup/ibus-table-preferences.ui:661 msgid "Candidate list" msgstr "" #: setup/ibus-table-preferences.ui:681 msgid "Settings" msgstr "" #: setup/ibus-table-preferences.ui:724 msgid "" "If this is set to “single char”, only single\n" "character candidates will be shown. If it is\n" "set to “Phrase” candidates consisting of\n" "several characters may be shown." msgstr "" #: setup/ibus-table-preferences.ui:743 msgid "" "If set to “Yes”, this does the following 4 things:\n" "1) When typing “Return”, commit the \n" " candidate + line-feed\n" "2) When tying Tab, commit the candidate\n" "3) When committing using a commit key, commit\n" " the candidate + \" \"\n" "4) If typing the next character matches no candidates,\n" " commit the first candidate of the previous match.\n" " (Mostly needed for non-Chinese input methods like\n" " the Russian “translit”)" msgstr "" #: setup/ibus-table-preferences.ui:768 msgid "" "Committing with the commit keys or with the mouse\n" "always commits to the application. This option is about\n" "“automatic” commits which may happen when\n" "one just continues typing input without committing\n" "manually. From time to time, “automatic” commits will\n" "happen then.\n" "“Direct” means such “automatic” commits go directly\n" "into the application, “Normal” means they get committed\n" "to preëdit." msgstr "" #: setup/ibus-table-preferences.ui:792 msgid "" "If you choose the space key to do “Next page”,\n" " you can only commit using the selection keys\n" "(i.e. the labels in front of the candidates in the\n" "lookup table) or using the mouse." msgstr "" #: setup/ibus-table-preferences.ui:814 msgid "Compose:" msgstr "" #: setup/ibus-table-preferences.ui:830 msgid "Auto select:" msgstr "" #: setup/ibus-table-preferences.ui:846 #, fuzzy msgid "Auto commit mode:" msgstr "直接提交模式" #: setup/ibus-table-preferences.ui:862 msgid "Behavior of space key:" msgstr "" #: setup/ibus-table-preferences.ui:878 msgid "Auto wildcard:" msgstr "" #: setup/ibus-table-preferences.ui:891 msgid "" "If yes, a multi wildcard will be automatically\n" "appended to the end of the input string." msgstr "" #: setup/ibus-table-preferences.ui:911 #, fuzzy msgid "Single wildchard character:" msgstr "单字模式" #: setup/ibus-table-preferences.ui:924 msgid "" "The wildcard to match any single character.\n" "Type RETURN or ENTER to confirm after changing the wildcard." msgstr "" #: setup/ibus-table-preferences.ui:943 msgid "Multi wildcard character:" msgstr "" #: setup/ibus-table-preferences.ui:956 msgid "" "The wildcard used to match any number of characters.\n" "Type RETURN or ENTER to confirm after changing the wildcard." msgstr "" #: setup/ibus-table-preferences.ui:976 msgid "Details" msgstr "" #: setup/ibus-table-preferences.ui:999 msgid "Details" msgstr "" #: setup/ibus-table-preferences.ui:1055 msgid "Table input method for IBus" msgstr "" #: setup/ibus-table-preferences.ui:1087 msgid "" "\n" "Authors:\n" "Yuwei YU (‘acevery’)\n" "Peng Huang\n" "BYVoid\n" "Peng Wu\n" "\n" "Contributors:\n" "koterpilla\n" "Zerng07\n" "Caius ‘kaio’ Chance\n" "Mike FABIAN\n" "Bernard Nauwelaerts\n" "Xiaojun Ma\n" "mozbugbox\n" "Seán de Búrca\n" "" msgstr "" #: setup/ibus-table-preferences.ui:1186 msgid "About" msgstr "" #, fuzzy #~ msgid "Chinese input (Left Shift)" #~ msgstr "切换到拼音反查模式" #, fuzzy #~ msgid "Direct input (Left Shift)" #~ msgstr "切换到拼音反查模式" #, fuzzy #~ msgid "Switch to “Chinese input” (Left Shift)" #~ msgstr "切换到拼音反查模式" #, fuzzy #~ msgid "Fullwidth letters (Shift-Space)" #~ msgstr "切换到全角字符" #, fuzzy #~ msgid "Switch to “Halfwidth letters” (Shift-Space)" #~ msgstr "切换到半角字符" #, fuzzy #~ msgid "Halfwidth letters (Shift-Space)" #~ msgstr "切换到半角字符" #, fuzzy #~ msgid "Switch to “Fullwidth letters” (Shift-Space)" #~ msgstr "切换到全角字符" #, fuzzy #~ msgid "Halfwidth punctuation (Ctrl-.)" #~ msgstr "半角标点" #, fuzzy #~ msgid "Table mode (Right Shift)" #~ msgstr "切换到形码模式" #, fuzzy #~ msgid "Switch to “Phrase mode” (Ctrl-,)" #~ msgstr "切换到词组模式" #, fuzzy #~ msgid "Phrase mode (Ctrl-,)" #~ msgstr "切换到词组模式" #, fuzzy #~ msgid "Direct commit mode (Ctrl-/)" #~ msgstr "直接提交模式" #, fuzzy #~ msgid "Switch to “Normal commit mode” (uses space to commit) (Ctrl-/)" #~ msgstr "切换到普通提交模式,即用空格键提交" #, fuzzy #~ msgid "Normal commit mode (Ctrl-/)" #~ msgstr "普通提交模式" #, fuzzy #~ msgid "Simplified Chinese (Ctrl-;)" #~ msgstr "简体模式" #, fuzzy #~ msgid "Traditional Chinese (Ctrl-;)" #~ msgstr "繁体模式" #, fuzzy #~ msgid "Simplified Chinese before traditional (Ctrl-;)" #~ msgstr "简体模式" #, fuzzy #~ msgid "Traditional Chinese before simplified (Ctrl-;)" #~ msgstr "繁体模式" #, fuzzy #~ msgid "All Chinese characters (Ctrl-;)" #~ msgstr "切换到繁体模式" #~ msgid "English Mode" #~ msgstr "英文模式" #~ msgid "PinYin Mode" #~ msgstr "拼音反查模式" #, fuzzy #~ msgid "Switch to Simplify Chinese first Big Charset Mode - Ctrl-;" #~ msgstr "切换到简体优先的大字集模式" #~ msgid "Simplified Chinese First Big Charset Mode" #~ msgstr "简体优先的大字集模式" #, fuzzy #~ msgid "Switch to Traditional Chinese first Big Charset Mode - Ctrl-;" #~ msgstr "切换到繁体优先的大字集模式" #~ msgid "Traditional Chinese First Big Charset Mode" #~ msgstr "繁体优先的大字集模式" #, fuzzy #~ msgid "Switch to Big Charset Mode - Ctrl-;" #~ msgstr "切换到大字集模式" #~ msgid "Big Chinese Mode" #~ msgstr "大字集模式" #~ msgid "CN" #~ msgstr "中" #~ msgid "EN" #~ msgstr "英" ibus-table-1.9.1/po/zh_HK.po000066400000000000000000000413461241251735600155500ustar00rootroot00000000000000# IBus-Table Translation file: zh_TW.po # Copyright (C) 2009 Caius 'kaio' Chance # This file is distributed under the same license as the ibus-table package. # Caius 'kaio' Chance , 2009.05.21 # msgid "" msgstr "" "Project-Id-Version: 0.1.20080819\n" "Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n" "POT-Creation-Date: 2014-09-16 07:25+0200\n" "PO-Revision-Date: 2009-05-21 13:17+1000\n" "Last-Translator: Caius 'kaio' Chance \n" "Language-Team: Caius 'kaio' Chance \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: engine/table.py:1325 setup/ibus-table-preferences.ui:75 #, fuzzy msgid "Simplified Chinese" msgstr "切換成簡體模式" #: engine/table.py:1326 #, fuzzy msgid "Switch to “Simplified Chinese only”." msgstr "切換成簡體模式" #: engine/table.py:1331 setup/ibus-table-preferences.ui:78 #, fuzzy msgid "Traditional Chinese" msgstr "切換成繁體模式" #: engine/table.py:1332 #, fuzzy msgid "Switch to “Traditional Chinese only”." msgstr "切換成繁體模式" #: engine/table.py:1337 #, fuzzy msgid "Simplified Chinese first" msgstr "切換成簡體模式" #: engine/table.py:1338 #, fuzzy msgid "Switch to “Simplified Chinese before traditional”." msgstr "切換成簡體模式" #: engine/table.py:1343 #, fuzzy msgid "Traditional Chinese first" msgstr "切換成繁體模式" #: engine/table.py:1344 #, fuzzy msgid "Switch to “Traditional Chinese before simplified”." msgstr "切換成繁體模式" #: engine/table.py:1349 setup/ibus-table-preferences.ui:87 msgid "All Chinese characters" msgstr "" #: engine/table.py:1350 #, fuzzy msgid "Switch to “All Chinese characters”." msgstr "切換成繁體模式" #: engine/table.py:1354 #, fuzzy msgid "Chinese mode" msgstr "切換到大字集模式(預設結果順序)" #: engine/table.py:1355 #, fuzzy msgid "Switch Chinese mode" msgstr "切換到大字集模式(預設結果順序)" #: engine/table.py:1365 #, fuzzy msgid "English" msgstr "切換到中文模式" #: engine/table.py:1366 msgid "Switch to English input" msgstr "" #: engine/table.py:1371 #, fuzzy msgid "Chinese" msgstr "切換到大字集模式(預設結果順序)" #: engine/table.py:1372 #, fuzzy msgid "Switch to Chinese input" msgstr "切換到大字集模式(預設結果順序)" #: engine/table.py:1380 engine/table.py:1495 #: setup/ibus-table-preferences.ui:36 msgid "Direct" msgstr "" #: engine/table.py:1381 #, fuzzy msgid "Switch to direct input" msgstr "切換成拼音反查模式" #: engine/table.py:1386 engine/table.py:1447 #, fuzzy msgid "Table" msgstr "切換成形碼模式" #: engine/table.py:1387 #, fuzzy msgid "Switch to table input" msgstr "切換成形碼模式" #: engine/table.py:1395 #, fuzzy msgid "Input mode" msgstr "切換成直接輸出模式,亦即單項結果即時輸出" #: engine/table.py:1396 #, fuzzy msgid "Switch Input mode" msgstr "切換成直接輸出模式,亦即單項結果即時輸出" #: engine/table.py:1405 engine/table.py:1426 #: setup/ibus-table-preferences.ui:98 setup/ibus-table-preferences.ui:112 #: setup/ibus-table-preferences.ui:182 setup/ibus-table-preferences.ui:196 msgid "Half" msgstr "" #: engine/table.py:1406 #, fuzzy msgid "Switch to halfwidth letters" msgstr "切換成半形標點" #: engine/table.py:1411 engine/table.py:1432 #: setup/ibus-table-preferences.ui:101 setup/ibus-table-preferences.ui:115 #: setup/ibus-table-preferences.ui:185 setup/ibus-table-preferences.ui:199 msgid "Full" msgstr "" #: engine/table.py:1412 #, fuzzy msgid "Switch to fullwidth letters" msgstr "切換成全形標點" #: engine/table.py:1416 msgid "Letter width" msgstr "" #: engine/table.py:1417 #, fuzzy msgid "Switch letter width" msgstr "切換成全形標點" #: engine/table.py:1427 #, fuzzy msgid "Switch to halfwidth punctuation" msgstr "切換成半形標點" #: engine/table.py:1433 #, fuzzy msgid "Switch to fullwidth punctuation" msgstr "切換成全形標點" #: engine/table.py:1437 msgid "Punctuation width" msgstr "" #: engine/table.py:1438 #, fuzzy msgid "Switch punctuation width" msgstr "切換成全形標點" #: engine/table.py:1448 #, fuzzy msgid "Switch to table mode" msgstr "切換成形碼模式" #: engine/table.py:1453 msgid "Pinyin" msgstr "" #: engine/table.py:1454 #, fuzzy msgid "Switch to pinyin mode" msgstr "切換到中文模式" #: engine/table.py:1458 #, fuzzy msgid "Pinyin mode" msgstr "切換到中文模式" #: engine/table.py:1459 msgid "Switch pinyin mode" msgstr "" #: engine/table.py:1468 msgid "Multiple character match" msgstr "" #: engine/table.py:1469 #, fuzzy msgid "Switch to matching multiple characters at once" msgstr "切換成單字元模式" #: engine/table.py:1474 #, fuzzy msgid "Single character match" msgstr "切換成單字元模式" #: engine/table.py:1475 msgid "Switch to matching only single characters" msgstr "" #: engine/table.py:1479 #, fuzzy msgid "Onechar mode" msgstr "切換到大字集模式(預設結果順序)" #: engine/table.py:1480 msgid "Switch onechar mode" msgstr "" #: engine/table.py:1489 setup/ibus-table-preferences.ui:33 msgid "Normal" msgstr "" #: engine/table.py:1490 msgid "" "Switch to normal commit mode (automatic commits go into the preedit instead " "of into the application. This enables automatic definitions of new shortcuts)" msgstr "" #: engine/table.py:1496 msgid "" "Switch to direct commit mode (automatic commits go directly into the " "application)" msgstr "" #: engine/table.py:1500 #, fuzzy msgid "Auto commit mode" msgstr "切換成直接輸出模式,亦即單項結果即時輸出" #: engine/table.py:1501 #, fuzzy msgid "Switch autocommit mode" msgstr "切換成直接輸出模式,亦即單項結果即時輸出" #: engine/table.py:1743 msgid "Setup" msgstr "" #: engine/table.py:1745 #, python-format msgid "Configure ibus-table “%(engine-name)s”" msgstr "" #: setup/main.py:125 msgid "IBUS_ENGINE_NAME environment variable is not set." msgstr "" #: setup/main.py:129 msgid "Cannot determine the engine name. Please use the --engine-name option." msgstr "" #: setup/main.py:143 #, python-format msgid "IBus Table engine %s is not available" msgstr "" #: setup/main.py:271 #, python-format msgid "IBus Table %s Preferences" msgstr "" #: setup/ibus-table-preferences.ui:19 setup/ibus-table-preferences.ui:47 #: setup/ibus-table-preferences.ui:61 msgid "No" msgstr "" #: setup/ibus-table-preferences.ui:22 setup/ibus-table-preferences.ui:50 #: setup/ibus-table-preferences.ui:64 msgid "Yes" msgstr "" #: setup/ibus-table-preferences.ui:81 #, fuzzy msgid "Simplified Chinese before traditional" msgstr "切換成簡體模式" #: setup/ibus-table-preferences.ui:84 #, fuzzy msgid "Traditional Chinese before simplified" msgstr "切換成繁體模式" #: setup/ibus-table-preferences.ui:126 #, fuzzy msgid "Direct input" msgstr "切換成直接輸出模式,亦即單項結果即時輸出" #: setup/ibus-table-preferences.ui:129 msgid "Table input" msgstr "" #: setup/ibus-table-preferences.ui:140 msgid "Horizontal" msgstr "" #: setup/ibus-table-preferences.ui:143 msgid "Vertical" msgstr "" #: setup/ibus-table-preferences.ui:154 msgid "Phrase" msgstr "" #: setup/ibus-table-preferences.ui:157 #, fuzzy msgid "Single Char" msgstr "切換成單字元模式" #: setup/ibus-table-preferences.ui:168 msgid "Commit" msgstr "" #: setup/ibus-table-preferences.ui:171 msgid "Next Page" msgstr "" #: setup/ibus-table-preferences.ui:223 msgid "Restore all defaults" msgstr "" #: setup/ibus-table-preferences.ui:227 msgid "Restore defaults as specified in the database for this engine." msgstr "" #: setup/ibus-table-preferences.ui:302 #, fuzzy msgid "Input mode:" msgstr "切換成直接輸出模式,亦即單項結果即時輸出" #: setup/ibus-table-preferences.ui:315 msgid "" "“Simplified Chinese” shows only characters \n" "used in simplified Chinese. “Traditional Chinese”\n" "shows only characters used in traditional Chinese.\n" "“Simplified Chinese before traditional” shows all\n" "characters but puts the simplified characters higher\n" "up in the candidate list. “Traditional Chinese before\n" "simplified” puts the traditional characters higher up\n" "in the candidate list. “All characters” just shows all\n" "matches without any particular filtering on traditional\n" "versus simplified Chinese." msgstr "" #: setup/ibus-table-preferences.ui:340 msgid "" "Whether to use fullwidth or halfwidth\n" "letters in table input mode." msgstr "" #: setup/ibus-table-preferences.ui:357 msgid "" "Whether to use fullwidth or halfwidth\n" "punctuation in table input mode." msgstr "" #: setup/ibus-table-preferences.ui:374 msgid "" "Whether to use fullwidth or halfwidth\n" "letters in direct input mode." msgstr "" #: setup/ibus-table-preferences.ui:391 msgid "" "Whether to use fullwidth or halfwidth\n" "punctuation in direct input mode." msgstr "" #: setup/ibus-table-preferences.ui:411 #, fuzzy msgid "Chinese mode:" msgstr "切換到大字集模式(預設結果順序)" #: setup/ibus-table-preferences.ui:427 msgid "Table input letter width:" msgstr "" #: setup/ibus-table-preferences.ui:443 msgid "Table input punctuation width:" msgstr "" #: setup/ibus-table-preferences.ui:459 msgid "Direct input letter width:" msgstr "" #: setup/ibus-table-preferences.ui:475 msgid "Direct input punctuation width:" msgstr "" #: setup/ibus-table-preferences.ui:488 msgid "" "“Direct input” is almost the same as if the\n" "input method were off, i.e. not used at all, most\n" "characters just get passed to the application.\n" "But some conversion between fullwidth and\n" "halfwidth may still happen in direct input mode.\n" "“Table input” means the input method is on." msgstr "" #: setup/ibus-table-preferences.ui:514 msgid "Inital state" msgstr "" #: setup/ibus-table-preferences.ui:551 msgid "" "Whether the lookup table showing the candidates\n" "should be vertical or horizontal." msgstr "" #: setup/ibus-table-preferences.ui:568 msgid "" "The maximum number of candidates in\n" "one page of the lookup table. You can switch\n" "pages in the lookup table using the page up/down\n" "keys or the arrow up/down keys." msgstr "" #: setup/ibus-table-preferences.ui:592 msgid "Orientation:" msgstr "" #: setup/ibus-table-preferences.ui:608 msgid "Page size:" msgstr "" #: setup/ibus-table-preferences.ui:624 msgid "Show candidate list" msgstr "" #: setup/ibus-table-preferences.ui:637 msgid "" "Whether candidate lists should be shown or hidden.\n" "For Chinese input methods one usually wants the\n" "candidate lists to be shown. But for some non-Chinese\n" "input methods like the Russian “translit”, hiding the\n" "candidate lists is better." msgstr "" #: setup/ibus-table-preferences.ui:661 msgid "Candidate list" msgstr "" #: setup/ibus-table-preferences.ui:681 msgid "Settings" msgstr "" #: setup/ibus-table-preferences.ui:724 msgid "" "If this is set to “single char”, only single\n" "character candidates will be shown. If it is\n" "set to “Phrase” candidates consisting of\n" "several characters may be shown." msgstr "" #: setup/ibus-table-preferences.ui:743 msgid "" "If set to “Yes”, this does the following 4 things:\n" "1) When typing “Return”, commit the \n" " candidate + line-feed\n" "2) When tying Tab, commit the candidate\n" "3) When committing using a commit key, commit\n" " the candidate + \" \"\n" "4) If typing the next character matches no candidates,\n" " commit the first candidate of the previous match.\n" " (Mostly needed for non-Chinese input methods like\n" " the Russian “translit”)" msgstr "" #: setup/ibus-table-preferences.ui:768 msgid "" "Committing with the commit keys or with the mouse\n" "always commits to the application. This option is about\n" "“automatic” commits which may happen when\n" "one just continues typing input without committing\n" "manually. From time to time, “automatic” commits will\n" "happen then.\n" "“Direct” means such “automatic” commits go directly\n" "into the application, “Normal” means they get committed\n" "to preëdit." msgstr "" #: setup/ibus-table-preferences.ui:792 msgid "" "If you choose the space key to do “Next page”,\n" " you can only commit using the selection keys\n" "(i.e. the labels in front of the candidates in the\n" "lookup table) or using the mouse." msgstr "" #: setup/ibus-table-preferences.ui:814 msgid "Compose:" msgstr "" #: setup/ibus-table-preferences.ui:830 msgid "Auto select:" msgstr "" #: setup/ibus-table-preferences.ui:846 #, fuzzy msgid "Auto commit mode:" msgstr "切換成直接輸出模式,亦即單項結果即時輸出" #: setup/ibus-table-preferences.ui:862 msgid "Behavior of space key:" msgstr "" #: setup/ibus-table-preferences.ui:878 msgid "Auto wildcard:" msgstr "" #: setup/ibus-table-preferences.ui:891 msgid "" "If yes, a multi wildcard will be automatically\n" "appended to the end of the input string." msgstr "" #: setup/ibus-table-preferences.ui:911 #, fuzzy msgid "Single wildchard character:" msgstr "切換成單字元模式" #: setup/ibus-table-preferences.ui:924 msgid "" "The wildcard to match any single character.\n" "Type RETURN or ENTER to confirm after changing the wildcard." msgstr "" #: setup/ibus-table-preferences.ui:943 msgid "Multi wildcard character:" msgstr "" #: setup/ibus-table-preferences.ui:956 msgid "" "The wildcard used to match any number of characters.\n" "Type RETURN or ENTER to confirm after changing the wildcard." msgstr "" #: setup/ibus-table-preferences.ui:976 msgid "Details" msgstr "" #: setup/ibus-table-preferences.ui:999 msgid "Details" msgstr "" #: setup/ibus-table-preferences.ui:1055 msgid "Table input method for IBus" msgstr "" #: setup/ibus-table-preferences.ui:1087 msgid "" "\n" "Authors:\n" "Yuwei YU (‘acevery’)\n" "Peng Huang\n" "BYVoid\n" "Peng Wu\n" "\n" "Contributors:\n" "koterpilla\n" "Zerng07\n" "Caius ‘kaio’ Chance\n" "Mike FABIAN\n" "Bernard Nauwelaerts\n" "Xiaojun Ma\n" "mozbugbox\n" "Seán de Búrca\n" "" msgstr "" #: setup/ibus-table-preferences.ui:1186 msgid "About" msgstr "" #, fuzzy #~ msgid "Chinese input (Left Shift)" #~ msgstr "切換成拼音反查模式" #, fuzzy #~ msgid "Direct input (Left Shift)" #~ msgstr "切換成拼音反查模式" #, fuzzy #~ msgid "Switch to “Chinese input” (Left Shift)" #~ msgstr "切換成拼音反查模式" #, fuzzy #~ msgid "Fullwidth letters (Shift-Space)" #~ msgstr "切換成全形字元" #, fuzzy #~ msgid "Switch to “Halfwidth letters” (Shift-Space)" #~ msgstr "切換成半形字元" #, fuzzy #~ msgid "Halfwidth letters (Shift-Space)" #~ msgstr "切換成半形字元" #, fuzzy #~ msgid "Switch to “Fullwidth letters” (Shift-Space)" #~ msgstr "切換成全形字元" #, fuzzy #~ msgid "Halfwidth punctuation (Ctrl-.)" #~ msgstr "切換成半形標點" #, fuzzy #~ msgid "Table mode (Right Shift)" #~ msgstr "切換成形碼模式" #, fuzzy #~ msgid "Switch to “Phrase mode” (Ctrl-,)" #~ msgstr "切換成詞組模式" #, fuzzy #~ msgid "Phrase mode (Ctrl-,)" #~ msgstr "切換成詞組模式" #, fuzzy #~ msgid "Direct commit mode (Ctrl-/)" #~ msgstr "切換成直接輸出模式,亦即單項結果即時輸出" #, fuzzy #~ msgid "Switch to “Normal commit mode” (uses space to commit) (Ctrl-/)" #~ msgstr "切換成標準輸出模式,亦即按空格鍵執行輸出" #, fuzzy #~ msgid "Normal commit mode (Ctrl-/)" #~ msgstr "切換成直接輸出模式,亦即單項結果即時輸出" #, fuzzy #~ msgid "Simplified Chinese (Ctrl-;)" #~ msgstr "切換成簡體模式" #, fuzzy #~ msgid "Traditional Chinese (Ctrl-;)" #~ msgstr "切換成繁體模式" #, fuzzy #~ msgid "Simplified Chinese before traditional (Ctrl-;)" #~ msgstr "切換成簡體模式" #, fuzzy #~ msgid "Traditional Chinese before simplified (Ctrl-;)" #~ msgstr "切換成繁體模式" #, fuzzy #~ msgid "All Chinese characters (Ctrl-;)" #~ msgstr "切換成繁體模式" #, fuzzy #~ msgid "English Mode" #~ msgstr "切換到中文模式" #, fuzzy #~ msgid "PinYin Mode" #~ msgstr "切換成拼音反查模式" #, fuzzy #~ msgid "Switch to Simplify Chinese first Big Charset Mode - Ctrl-;" #~ msgstr "切換成大字集模式(簡體結果優先)" #, fuzzy #~ msgid "Simplified Chinese First Big Charset Mode" #~ msgstr "切換成大字集模式(簡體結果優先)" #, fuzzy #~ msgid "Switch to Traditional Chinese first Big Charset Mode - Ctrl-;" #~ msgstr "切換成大字集模式(繁體結果優先)" #, fuzzy #~ msgid "Traditional Chinese First Big Charset Mode" #~ msgstr "切換成大字集模式(繁體結果優先)" #, fuzzy #~ msgid "Switch to Big Charset Mode - Ctrl-;" #~ msgstr "切換到大字集模式(預設結果順序)" #, fuzzy #~ msgid "Big Chinese Mode" #~ msgstr "切換到大字集模式(預設結果順序)" #~ msgid "CN" #~ msgstr "中" #~ msgid "EN" #~ msgstr "英" ibus-table-1.9.1/po/zh_TW.po000066400000000000000000000402541241251735600155750ustar00rootroot00000000000000# IBus-Table Translation file: zh_TW.po # Copyright (C) 2009 Caius 'kaio' Chance # This file is distributed under the same license as the ibus-table package. # Caius 'kaio' Chance , 2009.05.21 # msgid "" msgstr "" "Project-Id-Version: 0.1.20080819\n" "Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n" "POT-Creation-Date: 2014-09-16 07:25+0200\n" "PO-Revision-Date: 2012-11-13 08:31+0100\n" "Last-Translator: Caius 'kaio' Chance \n" "Language-Team: Caius 'kaio' Chance \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: engine/table.py:1325 setup/ibus-table-preferences.ui:75 #, fuzzy msgid "Simplified Chinese" msgstr "簡體模式" #: engine/table.py:1326 #, fuzzy msgid "Switch to “Simplified Chinese only”." msgstr "切換成簡體模式" #: engine/table.py:1331 setup/ibus-table-preferences.ui:78 #, fuzzy msgid "Traditional Chinese" msgstr "繁體模式" #: engine/table.py:1332 #, fuzzy msgid "Switch to “Traditional Chinese only”." msgstr "切換成繁體模式" #: engine/table.py:1337 #, fuzzy msgid "Simplified Chinese first" msgstr "簡體模式" #: engine/table.py:1338 #, fuzzy msgid "Switch to “Simplified Chinese before traditional”." msgstr "切換成簡體模式" #: engine/table.py:1343 #, fuzzy msgid "Traditional Chinese first" msgstr "繁體模式" #: engine/table.py:1344 #, fuzzy msgid "Switch to “Traditional Chinese before simplified”." msgstr "切換成繁體模式" #: engine/table.py:1349 setup/ibus-table-preferences.ui:87 msgid "All Chinese characters" msgstr "" #: engine/table.py:1350 #, fuzzy msgid "Switch to “All Chinese characters”." msgstr "切換成繁體模式" #: engine/table.py:1354 #, fuzzy msgid "Chinese mode" msgstr "中文模式" #: engine/table.py:1355 #, fuzzy msgid "Switch Chinese mode" msgstr "中文模式" #: engine/table.py:1365 #, fuzzy msgid "English" msgstr "英文模式" #: engine/table.py:1366 msgid "Switch to English input" msgstr "" #: engine/table.py:1371 #, fuzzy msgid "Chinese" msgstr "中文模式" #: engine/table.py:1372 #, fuzzy msgid "Switch to Chinese input" msgstr "中文模式" #: engine/table.py:1380 engine/table.py:1495 #: setup/ibus-table-preferences.ui:36 msgid "Direct" msgstr "" #: engine/table.py:1381 #, fuzzy msgid "Switch to direct input" msgstr "切換成拼音反查模式" #: engine/table.py:1386 engine/table.py:1447 #, fuzzy msgid "Table" msgstr "形碼模式" #: engine/table.py:1387 #, fuzzy msgid "Switch to table input" msgstr "切換成形碼模式" #: engine/table.py:1395 #, fuzzy msgid "Input mode" msgstr "直接輸出模式,亦即單項結果即時輸出" #: engine/table.py:1396 #, fuzzy msgid "Switch Input mode" msgstr "直接輸出模式,亦即單項結果即時輸出" #: engine/table.py:1405 engine/table.py:1426 #: setup/ibus-table-preferences.ui:98 setup/ibus-table-preferences.ui:112 #: setup/ibus-table-preferences.ui:182 setup/ibus-table-preferences.ui:196 msgid "Half" msgstr "" #: engine/table.py:1406 #, fuzzy msgid "Switch to halfwidth letters" msgstr "半形字元" #: engine/table.py:1411 engine/table.py:1432 #: setup/ibus-table-preferences.ui:101 setup/ibus-table-preferences.ui:115 #: setup/ibus-table-preferences.ui:185 setup/ibus-table-preferences.ui:199 msgid "Full" msgstr "" #: engine/table.py:1412 #, fuzzy msgid "Switch to fullwidth letters" msgstr "全形字元" #: engine/table.py:1416 msgid "Letter width" msgstr "" #: engine/table.py:1417 #, fuzzy msgid "Switch letter width" msgstr "全形字元" #: engine/table.py:1427 #, fuzzy msgid "Switch to halfwidth punctuation" msgstr "切換成半形標點" #: engine/table.py:1433 #, fuzzy msgid "Switch to fullwidth punctuation" msgstr "切換成全形標點" #: engine/table.py:1437 msgid "Punctuation width" msgstr "" #: engine/table.py:1438 #, fuzzy msgid "Switch punctuation width" msgstr "全形標點" #: engine/table.py:1448 #, fuzzy msgid "Switch to table mode" msgstr "切換成形碼模式" #: engine/table.py:1453 msgid "Pinyin" msgstr "" #: engine/table.py:1454 #, fuzzy msgid "Switch to pinyin mode" msgstr "切換成英文模式" #: engine/table.py:1458 #, fuzzy msgid "Pinyin mode" msgstr "切換成英文模式" #: engine/table.py:1459 msgid "Switch pinyin mode" msgstr "" #: engine/table.py:1468 msgid "Multiple character match" msgstr "" #: engine/table.py:1469 #, fuzzy msgid "Switch to matching multiple characters at once" msgstr "切換成單字元模式" #: engine/table.py:1474 #, fuzzy msgid "Single character match" msgstr "單字元模式" #: engine/table.py:1475 msgid "Switch to matching only single characters" msgstr "" #: engine/table.py:1479 #, fuzzy msgid "Onechar mode" msgstr "詞組模式" #: engine/table.py:1480 msgid "Switch onechar mode" msgstr "" #: engine/table.py:1489 setup/ibus-table-preferences.ui:33 msgid "Normal" msgstr "" #: engine/table.py:1490 msgid "" "Switch to normal commit mode (automatic commits go into the preedit instead " "of into the application. This enables automatic definitions of new shortcuts)" msgstr "" #: engine/table.py:1496 msgid "" "Switch to direct commit mode (automatic commits go directly into the " "application)" msgstr "" #: engine/table.py:1500 #, fuzzy msgid "Auto commit mode" msgstr "直接輸出模式,亦即單項結果即時輸出" #: engine/table.py:1501 #, fuzzy msgid "Switch autocommit mode" msgstr "切換成直接輸出模式,亦即單項結果即時輸出" #: engine/table.py:1743 msgid "Setup" msgstr "" #: engine/table.py:1745 #, python-format msgid "Configure ibus-table “%(engine-name)s”" msgstr "" #: setup/main.py:125 msgid "IBUS_ENGINE_NAME environment variable is not set." msgstr "" #: setup/main.py:129 msgid "Cannot determine the engine name. Please use the --engine-name option." msgstr "" #: setup/main.py:143 #, python-format msgid "IBus Table engine %s is not available" msgstr "" #: setup/main.py:271 #, python-format msgid "IBus Table %s Preferences" msgstr "" #: setup/ibus-table-preferences.ui:19 setup/ibus-table-preferences.ui:47 #: setup/ibus-table-preferences.ui:61 msgid "No" msgstr "" #: setup/ibus-table-preferences.ui:22 setup/ibus-table-preferences.ui:50 #: setup/ibus-table-preferences.ui:64 msgid "Yes" msgstr "" #: setup/ibus-table-preferences.ui:81 #, fuzzy msgid "Simplified Chinese before traditional" msgstr "簡體模式" #: setup/ibus-table-preferences.ui:84 #, fuzzy msgid "Traditional Chinese before simplified" msgstr "繁體模式" #: setup/ibus-table-preferences.ui:126 #, fuzzy msgid "Direct input" msgstr "直接輸出模式,亦即單項結果即時輸出" #: setup/ibus-table-preferences.ui:129 msgid "Table input" msgstr "" #: setup/ibus-table-preferences.ui:140 msgid "Horizontal" msgstr "" #: setup/ibus-table-preferences.ui:143 msgid "Vertical" msgstr "" #: setup/ibus-table-preferences.ui:154 #, fuzzy msgid "Phrase" msgstr "詞組模式" #: setup/ibus-table-preferences.ui:157 #, fuzzy msgid "Single Char" msgstr "單字元模式" #: setup/ibus-table-preferences.ui:168 msgid "Commit" msgstr "" #: setup/ibus-table-preferences.ui:171 msgid "Next Page" msgstr "" #: setup/ibus-table-preferences.ui:223 msgid "Restore all defaults" msgstr "" #: setup/ibus-table-preferences.ui:227 msgid "Restore defaults as specified in the database for this engine." msgstr "" #: setup/ibus-table-preferences.ui:302 #, fuzzy msgid "Input mode:" msgstr "直接輸出模式,亦即單項結果即時輸出" #: setup/ibus-table-preferences.ui:315 msgid "" "“Simplified Chinese” shows only characters \n" "used in simplified Chinese. “Traditional Chinese”\n" "shows only characters used in traditional Chinese.\n" "“Simplified Chinese before traditional” shows all\n" "characters but puts the simplified characters higher\n" "up in the candidate list. “Traditional Chinese before\n" "simplified” puts the traditional characters higher up\n" "in the candidate list. “All characters” just shows all\n" "matches without any particular filtering on traditional\n" "versus simplified Chinese." msgstr "" #: setup/ibus-table-preferences.ui:340 msgid "" "Whether to use fullwidth or halfwidth\n" "letters in table input mode." msgstr "" #: setup/ibus-table-preferences.ui:357 msgid "" "Whether to use fullwidth or halfwidth\n" "punctuation in table input mode." msgstr "" #: setup/ibus-table-preferences.ui:374 msgid "" "Whether to use fullwidth or halfwidth\n" "letters in direct input mode." msgstr "" #: setup/ibus-table-preferences.ui:391 msgid "" "Whether to use fullwidth or halfwidth\n" "punctuation in direct input mode." msgstr "" #: setup/ibus-table-preferences.ui:411 #, fuzzy msgid "Chinese mode:" msgstr "中文模式" #: setup/ibus-table-preferences.ui:427 msgid "Table input letter width:" msgstr "" #: setup/ibus-table-preferences.ui:443 msgid "Table input punctuation width:" msgstr "" #: setup/ibus-table-preferences.ui:459 msgid "Direct input letter width:" msgstr "" #: setup/ibus-table-preferences.ui:475 msgid "Direct input punctuation width:" msgstr "" #: setup/ibus-table-preferences.ui:488 msgid "" "“Direct input” is almost the same as if the\n" "input method were off, i.e. not used at all, most\n" "characters just get passed to the application.\n" "But some conversion between fullwidth and\n" "halfwidth may still happen in direct input mode.\n" "“Table input” means the input method is on." msgstr "" #: setup/ibus-table-preferences.ui:514 msgid "Inital state" msgstr "" #: setup/ibus-table-preferences.ui:551 msgid "" "Whether the lookup table showing the candidates\n" "should be vertical or horizontal." msgstr "" #: setup/ibus-table-preferences.ui:568 msgid "" "The maximum number of candidates in\n" "one page of the lookup table. You can switch\n" "pages in the lookup table using the page up/down\n" "keys or the arrow up/down keys." msgstr "" #: setup/ibus-table-preferences.ui:592 msgid "Orientation:" msgstr "" #: setup/ibus-table-preferences.ui:608 msgid "Page size:" msgstr "" #: setup/ibus-table-preferences.ui:624 msgid "Show candidate list" msgstr "" #: setup/ibus-table-preferences.ui:637 msgid "" "Whether candidate lists should be shown or hidden.\n" "For Chinese input methods one usually wants the\n" "candidate lists to be shown. But for some non-Chinese\n" "input methods like the Russian “translit”, hiding the\n" "candidate lists is better." msgstr "" #: setup/ibus-table-preferences.ui:661 msgid "Candidate list" msgstr "" #: setup/ibus-table-preferences.ui:681 msgid "Settings" msgstr "" #: setup/ibus-table-preferences.ui:724 msgid "" "If this is set to “single char”, only single\n" "character candidates will be shown. If it is\n" "set to “Phrase” candidates consisting of\n" "several characters may be shown." msgstr "" #: setup/ibus-table-preferences.ui:743 msgid "" "If set to “Yes”, this does the following 4 things:\n" "1) When typing “Return”, commit the \n" " candidate + line-feed\n" "2) When tying Tab, commit the candidate\n" "3) When committing using a commit key, commit\n" " the candidate + \" \"\n" "4) If typing the next character matches no candidates,\n" " commit the first candidate of the previous match.\n" " (Mostly needed for non-Chinese input methods like\n" " the Russian “translit”)" msgstr "" #: setup/ibus-table-preferences.ui:768 msgid "" "Committing with the commit keys or with the mouse\n" "always commits to the application. This option is about\n" "“automatic” commits which may happen when\n" "one just continues typing input without committing\n" "manually. From time to time, “automatic” commits will\n" "happen then.\n" "“Direct” means such “automatic” commits go directly\n" "into the application, “Normal” means they get committed\n" "to preëdit." msgstr "" #: setup/ibus-table-preferences.ui:792 msgid "" "If you choose the space key to do “Next page”,\n" " you can only commit using the selection keys\n" "(i.e. the labels in front of the candidates in the\n" "lookup table) or using the mouse." msgstr "" #: setup/ibus-table-preferences.ui:814 msgid "Compose:" msgstr "" #: setup/ibus-table-preferences.ui:830 msgid "Auto select:" msgstr "" #: setup/ibus-table-preferences.ui:846 #, fuzzy msgid "Auto commit mode:" msgstr "直接輸出模式,亦即單項結果即時輸出" #: setup/ibus-table-preferences.ui:862 msgid "Behavior of space key:" msgstr "" #: setup/ibus-table-preferences.ui:878 msgid "Auto wildcard:" msgstr "" #: setup/ibus-table-preferences.ui:891 msgid "" "If yes, a multi wildcard will be automatically\n" "appended to the end of the input string." msgstr "" #: setup/ibus-table-preferences.ui:911 #, fuzzy msgid "Single wildchard character:" msgstr "單字元模式" #: setup/ibus-table-preferences.ui:924 msgid "" "The wildcard to match any single character.\n" "Type RETURN or ENTER to confirm after changing the wildcard." msgstr "" #: setup/ibus-table-preferences.ui:943 msgid "Multi wildcard character:" msgstr "" #: setup/ibus-table-preferences.ui:956 msgid "" "The wildcard used to match any number of characters.\n" "Type RETURN or ENTER to confirm after changing the wildcard." msgstr "" #: setup/ibus-table-preferences.ui:976 msgid "Details" msgstr "" #: setup/ibus-table-preferences.ui:999 msgid "Details" msgstr "" #: setup/ibus-table-preferences.ui:1055 msgid "Table input method for IBus" msgstr "" #: setup/ibus-table-preferences.ui:1087 msgid "" "\n" "Authors:\n" "Yuwei YU (‘acevery’)\n" "Peng Huang\n" "BYVoid\n" "Peng Wu\n" "\n" "Contributors:\n" "koterpilla\n" "Zerng07\n" "Caius ‘kaio’ Chance\n" "Mike FABIAN\n" "Bernard Nauwelaerts\n" "Xiaojun Ma\n" "mozbugbox\n" "Seán de Búrca\n" "" msgstr "" #: setup/ibus-table-preferences.ui:1186 msgid "About" msgstr "" #, fuzzy #~ msgid "Chinese input (Left Shift)" #~ msgstr "切換成拼音反查模式" #, fuzzy #~ msgid "Direct input (Left Shift)" #~ msgstr "切換成拼音反查模式" #, fuzzy #~ msgid "Switch to “Chinese input” (Left Shift)" #~ msgstr "切換成拼音反查模式" #, fuzzy #~ msgid "Fullwidth letters (Shift-Space)" #~ msgstr "切換成全形字元" #, fuzzy #~ msgid "Switch to “Halfwidth letters” (Shift-Space)" #~ msgstr "切換成半形字元" #, fuzzy #~ msgid "Halfwidth letters (Shift-Space)" #~ msgstr "切換成半形字元" #, fuzzy #~ msgid "Switch to “Fullwidth letters” (Shift-Space)" #~ msgstr "切換成全形字元" #, fuzzy #~ msgid "Halfwidth punctuation (Ctrl-.)" #~ msgstr "半形標點" #, fuzzy #~ msgid "Table mode (Right Shift)" #~ msgstr "切換成形碼模式" #, fuzzy #~ msgid "Switch to “Phrase mode” (Ctrl-,)" #~ msgstr "切換成詞組模式" #, fuzzy #~ msgid "Phrase mode (Ctrl-,)" #~ msgstr "切換成詞組模式" #, fuzzy #~ msgid "Direct commit mode (Ctrl-/)" #~ msgstr "直接輸出模式,亦即單項結果即時輸出" #, fuzzy #~ msgid "Switch to “Normal commit mode” (uses space to commit) (Ctrl-/)" #~ msgstr "切換成標準輸出模式,亦即按空格鍵執行輸出" #, fuzzy #~ msgid "Normal commit mode (Ctrl-/)" #~ msgstr "標準輸出模式" #, fuzzy #~ msgid "Simplified Chinese (Ctrl-;)" #~ msgstr "簡體模式" #, fuzzy #~ msgid "Traditional Chinese (Ctrl-;)" #~ msgstr "繁體模式" #, fuzzy #~ msgid "Simplified Chinese before traditional (Ctrl-;)" #~ msgstr "簡體模式" #, fuzzy #~ msgid "Traditional Chinese before simplified (Ctrl-;)" #~ msgstr "繁體模式" #, fuzzy #~ msgid "All Chinese characters (Ctrl-;)" #~ msgstr "切換成繁體模式" #~ msgid "English Mode" #~ msgstr "英文模式" #~ msgid "PinYin Mode" #~ msgstr "拼音反查模式" #, fuzzy #~ msgid "Switch to Simplify Chinese first Big Charset Mode - Ctrl-;" #~ msgstr "切換成大字集模式(簡體結果優先)" #~ msgid "Simplified Chinese First Big Charset Mode" #~ msgstr "大字集模式(簡體結果優先)" #, fuzzy #~ msgid "Switch to Traditional Chinese first Big Charset Mode - Ctrl-;" #~ msgstr "切換成大字集模式(繁體結果優先)" #~ msgid "Traditional Chinese First Big Charset Mode" #~ msgstr "大字集模式(繁體結果優先)" #, fuzzy #~ msgid "Switch to Big Charset Mode - Ctrl-;" #~ msgstr "切換成大字集模式(預設結果順序)" #~ msgid "Big Chinese Mode" #~ msgstr "大字集模式(預設結果順序)" #~ msgid "CN" #~ msgstr "中" #~ msgid "EN" #~ msgstr "英" ibus-table-1.9.1/setup/000077500000000000000000000000001241251735600147175ustar00rootroot00000000000000ibus-table-1.9.1/setup/.gitignore000066400000000000000000000001101241251735600166770ustar00rootroot00000000000000version.py ibus-setup-table ibus-setup-table.desktop __pycache__/ *.pyc ibus-table-1.9.1/setup/Makefile.am000066400000000000000000000032431241251735600167550ustar00rootroot00000000000000# vim:set noet ts=4: # # ibus-table - The Chinese Table engine for IBus # # Copyright (c) 2008-2010 Peng Huang # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. setup_table_PYTHON = \ main.py \ version.py \ ibus-table-preferences.ui \ $(NULL) setup_tabledir = $(datadir)/ibus-table/setup libexec_SCRIPTS = ibus-setup-table desktop_in_in_files = ibus-setup-table.desktop.in.in desktop_in_files = $(desktop_in_in_files:.in.in=.in) ibus-setup-table.desktop: ibus-setup-table.desktop.in.in ( \ PKGDATADIR=$(pkgdatadir); \ LIBEXECDIR=$(libexecdir); \ s=`cat $<`; \ eval "echo \"$${s}\""; \ ) > $@ desktopdir=$(datadir)/applications desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) CLEANFILES = \ $(desktop_DATA) \ $(desktop_in_files) \ *.pyc \ $(NULL) EXTRA_DIST = \ version.py.in \ ibus-setup-table.in \ $(desktop_in_in_files) \ $(NULL) test-table: $(ENV) DBUS_DEBUG=true \ IBUS_LOCALEDIR=@localedir@ \ PYTHONPATH=$(abs_top_srcdir):$(pyexecdir) \ $(PYTHON) $(srcdir)/main.py ziranma4 ibus-table-1.9.1/setup/ibus-setup-table.desktop.in.in000066400000000000000000000003051241251735600225070ustar00rootroot00000000000000[Desktop Entry] Name=IBus Table Setup Comment=Set ibus-table preferences Exec=${LIBEXECDIR}/ibus-setup-table Icon=${PKGDATADIR}/icons/chinese.svg NoDisplay=true Type=Application StartupNotify=true ibus-table-1.9.1/setup/ibus-setup-table.in000066400000000000000000000020461241251735600204360ustar00rootroot00000000000000#!/bin/sh # vim:set noet ts=4: # # ibus-tmpl - The Input Bus template project # # Copyright (c) 2007-2012 Peng Huang # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. prefix=@prefix@ exec_prefix=@exec_prefix@ datarootdir=@datarootdir@ export IBUS_PREFIX=@prefix@ export IBUS_DATAROOTDIR=@datarootdir@ export IBUS_LOCALEDIR=@localedir@ cd @prefix@/share/ibus-table/setup/ exec @PYTHON@ main.py $@ ibus-table-1.9.1/setup/ibus-table-preferences.ui000066400000000000000000002015021241251735600216040ustar00rootroot00000000000000 1 10 6 1 3 No Yes Normal Direct No Yes No Yes Simplified Chinese Traditional Chinese Simplified Chinese before traditional Traditional Chinese before simplified All Chinese characters Half Full Half Full Direct input Table input Horizontal Vertical Phrase Single Char Commit Next Page Half Full Half Full 400 False 5 False center-always gtk-preferences normal True False vertical 2 True False Restore all defaults True True True Restore defaults as specified in the database for this engine. False True 0 gtk-close False True True True True False False 1 False True end 0 True True True False 12 12 12 12 True False True False True 0 none True False 6 12 True False 6 12 True True True False True True 0 Input mode: 0 0 1 1 True False “Simplified Chinese” shows only characters used in simplified Chinese. “Traditional Chinese” shows only characters used in traditional Chinese. “Simplified Chinese before traditional” shows all characters but puts the simplified characters higher up in the candidate list. “Traditional Chinese before simplified” puts the traditional characters higher up in the candidate list. “All characters” just shows all matches without any particular filtering on traditional versus simplified Chinese. True True liststoreChineseMode 1 1 1 1 True False Whether to use fullwidth or halfwidth letters in table input mode. True True liststoreTabDefFullWidthLetter 1 2 1 1 True False Whether to use fullwidth or halfwidth punctuation in table input mode. True True liststoreTabDefFullWidthPunct 1 3 1 1 True False Whether to use fullwidth or halfwidth letters in direct input mode. True True liststoreEnDefFullWidthLetter 1 4 1 1 True False Whether to use fullwidth or halfwidth punctuation in direct input mode. True True liststoreEnDefFullWidthPunct 1 5 1 1 True False True True 0 Chinese mode: 0 1 1 1 True False True True 0 Table input letter width: 0 2 1 1 True False True True 0 Table input punctuation width: 0 3 1 1 True False True True 0 Direct input letter width: 0 4 1 1 True False True True 0 Direct input punctuation width: 0 5 1 1 True False “Direct input” is almost the same as if the input method were off, i.e. not used at all, most characters just get passed to the application. But some conversion between fullwidth and halfwidth may still happen in direct input mode. “Table input” means the input method is on. True True liststoreInputMode on 1 0 1 1 True False <b>Inital state</b> True 0 0 1 1 True False True 0 none True False 6 12 True False 6 12 True True True False Whether the lookup table showing the candidates should be vertical or horizontal. True True liststoreLookupTableOrientation 1 1 1 1 True True The maximum number of candidates in one page of the lookup table. You can switch pages in the lookup table using the page up/down keys or the arrow up/down keys. True True adjustmentLookupTablePageSize 0 left 1 2 1 1 True False True True 0 Orientation: 0 1 1 1 True False True True 0 Page size: 0 2 1 1 True False True True 0 Show candidate list 0 0 1 1 True False Whether candidate lists should be shown or hidden. For Chinese input methods one usually wants the candidate lists to be shown. But for some non-Chinese input methods like the Russian “translit”, hiding the candidate lists is better. True True liststoreAlwaysShowLookup 1 0 1 1 True False <b>Candidate list</b> True 0 1 1 1 True False Settings False True False 12 12 12 12 True False True False True 0 none True False 6 12 True False 6 12 True True True False If this is set to “single char”, only single character candidates will be shown. If it is set to “Phrase” candidates consisting of several characters may be shown. True True liststoreOneChar 1 0 1 1 True False If set to “Yes”, this does the following 4 things: 1) When typing “Return”, commit the candidate + line-feed 2) When tying Tab, commit the candidate 3) When committing using a commit key, commit the candidate + " " 4) If typing the next character matches no candidates, commit the first candidate of the previous match. (Mostly needed for non-Chinese input methods like the Russian “translit”) True True liststoreAutoSelect 1 1 1 1 True False Committing with the commit keys or with the mouse always commits to the application. This option is about “automatic” commits which may happen when one just continues typing input without committing manually. From time to time, “automatic” commits will happen then. “Direct” means such “automatic” commits go directly into the application, “Normal” means they get committed to preëdit. True True liststoreAutoCommit 1 2 1 1 True False If you choose the space key to do “Next page”, you can only commit using the selection keys (i.e. the labels in front of the candidates in the lookup table) or using the mouse. True True liststoreSpaceKeyBehavior 1 3 1 1 True False True True 0 Compose: 0 0 1 1 True False True True 0 Auto select: 0 1 1 1 True False True True 0 Auto commit mode: 0 2 1 1 True False True True 0 Behavior of space key: 0 3 1 1 True False True True 0 Auto wildcard: 0 4 1 1 True False If yes, a multi wildcard will be automatically appended to the end of the input string. True True liststoreAutoWildCard 1 4 1 1 True False True True 0 Single wildchard character: 0 5 1 1 True True The wildcard to match any single character. Type RETURN or ENTER to confirm after changing the wildcard. 1 1 1 5 1 1 True False True True 0 Multi wildcard character: 0 6 1 1 True True The wildcard used to match any number of characters. Type RETURN or ENTER to confirm after changing the wildcard. 1 1 1 6 1 1 True False <b>Details</b> True 0 0 1 1 1 True False Details 1 False True False 12 12 12 12 True False True True True True 32 gtk-about 0 0 1 1 True False True <big><b>IBus Table %s</b></big> True True 0 1 1 1 True False True Table input method for IBus True 0 2 1 1 True False True <small>Copyright (c) 2009-2012 Peng Huang</small> True True True 0 3 1 1 True False True <small> <b>Authors:</b> Yuwei YU (‘acevery’) Peng Huang BYVoid Peng Wu <b>Contributors:</b> koterpilla Zerng07 Caius ‘kaio’ Chance Mike FABIAN Bernard Nauwelaerts Xiaojun Ma mozbugbox Seán de Búrca </small> True center True 0 5 1 1 http://ibus.googlecode.com False True True True True True none http://ibus.googlecode.com 0 4 1 1 True False center 32 32 True False 0 0 1 1 True False 0 Name of the engine 1 0 1 1 0 6 1 1 2 True False About 2 False False True 1 buttongtkclose ibus-table-1.9.1/setup/main.py000066400000000000000000000464721241251735600162320ustar00rootroot00000000000000# vim:fileencoding=utf-8:sw=4:et # # ibus-table-setup - Setup UI for ibus-table # # Copyright (c) 2008-2010 Peng Huang # Copyright (c) 2010 BYVoid # Copyright (c) 2012 Ma Xiaojun # Copyright (c) 2012 mozbugbox # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. import gettext import locale import os import sys import signal import optparse from time import strftime import re from gi.repository import GLib from gi.repository import Gtk from gi.repository import IBus import version sys.path = [sys.path[0]+'/../engine'] + sys.path import tabsqlitedb _ = lambda a : gettext.dgettext("ibus-table", a) OPTION_DEFAULTS = { "inputmode": 1, "chinesemode": 0, "tabdeffullwidthletter": False, "tabdeffullwidthpunct": False, "endeffullwidthletter": False, "endeffullwidthpunct": False, "alwaysshowlookup": True, "lookuptableorientation": True, "lookuptablepagesize": 6, "onechar": False, "autoselect": False, "autocommit": False, "spacekeybehavior": False, "autowildcard": True, "singlewildcardchar": u'', "multiwildcardchar": u'', } SCALE_WIDGETS = { "lookuptablepagesize", } ENTRY_WIDGETS = { "singlewildcardchar", "multiwildcardchar", } ibus_dir = os.getenv('IBUS_TABLE_LOCATION') ibus_lib_dir = os.getenv('IBUS_TABLE_LIB_LOCATION') if not ibus_dir or not os.path.exists(ibus_dir): ibus_dir = "/usr/share/ibus-table/" if not ibus_lib_dir or not os.path.exists(ibus_lib_dir): ibus_lib_dir = "/usr/libexec" db_dir = os.path.join (ibus_dir, 'tables') icon_dir = os.path.join (ibus_dir, 'icons') setup_cmd = os.path.join(ibus_lib_dir, "ibus-setup-table") opt = optparse.OptionParser() opt.set_usage ('%prog [options]') opt.add_option('-n', '--engine-name', action = 'store',type = 'string', dest = 'engine_name', default = '', help = 'Set the name of the engine, for example "table:cangjie3". Default: "%default"') opt.add_option( '-q', '--no-debug', action = 'store_false', dest = 'debug', default = True, help = 'redirect stdout and stderr to ~/.ibus/tables/setup-debug.log, default: %default') (options, args) = opt.parse_args() if options.debug: if not os.access ( os.path.expanduser('~/.ibus/tables/'), os.F_OK): os.system ('mkdir -p ~/.ibus/tables') logfile = os.path.expanduser('~/.ibus/tables/setup-debug.log') sys.stdout = open(logfile, mode='a', buffering=1) sys.stderr = open(logfile, mode='a', buffering=1) print('--- %s ---' %strftime('%Y-%m-%d: %H:%M:%S')) class PreferencesDialog: def __init__(self): locale.setlocale(locale.LC_ALL, "") localedir = os.getenv("IBUS_LOCALEDIR") gettext.bindtextdomain("ibus-table", localedir) gettext.bind_textdomain_codeset("ibus-table", "UTF-8") self.__bus = IBus.Bus() self.__engine_name = None if options.engine_name: # If the engine name is specified on the command line, use that: self.__engine_name = options.engine_name else: # If the engine name is not specified on the command line, # try to get it from the environment. This is necessary # in gnome-shell on Fedora 18,19,20,... because the setup tool is # called without command line options there but the # environment variable IBUS_ENGINE_NAME is set: if 'IBUS_ENGINE_NAME' in os.environ: self.__engine_name = os.environ['IBUS_ENGINE_NAME'] else: self.__run_message_dialog( _("IBUS_ENGINE_NAME environment variable is not set."), Gtk.MessageType.WARNING) if self.__engine_name == None: self.__run_message_dialog( _("Cannot determine the engine name. Please use the --engine-name option."), Gtk.MessageType.ERROR) sys.exit(1) def check_table_available(self): """Check if the current engine_name is available. Return bool""" names = self.__bus.list_engines() names = [x.get_name() for x in names] ret = True if self.__engine_name not in names: ret = False self.__run_message_dialog( _('IBus Table engine %s is not available') %self.__engine_name, Gtk.MessageType.ERROR) return ret def get_default_options_from_database(self): self.tabsqlitedb = tabsqlitedb.tabsqlitedb( filename = os.path.join( db_dir, re.sub(r'^table:', '', self.__engine_name)+'.db'), user_db = None, create_database = False) self.__is_chinese = False self.__is_cjk = False languages = self.tabsqlitedb.ime_properties.get('languages') if languages: languages = languages.split(',') for language in languages: if language.strip().startswith('zh'): self.__is_chinese = True for lang in ['zh', 'ja', 'ko']: if language.strip().startswith(lang): self.__is_cjk = True self.__user_can_define_phrase = False user_can_define_phrase = self.tabsqlitedb.ime_properties.get('user_can-define_phrase') if user_can_define_phrase: self.__user_can_define_phrase = user_can_define_phrase.lower() == u'true' self.__rules = self.tabsqlitedb.ime_properties.get('rules') language_filter = self.tabsqlitedb.ime_properties.get('language_filter') if language_filter in ['cm0', 'cm1', 'cm2', 'cm3', 'cm4']: OPTION_DEFAULTS['chinesemode'] = int(language_filter[-1]) def_full_width_punct = self.tabsqlitedb.ime_properties.get('def_full_width_punct') if (def_full_width_punct and type(def_full_width_punct) == type(u'') and def_full_width_punct.lower() in [u'true', u'false']): OPTION_DEFAULTS['tabdeffullwidthpunct'] = def_full_width_punct.lower() == u'true' OPTION_DEFAULTS['endeffullwidthpunct'] = def_full_width_punct.lower() == u'true' def_full_width_letter = self.tabsqlitedb.ime_properties.get('def_full_width_letter') if (def_full_width_letter and type(def_full_width_letter) == type(u'') and def_full_width_letter.lower() in [u'true', u'false']): OPTION_DEFAULTS['tabdeffullwidthletter'] = def_full_width_letter.lower() == u'true' OPTION_DEFAULTS['endeffullwidthletter'] = def_full_width_letter.lower() == u'true' always_show_lookup = self.tabsqlitedb.ime_properties.get('always_show_lookup') if (always_show_lookup and type(always_show_lookup) == type(u'') and always_show_lookup.lower() in [u'true', u'false']): OPTION_DEFAULTS['alwaysshowlookup'] = always_show_lookup.lower() == u'true' select_keys_csv = self.tabsqlitedb.ime_properties.get('select_keys') if select_keys_csv: # select_keys_csv is something like: "1,2,3,4,5,6,7,8,9,0" OPTION_DEFAULTS['lookuptablepagesize'] = len(select_keys_csv.split(",")) auto_select = self.tabsqlitedb.ime_properties.get('auto_select') if (auto_select and type(auto_select) == type(u'') and auto_select.lower() in [u'true', u'false']): OPTION_DEFAULTS['autoselect'] = auto_select.lower() == u'true' auto_commit = self.tabsqlitedb.ime_properties.get('auto_commit') if (auto_commit and type(auto_commit) == type(u'') and auto_commit.lower() in [u'true', u'false']): OPTION_DEFAULTS['autocommit'] = auto_commit.lower() == u'true' # if space is a page down key, set the option # “spacekeybehavior” to “True”: page_down_keys_csv = self.tabsqlitedb.ime_properties.get('page_down_keys') if page_down_keys_csv: self._page_down_keys = [ IBus.keyval_from_name(x) for x in page_down_keys_csv.split(',')] if IBus.KEY_space in self._page_down_keys: OPTION_DEFAULTS['spacekeybehavior'] = True # if space is a commit key, set the option # “spacekeybehavior” to “False” (overrides if space is # also a page down key): commit_keys_csv = self.tabsqlitedb.ime_properties.get('commit_keys') if commit_keys_csv: self._commit_keys = [ IBus.keyval_from_name(x) for x in commit_keys_csv.split(',')] if IBus.KEY_space in self._commit_keys: OPTION_DEFAULTS['spacekeybehavior'] = False auto_wildcard = self.tabsqlitedb.ime_properties.get('auto_wildcard') if (auto_wildcard and type(auto_wildcard) == type(u'') and auto_wildcard.lower() in [u'true', u'false']): OPTION_DEFAULTS['autowildcard'] = auto_wildcard.lower() == u'true' single_wildcard_char = self.tabsqlitedb.ime_properties.get('single_wildcard_char') if (single_wildcard_char and type(single_wildcard_char) == type(u'') and len(single_wildcard_char) == 1): OPTION_DEFAULTS['singlewildcardchar'] = single_wildcard_char multi_wildcard_char = self.tabsqlitedb.ime_properties.get('multi_wildcard_char') if (multi_wildcard_char and type(multi_wildcard_char) == type(u'') and len(multi_wildcard_char) == 1): OPTION_DEFAULTS['multiwildcardchar'] = multi_wildcard_char def __restore_defaults(self): for name in OPTION_DEFAULTS: value = OPTION_DEFAULTS[name] self.__set_value(name, value) def _build_combobox_renderer(self, name): """setup cell renderer for combobox""" __combobox = self.__builder.get_object("combobox%s" % name) __cell = Gtk.CellRendererText() __combobox.pack_start(__cell, True) __combobox.add_attribute(__cell, 'text', 0) def load_builder(self): """Load builder and __dialog attribute""" self.__builder = Gtk.Builder() self.__builder.set_translation_domain("ibus-table") self.__builder.add_from_file("ibus-table-preferences.ui") self.__dialog = self.__builder.get_object("dialog") for name in list(OPTION_DEFAULTS.keys()): if name not in SCALE_WIDGETS and name not in ENTRY_WIDGETS: self._build_combobox_renderer(name) def do_init(self): self.__config = self.__bus.get_config() self.__config_section = ("engine/Table/%s" % re.sub(r'^table:', '', self.__engine_name).replace(" ", "_")) self.__init_general() self.__init_about() def __init_general(self): """Initialize the general notebook page""" self.__dialog.set_title(_("IBus Table %s Preferences") %re.sub(r'^table:', '', self.__engine_name)) self.__values = self.__config.get_values(self.__config_section).unpack() self.__config.connect ("value-changed", self.__config_value_changed_cb) for name in list(OPTION_DEFAULTS.keys()): #self.__config.unset(self.__config_section, name); continue if name in SCALE_WIDGETS: self._init_hscale(name) elif name in ENTRY_WIDGETS: self._init_entry(name) else: self._init_combobox(name) self._init_button('restoredefaults') return def __init_about(self): """Initialize the About notebook page""" # page About self.__name_version = self.__builder.get_object("NameVersion") self.__name_version.set_markup( "IBus Table %s" %version.get_version()) img_fname = os.path.join(icon_dir, "ibus-table.svg") if os.path.exists(img_fname): img = self.__builder.get_object("image_about") img.set_from_file(img_fname) # setup table info engines = self.__bus.list_engines() engine = None for e in engines: if e.get_name() == self.__engine_name: engine = e break if engine: longname = engine.get_longname() if not longname: longname = engine.get_name() w = self.__builder.get_object("TableNameVersion") w.set_markup("%s" %longname) icon_path = engine.get_icon() if icon_path and os.path.exists(icon_path): from gi.repository import GdkPixbuf pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(icon_path, -1, 32) w = self.__builder.get_object("TableNameImage") w.set_from_pixbuf(pixbuf) def _init_combobox(self, name): """Set combobox from the __config engine""" __combobox = self.__builder.get_object("combobox%s" % name) val = 0 if name in self.__values: init_val = self.__values[name] else: init_val = OPTION_DEFAULTS[name] if isinstance(init_val, bool): val = 1 if init_val else 0 elif isinstance(init_val, int): val = init_val elif isinstance(init_val, str): model = __combobox.get_model() for i, row in enumerate(model): if row[0] == init_val: val = i break __combobox.set_active(val) __combobox.connect("changed", self.__changed_cb, name) if ((name in ['chinesemode'] and not self.__is_chinese) or (name in ['tabdeffullwidthletter', 'tabdeffullwidthpunct', 'endeffullwidthletter', 'endeffullwidthpunct'] and not self.__is_cjk) or (name in ['onechar'] and not self.__is_cjk) or (name in ['autocommit'] and (not self.__user_can_define_phrase or not self.__rules))): __combobox.set_button_sensitivity(Gtk.SensitivityType.OFF) def _init_entry(self, name): """Set entry widget from the __config engine""" __entry = self.__builder.get_object("entry%s" % name) if name in self.__values: val = self.__values[name] else: val = OPTION_DEFAULTS[name] __entry.set_text(val) __entry.connect("notify::text", self.__entry_changed_cb, name) def _init_hscale(self, name): """Set scale widget from the __config engine""" __hscale = self.__builder.get_object("hscale%s" % name) if name in self.__values: val = self.__values[name] else: val = OPTION_DEFAULTS[name] __hscale.set_value(val) __hscale.connect("value-changed", self.__value_changed_cb, name) def _init_button(self, name): """Initialize the button to restore the default settings""" __button = self.__builder.get_object("button%s" %name) __button.connect("clicked", self.__button_clicked_cb, name) def __button_clicked_cb(self, widget, name): """Button clicked handler""" if name == 'restoredefaults': self.__restore_defaults() def __changed_cb(self, widget, name): """Combobox changed handler""" val = widget.get_active() vtype = type(OPTION_DEFAULTS[name]) if vtype == bool: val = False if val == 0 else True self.__set_value(name, val) def __value_changed_cb(self, widget, name): """scale widget value changed handler""" val = widget.get_value() vtype = type(OPTION_DEFAULTS[name]) if vtype == int: val = int(val) self.__set_value(name, val) def __entry_changed_cb(self, widget, property_spec, name): """entry widget text changed handler""" val = widget.get_text() vtype = type(OPTION_DEFAULTS[name]) if vtype != type(u''): val = val.decode('UTF-8') self.__set_value(name, val) def __config_value_changed_cb(self, config, section, name, val): """__config engine value changed handler""" val = val.unpack() if name in SCALE_WIDGETS: __hscale = self.__builder.get_object("hscale%s" % name) __hscale.set_value(val) elif name in ENTRY_WIDGETS: __entry = self.__builder.get_object("entry%s" % name) __entry.set_text(val) else: __combobox = self.__builder.get_object("combobox%s" % name) if isinstance(val, bool): val = 1 if val else 0 elif isinstance(val, str): val = val.get_string() model = __combobox.get_model() for i, row in enumerate(model): if row[0] == val: val = i break __combobox.set_active(val) self.__values[name] = val def __toggled_cb(self, widget, name): """toggle button toggled signal handler""" self.__set_value(name, widget.get_active ()) def __get_value(self, name, defval): """Get the __config value if available""" if name in self.__values: var = self.__values[name] if isinstance(defval, type(var)): return var self.__set_value(name, defval) return defval def __set_value(self, name, val): """Set the config value to __config""" var = None if isinstance(val, bool): var = GLib.Variant.new_boolean(val) elif isinstance(val, int): var = GLib.Variant.new_int32(val) elif isinstance(val, str): var = GLib.Variant.new_string(val) else: sys.stderr.write("val(%s) is not in support type." %repr(val)) return self.__values[name] = val self.__config.set_value(self.__config_section, name, var) def __run_message_dialog(self, message, type=Gtk.MessageType.INFO): dlg = Gtk.MessageDialog(parent=None, flags=Gtk.DialogFlags.MODAL, message_type=type, buttons=Gtk.ButtonsType.OK, message_format=message) dlg.run() dlg.destroy() def run(self): ret = self.check_table_available() if not ret: return 0 self.get_default_options_from_database() GLib.idle_add(self.do_init) self.load_builder() return self.__dialog.run() def main(): PreferencesDialog().run() if __name__ == "__main__": # Workaround for # https://bugzilla.gnome.org/show_bug.cgi?id=622084 # Bug 622084 - Ctrl+C does not exit gtk app signal.signal(signal.SIGINT, signal.SIG_DFL) main() ibus-table-1.9.1/setup/version.py.in000066400000000000000000000015471241251735600173720ustar00rootroot00000000000000# vim:set et ts=4 sts=4: # # ibus-table - The Chinese Table engine for IBus # # Copyright (c) 2008-2010 Peng Huang # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. def get_version(): return "@VERSION@" ibus-table-1.9.1/tables/000077500000000000000000000000001241251735600150315ustar00rootroot00000000000000ibus-table-1.9.1/tables/Makefile.am000066400000000000000000000021521241251735600170650ustar00rootroot00000000000000# vim:set noet ts=4 # # ibus-table - The Tables engine for IBus # # Copyright (c) 2008-2009 Yu Yuwei # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # # $Id: $ # SUBDIRS = \ $(NULL) template_DATA = \ template.txt \ $(NULL) templatedir = $(datadir)/ibus-table/tables EXTRA_DIST = \ template.txt \ $(NULL) MAINTAINERCLEANFILES = \ Makefile.in \ $(NULL) install-data-local: $(MKDIR_P) $(DESTDIR)$(pkgdatadir)/tables ibus-table-1.9.1/tables/template.txt000066400000000000000000000111521241251735600174050ustar00rootroot00000000000000### File header must not be modified ### This file must be encoded into UTF-8. ### This table under LGPL ### comments start with ### not single # ### Derive from the format of SCIM Table, so you can modify the table from ### scim-tables' table SCIM_Generic_Table_Phrase_Library_TEXT VERSION_1_0 ### Begin Table definition. BEGIN_DEFINITION ### License LICENSE = LGPL ### An unique id to distinguish this table among others. ### Use uuidgen to generate this kind of id. UUID = c9851827-0abe-12ed-8db5-010b9d51ffed ### A unique number indicates the version of this file. ### For example the last modified date of this file. ### This number must be less than 2^32. ### Just make your table version-able SERIAL_NUMBER = 20090218 ### ICON can be any format as long as your pygtk can recognized ### the most widely ones are "png" and "svg", letter one is recommended ICON = ibus-table.svg ### The symbol to be displayed in IM switchers SYMBOL = 码 ### The default name of this table, this is needed NAME = Table ### The local names of this table, this is optional NAME.zh_CN = 形码 NAME.zh_HK = 形碼 NAME.zh_TW = 形碼 ### Description DESCRIPTION = This is a template engine table for IBus Table. ### Supported languages of this table ### sigle "zh_CN" just be recognized as zh_CN, ### but "zh_CN, zh_HK" or more zh_XX will be recognized as zh; ### and "en_US, zh_CN" will be just ignored. LANGUAGES = zh_CN,zh_SG,zh_TW,zh_HK ### The author of this table AUTHOR = Yu Yuwei ### Prompt string to be displayed in the status area, CN will be replaced by ### the gettext tools in runtime as 中. STATUS_PROMPT = CN ### Valid input chars. VALID_INPUT_CHARS = abcdefghijklmnopqrstuvwxyz ### Layout LAYOUT = us ### The max number of input keys for every phrase or character. MAX_KEY_LENGTH = 4 ### Use auto_commit mode as default AUTO_COMMIT = FALSE ### Automatically selects the first phrase when typing AUTO_SELECT = FALSE ### Use full width punctuation by default DEF_FULL_WIDTH_PUNCT = TRUE ### Not use full width letter by default DEF_FULL_WIDTH_LETTER = FALSE ### Whether user are allow to define phrase, default is true ### You have to define the word construction rules below. ### For input methods which do not input phrases, set this to False USER_CAN_DEFINE_PHRASE = TRUE ### Whether support PinYin Mode, default is true. ### this feature is just for Chinese, set it to False if your IM is not ### Chinese. PINYIN_MODE = TRUE ### If true then the phrases' frequencies will be adjusted dynamically ### according your using frequency. DYNAMIC_ADJUST = TRUE ### Some characters whose frequencies should be fix all the time, e.g. ### some punctuations ### NO_CHECK_CHARS = ### Rules for constructing user defined phrase ### "ce" stands for "ci equal", a Chinese English :), means "phrase length ### equal to", thus ce2 -> phrase length equal to 2; and "ca" means "phrase ### length equal or above", so ca4 -> phrase length equal or above 4. ### p21 -> the 1st key of 2nd character in the phrase, and so on. ### Each rule separate via ";". ### Example below is a complete rule-set, ### becuase [2,2] ∩ [3,3] ∩ [4,+∞] = [2,+∞], which is the range of length ### of phrase. This have to be satisfied if you need ibus-table to build up ### your own inputed phrase via your daily using. RULES = ce2:p11+p12+p21+p22;ce3:p11+p21+p22+p31;ca4:p11+p21+p31+p41 ### The key strokes to page up the lookup table. ### PAGE_UP_KEYS = Page_Up,KP_Page_Up,minus,comma ### The key strokes to page down. ### PAGE_DOWN_KEYS = Page_Down,KP_Page_Down,equal,period END_DEFINITION ### Begin Table data. ### Format of every line whose formated in "input_keys\tphrase\tfreq\n" is an ### entry. ### From left to right, the 1st column are the input key combination that you ### entered via keyboard; the 2nd column are presented character or phrase of ### the key combination you want; the 3rd column are frequency of the character ### or phrase. BEGIN_TABLE input_keys aim_chars freq input_keys aim_chars freq input_keys aim_chars freq END_TABlE ### Since some input methods use different table for every character to make ### phrase, such as ZhengMa, they need explict define the goucima (the ### phrase-building code for the given character), the format of every entry is ### "character\tgoucima\n". ### For the input method which just use the full code as word-building code ### just skip this field. The ibus-table will build the codes needed from ### above TABLE. ### if you don't need different word-building code, please comment out the ### next few lines with ###, just like these lines you are look at now. BEGIN_GOUCI character_1 goucima_1 character_1 goucima_2 END_GOUCI ibus-table-1.9.1/tools/000077500000000000000000000000001241251735600147175ustar00rootroot00000000000000ibus-table-1.9.1/tools/.gitignore000066400000000000000000000000151241251735600167030ustar00rootroot00000000000000__pycache__/ ibus-table-1.9.1/tools/Unihan_Variants.txt000066400000000000000000015455271241251735600205740ustar00rootroot00000000000000# # Unihan_Variants.txt # Date: 2014-05-09 18:17:02 GMT [JHJ] # Unicode version: 7.0.0 # # Unicode Character Database # Copyright (c) 1991-2014 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ # # This file contains data on the following fields from the Unihan database: # kSemanticVariant # kSimplifiedVariant # kSpecializedSemanticVariant # kTraditionalVariant # kZVariant # # For details on the file format, see http://www.unicode.org/reports/tr38/ # U+3400 kSemanticVariant U+4E18 U+3405 kSemanticVariant U+4E94 # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 3.0 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . import re import logging import sys if sys.version_info < (3,0,0): reload (sys) sys.setdefaultencoding('utf-8') # Unihan_Variants.txt contains the following 2 lines: # # U+50DE kSimplifiedVariant U+4F2A # U+50DE kTraditionalVariant U+507D U+50DE # # This seems to be currently the only case in Unihan_Variants.txt where # a character which has entries for kTraditionalVariant and # the same character is listed again among the traditional variants # is *not* simplified Chinese. # # U+50DE 僞 is traditional Chinese. # U+507D 偽 is also traditional Chinese. # U+4F2A 伪 is simplified Chinese # # This does not cause a problem with the current parsing code # of Unihan_Variants.txt because the line # # U+50DE kSimplifiedVariant U+4F2A # # is read first and thus the character is already inserted in the # “variants_table_orig” dictionary as traditional Chinese, which is correct. # If a character is already in the dictionary and more lines for the # same character are read from Unihan_Variants.txt, these extra lines # are ignored. # # But maybe for some corner cases more tweaking of the code is # necessary. One can also add overrides manually to the # initial content of “variants_table_orig”. variants_table_orig = { # Meaning of the bits in the values: # 1 = 1 << 0 simplified Chinese # 2 = 1 << 1 traditional Chinese # 3 = (1 | 1 << 1) used both in simplified *and* traditional Chinese # 4 = 1 << 2 mixture of simplified and traditional Chinese # # overrides can be added manually here. For example the following # line marks the 〇 character as used in both # simplified and traditional Chinese: u'〇': 3 # simplified *and* traditional Chinese } # keep the lines from Unihan_Variants.txt which were used for debugging variants_table_orig_unihan_variants_entry_used = {} def read_unihan_variants(file): for line in file: line = line.strip() if not re.match('^#', line): if re.search('(kTraditionalVariant|kSimplifiedVariant)', line): match = re.match(r'^U\+([0-9A-F]{4,5})', line) if match: if sys.version_info >= (3,0,0): # Python3 char = chr(int(match.group(1), 16)) else: char = unichr(int(match.group(1), 16)) category = 0 # should never stay at this value if re.match(re.escape(match.group(0)) + r'.*' + re.escape(match.group(0)), line): # is both simplified and traditional category = 1 | 1 << 1 elif re.search('kTraditionalVariant', line): category = 1 # simplified only elif re.search('kSimplifiedVariant', line): category = 1 << 1 # traditional only logging.debug( "char=%(char)s category=%(category)d line=%(line)s" %{'char': char, 'category': category, 'line': line}) if not char in variants_table_orig: variants_table_orig[char] = category if not char in variants_table_orig_unihan_variants_entry_used: variants_table_orig_unihan_variants_entry_used[char] = line def detect_chinese_category_old(phrase): ''' Old function using encoding conversion to guess whether a text is simplified Chinese, traditional Chinese, both, or unknown. Does not work well, is included here for reference and for comparing with the results of the new, improved function using the data from the Unihan database. ''' # this is the bitmask we will use, # from low to high, 1st bit is simplified Chinese, # 2nd bit is traditional Chinese, # 3rd bit means out of gbk category = 0 # make sure that we got a unicode string if type(phrase) != type(u''): phrase = phrase.decode('utf8') tmp_phrase = ''.join(re.findall(u'[' + u'\u4E00-\u9FCB' + u'\u3400-\u4DB5' + u'\uF900-\uFaFF' + u'\U00020000-\U0002A6D6' + u'\U0002A700-\U0002B734' + u'\U0002B740-\U0002B81D' + u'\U0002F800-\U0002FA1D' + u']+', phrase)) # first whether in gb2312 try: tmp_phrase.encode('gb2312') category |= 1 except: if u'〇' in tmp_phrase: # we add '〇' into SC as well category |= 1 # second check big5-hkscs try: tmp_phrase.encode('big5hkscs') category |= 1 << 1 except: # then check whether in gbk, if category & 1: # already know in SC pass else: # need to check try: tmp_phrase.encode('gbk') category |= 1 except: # not in gbk pass # then set for 3rd bit, if not in SC and TC if not ( category & (1 | 1 << 1) ): category |= (1 << 2) return category def write_variants_script(file): file.write('''#!/usr/bin/python # vim:fileencoding=utf-8:sw=4:et # auto-generated by “generate-chinese-variants.py”, do not edit here! # # Copyright (c) 2013 Mike FABIAN # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 3.0 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ''') file.write(''' import sys if sys.version_info < (3,0,0): reload (sys) sys.setdefaultencoding('utf-8') ''') file.write(''' variants_table = { # Meaning of the bits in the values: # 1 = 1 << 0 simplified Chinese # 2 = 1 << 1 traditional Chinese # 3 = (1 | 1 << 1) used both in simplified *and* traditional Chinese # 4 = 1 << 2 mixture of simplified and traditional Chinese ''') for phrase in sorted(variants_table_orig): if type(phrase) != type(u''): phrase = phrase.decode('utf-8') file.write( " u'" + phrase + "': " + "%s" %variants_table_orig[phrase] + ",\n") file.write(''' } ''') file.write(''' def detect_chinese_category(phrase): \'\'\' New function using Unihan data to guess whether a text is simplified Chinese, traditional Chinese, both, or something rare like a mixture of exclusively simplified with exclusively traditional characters. Meaning of the bits in the category value returned by this function: 1 = 1 << 0 simplified Chinese 2 = 1 << 1 traditional Chinese 3 = (1 | 1 << 1) used both in simplified *and* traditional Chinese 4 = 1 << 2 mixture of simplified and traditional Chinese \'\'\' # make sure that we got a unicode string if type(phrase) != type(u''): phrase = phrase.decode('utf8') if phrase in variants_table: # the complete phrase is in variants_table, just return the # value found: return variants_table[phrase] category = 0xFF; for c in phrase: if c in variants_table: category &= variants_table[c] else: # If it is not listed in variants_table, assume it is # both simplified and traditional Chinese. # It could be something non-Chinese as well then, but # if it is non-Chinese, it should also be allowed to # occur in any Chinese text and thus classified as # both simplified *and* traditional Chinese (the emoji # table for example uses many non-Chinese characters) category &= (1 | 1 << 1) if category == 0: # If category is 0 after binary & of the categories of all the # characters in the phrase, it means that the phrase contained # exclusively simplified *and* exclusively traditional # characters at the same time. For example if the phrase is # “乌烏” then “乌” gets category 1 (simplified Chinese) # and “烏” gets category 2 (traditional Chinese), the result # of the binary & is thus 0. In that case, classify it as # category 4 which is for weird, excentric, rare stuff. If the # user selects one of the modes “all characters but # simplified Chinese first” or “all characters but # traditional Chinese first”, phrases with category 4 will be # shown but filtered to be shown only at the end of the # candidate list. category = 1 << 2 return category ''') test_data = { # Meaning of the bits in the values: # 1 = 1 << 0 simplified Chinese # 2 = 1 << 1 traditional Chinese # 3 = (1 | 1 << 1) used both in simplified *and* traditional Chinese # 4 = 1 << 2 mixture of simplified and traditional Chinese u'乌': 1, u'烏': 2, u'晞': 3, u'䖷': 3, u'乌烏': 4, u'a☺α乌': 1, u'a☺α烏': 2, u'台': 3, u'同': 3, # Bug in Unihan_Variants.txt? Unihan_Variants.txt says this is “simplified Chinese only” } def test_detection(generated_script): logging.info('Testing detection ...') for phrase in test_data: if generated_script.detect_chinese_category(phrase) != test_data[phrase]: print('phrase', phrase, repr(phrase), 'detected as', generated_script.detect_chinese_category(phrase), 'should have been', test_data[phrase], 'Test failed. exiting...') exit (1) else: logging.info('phrase=%(p)s %(repr)s detected as %(det)d OK.' %{'p': phrase, 'repr': repr(phrase), 'det': test_data[phrase]}) logging.info('All tests passed.') def compare_old_new_detection(phrase, generated_script): ''' Only for debugging. Compares results of the Chinese category detection using the old and the new function. ''' if detect_chinese_category_old(phrase) != generated_script.detect_chinese_category(phrase): logging.debug( '%(p)s %(rp)s old=%(o)d new=%(n)d' %{'p': phrase.encode('utf-8'), 'rp': repr(phrase), 'o': detect_chinese_category_old(phrase), 'n': generated_script.detect_chinese_category(phrase)}) if phrase in variants_table_orig_unihan_variants_entry_used: logging.debug(variants_table_orig_unihan_variants_entry_used[phrase]) def parse_args(): import argparse parser = argparse.ArgumentParser( description='Generate a script containing a table and a function to check whether a string of Chinese characters is simplified or traditional') parser.add_argument('-i', '--inputfilename', nargs='?', type=str, default='./Unihan_Variants.txt', help='input file, default is ./Unihan_Variants.txt') parser.add_argument('-o', '--outputfilename', nargs='?', type=str, default='./chinese-variants.py', help='output file, default is ./chinese_variants.py') parser.add_argument('-d', '--debug', action='store_true', help='print debugging output') return parser.parse_args() def main(): args = parse_args() log_level = logging.INFO if args.debug: log_level = logging.DEBUG logging.basicConfig(format="%(levelname)s: %(message)s", level=log_level) with open(args.inputfilename, 'r') as inputfile: logging.info("input file=%s" %inputfile) read_unihan_variants(inputfile) with open(args.outputfilename, 'w') as outputfile: logging.info("output file=%s" %outputfile) write_variants_script(outputfile) import imp generated_script = imp.load_source('dummy', args.outputfilename) test_detection(generated_script) for phrase in generated_script.variants_table: compare_old_new_detection(phrase, generated_script) if __name__ == '__main__': main() ibus-table-1.9.1/tools/ibus-table-query000077500000000000000000000114631241251735600200440ustar00rootroot00000000000000#!/usr/bin/python3 # vim:fileencoding=utf-8:sw=4:et # query-ibus-table # # Copyright (c) 2012 mozbugbox # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 3.0 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA from __future__ import print_function, unicode_literals, absolute_import import sys import os import io import logging as log import sqlite3 TABLE_DIR = "/usr/share/ibus-table/tables/" def list_tables(cursor): """List sql tables in a given sqlite database""" tables = cursor.execute("SELECT * FROM sqlite_master WHERE type='table';") for row in tables: log.debug("Table: {}".format(" ".join(row[1:3]))) log.debug(row[4]) def get_table_sql(cursor, name): """Given a table name, return the creation sql statement of the table.""" tables = cursor.execute("SELECT * FROM sqlite_master WHERE type='table' AND tbl_name = ? ;", [name]) sql = None for row in tables: sql = row[4] return sql def get_table_path(name): """Given a filename, return the full path to the ibus table sqlite file.""" if name.startswith("/"): if os.path.exists(name): return name else: return None else: tablename = None for fname in os.listdir(TABLE_DIR): if fname.startswith(name) and fname.endswith('.db'): tablename = fname break if not tablename or ( os.path.splitext(tablename)[0] != os.path.splitext(name)[0]): print("Known tables:") for fname in os.listdir(TABLE_DIR): print(" {}".format(fname)) if not tablename: print("No table: {}".format(name)) sys.exit(2) return os.path.join(TABLE_DIR, tablename) def query_keys(cursor, tabkeys): sqlstr = ''' SELECT tabkeys, phrase, freq, user_freq FROM main.phrases WHERE tabkeys LIKE :tabkeys ORDER BY phrase ASC, freq DESC; ''' sqlargs = {'tabkeys': tabkeys+'%%'} log.debug("sqlstr: {}".format(sqlstr)) log.debug("sqlargs: {}".format(sqlargs)) result = cursor.execute(sqlstr, sqlargs) return list(result) def print_result(table_sql, result): """@result: sqlite execute result. @table_sql: table creation sql statement """ pidx = table_sql.find("(") + 1 pidx2 = table_sql.find(")", pidx) headers = [x.split()[0] for x in table_sql[pidx:pidx2].split(",")][1:] format_str = "{}".format("{:16s}"*4) headers = format_str.format(*headers) print(headers) print("="*len(headers.rstrip())) for row in result: row = list(row) if sys.version_info >= (3,0,0): # Python3 row_str = [str(x).strip() for x in row] else: row_str = [unicode(x).strip() for x in row] if len(row_str[1]) == 1: row_str[1] += "[U+{:X}]".format(ord(row_str[1])) line = format_str.format(*row_str) print(line) def parse_args(): import argparse parser = argparse.ArgumentParser(description="Query ibus table database") parser.add_argument("--debug", action="store_true", help="DEBUG") parser.add_argument("-t", "--table-name", required=True, help="table database name") parser.add_argument("keys", metavar="Input-Keys", nargs=1, help="a string of input keys, e.g. hjik") args = parser.parse_args() return args NATIVE=sys.getfilesystemencoding() def main(): args = parse_args() log_level = log.INFO if args.debug: log_level = log.DEBUG log.basicConfig(format="%(levelname)s>> %(message)s", level=log_level) table_prefix = args.table_name keys = args.keys[0] if type(keys) != type(u''): keys = keys.decode(NATIVE) table_path = get_table_path(table_prefix) if not table_path: print('Table "{}" does not exist.'.format(table_prefix)) sys.exit(1) print("Using table: {}".format(table_path)) log.debug("table path: {}".format(table_path)) db = sqlite3.connect(table_path) cursor = db.cursor() #list_tables(cursor) table_sql = get_table_sql(cursor, "phrases") result = query_keys(cursor, keys) print_result(table_sql, result) if __name__ == '__main__': main()