diff --git a/sources/CHANGELOG b/sources/CHANGELOG new file mode 100644 index 0000000..43b732c --- /dev/null +++ b/sources/CHANGELOG @@ -0,0 +1,292 @@ +1.1.0 - 201612XX + * Merged a huge PR that clean most of COPS source code. Thanks to Markus Birth for his work and his patience. + * Updated Polish tranlations. + * Fixed a bad external dependency in login.html causing problem with HTPPS. Thanks to polytan02. + * Added automatic redirection to the OPDS feed for many new Android apps (see #309). Thanks to horus68. + +1.0.1 - 20161015 + * Fixed some type of custom column showing id instead of text - Thanks to Mike Schwörer. + * Fixed the redirection to the OPDS catalog for Moon+ Reader. + * Fixed the mail character encoding, now in UTF-8. + * Fixed checkconfig.php to avoid sending content before headers. Thanks to Luke Stevenson. + * Fixed server side rendering with custom columns. + * Moved /icons to /images (Apache issues). Thanks to CgX. + +1.0.0 - 20160708 + * Updated the OPDS icons to better looking ones. Thanks to Horus68. + * Updated the README.md. + * Updated Brazillian, French, Hungarian, Portuguese, Russian translations. + * Added support of language and country code. This allow to have proper Brazil Portuguese and Portugal Portuguese. + * Added Korean translation. Thanks to Jin, Heonkyu. + * Added Romanian translation. Thanks to mtzro2003. + * Added Greek translation. Thanks to George Litos. + * Added Turkish Translation. Thanks to Yunus Emre Deligöz. + * Added Serbian Translation. Thanks to Dalibor Vinkić. + * Added the transliteration of search text. You can enable it with $config ['cops_normalized_search']. Thanks to George Litos. + * Added Ebookdroid, Chunky and AlReader in the know OPDS clients. Thanks to Mike Ferenduros and Horus68. + * Added some mime types for audio books. + * Added the rewrite rule for IIS. + * Added a now parameter to set the style ($config['cops_style']). Thanks to Pablo Santiago Blum de Aguiar. + * Added a directory cache ($config['cops_thumbnail_cache_directory']) to store the resized thumbnails (should help on slow NAS). Thanks to O2 Graphics. + * Added support of all kind of custom columns (see configuration file). Thanks to Mike Schwörer. + * Fixed COPS so that it's completely embedded (no external resources to download needed anymore). + * Fixed a Reflected XSS vulnerability. + * Fixed the tag filters with Bootstrap. Thanks to Klaus Broelemann. + * Fixed some COPS path errors with reverse proxy. Thanks to Benjamin Kitt. + * Fixed the publication date (wasn't working for date before 1901). + * Fixed the download file name (replace + by %20 to be RFC compliant). + + +1.0.0RC3 - 20141229 + * Fixed server side render with Bootstrap template (a proper unit test was also added). + * Upgraded to latest doT-php, Typeahead 0.10.5, jquery-cookie 1.4.1, JQuery 1.11.1 + * Fixed book count with custom columns. + * Updated Catalan, Dutch, French and Russian translations. + * Added AZW3 to the format that can be sent to Kindle (by mail). + * Fixed $config['cops_thumbnail_handling'] with bootstrap template. + * Added Hungarian translation. Thanks to harunibn. + * Added Ukrainian translation. Thanks to Anatoliy Zavalinich + * Added full PHP password check (without any need from specific webserver configuration). Thanks to Mark Bond. + * Added new IOS7 style with default template. Thanks to an anonymous source ;). + * Fixed display of authors names for books with more than one author. + * Added PHP version to checkconfig.php (will help debugging for me). + * Added a configuration item ($config['cops_template']) to change the default template. Thanks to Shin. + * Added a configuration item ($config['cops_language']) to force COPS language. Thanks to Sandy Pleyte. + * Added a trick to have user based configuration, check https://github.com/seblucas/cops/wiki/User-based-config for more information. Thanks to Sandy Pleyte. + * Changed the default sort order on books by author page to show books in a series before all other books. + + +1.0.0RC2 - 20140731 + * Updated Italian, Spanish, Portuguese, Norwegian translations. + * Added Polish translation. Thanks to macak_pl. + * Added Haitian Creole translation. Thanks to Ian Macdonald & Jacinta. + * Added Basque translation. Thanks to Turutarena. + * Upgraded to JQuery 1.11.0, Magnific Popup 0.9.9, Normalize 3.0.1, Typeahead 0.10.2 + * Fixed search with accentuated characters on Internet Explorer. + * Author can now be searched by sort or by name (Carroll, Lewis or Lewis Carroll will work). + * Added a new bootstrap user interface. + * Added correct mimetype for *.ibooks. Reported by Flowney. + * Added an empty line at the end of .htaccess to make it easier to modify. Reported by Mariosipad. + * Modified the README and checkconfig.php to check for php5-json. Reported by Mariosipad. + * Handled properly the cancelling of a mail. Reported by coach0742. + * Added an ugly hack to try to fix bad rendering with Kindle. Please report if it's better or not. + +1.0.0RC1 - 20140404 + * Updated English, Spanish, German, Italian, Portuguese, Dutch translation files. Huge thanks to all to the translators. + * Added Swedish translation. Thanks to Bo Rosén. + * Added Czech translation. Thanks to Zdenek Hadrava. + * Added a lot of refactoring to simplify the code. + * Added a lot of new unit tests. + * Fixed a caching bug causing problems with IE. + * Added an embedded Epub Reader based on Monocle. Thanks to all the beta testers. + * Cleaned up a lot of stuff to prepare for bootstrap template. Note to all CSS hackers, the stylesheets are now in templates/default/styles. + * Fixed the charset of most of the pages. Thanks to edent. + * Added a new category : ratings. Thanks to Michael. + * Fixed the URL rewriting in the OPDS stream, should fix file naming with FBReader. Reported by Rassie. + * Fixed a confusion between author's name and author's sort. Reported by At_Libitum. + * Fixed the style of the tag filters to show that they're clickable. Thanks to cycojesus. + * Replaced | by space in author name. + +0.9.0 - 20131231 + * Add a lot of unit testing. I hope it will limit the risks of regression. + * Added a "smart / autocomplete" search. + * Updated the way locales are handled. Should be easier to add new languages. + * Fixed display of Cyrillic characters. + * Upgraded doT to version 1.0.1, Magnific-Popup to 0.9.8, Normalize.css to 2.1.3, Jquery-cookie to 1.4.0. + * Fixed OPDS stream validity. Reported by Didier. + * Added a new check in checkconfig.php to detect case problem between the actual path and the path stored in Calibre database. Try checkconfig.php?full=1. Reported by Ruud. + * Fixed the display of the rating stars with Chrome. Thanks to At_Libitum. + * Added a new parameter ($config['cops_titles_split_first_letter']) to avoid splitting the books by first letter. Thanks to At_Libitum. + * Fixed non compliant OPDS search (for Stanza, Moon+ Reader, ...). Reported by At_Libitum. + * Fixed the redirection in case the Calibre database is not found. Reported by At_Libitum + * Changed .htaccess to allow the use of password protected catalogs with Sony's eReader (PRS-TX). Thanks to Ruud for the beta testing. + * Updated Chinese, German, Norwegian, Portuguese, Russian translations. Huge thanks to all the translators. + * Fixed a small problem : If a book had no summary the cover could be cut. + * Fix COPS on Internet Explorer 9. Reported by At_Libitum. + * Added publishers in home categories / search / autocomplete search. + * Added a new configuration item ($config ['cops_ignored_categories']) to ignore some categories (author, tag, publisher, ...) in home screen and searches. It's also available in the "Customize UI" page. + * Updated .htaccess to allow downloading books with a password protected COPS on a Sony PRS-TX. Reported by Ruud. + * Changed the default search to search by categories also (should help with OPDS). Thanks to At_Libitum. + * Fixed the tag filtering in the HTML catalog when two tags starts by the same word. Reported by Tyler. + +0.6.2 - 20130913 + * Added server side rendering for devices like PRS-TX / Kindle / Cybook. Thanks to all the testers. + * Added a configuration item to tweak how thumbnail are handled. + * Fixed the click on cog on IOS. Thanks to sb domo. + * Added dashboard icons / standalone mode for IOS. Thanks to sb domo. + * Fixed a regression about custom favicon.ico. Thanks to Tyler. + * Fixed another regression about COPS's version in the about box. Reported by Ian. + * Upgraded Magnific Popup to v0.9.5. + * Added a style for IPhone. Thanks to sb domo. + * Added Portuguese translation. Thanks to Pablo Aguiar. + * Fixed rendering on Internet Explorer < 9.0. + +0.6.1 - 20130730 + * Properly close the lightbox when clicking in a link. Reported by le_. + * Fix the book by languages list when the language is not found in the resources. Reported by le_. + * Fix the string for Portuguese. Reported by le_. + * Add again the series Index in the book list. Reported by fatzgenfatz. + +0.6.0 - 20130724 + * COPS HTML catalog now use templated client side rendering. You can build your own template if you want. Should be a lot faster. + * Fancybox has been replaced by Magnific Popup, it seems faster. + * Added a way to send book by mail (to send to Kindle or to send to your friends). + * Added expires instruction in .htaccess (won't crash if you haven't enabled mod_expires). + * Upgrade to JQuery 1.10.2. + * Changed the way thumbnails are handled to offer greater visual quality (especially on high pixel density devices : Retina, Nexus, ...). + * Changed all icon by a vectorial font (again better visual quality). + * Added a way to filter books by tags. + * Added a login page (login.html) to allow access to a password protected COPS on a Kobo ereader (that does not support basic auth). + * Fixed cookie expiry date. + * Added a default web.config for IIS installation. + * The eink style doesn't use shadow anymore. + * Fixed the link to the series in book detail. + +0.5.0 - 20130605 + * Upgrade COPS UI to HTML5 / CSS3 to hopefully make it prettier. Most of the code was contributed by Thomas Severinsen. + * Add the number of books in each databases (when multiple database is enabled). + * Add Norwegian Bokmål strings. Thanks to Rune Mathisen for the pull request. + * Add a split by language of catalog. Thanks to Puiu Ionut for the pull request. + * You can now change the theme and fancybox use on all your devices (You have to enable cookies). + * Add an eink theme. Thanks to Gregory Bodin for the code. + +0.4.0 - 20130507 + * Add multiple database support. Check the documentation of $config['calibre_directory'] in config-default.php to see how to enable it. + * Include jquery library in COPS's repository to be sure that COPS will work on LAN (without Internet access). + * Prepare the switch to HTML5. Thanks to Thomas Severinsen for most of the code. + * Update the locale strings to be more strict with plurals. Thanks to Tobias Ausländer for the code. + * If Fancybox is not enabled ($config['cops_use_fancyapps'] = "0") then it's not used at all (even in the about box). + * Fix book comments if it contains UTF8 characters. Reported by Alain. + * Link to the book permalink was not working correctly in some cases. Reported by celta. + * Moved some external resources to a resources directory. + * Add chinese translation. Thanks to wogong for the pull request. + +0.3.4 - 20130327 + * Hopefully fix metadata update. Beware you should remove the directory php-epub-meta if you have one. Thanks to Mario for his time. + * Fix two warnings. Reported by Goner and Mario. + +0.3.3 - 20130323 + * Fix catalog if book summary contains bad HTML again :(. + * Upgrade to Fancybox 2.4.0 and JQuery 1.9.1. + * Search is now dependant on the page you're in. For now if you're on author page it'll look for author name. + * Update checkconfig to check if the database provided comes from Calibre. + * Update to latest php-epub-meta should fix the metadata update with Epub. + * Fix OPDS catalog with Ibis Reader. It didn't like empty language. + +0.3.2 - 20130303 + * Add dutch translation. Provided by Northguy. + * Fix an ugly bug introduced in 0.3.1. Reported by mariosipad. + * Small fixes/enhancement to the update metadata tools : + * The book's name is Author - Title.epub + * Add the Calibre uuid so that the book is automatically recognised by Calibre. + * Update the cover + * Fix display of the HTML catalog on Kobo's browser. + * Enable kepub.epub download with cover fix (enable with $config['cops_provide_kepub']). + * Hopefully fix browsing with PRS-T1. Thanks to Northguy. + * Hopefully fix the OPDS catalog when the summary is full of HTML crap. + * Merged 3 patches from Tyler J. Wagner : + * Detect empty publication date set in Calibre to avoid having (0101) as publication year. + * Don't print "Languages" if there are none defined. + * Don't print the tag string if there's no tags. + * If an OPDS client try to access index.php it will be automatically redirected to feed.php. + * Move the search & sort tool box to a new line (also fix a w3c error). + + +0.3.1 - 20130127 + * Add Facets to the OPDS catalog (check config item cops_books_filter). + So far the only OPDS client that support facets are Mantano Reader and Bluefire + * Fix book sort in some list. Patch provided by Tyler J. Wagner. + * Update .htaccess to check if Xsendfile is available. Thanks to Gaspine for the patch. + * Add basic support of custom columns. Check the following config item : cops_calibre_custom_column + * Usage of X-Accel-Redirect / X-Sendfile is not necessary anymore. Warning all Nginx users + who wants to still use X-Accel-Redirect must add + $config['cops_x_accel_redirect'] = "X-Accel-Redirect" in their config_local.php + * Fix COPS on IIS / Windows. Reported by Kevnancy. + * Simplified config_default.php + * Add a new config_local.php.example with the minimal configuration item to change. + + +0.3.0 - 20130106 + * Add a config item to avoid using Fancyapps (pop-ups). Reported by mcister and Northguy. + * Update documentation of .htaccess. Thanks to Stephane. + * Add a config item to specify a custom icon. Based on a patch by Tyler J. Wagner. + * Better handling of content type for book. Reported by Morg. + * Upped the size of thumbnails for OPDS. They look way better with Mantano. + * Add language in OPDS feed (shown in Mantano for example). + * Update metadata on downloaded epub. Disabled by default (check config item cops_update_epub-metadata). + * New Catalan translation provided by David Ciscar Presas. + * Add a permalink to books, that way direct link to books can be shared. Reported by mcister and Tyler J. Wagner. + * Add checkconfig.php that should allow to better detect the configuration problem (page in english only for now). + * Fix some plural strings / some missing title. Reported by David Ciscar Presas. + * Add an hint about the OPDS catalog in the HTML catalog. + +0.2.3 - 20121205 + * Add a .htaccess to make it easier to use with Apache + * Fix a typo in book download. Reported by jillmess + * Update localization (thanks to Calibre2Opds) + * Add some missing information from Calibre (language, rating for now). Reported by mcister + * Upgrade Fancybox to 2.1.3 + + +0.2.2 - 20121020 + * Changed JQuery URL to https (thanks to Dan Greve for the patch) + * Added paging to both OPDS and HTML catalog (use new config item cops_max_item_per_page) + * lots of code refactoring + * Authors are now splitted by first letter, this is the new default. You can go back to the old way with the config item cops_author_split_first_letter (reported by Northguy) + * Fix the link to books starting by special characters (reported by vinpel) + * Upgrade to Fancyapps 2.1.0. I had to adapt the CSS so maybe it'll display better in PRS-T1 + * Add an about box on the HTML catalog which show the current version + +0.2.1 - 20120916 + * Fix one last error (hopefully) in link generation (thanks to gaspine) + * Add Sony PRS-T1 to the list of E-Ink device (thanks to Northguy) + * Fix another HTML special characters problem (thanks to NeilBryant) + * Add an ugly config parameter to allow search in non-compliant OPDS reader (thanks to Don Caruana and David Lee) + +0.2.0 - 20120722 + * Fix all rewriting rule I forgot to change it in last release + * Fix
in book comment (thanks to jillmess) + * Fix cover zoom in HTML catalog (you can also navigate through cover with keyboard) + * Simplify Fancybox transition for e-Ink devices (for now Kobo and Kindle) + +0.1.1 - 20120702 + * A lot of bug fixes in HTML catalog + * Fixed the book comment in OPDS (broken in some rare case) + * Fixed handling of HTML reserved characters + * Changed book OPDS id to use an UUID (thanks to ilovejedd for the bug report) + * Add new config item for the default timezone (thanks to gaspine) + * Better handling of missing covers + * Should support every book format supported by Calibre (thanks to Artem) + * URL rewriting is off by default for the HTML catalog + * Add some documentation about URL rewriting (thanks to gaspine and Christophe) + * Tested and ready to use with PHP5.4 + +0.1.0 - 20120605 + * Add localization support (thanks to Calibre2Opds) + * Hopefully fixed an issue with & in comment + * HTML catalog is in the sources with no support (WIP) + +0.0.4 - 20120523 + * More code refactoring to simplify code. + * Changed OPDS Page id to match Calibre2Opds + * Add icons to author, serie, tags and recent items (there is config item to disable it) + * Fixed author URL + * Added publishing date (works on Mantano) + * Added Tags support + +0.0.3 - 20120507 + * Fixed many things blocking opensearch from working + * There was a bug introduced in 0.0.2 + * The URL can't be relative for Mantano reader, so I added a configuration item. + * I continued the refactoring to bring HTML to COPS + * Thumbnails have bigger size (I'll add a configuration item later) + * Add headers to help caching image and thumbnail to the browser + * + +0.0.2 - 20120411 + * Add support for MOBI and PDF + * Major refactoring to prepare something nice for the future ;) + * Add a config item to make use of X-Sendfile instead of X-Accel-Redirect if needed + +0.0.1 - 20120302 + * First public release diff --git a/sources/COPYING b/sources/COPYING new file mode 100644 index 0000000..d60c31a --- /dev/null +++ b/sources/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, 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 or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +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 give any other recipients of the Program a copy of this License +along with the Program. + +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 Program or any portion +of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +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 Program, 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 Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) 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; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, 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 executable. However, as a +special exception, the source code 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. + +If distribution of executable or 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 counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program 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. + + 5. 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 Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program 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 to +this License. + + 7. 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 Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program 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 Program. + +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. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program 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. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 Program +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 Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, 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 + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), 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 Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. 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 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 of the License, 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/sources/README.md b/sources/README.md new file mode 100644 index 0000000..e4661c3 --- /dev/null +++ b/sources/README.md @@ -0,0 +1,103 @@ +# COPS + +COPS stands for Calibre OPDS (and HTML) Php Server. + +See : [COPS's home](http://blog.slucas.fr/en/oss/calibre-opds-php-server) for more details. + +Don't forget to check the [Wiki](https://github.com/seblucas/cops/wiki). + +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/seblucas/cops/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/seblucas/cops/?branch=master) + +[![Code Coverage](https://scrutinizer-ci.com/g/seblucas/cops/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/seblucas/cops/?branch=master) + +[![Build Status / Scrutinizer](https://scrutinizer-ci.com/g/seblucas/cops/badges/build.png?b=master)](https://scrutinizer-ci.com/g/seblucas/cops/build-status/master) + +[![Build Status](https://travis-ci.org/seblucas/cops.svg?branch=master)](https://travis-ci.org/seblucas/cops) + +[![Selenium Test Status](https://saucelabs.com/browser-matrix/seblucas.svg)](https://saucelabs.com/u/seblucas) + +# Why ? + +In my opinion Calibre is a marvelous tool but is too big and has too much +dependencies to be used for its content server. + +That's the main reason why I coded this OPDS server. I needed a simple +tool to be installed on a small server (Seagate Dockstar in my case). + +I initially thought of Calibre2OPDS but as it generate static file no +search was possible. + +Later I added an simple HTML catalog that should be usable on my Kobo. + +So COPS's main advantages are : + * No need for many dependencies. + * No need for a lot of CPU or RAM. + * Not much code. + * Search is available. + * With Dropbox / owncloud it's very easy to have an up to date OPDS server. + * It was fun to code. + +If you want to use the OPDS feed don't forget to specify feed.php at the end of your URL. + +# Prerequisites + +1. PHP 5.3, 5.4, 5.5, 5.6 or hhvm with GD image processing, Libxml, Intl, Json & SQLite3 support. +2. A web server with PHP support. I only tested with various version of Nginx. + Other people reported it working with Apache and Cherokee. You can also use PHP + embedded server (https://github.com/seblucas/cops/wiki/Howto---PhpEmbeddedServer) +3. The path to a calibre library (metadata.db, format, & cover files). + +On any Debian base Linux you can use : + aptitude install php5-gd php5-sqlite php5-json php5-intl + +On Centos you may have to add : + yum install php-xml + +# Install + +1. Extract the zip file to a folder in web space (visible to the web server). +2. If you're doing a first-time install, copy config_local.php.example to config_local.php +3. Edit config_local.php to match your config. +4. If needed add other configuration item from config_default.php + +If you choose to put your Calibre directory inside your web directory then you +will have to edit /etc/nginx/mime.types to add this line : +application/epub+zip epub; + +If you like Docker, you can also try [this project](https://github.com/linuxserver/docker-cops) + +# Known problems + +Not a lot, except for the bad quality of the code (first PHP project ever) ;) + +Please see https://github.com/seblucas/cops/issues for open issues + +# Need help + +Please read https://github.com/seblucas/cops/wiki and check the FAQ. + +# Credits + + * Locale message handling is inspired of http://www.mind-it.info/2010/02/22/a-simple-approach-to-localization-in-php/ + * str_format function come from http://tmont.com/blargh/2010/1/string-format-in-php + * All icons come from Font Awesome : http://fontawesome.github.io/Font-Awesome/ + * The unofficial OPDS validator : http://opds-validator.appspot.com/ + * Thanks to all testers, translators and contributors. + * Feed icons made by Freepik from Flaticon website licensed under Creative Commons BY 3.0 http://www.flaticon.com and http://www.freepik.com + +External libraries used : + * JQuery : http://jquery.com/ + * Magnific Popup : http://dimsemenov.com/plugins/magnific-popup/ + * Php-epub-meta : https://github.com/splitbrain/php-epub-meta with some modification by me + https://github.com/seblucas/php-epub-meta + * TbsZip : http://www.tinybutstrong.com/apps/tbszip/tbszip_help.html + * DoT.js : http://olado.github.io/doT/index.html + * PHPMailer : https://github.com/PHPMailer/PHPMailer + * js-lru : https://github.com/rsms/js-lru + +# Copyright & License + +COPS - 2012-2016 (c) Sbastien Lucas + +See COPYING and file headers for license info + diff --git a/sources/about.html b/sources/about.html new file mode 100644 index 0000000..d794905 --- /dev/null +++ b/sources/about.html @@ -0,0 +1,23 @@ +
+

About COPS

+

Authors

+

COPS is developed and maintained by Sébastien Lucas.

+ +

See full history on Github to check all authors.

+ +

COPS use some external libraries, check README for the details.

+

Copyright

+

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation.

+ +

The complete content of license is provided in file COPYING within distribution and also available online.

+

Contact

+

For more info please visit COPS Home Page

+ +

You can also check COPS's topic on MobileRead forum.

+ +

DISCLAIMER : COPS is an open source software free to install everywhere. So if you have questions about any books available with any installation of COPS, please ask the owner of the website and not COPS's maintainer.

+

Thanks

+

Thanks a lot to Kovid Goyal for Calibre.

+ +

And many thanks to all those who helped test COPS.

+
diff --git a/sources/base.php b/sources/base.php new file mode 100644 index 0000000..dd6d7fd --- /dev/null +++ b/sources/base.php @@ -0,0 +1,364 @@ + + */ + +require 'config.php'; + +define ('VERSION', '1.0.2'); +define ('DB', 'db'); +date_default_timezone_set($config['default_timezone']); + + +function useServerSideRendering() +{ + global $config; + return preg_match('/' . $config['cops_server_side_render'] . '/', $_SERVER['HTTP_USER_AGENT']); +} + +function serverSideRender($data) +{ + // Get the templates + $theme = getCurrentTemplate (); + $header = file_get_contents('templates/' . $theme . '/header.html'); + $footer = file_get_contents('templates/' . $theme . '/footer.html'); + $main = file_get_contents('templates/' . $theme . '/main.html'); + $bookdetail = file_get_contents('templates/' . $theme . '/bookdetail.html'); + $page = file_get_contents('templates/' . $theme . '/page.html'); + + // Generate the function for the template + $template = new doT (); + $dot = $template->template ($page, array ('bookdetail' => $bookdetail, + 'header' => $header, + 'footer' => $footer, + 'main' => $main)); + // If there is a syntax error in the function created + // $dot will be equal to FALSE + if (!$dot) { + return FALSE; + } + // Execute the template + if (!empty ($data)) { + return $dot ($data); + } + + return NULL; +} + +function getQueryString() +{ + if (isset($_SERVER['QUERY_STRING'])) { + return $_SERVER['QUERY_STRING']; + } + return ""; +} + +function notFound() +{ + header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found'); + header('Status: 404 Not Found'); + + $_SERVER['REDIRECT_STATUS'] = 404; +} + +function getURLParam($name, $default = NULL) +{ + if (!empty ($_GET) && isset($_GET[$name]) && $_GET[$name] != '') { + return $_GET[$name]; + } + return $default; +} + +function getCurrentOption($option) +{ + global $config; + if (isset($_COOKIE[$option])) { + if (isset($config ['cops_' . $option]) && is_array ($config ['cops_' . $option])) { + return explode (',', $_COOKIE[$option]); + } else { + return $_COOKIE[$option]; + } + } + if (isset($config ['cops_' . $option])) { + return $config ['cops_' . $option]; + } + + return ''; +} + +function getCurrentCss() +{ + return 'templates/' . getCurrentTemplate () . '/styles/style-' . getCurrentOption('style') . '.css'; +} + +function getCurrentTemplate() +{ + return getCurrentOption ('template'); +} + +function getUrlWithVersion($url) +{ + return $url . '?v=' . VERSION; +} + +function xml2xhtml($xml) +{ + return preg_replace_callback('#<(\w+)([^>]*)\s*/>#s', function($m) { + $xhtml_tags = array('br', 'hr', 'input', 'frame', 'img', 'area', 'link', 'col', 'base', 'basefont', 'param'); + if (in_array($m[1], $xhtml_tags)) { + return '<' . $m[1] . $m[2] . ' />'; + } else { + return '<' . $m[1] . $m[2] . '>'; + } + }, $xml); +} + +function display_xml_error($error) +{ + $return = ''; + $return .= str_repeat('-', $error->column) . "^\n"; + + switch ($error->level) { + case LIBXML_ERR_WARNING: + $return .= 'Warning ' . $error->code . ': '; + break; + case LIBXML_ERR_ERROR: + $return .= 'Error ' . $error->code . ': '; + break; + case LIBXML_ERR_FATAL: + $return .= 'Fatal Error ' . $error->code . ': '; + break; + } + + $return .= trim($error->message) . + "\n Line: " . $error->line . + "\n Column: " . $error->column; + + if ($error->file) { + $return .= "\n File: " . $error->file; + } + + return "$return\n\n--------------------------------------------\n\n"; +} + +function are_libxml_errors_ok() +{ + $errors = libxml_get_errors(); + + foreach ($errors as $error) { + if ($error->code == 801) return false; + } + return true; +} + +function html2xhtml($html) +{ + $doc = new DOMDocument(); + libxml_use_internal_errors(true); + + $doc->loadHTML('' . + $html . ''); // Load the HTML + $output = $doc->saveXML($doc->documentElement); // Transform to an Ansi xml stream + $output = xml2xhtml($output); + if (preg_match ('#(.*)#ms', $output, $matches)) { + $output = $matches [1]; // Remove + } + /* + // In case of error with summary, use it to debug + $errors = libxml_get_errors(); + + foreach ($errors as $error) { + $output .= display_xml_error($error); + } + */ + + if (!are_libxml_errors_ok ()) $output = 'HTML code not valid.'; + + libxml_use_internal_errors(false); + return $output; +} + +/** + * This method is a direct copy-paste from + * http://tmont.com/blargh/2010/1/string-format-in-php + */ +function str_format($format) +{ + $args = func_get_args(); + $format = array_shift($args); + + preg_match_all('/(?=\{)\{(\d+)\}(?!\})/', $format, $matches, PREG_OFFSET_CAPTURE); + $offset = 0; + foreach ($matches[1] as $data) { + $i = $data[0]; + $format = substr_replace($format, @$args[$i], $offset + $data[1] - 1, 2 + strlen($i)); + $offset += strlen(@$args[$i]) - 2 - strlen($i); + } + + return $format; +} + +/** + * Get all accepted languages from the browser and put them in a sorted array + * languages id are normalized : fr-fr -> fr_FR + * @return array of languages + */ +function getAcceptLanguages() +{ + $langs = array(); + + if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { + // break up string into pieces (languages and q factors) + $accept = $_SERVER['HTTP_ACCEPT_LANGUAGE']; + if (preg_match('/^(\w{2})-\w{2}$/', $accept, $matches)) { + // Special fix for IE11 which send fr-FR and nothing else + $accept = $accept . ',' . $matches[1] . ';q=0.8'; + } + preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $accept, $lang_parse); + + if (count($lang_parse[1])) { + $langs = array(); + foreach ($lang_parse[1] as $lang) { + // Format the language code (not standard among browsers) + if (strlen($lang) == 5) { + $lang = str_replace('-', '_', $lang); + $splitted = preg_split('/_/', $lang); + $lang = $splitted[0] . '_' . strtoupper($splitted[1]); + } + array_push($langs, $lang); + } + // create a list like "en" => 0.8 + $langs = array_combine($langs, $lang_parse[4]); + + // set default to 1 for any without q factor + foreach ($langs as $lang => $val) { + if ($val === '') $langs[$lang] = 1; + } + + // sort list based on value + arsort($langs, SORT_NUMERIC); + } + } + + return $langs; +} + +/** + * Find the best translation file possible based on the accepted languages + * @return array of language and language file + */ +function getLangAndTranslationFile() +{ + global $config; + $langs = array(); + $lang = 'en'; + if (!empty($config['cops_language'])) { + $lang = $config['cops_language']; + } + elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { + $langs = getAcceptLanguages(); + } + //echo var_dump($langs); + $lang_file = NULL; + foreach ($langs as $language => $val) { + $temp_file = dirname(__FILE__). '/lang/Localization_' . $language . '.json'; + if (file_exists($temp_file)) { + $lang = $language; + $lang_file = $temp_file; + break; + } + } + if (empty ($lang_file)) { + $lang_file = dirname(__FILE__). '/lang/Localization_' . $lang . '.json'; + } + return array($lang, $lang_file); +} + +/** + * This method is based on this page + * http://www.mind-it.info/2010/02/22/a-simple-approach-to-localization-in-php/ + */ +function localize($phrase, $count=-1, $reset=false) +{ + global $config; + if ($count == 0) + $phrase .= '.none'; + if ($count == 1) + $phrase .= '.one'; + if ($count > 1) + $phrase .= '.many'; + + /* Static keyword is used to ensure the file is loaded only once */ + static $translations = NULL; + if ($reset) { + $translations = NULL; + } + /* If no instance of $translations has occured load the language file */ + if (is_null($translations)) { + $lang_file_en = NULL; + list ($lang, $lang_file) = getLangAndTranslationFile(); + if ($lang != 'en') { + $lang_file_en = dirname(__FILE__). '/lang/' . 'Localization_en.json'; + } + + $lang_file_content = file_get_contents($lang_file); + /* Load the language file as a JSON object and transform it into an associative array */ + $translations = json_decode($lang_file_content, true); + + /* Clean the array of all unfinished translations */ + foreach (array_keys ($translations) as $key) { + if (preg_match ('/^##TODO##/', $key)) { + unset ($translations [$key]); + } + } + if (!is_null($lang_file_en)) { + $lang_file_content = file_get_contents($lang_file_en); + $translations_en = json_decode($lang_file_content, true); + $translations = array_merge ($translations_en, $translations); + } + } + if (array_key_exists ($phrase, $translations)) { + return $translations[$phrase]; + } + return $phrase; +} + +function addURLParameter($urlParams, $paramName, $paramValue) +{ + if (empty ($urlParams)) { + $urlParams = ''; + } + $start = ''; + if (preg_match ('#^\?(.*)#', $urlParams, $matches)) { + $start = '?'; + $urlParams = $matches[1]; + } + $params = array(); + parse_str($urlParams, $params); + if (empty ($paramValue) && $paramValue != 0) { + unset ($params[$paramName]); + } else { + $params[$paramName] = $paramValue; + } + return $start . http_build_query($params); +} + +function useNormAndUp() +{ + global $config; + return $config ['cops_normalized_search'] == '1'; +} + +function normalizeUtf8String($s) +{ + include_once 'transliteration.php'; + return _transliteration_process($s); +} + +function normAndUp($s) +{ + return mb_strtoupper(normalizeUtf8String($s), 'UTF-8'); +} diff --git a/sources/build.xml b/sources/build.xml new file mode 100644 index 0000000..9cb7a2d --- /dev/null +++ b/sources/build.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/checkconfig.php b/sources/checkconfig.php new file mode 100644 index 0000000..242a80a --- /dev/null +++ b/sources/checkconfig.php @@ -0,0 +1,260 @@ + + + + * + */ + + require_once 'config.php'; + require_once 'base.php'; + + $err = getURLParam('err', -1); + $full = getURLParam('full'); + $error = NULL; + switch ($err) { + case 1 : + $error = 'Database error'; + break; + } + +?> + + + + COPS Configuration Check + + + +
+
+
+

COPS Configuration Check

+
+
+ +
+ +
+

You've been redirected because COPS is not configured properly

+

+
+ +
+

Check if PHP version is correct

+

+ = 50300) { + echo 'OK (' . PHP_VERSION . ')'; + } else { + echo 'Please install PHP >= 5.3 (' . PHP_VERSION . ')'; + } + } else { + echo 'Please install PHP >= 5.3'; + } + ?> +

+
+
+

Check if GD is properly installed and loaded

+

+ +

+
+
+

Check if Sqlite is properly installed and loaded

+

+ +

+
+
+

Check if libxml is properly installed and loaded

+

+ +

+
+
+

Check if Json is properly installed and loaded

+

+ +

+
+
+

Check if mbstring is properly installed and loaded

+

+ +

+
+
+

Check if intl is properly installed and loaded

+

+ +

+
+
+

Check if Normalizer class is properly installed and loaded

+

+ +

+
+
+

Check if the rendering will be done on client side or server side

+

+ +

+
+ $database) { +?> +
+

Check if Calibre database path is not an URL

+

+ +

+
+
+

Check if Calibre database file exists and is readable

+

+ +
  • Value of $config[\'calibre_directory\'] in config_local.php
  • +
  • Value of open_basedir in your php.ini
  • +
  • The access rights of the Calibre Database
  • +
  • Synology users please read this
  • +'; + } + ?> +

    +
    + +
    +

    Check if Calibre database file can be opened with PHP

    +

    + +

    +
    +
    +

    Check if Calibre database file contains at least some of the needed tables

    +

    + query('select count(*) FROM sqlite_master WHERE type="table" AND name in ("books", "authors", "tags", "series")')->fetchColumn(); + if ($count == 4) { + echo $name . ' OK'; + } else { + echo $name . ' Not all Calibre tables were found. Are you sure you\'re using the correct database.'; + } + } catch (Exception $e) { + echo $name . ' If the file is readable, check your php configuration. Exception detail : ' . $e; + } + ?> +

    +
    + +
    +

    Check if all Calibre books are found

    +

    + prepare('select books.path || "/" || data.name || "." || lower (format) as fullpath from data join books on data.book = books.id'); + $result->execute(); + while ($post = $result->fetchObject()) + { + if (!is_file (Base::getDbDirectory($i) . $post->fullpath)) { + echo '

    ' . Base::getDbDirectory($i) . $post->fullpath . '

    '; + } + } + } catch (Exception $e) { + echo $name . ' If the file is readable, check your php configuration. Exception detail : ' . $e; + } + ?> +

    +
    + +
    +
    +
    + + diff --git a/sources/composer-dl.sh b/sources/composer-dl.sh new file mode 100755 index 0000000..043f357 --- /dev/null +++ b/sources/composer-dl.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# https://getcomposer.org/ +if [ -x `which wget` ]; then + echo "wget found." + wget -q https://getcomposer.org/installer -O - | php +elif [ -x `which curl` ]; then + echo "curl found." + curl -sS https://getcomposer.org/installer | php +else + echo "Please install wget or curl to download Composer." +fi + +if [ -f "./composer.phar" ]; then + chmod a+x ./composer.phar + + # Install support for bower and NPM packages + ./composer.phar global require "fxp/composer-asset-plugin:~1.1" +fi diff --git a/sources/composer.json b/sources/composer.json new file mode 100644 index 0000000..6933c45 --- /dev/null +++ b/sources/composer.json @@ -0,0 +1,74 @@ +{ + "name": "Calibre OPDS (and HTML) PHP Server", + "description": "web-based light alternative to Calibre content server / Calibre2OPDS to serve ebooks (epub, mobi, pdf, ...)", + "require": { + "ext-gd": "*", + "ext-xml": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-pdo_sqlite": "*", + "ext-mbstring": "*", + "dimsemenov/magnific-popup": "~1.0", + "phpmailer/phpmailer": "~5.2", + "twbs/bootstrap": "~3.3", + "bower-asset/jQuery": "~1.11", + "bower-asset/jquery-cookie": "~1.4", + "bower-asset/normalize.css": "~3.0", + "twitter/typeahead.js": "~0.10.5", + "seblucas/dot-php": "~1.0.0", + "seblucas/php-epub-meta": "~1.0.0", + "seblucas/tbszip": "~2.16", + "simonpioli/sortelements": "dev-master", + "bower-asset/doT": "~1.0.1", + "rsms/js-lru": "dev-v2" + }, + "require-dev": { + "phpunit/phpunit": "5.4.* || 4.8.*", + "sauce/sausage": ">=0.12.0", + "phing/phing": "2.*" + }, + "autoload": { + "classmap": ["lib/", "resources/"] + }, + "repositories": [ + { + "type": "package", + "package": { + "name": "seblucas/dot-php", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/seblucas/doT-php", + "reference": "master" + }, + "autoload": { + "classmap": ["./"] + } + } + }, + { + "type": "package", + "package": { + "name": "simonpioli/sortelements", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/simonpioli/sortElements", + "reference": "master" + } + } + }, + { + "type": "package", + "package": { + "name": "rsms/js-lru", + "version": "dev-v2", + "source": { + "type": "git", + "url": "https://github.com/rsms/js-lru", + "reference": "v2" + } + } + } + ] +} diff --git a/sources/composer.lock b/sources/composer.lock new file mode 100644 index 0000000..0144816 --- /dev/null +++ b/sources/composer.lock @@ -0,0 +1,2517 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "796be60d03ca5c5b4f2f01e3d4d4b870", + "content-hash": "5cdf7fa70c21736e02127769497e9b5b", + "packages": [ + { + "name": "bower-asset/dot", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/olado/doT.git", + "reference": "195025f06055761f6da3a900251382e788c42d0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/olado/doT/zipball/195025f06055761f6da3a900251382e788c42d0e", + "reference": "195025f06055761f6da3a900251382e788c42d0e", + "shasum": "" + }, + "type": "bower-asset-library" + }, + { + "name": "bower-asset/jquery", + "version": "1.12.4", + "source": { + "type": "git", + "url": "https://github.com/jquery/jquery-dist.git", + "reference": "5e89585e0121e72ff47de177c5ef604f3089a53d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jquery/jquery-dist/zipball/5e89585e0121e72ff47de177c5ef604f3089a53d", + "reference": "5e89585e0121e72ff47de177c5ef604f3089a53d", + "shasum": "" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": "dist/jquery.js", + "bower-asset-ignore": [ + "package.json" + ] + }, + "license": [ + "MIT" + ], + "keywords": [ + "browser", + "javascript", + "jquery", + "library" + ] + }, + { + "name": "bower-asset/jquery-cookie", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/carhartl/jquery-cookie.git", + "reference": "7f88a4e631aba8a8c688fd8999ce6b9bcfd50718" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/carhartl/jquery-cookie/zipball/7f88a4e631aba8a8c688fd8999ce6b9bcfd50718", + "reference": "7f88a4e631aba8a8c688fd8999ce6b9bcfd50718", + "shasum": "" + }, + "require": { + "bower-asset/jquery": ">=1.2" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": [ + "./jquery.cookie.js" + ], + "bower-asset-ignore": [ + "test", + ".*", + "*.json", + "*.md", + "*.txt", + "Gruntfile.js" + ] + } + }, + { + "name": "bower-asset/normalize.css", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/necolas/normalize.css.git", + "reference": "2bdda84272650aedfb45d8abe11a6d177933a803" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/necolas/normalize.css/zipball/2bdda84272650aedfb45d8abe11a6d177933a803", + "reference": "2bdda84272650aedfb45d8abe11a6d177933a803", + "shasum": "" + }, + "type": "bower-asset-library", + "extra": { + "bower-asset-main": "normalize.css", + "bower-asset-ignore": [ + "CHANGELOG.md", + "CONTRIBUTING.md", + "component.json", + "package.json", + "test.html" + ] + } + }, + { + "name": "dimsemenov/magnific-popup", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/dimsemenov/Magnific-Popup.git", + "reference": "6b7a8088783cbce01034414c1fd2d8e1889093ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dimsemenov/Magnific-Popup/zipball/6b7a8088783cbce01034414c1fd2d8e1889093ae", + "reference": "6b7a8088783cbce01034414c1fd2d8e1889093ae", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "description": "Light and responsive lightbox script with focus on performance.", + "homepage": "http://dimsemenov.com/plugins/magnific-popup/", + "time": "2016-02-20 09:06:30" + }, + { + "name": "phpmailer/phpmailer", + "version": "v5.2.17", + "source": { + "type": "git", + "url": "https://github.com/PHPMailer/PHPMailer.git", + "reference": "208913c6042967ba404f4bfa0819bf5bef79dbec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/208913c6042967ba404f4bfa0819bf5bef79dbec", + "reference": "208913c6042967ba404f4bfa0819bf5bef79dbec", + "shasum": "" + }, + "require": { + "php": ">=5.0.0" + }, + "require-dev": { + "phpdocumentor/phpdocumentor": "*", + "phpunit/phpunit": "4.7.*" + }, + "suggest": { + "league/oauth2-google": "Needed for Google XOAUTH2 authentication" + }, + "type": "library", + "autoload": { + "classmap": [ + "class.phpmailer.php", + "class.phpmaileroauth.php", + "class.phpmaileroauthgoogle.php", + "class.smtp.php", + "class.pop3.php", + "extras/EasyPeasyICS.php", + "extras/ntlm_sasl_client.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, + { + "name": "Marcus Bointon", + "email": "phpmailer@synchromedia.co.uk" + }, + { + "name": "Andy Prevost", + "email": "codeworxtech@users.sourceforge.net" + }, + { + "name": "Brent R. Matzelle" + } + ], + "description": "PHPMailer is a full-featured email creation and transfer class for PHP", + "time": "2016-12-09 10:03:48" + }, + { + "name": "rsms/js-lru", + "version": "dev-v2", + "source": { + "type": "git", + "url": "https://github.com/rsms/js-lru", + "reference": "v2" + }, + "type": "library", + "time": "2016-11-16 03:30:49" + }, + { + "name": "seblucas/dot-php", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/seblucas/doT-php.git", + "reference": "0b6b351e539007eb72c0c34131204d036ce4454f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/seblucas/doT-php/zipball/0b6b351e539007eb72c0c34131204d036ce4454f", + "reference": "0b6b351e539007eb72c0c34131204d036ce4454f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "doT.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0" + ], + "authors": [ + { + "name": "Sébastien Lucas", + "email": "sebastien@slucas.fr", + "homepage": "http://www.slucas.fr/", + "role": "Developer" + } + ], + "description": "PHP rendering engine for doT.js (The fastest + concise javascript template engine for nodejs and browsers)", + "homepage": "https://github.com/seblucas/doT-php", + "keywords": [ + "Rendering", + "dot", + "engine", + "template" + ], + "time": "2016-07-03 12:29:39" + }, + { + "name": "seblucas/php-epub-meta", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/seblucas/php-epub-meta.git", + "reference": "ee222ba6f75c809dd88fa8bc5798fc7868fd915c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/seblucas/php-epub-meta/zipball/ee222ba6f75c809dd88fa8bc5798fc7868fd915c", + "reference": "ee222ba6f75c809dd88fa8bc5798fc7868fd915c", + "shasum": "" + }, + "require": { + "ext-xml": "*", + "ext-zip": "*", + "php": ">=5.3.0", + "seblucas/tbszip": "~2.16.0" + }, + "require-dev": { + "phpunit/phpunit": "4.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "authors": [ + { + "name": "Sébastien Lucas", + "email": "sebastien@slucas.fr", + "homepage": "http://www.slucas.fr/", + "role": "Developer" + }, + { + "name": "Andreas Gohr", + "email": "andi@splitbrain.org", + "homepage": "https://www.splitbrain.org/", + "role": "Developer" + } + ], + "description": "Reading and writing metadata included in the EPub ebook format", + "homepage": "https://github.com/seblucas/php-epub-meta", + "keywords": [ + "ebook", + "epub", + "metadata" + ], + "time": "2016-07-03 20:07:37" + }, + { + "name": "seblucas/tbszip", + "version": "2.16.1", + "source": { + "type": "git", + "url": "https://github.com/seblucas/tbszip.git", + "reference": "2c50bf309bb4431a24e206f164fdb4a2e6b10b7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/seblucas/tbszip/zipball/2c50bf309bb4431a24e206f164fdb4a2e6b10b7f", + "reference": "2c50bf309bb4431a24e206f164fdb4a2e6b10b7f", + "shasum": "" + }, + "require": { + "ext-zlib": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "5.4.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "tbszip.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1+" + ], + "authors": [ + { + "name": "Skrol29", + "homepage": "http://www.tinybutstrong.com/", + "role": "Developer" + }, + { + "name": "Sébastien Lucas", + "email": "sebastien@slucas.fr", + "homepage": "http://www.slucas.fr/", + "role": "Developer" + } + ], + "description": "Work with zip archives without making temporary files or needing binaries", + "homepage": "http://www.tinybutstrong.com/tools.php", + "keywords": [ + "archive", + "compression", + "zip" + ], + "time": "2016-07-03 12:26:16" + }, + { + "name": "simonpioli/sortelements", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/simonpioli/sortElements", + "reference": "master" + }, + "type": "library", + "time": "2012-04-25 11:04:51" + }, + { + "name": "twbs/bootstrap", + "version": "v3.3.7", + "source": { + "type": "git", + "url": "https://github.com/twbs/bootstrap.git", + "reference": "0b9c4a4007c44201dce9a6cc1a38407005c26c86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twbs/bootstrap/zipball/0b9c4a4007c44201dce9a6cc1a38407005c26c86", + "reference": "0b9c4a4007c44201dce9a6cc1a38407005c26c86", + "shasum": "" + }, + "replace": { + "twitter/bootstrap": "self.version" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jacob Thornton", + "email": "jacobthornton@gmail.com" + }, + { + "name": "Mark Otto", + "email": "markdotto@gmail.com" + } + ], + "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", + "homepage": "http://getbootstrap.com", + "keywords": [ + "JS", + "css", + "framework", + "front-end", + "less", + "mobile-first", + "responsive", + "web" + ], + "time": "2016-07-25 15:51:55" + }, + { + "name": "twitter/typeahead.js", + "version": "v0.10.5", + "source": { + "type": "git", + "url": "https://github.com/twitter/typeahead.js.git", + "reference": "5f198b87d1af845da502ea9df93a5e84801ce742" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twitter/typeahead.js/zipball/5f198b87d1af845da502ea9df93a5e84801ce742", + "reference": "5f198b87d1af845da502ea9df93a5e84801ce742", + "shasum": "" + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Twitter Inc.", + "homepage": "https://twitter.com/twitteross" + } + ], + "description": "fast and fully-featured autocomplete library", + "homepage": "http://twitter.github.com/typeahead.js", + "keywords": [ + "autocomplete", + "typeahead" + ], + "time": "2014-08-08 06:18:07" + } + ], + "packages-dev": [ + { + "name": "appium/php-client", + "version": "v0.2.0", + "source": { + "type": "git", + "url": "https://github.com/appium/php-client.git", + "reference": "06c68c20d389bfd50a512393b1fe750cc5044b2f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/appium/php-client/zipball/06c68c20d389bfd50a512393b1fe750cc5044b2f", + "reference": "06c68c20d389bfd50a512393b1fe750cc5044b2f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "phpunit/phpunit-selenium": ">=1.3.3" + }, + "type": "appium-php", + "autoload": { + "classmap": [ + "PHPUnit/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Isaac Murchie", + "email": "isaac@saucelabs.com", + "homepage": "http://www.saucelabs.com", + "role": "Lead" + } + ], + "description": "PHP client for Selenium 3.0/Appium 1.0", + "homepage": "http://github.com/appium/appium-php", + "keywords": [ + "appium", + "phpunit", + "selenium" + ], + "time": "2016-11-09 01:09:43" + }, + { + "name": "brianium/habitat", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/brianium/habitat.git", + "reference": "d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brianium/habitat/zipball/d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96", + "reference": "d0979e3bb379cbc78ecb42b3ac171bc2b7e06d96", + "shasum": "" + }, + "require-dev": { + "monolog/monolog": ">=1.5.0", + "phpunit/phpunit": ">=3.7.21" + }, + "type": "library", + "autoload": { + "psr-0": { + "Habitat": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian", + "email": "scaturrob@gmail.com", + "homepage": "http://brianscaturro.com", + "role": "Lead" + } + ], + "description": "A dependable php environment", + "time": "2013-06-08 04:42:29" + }, + { + "name": "brianium/paratest", + "version": "0.14.0", + "source": { + "type": "git", + "url": "https://github.com/brianium/paratest.git", + "reference": "dddcfa8510da7aae9616ba1738ebf630d9e84aa4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brianium/paratest/zipball/dddcfa8510da7aae9616ba1738ebf630d9e84aa4", + "reference": "dddcfa8510da7aae9616ba1738ebf630d9e84aa4", + "shasum": "" + }, + "require": { + "brianium/habitat": "1.0.0", + "composer/semver": "~1.2", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "php": ">=5.5.11", + "phpunit/php-timer": ">=1.0.4", + "phpunit/phpunit": ">=3.7.8", + "symfony/console": "~2.3|~3.0", + "symfony/process": "~2.3|~3.0" + }, + "bin": [ + "bin/paratest" + ], + "type": "library", + "autoload": { + "psr-0": { + "ParaTest": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "homepage": "http://brianscaturro.com", + "role": "Lead" + } + ], + "description": "Parallel testing for PHP", + "homepage": "https://github.com/brianium/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "time": "2016-08-12 20:14:13" + }, + { + "name": "composer/semver", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573", + "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "time": "2016-08-30 16:08:34" + }, + { + "name": "doctrine/instantiator", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2015-06-14 21:17:01" + }, + { + "name": "myclabs/deep-copy", + "version": "1.5.5", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/399c1f9781e222f6eb6cc238796f5200d1b7f108", + "reference": "399c1f9781e222f6eb6cc238796f5200d1b7f108", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "doctrine/collections": "1.*", + "phpunit/phpunit": "~4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "homepage": "https://github.com/myclabs/DeepCopy", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2016-10-31 17:19:45" + }, + { + "name": "phing/phing", + "version": "2.15.2", + "source": { + "type": "git", + "url": "https://github.com/phingofficial/phing.git", + "reference": "0999ab4e94e609dc00998e3d1b88df843054db7c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phingofficial/phing/zipball/0999ab4e94e609dc00998e3d1b88df843054db7c", + "reference": "0999ab4e94e609dc00998e3d1b88df843054db7c", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "require-dev": { + "ext-pdo_sqlite": "*", + "lastcraft/simpletest": "@dev", + "mikey179/vfsstream": "^1.6", + "pdepend/pdepend": "2.x", + "pear/archive_tar": "1.4.x", + "pear/http_request2": "dev-trunk", + "pear/net_growl": "dev-trunk", + "pear/pear-core-minimal": "1.10.1", + "pear/versioncontrol_git": "@dev", + "pear/versioncontrol_svn": "~0.5", + "phpdocumentor/phpdocumentor": "2.x", + "phploc/phploc": "~2.0.6", + "phpmd/phpmd": "~2.2", + "phpunit/phpunit": ">=3.7", + "sebastian/git": "~1.0", + "sebastian/phpcpd": "2.x", + "siad007/versioncontrol_hg": "^1.0", + "squizlabs/php_codesniffer": "~2.2", + "symfony/yaml": "~2.7" + }, + "suggest": { + "pdepend/pdepend": "PHP version of JDepend", + "pear/archive_tar": "Tar file management class", + "pear/versioncontrol_git": "A library that provides OO interface to handle Git repository", + "pear/versioncontrol_svn": "A simple OO-style interface for Subversion, the free/open-source version control system", + "phpdocumentor/phpdocumentor": "Documentation Generator for PHP", + "phploc/phploc": "A tool for quickly measuring the size of a PHP project", + "phpmd/phpmd": "PHP version of PMD tool", + "phpunit/php-code-coverage": "Library that provides collection, processing, and rendering functionality for PHP code coverage information", + "phpunit/phpunit": "The PHP Unit Testing Framework", + "sebastian/phpcpd": "Copy/Paste Detector (CPD) for PHP code", + "siad007/versioncontrol_hg": "A library for interfacing with Mercurial repositories.", + "tedivm/jshrink": "Javascript Minifier built in PHP" + }, + "bin": [ + "bin/phing" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.15.x-dev" + } + }, + "autoload": { + "classmap": [ + "classes/phing/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "classes" + ], + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Michiel Rook", + "email": "mrook@php.net" + }, + { + "name": "Phing Community", + "homepage": "https://www.phing.info/trac/wiki/Development/Contributors" + } + ], + "description": "PHing Is Not GNU make; it's a PHP project build system or build tool based on Apache Ant.", + "homepage": "https://www.phing.info/", + "keywords": [ + "build", + "phing", + "task", + "tool" + ], + "time": "2016-10-13 09:01:45" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2015-12-27 11:43:31" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", + "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0@dev", + "phpdocumentor/type-resolver": "^0.2.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2016-09-30 07:12:33" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.2.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", + "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2016-11-25 06:54:22" + }, + { + "name": "phpspec/prophecy", + "version": "v1.6.2", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "6c52c2722f8460122f96f86346600e1077ce22cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/6c52c2722f8460122f96f86346600e1077ce22cb", + "reference": "6c52c2722f8460122f96f86346600e1077ce22cb", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "sebastian/comparator": "^1.1", + "sebastian/recursion-context": "^1.0|^2.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.0", + "phpunit/phpunit": "^4.8 || ^5.6.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2016-11-21 14:58:47" + }, + { + "name": "phpunit/php-code-coverage", + "version": "4.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "903fd6318d0a90b4770a009ff73e4a4e9c437929" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/903fd6318d0a90b4770a009ff73e4a4e9c437929", + "reference": "903fd6318d0a90b4770a009ff73e4a4e9c437929", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "^1.4.2", + "sebastian/code-unit-reverse-lookup": "~1.0", + "sebastian/environment": "^1.3.2 || ^2.0", + "sebastian/version": "~1.0|~2.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "^5.4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.4.0", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2016-11-28 16:00:31" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2016-10-03 07:40:28" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2015-06-21 13:50:34" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4|~5" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2016-05-12 18:03:57" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3b402f65a4cc90abf6e1104e388b896ce209631b", + "reference": "3b402f65a4cc90abf6e1104e388b896ce209631b", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2016-11-15 14:06:22" + }, + { + "name": "phpunit/phpunit", + "version": "5.4.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "3132365e1430c091f208e120b8845d39c25f20e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3132365e1430c091f208e120b8845d39c25f20e6", + "reference": "3132365e1430c091f208e120b8845d39c25f20e6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "myclabs/deep-copy": "~1.3", + "php": "^5.6 || ^7.0", + "phpspec/prophecy": "^1.3.1", + "phpunit/php-code-coverage": "^4.0.1", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "^1.0.6", + "phpunit/phpunit-mock-objects": "^3.2", + "sebastian/comparator": "~1.1", + "sebastian/diff": "~1.2", + "sebastian/environment": "^1.3 || ^2.0", + "sebastian/exporter": "~1.2", + "sebastian/global-state": "~1.0", + "sebastian/object-enumerator": "~1.0", + "sebastian/resource-operations": "~1.0", + "sebastian/version": "~1.0|~2.0", + "symfony/yaml": "~2.1|~3.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "3.0.2" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2016-07-26 14:48:00" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", + "reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.6 || ^7.0", + "phpunit/php-text-template": "^1.2", + "sebastian/exporter": "^1.2 || ^2.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2016-12-08 20:27:08" + }, + { + "name": "phpunit/phpunit-selenium", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/giorgiosironi/phpunit-selenium.git", + "reference": "d3aa8984c31efcff7c8829b9bd9ad7ab4c94709c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/giorgiosironi/phpunit-selenium/zipball/d3aa8984c31efcff7c8829b9bd9ad7ab4c94709c", + "reference": "d3aa8984c31efcff7c8829b9bd9ad7ab4c94709c", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-dom": "*", + "php": ">=5.6", + "phpunit/phpunit": "~5.0", + "sebastian/comparator": "~1.0" + }, + "require-dev": { + "phing/phing": "2.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHPUnit/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Giorgio Sironi", + "email": "info@giorgiosironi.com", + "role": "developer" + }, + { + "name": "Ivan Kurnosov", + "email": "zerkms@zerkms.com", + "role": "developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "original developer" + } + ], + "description": "Selenium Server integration for PHPUnit", + "homepage": "http://www.phpunit.de/", + "keywords": [ + "phpunit", + "selenium", + "testing", + "xunit" + ], + "time": "2016-04-22 10:41:33" + }, + { + "name": "psr/log", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10 12:19:37" + }, + { + "name": "sauce/sausage", + "version": "0.17.0", + "source": { + "type": "git", + "url": "https://github.com/jlipps/sausage.git", + "reference": "ce7fea6a8de0090459cf23719aec907452600aa6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jlipps/sausage/zipball/ce7fea6a8de0090459cf23719aec907452600aa6", + "reference": "ce7fea6a8de0090459cf23719aec907452600aa6", + "shasum": "" + }, + "require": { + "appium/php-client": ">=0.1.0", + "brianium/paratest": ">=0.12.1", + "php": ">=5.4.0", + "phpunit/phpunit-selenium": ">=1.4.1", + "sauce/sausage-installer": ">=0.1.0" + }, + "require-dev": { + "phpunit/phpunit": ">=4.5.1" + }, + "suggest": { + "sauce/connect": ">=3.1" + }, + "bin": [ + "bin/sauce_config" + ], + "type": "sauce-sausage", + "autoload": { + "psr-0": { + "Sauce": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Jonathan Lipps", + "email": "jlipps@saucelabs.com", + "homepage": "http://www.saucelabs.com", + "role": "Lead" + } + ], + "description": "PHP version of the Sauce Labs API", + "homepage": "http://github.com/jlipps/sausage", + "keywords": [ + "Sauce", + "SauceLabs", + "api", + "appium", + "phpunit", + "selenium", + "testing" + ], + "time": "2015-04-28 03:02:03" + }, + { + "name": "sauce/sausage-installer", + "version": "v0.1.0", + "source": { + "type": "git", + "url": "https://github.com/jlipps/sausage-installer.git", + "reference": "5435cadb3ef1cec77218814af3c121b3556a5444" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jlipps/sausage-installer/zipball/5435cadb3ef1cec77218814af3c121b3556a5444", + "reference": "5435cadb3ef1cec77218814af3c121b3556a5444", + "shasum": "" + }, + "type": "composer-installer", + "extra": { + "class": "Sauce\\Composer\\SausageInstaller" + }, + "autoload": { + "psr-0": { + "Sauce": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Jonathan Lipps", + "email": "jlipps@saucelabs.com", + "homepage": "http://www.saucelabs.com", + "role": "Lead" + } + ], + "homepage": "http://github.com/jlipps/sausage-installer", + "time": "2012-09-28 18:41:38" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/c36f5e7cfce482fde5bf8d10d41a53591e0198fe", + "reference": "c36f5e7cfce482fde5bf8d10d41a53591e0198fe", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "~5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "time": "2016-02-13 06:45:14" + }, + { + "name": "sebastian/comparator", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/6a1ed12e8b2409076ab22e3897126211ff8b1f7f", + "reference": "6a1ed12e8b2409076ab22e3897126211ff8b1f7f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2 || ~2.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2016-11-19 09:18:40" + }, + { + "name": "sebastian/diff", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", + "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2015-12-08 07:14:41" + }, + { + "name": "sebastian/environment", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2016-11-26 07:53:53" + }, + { + "name": "sebastian/exporter", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2016-06-17 09:04:28" + }, + { + "name": "sebastian/global-state", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", + "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2015-10-12 03:26:01" + }, + { + "name": "sebastian/object-enumerator", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "d4ca2fb70344987502567bc50081c03e6192fb26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/d4ca2fb70344987502567bc50081c03e6192fb26", + "reference": "d4ca2fb70344987502567bc50081c03e6192fb26", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "time": "2016-01-28 13:25:10" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791", + "reference": "913401df809e99e4f47b27cdd781f4a258d58791", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2015-11-11 19:50:13" + }, + { + "name": "sebastian/resource-operations", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "time": "2015-07-28 20:34:47" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2016-10-03 07:35:21" + }, + { + "name": "symfony/console", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "d12aa9ca20f4db83ec58410978dab6afcb9d6aaa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/d12aa9ca20f4db83ec58410978dab6afcb9d6aaa", + "reference": "d12aa9ca20f4db83ec58410978dab6afcb9d6aaa", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "symfony/debug": "~2.8|~3.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/event-dispatcher": "~2.8|~3.0", + "symfony/filesystem": "~2.8|~3.0", + "symfony/process": "~2.8|~3.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/filesystem": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2016-12-11 14:34:22" + }, + { + "name": "symfony/debug", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "9f923e68d524a3095c5a2ae5fc7220c7cbc12231" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/9f923e68d524a3095c5a2ae5fc7220c7cbc12231", + "reference": "9f923e68d524a3095c5a2ae5fc7220c7cbc12231", + "shasum": "" + }, + "require": { + "php": ">=5.5.9", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/class-loader": "~2.8|~3.0", + "symfony/http-kernel": "~2.8|~3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2016-11-16 22:18:16" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", + "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2016-11-14 01:06:16" + }, + { + "name": "symfony/process", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "02ea84847aad71be7e32056408bb19f3a616cdd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/02ea84847aad71be7e32056408bb19f3a616cdd3", + "reference": "02ea84847aad71be7e32056408bb19f3a616cdd3", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2016-11-24 10:40:28" + }, + { + "name": "symfony/yaml", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "a7095af4b97a0955f85c8989106c249fa649011f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/a7095af4b97a0955f85c8989106c249fa649011f", + "reference": "a7095af4b97a0955f85c8989106c249fa649011f", + "shasum": "" + }, + "require": { + "php": ">=5.5.9" + }, + "require-dev": { + "symfony/console": "~2.8|~3.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2016-12-10 10:07:06" + }, + { + "name": "webmozart/assert", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", + "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2016-11-23 20:04:58" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": { + "simonpioli/sortelements": 20, + "rsms/js-lru": 20 + }, + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "ext-gd": "*", + "ext-xml": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-pdo_sqlite": "*", + "ext-mbstring": "*" + }, + "platform-dev": [] +} diff --git a/sources/config.php b/sources/config.php new file mode 100644 index 0000000..b1e487a --- /dev/null +++ b/sources/config.php @@ -0,0 +1,36 @@ + + */ + +require_once dirname(__FILE__) . '/vendor/autoload.php'; +require dirname(__FILE__) . '/config_default.php'; +if (file_exists(dirname(__FILE__) . '/config_local.php') && (php_sapi_name() !== 'cli')) { + require dirname(__FILE__) . '/config_local.php'; +} + +$remote_user = array_key_exists('PHP_AUTH_USER', $_SERVER) ? $_SERVER['PHP_AUTH_USER'] : ''; +// Clean username, only allow a-z, A-Z, 0-9, -_ chars +$remote_user = preg_replace( '/[^a-zA-Z0-9_-]/', '', $remote_user); +$user_config_file = 'config_local.' . $remote_user . '.php'; +if (file_exists(dirname(__FILE__) . '/' . $user_config_file) && (php_sapi_name() !== 'cli')) { + require_once dirname(__FILE__) . '/' . $user_config_file; +} + +if(!is_null($config['cops_basic_authentication']) && + is_array($config['cops_basic_authentication'])) +{ + if (!isset($_SERVER['PHP_AUTH_USER']) || + (isset($_SERVER['PHP_AUTH_USER']) && + ($_SERVER['PHP_AUTH_USER']!=$config['cops_basic_authentication']['username'] || + $_SERVER['PHP_AUTH_PW'] != $config['cops_basic_authentication']['password']))) + { + header('WWW-Authenticate: Basic realm="COPS Authentication"'); + header('HTTP/1.0 401 Unauthorized'); + echo 'This site is password protected'; + exit; + } +} diff --git a/sources/config_default.php b/sources/config_default.php new file mode 100644 index 0000000..c1d8418 --- /dev/null +++ b/sources/config_default.php @@ -0,0 +1,329 @@ + + */ + + if (!isset($config)) { + $config = array(); + } + + /* + * The directory containing calibre's metadata.db file, with sub-directories + * containing all the formats. + * BEWARE : it has to end with a / + * You can enable multiple database with this notation instead of a simple string : + * $config['calibre_directory'] = array ("My database name" => "/home/directory/calibre1/", "My other database name" => "/home/directory/calibre2/"); + */ + $config['calibre_directory'] = './'; + + /* + * SPECIFIC TO NGINX + * The internal directory set in nginx config file + * Leave empty if you don't know what you're doing + */ + $config['calibre_internal_directory'] = ''; + + /* + * Full URL prefix (with trailing /) + * useful especially for Opensearch where a full URL is often required + * For example Mantano, Aldiko and Marvin require it. + */ + $config['cops_full_url'] = ''; + + /* + * Number of recent books to show + */ + $config['cops_recentbooks_limit'] = '50'; + + /* + * Catalog's author name + */ + $config['cops_author_name'] = 'Sébastien Lucas'; + + /* + * Catalog's author uri + */ + $config['cops_author_uri'] = 'http://blog.slucas.fr'; + + /* + * Catalog's author email + */ + $config['cops_author_email'] = 'sebastien@slucas.fr'; + + /* + * Catalog's title + */ + $config['cops_title_default'] = 'COPS'; + + /* + * Catalog's subtitle + */ + $config['cops_subtitle_default'] = ''; + + /* + * Wich header to use when downloading books outside the web directory + * Possible values are : + * X-Accel-Redirect : For Nginx + * X-Sendfile : For Lightttpd or Apache (with mod_xsendfile) + * No value (default) : Let PHP handle the download + */ + $config['cops_x_accel_redirect'] = ''; + + /* + * Height of thumbnail image for OPDS + */ + $config['cops_opds_thumbnail_height'] = '164'; + + /* + * Height of thumbnail image for HTML + */ + $config['cops_html_thumbnail_height'] = '164'; + + /* + * Icon for both OPDS and HTML catalog + * Note that this has to be a real icon (.ico) + */ + $config['cops_icon'] = 'favicon.ico'; + + /* + * Show icon for authors, series, tags and books on OPDS feed + * 1 : enable + * 0 : disable + */ + $config['cops_show_icons'] = '1'; + + /* + * Default timezone + * Check following link for other timezones : + * http://www.php.net/manual/en/timezones.php + */ + $config['default_timezone'] = 'Europe/Paris'; + + /* + * Prefered format for HTML catalog + * The two first will be displayed in book entries + * The other only appear in book detail + */ + $config['cops_prefered_format'] = array('EPUB', 'PDF', 'AZW3', 'AZW', 'MOBI', 'CBR', 'CBZ'); + + /* + * use URL rewriting for downloading of ebook in HTML catalog + * See Github wiki for more information + * 1 : enable + * 0 : disable + */ + $config['cops_use_url_rewriting'] = '0'; + + /* + * generate a invalid OPDS stream to allow bad OPDS client to use search + * Example of non compliant OPDS client : Moon+ Reader + * Example of good OPDS client : Mantano, FBReader + * 1 : enable support for non compliant OPDS client + * 0 : always generate valid OPDS code + */ + $config['cops_generate_invalid_opds_stream'] = '0'; + + /* + * Max number of items per page + * -1 unlimited + */ + $config['cops_max_item_per_page'] = '-1'; + + /* + * split authors by first letter + * 1 : Yes + * 0 : No + */ + $config['cops_author_split_first_letter'] = '1'; + + /* + * split titles by first letter + * 1 : Yes + * 0 : No + */ + $config['cops_titles_split_first_letter'] = '1'; + + /* + * Enable the Lightboxes (for popups) + * 1 : Yes (enable) + * 0 : No + */ + $config['cops_use_fancyapps'] = '1'; + + /* + * Update Epub metadata before download + * 1 : Yes (enable) + * 0 : No + */ + $config['cops_update_epub-metadata'] = '0'; + + /* + * Filter on tags to book list + * Only works with the OPDS catalog + * Usage : array ("I only want to see books using the tag : Tag1" => "Tag1", + * "I only want to see books not using the tag : Tag1" => "!Tag1", + * "I want to see every books" => "", + * + * Example : array ("All" => "", "Unread" => "!Read", "Read" => "Read") + */ + $config['cops_books_filter'] = array(); + + /* + * Custom Columns for the index page + * to add as an array containing the lookup names configured in Calibre + * + * For example : array ("genre", "mycolumn"); + * + * Note that the composite custom columns are not supported + */ + $config['cops_calibre_custom_column'] = array(); + + /* + * Custom Columns for the list representation + * to add as an array containing the lookup names configured in Calibre + * + * For example : array ("genre", "mycolumn"); + * + * Note that the composite custom columns are not supported + */ + $config['cops_calibre_custom_column_list'] = array (); + + /* + * Custom Columns for the book preview panel + * to add as an array containing the lookup names configured in Calibre + * + * For example : array ("genre", "mycolumn"); + * + * Note that the composite custom columns are not supported + */ + $config['cops_calibre_custom_column_preview'] = array (); + + /* + * Rename .epub to .kepub.epub if downloaded from a Kobo eReader + * The ebook will then be recognized a Kepub so with chaptered paging, statistics, ... + * You have to enable URL rewriting if you want to enable kepup.epub download + * 1 : Yes (enable) + * 0 : No + */ + $config['cops_provide_kepub'] = '0'; + + /* + * Enable and configure Send To Kindle (or Email) feature. + * + * Don't forget to authorize the sender email you configured in your Kindle's Approved Personal Document E-mail List. + * + * If you want to use a simple smtp server (provided by your ISP for example), you can configure it like that : + * $config['cops_mail_configuration'] = array( "smtp.host" => "smtp.free.fr", + * "smtp.username" => "", + * "smtp.password" => "", + * "smtp.secure" => "", + * "address.from" => "cops@slucas.fr" + * ); + * + * For Gmail (ssl is mandatory) : + * $config['cops_mail_configuration'] = array( "smtp.host" => "smtp.gmail.com", + * "smtp.username" => "YOUR GMAIL ADRESS", + * "smtp.password" => "YOUR GMAIL PASSWORD", + * "smtp.secure" => "ssl", + * "address.from" => "cops@slucas.fr" + * ); + */ + $config['cops_mail_configuration'] = NULL; + + /* + * Use filter in HTML catalog + * 1 : Yes (enable) + * 0 : No + */ + $config['cops_html_tag_filter'] = '0'; + + /* + * Thumbnails are generated on-the-fly so it can be problematic on servers with slow CPU (Raspberry Pi, Dockstar, Piratebox, ...). + * This configuration item allow to customize how thumbnail will be generated + * "" : Generate thumbnail (CPU hungry) + * "1" : always send the full size image (Network hungry) + * any url : Send a constant image as the thumbnail (you can try "images/bookcover.png") + */ + $config['cops_thumbnail_handling'] = ''; + + /* + * Directory to keep resized thumbnails: allow to resize thumbnails only on first access, then use this cache. + * $config['cops_thumbnail_handling'] must be "" + * "" : don't cache thumbnail + * "/tmp/cache/" (example) : will generate thumbnails in /tmp/cache/ + * BEWARE : it has to end with a / + */ + $config['cops_thumbnail_cache_directory'] = ''; + + /* + * Contains a list of user agent for browsers not compatible with client side rendering + * For now : Kindle, Sony PRS-T1, Sony PRS-T2, All Cybook devices (maybe a little extreme). + * This item is used as regular expression so "." will force server side rendering for all devices + */ + $config['cops_server_side_render'] = 'Kindle\/1\.0|Kindle\/2\.0|Kindle\/3\.0|EBRD1101|EBRD1201|cybook'; + + /* + * Specify the ignored categories for the home screen and with search + * Meaning that if you don't want to search in publishers or tags just add them from the list + * Only accepted values : + * - author + * - book + * - series + * - tag + * - publisher + * - rating + * - language + */ + $config ['cops_ignored_categories'] = array(); + + /* + * If you use a Sony eReader or Aldiko you can't download ebooks if your catalog + * is password protected. A simple workaround is to leave fetch.php not protected (see .htaccess). + * But In that case your COPS installation is not completely safe. + * Setting this parameter to "1" ensure that nobody can access fetch.php before accessing + * index.php or feed.php first. + * BEWARE : Do not touch this if you're not using password, not using PRS-TX or not using Aldiko. + */ + $config ['cops_fetch_protect'] = '0'; + + /* + * WARNING NOT READY FOR PRODUCTION USE + * Make the search better (don't care about diacritics, uppercase should work on Cyrillic) but slower. + * 1 : Yes (enable) + * 0 : No + */ + $config ['cops_normalized_search'] = '0'; + + /* + * Enable PHP password protection (You can use if htpasswd is not possible for you) + * If possible prefer htpasswd ! + * array( "username" => "xxx", "password" => "secret") : Enable PHP password protection + * NULL : Disable PHP password protection (You can still use htpasswd) + */ + $config['cops_basic_authentication'] = NULL; + + /* + * Which template is used by default : + * 'default' + * 'bootstrap' + */ + $config['cops_template'] = 'default'; + + /* + * Which style is used by default : + * 'base' + * 'default' + * 'eink' (only available for the 'default' template) + * 'iphone' (only available for the 'default' template) + * 'iphone7' (only available for the 'default' template) + */ + $config['cops_style'] = 'default'; + + /* + * Set language code to force a language (see lang/ directory for available languages). + * When empty it will auto detect the language. + */ + $config['cops_language'] = ''; diff --git a/sources/config_local.php.example b/sources/config_local.php.example new file mode 100644 index 0000000..78a9e54 --- /dev/null +++ b/sources/config_local.php.example @@ -0,0 +1,30 @@ + + */ + +require 'config.php'; +require 'base.php'; + +function getComponentContent($book, $component, $add) +{ + $data = $book->component($component); + + $callback = function($m) use ($book, $component, $add) { + $method = $m[1]; + $path = $m[2]; + $end = ''; + if (preg_match('/^src\s*:/', $method)) { + $end = ')'; + } + if (preg_match('/^#/', $path)) { + return $method . "'" . $path . "'" . $end; + } + $hash = ''; + if (preg_match('/^(.+)#(.+)$/', $path, $matches)) { + $path = $matches[1]; + $hash = '#' . $matches[2]; + } + $comp = $book->getComponentName($component, $path); + if (!$comp) { + return $method . "'#'" . $end; + } + $out = $method . "'epubfs.php?" . $add . 'comp=' . $comp . $hash . "'" . $end; + if ($end) { + return $out; + } + return str_replace('&', '&', $out); + }; + + $data = preg_replace_callback("/(src=)[\"']([^:]*?)[\"']/", $callback, $data); + $data = preg_replace_callback("/(href=)[\"']([^:]*?)[\"']/", $callback, $data); + $data = preg_replace_callback("/(\@import\s+)[\"'](.*?)[\"'];/", $callback, $data); + $data = preg_replace_callback('/(src\s*:\s*url\()(.*?)\)/', $callback, $data); + + return $data; +} + +if (php_sapi_name() === 'cli') { + return; +} + +$idData = getURLParam('data', NULL); +$add = 'data=' . $idData . '&'; +if (!is_null(GetUrlParam(DB))) { + $add .= DB . '=' . GetUrlParam(DB) . '&'; +} +$myBook = Book::getBookByDataId($idData); + +$book = new EPub($myBook->getFilePath('EPUB', $idData)); + +$book->initSpineComponent(); + +if (!isset($_GET['comp'])) { + notFound(); + return; +} + +$component = $_GET['comp']; + +try { + $data = getComponentContent($book, $component, $add); + + $expires = 60*60*24*14; + header('Pragma: public'); + header('Cache-Control: maxage='.$expires); + header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT'); + header ('Content-Type: ' . $book->componentContentType($component)); + echo $data; +} catch (Exception $e) { + error_log($e); + notFound(); +} diff --git a/sources/epubreader.php b/sources/epubreader.php new file mode 100644 index 0000000..f2867e8 --- /dev/null +++ b/sources/epubreader.php @@ -0,0 +1,74 @@ + + + + */ + +require_once 'config.php'; +require_once 'base.php'; + +header('Content-Type: text/html;charset=utf-8'); + +$idData = getURLParam('data', NULL); +$add = 'data=' . $idData . '&'; +if (!is_null (GetUrlParam (DB))) { + $add .= DB . '=' . GetUrlParam (DB) . '&'; +} +$myBook = Book::getBookByDataId($idData); + +$book = new EPub($myBook->getFilePath('EPUB', $idData)); +$book->initSpineComponent(); + +?> + + + + + COPS's Epub Reader + + + " media="screen" /> + " media="screen" /> + + + " media="screen" /> + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + diff --git a/sources/favicon.ico b/sources/favicon.ico new file mode 100644 index 0000000..9be986b Binary files /dev/null and b/sources/favicon.ico differ diff --git a/sources/feed.php b/sources/feed.php new file mode 100644 index 0000000..1b053e1 --- /dev/null +++ b/sources/feed.php @@ -0,0 +1,40 @@ + + * + */ + + require_once 'config.php'; + require_once 'base.php'; + + header('Content-Type:application/xml'); + $page = getURLParam('page', Base::PAGE_INDEX); + $query = getURLParam('query'); + $n = getURLParam('n', '1'); + if ($query) { + $page = Base::PAGE_OPENSEARCH_QUERY; + } + $qid = getURLParam('id'); + + if ($config ['cops_fetch_protect'] == '1') { + session_start(); + if (!isset($_SESSION['connected'])) { + $_SESSION['connected'] = 0; + } + } + + $OPDSRender = new OPDSRenderer(); + + switch ($page) { + case Base::PAGE_OPENSEARCH : + echo $OPDSRender->getOpenSearch(); + return; + default: + $currentPage = Page::getPage($page, $qid, $query, $n); + $currentPage->InitializeContent(); + echo $OPDSRender->render($currentPage); + return; + } diff --git a/sources/fetch.php b/sources/fetch.php new file mode 100644 index 0000000..ebce1e7 --- /dev/null +++ b/sources/fetch.php @@ -0,0 +1,122 @@ + + */ + + require_once dirname(__FILE__) . '/config.php'; + require_once dirname(__FILE__) . '/base.php'; + + global $config; + + if ($config['cops_fetch_protect'] == '1') { + session_start(); + if (!isset($_SESSION['connected'])) { + notFound(); + return; + } + } + + $expires = 60*60*24*14; + header('Pragma: public'); + header('Cache-Control: maxage=' . $expires); + header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT'); + $bookId = getURLParam('id', NULL); + $type = getURLParam('type', 'jpg'); + $idData = getURLParam('data', NULL); + if (is_null($bookId)) { + $book = Book::getBookByDataId($idData); + } else { + $book = Book::getBookById($bookId); + } + + if (!$book) { + notFound (); + return; + } + + if ($book && ($type == 'jpg' || empty ($config['calibre_internal_directory']))) { + if ($type == 'jpg') { + $file = $book->getFilePath($type); + } else { + $file = $book->getFilePath($type, $idData); + } + if (is_null($file) || !file_exists($file)) { + notFound(); + return; + } + } + + switch ($type) + { + case 'jpg': + header('Content-Type: image/jpeg'); + //by default, we don't cache + $thumbnailCacheFullpath = null; + if ( isset($config['cops_thumbnail_cache_directory']) && $config['cops_thumbnail_cache_directory'] !== '' ) { + $thumbnailCacheFullpath = $config['cops_thumbnail_cache_directory']; + //if multiple databases, add a subfolder with the database ID + $thumbnailCacheFullpath .= !is_null(GetUrlParam (DB)) ? 'db-' . GetUrlParam (DB) . DIRECTORY_SEPARATOR : ''; + //when there are lots of thumbnails, it's better to save files in subfolders, so if the book's uuid is + //"01234567-89ab-cdef-0123-456789abcdef", we will save the thumbnail in .../0/12/34567-89ab-cdef-0123-456789abcdef-... + $thumbnailCacheFullpath .= substr($book->uuid, 0, 1) . DIRECTORY_SEPARATOR . substr($book->uuid, 1, 2) . DIRECTORY_SEPARATOR; + //check if cache folder exists or create it + if ( file_exists($thumbnailCacheFullpath) || mkdir($thumbnailCacheFullpath, 0700, true) ) { + //we name the thumbnail from the book's uuid and it's dimensions (width and/or height) + $thumbnailCacheName = substr($book->uuid, 3) . '-' . getURLParam('width') . 'x' . getURLParam('height') . '.jpg'; + $thumbnailCacheFullpath = $thumbnailCacheFullpath . $thumbnailCacheName; + } else { + //error creating the folder, so we don't cache + $thumbnailCacheFullpath = null; + } + } + + if ( $thumbnailCacheFullpath !== null && file_exists($thumbnailCacheFullpath) ) { + //return the already cached thumbnail + readfile( $thumbnailCacheFullpath ); + return; + } + + if ($book->getThumbnail (getURLParam('width'), getURLParam('height'), $thumbnailCacheFullpath)) { + //if we don't cache the thumbnail, imagejpeg() in $book->getThumbnail() already return the image data + if ( $thumbnailCacheFullpath === null ) { + // The cover had to be resized + return; + } else { + //return the just cached thumbnail + readfile( $thumbnailCacheFullpath ); + return; + } + } + break; + default: + $data = $book->getDataById($idData); + header('Content-Type: ' . $data->getMimeType()); + break; + } + $file = $book->getFilePath($type, $idData, true); + if ($type == 'epub' && $config['cops_update_epub-metadata']) { + $book->getUpdatedEpub($idData); + return; + } + if ($type == 'jpg') { + header('Content-Disposition: filename="' . basename($file) . '"'); + } else { + header('Content-Disposition: attachment; filename="' . basename($file) . '"'); + } + + $dir = $config['calibre_internal_directory']; + if (empty($config['calibre_internal_directory'])) { + $dir = Base::getDbDirectory(); + } + + if (empty($config['cops_x_accel_redirect'])) { + $filename = $dir . $file; + $fp = fopen($filename, 'rb'); + header('Content-Length: ' . filesize($filename)); + fpassthru($fp); + } else { + header($config['cops_x_accel_redirect'] . ': ' . $dir . $file); + } diff --git a/sources/getJSON.php b/sources/getJSON.php new file mode 100644 index 0000000..05bf095 --- /dev/null +++ b/sources/getJSON.php @@ -0,0 +1,15 @@ + + * + */ + +require_once('config.php'); + +header('Content-Type:application/json;charset=utf-8'); + +echo json_encode(JSONRenderer::getJson()); + diff --git a/sources/images/allbook.png b/sources/images/allbook.png new file mode 100644 index 0000000..6803171 Binary files /dev/null and b/sources/images/allbook.png differ diff --git a/sources/images/author.png b/sources/images/author.png new file mode 100644 index 0000000..5c09d1a Binary files /dev/null and b/sources/images/author.png differ diff --git a/sources/images/bookcover.png b/sources/images/bookcover.png new file mode 100644 index 0000000..6c3c8c7 Binary files /dev/null and b/sources/images/bookcover.png differ diff --git a/sources/images/custom.png b/sources/images/custom.png new file mode 100644 index 0000000..86020c3 Binary files /dev/null and b/sources/images/custom.png differ diff --git a/sources/images/icons/icon114.png b/sources/images/icons/icon114.png new file mode 100644 index 0000000..559a4c6 Binary files /dev/null and b/sources/images/icons/icon114.png differ diff --git a/sources/images/icons/icon144.png b/sources/images/icons/icon144.png new file mode 100644 index 0000000..9bbcdcd Binary files /dev/null and b/sources/images/icons/icon144.png differ diff --git a/sources/images/icons/icon57.png b/sources/images/icons/icon57.png new file mode 100644 index 0000000..5dd81f3 Binary files /dev/null and b/sources/images/icons/icon57.png differ diff --git a/sources/images/icons/icon72.png b/sources/images/icons/icon72.png new file mode 100644 index 0000000..87eab9a Binary files /dev/null and b/sources/images/icons/icon72.png differ diff --git a/sources/images/language.png b/sources/images/language.png new file mode 100644 index 0000000..5b18b4f Binary files /dev/null and b/sources/images/language.png differ diff --git a/sources/images/publisher.png b/sources/images/publisher.png new file mode 100644 index 0000000..f34b24f Binary files /dev/null and b/sources/images/publisher.png differ diff --git a/sources/images/rating.png b/sources/images/rating.png new file mode 100644 index 0000000..68c53c5 Binary files /dev/null and b/sources/images/rating.png differ diff --git a/sources/images/recent.png b/sources/images/recent.png new file mode 100644 index 0000000..e792a20 Binary files /dev/null and b/sources/images/recent.png differ diff --git a/sources/images/serie.png b/sources/images/serie.png new file mode 100644 index 0000000..fcf4140 Binary files /dev/null and b/sources/images/serie.png differ diff --git a/sources/images/tag.png b/sources/images/tag.png new file mode 100644 index 0000000..746d236 Binary files /dev/null and b/sources/images/tag.png differ diff --git a/sources/index.php b/sources/index.php new file mode 100644 index 0000000..9130d64 --- /dev/null +++ b/sources/index.php @@ -0,0 +1,65 @@ + + * + */ + + require_once dirname(__FILE__) . '/config.php'; + require_once dirname(__FILE__) . '/base.php'; + + // If we detect that an OPDS reader try to connect try to redirect to feed.php + if (preg_match('/(MantanoReader|FBReader|Stanza|Marvin|Aldiko|Moon\+ Reader|Chunky|AlReader|EBookDroid|BookReader|CoolReader|PageTurner|books\.ebook\.pdf\.reader|com\.hiwapps\.ebookreader|OpenBook)/', $_SERVER['HTTP_USER_AGENT'])) { + header('location: feed.php'); + exit(); + } + + $page = getURLParam('page', Base::PAGE_INDEX); + $query = getURLParam('query'); + $qid = getURLParam('id'); + $n = getURLParam('n', '1'); + $database = GetUrlParam(DB); + + + // Access the database ASAP to be sure it's readable, redirect if that's not the case. + // It has to be done before any header is sent. + Base::checkDatabaseAvailability(); + + if ($config ['cops_fetch_protect'] == '1') { + session_start(); + if (!isset($_SESSION['connected'])) { + $_SESSION['connected'] = 0; + } + } + + header('Content-Type:text/html;charset=utf-8'); + + $data = array('title' => $config['cops_title_default'], + 'version' => VERSION, + 'opds_url' => $config['cops_full_url'] . 'feed.php', + 'customHeader' => '', + 'template' => getCurrentTemplate(), + 'server_side_rendering' => useServerSideRendering(), + 'current_css' => getCurrentCss(), + 'favico' => $config['cops_icon'], + 'getjson_url' => 'getJSON.php?' . addURLParameter(getQueryString(), 'complete', 1)); + if (preg_match('/Kindle/', $_SERVER['HTTP_USER_AGENT'])) { + $data['customHeader'] = ''; + } + $headcontent = file_get_contents('templates/' . getCurrentTemplate() . '/file.html'); + $template = new doT(); + $dot = $template->template($headcontent, NULL); + echo($dot($data)); +?> + + + diff --git a/sources/lang/Localization_ca.json b/sources/lang/Localization_ca.json new file mode 100644 index 0000000..7ed234c --- /dev/null +++ b/sources/lang/Localization_ca.json @@ -0,0 +1,293 @@ +{ + "about.title": "Sobre COPS", + "allbooks.alphabetical.many": "Llistat alfabètic de {0} llibres", + "allbooks.alphabetical.none": "Llistat sense llibres", + "allbooks.alphabetical.one": "Llistat amb un llibre", + "allbooks.title": "Tots els llibres", + "authors.alphabetical.many": "Llistat alfabètic de {0} autors", + "authors.alphabetical.none": "Llistat sense autors", + "authors.alphabetical.one": "Llistat amb un autor", + "authors.title": "Autors", + "authorword.many": "{0} autors", + "authorword.none": "Cap autor", + "authorword.one": "1 autor", + "bookentry.author": "{0} de {1}", + "bookword.many": "{0} llibres", + "bookword.none": "Cap llibre", + "bookword.one": "1 llibre", + "bookword.title": "Llibres", + "cog.alternate": "Buscar, ordenar i filtres", + "content.series": "Series:", + "content.series.data": "Llibre {0} de la sèrie {1}", + "content.summary": "Sinopsi:", + "customcolumn.boolean.no": "No", + "customcolumn.boolean.unknown": "No Establert", + "customcolumn.boolean.yes": "Si", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "No Establert", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "{0} sèries ordenades alfabèticament", + "customcolumn.description.series.none": "Llistat sense sèries", + "customcolumn.description.series.one": "Llistat alfabètic d'una sola sèrie", + "customcolumn.enum.unknown": "No Establert", + "customcolumn.float.unknown": "No Establert", + "customcolumn.int.unknown": "No Establert", + "customcolumn.rating.unknown": "No Establert", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Introdueix el teu email (permitir enviament de llibres per e-mail)", + "customize.fancybox": "Usar Lightbox (llibres en marc flotant)", + "customize.filter": "Habilitar filtre per etiqueta", + "customize.ignored": "Ocultar categories", + "customize.paging": "Nombre màx de llibres per pàgina (-1 per deshabilitar)", + "customize.style": "Tema", + "customize.title": "Configura COPS UI", + "home.alternate": "Inici", + "i18n.coversection": "Portada", + "language.title": "Idioma", + "languages.alphabetical.many": "Llistat alfabètic de {0} llenguatges", + "languages.alphabetical.none": "Llistat sense idiomes disponibles", + "languages.alphabetical.one": "llistat amb un idioma", + "languages.title": "Idiomes", + "mail.messagenotsent": "El missatge no por ser enviat.", + "mail.messagesent": "Missatge enviat", + "paging.next.alternate": "Següent", + "paging.previous.alternate": "Anterior", + "permalink.alternate": "Enllaç permanent", + "pubdate.title": "Any publicació", + "publisher.name": "Publicador", + "publishers.alphabetical.many": "Llistat alfabètic de {0} editorials", + "publishers.alphabetical.none": "Llistat sense editorials", + "publishers.alphabetical.one": "Llistat amb una editorial", + "publishers.title": "Editorials", + "publisherword.many": "{0} editorials", + "publisherword.none": "Sense editorials", + "publisherword.one": "1 editorial", + "ratings.many": "{0} valoració", + "ratings.none": "sense valoracions", + "ratings.one": "1 valoració", + "ratings.title": "Valoracions", + "ratingword.many": "{0} estrelles", + "ratingword.none": "Sense estrella", + "ratingword.one": "1 estrella", + "recent.list": "{0} darrers títols incorporats", + "recent.title": "Els més recents", + "search.alternate": "Cerca", + "search.result": "Resultats de búsqueda per *{0}*", + "search.result.author": "Resultats de búsqueda per *{0}* per autors", + "search.result.book": "Resultats de búsqueda per *{0}* per llibres", + "search.result.publisher": "Resultats de búsqueda per *{0}* per editorials", + "search.result.series": "Resultats de búsqueda per *{0}* per sèries", + "search.result.tag": "Resultats de búsqueda per *{0}* per etiquetes", + "search.sortorder.asc": "Asc", + "search.sortorder.desc": "Desc", + "series.alphabetical.many": "{0} sèries ordenades alfabèticament", + "series.alphabetical.none": "Llistat sense sèries", + "series.alphabetical.one": "Llistat alfabètic d'una sola sèrie", + "series.title": "Sèries", + "seriesword.many": "sèries", + "seriesword.none": "Cap sèrie", + "seriesword.one": "1 sèrie", + "sort.alternate": "Ordenar", + "splitByLetter.book.other": "Altres llibres", + "splitByLetter.letter": "{0} ({1})", + "tags.alphabetical.many": "{0} etiquetes ordenades alfabèticament", + "tags.alphabetical.none": "Llistat sense etiquetes", + "tags.alphabetical.one": "Llistat alfabètic de la única etiqueta", + "tags.title": "Etiquetes", + "tagword.many": "etiquetes", + "tagword.none": "Cap etiqueta", + "tagword.one": "1 etiqueta", + "tagword.title": "Etiquetes", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Africà", + "languages.aka": "Akan", + "languages.sqi": "Albani", + "languages.amh": "Amharic", + "languages.ara": "Àrab", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Basque", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgar", + "languages.mya": "Burmese", + "languages.cat": "Català", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chinès", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croat", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Holandès", + "languages.dzo": "Dzongkha", + "languages.eng": "Anglès", + "languages.epo": "Esperant", + "languages.est": "Estoni", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "Francès", + "languages.ful": "Fula", + "languages.glg": "Gallec", + "languages.kat": "Georgià", + "languages.deu": "Alemany", + "languages.ell": "Grec", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitià", + "languages.hau": "Hausa", + "languages.hed": "Hebreu", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarià", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italian", + "languages.iku": "Inuktitut", + "languages.jpn": "Japonès", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Coreà", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latí", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Maorí", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongol", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norwegian", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occità", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persa", + "languages.pol": "Polac", + "languages.pus": "Pashto", + "languages.por": "Portuguès", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Romanià", + "languages.rus": "Rus", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbi", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Espanyol", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrainian", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamese", + "languages.vol": "Volapük", + "languages.win": "Walloon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_cs.json b/sources/lang/Localization_cs.json new file mode 100644 index 0000000..298652a --- /dev/null +++ b/sources/lang/Localization_cs.json @@ -0,0 +1,293 @@ +{ + "about.title": "Více o COPS", + "allbooks.alphabetical.many": "Abecední seznam {0} knih", + "allbooks.alphabetical.none": "Abecední seznam neobsahuje žádné knihy", + "allbooks.alphabetical.one": "Abecední seznam obsahuje jednu knihu", + "allbooks.title": "Všechny knihy", + "authors.alphabetical.many": "Abecední seznam {0} autorů", + "authors.alphabetical.none": "Abecední seznam neobsahuje žádné autory", + "authors.alphabetical.one": "Abecední seznam obsahuje jednoho autora", + "authors.title": "Autoři", + "authorword.many": "{0} autorů", + "authorword.none": "Žádný autor", + "authorword.one": "Jeden autor", + "bookentry.author": "{0} by {1}", + "bookword.many": "{0} knih", + "bookword.none": "Žádná kniha", + "bookword.one": "Jedna kniha", + "bookword.title": "Knihy", + "cog.alternate": "Hledání, třídění a filtry", + "content.series": "Série:", + "content.series.data": "Kniha {0} ze série {1}", + "content.summary": "Shrnutí", + "customcolumn.boolean.no": "Ne", + "customcolumn.boolean.unknown": "Není nastaveno", + "customcolumn.boolean.yes": "Ano", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Není nastaveno", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Abecední výpis {0} sérií", + "customcolumn.description.series.none": "Abecední výpis neobsahuje žádné série", + "customcolumn.description.series.one": "Abecední výpis jedné série", + "customcolumn.enum.unknown": "Není nastaveno", + "customcolumn.float.unknown": "Není nastaveno", + "customcolumn.int.unknown": "Není nastaveno", + "customcolumn.rating.unknown": "Není nastaveno", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Nastavit email (umožní zasílání knih)", + "customize.fancybox": "Použít Lightbox", + "customize.filter": "Povolit filtrování štítků", + "customize.ignored": "Ignorované kategorie", + "customize.paging": "Maximální počet knih na stránku (-1 pro vypnutí)", + "customize.style": "Téma", + "customize.title": "Úpravy vzhledu COPS", + "home.alternate": "Domů", + "i18n.coversection": "Obálka", + "language.title": "Jazyk", + "languages.alphabetical.many": "Abecední seznam {0} jazyků", + "languages.alphabetical.none": "Abecední seznam neobsahuje žádné jazyky", + "languages.alphabetical.one": "Abecední seznam obsahuje jeden jazyk", + "languages.title": "Jazyky", + "mail.messagenotsent": "Zprávu se nepodařilo odeslat.", + "mail.messagesent": "Zpráva byla odeslána", + "paging.next.alternate": "Další", + "paging.previous.alternate": "Předchozí", + "permalink.alternate": "Permalink", + "pubdate.title": "Rok vydání", + "publisher.name": "Vydavatel", + "publishers.alphabetical.many": "Abecední výpis {0} vydavatelů", + "publishers.alphabetical.none": "Abecední výpis neobsahuje žádné vydavetele", + "publishers.alphabetical.one": "Abecední výpis jednoho vydavetele", + "publishers.title": "Vydavatelé", + "publisherword.many": "{0} vydavatelů", + "publisherword.none": "Žádný vydavatel", + "publisherword.one": "Jeden vydavatel", + "ratings.many": "{0} hodnocení", + "ratings.none": "bez hodnocení", + "ratings.one": "1 hodnocení", + "ratings.title": "Hodnocení", + "ratingword.many": "{0} hvězd", + "ratingword.none": "Bez hvězd", + "ratingword.one": "1 hvězda", + "recent.list": "{0} posledních přidaných knih", + "recent.title": "Poslední přidané knihy", + "search.alternate": "Hledat", + "search.result": "Výsledek hledání pro *{0}*", + "search.result.author": "Výsledek hledání pro *{0}* mezi autory", + "search.result.book": "Výsledek hledání pro *{0}* mezi knihami", + "search.result.publisher": "Výsledek hledání pro *{0}* vydavateli", + "search.result.series": "Výsledek hledání pro *{0}* sériemi", + "search.result.tag": "Výsledek hledání pro *{0}* mezi štítky", + "search.sortorder.asc": "Vzestupně", + "search.sortorder.desc": "Sestupně", + "series.alphabetical.many": "Abecední výpis {0} sérií", + "series.alphabetical.none": "Abecední výpis neobsahuje žádné série", + "series.alphabetical.one": "Abecední výpis jedné série", + "series.title": "Série", + "seriesword.many": "{0} sérií", + "seriesword.none": "Žádné série", + "seriesword.one": "Jedna série", + "sort.alternate": "Třídit", + "splitByLetter.book.other": "Other books", + "splitByLetter.letter": "{0} knih začínajících na {1}", + "tags.alphabetical.many": "Abecední výpis {0} štítků", + "tags.alphabetical.none": "Abecední výpis neobsahuje žádné štítky", + "tags.alphabetical.one": "Abecední výpis obsahuje jeden štítek", + "tags.title": "Štítky", + "tagword.many": "{0} štítků", + "tagword.none": "Žádné štítky", + "tagword.one": "Jeden štítek", + "tagword.title": "Štítky", + "languages.abk": "Abcházština", + "languages.aaf": "Afarština", + "languages.afr": "Afrikánština", + "languages.aka": "Akanština", + "languages.sqi": "Albánština", + "languages.amh": "Amharština", + "languages.ara": "Arabština", + "languages.arg": "Aragonština", + "languages.hye": "Arménština", + "languages.asm": "Ásámština", + "languages.ava": "Avarština", + "languages.ave": "Avestánština", + "languages.aym": "Ajmarština", + "languages.aze": "Ázerbájdžánština", + "languages.bam": "Bambarština", + "languages.bak": "Baškirština", + "languages.eus": "Baskičtina", + "languages.bel": "Běloruština", + "languages.ben": "Bengálština", + "languages.bih": "Bihárština", + "languages.bis": "Bislamština", + "languages.bos": "Bosenština", + "languages.bre": "Bretonština", + "languages.bul": "Bulharština", + "languages.mya": "Barmština", + "languages.cat": "Katalánština", + "languages.cha": "Chamorro", + "languages.che": "Čečenština", + "languages.nya": "Čičevština", + "languages.zho": "Čínština", + "languages.chv": "Čuvaština", + "languages.cor": "Kornština", + "languages.cos": "Korsičtina", + "languages.cre": "Kríjština", + "languages.hrv": "Chorvatština", + "languages.ces": "Čeština", + "languages.dan": "Dánština", + "languages.div": "Divehi", + "languages.nld": "Nizozemština", + "languages.dzo": "Dzongkha", + "languages.eng": "Angličtina", + "languages.epo": "Esperanto", + "languages.est": "Estonština", + "languages.ewe": "Eveština", + "languages.fao": "Faerština", + "languages.fij": "Fidžijština", + "languages.fin": "Finština", + "languages.fra": "Francouština", + "languages.ful": "Fulbština", + "languages.glg": "Galicijština", + "languages.kat": "Gruzínština", + "languages.deu": "Němčina", + "languages.ell": "Řečtina", + "languages.grn": "Guaraní", + "languages.guj": "Gudžarátština", + "languages.hat": "Haitština", + "languages.hau": "Hauština", + "languages.hed": "Hebrejština", + "languages.her": "Hererština", + "languages.hin": "Hindština", + "languages.hmo": "Hiri motu", + "languages.hun": "Maďarština", + "languages.ina": "Interlingua", + "languages.ind": "Indonéština", + "languages.ile": "Interlingue", + "languages.gle": "Irština", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Islandština", + "languages.ita": "Italština", + "languages.iku": "Inuitština", + "languages.jpn": "Japonština", + "languages.jav": "Javánština", + "languages.kal": "Grónština", + "languages.kan": "Kannadština", + "languages.kau": "Kanurijština", + "languages.kas": "Kašmírština", + "languages.kaz": "Kazaština", + "languages.khm": "Khmerština", + "languages.kik": "Kikujština", + "languages.kin": "Rwandština", + "languages.kir": "Kyrgyzština", + "languages.kom": "Komijština", + "languages.kon": "Konžština", + "languages.kor": "Korejština", + "languages.kur": "Kurdština", + "languages.kua": "Kuanyama", + "languages.lat": "Latina", + "languages.ltz": "Lucemburština", + "languages.lug": "Gandština", + "languages.lim": "Limburština", + "languages.lin": "Ngalština", + "languages.lao": "Laoština", + "languages.lit": "Litevština", + "languages.lub": "Lubština", + "languages.lav": "Lotyština", + "languages.glv": "Manština", + "languages.mkd": "Makedonština", + "languages.mlg": "Malgaština", + "languages.msa": "Malajština", + "languages.mal": "Malajámština", + "languages.mlt": "Maltština", + "languages.mri": "Maorština", + "languages.mar": "Maráthština", + "languages.mah": "Maršálština", + "languages.mon": "Mongolština", + "languages.nau": "Nauruština", + "languages.nav": "Navažština", + "languages.nob": "Bokmål", + "languages.nde": "Severní Ndebelština", + "languages.nep": "Nepálština", + "languages.ndo": "Ndonga", + "languages.nno": "Nynorsk", + "languages.nor": "Norština", + "languages.iii": "Yi", + "languages.nbl": "Jižní Ndebelština", + "languages.oci": "Okcitánština", + "languages.oji": "Odžibvejština", + "languages.chu": "Staroslověnština", + "languages.orm": "Oromština", + "languages.ori": "Urijština", + "languages.oss": "Osetština", + "languages.pan": "Paňdžábština", + "languages.pli": "Páli", + "languages.fas": "Perština", + "languages.pol": "Polština", + "languages.pus": "Paštština", + "languages.por": "Portugalština", + "languages.que": "Kečuánština", + "languages.roh": "Románština", + "languages.run": "Kirundština", + "languages.ron": "Rumunština", + "languages.rus": "Ruština", + "languages.san": "Sanskrt", + "languages.srd": "Sardština", + "languages.snd": "Sindhština", + "languages.sme": "Severní Sámština", + "languages.smo": "Samojština", + "languages.sag": "Sangština", + "languages.srp": "Srbština", + "languages.gla": "Skotská Gaelština", + "languages.sna": "Šonština", + "languages.sin": "Sinhálština", + "languages.slk": "Slovenština", + "languages.slv": "Slovinština", + "languages.som": "Somálština", + "languages.sot": "Sotština", + "languages.spa": "Španělština", + "languages.sun": "Sundština", + "languages.swa": "Svahilština", + "languages.ssw": "Svazijština", + "languages.swe": "Švédština", + "languages.tam": "Tamilština", + "languages.tel": "Telugština", + "languages.tgk": "Tádžičtina", + "languages.tha": "Thajština", + "languages.tir": "Tigriňňa", + "languages.bod": "Tibetština", + "languages.tuk": "Turkmenština", + "languages.tgl": "Tagalština", + "languages.tsn": "Čwanština", + "languages.ton": "Tonžština", + "languages.tur": "Turečtina", + "languages.tso": "Tsonga", + "languages.tat": "Tatarština", + "languages.twi": "Ťwiština", + "languages.tah": "Tahitština", + "languages.uig": "Ujgurština", + "languages.ukr": "Ukrajinština", + "languages.urd": "Urdština", + "languages.uzb": "Uzbečtina", + "languages.ven": "Luvendština", + "languages.vie": "Vietnamština", + "languages.vol": "Volapük", + "languages.win": "Walonština", + "languages.cym": "Velština", + "languages.wol": "Volofština", + "languages.fry": "Západofríština", + "languages.xho": "Xhoština", + "languages.yid": "Jidiš", + "languages.yor": "Jorubština", + "languages.zha": "Čuangština", + "languages.zul": "Zulština", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_da.json b/sources/lang/Localization_da.json new file mode 100644 index 0000000..244de8c --- /dev/null +++ b/sources/lang/Localization_da.json @@ -0,0 +1,293 @@ +{ + "about.title": "About COPS", + "allbooks.alphabetical.many": "Alphabetical index of the {0} books", + "allbooks.alphabetical.none": "Alphabetical index of absolutely no books", + "allbooks.alphabetical.one": "Alphabetical index of the single book", + "allbooks.title": "All books", + "authors.alphabetical.many": "Alphabetical index of the {0} authors", + "authors.alphabetical.none": "Alphabetical index of absolutely no authors", + "authors.alphabetical.one": "Alphabetical index of the single author", + "authors.title": "Authors", + "authorword.many": "{0} authors", + "authorword.none": "No authors", + "authorword.one": "1 author", + "bookentry.author": "{0} by {1}", + "bookword.many": "{0} books", + "bookword.none": "No books", + "bookword.one": "1 book", + "bookword.title": "Books", + "cog.alternate": "Search, sort and filters", + "content.series": "Series:", + "content.series.data": "Book {0} in the {1} series", + "content.summary": "Oversigt", + "customcolumn.boolean.no": "Nej", + "customcolumn.boolean.unknown": "Ikke sat", + "customcolumn.boolean.yes": "Ja", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Ikke sat", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Alphabetical index of the {0} series", + "customcolumn.description.series.none": "Alphabetical index of absolutely no series", + "customcolumn.description.series.one": "Alphabetical index of the single series", + "customcolumn.enum.unknown": "Ikke sat", + "customcolumn.float.unknown": "Ikke sat", + "customcolumn.int.unknown": "Ikke sat", + "customcolumn.rating.unknown": "Ikke sat", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Set your email (to allow book emailing)", + "customize.fancybox": "Use Lightbox (books load in floating frame)", + "customize.filter": "Enable tag filtering", + "customize.ignored": "Ignored categories", + "customize.paging": "Max number of books per page (-1 to disable)", + "customize.style": "Tema", + "customize.title": "Customize COPS UI", + "home.alternate": "Startside", + "i18n.coversection": "Cover", + "language.title": "Sprog", + "languages.alphabetical.many": "Alphabetical index of the {0} languages", + "languages.alphabetical.none": "Alphabetical index of absolutely no languages", + "languages.alphabetical.one": "Alphabetical index of the single language", + "languages.title": "Sprog", + "mail.messagenotsent": "Message could not be sent.", + "mail.messagesent": "Message has been sent", + "paging.next.alternate": "Næste", + "paging.previous.alternate": "Foregående", + "permalink.alternate": "Permalink", + "pubdate.title": "Publication year", + "publisher.name": "Publisher", + "publishers.alphabetical.many": "Alphabetical index of the {0} publishers", + "publishers.alphabetical.none": "Alphabetical index of absolutely no publishers", + "publishers.alphabetical.one": "Alphabetical index of the single publisher", + "publishers.title": "Publishers", + "publisherword.many": "{0} publishers", + "publisherword.none": "No publishers", + "publisherword.one": "1 publisher", + "ratings.many": "{0} ratings", + "ratings.none": "no ratings", + "ratings.one": "1 rating", + "ratings.title": "Ratings", + "ratingword.many": "{0} stars", + "ratingword.none": "No star", + "ratingword.one": "1 star", + "recent.list": "{0} most recent books", + "recent.title": "Recent additions", + "search.alternate": "Søg", + "search.result": "Search result for *{0}*", + "search.result.author": "Search result for *{0}* in authors", + "search.result.book": "Search result for *{0}* in books", + "search.result.publisher": "Search result for *{0}* in publishers", + "search.result.series": "Search result for *{0}* in series", + "search.result.tag": "Search result for *{0}* in tags", + "search.sortorder.asc": "Asc", + "search.sortorder.desc": "Desc", + "series.alphabetical.many": "Alphabetical index of the {0} series", + "series.alphabetical.none": "Alphabetical index of absolutely no series", + "series.alphabetical.one": "Alphabetical index of the single series", + "series.title": "Series", + "seriesword.many": "{0} series", + "seriesword.none": "No series", + "seriesword.one": "1 series", + "sort.alternate": "Sort", + "splitByLetter.book.other": "Other books", + "splitByLetter.letter": "{0} starting with {1}", + "tags.alphabetical.many": "Alphabetical index of the {0} tags", + "tags.alphabetical.none": "Alphabetical index of absolutely no tags", + "tags.alphabetical.one": "Alphabetical index of the single tag", + "tags.title": "Tags", + "tagword.many": "{0} tags", + "tagword.none": "No tags", + "tagword.one": "1 tag", + "tagword.title": "Tags", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanian", + "languages.amh": "Amharic", + "languages.ara": "Arabic", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Basque", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgarian", + "languages.mya": "Burmese", + "languages.cat": "Catalan", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chinese", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croatian", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "English", + "languages.epo": "Esperanto", + "languages.est": "Estonian", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "French", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "German", + "languages.ell": "Greek", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitian", + "languages.hau": "Hausa", + "languages.hed": "Hebrew", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarian", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italian", + "languages.iku": "Inuktitut", + "languages.jpn": "Japanese", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Korean", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolian", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norwegian", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persian", + "languages.pol": "Polish", + "languages.pus": "Pashto", + "languages.por": "Portuguese", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Romanian", + "languages.rus": "Russian", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbian", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spanish", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrainian", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamese", + "languages.vol": "Volapük", + "languages.win": "Walloon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_de.json b/sources/lang/Localization_de.json new file mode 100644 index 0000000..47e02b9 --- /dev/null +++ b/sources/lang/Localization_de.json @@ -0,0 +1,293 @@ +{ + "about.title": "Über COPS", + "allbooks.alphabetical.many": "Alphabetischer Index der {0} Bücher", + "allbooks.alphabetical.none": "Alphabetischer Index von absolut keinem Buch", + "allbooks.alphabetical.one": "Alphabetischer Index des einzigen Buchs", + "allbooks.title": "Alle Bücher", + "authors.alphabetical.many": "Alphabetischer Index der {0} Autoren", + "authors.alphabetical.none": "Alphabetischer Index von absolut keinem Autor", + "authors.alphabetical.one": "Alphabetischer Index des einzigen Autors", + "authors.title": "Autoren", + "authorword.many": "{0} Autoren", + "authorword.none": "Kein Autor", + "authorword.one": "1 Autor", + "bookentry.author": "{0} von {1}", + "bookword.many": "{0} Bücher", + "bookword.none": "Kein Buch", + "bookword.one": "1 Buch", + "bookword.title": "Bücher", + "cog.alternate": "Suche, Sortierung und Filter", + "content.series": "Serien:", + "content.series.data": "Buch {0} der {1} - Reihe", + "content.summary": "Inhalt", + "customcolumn.boolean.no": "Nein", + "customcolumn.boolean.unknown": "Nicht gesetzt", + "customcolumn.boolean.yes": "Ja", + "customcolumn.date.format": "d.m.Y", + "customcolumn.date.unknown": "Nicht gesetzt", + "customcolumn.description": "Bentzerdefinierte Spalte '{0}", + "customcolumn.description.bool": "Index eines Wahrheitswertes", + "customcolumn.description.enum.many": "Alphabetischer Index der {0} Werte", + "customcolumn.description.enum.none": "Alphabetischer Index von absolut keinen Werten", + "customcolumn.description.enum.one": "Alphabetischer Index von einem Wert", + "customcolumn.description.rating": "Index von Bewertungen", + "customcolumn.description.series.many": "Alphabetischer Index der {0} Serien", + "customcolumn.description.series.none": "Alphabetischer Index von absolut keinen Serien", + "customcolumn.description.series.one": "Alphabetischer Index der einzigen Serie", + "customcolumn.enum.unknown": "Nicht gesetzt", + "customcolumn.float.unknown": "Nicht gesetzt", + "customcolumn.int.unknown": "Nicht gesetzt", + "customcolumn.rating.unknown": "Nicht gesetzt", + "customcolumn.stars.many": "{0} Sterne", + "customcolumn.stars.none": "Kein Stern", + "customcolumn.stars.one": "1 Stern", + "customize.email": "Geben Sie Ihre E-Mail-Adresse an (erlaubt das Zusenden von Büchern)", + "customize.fancybox": "Benutze die Lightbox", + "customize.filter": "Erlaube das Filtern nach Stichworten", + "customize.ignored": "Nicht verwendete Kategorien", + "customize.paging": "Maximale Anzahl von Büchern pro Seite (-1 zum Deaktivieren)", + "customize.style": "Thema", + "customize.title": "Anpassungen an COPS", + "home.alternate": "Startseite", + "i18n.coversection": "Umschlag", + "language.title": "Sprache", + "languages.alphabetical.many": "Alphabetischer Index der {0} Sprachen", + "languages.alphabetical.none": "Alphabetischer Index von absolut keiner Sprache", + "languages.alphabetical.one": "Alphabetischer Index der einzigen Sprache", + "languages.title": "Sprachen", + "mail.messagenotsent": "E-Mail konnte nicht gesendet werden.", + "mail.messagesent": "E-Mail wurde gesendet.", + "paging.next.alternate": "Nächste", + "paging.previous.alternate": "Vorherige", + "permalink.alternate": "Permalink", + "pubdate.title": "Veröffentlichung", + "publisher.name": "Verlag", + "publishers.alphabetical.many": "Alphabetischer Index der {0} Verlage", + "publishers.alphabetical.none": "Alphabetischer Index von absolut keinem Verlag", + "publishers.alphabetical.one": "Alphabetischer Index des einzigen Verlags", + "publishers.title": "Verlage", + "publisherword.many": "{0} Verlage", + "publisherword.none": "Kein Verlag", + "publisherword.one": "1 Verlag", + "ratings.many": "{0} verschiedene Bewertungen", + "ratings.none": "Keine Bewertungen", + "ratings.one": "{0} Bewertung", + "ratings.title": "Bewertung", + "ratingword.many": "{0} Sterne", + "ratingword.none": "{0} Sterne", + "ratingword.one": "{0} Stern", + "recent.list": "{0} neue Bücher", + "recent.title": "Neuzugänge", + "search.alternate": "Suche", + "search.result": "Suchergebnis für", + "search.result.author": "Suchergebnis für *{0}* in Autoren", + "search.result.book": "Suchergebnis für *{0}* in Bücher", + "search.result.publisher": "Suchergebnis für *{0}* in Verlage", + "search.result.series": "Suchergebnis für *{0}* in Serien", + "search.result.tag": "Suchergebnis für *{0}* in Schlagwörter", + "search.sortorder.asc": "Auf", + "search.sortorder.desc": "Ab", + "series.alphabetical.many": "Alphabetischer Index der {0} Serien", + "series.alphabetical.none": "Alphabetischer Index von absolut keiner Serie", + "series.alphabetical.one": "Alphabetischer Index der Serie", + "series.title": "Serien", + "seriesword.many": "{0} Serien", + "seriesword.none": "Keine Serie", + "seriesword.one": "1 Serie", + "sort.alternate": "Sortierung", + "splitByLetter.book.other": "Andere Bücher", + "splitByLetter.letter": "{0} unter {1}", + "tags.alphabetical.many": "Alphabetischer Index der {0} Schlagwörter", + "tags.alphabetical.none": "Alphabetischer Index von absolut keinem Schlagwort", + "tags.alphabetical.one": "Alphabetischer Index des Schlagworts", + "tags.title": "Schlagwörter", + "tagword.many": "{0} Schlagwörter", + "tagword.none": "Kein Schlagwort", + "tagword.one": "1 Schlagwort", + "tagword.title": "Schlagwörter", + "languages.abk": "Abchasisch", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanisch", + "languages.amh": "Amharisch", + "languages.ara": "Arabisch", + "languages.arg": "Aragonisch", + "languages.hye": "Armenisch", + "languages.asm": "Assamesisch", + "languages.ava": "Awarisch", + "languages.ave": "Avestisch", + "languages.aym": "Aymara", + "languages.aze": "Aserbaidschanisch", + "languages.bam": "Bambara", + "languages.bak": "Baschkirisch", + "languages.eus": "Baskisch", + "languages.bel": "Weissrussisch", + "languages.ben": "Bengalisch", + "languages.bih": "Biharisch", + "languages.bis": "Bislamisch", + "languages.bos": "Bosnisch", + "languages.bre": "Bretonisch", + "languages.bul": "Bulgarisch", + "languages.mya": "Burmesisch", + "languages.cat": "Katalanisch", + "languages.cha": "Chamorro", + "languages.che": "Tschetschenisch", + "languages.nya": "Chichewa", + "languages.zho": "Chinesisch", + "languages.chv": "Tschuwaschisch", + "languages.cor": "Kornisch", + "languages.cos": "Korsisch", + "languages.cre": "Cree", + "languages.hrv": "Kroatisch", + "languages.ces": "Tschechisch", + "languages.dan": "Dänisch", + "languages.div": "Divehi", + "languages.nld": "Niederländisch", + "languages.dzo": "Dzongkha", + "languages.eng": "Englisch", + "languages.epo": "Esperanto", + "languages.est": "Estisch", + "languages.ewe": "Ewe", + "languages.fao": "Färöisch", + "languages.fij": "Fidschi", + "languages.fin": "Finnisch", + "languages.fra": "Französisch", + "languages.ful": "Fulfulde", + "languages.glg": "Galizisch", + "languages.kat": "Georgisch", + "languages.deu": "Deutsch", + "languages.ell": "Griechisch", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitianisch", + "languages.hau": "Haussa", + "languages.hed": "Hebräisch", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Ungarisch", + "languages.ina": "Interlingua", + "languages.ind": "Indonesisch", + "languages.ile": "Interlingue", + "languages.gle": "Irisch", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Isländisch", + "languages.ita": "Italienisch", + "languages.iku": "Inuktitut (Eskimo)", + "languages.jpn": "Japanisch", + "languages.jav": "Javanisch", + "languages.kal": "Kalaallisut (Grönländisch)", + "languages.kan": "Kanarisch", + "languages.kau": "Kanuri", + "languages.kas": "Kaschmirisch", + "languages.kaz": "Kasachisch", + "languages.khm": "Kambodschanisch", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kirgisisch", + "languages.kom": "Komi", + "languages.kon": "Kongolesisch", + "languages.kor": "Koreanisch", + "languages.kur": "Kurdisch", + "languages.kua": "Oshivambo", + "languages.lat": "Lateinisch", + "languages.ltz": "Luxemburgisch", + "languages.lug": "Luganda", + "languages.lim": "Limburgisch", + "languages.lin": "Lingála", + "languages.lao": "Laotisch", + "languages.lit": "Litauisch", + "languages.lub": "Kiluba", + "languages.lav": "Lettisch", + "languages.glv": "Manx", + "languages.mkd": "Mazedonisch", + "languages.mlg": "Malagasy", + "languages.msa": "Malaiisch", + "languages.mal": "Malaysisch", + "languages.mlt": "Maltesisch", + "languages.mri": "Maorisch", + "languages.mar": "Marathi", + "languages.mah": "Marshallesisch", + "languages.mon": "Mongolisch", + "languages.nau": "Nauruisch", + "languages.nav": "Navajo", + "languages.nob": "Norwegisch (Bokmål)", + "languages.nde": "Nord-Ndebele", + "languages.nep": "Nepalesisch", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegisch (Nynorsk)", + "languages.nor": "Norwegisch", + "languages.iii": "Yiyu", + "languages.nbl": "Süd-Ndebele", + "languages.oci": "Okzitanisch", + "languages.oji": "Ojibwe", + "languages.chu": "Altkirchenslawisch", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetisch", + "languages.pan": "Punjabisch", + "languages.pli": "Pali", + "languages.fas": "Persisch", + "languages.pol": "Polnisch", + "languages.pus": "Pashtu", + "languages.por": "Portugisisch", + "languages.que": "Quechua", + "languages.roh": "Bündnerromanisch", + "languages.run": "Kirundisch", + "languages.ron": "Rumänisch", + "languages.rus": "Russisch", + "languages.san": "Sanskrit", + "languages.srd": "Sardisch", + "languages.snd": "Sindhi", + "languages.sme": "Nordsamisch", + "languages.smo": "Samoanisch", + "languages.sag": "Sango", + "languages.srp": "Serbisch", + "languages.gla": "Schottisches Gälisch", + "languages.sna": "Schonisch", + "languages.sin": "Singhalesisch", + "languages.slk": "Slowakisch", + "languages.slv": "Slowenisch", + "languages.som": "Somalisch", + "languages.sot": "Sesotho", + "languages.spa": "Spanisch", + "languages.sun": "Sundanesisch", + "languages.swa": "Kisuaheli", + "languages.ssw": "Siswati", + "languages.swe": "Schwedisch", + "languages.tam": "Tamilisch", + "languages.tel": "Telugisch", + "languages.tgk": "Tadschikisch", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetisch", + "languages.tuk": "Turkmenisch", + "languages.tgl": "Tagalog", + "languages.tsn": "Setswana", + "languages.ton": "Tongaisch", + "languages.tur": "Türkisch", + "languages.tso": "Tsongaisch", + "languages.tat": "Tatarisch", + "languages.twi": "Twi", + "languages.tah": "Tahitianisch", + "languages.uig": "Uigur", + "languages.ukr": "Ukrainisch", + "languages.urd": "Urdu", + "languages.uzb": "Usbekisch", + "languages.ven": "Tshivenda", + "languages.vie": "Vietnamesisch", + "languages.vol": "Volapük", + "languages.win": "Wallonisch", + "languages.cym": "Walisisch", + "languages.wol": "Wolof", + "languages.fry": "Westfriesisch", + "languages.xho": "IsiXhosa", + "languages.yid": "Yi (Jiddisch)", + "languages.yor": "Joruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_el.json b/sources/lang/Localization_el.json new file mode 100644 index 0000000..5be2cd2 --- /dev/null +++ b/sources/lang/Localization_el.json @@ -0,0 +1,293 @@ +{ + "about.title": "Σχετικά με COPS", + "allbooks.alphabetical.many": "Αλφαβητικό ευρετήριο των {0} βιβλίων", + "allbooks.alphabetical.none": "Αλφαβητικός κατάλογος από απολύτως κανένα βιβλίο", + "allbooks.alphabetical.one": "Αλφαβητικό ευρετήριο του μοναδικού βιβλίου", + "allbooks.title": "Όλα τα βιβλία", + "authors.alphabetical.many": "Αλφαβητικό ευρετήριο των {0} συγγραφέων", + "authors.alphabetical.none": "Αλφαβητικός κατάλογος από απολύτως κανένα συγγραφέα", + "authors.alphabetical.one": "Αλφαβητικό ευρετήριο του μοναδικού συγγραφέα", + "authors.title": "Συγγραφείς", + "authorword.many": "{0} συγγραφείς", + "authorword.none": "Χωρίς συγγραφείς", + "authorword.one": "1 συγγραφέας", + "bookentry.author": "{0} από {1}", + "bookword.many": "{0} βιβλία", + "bookword.none": "Δεν υπάρχουν βιβλία", + "bookword.one": "1 βιβλίο", + "bookword.title": "Βιβλία", + "cog.alternate": "Αναζήτηση, ταξινόμηση και φίλτρα", + "content.series": "Σειρά:", + "content.series.data": "Βιβλίο {0} από την σειρά {1}", + "content.summary": "Περίληψη", + "customcolumn.boolean.no": "Όχι", + "customcolumn.boolean.unknown": "Προεπιλογή", + "customcolumn.boolean.yes": "Ναι", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Προεπιλογή", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Αλφαβητικό ευρετήριο των {0} σειρών", + "customcolumn.description.series.none": "Αλφαβητικός κατάλογος από απολύτως καμία σειρά", + "customcolumn.description.series.one": "Αλφαβητικό ευρετήριο της μοναδικής σειράς", + "customcolumn.enum.unknown": "Προεπιλογή", + "customcolumn.float.unknown": "Προεπιλογή", + "customcolumn.int.unknown": "Προεπιλογή", + "customcolumn.rating.unknown": "Προεπιλογή", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Ρυθμίστε το email σας (για να επιτραπεί αποστολή email)", + "customize.fancybox": "Χρήση Lightbox (τα βιβλία φορτώνουν σε πλαίσιο)", + "customize.filter": "Ενεργοποίηση φιλτραρίσματος ανά ετικέτα", + "customize.ignored": "Αγνοείστε κατηγορίες", + "customize.paging": "Μέγιστος αριθμός βιβλίων ανά σελίδα (-1 για απενεργοποίηση)", + "customize.style": "Θέμα", + "customize.title": "Προσαρμογή COPS UI", + "home.alternate": "Αρχική", + "i18n.coversection": "Εξώφυλλο", + "language.title": "Γλώσσα", + "languages.alphabetical.many": "Αλφαβητικό ευρετήριο των {0} γλωσσών", + "languages.alphabetical.none": "Αλφαβητικός κατάλογος από απολύτως καμία γλώσσες", + "languages.alphabetical.one": "Αλφαβητικό ευρετήριο της μοναδικής γλώσσας", + "languages.title": "Γλώσσες", + "mail.messagenotsent": "Το μήνυμα δεν μπόρεσε να σταλεί.", + "mail.messagesent": "Το μήνυμα εστάλη", + "paging.next.alternate": "Επόμενος", + "paging.previous.alternate": "Προηγούμενος", + "permalink.alternate": "Permalink", + "pubdate.title": "Έτος έκδοσης", + "publisher.name": "Εκδότης", + "publishers.alphabetical.many": "Αλφαβητικό ευρετήριο από {0} εκδότες", + "publishers.alphabetical.none": "Αλφαβητικός κατάλογος από απολύτως κανένα εκδότη", + "publishers.alphabetical.one": "Αλφαβητικό ευρετήριο του μοναδικού εκδότη", + "publishers.title": "Εκδότες", + "publisherword.many": "{0} εκδότες", + "publisherword.none": "Δεν υπάρχουν εκδότες", + "publisherword.one": "1 εκδότης", + "ratings.many": "{0} αξιολογήσεις", + "ratings.none": "Δεν υπάρχουν αξιολογήσεις", + "ratings.one": "1 αξιολόγηση", + "ratings.title": "Αξιολογήσεις", + "ratingword.many": "{0} αστέρια", + "ratingword.none": "Χωρίς αστέρι", + "ratingword.one": "1 αστέρι", + "recent.list": "{0} πιο πρόσφατα βιβλία", + "recent.title": "Πρόσφατες προσθήκες", + "search.alternate": "Αναζήτηση", + "search.result": "Αποτέλεσμα αναζήτησης για * {0} *", + "search.result.author": "Αποτέλεσμα αναζήτησης για * {0} * σε συγγραφείς", + "search.result.book": "Αποτέλεσμα αναζήτησης για * {0} * στα βιβλία", + "search.result.publisher": "Αποτέλεσμα αναζήτησης για * {0} * σε εκδότες", + "search.result.series": "Αποτέλεσμα αναζήτησης για * {0} * σε σειρά", + "search.result.tag": "Αποτέλεσμα αναζήτησης για * {0} * σε ετικέτες", + "search.sortorder.asc": "Αυξ", + "search.sortorder.desc": "Φθιν", + "series.alphabetical.many": "Αλφαβητικό ευρετήριο των {0} σειρών", + "series.alphabetical.none": "Αλφαβητικός κατάλογος από απολύτως καμία σειρά", + "series.alphabetical.one": "Αλφαβητικό ευρετήριο της μοναδικής σειράς", + "series.title": "Σειρά", + "seriesword.many": "{0} σειρά", + "seriesword.none": "Χωρίς σειρά", + "seriesword.one": "Σειρά 1", + "sort.alternate": "Ταξινόμηση", + "splitByLetter.book.other": "Άλλα βιβλία", + "splitByLetter.letter": "{0} ξεκινά με {1}", + "tags.alphabetical.many": "Αλφαβητικό ευρετήριο των {0} ετικετών", + "tags.alphabetical.none": "Αλφαβητικός κατάλογος από απολύτως καμία ετικέτες", + "tags.alphabetical.one": "Αλφαβητικό ευρετήριο της μοναδικής ετικέτας", + "tags.title": "Ετικέτες", + "tagword.many": "{0} ετικέτες", + "tagword.none": "Δεν υπάρχουν ετικέτες", + "tagword.one": "1 ετικέτα", + "tagword.title": "Ετικέτες", + "languages.abk": "Αμπχαζίας", + "languages.aaf": "Αφάρ", + "languages.afr": "Αφρικάνικα", + "languages.aka": "Akan", + "languages.sqi": "Αλβανικά", + "languages.amh": "Αμαρικά", + "languages.ara": "Αραβικά", + "languages.arg": "Αραγονίας", + "languages.hye": "Αρμενικός", + "languages.asm": "Ασαμέζικα", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Αζερμπαϊτζάν", + "languages.bam": "Μπαμπάρα", + "languages.bak": "Μπασκίρ", + "languages.eus": "Βάσκων", + "languages.bel": "Λευκορωσίας", + "languages.ben": "Βεγγαλική", + "languages.bih": "Μπιχάρι", + "languages.bis": "Μπισλάμα", + "languages.bos": "Βοσνιακά", + "languages.bre": "Breton", + "languages.bul": "Βούλγαρος", + "languages.mya": "Βιρμανίας", + "languages.cat": "Καταλανικά", + "languages.cha": "Chamorro", + "languages.che": "Της Τσετσενίας", + "languages.nya": "Chichewa", + "languages.zho": "Κινέζικα", + "languages.chv": "Χουβάς", + "languages.cor": "Cornish", + "languages.cos": "Κορσικανός", + "languages.cre": "Κρι", + "languages.hrv": "Κροατία", + "languages.ces": "Τσέχος", + "languages.dan": "Δανός", + "languages.div": "Ντιβέχι", + "languages.nld": "Ολλανδός", + "languages.dzo": "Dzongkha", + "languages.eng": "Αγγλικά", + "languages.epo": "Εσπεράντο", + "languages.est": "Εσθονική", + "languages.ewe": "Προβατίνα", + "languages.fao": "Των Νήσων Φερόε", + "languages.fij": "Φίτζι", + "languages.fin": "Φινλανδικά", + "languages.fra": "Γαλλικά", + "languages.ful": "Fula", + "languages.glg": "Γαλικίας", + "languages.kat": "Γεωργιανά", + "languages.deu": "Γερμανός", + "languages.ell": "Ελληνικά", + "languages.grn": "Γκουαρανί", + "languages.guj": "Γκουτζαρατικά", + "languages.hat": "Αϊτής", + "languages.hau": "Χάουσα", + "languages.hed": "Εβραϊκά", + "languages.her": "Herero", + "languages.hin": "Χίντι", + "languages.hmo": "Hiri Motu", + "languages.hun": "Ούγγρος", + "languages.ina": "Ιντερλίνγκουα", + "languages.ind": "Ινδονησίας", + "languages.ile": "Ιντερλίνγκουε", + "languages.gle": "Ιρλανδικός", + "languages.ibo": "Ίγκμπο", + "languages.ipk": "Ινουπιάκ", + "languages.ido": "Ιντο", + "languages.isl": "Ισλανδικός", + "languages.ita": "Ιταλικά", + "languages.iku": "Ινουκτιτούτ", + "languages.jpn": "Ιαπωνικά", + "languages.jav": "Ιάβας", + "languages.kal": "Kalaallisut", + "languages.kan": "Κανάντα", + "languages.kau": "Κανούρι", + "languages.kas": "Κασμίρ", + "languages.kaz": "Του Καζακστάν", + "languages.khm": "Χμερ", + "languages.kik": "Κικούγιου", + "languages.kin": "Kinyarwanda", + "languages.kir": "Κιργιζίας", + "languages.kom": "Κώμη", + "languages.kon": "Kongo", + "languages.kor": "Κορέατικα", + "languages.kur": "Κουρδικά", + "languages.kua": "Kwanyama", + "languages.lat": "Λατινικά", + "languages.ltz": "Λουξεμβούργου", + "languages.lug": "Ganda", + "languages.lim": "Λιμβουργιανά", + "languages.lin": "Lingala", + "languages.lao": "Λάος", + "languages.lit": "Λιθουανικά", + "languages.lub": "Λούμπα-Κατάνγκα", + "languages.lav": "Της Λετονίας", + "languages.glv": "Μανξ", + "languages.mkd": "ΦΥΡΟΜ", + "languages.mlg": "Μαδαγασκάρης", + "languages.msa": "Μαλαισίας", + "languages.mal": "Μαλαγιάλαμ", + "languages.mlt": "Της Μάλτας", + "languages.mri": "Μαορί", + "languages.mar": "Μαράθι", + "languages.mah": "Μάρσαλ", + "languages.mon": "Μογγόλος", + "languages.nau": "Ναουρού", + "languages.nav": "Navajo", + "languages.nob": "Νορβηγικά", + "languages.nde": "Βόρεια Ντέμπελε", + "languages.nep": "Νεπάλ", + "languages.ndo": "Ndonga", + "languages.nno": "Νορβηγικά Νινόρσκ", + "languages.nor": "Νορβηγός", + "languages.iii": "Nuosu", + "languages.nbl": "Ισλανδική γλώσσα", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Παλιά εκκλησιαστική σλαβονική", + "languages.orm": "Ορόμο", + "languages.ori": "Οριγικά", + "languages.oss": "Οσετίας", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Πέρσης", + "languages.pol": "Πολωνός", + "languages.pus": "Πάστο", + "languages.por": "Πορτογάλος", + "languages.que": "Κέτσουα", + "languages.roh": "Ρωμανικά", + "languages.run": "Kirundi", + "languages.ron": "Ρουμανικός", + "languages.rus": "Ρωσικός", + "languages.san": "Σανσκριτικά", + "languages.srd": "Σαρδηνίας", + "languages.snd": "Σίντι", + "languages.sme": "Βόρεια Σάμι", + "languages.smo": "Σαμόα", + "languages.sag": "Σάνγκο", + "languages.srp": "Σέρβικα", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Σόνα", + "languages.sin": "Sinhala", + "languages.slk": "Σλοβάκος", + "languages.slv": "Σλοβενικά", + "languages.som": "Της Σομαλίας", + "languages.sot": "Νότια Σόθο", + "languages.spa": "Ισπανικά", + "languages.sun": "Σουδανικά", + "languages.swa": "Σουαχίλι", + "languages.ssw": "Swati", + "languages.swe": "Σουηδικά", + "languages.tam": "Ταμίλ", + "languages.tel": "Τελούγκου", + "languages.tgk": "Τατζικιστάν", + "languages.tha": "Ταϊλάνδης", + "languages.tir": "Τιγκρινιανά", + "languages.bod": "Θιβετιανά κανονικά", + "languages.tuk": "Τουρκμενιστάν", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Τόνγκα", + "languages.tur": "Τουρκική", + "languages.tso": "Τσόνγκα", + "languages.tat": "Ταταρικά", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Ουιγούρων", + "languages.ukr": "Ουκρανός", + "languages.urd": "Ούρντου", + "languages.uzb": "Ουζμπεκιστάν", + "languages.ven": "Venda", + "languages.vie": "Βιετνάμ", + "languages.vol": "Βόλαπικ", + "languages.win": "Βαλλονίας", + "languages.cym": "Ουαλίας", + "languages.wol": "Γουόλοφ", + "languages.fry": "Δυτικά Φριζιανά", + "languages.xho": "Xhosa", + "languages.yid": "Γίντις", + "languages.yor": "Γιορούμπα", + "languages.zha": "Zhuang", + "languages.zul": "Ζουλού", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_en.json b/sources/lang/Localization_en.json new file mode 100644 index 0000000..0074eaf --- /dev/null +++ b/sources/lang/Localization_en.json @@ -0,0 +1,293 @@ +{ + "about.title": "About COPS", + "allbooks.alphabetical.many": "Alphabetical index of the {0} books", + "allbooks.alphabetical.none": "Alphabetical index of absolutely no books", + "allbooks.alphabetical.one": "Alphabetical index of the single book", + "allbooks.title": "All books", + "authors.alphabetical.many": "Alphabetical index of the {0} authors", + "authors.alphabetical.none": "Alphabetical index of absolutely no authors", + "authors.alphabetical.one": "Alphabetical index of the single author", + "authors.title": "Authors", + "authorword.many": "{0} authors", + "authorword.none": "No authors", + "authorword.one": "1 author", + "bookentry.author": "{0} by {1}", + "bookword.many": "{0} books", + "bookword.none": "No books", + "bookword.one": "1 book", + "bookword.title": "Books", + "cog.alternate": "Search, sort and filters", + "content.series": "Series:", + "content.series.data": "Book {0} in the {1} series", + "content.summary": "Summary", + "customcolumn.boolean.no": "No", + "customcolumn.boolean.unknown": "Not Set", + "customcolumn.boolean.yes": "Yes", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Not Set", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Alphabetical index of the {0} series", + "customcolumn.description.series.none": "Alphabetical index of absolutely no series", + "customcolumn.description.series.one": "Alphabetical index of the single series", + "customcolumn.enum.unknown": "Not Set", + "customcolumn.float.unknown": "Not Set", + "customcolumn.int.unknown": "Not Set", + "customcolumn.rating.unknown": "Not Set", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Set your email (to allow book emailing)", + "customize.fancybox": "Use Lightbox (books load in floating frame)", + "customize.filter": "Enable tag filtering", + "customize.ignored": "Ignored categories", + "customize.paging": "Max number of books per page (-1 to disable)", + "customize.style": "Theme", + "customize.title": "Customize COPS UI", + "home.alternate": "Home", + "i18n.coversection": "Cover", + "language.title": "Language", + "languages.alphabetical.many": "Alphabetical index of the {0} languages", + "languages.alphabetical.none": "Alphabetical index of absolutely no languages", + "languages.alphabetical.one": "Alphabetical index of the single language", + "languages.title": "Languages", + "mail.messagenotsent": "Message could not be sent.", + "mail.messagesent": "Message has been sent", + "paging.next.alternate": "Next", + "paging.previous.alternate": "Previous", + "permalink.alternate": "Permalink", + "pubdate.title": "Publication year", + "publisher.name": "Publisher", + "publishers.alphabetical.many": "Alphabetical index of the {0} publishers", + "publishers.alphabetical.none": "Alphabetical index of absolutely no publishers", + "publishers.alphabetical.one": "Alphabetical index of the single publisher", + "publishers.title": "Publishers", + "publisherword.many": "{0} publishers", + "publisherword.none": "No publishers", + "publisherword.one": "1 publisher", + "ratings.many": "{0} ratings", + "ratings.none": "no ratings", + "ratings.one": "1 rating", + "ratings.title": "Ratings", + "ratingword.many": "{0} stars", + "ratingword.none": "No star", + "ratingword.one": "1 star", + "recent.list": "{0} most recent books", + "recent.title": "Recent additions", + "search.alternate": "Search", + "search.result": "Search result for *{0}*", + "search.result.author": "Search result for *{0}* in authors", + "search.result.book": "Search result for *{0}* in books", + "search.result.publisher": "Search result for *{0}* in publishers", + "search.result.series": "Search result for *{0}* in series", + "search.result.tag": "Search result for *{0}* in tags", + "search.sortorder.asc": "Asc", + "search.sortorder.desc": "Desc", + "series.alphabetical.many": "Alphabetical index of the {0} series", + "series.alphabetical.none": "Alphabetical index of absolutely no series", + "series.alphabetical.one": "Alphabetical index of the single series", + "series.title": "Series", + "seriesword.many": "{0} series", + "seriesword.none": "No series", + "seriesword.one": "1 series", + "sort.alternate": "Sort", + "splitByLetter.book.other": "Other books", + "splitByLetter.letter": "{0} starting with {1}", + "tags.alphabetical.many": "Alphabetical index of the {0} tags", + "tags.alphabetical.none": "Alphabetical index of absolutely no tags", + "tags.alphabetical.one": "Alphabetical index of the single tag", + "tags.title": "Tags", + "tagword.many": "{0} tags", + "tagword.none": "No tags", + "tagword.one": "1 tag", + "tagword.title": "Tags", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanian", + "languages.amh": "Amharic", + "languages.ara": "Arabic", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Basque", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgarian", + "languages.mya": "Burmese", + "languages.cat": "Catalan", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chinese", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croatian", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "English", + "languages.epo": "Esperanto", + "languages.est": "Estonian", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "French", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "German", + "languages.ell": "Greek", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitian", + "languages.hau": "Hausa", + "languages.hed": "Hebrew", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarian", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italian", + "languages.iku": "Inuktitut", + "languages.jpn": "Japanese", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Korean", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolian", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norwegian", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persian", + "languages.pol": "Polish", + "languages.pus": "Pashto", + "languages.por": "Portuguese", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Romanian", + "languages.rus": "Russian", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbian", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spanish", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrainian", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamese", + "languages.vol": "Volapük", + "languages.win": "Walloon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_es.json b/sources/lang/Localization_es.json new file mode 100644 index 0000000..d68138e --- /dev/null +++ b/sources/lang/Localization_es.json @@ -0,0 +1,293 @@ +{ + "about.title": "Acerca de COPS", + "allbooks.alphabetical.many": "Listado alfabético de {0} libros", + "allbooks.alphabetical.none": "Listado sin libros", + "allbooks.alphabetical.one": "Listado con un libro", + "allbooks.title": "Todos los libros", + "authors.alphabetical.many": "Listado alfabético de {0} autores", + "authors.alphabetical.none": "Listado sin autores", + "authors.alphabetical.one": "Listado con un autor", + "authors.title": "Autores", + "authorword.many": "{0} autores", + "authorword.none": "Sin autor", + "authorword.one": "1 autor", + "bookentry.author": "{0} de {1}", + "bookword.many": "{0} libros", + "bookword.none": "Sin libros", + "bookword.one": "1 libro", + "bookword.title": "Libros", + "cog.alternate": "Búsqueda, ordenación y filtros", + "content.series": "Series:", + "content.series.data": "Libro {0} en la {1} serie", + "content.summary": "Resumen", + "customcolumn.boolean.no": "No", + "customcolumn.boolean.unknown": "No Establecido", + "customcolumn.boolean.yes": "Sí", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "No Establecido", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Listado alfabético de {0} series", + "customcolumn.description.series.none": "Listado sin series", + "customcolumn.description.series.one": "Listado de una serie", + "customcolumn.enum.unknown": "No Establecido", + "customcolumn.float.unknown": "No Establecido", + "customcolumn.int.unknown": "No Establecido", + "customcolumn.rating.unknown": "No Establecido", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Su correo (Para envío de libros por correo)", + "customize.fancybox": "Usar LightBox", + "customize.filter": "Activar filtro por etiqueta", + "customize.ignored": "Ocultar categorías", + "customize.paging": "Max. número de libros por página (-1 para desactivar)", + "customize.style": "Tema", + "customize.title": "Configurar COPS UI", + "home.alternate": "Inicio", + "i18n.coversection": "Cubierta", + "language.title": "Idioma", + "languages.alphabetical.many": "Listado alfabético de {0} idiomas", + "languages.alphabetical.none": "Listado sin idiomas disponibles", + "languages.alphabetical.one": "Listado con un idioma", + "languages.title": "Idiomas", + "mail.messagenotsent": "El mensaje no pudo enviarse.", + "mail.messagesent": "El mensaje se ha enviado", + "paging.next.alternate": "Siguiente", + "paging.previous.alternate": "Anterior", + "permalink.alternate": "Enlace permanente", + "pubdate.title": "Año de publicación", + "publisher.name": "Editorial", + "publishers.alphabetical.many": "Listado alfabético de {0} editoriales", + "publishers.alphabetical.none": "Listado sin editoriales", + "publishers.alphabetical.one": "Listado con una editorial", + "publishers.title": "Editoriales", + "publisherword.many": "{0} editoriales", + "publisherword.none": "No hay editoriales", + "publisherword.one": "1 editorial", + "ratings.many": "{0} valoraciones", + "ratings.none": "sin valoraciones", + "ratings.one": "1 valoración", + "ratings.title": "Puntuaciones", + "ratingword.many": "{0} estrellas", + "ratingword.none": "Sin estrellas", + "ratingword.one": "1 estrella", + "recent.list": "{0} libros más recientes", + "recent.title": "Añadidos recientemente", + "search.alternate": "Buscar", + "search.result": "Resultados de buscar *{0}*", + "search.result.author": "Resultados de buscar *{0}* en autores", + "search.result.book": "Resultados de buscar *{0}* en libros", + "search.result.publisher": "Resultados de buscar *{0}* en editoriales", + "search.result.series": "Resultados de buscar *{0}* en series", + "search.result.tag": "Resultados de buscar *{0}* en etiquetas", + "search.sortorder.asc": "Asc", + "search.sortorder.desc": "Desc", + "series.alphabetical.many": "Listado alfabético de {0} series", + "series.alphabetical.none": "Listado sin series", + "series.alphabetical.one": "Listado de una serie", + "series.title": "Series", + "seriesword.many": "{0} series", + "seriesword.none": "Sin series", + "seriesword.one": "1 serie", + "sort.alternate": "Ordenar", + "splitByLetter.book.other": "Otros libros", + "splitByLetter.letter": "{0} que empiezan por {1}", + "tags.alphabetical.many": "Listado alfabético de las {0} etiquetas", + "tags.alphabetical.none": "Listado sin etiquetas", + "tags.alphabetical.one": "Listado alfabético de la unica etiqueta", + "tags.title": "Etiquetas", + "tagword.many": "etiquetas", + "tagword.none": "Sin etiquetas", + "tagword.one": "1 etiqueta", + "tagword.title": "Etiquetas", + "languages.abk": "Abjasio", + "languages.aaf": "Afar", + "languages.afr": "Afrikáans", + "languages.aka": "Ákan", + "languages.sqi": "Albano", + "languages.amh": "Amharic", + "languages.ara": "Arabe", + "languages.arg": "Aragonés", + "languages.hye": "Armenio", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Euskera", + "languages.bel": "Belarusian", + "languages.ben": "Bengalí", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnio", + "languages.bre": "Bretón", + "languages.bul": "Bulgaro", + "languages.mya": "Burmese", + "languages.cat": "Catalán", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chino", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croata", + "languages.ces": "Checo", + "languages.dan": "Danés", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "Inglés", + "languages.epo": "Esperanto", + "languages.est": "Estonio", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fiji", + "languages.fin": "Finlandés", + "languages.fra": "Francés", + "languages.ful": "Fula", + "languages.glg": "Gallego", + "languages.kat": "Georgiano", + "languages.deu": "Alemán", + "languages.ell": "Griego", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitiano", + "languages.hau": "Hausa", + "languages.hed": "Hebreo", + "languages.her": "Herero", + "languages.hin": "Hindú", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungaro", + "languages.ina": "Interlingua", + "languages.ind": "Indonesio", + "languages.ile": "Interlingue", + "languages.gle": "Irlandés", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Islandés", + "languages.ita": "Italiano", + "languages.iku": "Inuktitut", + "languages.jpn": "Japonés", + "languages.jav": "Javanés", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Congoleño", + "languages.kor": "Coreano", + "languages.kur": "Kurdo", + "languages.kua": "Kwanyama", + "languages.lat": "Latín", + "languages.ltz": "Luxemburgés", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lituano", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonio", + "languages.mlg": "Malagasy", + "languages.msa": "Malayo", + "languages.mal": "Malayalam", + "languages.mlt": "Maltés", + "languages.mri": "Maorí", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongol", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwego Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepalí", + "languages.ndo": "Ndonga", + "languages.nno": "Norwego Nynorsk", + "languages.nor": "Noruego", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persa", + "languages.pol": "Polaco", + "languages.pus": "Pashto", + "languages.por": "Portugués", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Rumano", + "languages.rus": "Ruso", + "languages.san": "Sánscrito", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbio", + "languages.gla": "Escocés Gaélico", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Sloveno", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Español", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Sueco", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turco", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitiano", + "languages.uig": "Uighur", + "languages.ukr": "Ucrainiano", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamita", + "languages.vol": "Volapük", + "languages.win": "Valón", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulú", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_eu.json b/sources/lang/Localization_eu.json new file mode 100644 index 0000000..e69abf8 --- /dev/null +++ b/sources/lang/Localization_eu.json @@ -0,0 +1,293 @@ +{ + "about.title": "COPS-i buruz", + "allbooks.alphabetical.many": "{0} libururen zerrenda alfabetikoa", + "allbooks.alphabetical.none": "Liburu gabeko zerrenda", + "allbooks.alphabetical.one": "Liburu bakarreko zerrenda", + "allbooks.title": "Liburu guztiak", + "authors.alphabetical.many": "{0} egileren zerrenda alfabetikoa", + "authors.alphabetical.none": "Egile gabeko zerrenda", + "authors.alphabetical.one": "Egile bakarreko zerrenda", + "authors.title": "Egileak", + "authorword.many": "{0} egile", + "authorword.none": "Egile gabe", + "authorword.one": "Egile 1", + "bookentry.author": "{1}-tik {0}", + "bookword.many": "{0} liburu", + "bookword.none": "Liburu gabe", + "bookword.one": "Liburu 1", + "bookword.title": "Liburuak", + "cog.alternate": "Bilaketa, ordena eta filtroak", + "content.series": "Sailak:", + "content.series.data": "{0} liburu {1} sailekoak", + "content.summary": "Laburpena:", + "customcolumn.boolean.no": "Ez", + "customcolumn.boolean.unknown": "Not Set", + "customcolumn.boolean.yes": "Bai", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Not Set", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "{0} sailen zerrenda alfabetikoa", + "customcolumn.description.series.none": "Sail gabeko zerrenda", + "customcolumn.description.series.one": "Sail bakarreko zerrenda", + "customcolumn.enum.unknown": "Not Set", + "customcolumn.float.unknown": "Not Set", + "customcolumn.int.unknown": "Not Set", + "customcolumn.rating.unknown": "Not Set", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Zure posta elektronikoa (posta bidezko liburu bidalketarako)", + "customize.fancybox": "LightBox erabili", + "customize.filter": "Etiketa bidezko filtroa aktibatu", + "customize.ignored": "Kategoriak ezkutatu", + "customize.paging": "Liburu kopuru maximoa orrialdeko (-1 desaktibatzeko)", + "customize.style": "Gaia", + "customize.title": "COPS UI konfiguratu", + "home.alternate": "Hasiera", + "i18n.coversection": "Azala", + "language.title": "Hizkuntza", + "languages.alphabetical.many": "{0} hizkuntzen zerrenda alfabetikoa", + "languages.alphabetical.none": "Hizkutzarik gabeko zerrenda", + "languages.alphabetical.one": "Hizkuntza bakarreko zerrenda", + "languages.title": "Hizkuntza", + "mail.messagenotsent": "Mezua ezin izan da bidali.", + "mail.messagesent": "Mezua bidali da", + "paging.next.alternate": "Hurrengoa", + "paging.previous.alternate": "Aurrekoa", + "permalink.alternate": "Esteka iraunkorra", + "pubdate.title": "Argitaratze urtea", + "publisher.name": "Argitaletxea", + "publishers.alphabetical.many": "{0} argitaletxeren zerrenda alfabetikoa", + "publishers.alphabetical.none": "Argitaletxe gabeko zerrenda", + "publishers.alphabetical.one": "Argitaletxe bakarreko zerrenda", + "publishers.title": "Argitaletxeak", + "publisherword.many": "{0} argitaletxe", + "publisherword.none": "Ez dago argitaletxerik", + "publisherword.one": "Argitaletxe 1", + "ratings.many": "{0} puntuaketa", + "ratings.none": "Ez dago puntuaketarik", + "ratings.one": "Puntuaketa 1", + "ratings.title": "Puntuaketak", + "ratingword.many": "{0} izar", + "ratingword.none": "Izar gabe", + "ratingword.one": "Izar 1", + "recent.list": "{0} liburu berrienak", + "recent.title": "Berriki zerrendatuak", + "search.alternate": "Bilatu", + "search.result": "*{0}* bilaketaren emaitzak", + "search.result.author": "*{0}* bilaketaren emaitzak egileetan", + "search.result.book": "*{0}* bilaketaren emaitzak liburuetan", + "search.result.publisher": "*{0}* bilaketaren emaitzak argitaletxetan", + "search.result.series": "*{0}* bilaketaren emaitzak sailetan", + "search.result.tag": "*{0}* bilaketaren emaitzak etiketetan", + "search.sortorder.asc": "Gora", + "search.sortorder.desc": "Behera", + "series.alphabetical.many": "{0} sailen zerrenda alfabetikoa", + "series.alphabetical.none": "Sail gabeko zerrenda", + "series.alphabetical.one": "Sail bakarreko zerrenda", + "series.title": "Sailak", + "seriesword.many": "{0} sail", + "seriesword.none": "Sail gabe", + "seriesword.one": "Sail 1", + "sort.alternate": "Ordenatu", + "splitByLetter.book.other": "Beste liburu batzuk", + "splitByLetter.letter": "{1}-tik haste d(ir)en {0}", + "tags.alphabetical.many": "{0} etiketen zerrenda alfabetikoa", + "tags.alphabetical.none": "Etiketa gabeko zerrenda", + "tags.alphabetical.one": "Etiketa bakarreko zerrenda", + "tags.title": "Etiketak", + "tagword.many": "{0} etiketa", + "tagword.none": "Etiketa gabe", + "tagword.one": "Etiketa 1", + "tagword.title": "Etiketak", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanian", + "languages.amh": "Amharic", + "languages.ara": "Arabic", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Euskara", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgarian", + "languages.mya": "Burmese", + "languages.cat": "Katalana", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chinese", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croatian", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "Ingelesa", + "languages.epo": "Esperanto", + "languages.est": "Estonian", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "Frantzesa", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "Alemana", + "languages.ell": "Greek", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitian", + "languages.hau": "Hausa", + "languages.hed": "Hebrew", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarian", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italiera", + "languages.iku": "Inuktitut", + "languages.jpn": "Japanese", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Korean", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latina", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolian", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norwegian", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persian", + "languages.pol": "Polish", + "languages.pus": "Pashto", + "languages.por": "Portuguese", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Romanian", + "languages.rus": "Russian", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbian", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Gaztelania", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrainian", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamese", + "languages.vol": "Volapük", + "languages.win": "Walloon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_fr.json b/sources/lang/Localization_fr.json new file mode 100644 index 0000000..85b9c19 --- /dev/null +++ b/sources/lang/Localization_fr.json @@ -0,0 +1,293 @@ +{ + "about.title": "A propos de COPS", + "allbooks.alphabetical.many": "Index alphabétique des {0} livres", + "allbooks.alphabetical.none": "Index alphabétique - aucun livre", + "allbooks.alphabetical.one": "Index alphabétique du seul livre", + "allbooks.title": "Tous les livres", + "authors.alphabetical.many": "Index alphabétique des {0} auteurs", + "authors.alphabetical.none": "Index alphabétique - aucun auteur", + "authors.alphabetical.one": "Index alphabétique du seul auteur", + "authors.title": "Auteurs", + "authorword.many": "{0} auteurs", + "authorword.none": "Pas d'auteur", + "authorword.one": "1 auteur", + "bookentry.author": "{0} de {1}", + "bookword.many": "{0} livres", + "bookword.none": "Aucun livre", + "bookword.one": "1 livre", + "bookword.title": "Livres", + "cog.alternate": "Recherche, tri et filtres", + "content.series": "Collection:", + "content.series.data": "Livre {0} dans la collection {1}", + "content.summary": "Résumé", + "customcolumn.boolean.no": "Non", + "customcolumn.boolean.unknown": "Non défini", + "customcolumn.boolean.yes": "Oui", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Non défini", + "customcolumn.description": "Colonne personnalisée '{0}'", + "customcolumn.description.bool": "Index des valeurs booléenne", + "customcolumn.description.enum.many": "Index alphabétique de {0} valeurs", + "customcolumn.description.enum.none": "Index alphabétique - aucune valeur", + "customcolumn.description.enum.one": "Index alphabétique - une seule valeur", + "customcolumn.description.rating": "Index des appréciations", + "customcolumn.description.series.many": "Index alphabétique de {0} collections", + "customcolumn.description.series.none": "Index alphabétique - aucune collection", + "customcolumn.description.series.one": "Index alphabétique - Une seule collection", + "customcolumn.enum.unknown": "Non défini", + "customcolumn.float.unknown": "Non défini", + "customcolumn.int.unknown": "Non défini", + "customcolumn.rating.unknown": "Non défini", + "customcolumn.stars.many": "{0} étoiles", + "customcolumn.stars.none": "Aucune étoile", + "customcolumn.stars.one": "1 étoile", + "customize.email": "Adresse email (pour l'envoi automatique de livres)", + "customize.fancybox": "Utiliser une Lightbox", + "customize.filter": "Filtrage via les étiquettes", + "customize.ignored": "Catégories ignorées", + "customize.paging": "Nombre de livres par page (-1 pour désactiver)", + "customize.style": "Thème", + "customize.title": "Paramétrage de COPS", + "home.alternate": "Accueil", + "i18n.coversection": "Couverture", + "language.title": "Langue", + "languages.alphabetical.many": "Index alphabétique des {0} langues", + "languages.alphabetical.none": "Index alphabétique - Aucune langue", + "languages.alphabetical.one": "Index alphabétique - Une seule langue", + "languages.title": "Langues", + "mail.messagenotsent": "Le message n'a pas pu être envoyé.", + "mail.messagesent": "Le message a été envoyé", + "paging.next.alternate": "Suivant", + "paging.previous.alternate": "Précédent", + "permalink.alternate": "Permalien", + "pubdate.title": "Année de publication", + "publisher.name": "Editeur", + "publishers.alphabetical.many": "Index alphabétique des {0} éditeurs", + "publishers.alphabetical.none": "Index alphabétique - Aucun éditeur", + "publishers.alphabetical.one": "Index alphabétique - Un seul éditeur", + "publishers.title": "Editeurs", + "publisherword.many": "{0} éditeurs", + "publisherword.none": "Aucun éditeur", + "publisherword.one": "1 éditeur", + "ratings.many": "{0} Appréciations", + "ratings.none": "Pas d'appréciations", + "ratings.one": "1 appréciation", + "ratings.title": "Appréciations", + "ratingword.many": "{0} étoiles", + "ratingword.none": "Aucune étoile", + "ratingword.one": "1 étoile", + "recent.list": "{0} livres les plus récents", + "recent.title": "Ajouts récents", + "search.alternate": "Rechercher", + "search.result": "Résultats pour *{0}*", + "search.result.author": "Résultats pour *{0}* dans les auteurs", + "search.result.book": "Résultats pour *{0}* dans les livres", + "search.result.publisher": "Résultats pour *{0}* dans les éditeurs", + "search.result.series": "Résultats pour *{0}* dans les colllections", + "search.result.tag": "Résultats pour *{0}* dans les étiquettes", + "search.sortorder.asc": "Crois.", + "search.sortorder.desc": "Décrois.", + "series.alphabetical.many": "Index alphabétique de {0} collections", + "series.alphabetical.none": "Index alphabétique - aucune collection", + "series.alphabetical.one": "Index alphabétique - Une seule collection", + "series.title": "Collections", + "seriesword.many": "{0} collections", + "seriesword.none": "Pas de collection", + "seriesword.one": "1 collection", + "sort.alternate": "Trier", + "splitByLetter.book.other": "Autres livres", + "splitByLetter.letter": "{0} débutant par {1}", + "tags.alphabetical.many": "Index alphabétique des {0} étiquettes", + "tags.alphabetical.none": "Index alphabétique - aucune étiquette", + "tags.alphabetical.one": "Index alphabétique - Une seule étiquette", + "tags.title": "Étiquettes", + "tagword.many": "{0} étiquettes", + "tagword.none": "Sans étiquette", + "tagword.one": "1 étiquette", + "tagword.title": "Étiquettes", + "languages.abk": "Abkhaze", + "languages.aaf": "Afar", + "languages.afr": "Afrikaner", + "languages.aka": "Akan", + "languages.sqi": "Albanais", + "languages.amh": "Amharique", + "languages.ara": "Arabe", + "languages.arg": "Aragonais", + "languages.hye": "Armenien", + "languages.asm": "Assamais", + "languages.ava": "Avar", + "languages.ave": "Avestique", + "languages.aym": "Aymara", + "languages.aze": "Azerbaïjanais", + "languages.bam": "Bambara", + "languages.bak": "Bachkir", + "languages.eus": "Basque", + "languages.bel": "Bielorusse", + "languages.ben": "Bengalais", + "languages.bih": "Bihari", + "languages.bis": "Bichelamar", + "languages.bos": "Bosnien", + "languages.bre": "Breton", + "languages.bul": "Bulgare", + "languages.mya": "Birman", + "languages.cat": "Catalan", + "languages.cha": "Chamorro", + "languages.che": "Tchétchène", + "languages.nya": "Chichewa", + "languages.zho": "Chinois", + "languages.chv": "Tchouvache", + "languages.cor": "Cornique", + "languages.cos": "Corse", + "languages.cre": "Cree", + "languages.hrv": "Croate", + "languages.ces": "Tchèque", + "languages.dan": "Danois", + "languages.div": "Divehi", + "languages.nld": "Néerlandais", + "languages.dzo": "Dzongkha", + "languages.eng": "Anglais", + "languages.epo": "Esperanto", + "languages.est": "Estonien", + "languages.ewe": "Ewe", + "languages.fao": "Féroïen", + "languages.fij": "Fidjien", + "languages.fin": "Finnois", + "languages.fra": "Français", + "languages.ful": "Peul", + "languages.glg": "Galicien", + "languages.kat": "Georgien", + "languages.deu": "Allemand", + "languages.ell": "Grec", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitien", + "languages.hau": "Hausa", + "languages.hed": "Hébreu", + "languages.her": "Héréro", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hongrois", + "languages.ina": "Interlingua", + "languages.ind": "Indonésien", + "languages.ile": "Interlingue", + "languages.gle": "Irlandais", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiak", + "languages.ido": "Ido", + "languages.isl": "Islandais", + "languages.ita": "Italien", + "languages.iku": "Inuktitut", + "languages.jpn": "Japonais", + "languages.jav": "Javanais", + "languages.kal": "Groenlandais", + "languages.kan": "Kannada", + "languages.kau": "Kanouri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazak", + "languages.khm": "Khmer", + "languages.kik": "Kikouyou", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgize", + "languages.kom": "Komi", + "languages.kon": "Kikongo", + "languages.kor": "Coréen", + "languages.kur": "Kurde", + "languages.kua": "Kuanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgeois", + "languages.lug": "Ganda", + "languages.lim": "Limburgeois", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanien", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvien", + "languages.glv": "Mannois", + "languages.mkd": "Macédonien", + "languages.mlg": "Malagais", + "languages.msa": "Malais", + "languages.mal": "Malayalam", + "languages.mlt": "Maltais", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallais", + "languages.mon": "Mongol", + "languages.nau": "Nauruan", + "languages.nav": "Navajo", + "languages.nob": "Norvégien Bokmål", + "languages.nde": "Ndébélé", + "languages.nep": "Népalais", + "languages.ndo": "Ndonga", + "languages.nno": "Norvégien Nynorsk", + "languages.nor": "Norvégien", + "languages.iii": "Nuosu", + "languages.nbl": "Sindebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Vieux-slave", + "languages.orm": "Oromo", + "languages.ori": "Odia", + "languages.oss": "Ossete", + "languages.pan": "Penjabais", + "languages.pli": "Pāli", + "languages.fas": "Perse", + "languages.pol": "Polonais", + "languages.pus": "Pachtoune", + "languages.por": "Portugais", + "languages.que": "Quechua", + "languages.roh": "Romanche", + "languages.run": "Kirundi", + "languages.ron": "Roumain", + "languages.rus": "Russe", + "languages.san": "Sanscrit", + "languages.srd": "Sarde", + "languages.snd": "Sindhi", + "languages.sme": "Sami du Nord", + "languages.smo": "Samoais", + "languages.sag": "Sango", + "languages.srp": "Serbe", + "languages.gla": "Gaélique Écossais", + "languages.sna": "Shona", + "languages.sin": "Cingalais", + "languages.slk": "Slovaque", + "languages.slv": "Slovene", + "languages.som": "Somalien", + "languages.sot": "Sotho du Sud", + "languages.spa": "Espagnol", + "languages.sun": "Soudanais", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Suédois", + "languages.tam": "Tamile", + "languages.tel": "Telougou", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinia", + "languages.bod": "Tibétain Standard", + "languages.tuk": "Turkmène", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tongien", + "languages.tur": "Turc", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitien", + "languages.uig": "Ouïghour", + "languages.ukr": "Ukrainien", + "languages.urd": "Ourdou", + "languages.uzb": "Ouzbeque", + "languages.ven": "Venda", + "languages.vie": "Vietnamien", + "languages.vol": "Volapük", + "languages.win": "Wallon", + "languages.cym": "Gallois", + "languages.wol": "Wolof", + "languages.fry": "Frison occidental", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zoulou", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_ht.json b/sources/lang/Localization_ht.json new file mode 100644 index 0000000..70d8de6 --- /dev/null +++ b/sources/lang/Localization_ht.json @@ -0,0 +1,293 @@ +{ + "about.title": "A pwopo COPS", + "allbooks.alphabetical.many": "lòd endèks nan {0} liv", + "allbooks.alphabetical.none": "lòd endèks nan yon liv", + "allbooks.alphabetical.one": "lòd endèks nan yon sèl liv", + "allbooks.title": "Tout liv", + "authors.alphabetical.many": "lòd endèks nan otè {0}", + "authors.alphabetical.none": "lòd endèks ki pa gen otè", + "authors.alphabetical.one": "lòd endèks nan yon sèl otè", + "authors.title": "Otè", + "authorword.many": "{0} Otè", + "authorword.none": "Pa gen otè", + "authorword.one": "1 otè", + "bookentry.author": "{0} de {1}", + "bookword.many": "{0} liv", + "bookword.none": "Pa gen liv", + "bookword.one": "1 liv", + "bookword.title": "Liv", + "cog.alternate": "Chèche, sòt ak filtre", + "content.series": "Koleksyon:", + "content.series.data": "Liv {0} ki nan koleksyon an {1}", + "content.summary": "Rezime:", + "customcolumn.boolean.no": "No", + "customcolumn.boolean.unknown": "Not Set", + "customcolumn.boolean.yes": "Yes", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Not Set", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Lòd endèks nan {0} koleksyon s", + "customcolumn.description.series.none": "Lòd endèks nan absoliman okenn seri", + "customcolumn.description.series.one": "Lòd endèks nan koleksyon an sèlman", + "customcolumn.enum.unknown": "Not Set", + "customcolumn.float.unknown": "Not Set", + "customcolumn.int.unknown": "Not Set", + "customcolumn.rating.unknown": "Not Set", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "adrès Imèl (pou otomatik voye nan liv )", + "customize.fancybox": "Sèvi ak yon bwat limyè", + "customize.filter": "Filtraj atravè Tags", + "customize.ignored": "inyore Kategori", + "customize.paging": "Nimewo nan liv pou chak paj (-1 vin enfim )", + "customize.style": "Tèm", + "customize.title": "Mete flik COPS", + "home.alternate": "Kay", + "i18n.coversection": "Kouvri", + "language.title": "Lang", + "languages.alphabetical.many": "Lòd endèks nan {0} lang", + "languages.alphabetical.none": "Lòd endèks nan absoliman okenn lang", + "languages.alphabetical.one": "Lòd endèks pale yon sèl lang", + "languages.title": "Lang", + "mail.messagenotsent": "Mesaj la pa t 'kapab ap voye.", + "mail.messagesent": "te mesaj la te voye", + "paging.next.alternate": "Suivant", + "paging.previous.alternate": "Pwochen", + "permalink.alternate": "Permalien", + "pubdate.title": "ane Piblikasyon", + "publisher.name": "Editè", + "publishers.alphabetical.many": "Lòd endèks nan {0} editè", + "publishers.alphabetical.none": "Lòd endèks nan absoliman okenn piblikatè", + "publishers.alphabetical.one": "Lòd Index Editè", + "publishers.title": "Piblikatè", + "publisherword.many": "{0} editè", + "publisherword.none": "Pa gen editè", + "publisherword.one": "1 editè", + "ratings.many": "{0} Li renmen", + "ratings.none": "Pa gen evalyasyon", + "ratings.one": "1 Revizyon", + "ratings.title": "Li renmen", + "ratingword.many": "{0} zetwal", + "ratingword.none": "Pa gen Etwal", + "ratingword.one": "1 etwal", + "recent.list": "{0} liv ki pi resan", + "recent.title": "Dènyèman te ajoute", + "search.alternate": "Chèche", + "search.result": "Rezilta pou *{0}*", + "search.result.author": "Rezilta pou * {0} * nan otè yo", + "search.result.book": "Rezilta pou * {0} * nan liv yo", + "search.result.publisher": "Rezilta pou * {0} * nan editè yo", + "search.result.series": "Rezilta pou * {0} * nan koleksyon", + "search.result.tag": "Rezilta pou * {0} * nan etikèt", + "search.sortorder.asc": "Mete konfyans nou.", + "search.sortorder.desc": "Ap desann.", + "series.alphabetical.many": "Lòd endèks nan {0} koleksyon s", + "series.alphabetical.none": "Lòd endèks nan absoliman okenn seri", + "series.alphabetical.one": "Lòd endèks nan koleksyon an sèlman", + "series.title": "Koleksyon", + "seriesword.many": "{0} koleksyon", + "seriesword.none": "Pa gen koleksyon", + "seriesword.one": "1 koleksyon", + "sort.alternate": "Triye", + "splitByLetter.book.other": "lòt liv", + "splitByLetter.letter": "{0} kòmanse avèk {1}", + "tags.alphabetical.many": "Lòd endèks nan etikèt {0}", + "tags.alphabetical.none": "Lòd endèks nan absoliman okenn tags", + "tags.alphabetical.one": "Lòd endèks nan etikèt la sèl", + "tags.title": "Etikèt", + "tagword.many": "{0} etikèt", + "tagword.none": "Tagless", + "tagword.one": "1 tag", + "tagword.title": "Etikèt", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanian", + "languages.amh": "Amharic", + "languages.ara": "Arabic", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Basque", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgarian", + "languages.mya": "Burmese", + "languages.cat": "Catalan", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chinese", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croatian", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "Anglais", + "languages.epo": "Esperanto", + "languages.est": "Estonian", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "Français", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "German", + "languages.ell": "Greek", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitian", + "languages.hau": "Hausa", + "languages.hed": "Hebrew", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarian", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italian", + "languages.iku": "Inuktitut", + "languages.jpn": "Japanese", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Korean", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolian", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norwegian", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persian", + "languages.pol": "Polish", + "languages.pus": "Pashto", + "languages.por": "Portuguese", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Romanian", + "languages.rus": "Russian", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbian", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spanish", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrainian", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamese", + "languages.vol": "Volapük", + "languages.win": "Walloon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_hu.json b/sources/lang/Localization_hu.json new file mode 100644 index 0000000..83c621b --- /dev/null +++ b/sources/lang/Localization_hu.json @@ -0,0 +1,293 @@ +{ + "about.title": "COPS-ról", + "allbooks.alphabetical.many": "ABC sorrendben {0}. könyv", + "allbooks.alphabetical.none": "ABC sorrendben, ha teljessen nincs könyv", + "allbooks.alphabetical.one": "ABC sorrendben egyetlen könyv", + "allbooks.title": "Minden könyv", + "authors.alphabetical.many": "ABC sorrendben {0} szerző", + "authors.alphabetical.none": "ABC sorrendben, ha teljesen nincs szerző", + "authors.alphabetical.one": "ABC sorrendben egyetlen szerző", + "authors.title": "Szerzők", + "authorword.many": "{0} szerző", + "authorword.none": "Nincs szerző", + "authorword.one": "1 szerző", + "bookentry.author": "{0} az {1}ből", + "bookword.many": "{0} könyv", + "bookword.none": "Nincs könyv", + "bookword.one": "1 könyv", + "bookword.title": "Könyvek", + "cog.alternate": "Keresés, rendezés és szürés", + "content.series": "Sorozatok:", + "content.series.data": "{0} .dik könyv a {1} sorozatból", + "content.summary": "Összegzés", + "customcolumn.boolean.no": "Nem", + "customcolumn.boolean.unknown": "Alapértelmezett", + "customcolumn.boolean.yes": "Igen", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Alapértelmezett", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "ABC sorrendben {0} sorozat", + "customcolumn.description.series.none": "ABC sorrendben, ha teljessen nincs sorozat", + "customcolumn.description.series.one": "ABC sorrendben egyetlen sorozat", + "customcolumn.enum.unknown": "Alapértelmezett", + "customcolumn.float.unknown": "Alapértelmezett", + "customcolumn.int.unknown": "Alapértelmezett", + "customcolumn.rating.unknown": "Alapértelmezett", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Állitsd be az email cimed (engedélyezi a könyvek küldését emailban)", + "customize.fancybox": "Lightbox használata", + "customize.filter": "Engedélyzi a tag alapján a szürést", + "customize.ignored": "Figyelmen kivül hagyott kategoriák", + "customize.paging": "Maximum könyv oldalanként (-1 kikapcsolja)", + "customize.style": "Téma", + "customize.title": "Egyedi COPS UI", + "home.alternate": "Főoldal", + "i18n.coversection": "Boritó", + "language.title": "Nyelv", + "languages.alphabetical.many": "ABC sorrendben {0} nyelv", + "languages.alphabetical.none": "ABC sorrendben, ha teljessen nincs nyelv", + "languages.alphabetical.one": "ABC sorrendben egyetlen nyelv", + "languages.title": "Nyelvek", + "mail.messagenotsent": "Az üzenet nincs elküldve.", + "mail.messagesent": "Az üzenet elküldve", + "paging.next.alternate": "Következő", + "paging.previous.alternate": "Elöző", + "permalink.alternate": "Permalink", + "pubdate.title": "Kiadás éve", + "publisher.name": "Kiadó", + "publishers.alphabetical.many": "ABC sorrendben {0} kiadó", + "publishers.alphabetical.none": "ABC sorrendben, ha teljessen nincs kiadó", + "publishers.alphabetical.one": "ABC sorrendben egyetlen kiadó", + "publishers.title": "Kiadók", + "publisherword.many": "{0} kiadó", + "publisherword.none": "Nincs kiadó", + "publisherword.one": "1 kiadó", + "ratings.many": "{0} értékelés", + "ratings.none": "Nincs értékelés", + "ratings.one": "1 értékelés", + "ratings.title": "Értékelések", + "ratingword.many": "{0} csillag", + "ratingword.none": "Nincs csillag", + "ratingword.one": "1 csillag", + "recent.list": "{0} legutóbbi könyv", + "recent.title": "Legutobbi hozzáadás", + "search.alternate": "Keresés", + "search.result": "Keresés eredménye a *{0}*", + "search.result.author": "Keresés eredménye a *{0}* szerzők közt", + "search.result.book": "Keresés eredménye a *{0}* könyvek közt", + "search.result.publisher": "Keresés eredménye a *{0}* kiadók közt", + "search.result.series": "Keresés eredménye a *{0}* sorozatok közt", + "search.result.tag": "Keresés eredménye a *{0}* tagok közt", + "search.sortorder.asc": "Emelkedő", + "search.sortorder.desc": "Csökkenő", + "series.alphabetical.many": "ABC sorrendben {0} sorozat", + "series.alphabetical.none": "ABC sorrendben, ha teljessen nincs sorozat", + "series.alphabetical.one": "ABC sorrendben egyetlen sorozat", + "series.title": "Sorozatok", + "seriesword.many": "{0} sorozat", + "seriesword.none": "Nincs sorozat", + "seriesword.one": "1 sorozat", + "sort.alternate": "Rendezés", + "splitByLetter.book.other": "Egyébb könyvek", + "splitByLetter.letter": "{0} kezdőbetűje {1}", + "tags.alphabetical.many": "ABC sorrendben {0} tags", + "tags.alphabetical.none": "ABC sorrendben, ha teljessen nincs tag", + "tags.alphabetical.one": "ABC sorrendben egyetlen tag", + "tags.title": "Tagok", + "tagword.many": "{0} tags", + "tagword.none": "Nincs tag", + "tagword.one": "1 tag", + "tagword.title": "Tagok", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albán", + "languages.amh": "Amharic", + "languages.ara": "Arab", + "languages.arg": "Aragonese", + "languages.hye": "Örmény", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbajdzsán", + "languages.bam": "Bambara", + "languages.bak": "Baskír", + "languages.eus": "Baszk", + "languages.bel": "Fehérorosz", + "languages.ben": "Bengáli", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnyák", + "languages.bre": "Breton", + "languages.bul": "Bolgár", + "languages.mya": "Burmese", + "languages.cat": "Katalán", + "languages.cha": "Chamorro", + "languages.che": "Csecsen", + "languages.nya": "Chichewa", + "languages.zho": "Kínai", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Horvát", + "languages.ces": "Cseh", + "languages.dan": "Dán", + "languages.div": "Divehi", + "languages.nld": "Holland", + "languages.dzo": "Dzongkha", + "languages.eng": "Angol", + "languages.epo": "Eszperantó", + "languages.est": "Észt", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finn", + "languages.fra": "Francia", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "Német", + "languages.ell": "Görög", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haiti", + "languages.hau": "Hausa", + "languages.hed": "Héber", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Magyar", + "languages.ina": "Interlingua", + "languages.ind": "Indonéz", + "languages.ile": "Interlingue", + "languages.gle": "Ír", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Izlandi", + "languages.ita": "Italian", + "languages.iku": "Inuktitut", + "languages.jpn": "Japán", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazah", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Koreai", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Makedón", + "languages.mlg": "Malagasy", + "languages.msa": "Maláj", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Maori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongol", + "languages.nau": "Nauru", + "languages.nav": "Navahó", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepáli", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norvég", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Pandzsabi", + "languages.pli": "Pāli", + "languages.fas": "Perzsa", + "languages.pol": "Lengyel", + "languages.pus": "Pastu", + "languages.por": "Portugál", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Román", + "languages.rus": "Orosz", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Szerb", + "languages.gla": "Skót", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Szlovák", + "languages.slv": "Szlovén", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spanyol", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Svéd", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Török", + "languages.tso": "Tsonga", + "languages.tat": "Tatár", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrán", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnámi", + "languages.vol": "Volapük", + "languages.win": "Vallon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_it.json b/sources/lang/Localization_it.json new file mode 100644 index 0000000..5b34876 --- /dev/null +++ b/sources/lang/Localization_it.json @@ -0,0 +1,293 @@ +{ + "about.title": "A proposito di COPS", + "allbooks.alphabetical.many": "Indice alfabetico di {0} libri", + "allbooks.alphabetical.none": "Indice alfabetico indipendente dal libro", + "allbooks.alphabetical.one": "Indice alfabetico di un solo libro", + "allbooks.title": "Tutti i libri", + "authors.alphabetical.many": "Indice alfabetico di {0} autori", + "authors.alphabetical.none": "Indice alfabetico indipendente dall'autore", + "authors.alphabetical.one": "Indice alfabetico di un solo autore", + "authors.title": "Autori", + "authorword.many": "{0} autori", + "authorword.none": "Senza autore", + "authorword.one": "1 autore", + "bookentry.author": "{0} di {1}", + "bookword.many": "{0} libri", + "bookword.none": "Nessun libro", + "bookword.one": "1 libro", + "bookword.title": "Libri", + "cog.alternate": "Ricerca, ordinamento e filtri", + "content.series": "Collana:", + "content.series.data": "Libro {0} nella collana {1}", + "content.summary": "Riassunto", + "customcolumn.boolean.no": "TLS", + "customcolumn.boolean.unknown": "Non Impostato", + "customcolumn.boolean.yes": "Si", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Non Impostato", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Indice alfabetico di {0} collane", + "customcolumn.description.series.none": "Indice alfabetico indipendente dalla collana", + "customcolumn.description.series.one": "Indice alfabetico di una sola collana", + "customcolumn.enum.unknown": "Non Impostato", + "customcolumn.float.unknown": "Non Impostato", + "customcolumn.int.unknown": "Non Impostato", + "customcolumn.rating.unknown": "Non Impostato", + "customcolumn.stars.many": "{0} Stelle", + "customcolumn.stars.none": "Senza stelle", + "customcolumn.stars.one": "1 stella", + "customize.email": "Imposta la tua email (per permettere l'invio di email)", + "customize.fancybox": "Usa una Lightbox", + "customize.filter": "Abilita il filtro per argomento", + "customize.ignored": "Categorie ignorate", + "customize.paging": "Numero massimo di libri per pagina (-1 per disabilitare)", + "customize.style": "Tema", + "customize.title": "Personalizza l'interfaccia di COPS", + "home.alternate": "Home", + "i18n.coversection": "Copertina", + "language.title": "Lingua", + "languages.alphabetical.many": "Indice alfabetico delle {0} lingue", + "languages.alphabetical.none": "Indice alfabetico indipendente dalla lingua", + "languages.alphabetical.one": "Indice alfabetico della singola lingua", + "languages.title": "Lingue", + "mail.messagenotsent": "L'e-mail non può essere spedita.", + "mail.messagesent": "L'e-mail è stata spedita", + "paging.next.alternate": "Prossimo", + "paging.previous.alternate": "Precedente", + "permalink.alternate": "Permalink", + "pubdate.title": "Anno di publicazione", + "publisher.name": "Editore", + "publishers.alphabetical.many": "Indice alfabetico degli {0} editori", + "publishers.alphabetical.none": "Indice alfabetico indipendente dall'editore", + "publishers.alphabetical.one": "Indice alfabetico del singolo editore", + "publishers.title": "Editori", + "publisherword.many": "{0} editori", + "publisherword.none": "Nessun editore", + "publisherword.one": "1 editore", + "ratings.many": "{0} valutazioni", + "ratings.none": "nessuna valutazione", + "ratings.one": "1 valutazione", + "ratings.title": "Valutazioni", + "ratingword.many": "{0} stelle", + "ratingword.none": "Nessuna stella", + "ratingword.one": "1 stella", + "recent.list": "I {0} libri più recenti", + "recent.title": "Ultime aggiunte", + "search.alternate": "Cerca", + "search.result": "Risultati per *{0}*", + "search.result.author": "Risultato della ricerca di *{0}* negli autori", + "search.result.book": "Risultato della ricerca di *{0}* nei libri", + "search.result.publisher": "Risultato della ricerca di *{0}* negli editori", + "search.result.series": "Risultato della ricerca di *{0}* nelle collane", + "search.result.tag": "Risultato della ricerca di *{0}* negli argomenti", + "search.sortorder.asc": "Asc", + "search.sortorder.desc": "Disc", + "series.alphabetical.many": "Indice alfabetico di {0} collane", + "series.alphabetical.none": "Indice alfabetico indipendente dalla collana", + "series.alphabetical.one": "Indice alfabetico di una sola collana", + "series.title": "Collane", + "seriesword.many": "{0} collane", + "seriesword.none": "Nessuna collana", + "seriesword.one": "1 collana", + "sort.alternate": "Tipo", + "splitByLetter.book.other": "Altri libri", + "splitByLetter.letter": "{0} che iniziano per {1}", + "tags.alphabetical.many": "Indice alfabetico di {0} argomenti", + "tags.alphabetical.none": "Indice alfabetico indipendente dall'argomento", + "tags.alphabetical.one": "Indice alfabetico del solo argomento", + "tags.title": "Argomenti", + "tagword.many": "{0} argomenti", + "tagword.none": "Senza argomento", + "tagword.one": "1 argomento", + "tagword.title": "Argomenti", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanese", + "languages.amh": "Amharic", + "languages.ara": "Arabo", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Basque", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgarian", + "languages.mya": "Burmese", + "languages.cat": "Catalan", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chinese", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croatian", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "English", + "languages.epo": "Esperanto", + "languages.est": "Estonian", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "French", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "German", + "languages.ell": "Greek", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitian", + "languages.hau": "Hausa", + "languages.hed": "Hebrew", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarian", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italiano", + "languages.iku": "Inuktitut", + "languages.jpn": "Japanese", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Korean", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolian", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norwegian", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persian", + "languages.pol": "Polish", + "languages.pus": "Pashto", + "languages.por": "Portoghese", + "languages.que": "Quechua", + "languages.roh": "Romancio", + "languages.run": "Kirundi", + "languages.ron": "Romanian", + "languages.rus": "Russian", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbian", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spagnolo", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrainian", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamita", + "languages.vol": "Volapük", + "languages.win": "vallone", + "languages.cym": "Gallese", + "languages.wol": "Senegalese", + "languages.fry": "Frisone del est", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "cinese semplificato", + "languages.zul": "Zuù", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_ko.json b/sources/lang/Localization_ko.json new file mode 100644 index 0000000..32e8a7f --- /dev/null +++ b/sources/lang/Localization_ko.json @@ -0,0 +1,293 @@ +{ + "about.title": "COPS에 대해", + "allbooks.alphabetical.many": "{0}권의 도서별 색인", + "allbooks.alphabetical.none": "0권의 도서별 색인", + "allbooks.alphabetical.one": "1권의 도서별 색인", + "allbooks.title": "전체 도서", + "authors.alphabetical.many": "{0}명의 저자별 색인", + "authors.alphabetical.none": "0명의 저자별 색인", + "authors.alphabetical.one": "1명의 저자별 색인", + "authors.title": "저자", + "authorword.many": "{0}명의 저자", + "authorword.none": "0명의 저자", + "authorword.one": "1명의 저자", + "bookentry.author": "{0} by {1}", + "bookword.many": "{0}권", + "bookword.none": "(없음)", + "bookword.one": "1권", + "bookword.title": "도서", + "cog.alternate": "검색, 정렬 및 필터링", + "content.series": "Series:", + "content.series.data": "Book {0} in the {1} series", + "content.summary": "요약", + "customcolumn.boolean.no": "2월", + "customcolumn.boolean.unknown": "Not Set", + "customcolumn.boolean.yes": "1월", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Not Set", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "{0}개의 시리즈별 색인", + "customcolumn.description.series.none": "0개의 시리즈별 색인", + "customcolumn.description.series.one": "1개의 시리즈별 색인", + "customcolumn.enum.unknown": "Not Set", + "customcolumn.float.unknown": "Not Set", + "customcolumn.int.unknown": "Not Set", + "customcolumn.rating.unknown": "Not Set", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "이메일주소 (도서 메일발송용)", + "customize.fancybox": "Lightbox 사용 (도서정보를 프레임으로 표시)", + "customize.filter": "태그 필터링기능 사용", + "customize.ignored": "무시할 카테고리", + "customize.paging": "페이지마다 표시할 도서 권수 (-1인 경우 무시)", + "customize.style": "스타일", + "customize.title": "COPS 설정", + "home.alternate": "최초", + "i18n.coversection": "Cover", + "language.title": "언어", + "languages.alphabetical.many": "4개의 언어별 색인", + "languages.alphabetical.none": "0개의 언어별 색인", + "languages.alphabetical.one": "1개의 언어별 색인", + "languages.title": "언어", + "mail.messagenotsent": "Message could not be sent.", + "mail.messagesent": "Message has been sent", + "paging.next.alternate": "다음", + "paging.previous.alternate": "이전", + "permalink.alternate": "Permalink", + "pubdate.title": "출판년도", + "publisher.name": "출판사", + "publishers.alphabetical.many": "{0}개 출판사별 색인", + "publishers.alphabetical.none": "0개 출판사별 색인", + "publishers.alphabetical.one": "1개 출판사별 색인", + "publishers.title": "출판사", + "publisherword.many": "{0}개 출판사", + "publisherword.none": "출판사 없음", + "publisherword.one": "1개 출판사", + "ratings.many": "{0}개 별점", + "ratings.none": "별점 없음", + "ratings.one": "1개 별점", + "ratings.title": "별점", + "ratingword.many": "별 {0}개", + "ratingword.none": "별 없음", + "ratingword.one": "별 1개", + "recent.list": "최근 추가된 {0}권의 책", + "recent.title": "최근 추가됨", + "search.alternate": "검색", + "search.result": "*{0}*의 검색결과", + "search.result.author": "저자명에서 *{0}* 검색", + "search.result.book": "도서정보에서 *{0}* 검색", + "search.result.publisher": "출판사명에서 *{0}* 검색", + "search.result.series": "시리즈명에서 *{0}* 검색", + "search.result.tag": "태그에서 *{0}* 검색", + "search.sortorder.asc": "오름차순", + "search.sortorder.desc": "내림차순", + "series.alphabetical.many": "{0}개의 시리즈별 색인", + "series.alphabetical.none": "0개의 시리즈별 색인", + "series.alphabetical.one": "1개의 시리즈별 색인", + "series.title": "시리즈", + "seriesword.many": "{0}개 시리즈", + "seriesword.none": "시리즈 없음", + "seriesword.one": "1개 시리즈", + "sort.alternate": "Sort", + "splitByLetter.book.other": "Other books", + "splitByLetter.letter": "{0} starting with {1}", + "tags.alphabetical.many": "{0}개의 태그별 색인", + "tags.alphabetical.none": "0개의 태그별 색인", + "tags.alphabetical.one": "1개의 태그별 색인", + "tags.title": "태그", + "tagword.many": "{0} tags", + "tagword.none": "No tags", + "tagword.one": "1 tag", + "tagword.title": "태그", + "languages.abk": "압하스어", + "languages.aaf": "아파르어", + "languages.afr": "아프리칸스어", + "languages.aka": "아칸어", + "languages.sqi": "알바니아어", + "languages.amh": "암하라어", + "languages.ara": "아랍어", + "languages.arg": "아라곤어", + "languages.hye": "아르메니아어", + "languages.asm": "아삼어", + "languages.ava": "아바르어", + "languages.ave": "아베스타어", + "languages.aym": "아이마라어", + "languages.aze": "아제르바이잔어", + "languages.bam": "밤바라어", + "languages.bak": "바슈키르어", + "languages.eus": "바스크어", + "languages.bel": "벨로루시어", + "languages.ben": "벵골어", + "languages.bih": "비하르어", + "languages.bis": "비슐라마어", + "languages.bos": "보스니아어", + "languages.bre": "브르타뉴어", + "languages.bul": "불가리아어", + "languages.mya": "버마어", + "languages.cat": "카탈루냐어", + "languages.cha": "차모로어", + "languages.che": "체첸어", + "languages.nya": "니안자어", + "languages.zho": "중국어", + "languages.chv": "추바슈어", + "languages.cor": "콘월어", + "languages.cos": "코르시카어", + "languages.cre": "크리어", + "languages.hrv": "크로아티아어", + "languages.ces": "체크어", + "languages.dan": "덴마크어", + "languages.div": "디베히어", + "languages.nld": "네덜란드어", + "languages.dzo": "종카어", + "languages.eng": "영어", + "languages.epo": "에스페란토", + "languages.est": "에스토이나어", + "languages.ewe": "에웨어", + "languages.fao": "페로어", + "languages.fij": "피지어", + "languages.fin": "핀란드어", + "languages.fra": "프랑스어", + "languages.ful": "풀라어", + "languages.glg": "갈리시아어", + "languages.kat": "조지아어", + "languages.deu": "독일어", + "languages.ell": "그리스어", + "languages.grn": "과라니어", + "languages.guj": "구자라트어", + "languages.hat": "아이티어", + "languages.hau": "하우사어", + "languages.hed": "히브리어", + "languages.her": "헤레로어", + "languages.hin": "힌디어", + "languages.hmo": "히리 모투어", + "languages.hun": "헝가리어", + "languages.ina": "인테르링구아", + "languages.ind": "인도네시아어", + "languages.ile": "인테르링구에", + "languages.gle": "아일랜드어", + "languages.ibo": "이그보어", + "languages.ipk": "이누피아크어", + "languages.ido": "이도", + "languages.isl": "아이슬란드어", + "languages.ita": "이탈리아어", + "languages.iku": "이누크티투트어", + "languages.jpn": "일본어", + "languages.jav": "자바어", + "languages.kal": "그린란드어", + "languages.kan": "칸나다어", + "languages.kau": "카누리어", + "languages.kas": "카슈미르어", + "languages.kaz": "카자흐어", + "languages.khm": "크메르어", + "languages.kik": "키쿠유어", + "languages.kin": "르완다어", + "languages.kir": "키르기스어", + "languages.kom": "코미어", + "languages.kon": "콩고어", + "languages.kor": "한국어", + "languages.kur": "쿠르드어", + "languages.kua": "콰냐마어", + "languages.lat": "라틴어", + "languages.ltz": "룩셈부르크어", + "languages.lug": "간다어", + "languages.lim": "림뷔르흐어", + "languages.lin": "링갈라어", + "languages.lao": "라오어", + "languages.lit": "리투아니아어", + "languages.lub": "루바-카탕가어", + "languages.lav": "라트비아어", + "languages.glv": "맨어", + "languages.mkd": "마케도니아어", + "languages.mlg": "마다가스카르어", + "languages.msa": "말레이어", + "languages.mal": "말라얄람어", + "languages.mlt": "몰타어", + "languages.mri": "마오리어", + "languages.mar": "마라티어", + "languages.mah": "마셜어", + "languages.mon": "몽골어", + "languages.nau": "나우루어", + "languages.nav": "나바호어", + "languages.nob": "덴마크-노르웨이어", + "languages.nde": "은데벨레어(북)", + "languages.nep": "네팔어", + "languages.ndo": "은동가어", + "languages.nno": "신노르웨이어", + "languages.nor": "노르웨이어", + "languages.iii": "쓰촨 이어", + "languages.nbl": "은데벨레어(남)", + "languages.oci": "오크어", + "languages.oji": "오지브와어", + "languages.chu": "슬라브어", + "languages.orm": "오로모어", + "languages.ori": "오리야어", + "languages.oss": "오세트어", + "languages.pan": "펀자브어", + "languages.pli": "팔리어", + "languages.fas": "페르시아어", + "languages.pol": "폴란드어", + "languages.pus": "파슈토어", + "languages.por": "포르투갈어", + "languages.que": "케추아어", + "languages.roh": "로만슈어", + "languages.run": "룬디어", + "languages.ron": "루마니아어", + "languages.rus": "러시아어", + "languages.san": "산스크리트어", + "languages.srd": "사르데냐어", + "languages.snd": "신드어", + "languages.sme": "사미어(북)", + "languages.smo": "사모아어", + "languages.sag": "상고어", + "languages.srp": "세르비아어", + "languages.gla": "게일어", + "languages.sna": "쇼나어", + "languages.sin": "싱할라어", + "languages.slk": "슬로바키아어", + "languages.slv": "슬로베니아어", + "languages.som": "소말리어", + "languages.sot": "소토어(남)", + "languages.spa": "스페인어", + "languages.sun": "순다어", + "languages.swa": "스와힐리어", + "languages.ssw": "스와티어", + "languages.swe": "스웨덴어", + "languages.tam": "타밀어", + "languages.tel": "텔루구어", + "languages.tgk": "타지크어", + "languages.tha": "태국어", + "languages.tir": "티그리냐어", + "languages.bod": "티베트어", + "languages.tuk": "투르크멘어", + "languages.tgl": "타갈로그어", + "languages.tsn": "츠와나어", + "languages.ton": "통가어", + "languages.tur": "터키어", + "languages.tso": "총가어", + "languages.tat": "타타르어", + "languages.twi": "트위어", + "languages.tah": "타히티어", + "languages.uig": "위구르어", + "languages.ukr": "우크라이나어", + "languages.urd": "우르두어", + "languages.uzb": "우즈베크어", + "languages.ven": "벤다어", + "languages.vie": "베트남어", + "languages.vol": "볼라퓌크", + "languages.win": "왈론어", + "languages.cym": "웨일스어", + "languages.wol": "월로프어", + "languages.fry": "프리지아어", + "languages.xho": "코사어", + "languages.yid": "이디시어", + "languages.yor": "요루바어", + "languages.zha": "좡어", + "languages.zul": "줄루어", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_nb.json b/sources/lang/Localization_nb.json new file mode 100644 index 0000000..c0f84ed --- /dev/null +++ b/sources/lang/Localization_nb.json @@ -0,0 +1,293 @@ +{ + "about.title": "Om COPS", + "allbooks.alphabetical.many": "Alfabetisk indeks for {0} bøker", + "allbooks.alphabetical.none": "Alfabetisk indeks for absolutt ingen bøker", + "allbooks.alphabetical.one": "Alfabetisk indeks for èn enkelt bok", + "allbooks.title": "Alle bøker", + "authors.alphabetical.many": "Alfabetisk indeks for {0} forfattere", + "authors.alphabetical.none": "Alfabetisk indeks for ingen forfattere", + "authors.alphabetical.one": "Alfabetisk indeks for èn forfatter", + "authors.title": "Forfattere", + "authorword.many": "{0} forfattere", + "authorword.none": "Ingen forfattere", + "authorword.one": "1 forfatter", + "bookentry.author": "{0} av {1}", + "bookword.many": "{0} bøker", + "bookword.none": "Ingen bøker", + "bookword.one": "1 bok", + "bookword.title": "Bøker", + "cog.alternate": "Søk, sortering og filtrering", + "content.series": "Serier:", + "content.series.data": "Bok {0} i serien {1}", + "content.summary": "Sammendrag", + "customcolumn.boolean.no": "Nei", + "customcolumn.boolean.unknown": "Ikke satt", + "customcolumn.boolean.yes": "Ja", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Ikke satt", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Alfabetisk indeks for {0} serier", + "customcolumn.description.series.none": "Alfabetisk indeks for ingen serier", + "customcolumn.description.series.one": "Alfabetisk indeks for èn enkelt serie", + "customcolumn.enum.unknown": "Ikke satt", + "customcolumn.float.unknown": "Ikke satt", + "customcolumn.int.unknown": "Ikke satt", + "customcolumn.rating.unknown": "Ikke satt", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Sett e-postadresse (for å sende bøker i e-post)", + "customize.fancybox": "Bruk en Lightbox", + "customize.filter": "Tillat filtrering på nøkkelord", + "customize.ignored": "Ignorerte kategorier", + "customize.paging": "Maks antall bøker per side (-1 for å deaktivere)", + "customize.style": "Tema", + "customize.title": "Tilpass COPS brukergrensesnitt", + "home.alternate": "Hjem", + "i18n.coversection": "Omslag", + "language.title": "Språk", + "languages.alphabetical.many": "Alfabetisk indek for de {0} språkene", + "languages.alphabetical.none": "Alfabetisk indeks for absolutt ingen språk", + "languages.alphabetical.one": "Alfabetisk indeks for ett enkelt språk", + "languages.title": "Språk", + "mail.messagenotsent": "Meldingen kunne ikke sendes.", + "mail.messagesent": "Meldingen er sendt", + "paging.next.alternate": "Neste", + "paging.previous.alternate": "Forrige", + "permalink.alternate": "Permalenke", + "pubdate.title": "Publikasjonsår", + "publisher.name": "Utgiver", + "publishers.alphabetical.many": "Alfabetisk indeks for {0} utgivere", + "publishers.alphabetical.none": "Alfabetisk indeks for absolutt ingen utgivere", + "publishers.alphabetical.one": "Alfabetisk indeks for en enkelt utgiver", + "publishers.title": "Utgivere", + "publisherword.many": "{0} utgivere", + "publisherword.none": "Ingen utgivere", + "publisherword.one": "1 utgiver", + "ratings.many": "{0} vurderinger", + "ratings.none": "ingen vurderinger", + "ratings.one": "1 vurdering", + "ratings.title": "Vurderinger", + "ratingword.many": "{0} stjerner", + "ratingword.none": "Ingen stjerner", + "ratingword.one": "1 stjerne", + "recent.list": "{0} nyeste bøker", + "recent.title": "Nylig lagt til", + "search.alternate": "Søk", + "search.result": "Søkeresultat for *{0}*", + "search.result.author": "Søkeresultat for *{0}* i forfattere", + "search.result.book": "Søkeresultat for *{0}* i bøker", + "search.result.publisher": "Søkeresultat for *{0}* i utgivere", + "search.result.series": "Søkeresultat for *{0}* i serier", + "search.result.tag": "Søkeresultat for *{0}* i nøkkelord", + "search.sortorder.asc": "Stigende", + "search.sortorder.desc": "Synkende", + "series.alphabetical.many": "Alfabetisk indeks for {0} serier", + "series.alphabetical.none": "Alfabetisk indeks for ingen serier", + "series.alphabetical.one": "Alfabetisk indeks for èn enkelt serie", + "series.title": "Serier", + "seriesword.many": "{0} serier", + "seriesword.none": "Ingen serier", + "seriesword.one": "1 serie", + "sort.alternate": "Sorter", + "splitByLetter.book.other": "Andre bøker", + "splitByLetter.letter": "{0} begynner med {1}", + "tags.alphabetical.many": "Alfabetisk indeks for {0} stikkord", + "tags.alphabetical.none": "Alfabetisk indeks for ingen stikkord", + "tags.alphabetical.one": "Alfabetisk indeks for ett enkelt stikkord", + "tags.title": "Stikkord", + "tagword.many": "{0} stikkord", + "tagword.none": "Ingen stikkord", + "tagword.one": "1 stikkord", + "tagword.title": "Stikkord", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanian", + "languages.amh": "Amharic", + "languages.ara": "Arabic", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Basque", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgarian", + "languages.mya": "Burmese", + "languages.cat": "Catalan", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chinese", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croatian", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "English", + "languages.epo": "Esperanto", + "languages.est": "Estonian", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "French", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "German", + "languages.ell": "Greek", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitian", + "languages.hau": "Hausa", + "languages.hed": "Hebrew", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarian", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italian", + "languages.iku": "Inuktitut", + "languages.jpn": "Japanese", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Korean", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolian", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norsk bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norsk nynorsk", + "languages.nor": "Norsk", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persian", + "languages.pol": "Polish", + "languages.pus": "Pashto", + "languages.por": "Portuguese", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Romanian", + "languages.rus": "Russian", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbian", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spanish", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrainian", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamese", + "languages.vol": "Volapük", + "languages.win": "Walloon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_nl.json b/sources/lang/Localization_nl.json new file mode 100644 index 0000000..6ee262a --- /dev/null +++ b/sources/lang/Localization_nl.json @@ -0,0 +1,293 @@ +{ + "about.title": "Over COPS", + "allbooks.alphabetical.many": "Alfabetische index van {0} boeken", + "allbooks.alphabetical.none": "Alfabetische index van absoluut geen enkel boek", + "allbooks.alphabetical.one": "Alfabetische index van 1 boek", + "allbooks.title": "Alle boeken", + "authors.alphabetical.many": "Alfabetische index van {0} auteurs", + "authors.alphabetical.none": "Alfabetische index van absoluut geen enkele auteur", + "authors.alphabetical.one": "Alfabetische index van 1 auteur", + "authors.title": "Auteurs", + "authorword.many": "{0} auteurs", + "authorword.none": "Geen auteur", + "authorword.one": "1 auteur", + "bookentry.author": "{0} door {1}", + "bookword.many": "{0} boeken", + "bookword.none": "Geen boek", + "bookword.one": "1 boek", + "bookword.title": "Boeken", + "cog.alternate": "Zoeken, sorteren en filters", + "content.series": "Reeksen:", + "content.series.data": "Boek {0} in de {1} reeks", + "content.summary": "Samenvatting", + "customcolumn.boolean.no": "Nee", + "customcolumn.boolean.unknown": "Niet ingesteld", + "customcolumn.boolean.yes": "Ja", + "customcolumn.date.format": "J-m-d", + "customcolumn.date.unknown": "Niet ingesteld", + "customcolumn.description": "Aangepaste kolom '{0}'", + "customcolumn.description.bool": "Index van een booleaanse waarde", + "customcolumn.description.enum.many": "Alfabetische index van {0} waarden", + "customcolumn.description.enum.none": "Alfabetische index van absoluut geen enkele waarde", + "customcolumn.description.enum.one": "Alfabetische index van één waarde", + "customcolumn.description.rating": "Index van waarderingen", + "customcolumn.description.series.many": "Alfabetische index van {0} reeksen", + "customcolumn.description.series.none": "Alfabetische index van absoluut geen enkele reeks", + "customcolumn.description.series.one": "Alfabetische index van 1 reeks", + "customcolumn.enum.unknown": "Niet ingesteld", + "customcolumn.float.unknown": "Niet ingesteld", + "customcolumn.int.unknown": "Niet ingesteld", + "customcolumn.rating.unknown": "Niet ingesteld", + "customcolumn.stars.many": "{0} Sterren", + "customcolumn.stars.none": "Geen sterren", + "customcolumn.stars.one": "1 Ster", + "customize.email": "E-mailadres ontvanger (om boeken te versturen per elektronische post)", + "customize.fancybox": "Gebruik een Lightbox", + "customize.filter": "Zet filteren op label aan", + "customize.ignored": "Niet opgenomen categorieën", + "customize.paging": "Maximaal aantal boeken per pagina (-1 voor oneindig aantal)", + "customize.style": "Opmaak COPS gebruikersomgeving", + "customize.title": "Aanpassen COPS gebruikersomgeving", + "home.alternate": "Terug", + "i18n.coversection": "Omslag", + "language.title": "Taal", + "languages.alphabetical.many": "Alfabetische index van {0} talen", + "languages.alphabetical.none": "Alfabetische index van absoluut geen enkele taal", + "languages.alphabetical.one": "Alfabetische index van taal", + "languages.title": "Talen", + "mail.messagenotsent": "Bericht kon niet verzonden worden.", + "mail.messagesent": "Bericht is verzonden", + "paging.next.alternate": "Volgende", + "paging.previous.alternate": "Vorige", + "permalink.alternate": "Permalink", + "pubdate.title": "Jaar van publicatie", + "publisher.name": "Uitgever", + "publishers.alphabetical.many": "Alfabetische index van {0} uitgevers", + "publishers.alphabetical.none": "Alfabetische index van afwezige uitgevers", + "publishers.alphabetical.one": "Alfabetische index van een uitgever", + "publishers.title": "Uitgevers", + "publisherword.many": "{0} uitgevers", + "publisherword.none": "Geen uitgever", + "publisherword.one": "1 uitgever", + "ratings.many": "{0} verschillende waarderingen", + "ratings.none": "geen waarderingen", + "ratings.one": "{0} waarderingen", + "ratings.title": "Waardering", + "ratingword.many": "{0} sterren", + "ratingword.none": "Geen ster", + "ratingword.one": "1 ster", + "recent.list": "{0} meest recente boeken", + "recent.title": "Recent toegevoegde boeken", + "search.alternate": "Zoeken", + "search.result": "Zoekresultaat voor *{0}*", + "search.result.author": "Zoekresultaat voor *{0}* in auteurs", + "search.result.book": "Zoekresultaat voor *{0}* in boeken", + "search.result.publisher": "Zoekresultaat voor *{0}* in uitgevers", + "search.result.series": "Zoekresultaat voor *{0}* in reeksen", + "search.result.tag": "Zoekresultaat voor *{0}* in labels", + "search.sortorder.asc": "A-Z", + "search.sortorder.desc": "Z-A", + "series.alphabetical.many": "Alfabetische index van {0} reeksen", + "series.alphabetical.none": "Alfabetische index van absoluut geen enkele reeks", + "series.alphabetical.one": "Alfabetische index van 1 reeks", + "series.title": "Reeksen", + "seriesword.many": "{0} reeksen", + "seriesword.none": "Geen reeks", + "seriesword.one": "1 reeks", + "sort.alternate": "Sorteren", + "splitByLetter.book.other": "Andere boeken", + "splitByLetter.letter": "{0} beginnend met {1}", + "tags.alphabetical.many": "Alfabetische index van {0} labels", + "tags.alphabetical.none": "Alfabetische index van absoluut geen enkele label", + "tags.alphabetical.one": "Alfabetische index van 1 label", + "tags.title": "Labels", + "tagword.many": "{0} labels", + "tagword.none": "Geen label", + "tagword.one": "1 label", + "tagword.title": "Labels", + "languages.abk": "Abchazisch", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanees", + "languages.amh": "Amhaars", + "languages.ara": "Arabisch", + "languages.arg": "Aragonees", + "languages.hye": "Armeens", + "languages.asm": "Assamees", + "languages.ava": "Avarisch", + "languages.ave": "Avestisch", + "languages.aym": "Aymara", + "languages.aze": "Azerbeidzjaans", + "languages.bam": "Bambara", + "languages.bak": "Basjkiers", + "languages.eus": "Baskisch", + "languages.bel": "Wit-Russisch", + "languages.ben": "Bengaals", + "languages.bih": "Biharitalen", + "languages.bis": "Bislama", + "languages.bos": "Bosnisch", + "languages.bre": "Bretons", + "languages.bul": "Bulgaars", + "languages.mya": "Birmees", + "languages.cat": "Catalaans", + "languages.cha": "Chamorro", + "languages.che": "Tsjetsjeens", + "languages.nya": "Nyanja", + "languages.zho": "Chinees", + "languages.chv": "Tsjoevasjisch", + "languages.cor": "Cornish", + "languages.cos": "Corsicaans", + "languages.cre": "Cree", + "languages.hrv": "Kroatisch", + "languages.ces": "Tsjechisch", + "languages.dan": "Deens", + "languages.div": "Divehi", + "languages.nld": "Nederlands", + "languages.dzo": "Dzongkha", + "languages.eng": "Engels", + "languages.epo": "Esperanto", + "languages.est": "Ests", + "languages.ewe": "Ewe", + "languages.fao": "Faeröers", + "languages.fij": "Fijisch", + "languages.fin": "Fins", + "languages.fra": "Frans", + "languages.ful": "Fulah", + "languages.glg": "Galicisch", + "languages.kat": "Georgisch", + "languages.deu": "Duits", + "languages.ell": "Grieks", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haïtiaans", + "languages.hau": "Hausa", + "languages.hed": "Hebreeuws", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hongaars", + "languages.ina": "Interlingua", + "languages.ind": "Indonesisch", + "languages.ile": "Interlingue", + "languages.gle": "Iers", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "IJslands", + "languages.ita": "Italiaans", + "languages.iku": "Inuktitut", + "languages.jpn": "Japans", + "languages.jav": "Javaans", + "languages.kal": "Groenlands", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kasjmiri", + "languages.kaz": "Kazachs", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kirgizisch", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Koreaans", + "languages.kur": "Koerdisch", + "languages.kua": "Kuanyama", + "languages.lat": "Latijn", + "languages.ltz": "Luxemburgs", + "languages.lug": "Ganda", + "languages.lim": "Limburgs", + "languages.lin": "Lingala", + "languages.lao": "Laotiaans", + "languages.lit": "Litouws", + "languages.lub": "Luba-Katanga", + "languages.lav": "Lets", + "languages.glv": "Manx", + "languages.mkd": "Macedonisch", + "languages.mlg": "Malagasisch", + "languages.msa": "Maleis", + "languages.mal": "Malayalam", + "languages.mlt": "Maltees", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallees", + "languages.mon": "Mongools", + "languages.nau": "Nauruaans", + "languages.nav": "Navajo", + "languages.nob": "Noors Bokmål", + "languages.nde": "Noord-Ndbele", + "languages.nep": "Nepalees", + "languages.ndo": "Ndonga", + "languages.nno": "Noors Nynorsk", + "languages.nor": "Noors", + "languages.iii": "Sichuan Yi", + "languages.nbl": "Zuid-Ndbele", + "languages.oci": "Occitaans", + "languages.oji": "Ojibwa", + "languages.chu": "Kerkslavisch", + "languages.orm": "Oromo", + "languages.ori": "Odia", + "languages.oss": "Ossetisch", + "languages.pan": "Punjabi", + "languages.pli": "Pāli", + "languages.fas": "Perzisch", + "languages.pol": "Pools", + "languages.pus": "Pasjtoe", + "languages.por": "Portugees", + "languages.que": "Quechua", + "languages.roh": "Reto-Romaans", + "languages.run": "Kirundi", + "languages.ron": "Roemeens", + "languages.rus": "Russisch", + "languages.san": "Sanskriet", + "languages.srd": "Sardinisch", + "languages.snd": "Sindhi", + "languages.sme": "Noord-Samisch", + "languages.smo": "Samoaans", + "languages.sag": "Sango", + "languages.srp": "Servisch", + "languages.gla": "Schots Gaelic", + "languages.sna": "Shona", + "languages.sin": "Singalees", + "languages.slk": "Slovaaks", + "languages.slv": "Sloveens", + "languages.som": "Somalisch", + "languages.sot": "Zuid-Sotho", + "languages.spa": "Spaans", + "languages.sun": "Sudanees", + "languages.swa": "Swahili", + "languages.ssw": "Swazi", + "languages.swe": "Zweeds", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tadzjieks", + "languages.tha": "Thais", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetaans", + "languages.tuk": "Turkmeens", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turks", + "languages.tso": "Tongaans", + "languages.tat": "Tataars", + "languages.twi": "Twi", + "languages.tah": "Tahitisch", + "languages.uig": "Oeigoers", + "languages.ukr": "Oekraïens", + "languages.urd": "Urdu", + "languages.uzb": "Oezbeeks", + "languages.ven": "Venda", + "languages.vie": "Vietnamees", + "languages.vol": "Volapük", + "languages.win": "Waals", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Fries", + "languages.xho": "Xhosa", + "languages.yid": "Jiddisch", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_pl.json b/sources/lang/Localization_pl.json new file mode 100644 index 0000000..c26b5fc --- /dev/null +++ b/sources/lang/Localization_pl.json @@ -0,0 +1,293 @@ +{ + "about.title": "About COPS", + "allbooks.alphabetical.many": "Indeks alfabetyczny według {0} tytułów książek", + "allbooks.alphabetical.none": "Brak książek w spisie", + "allbooks.alphabetical.one": "Indeks alfabetyczny jedna książka", + "allbooks.title": "Wszystkie książki", + "authors.alphabetical.many": "Indeks alfabetyczny według {0} autorów", + "authors.alphabetical.none": "Indeks książek w których autor jest nieznany", + "authors.alphabetical.one": "Indeks książek", + "authors.title": "Autorzy", + "authorword.many": "{0} autorów", + "authorword.none": "Brak autorów", + "authorword.one": "1 autor", + "bookentry.author": "{0} przez {1}", + "bookword.many": "{0} książek", + "bookword.none": "Brak ksiażek", + "bookword.one": "1 książka", + "bookword.title": "Książki", + "cog.alternate": "Wyszukiwanie, sortowanie i filtrowanie", + "content.series": "Serie:", + "content.series.data": "{0} Książek w {1} serii", + "content.summary": "Podsumowanie", + "customcolumn.boolean.no": "Nie", + "customcolumn.boolean.unknown": "Domyślny dostęp", + "customcolumn.boolean.yes": "Tak", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Domyślny dostęp", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Indeks alfabetyczny {0} serii", + "customcolumn.description.series.none": "Indeks alfabetyczny - brak serii", + "customcolumn.description.series.one": "Indeks alfabetyczny jedna seria", + "customcolumn.enum.unknown": "Domyślny dostęp", + "customcolumn.float.unknown": "Domyślny dostęp", + "customcolumn.int.unknown": "Domyślny dostęp", + "customcolumn.rating.unknown": "Domyślny dostęp", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Ustaw swój adres e-mail (aby wysyłać książki)", + "customize.fancybox": "Używaj Lightbox (wyświetla książki w okienku)", + "customize.filter": "Używaj filtrowania po kategoriach", + "customize.ignored": "Zignorowane kategorie", + "customize.paging": "Maksymalna liczba książek na stronie (-1 blokada)", + "customize.style": "Szablon wyglądu", + "customize.title": "Ustawienia użytkownika COPS", + "home.alternate": "Strona głowna", + "i18n.coversection": "Okładka", + "language.title": "Język", + "languages.alphabetical.many": "Indeks alfabetyczny według {0} jezyków", + "languages.alphabetical.none": "Indeks alfabetyczny według języków - brak języków", + "languages.alphabetical.one": "Indeks alfabetyczny według języków jeden język", + "languages.title": "Języki", + "mail.messagenotsent": "Wiadomość nie może być wysłana", + "mail.messagesent": "Wiadomość wysłana", + "paging.next.alternate": "Następna", + "paging.previous.alternate": "Poprzednia", + "permalink.alternate": "Permalink", + "pubdate.title": "Rok publikacji", + "publisher.name": "Wydawca", + "publishers.alphabetical.many": "Indeks alfabetyczny według {0} wydawców", + "publishers.alphabetical.none": "Indeks alfabetyczny wydawców - brak wydawców", + "publishers.alphabetical.one": "Indeks alfabetyczny wydawców - jeden wydawca", + "publishers.title": "Wydawcy", + "publisherword.many": "{0} wydawców", + "publisherword.none": "brak wydawców", + "publisherword.one": "jeden wydawca", + "ratings.many": "{0} oceny", + "ratings.none": "brak ocen", + "ratings.one": "jedna ocena", + "ratings.title": "Oceny", + "ratingword.many": "{0} gwiazdek", + "ratingword.none": "brak gwiazdek", + "ratingword.one": "jedna gwiazdka", + "recent.list": "Ostatnio dodanych {0} książek", + "recent.title": "Ostatnio dodane książki", + "search.alternate": "Szukaj", + "search.result": "Wyniki wyszukiwania dla *{0}*", + "search.result.author": "Wyniki wyszukiwania dla *{0}* w autorach", + "search.result.book": "Wyniki wyszukiwania dla *{0}* w ksiązkach", + "search.result.publisher": "Wyniki wyszukiwania dla *{0}* w wydwcach", + "search.result.series": "Wyniki wyszukiwania dla *{0}* W seriach", + "search.result.tag": "Wyniki wyszukiwania dla *{0}* w tagach", + "search.sortorder.asc": "Sortowanie rosnące", + "search.sortorder.desc": "Sortowanie malejące", + "series.alphabetical.many": "Indeks alfabetyczny {0} serii", + "series.alphabetical.none": "Indeks alfabetyczny - brak serii", + "series.alphabetical.one": "Indeks alfabetyczny jedna seria", + "series.title": "Serie", + "seriesword.many": "{0} serii", + "seriesword.none": "Brak serii", + "seriesword.one": "Jedna seria", + "sort.alternate": "Sortowanie", + "splitByLetter.book.other": "Pozostałe książki", + "splitByLetter.letter": "{0} na literę {1}", + "tags.alphabetical.many": "Indeks alfabetyczny według {0} etykiet", + "tags.alphabetical.none": "Indeks alfabetyczny tagów brak etykiet", + "tags.alphabetical.one": "Indeks alfabetyczny według jednej etykiety", + "tags.title": "Etykiety", + "tagword.many": "{0} etykiet", + "tagword.none": "Brak etykiet", + "tagword.one": "Jedna eykieta", + "tagword.title": "Etykiety", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanian", + "languages.amh": "Amharic", + "languages.ara": "Arabic", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Basque", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgarian", + "languages.mya": "Burmese", + "languages.cat": "Catalan", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chinese", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croatian", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "English", + "languages.epo": "Esperanto", + "languages.est": "Estonian", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "French", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "German", + "languages.ell": "Greek", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitian", + "languages.hau": "Hausa", + "languages.hed": "Hebrew", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarian", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italian", + "languages.iku": "Inuktitut", + "languages.jpn": "Japanese", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Korean", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolian", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norwegian", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persian", + "languages.pol": "Polski", + "languages.pus": "Pashto", + "languages.por": "Portuguese", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Romanian", + "languages.rus": "Russian", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbian", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spanish", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrainian", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamese", + "languages.vol": "Volapük", + "languages.win": "Walloon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_pt_BR.json b/sources/lang/Localization_pt_BR.json new file mode 100644 index 0000000..1a44502 --- /dev/null +++ b/sources/lang/Localization_pt_BR.json @@ -0,0 +1,293 @@ +{ + "about.title": "Sobre o COPS", + "allbooks.alphabetical.many": "Índice alfabético dos {0} livros", + "allbooks.alphabetical.none": "Índice alfabético - nenhum livro", + "allbooks.alphabetical.one": "Índice alfabético de um livro", + "allbooks.title": "Todos os livros", + "authors.alphabetical.many": "Índice alfabético dos {0} autores", + "authors.alphabetical.none": "Índice alfabético - nenhum autor", + "authors.alphabetical.one": "Índice alfabético de um autor", + "authors.title": "Autores", + "authorword.many": "{0} autores", + "authorword.none": "Nenhum autor", + "authorword.one": "1 autor", + "bookentry.author": "{0} por {1}", + "bookword.many": "{0} livros", + "bookword.none": "Nenhum livro", + "bookword.one": "1 livro", + "bookword.title": "Livros", + "cog.alternate": "Pesquisar, ordenar e filtrar", + "content.series": "Séries:", + "content.series.data": "Livro {0} da série {1}", + "content.summary": "Resumo", + "customcolumn.boolean.no": "Não", + "customcolumn.boolean.unknown": "Não definido", + "customcolumn.boolean.yes": "Sim", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Não definido", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Índice alfabético das {0} séries", + "customcolumn.description.series.none": "Índice alfabético - nenhuma série", + "customcolumn.description.series.one": "Índice alfabético de uma série", + "customcolumn.enum.unknown": "Não definido", + "customcolumn.float.unknown": "Não definido", + "customcolumn.int.unknown": "Não definido", + "customcolumn.rating.unknown": "Não definido", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Forneça o seu email (para ativar envio de ebooks)", + "customize.fancybox": "Usar o Lightbox (detalhes do livro numa janela flutuante)", + "customize.filter": "Ativar filtro por etiqueta", + "customize.ignored": "Categorias ignoradas", + "customize.paging": "Número máximo de livros por página (-1 para desabilitar)", + "customize.style": "Tema", + "customize.title": "Personalizar a interface do COPS", + "home.alternate": "Principal", + "i18n.coversection": "Capa", + "language.title": "Idioma", + "languages.alphabetical.many": "Índice alfabético dos {0} idiomas", + "languages.alphabetical.none": "Índice alfabético - nenhum idioma", + "languages.alphabetical.one": "Índice alfabético de um idioma", + "languages.title": "Idiomas", + "mail.messagenotsent": "Não foi possível enviar a mensagem.", + "mail.messagesent": "A mensagem foi enviada", + "paging.next.alternate": "Próximo", + "paging.previous.alternate": "Anterior", + "permalink.alternate": "Link permanente", + "pubdate.title": "Ano de publicação", + "publisher.name": "Editora", + "publishers.alphabetical.many": "Índice alfabético das {0} editoras", + "publishers.alphabetical.none": "Índice alfabético - nenhuma editora", + "publishers.alphabetical.one": "Índice alfabético de uma editora", + "publishers.title": "Editoras", + "publisherword.many": "{0} editoras", + "publisherword.none": "Nenhuma editora", + "publisherword.one": "1 editora", + "ratings.many": "{0} avaliações", + "ratings.none": "nenhuma avaliação", + "ratings.one": "1 avaliação", + "ratings.title": "Avaliações", + "ratingword.many": "{0} estrelas", + "ratingword.none": "Nenhuma estrela", + "ratingword.one": "1 estrela", + "recent.list": "{0} livros mais recentes", + "recent.title": "Recentemente adicionados", + "search.alternate": "Pesquisar", + "search.result": "Resultado da pesquisa por *{0}*", + "search.result.author": "Resultado da pesquisa por *{0}* em autores", + "search.result.book": "Resultado da pesquisa por *{0}* em livros", + "search.result.publisher": "Resultado da pesquisa por *{0}* em editoras", + "search.result.series": "Resultado da pesquisa por *{0}* em séries", + "search.result.tag": "Resultado da pesquisa por *{0}* em etiquetas", + "search.sortorder.asc": "Asc", + "search.sortorder.desc": "Desc", + "series.alphabetical.many": "Índice alfabético das {0} séries", + "series.alphabetical.none": "Índice alfabético - nenhuma série", + "series.alphabetical.one": "Índice alfabético de uma série", + "series.title": "Séries", + "seriesword.many": "{0} séries", + "seriesword.none": "Nenhuma série", + "seriesword.one": "1 série", + "sort.alternate": "Classificar", + "splitByLetter.book.other": "Outros livros", + "splitByLetter.letter": "{0} começando com {1}", + "tags.alphabetical.many": "Índice alfabético das {0} etiquetas", + "tags.alphabetical.none": "Índice alfabético - nenhuma etiqueta", + "tags.alphabetical.one": "Índice alfabético de uma etiqueta", + "tags.title": "Etiquetas", + "tagword.many": "{0} etiquetas", + "tagword.none": "Nenhuma etiqueta", + "tagword.one": "1 etiqueta", + "tagword.title": "Etiquetas", + "languages.abk": "Abcázia", + "languages.aaf": "Afar", + "languages.afr": "Sul Africano", + "languages.aka": "Akan", + "languages.sqi": "Albanês", + "languages.amh": "Amárico", + "languages.ara": "Árabe", + "languages.arg": "Aragonês", + "languages.hye": "Armênio", + "languages.asm": "Assamês", + "languages.ava": "Avari", + "languages.ave": "Avéstico", + "languages.aym": "Aymara", + "languages.aze": "Azerbaidjanês", + "languages.bam": "Bambara", + "languages.bak": "Basquir", + "languages.eus": "Basco", + "languages.bel": "Bielorrusso", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislamá", + "languages.bos": "Bósnio", + "languages.bre": "Bretão", + "languages.bul": "Búlgaro", + "languages.mya": "Birmanês", + "languages.cat": "Catalão", + "languages.cha": "Chamorro", + "languages.che": "Checheno", + "languages.nya": "Chichewa", + "languages.zho": "Chinês", + "languages.chv": "Chuvache", + "languages.cor": "Corniso", + "languages.cos": "Córsego", + "languages.cre": "Cree", + "languages.hrv": "Croata", + "languages.ces": "Checo", + "languages.dan": "Dinamarquês", + "languages.div": "Divehi", + "languages.nld": "Holandês", + "languages.dzo": "Dzonga", + "languages.eng": "Inglês", + "languages.epo": "Esperanto", + "languages.est": "Estoniano", + "languages.ewe": "Ewe", + "languages.fao": "Faroense", + "languages.fij": "fijiano", + "languages.fin": "Finlandês", + "languages.fra": "Francês", + "languages.ful": "Fula", + "languages.glg": "Galego", + "languages.kat": "Georgiano", + "languages.deu": "Alemão", + "languages.ell": "Grego", + "languages.grn": "Guarani", + "languages.guj": "Gujarati", + "languages.hat": "Haitiano", + "languages.hau": "Hauçá", + "languages.hed": "Hebraico", + "languages.her": "Herero", + "languages.hin": "Híndi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Húngaro", + "languages.ina": "Interlíngua", + "languages.ind": "Indonésio", + "languages.ile": "Interlíngue", + "languages.gle": "Irlandês", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaque", + "languages.ido": "Ido", + "languages.isl": "Islandês", + "languages.ita": "Italiano", + "languages.iku": "Inuktitut", + "languages.jpn": "Japonês", + "languages.jav": "Javanês", + "languages.kal": "Kal", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Cazaque", + "languages.khm": "Khmer", + "languages.kik": "Quicuio", + "languages.kin": "Ruanda", + "languages.kir": "Quirguistão", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Coreano", + "languages.kur": "Curdo", + "languages.kua": "Kwanyama", + "languages.lat": "Latim", + "languages.ltz": "Luxemburguês", + "languages.lug": "Ganda", + "languages.lim": "Limburguês", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lituânio", + "languages.lub": "Luba-Katanga", + "languages.lav": "Letã", + "languages.glv": "Manês", + "languages.mkd": "Macedônio", + "languages.mlg": "Malgaxe", + "languages.msa": "Malaio", + "languages.mal": "Malaiala", + "languages.mlt": "Maltês", + "languages.mri": "Maori", + "languages.mar": "Marathi", + "languages.mah": "Marshalês", + "languages.mon": "Mongol", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norueguês de Bokmal", + "languages.nde": "Ndebelê do Norte", + "languages.nep": "Nepalês", + "languages.ndo": "Ndonga", + "languages.nno": "Novo Norueguês", + "languages.nor": "Norueguês", + "languages.iii": "Nuosu", + "languages.nbl": "Ndebelê do Sul", + "languages.oci": "Occitan", + "languages.oji": "Ojíbua", + "languages.chu": "Eslavo Eclesiástico", + "languages.orm": "Oromo", + "languages.ori": "Oriá", + "languages.oss": "Osseta", + "languages.pan": "Panjabi", + "languages.pli": "Páli", + "languages.fas": "Pérsio", + "languages.pol": "Polonês", + "languages.pus": "Pachto", + "languages.por": "Português", + "languages.que": "Quíchua", + "languages.roh": "Romanche", + "languages.run": "Kirundi", + "languages.ron": "Romeno", + "languages.rus": "Russo", + "languages.san": "Sânscrito", + "languages.srd": "Sardenho", + "languages.snd": "Sindi", + "languages.sme": "Sami do Norte", + "languages.smo": "Samoano", + "languages.sag": "Sango", + "languages.srp": "Sérvio", + "languages.gla": "Gaélico Escocês", + "languages.sna": "Xichona", + "languages.sin": "Sinhala", + "languages.slk": "Eslovaco", + "languages.slv": "Esloveno", + "languages.som": "Somali", + "languages.sot": "Soto do Sul", + "languages.spa": "Espanhol", + "languages.sun": "Sundanês", + "languages.swa": "Suaíle", + "languages.ssw": "Swati", + "languages.swe": "Sueco", + "languages.tam": "Tâmil", + "languages.tel": "Telugu", + "languages.tgk": "Tadjique", + "languages.tha": "Tailandês", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetano Padrão", + "languages.tuk": "Turcomeno", + "languages.tgl": "Tagalo", + "languages.tsn": "Tswana", + "languages.ton": "Tonganês", + "languages.tur": "Turco", + "languages.tso": "Tsonga", + "languages.tat": "Tártaro", + "languages.twi": "Twi", + "languages.tah": "Taitiano", + "languages.uig": "Uigur", + "languages.ukr": "Ucraniano", + "languages.urd": "Urdu", + "languages.uzb": "Uzbeque", + "languages.ven": "Venda", + "languages.vie": "Vietnamita", + "languages.vol": "Volapuque", + "languages.win": "Valão", + "languages.cym": "Galês", + "languages.wol": "Uólofe", + "languages.fry": "Frísico Ocidental", + "languages.xho": "Xhosa", + "languages.yid": "Iídiche", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_pt_PT.json b/sources/lang/Localization_pt_PT.json new file mode 100644 index 0000000..9f93970 --- /dev/null +++ b/sources/lang/Localization_pt_PT.json @@ -0,0 +1,293 @@ +{ + "about.title": "Sobre a aplicação", + "allbooks.alphabetical.many": "Índice alfabético dos {0} livros", + "allbooks.alphabetical.none": "Índice alfabético - sem livros", + "allbooks.alphabetical.one": "Índice alfabético de 1 livro", + "allbooks.title": "Todos os livros", + "authors.alphabetical.many": "Índice alfabético dos {0} autores", + "authors.alphabetical.none": "Índice alfabético sem autores", + "authors.alphabetical.one": "Índice alfabético de 1 autor", + "authors.title": "Autores", + "authorword.many": "{0} autores", + "authorword.none": "Sem autores", + "authorword.one": "1 autor", + "bookentry.author": "{0} por {1}", + "bookword.many": "{0} livros", + "bookword.none": "Sem livros", + "bookword.one": "1 livro", + "bookword.title": "Títulos", + "cog.alternate": "Pesquisar, ordenar e filtrar", + "content.series": "Séries:", + "content.series.data": "Livro {0} da série {1}", + "content.summary": "Informações/Resumo", + "customcolumn.boolean.no": "Não", + "customcolumn.boolean.unknown": "Não definido", + "customcolumn.boolean.yes": "Sim", + "customcolumn.date.format": "d-m-A", + "customcolumn.date.unknown": "Não definido", + "customcolumn.description": "Coluna personalizada '{0}'", + "customcolumn.description.bool": "Índice - valor boleano", + "customcolumn.description.enum.many": "Índice alfabético dos {0} valores", + "customcolumn.description.enum.none": "Índice alfabético - sem valores", + "customcolumn.description.enum.one": "Índice alfabético de 1 valor", + "customcolumn.description.rating": "Índice de pontuações", + "customcolumn.description.series.many": "Índice alfabético das {0} séries", + "customcolumn.description.series.none": "Índice alfabético - sem séries", + "customcolumn.description.series.one": "Índice alfabético com 1 série", + "customcolumn.enum.unknown": "Não definido", + "customcolumn.float.unknown": "Não definido", + "customcolumn.int.unknown": "Não definido", + "customcolumn.rating.unknown": "Não definido", + "customcolumn.stars.many": "{0} estrelas", + "customcolumn.stars.none": "Sem estrelas", + "customcolumn.stars.one": "1 estrela", + "customize.email": "Definir o seu email (para ativar envio de ebooks)", + "customize.fancybox": "Usar o Lightbox (detalhes do livro numa janela flutuante)", + "customize.filter": "Ativar filtro por etiquetas", + "customize.ignored": "Categorias ignoradas", + "customize.paging": "Número máximo de títulos por página (-1 para desativar)", + "customize.style": "Estilo", + "customize.title": "Personalizar o visual da aplicação", + "home.alternate": "Entrada", + "i18n.coversection": "Capa", + "language.title": "Idioma", + "languages.alphabetical.many": "Índice alfabético dos {0} idiomas", + "languages.alphabetical.none": "Índice alfabético - sem idiomas", + "languages.alphabetical.one": "Índice alfabético de 1 idioma", + "languages.title": "Idiomas", + "mail.messagenotsent": "Não foi possível enviar a mensagem.", + "mail.messagesent": "A mensagem foi enviada", + "paging.next.alternate": "Seguinte", + "paging.previous.alternate": "Anterior", + "permalink.alternate": "Ligação permanente", + "pubdate.title": "Ano de publicação", + "publisher.name": "Editora", + "publishers.alphabetical.many": "Índice alfabético das {0} editoras", + "publishers.alphabetical.none": "Índice alfabético - sem editoras", + "publishers.alphabetical.one": "Índice alfabético de 1 editora", + "publishers.title": "Editoras", + "publisherword.many": "{0} editoras", + "publisherword.none": "Sem editoras", + "publisherword.one": "1 editora", + "ratings.many": "{0} avaliações", + "ratings.none": "sem avaliações", + "ratings.one": "1 avaliação", + "ratings.title": "Avaliações", + "ratingword.many": "{0} estrelas", + "ratingword.none": "Sem estrelas", + "ratingword.one": "1 estrela", + "recent.list": "{0} livros mais recentes", + "recent.title": "Adicionados recentemente", + "search.alternate": "Pesquisar", + "search.result": "Resultado da pesquisa por *{0}*", + "search.result.author": "Resultado da pesquisa por *{0}* em autores", + "search.result.book": "Resultado da pesquisa por *{0}* em livros", + "search.result.publisher": "Resultado da pesquisa por *{0}* em editoras", + "search.result.series": "Resultado da pesquisa por *{0}* em séries", + "search.result.tag": "Resultado da pesquisa por *{0}* em etiquetas", + "search.sortorder.asc": "A-Z", + "search.sortorder.desc": "Z-A", + "series.alphabetical.many": "Índice alfabético das {0} séries", + "series.alphabetical.none": "Índice alfabético - sem séries", + "series.alphabetical.one": "Índice alfabético de 1 série", + "series.title": "Séries", + "seriesword.many": "{0} séries", + "seriesword.none": "Sem séries", + "seriesword.one": "1 série", + "sort.alternate": "Ordenar", + "splitByLetter.book.other": "Outros livros", + "splitByLetter.letter": "{0} pela letra: {1}", + "tags.alphabetical.many": "Índice alfabético das {0} etiquetas", + "tags.alphabetical.none": "Índice alfabético - sem etiquetas", + "tags.alphabetical.one": "Índice alfabético de 1 etiqueta", + "tags.title": "Etiquetas", + "tagword.many": "{0} etiquetas", + "tagword.none": "Sem etiquetas", + "tagword.one": "1 etiqueta", + "tagword.title": "Etiquetas", + "languages.abk": "Abcázia", + "languages.aaf": "Afar", + "languages.afr": "Sul Africano", + "languages.aka": "Akan", + "languages.sqi": "Albanês", + "languages.amh": "Amárico", + "languages.ara": "Árabe", + "languages.arg": "Aragonês", + "languages.hye": "Armênio", + "languages.asm": "Assamês", + "languages.ava": "Avari", + "languages.ave": "Avéstico", + "languages.aym": "Aymara", + "languages.aze": "Azerbaidjanês", + "languages.bam": "Bambara", + "languages.bak": "Basquir", + "languages.eus": "Basco", + "languages.bel": "Bielorrusso", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislamá", + "languages.bos": "Bósnio", + "languages.bre": "Bretão", + "languages.bul": "Búlgaro", + "languages.mya": "Birmanês", + "languages.cat": "Catalão", + "languages.cha": "Chamorro", + "languages.che": "Checheno", + "languages.nya": "Chichewa", + "languages.zho": "Chinês", + "languages.chv": "Chuvache", + "languages.cor": "Corniso", + "languages.cos": "Córsego", + "languages.cre": "Cree", + "languages.hrv": "Croata", + "languages.ces": "Checo", + "languages.dan": "Dinamarquês", + "languages.div": "Divehi", + "languages.nld": "Holandês", + "languages.dzo": "Dzonga", + "languages.eng": "Inglês", + "languages.epo": "Esperanto", + "languages.est": "Estoniano", + "languages.ewe": "Ewe", + "languages.fao": "Faroense", + "languages.fij": "Fijiano", + "languages.fin": "Finlandês", + "languages.fra": "Francês", + "languages.ful": "Fula", + "languages.glg": "Galego", + "languages.kat": "Georgiano", + "languages.deu": "Alemão", + "languages.ell": "Grego", + "languages.grn": "Guarani", + "languages.guj": "Gujarati", + "languages.hat": "Haitiano", + "languages.hau": "Hauçá", + "languages.hed": "Hebraico", + "languages.her": "Herero", + "languages.hin": "Híndi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Húngaro", + "languages.ina": "Interlíngua", + "languages.ind": "Indonésio", + "languages.ile": "Interlíngue", + "languages.gle": "Irlandês", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaque", + "languages.ido": "Ido", + "languages.isl": "Islandês", + "languages.ita": "Italiano", + "languages.iku": "Inuktitut", + "languages.jpn": "Japonês", + "languages.jav": "Javanês", + "languages.kal": "Kal", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Cazaque", + "languages.khm": "Khmer", + "languages.kik": "Quicuio", + "languages.kin": "Ruanda", + "languages.kir": "Quirguistão", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Coreano", + "languages.kur": "Curdo", + "languages.kua": "Kwanyama", + "languages.lat": "Latim", + "languages.ltz": "Luxemburguês", + "languages.lug": "Ganda", + "languages.lim": "Limburguês", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lituânio", + "languages.lub": "Luba-Katanga", + "languages.lav": "Letã", + "languages.glv": "Manês", + "languages.mkd": "Macedônio", + "languages.mlg": "Malgaxe", + "languages.msa": "Malaio", + "languages.mal": "Malaiala", + "languages.mlt": "Maltês", + "languages.mri": "Maori", + "languages.mar": "Marathi", + "languages.mah": "Marshalês", + "languages.mon": "Mongol", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norueguês de Bokmal", + "languages.nde": "Ndebelê do Norte", + "languages.nep": "Nepalês", + "languages.ndo": "Ndonga", + "languages.nno": "Novo Norueguês", + "languages.nor": "Norueguês", + "languages.iii": "Nuosu", + "languages.nbl": "Ndebelê do Sul", + "languages.oci": "Occitan", + "languages.oji": "Ojíbua", + "languages.chu": "Eslavo Eclesiástico", + "languages.orm": "Oromo", + "languages.ori": "Oriá", + "languages.oss": "Osseta", + "languages.pan": "Panjabi", + "languages.pli": "Páli", + "languages.fas": "Persa", + "languages.pol": "Polaco", + "languages.pus": "Pachto", + "languages.por": "Português", + "languages.que": "Quíchua", + "languages.roh": "Romanche", + "languages.run": "Kirundi", + "languages.ron": "Romeno", + "languages.rus": "Russo", + "languages.san": "Sânscrito", + "languages.srd": "Sardenho", + "languages.snd": "Sindi", + "languages.sme": "Sami do Norte", + "languages.smo": "Samoano", + "languages.sag": "Sango", + "languages.srp": "Sérvio", + "languages.gla": "Gaélico Escocês", + "languages.sna": "Xichona", + "languages.sin": "Sinhala", + "languages.slk": "Eslovaco", + "languages.slv": "Esloveno", + "languages.som": "Somali", + "languages.sot": "Soto do Sul", + "languages.spa": "Espanhol", + "languages.sun": "Sundanês", + "languages.swa": "Suaíle", + "languages.ssw": "Swati", + "languages.swe": "Sueco", + "languages.tam": "Tâmil", + "languages.tel": "Telugu", + "languages.tgk": "Tadjique", + "languages.tha": "Tailandês", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetano Padrão", + "languages.tuk": "Turcomeno", + "languages.tgl": "Tagalo", + "languages.tsn": "Tswana", + "languages.ton": "Tonganês", + "languages.tur": "Turco", + "languages.tso": "Tsonga", + "languages.tat": "Tártaro", + "languages.twi": "Twi", + "languages.tah": "Taitiano", + "languages.uig": "Uigur", + "languages.ukr": "Ucraniano", + "languages.urd": "Urdu", + "languages.uzb": "Uzbeque", + "languages.ven": "Venda", + "languages.vie": "Vietnamita", + "languages.vol": "Volapuque", + "languages.win": "Valão", + "languages.cym": "Galês", + "languages.wol": "Uólofe", + "languages.fry": "Frísico Ocidental", + "languages.xho": "Xhosa", + "languages.yid": "Iídiche", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_ro.json b/sources/lang/Localization_ro.json new file mode 100644 index 0000000..c0c1b7c --- /dev/null +++ b/sources/lang/Localization_ro.json @@ -0,0 +1,293 @@ +{ + "about.title": "Despre COPS", + "allbooks.alphabetical.many": "Index alfabetic: {0} cărţi", + "allbooks.alphabetical.none": "Index alfabetic: 0 cărţi", + "allbooks.alphabetical.one": "Index alfabetic: 1 carte", + "allbooks.title": "Toate cărţile", + "authors.alphabetical.many": "Index alfabetic: {0} autori", + "authors.alphabetical.none": "Index alfabetic: 0 autori", + "authors.alphabetical.one": "Index alfabetic: 1 autor", + "authors.title": "Autori", + "authorword.many": "{0} autori", + "authorword.none": "Nici un autor", + "authorword.one": "1 autor", + "bookentry.author": "{0} din {1}", + "bookword.many": "{0} cărţi", + "bookword.none": "Fără cărţi", + "bookword.one": "1 carte", + "bookword.title": "Cărţi", + "cog.alternate": "Căutare, srotare şi filtrare", + "content.series": "Serii:", + "content.series.data": "Cartea {0} din serie de {1}", + "content.summary": "Sumar", + "customcolumn.boolean.no": "Nu", + "customcolumn.boolean.unknown": "Nu setaţi", + "customcolumn.boolean.yes": "Da", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Nu setaţi", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Index alfabetic: {0} serii", + "customcolumn.description.series.none": "Index alfabetic: 0 serii", + "customcolumn.description.series.one": "Index alfabetic: 1 serie", + "customcolumn.enum.unknown": "Nu setaţi", + "customcolumn.float.unknown": "Nu setaţi", + "customcolumn.int.unknown": "Nu setaţi", + "customcolumn.rating.unknown": "Nu setaţi", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Stea", + "customize.email": "Setează-ţi adresa de mail (pentru a putea trimite cărţi prin email)", + "customize.fancybox": "Foloseşte Lightbox (cărţile se încarcă într-un floating frame)", + "customize.filter": "Activează filtrarea după tag-uri", + "customize.ignored": "Categorii ignorate", + "customize.paging": "Număr maxim de cărţi pe pagină (-1 pentru dezactivare)", + "customize.style": "Temă", + "customize.title": "Customizează interfaţa COPS", + "home.alternate": "Acasă", + "i18n.coversection": "Copertă", + "language.title": "Limbă", + "languages.alphabetical.many": "Index alfabetic: {0} limbi", + "languages.alphabetical.none": "Index alfabetic: 0 limbi", + "languages.alphabetical.one": "Index alfabetic: 1 limbă", + "languages.title": "Limbi", + "mail.messagenotsent": "Mesajul nu a putut fi trimis.", + "mail.messagesent": "Mesajul a fost rtimis", + "paging.next.alternate": "Următor", + "paging.previous.alternate": "Anterior", + "permalink.alternate": "Link permanent", + "pubdate.title": "Anul publicării", + "publisher.name": "Editură", + "publishers.alphabetical.many": "Index alfabetic: {0} edituri", + "publishers.alphabetical.none": "Index alfabetic: 0 edituri", + "publishers.alphabetical.one": "Index alfabetic: 1 editură", + "publishers.title": "Edituri", + "publisherword.many": "{0} edituri", + "publisherword.none": "Fără edituri", + "publisherword.one": "1 editură", + "ratings.many": "{0} voturi", + "ratings.none": "fără voturi", + "ratings.one": "1 vot", + "ratings.title": "Voturi", + "ratingword.many": "{0} stele", + "ratingword.none": "Fără stele", + "ratingword.one": "1 stea", + "recent.list": "{0} cărţi recente", + "recent.title": "Recent adăugate", + "search.alternate": "Căutare", + "search.result": "Rezultatul căutării *{0}*", + "search.result.author": "Rezultatul căutării *{0}* în autori", + "search.result.book": "Rezultatul căutării *{0}* în cărţi", + "search.result.publisher": "Rezultatul căutării *{0}* în edituri", + "search.result.series": "Rezultatul căutării *{0}* in serii", + "search.result.tag": "Rezultatul căutării *{0}* in tag-uri", + "search.sortorder.asc": "Asc", + "search.sortorder.desc": "Desc", + "series.alphabetical.many": "Index alfabetic: {0} serii", + "series.alphabetical.none": "Index alfabetic: 0 serii", + "series.alphabetical.one": "Index alfabetic: 1 serie", + "series.title": "Serii", + "seriesword.many": "{0} serii", + "seriesword.none": "Fără serii", + "seriesword.one": "1 serie", + "sort.alternate": "Sortare", + "splitByLetter.book.other": "Alte cărţi", + "splitByLetter.letter": "{0} care încep cu {1}", + "tags.alphabetical.many": "Index alfabetic: {0} tag-uri", + "tags.alphabetical.none": "Index alfabetic: 0 tag-uri", + "tags.alphabetical.one": "Index alfabetic: 1 tag", + "tags.title": "Tag-uri", + "tagword.many": "{0} tag-uri", + "tagword.none": "Fără tag-uri", + "tagword.one": "1 tag", + "tagword.title": "Tag-uri", + "languages.abk": "Ahază", + "languages.aaf": "Afară", + "languages.afr": "Sud-africană", + "languages.aka": "Akan", + "languages.sqi": "Albaneză", + "languages.amh": "Amharică", + "languages.ara": "Arabă", + "languages.arg": "Aragoneză", + "languages.hye": "Armeană", + "languages.asm": "Assameză", + "languages.ava": "Avaric", + "languages.ave": "Avestană", + "languages.aym": "Aymara", + "languages.aze": "Azeră", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Bască", + "languages.bel": "Bielorusă", + "languages.ben": "Bengaleză", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosniacă", + "languages.bre": "Bretonă", + "languages.bul": "Bulgară", + "languages.mya": "Burmeză", + "languages.cat": "Catalană", + "languages.cha": "Chamorro", + "languages.che": "Cecenă", + "languages.nya": "Chichewa", + "languages.zho": "Chineză", + "languages.chv": "Chuvash", + "languages.cor": "Cornică", + "languages.cos": "Corsicană", + "languages.cre": "Cree", + "languages.hrv": "Croată", + "languages.ces": "Cehă", + "languages.dan": "Daneză", + "languages.div": "Divehi", + "languages.nld": "Olandeză", + "languages.dzo": "Dzongkha", + "languages.eng": "Engleză", + "languages.epo": "Esperanto", + "languages.est": "Estoniană", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finlandeză", + "languages.fra": "Franceză", + "languages.ful": "Fula", + "languages.glg": "Galiciană", + "languages.kat": "Georgiană", + "languages.deu": "Germană", + "languages.ell": "Greacă", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitiană", + "languages.hau": "Hausa", + "languages.hed": "Ebraică", + "languages.her": "Herero", + "languages.hin": "Hindusă", + "languages.hmo": "Hiri Motu", + "languages.hun": "Maghiară", + "languages.ina": "Interlingua", + "languages.ind": "Indoneziană", + "languages.ile": "Interlingue", + "languages.gle": "Irlandeză", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Islandeză", + "languages.ita": "Italiană", + "languages.iku": "Inuktitut", + "languages.jpn": "Japoneză", + "languages.jav": "Javaneză", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Congoleză", + "languages.kor": "Coreană", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latină", + "languages.ltz": "Luxemburgheză", + "languages.lug": "Ganda", + "languages.lim": "Limburgheză", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lituaniană", + "languages.lub": "Luba-Katanga", + "languages.lav": "Letonă", + "languages.glv": "Manx", + "languages.mkd": "Macedoneană", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Malteză", + "languages.mri": "Maori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolă", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmal", + "languages.nde": "North Ndebele", + "languages.nep": "Nepaleză", + "languages.ndo": "Ndonga", + "languages.nno": "Norvegiană Nynorsk", + "languages.nor": "Norvegiană", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitană", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pali", + "languages.fas": "Persană", + "languages.pol": "Poloneză", + "languages.pus": "Pashto", + "languages.por": "Portugheză", + "languages.que": "Quechua", + "languages.roh": "Romani", + "languages.run": "Kirundi", + "languages.ron": "Română", + "languages.rus": "Rusă", + "languages.san": "Sanscrită", + "languages.srd": "Sardă", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Sârbă", + "languages.gla": "Scoţiană", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovacă", + "languages.slv": "Slovenă", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spaniolă", + "languages.sun": "Sundaneză", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Suedeză", + "languages.tam": "Tamilă", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thailandeză", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmenă", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turcă", + "languages.tso": "Tsonga", + "languages.tat": "Tatară", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ucrainiană", + "languages.urd": "Urdu", + "languages.uzb": "Uzbecă", + "languages.ven": "Venda", + "languages.vie": "Vietnameză", + "languages.vol": "Volapük", + "languages.win": "Valonă", + "languages.cym": "Galeză", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Idiş", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_ru.json b/sources/lang/Localization_ru.json new file mode 100644 index 0000000..d628a66 --- /dev/null +++ b/sources/lang/Localization_ru.json @@ -0,0 +1,293 @@ +{ + "about.title": "О Программе COPS", + "allbooks.alphabetical.many": "Алфавитный указатель по {0} книгам", + "allbooks.alphabetical.none": "Алфавитный указатель. Книги без названия", + "allbooks.alphabetical.one": "Алфавитный указатель. Одна книга", + "allbooks.title": "Названия книг", + "authors.alphabetical.many": "Алфавитный указатель по {0} авторам", + "authors.alphabetical.none": "Алфавитный указатель. Книги без указания автора", + "authors.alphabetical.one": "Алфавитный указатель. Один автор", + "authors.title": "Авторы", + "authorword.many": "{0} авторов(а)", + "authorword.none": "Нет автора", + "authorword.one": "1 автор", + "bookentry.author": "{0} из {1}", + "bookword.many": "{0} книг(и)", + "bookword.none": "Нет книг", + "bookword.one": "1 книга", + "bookword.title": "Книги", + "cog.alternate": "Поиск, сортировка и фильтры", + "content.series": "Серии:", + "content.series.data": "Книга {0} в {1} серии", + "content.summary": "Резюме", + "customcolumn.boolean.no": "Нет", + "customcolumn.boolean.unknown": "Не задано", + "customcolumn.boolean.yes": "Да", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Не задано", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Алфавитный указатель по {0} сериям", + "customcolumn.description.series.none": "Алфавитный указатель. Книги без указания серии", + "customcolumn.description.series.one": "Алфавитный указатель. Одна серия", + "customcolumn.enum.unknown": "Не задано", + "customcolumn.float.unknown": "Не задано", + "customcolumn.int.unknown": "Не задано", + "customcolumn.rating.unknown": "Не задано", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Укажите Ваш e-mail (возможность отправлять книги по почте)", + "customize.fancybox": "Эффектно всплывающее окно при увеличении обложки", + "customize.filter": "Включить фильтрацию по категориям", + "customize.ignored": "Исключить категории", + "customize.paging": "Максимальное число книг на странице (-1 - не ограничивать)", + "customize.style": "Тема", + "customize.title": "Изменить Интерфейс COPS", + "home.alternate": "Домой", + "i18n.coversection": "Обложка", + "language.title": "Язык", + "languages.alphabetical.many": "Алфавитный указатель по {0} языкам", + "languages.alphabetical.none": "Алфавитный указатель. Книги без указания языка", + "languages.alphabetical.one": "Алфавитный указатель. Один язык", + "languages.title": "Язык", + "mail.messagenotsent": "Сообщение не может быть отправлено", + "mail.messagesent": "Сообщение было отправлено", + "paging.next.alternate": "След.", + "paging.previous.alternate": "Пред.", + "permalink.alternate": "Постоянная Ссылка", + "pubdate.title": "Дата публикации", + "publisher.name": "Издательство", + "publishers.alphabetical.many": "Алфавитный указатель по {0} издательствам", + "publishers.alphabetical.none": "Алфавитный указатель. Книги без указания издательства", + "publishers.alphabetical.one": "Алфавитный указатель. Одно издательство", + "publishers.title": "Издательства", + "publisherword.many": "{0} издательств", + "publisherword.none": "Нет издательства", + "publisherword.one": "1 издательство", + "ratings.many": "{0} рейтинга", + "ratings.none": "Рейтинг не указан", + "ratings.one": "1 рейтинг", + "ratings.title": "Рейтинг", + "ratingword.many": "{0} звезд (ы)", + "ratingword.none": "Звезды не указаны", + "ratingword.one": "1 звезда", + "recent.list": "{0} недавно поступивших(ие) книг(и)", + "recent.title": "Недавние поступления", + "search.alternate": "Поиск", + "search.result": "Результаты поиска для *{0}*", + "search.result.author": "Результаты поиска для *{0}* авторов", + "search.result.book": "Результаты поиска для *{0}* книг", + "search.result.publisher": "Результаты поиска для *{0}* издательств", + "search.result.series": "Результаты поиска для *{0}* серий", + "search.result.tag": "Результаты поиска для *{0}* меток", + "search.sortorder.asc": "Возр.", + "search.sortorder.desc": "Убыв.", + "series.alphabetical.many": "Алфавитный указатель по {0} сериям", + "series.alphabetical.none": "Алфавитный указатель. Книги без указания серии", + "series.alphabetical.one": "Алфавитный указатель. Одна серия", + "series.title": "Серии", + "seriesword.many": "{0} серий(и)", + "seriesword.none": "Нет серий", + "seriesword.one": "1 серия", + "sort.alternate": "Сортировка", + "splitByLetter.book.other": "Другие книги", + "splitByLetter.letter": "{0} начать с {1}", + "tags.alphabetical.many": "Алфавитный указатель по {0} жанрам", + "tags.alphabetical.none": "Алфавитный указатель. Книги без указания жанра", + "tags.alphabetical.one": "Алфавитный указатель. Один жанр", + "tags.title": "Жанры", + "tagword.many": "{0} жанра(ов)", + "tagword.none": "Жанр не указан", + "tagword.one": "1 жанр", + "tagword.title": "Жанры", + "languages.abk": "Абхазский", + "languages.aaf": "Афарский", + "languages.afr": "Бурский", + "languages.aka": "Аканский", + "languages.sqi": "Албанский", + "languages.amh": "Амхарский", + "languages.ara": "Арабский", + "languages.arg": "Арагонский", + "languages.hye": "Армянский", + "languages.asm": "Ассамский", + "languages.ava": "Аварский", + "languages.ave": "Авестийский", + "languages.aym": "Аймара", + "languages.aze": "Азербайджанский", + "languages.bam": "Бамана", + "languages.bak": "Башкирский", + "languages.eus": "Баскский", + "languages.bel": "Белорусский", + "languages.ben": "Бенгальский", + "languages.bih": "Бихарский", + "languages.bis": "Бислама", + "languages.bos": "Боснийский", + "languages.bre": "Бретонский", + "languages.bul": "Болгарский", + "languages.mya": "Бирманский", + "languages.cat": "Каталонский", + "languages.cha": "Чаморро", + "languages.che": "Чеченский", + "languages.nya": "Ньянджа", + "languages.zho": "Китайский", + "languages.chv": "Чувашский", + "languages.cor": "Корнский", + "languages.cos": "Корсиканский", + "languages.cre": "Кри", + "languages.hrv": "Хорватский", + "languages.ces": "Чешский", + "languages.dan": "Датский", + "languages.div": "Мальдивский", + "languages.nld": "Нидерландский", + "languages.dzo": "Дзонг-кэ", + "languages.eng": "Английский", + "languages.epo": "Эсперанто", + "languages.est": "Эстонский", + "languages.ewe": "Эве", + "languages.fao": "Фарерский", + "languages.fij": "Фиджийский", + "languages.fin": "Финский", + "languages.fra": "Французский", + "languages.ful": "Фула", + "languages.glg": "Галисийский", + "languages.kat": "Грузинский", + "languages.deu": "Немецкий", + "languages.ell": "Греческий", + "languages.grn": "Гуарани", + "languages.guj": "Гуджарати", + "languages.hat": "Гаитянский креольский", + "languages.hau": "Хауса", + "languages.hed": "Иврит", + "languages.her": "Гереро", + "languages.hin": "Хинди", + "languages.hmo": "Хири-моту", + "languages.hun": "Венгерский", + "languages.ina": "Интерлингва", + "languages.ind": "Индонезийский", + "languages.ile": "Окциденталь", + "languages.gle": "Ирландский", + "languages.ibo": "Игбо", + "languages.ipk": "Инюпик", + "languages.ido": "Идо", + "languages.isl": "Исландский", + "languages.ita": "Итальянский", + "languages.iku": "Инуктитут", + "languages.jpn": "Японский", + "languages.jav": "Яванский", + "languages.kal": "Гренландский", + "languages.kan": "Ка́ннада (дравидийский)", + "languages.kau": "Канури", + "languages.kas": "Кашмирский", + "languages.kaz": "Казахский", + "languages.khm": "Кхмерский", + "languages.kik": "Кикуйю", + "languages.kin": "Руанда", + "languages.kir": "Киргизский", + "languages.kom": "Коми", + "languages.kon": "Конго", + "languages.kor": "Корейский", + "languages.kur": "Курдский", + "languages.kua": "Кваньяма", + "languages.lat": "Латинский", + "languages.ltz": "Люксембургский", + "languages.lug": "Луганда", + "languages.lim": "Лимбургский", + "languages.lin": "Лингала", + "languages.lao": "Лаосский", + "languages.lit": "Литовский", + "languages.lub": "Луба-катанга", + "languages.lav": "Латышский", + "languages.glv": "Мэнский", + "languages.mkd": "Македонский", + "languages.mlg": "Малагасийский", + "languages.msa": "Малайский", + "languages.mal": "Малаялам", + "languages.mlt": "Мальтийский", + "languages.mri": "Маори", + "languages.mar": "Маратхи", + "languages.mah": "Маршалльский", + "languages.mon": "Монгольский", + "languages.nau": "Науру", + "languages.nav": "Навахо", + "languages.nob": "Букмол (норвежский)", + "languages.nde": "Северный ндебеле", + "languages.nep": "Непальский", + "languages.ndo": "Ндонга", + "languages.nno": "Нюнорск (норвежский)", + "languages.nor": "Норвежский", + "languages.iii": "Носу (сычуаньский)", + "languages.nbl": "Южный ндебеле", + "languages.oci": "Окситанский", + "languages.oji": "Оджибве", + "languages.chu": "Старославянский", + "languages.orm": "Оромо", + "languages.ori": "Ория", + "languages.oss": "Осетинский", + "languages.pan": "Панджаби", + "languages.pli": "Пали", + "languages.fas": "Персидский", + "languages.pol": "Польский", + "languages.pus": "Пушту", + "languages.por": "Португальский", + "languages.que": "Кечуанский", + "languages.roh": "Ретороманский диалект", + "languages.run": "Рунди", + "languages.ron": "Румынский", + "languages.rus": "Русский", + "languages.san": "Санскрит", + "languages.srd": "Сардинский", + "languages.snd": "Синди", + "languages.sme": "Северносаамский", + "languages.smo": "Самоанский", + "languages.sag": "Санго", + "languages.srp": "Сербский", + "languages.gla": "Гэльский", + "languages.sna": "Шона", + "languages.sin": "Сингальский", + "languages.slk": "Словацкий", + "languages.slv": "Словенский", + "languages.som": "Сомали", + "languages.sot": "Сесото", + "languages.spa": "Испанский", + "languages.sun": "Суданский", + "languages.swa": "Суахили", + "languages.ssw": "Свати", + "languages.swe": "Шведский", + "languages.tam": "Тамильский", + "languages.tel": "Телугу", + "languages.tgk": "Таджикский", + "languages.tha": "Тайский", + "languages.tir": "Тигринья", + "languages.bod": "Тибетский Стандартный", + "languages.tuk": "Туркменский", + "languages.tgl": "Тагальский", + "languages.tsn": "Тсвана", + "languages.ton": "Тонга", + "languages.tur": "Турецкий", + "languages.tso": "Тсонга", + "languages.tat": "Татарский", + "languages.twi": "Тви", + "languages.tah": "Таитянский", + "languages.uig": "Уйгурский", + "languages.ukr": "Украинский", + "languages.urd": "Урду", + "languages.uzb": "Узбекский", + "languages.ven": "Венда", + "languages.vie": "Вьетнамский", + "languages.vol": "Волапюк", + "languages.win": "Валлонский", + "languages.cym": "Валлийский", + "languages.wol": "Волоф", + "languages.fry": "Фризский", + "languages.xho": "Коса", + "languages.yid": "Идиш", + "languages.yor": "Йоруба", + "languages.zha": "Чжуанский", + "languages.zul": "Зулусский", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_sl.json b/sources/lang/Localization_sl.json new file mode 100644 index 0000000..01e6429 --- /dev/null +++ b/sources/lang/Localization_sl.json @@ -0,0 +1,293 @@ +{ + "about.title": "About COPS", + "allbooks.alphabetical.many": "Alphabetical index of the {0} books", + "allbooks.alphabetical.none": "Alphabetical index of absolutely no books", + "allbooks.alphabetical.one": "Alphabetical index of the single book", + "allbooks.title": "All books", + "authors.alphabetical.many": "Alphabetical index of the {0} authors", + "authors.alphabetical.none": "Alphabetical index of absolutely no authors", + "authors.alphabetical.one": "Alphabetical index of the single author", + "authors.title": "Authors", + "authorword.many": "{0} authors", + "authorword.none": "No authors", + "authorword.one": "1 author", + "bookentry.author": "{0} by {1}", + "bookword.many": "{0} books", + "bookword.none": "No books", + "bookword.one": "1 book", + "bookword.title": "Books", + "cog.alternate": "Search, sort and filters", + "content.series": "Series:", + "content.series.data": "Book {0} in the {1} series", + "content.summary": "Povzetek", + "customcolumn.boolean.no": "Ne", + "customcolumn.boolean.unknown": "Ni določeno", + "customcolumn.boolean.yes": "Da", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Ni določeno", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Alphabetical index of the {0} series", + "customcolumn.description.series.none": "Alphabetical index of absolutely no series", + "customcolumn.description.series.one": "Alphabetical index of the single series", + "customcolumn.enum.unknown": "Ni določeno", + "customcolumn.float.unknown": "Ni določeno", + "customcolumn.int.unknown": "Ni določeno", + "customcolumn.rating.unknown": "Ni določeno", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Set your email (to allow book emailing)", + "customize.fancybox": "Use Lightbox (books load in floating frame)", + "customize.filter": "Enable tag filtering", + "customize.ignored": "Ignored categories", + "customize.paging": "Max number of books per page (-1 to disable)", + "customize.style": "Theme", + "customize.title": "Customize COPS UI", + "home.alternate": "Domov", + "i18n.coversection": "Cover", + "language.title": "Jezik", + "languages.alphabetical.many": "Alphabetical index of the {0} languages", + "languages.alphabetical.none": "Alphabetical index of absolutely no languages", + "languages.alphabetical.one": "Alphabetical index of the single language", + "languages.title": "Languages", + "mail.messagenotsent": "Message could not be sent.", + "mail.messagesent": "Message has been sent", + "paging.next.alternate": "Naprej", + "paging.previous.alternate": "Prejšnje", + "permalink.alternate": "Permalink", + "pubdate.title": "Publication year", + "publisher.name": "Publisher", + "publishers.alphabetical.many": "Alphabetical index of the {0} publishers", + "publishers.alphabetical.none": "Alphabetical index of absolutely no publishers", + "publishers.alphabetical.one": "Alphabetical index of the single publisher", + "publishers.title": "Publishers", + "publisherword.many": "{0} publishers", + "publisherword.none": "No publishers", + "publisherword.one": "1 publisher", + "ratings.many": "{0} ratings", + "ratings.none": "no ratings", + "ratings.one": "1 rating", + "ratings.title": "Ratings", + "ratingword.many": "{0} stars", + "ratingword.none": "No star", + "ratingword.one": "1 star", + "recent.list": "{0} most recent books", + "recent.title": "Recent additions", + "search.alternate": "Iskanje", + "search.result": "Search result for *{0}*", + "search.result.author": "Search result for *{0}* in authors", + "search.result.book": "Search result for *{0}* in books", + "search.result.publisher": "Search result for *{0}* in publishers", + "search.result.series": "Search result for *{0}* in series", + "search.result.tag": "Search result for *{0}* in tags", + "search.sortorder.asc": "Asc", + "search.sortorder.desc": "Desc", + "series.alphabetical.many": "Alphabetical index of the {0} series", + "series.alphabetical.none": "Alphabetical index of absolutely no series", + "series.alphabetical.one": "Alphabetical index of the single series", + "series.title": "Series", + "seriesword.many": "{0} series", + "seriesword.none": "No series", + "seriesword.one": "1 series", + "sort.alternate": "Razvrsti", + "splitByLetter.book.other": "Other books", + "splitByLetter.letter": "{0} starting with {1}", + "tags.alphabetical.many": "Alphabetical index of the {0} tags", + "tags.alphabetical.none": "Alphabetical index of absolutely no tags", + "tags.alphabetical.one": "Alphabetical index of the single tag", + "tags.title": "Tags", + "tagword.many": "{0} tags", + "tagword.none": "No tags", + "tagword.one": "1 tag", + "tagword.title": "Tags", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanian", + "languages.amh": "Amharic", + "languages.ara": "Arabic", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Basque", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgarian", + "languages.mya": "Burmese", + "languages.cat": "Catalan", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chinese", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croatian", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "English", + "languages.epo": "Esperanto", + "languages.est": "Estonian", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "French", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "German", + "languages.ell": "Greek", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitian", + "languages.hau": "Hausa", + "languages.hed": "Hebrew", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarian", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italian", + "languages.iku": "Inuktitut", + "languages.jpn": "Japanese", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Korean", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolian", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norwegian", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persian", + "languages.pol": "Polish", + "languages.pus": "Pashto", + "languages.por": "Portuguese", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Romanian", + "languages.rus": "Russian", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbian", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spanish", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrainian", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamese", + "languages.vol": "Volapük", + "languages.win": "Walloon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_sr.json b/sources/lang/Localization_sr.json new file mode 100644 index 0000000..52f1428 --- /dev/null +++ b/sources/lang/Localization_sr.json @@ -0,0 +1,293 @@ +{ + "about.title": "About COPS", + "allbooks.alphabetical.many": "Азбучни индекс {0} књига", + "allbooks.alphabetical.none": "Азбучни индекс без књига", + "allbooks.alphabetical.one": "Азбучни индекс једне књиге", + "allbooks.title": "Све књиге", + "authors.alphabetical.many": "Азбучни индекс {0} аутора", + "authors.alphabetical.none": "Азбучни индекс без аутора", + "authors.alphabetical.one": "Азбучни индекс једног аутора", + "authors.title": "Аутори", + "authorword.many": "{0} аутора", + "authorword.none": "Нема аутора", + "authorword.one": "1 аутор", + "bookentry.author": "{0} до {1}", + "bookword.many": "{0} књига", + "bookword.none": "Нема књига", + "bookword.one": "1 књига", + "bookword.title": "Књиге", + "cog.alternate": "Претрага, филтери и сортирање", + "content.series": "Комплет:", + "content.series.data": "Књига {0} у {1} комплету", + "content.summary": "Укупно", + "customcolumn.boolean.no": "No", + "customcolumn.boolean.unknown": "Not Set", + "customcolumn.boolean.yes": "Yes", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Not Set", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Alphabetical index of the {0} series", + "customcolumn.description.series.none": "Alphabetical index of absolutely no series", + "customcolumn.description.series.one": "Alphabetical index of the single series", + "customcolumn.enum.unknown": "Not Set", + "customcolumn.float.unknown": "Not Set", + "customcolumn.int.unknown": "Not Set", + "customcolumn.rating.unknown": "Not Set", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Поставите вашу адресу (да се омогући слање књиге)", + "customize.fancybox": "Користи Lightbox", + "customize.filter": "Омогућити филтрирање по таговима", + "customize.ignored": "Категорије које се приказују", + "customize.paging": "Максималан број књига по страни (-1 онемогућити)", + "customize.style": "Тема", + "customize.title": "Подешавање COPS корисничког прегледа", + "home.alternate": "Почетна", + "i18n.coversection": "Насловна", + "language.title": "Језик", + "languages.alphabetical.many": "Азбучни индекс {0} језика", + "languages.alphabetical.none": "Индекс без језика", + "languages.alphabetical.one": "Азбучни индекс једног језика", + "languages.title": "Језици", + "mail.messagenotsent": "Поруку није могуће послати.", + "mail.messagesent": "Порука је послата", + "paging.next.alternate": "Следеће", + "paging.previous.alternate": "Претходно", + "permalink.alternate": "Везе", + "pubdate.title": "Година издања", + "publisher.name": "Издавач", + "publishers.alphabetical.many": "Азбучни индекс {0} издавача", + "publishers.alphabetical.none": "Индекс без издавача", + "publishers.alphabetical.one": "Индекс једног издавача", + "publishers.title": "Издавачи", + "publisherword.many": "{0} издавача", + "publisherword.none": "Нема издавача", + "publisherword.one": "1 издавач", + "ratings.many": "{0} ratings", + "ratings.none": "no ratings", + "ratings.one": "1 rating", + "ratings.title": "Ratings", + "ratingword.many": "{0} stars", + "ratingword.none": "No star", + "ratingword.one": "1 star", + "recent.list": "{0} најновије књиге", + "recent.title": "Последње постављено", + "search.alternate": "Претрага", + "search.result": "Резултати претраге за *{0}*", + "search.result.author": "Резултат претраге за *{0}* у ауторима", + "search.result.book": "Резултат претраге за *{0}* у књигама", + "search.result.publisher": "Резултат претраге за *{0}* у издавачима", + "search.result.series": "Резултат претраге за *{0}* у комплетима", + "search.result.tag": "Резултат претраге за *{0}* у ознакама", + "search.sortorder.asc": "Растуће", + "search.sortorder.desc": "Опадајуће", + "series.alphabetical.many": "Азбучни индекс {0} комплета", + "series.alphabetical.none": "Азбучни индекс без комплета", + "series.alphabetical.one": "Азбучни индекс у једном комплету", + "series.title": "Комплети", + "seriesword.many": "{0} комплета", + "seriesword.none": "Нема комплета", + "seriesword.one": "1 комплет", + "sort.alternate": "Сертирање", + "splitByLetter.book.other": "Друге књиге", + "splitByLetter.letter": "{0} почиње {1}", + "tags.alphabetical.many": "Азбучни индекс у {0} ознакама", + "tags.alphabetical.none": "Азбучни индекс без ознака", + "tags.alphabetical.one": "Азбучни индекс једне ознаке", + "tags.title": "Ознаке", + "tagword.many": "{0} ознака", + "tagword.none": "Нема ознака", + "tagword.one": "1 ознака", + "tagword.title": "Ознаке", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanian", + "languages.amh": "Amharic", + "languages.ara": "Arabic", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Basque", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgarian", + "languages.mya": "Burmese", + "languages.cat": "Catalan", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chinese", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croatian", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "English", + "languages.epo": "Esperanto", + "languages.est": "Estonian", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "French", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "German", + "languages.ell": "Greek", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitian", + "languages.hau": "Hausa", + "languages.hed": "Hebrew", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarian", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italian", + "languages.iku": "Inuktitut", + "languages.jpn": "Japanese", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Korean", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolian", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norwegian", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persian", + "languages.pol": "Polish", + "languages.pus": "Pashto", + "languages.por": "Portuguese", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Romanian", + "languages.rus": "Russian", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbian", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spanish", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrainian", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamese", + "languages.vol": "Volapük", + "languages.win": "Walloon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_sv.json b/sources/lang/Localization_sv.json new file mode 100644 index 0000000..90de410 --- /dev/null +++ b/sources/lang/Localization_sv.json @@ -0,0 +1,293 @@ +{ + "about.title": "Om COPS", + "allbooks.alphabetical.many": "Alfabetisk lista över {0} böcker", + "allbooks.alphabetical.none": "Alfabetisk lista över inte en enda bok", + "allbooks.alphabetical.one": "Alfabetisk lista över en enda bok", + "allbooks.title": "Alla böcker", + "authors.alphabetical.many": "Alfabetisk lista över {0} författare", + "authors.alphabetical.none": "Alfabetisk lista över inte en enda författare", + "authors.alphabetical.one": "Alfabetisk lista över en enda författare", + "authors.title": "Författare", + "authorword.many": "{0} författare", + "authorword.none": "Inga författare", + "authorword.one": "1 författare", + "bookentry.author": "{0} av {1}", + "bookword.many": "{0} böcker", + "bookword.none": "Inga böcker", + "bookword.one": "1 bok", + "bookword.title": "Böcker", + "cog.alternate": "Sök, sortera och filtrera", + "content.series": "Serier:", + "content.series.data": "Bok {0} i {1} serien", + "content.summary": "Sammanfattning", + "customcolumn.boolean.no": "Nej", + "customcolumn.boolean.unknown": "Ej Defijerat", + "customcolumn.boolean.yes": "Ja", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Ej Defijerat", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Alfabetisk lista över {0} serier", + "customcolumn.description.series.none": "Alfabetisk lista över inte en enda serie", + "customcolumn.description.series.one": "Alfabetisk lista över en enda serie", + "customcolumn.enum.unknown": "Ej Defijerat", + "customcolumn.float.unknown": "Ej Defijerat", + "customcolumn.int.unknown": "Ej Defijerat", + "customcolumn.rating.unknown": "Ej Defijerat", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Ange din epostadress (för att aktivera epost)", + "customize.fancybox": "Använd ljusbord", + "customize.filter": "Använd etikettfiltrering", + "customize.ignored": "Ignorerade kategorier", + "customize.paging": "Max antal böcker per sida (-1 för att inaktivera)", + "customize.style": "Tema", + "customize.title": "Anpassa COPS utseende", + "home.alternate": "Hem", + "i18n.coversection": "Framsida", + "language.title": "Språk", + "languages.alphabetical.many": "Alfabetisk lista över {0} språk", + "languages.alphabetical.none": "Alfabetisk lista över inte ett enda språk", + "languages.alphabetical.one": "Alfabetisk lista över ett enda spåk", + "languages.title": "Språk", + "mail.messagenotsent": "Mejlet kunde inte skickas.", + "mail.messagesent": "Mejlet är skickat", + "paging.next.alternate": "Nästa", + "paging.previous.alternate": "Föregående", + "permalink.alternate": "Permalink", + "pubdate.title": "Tryckår", + "publisher.name": "Förlag", + "publishers.alphabetical.many": "Alfabetisk lista över {0} förlag", + "publishers.alphabetical.none": "Alfabetisk lista över inte ett enda förlag", + "publishers.alphabetical.one": "Alfabetisk lista över ett enda förlag", + "publishers.title": "Förlag", + "publisherword.many": "{0} förlag", + "publisherword.none": "Inget förlag", + "publisherword.one": "1 förlag", + "ratings.many": "{0} ratings", + "ratings.none": "no ratings", + "ratings.one": "1 rating", + "ratings.title": "Ratings", + "ratingword.many": "{0} stars", + "ratingword.none": "No star", + "ratingword.one": "1 star", + "recent.list": "De {0} senaste böckerna", + "recent.title": "Nya böcker", + "search.alternate": "Sök", + "search.result": "Sökresultat för *{0}*", + "search.result.author": "Sökresultat för *{0}* i författare", + "search.result.book": "Sökresultat för *{0}* i böcker", + "search.result.publisher": "Sökresultat för *{0}* i förlag", + "search.result.series": "Sökresultat för *{0}* i serier", + "search.result.tag": "Sökresultat för *{0}* i etiketter", + "search.sortorder.asc": "Stigande", + "search.sortorder.desc": "Fallande", + "series.alphabetical.many": "Alfabetisk lista över {0} serier", + "series.alphabetical.none": "Alfabetisk lista över inte en enda serie", + "series.alphabetical.one": "Alfabetisk lista över en enda serie", + "series.title": "Serier", + "seriesword.many": "inga serier{0} serier", + "seriesword.none": "No series", + "seriesword.one": "1 serie", + "sort.alternate": "Sortera", + "splitByLetter.book.other": "Övriga böcker", + "splitByLetter.letter": "{0} börjar med {1}", + "tags.alphabetical.many": "Alfabetisk lista över {0} etiketter", + "tags.alphabetical.none": "Alfabetisk lista över inte en enda etikett", + "tags.alphabetical.one": "Alfabetisk lista över en enda etikett", + "tags.title": "Etiketter", + "tagword.many": "{0} etiketter", + "tagword.none": "Inga etiketter", + "tagword.one": "1 etikett", + "tagword.title": "Etiketter", + "languages.abk": "Abchaziska", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanska", + "languages.amh": "Amhariska", + "languages.ara": "Arabiska", + "languages.arg": "Aragonska", + "languages.hye": "Armenska", + "languages.asm": "Assamesiska", + "languages.ava": "Avariska", + "languages.ave": "Avestiska", + "languages.aym": "Aymara", + "languages.aze": "Azerbajdzjanska", + "languages.bam": "Bambara", + "languages.bak": "Basjkiriska", + "languages.eus": "Baskiska", + "languages.bel": "Vitrysska", + "languages.ben": "Bengali", + "languages.bih": "Bihariska", + "languages.bis": "Bislama", + "languages.bos": "Bosniska", + "languages.bre": "Bretonska", + "languages.bul": "Bulgariska", + "languages.mya": "Burmesiska", + "languages.cat": "Katalanska", + "languages.cha": "Chamorro", + "languages.che": "Tjetjenska", + "languages.nya": "Chichewa", + "languages.zho": "Kinesiska", + "languages.chv": "Chuvash", + "languages.cor": "Korniska", + "languages.cos": "Korsikanska", + "languages.cre": "Cree", + "languages.hrv": "Kroatiska", + "languages.ces": "Tjeckiska", + "languages.dan": "Danska", + "languages.div": "Divehi", + "languages.nld": "Holländska", + "languages.dzo": "Dzongkha", + "languages.eng": "Engelska", + "languages.epo": "Esperanto", + "languages.est": "Estniska", + "languages.ewe": "Ewe", + "languages.fao": "Färöiska", + "languages.fij": "Fijianska", + "languages.fin": "Finska", + "languages.fra": "Franska", + "languages.ful": "Fula", + "languages.glg": "Galiciska", + "languages.kat": "Georgiska", + "languages.deu": "Tyska", + "languages.ell": "Grekiska", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitisk kreol", + "languages.hau": "Hausa", + "languages.hed": "Hebreiska", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Ungerska", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Iriska", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Isländska", + "languages.ita": "Italienska", + "languages.iku": "Inuktitut", + "languages.jpn": "Japanska", + "languages.jav": "Javanesiska", + "languages.kal": "Grönländska", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiriska", + "languages.kaz": "Kazakiska", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kirgisiska", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Koreanska", + "languages.kur": "Kurdiska", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgiska", + "languages.lug": "Ganda", + "languages.lim": "Limburgiska", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Litauiska", + "languages.lub": "Luba-Katanga", + "languages.lav": "Lettiska", + "languages.glv": "Manx", + "languages.mkd": "Makedonska", + "languages.mlg": "Malagassiska", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltesiska", + "languages.mri": "Maori", + "languages.mar": "Marathi", + "languages.mah": "Marshallesiska", + "languages.mon": "Mongoliska", + "languages.nau": "Nauriska", + "languages.nav": "Navajo", + "languages.nob": "Norska Bokmål", + "languages.nde": "Nordndebele", + "languages.nep": "Nepalesiska", + "languages.ndo": "Ndonga", + "languages.nno": "Nynorsk", + "languages.nor": "Norska", + "languages.iii": "Nuosu", + "languages.nbl": "Sydndebele", + "languages.oci": "Occitanska", + "languages.oji": "Ojibwe", + "languages.chu": "Kyrkslaviska", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetiska", + "languages.pan": "Punjabiska", + "languages.pli": "Pali", + "languages.fas": "Persiska", + "languages.pol": "Polska", + "languages.pus": "Pashto", + "languages.por": "Portugisiska", + "languages.que": "Quechua", + "languages.roh": "Rätoromanska", + "languages.run": "Kirundi", + "languages.ron": "Rumänska", + "languages.rus": "Rysska", + "languages.san": "Sanskrit", + "languages.srd": "Sardiska", + "languages.snd": "Sindhi", + "languages.sme": "Nordsamiska", + "languages.smo": "Samoanska", + "languages.sag": "Sango", + "languages.srp": "Serbiska", + "languages.gla": "Skotsk gaeliska", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovakiska", + "languages.slv": "Slovenska", + "languages.som": "Somaliska", + "languages.sot": "Sesotho", + "languages.spa": "Spanska", + "languages.sun": "Sundanesiska", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Svenska", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajikiska", + "languages.tha": "Thailändska", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetanska", + "languages.tuk": "Turkmeniska", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkiska", + "languages.tso": "Tsonga", + "languages.tat": "Tatariska", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uiguriska", + "languages.ukr": "Ukrainska", + "languages.urd": "Urdu", + "languages.uzb": "Uzbekiska", + "languages.ven": "Venda", + "languages.vie": "Vietnamesiska", + "languages.vol": "Volapük", + "languages.win": "Vallonska", + "languages.cym": "Walesiska", + "languages.wol": "Wolof", + "languages.fry": "Västfrisiska", + "languages.xho": "Xhosa", + "languages.yid": "Jiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_tr.json b/sources/lang/Localization_tr.json new file mode 100644 index 0000000..6f7e0ad --- /dev/null +++ b/sources/lang/Localization_tr.json @@ -0,0 +1,293 @@ +{ + "about.title": "COPS Hakkında", + "allbooks.alphabetical.many": "Alfabeye göre sıralanmış {0} Kitap", + "allbooks.alphabetical.none": "Alfabeye göre sıralanmış 0 Kitap", + "allbooks.alphabetical.one": "Alfabeye göre sıralanmış 1 Kitap", + "allbooks.title": "Bütün Kitaplar", + "authors.alphabetical.many": "Alfabeye göre sıralanmış {0} Yazar", + "authors.alphabetical.none": "Alfabeye göre sıralanmış 0 Yazar", + "authors.alphabetical.one": "Alfabeye göre sıralanmış 1Yazar", + "authors.title": "Yazarlar", + "authorword.many": "{0} Yazar", + "authorword.none": "0 Yazar", + "authorword.one": "1 Yazar", + "bookentry.author": "{1}'den {0}.", + "bookword.many": "{0} Kitap", + "bookword.none": "0 Kitap", + "bookword.one": "1 Kitap", + "bookword.title": "Kitaplar", + "cog.alternate": "Arama, sıralama ve filtreleme", + "content.series": "Seriler:", + "content.series.data": "{1} Serisinin {0}. Kitabı", + "content.summary": "Bilgi", + "customcolumn.boolean.no": "Hayır", + "customcolumn.boolean.unknown": "Ayarlı değil", + "customcolumn.boolean.yes": "Evet", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Ayarlı değil", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Alfabeye göre sıralanmış {0} Seri", + "customcolumn.description.series.none": "Alfabeye göre sıralanmış 0 Seri", + "customcolumn.description.series.one": "Alfabeye göre sıralanmış 1 Seri", + "customcolumn.enum.unknown": "Ayarlı değil", + "customcolumn.float.unknown": "Ayarlı değil", + "customcolumn.int.unknown": "Ayarlı değil", + "customcolumn.rating.unknown": "Ayarlı değil", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "E-Mail Adresi (kitap gönderilebilmesi için)", + "customize.fancybox": "Lightbox kullan (Kitap bilgileri yeni sayfa açılmasına gerek kalmadan görüntülenir)", + "customize.filter": "Etiket Filtreleme'yi Etkinleştir", + "customize.ignored": "Yoksayılan Kategoriler", + "customize.paging": "Bir sayfada gösterilecek en fazla kitap sayısı (Sınırsız için -1)", + "customize.style": "Tema", + "customize.title": "Görünüm Seçenekleri", + "home.alternate": "Anasayfa", + "i18n.coversection": "Kapak", + "language.title": "Dil", + "languages.alphabetical.many": "Alfabeye göre sıralanmış {0} Dil", + "languages.alphabetical.none": "Alfabeye göre sıralanmış 0 Dil", + "languages.alphabetical.one": "Alfabeye göre sıralanmış 1 Dil", + "languages.title": "Diller", + "mail.messagenotsent": "Mesaj gönderilemedi.", + "mail.messagesent": "Mesaj gönderildi.", + "paging.next.alternate": "Sonraki", + "paging.previous.alternate": "Önceki", + "permalink.alternate": "Kalıcı Bağlantı", + "pubdate.title": "Yayımlanma Yılı", + "publisher.name": "Yayınevi", + "publishers.alphabetical.many": "Alfabeye göre sıralanmış {0} Yayınevi", + "publishers.alphabetical.none": "Alfabeye göre sıralanmış 0 Yayınevi", + "publishers.alphabetical.one": "Alfabeye göre sıralanmış 1 Yayınevi", + "publishers.title": "Yayınevleri", + "publisherword.many": "{0} Yayınevi", + "publisherword.none": "0 Yayınevi", + "publisherword.one": "1 Yayınevi", + "ratings.many": "{0} Derecelendirme", + "ratings.none": "0 Derecelendirme", + "ratings.one": "1 Derecelendirme", + "ratings.title": "Derecelendirmeler", + "ratingword.many": "{0} Yıldız", + "ratingword.none": "0 Yıldız", + "ratingword.one": "1 Yıldız", + "recent.list": "Son Eklenen {0} Kitap", + "recent.title": "Son Eklenenler", + "search.alternate": "Arama", + "search.result": "*{0}* için arama sonuçları", + "search.result.author": "*{0}* için yazarlarda arama sonuçları", + "search.result.book": "*{0}* için kitaplarda arama sonuçları", + "search.result.publisher": "*{0}* için yayınevlerinde arama sonuçları", + "search.result.series": "*{0}* için serilerde arama sonuçları", + "search.result.tag": "*{0}* için etiketlerde arama sonuçları", + "search.sortorder.asc": "Artan", + "search.sortorder.desc": "Azalan", + "series.alphabetical.many": "Alfabeye göre sıralanmış {0} Seri", + "series.alphabetical.none": "Alfabeye göre sıralanmış 0 Seri", + "series.alphabetical.one": "Alfabeye göre sıralanmış 1 Seri", + "series.title": "Seriler", + "seriesword.many": "{0} Seri", + "seriesword.none": "0 Seri", + "seriesword.one": "1 Seri", + "sort.alternate": "Sıralama", + "splitByLetter.book.other": "Diğer Kitaplar", + "splitByLetter.letter": "{1} ile başlayan {0}", + "tags.alphabetical.many": "Alfabeye göre sıralanmış {0} Etiket", + "tags.alphabetical.none": "Alfabeye göre sıralanmış 0 Etiket", + "tags.alphabetical.one": "Alfabeye göre sıralanmış 1 Etiket", + "tags.title": "Etiketler", + "tagword.many": "{0} Etiket", + "tagword.none": "0 Etiket", + "tagword.one": "1 Etiket", + "tagword.title": "Etiketler", + "languages.abk": "Abhazya Dili", + "languages.aaf": "Afar Dili", + "languages.afr": "Afrikanca", + "languages.aka": "Akanca (Afrika dili)", + "languages.sqi": "Arnavutça", + "languages.amh": "Etiyopyaca", + "languages.ara": "Arapça", + "languages.arg": "Aragonca (İspanya)", + "languages.hye": "Ermenice", + "languages.asm": "Assamese (Hindistan)", + "languages.ava": "Avarca", + "languages.ave": "Avestan (Eski İran)", + "languages.aym": "Aymara (Güney Amerika)", + "languages.aze": "Azerice", + "languages.bam": "Bambara (Mali)", + "languages.bak": "Başkırca", + "languages.eus": "Baskça", + "languages.bel": "Beyaz Rusça", + "languages.ben": "Bengalce", + "languages.bih": "Bihari", + "languages.bis": "Bislama (Vanuatu; Kuzey Pasifik)", + "languages.bos": "Boşnakça", + "languages.bre": "Bretonca", + "languages.bul": "Bulgarca", + "languages.mya": "Burmaca", + "languages.cat": "Katalanca", + "languages.cha": "Chamorro Dili (Guam adaları)", + "languages.che": "Çeçence", + "languages.nya": "Chichewa Dili", + "languages.zho": "Çince", + "languages.chv": "Çuvaş (Türkçe)", + "languages.cor": "Cornish (Kelt)", + "languages.cos": "Korsikaca", + "languages.cre": "Cree (Kuzey Amerika yerlileri)", + "languages.hrv": "Hırvatça", + "languages.ces": "Çekçe", + "languages.dan": "Danca", + "languages.div": "Divehi dili", + "languages.nld": "Hollandaca", + "languages.dzo": "Dzongkha (Butan)", + "languages.eng": "İngilizce", + "languages.epo": "Esperanto Dili", + "languages.est": "Estonca", + "languages.ewe": "Ewe Dili (Afrika)", + "languages.fao": "Faroece", + "languages.fij": "Fiji dili", + "languages.fin": "Fince", + "languages.fra": "Fransızca", + "languages.ful": "Fulah (Afrika)", + "languages.glg": "Galce", + "languages.kat": "Gürcüce", + "languages.deu": "Almanca", + "languages.ell": "Yunanca", + "languages.grn": "Guarani (Paraguay)", + "languages.guj": "Gucaratça", + "languages.hat": "Haiti Dili", + "languages.hau": "Hausa Dili", + "languages.hed": "İbranice", + "languages.her": "Herero Dili", + "languages.hin": "Hintçe", + "languages.hmo": "Hiri Motu Dili", + "languages.hun": "Macarca", + "languages.ina": "Interlingua (Uluslararası Yardımcı Dil Kurumu)", + "languages.ind": "Endonezyaca", + "languages.ile": "Interlingue Dili", + "languages.gle": "İrlandaca", + "languages.ibo": "Igbo Dili", + "languages.ipk": "Inupiak Dili", + "languages.ido": "Ido Dili", + "languages.isl": "İzlandaca", + "languages.ita": "İtalyanca", + "languages.iku": "İnuitçe", + "languages.jpn": "Japonca", + "languages.jav": "Cava Dili", + "languages.kal": "Kalaallisut Dili", + "languages.kan": "Kannada Dili", + "languages.kau": "Kanuri Dili", + "languages.kas": "Keşmirce", + "languages.kaz": "Kazakça", + "languages.khm": "Khmer Dili", + "languages.kik": "Kikuyu Dili", + "languages.kin": "Kinyarwanda Dili", + "languages.kir": "Kırgızca", + "languages.kom": "Komi Dili", + "languages.kon": "Kongo Dili", + "languages.kor": "Korece", + "languages.kur": "Kürtçe", + "languages.kua": "Kwanyama Dili", + "languages.lat": "Latince", + "languages.ltz": "Lüksemburg Dili", + "languages.lug": "Ganda Dili", + "languages.lim": "Liburg Dili", + "languages.lin": "Lingala Dili", + "languages.lao": "Lao Dili", + "languages.lit": "Litvanca", + "languages.lub": "Luba-Katanga Dili", + "languages.lav": "Letonca", + "languages.glv": "Manx Dili (Galler)", + "languages.mkd": "Makedonca", + "languages.mlg": "Madagaskar Dili", + "languages.msa": "Malay Dili", + "languages.mal": "Malayalam Dili", + "languages.mlt": "Malta Dili", + "languages.mri": "Maorice", + "languages.mar": "Marathi Dili", + "languages.mah": "Marshall Dili", + "languages.mon": "Moğolca", + "languages.nau": "Nauru Dili", + "languages.nav": "Navajo Dili", + "languages.nob": "Norveççe Bokmal", + "languages.nde": "Ndebele; Kuzey", + "languages.nep": "Nepal Dili", + "languages.ndo": "Ndonga Dili", + "languages.nno": "Norveççe Nynorsk", + "languages.nor": "Norveçce", + "languages.iii": "Nuosu Dili", + "languages.nbl": "Ndebele; Güney", + "languages.oci": "Oksitanca", + "languages.oji": "Ojibwe Dili", + "languages.chu": "Slav; Eski", + "languages.orm": "Oromo Dili", + "languages.ori": "Oriya Dili", + "languages.oss": "Osetya Dili", + "languages.pan": "Pencabi Dili", + "languages.pli": "Pali Dili", + "languages.fas": "Farsça", + "languages.pol": "Lehçe", + "languages.pus": "Peştuca", + "languages.por": "Portekizce", + "languages.que": "Quechua Dili", + "languages.roh": "Romanca", + "languages.run": "Kirundi Dili", + "languages.ron": "Rumence", + "languages.rus": "Rusça", + "languages.san": "Sanskritçe", + "languages.srd": "Sardinya Dili", + "languages.snd": "Sindhi Dili", + "languages.sme": "Sami; Kuzeyli", + "languages.smo": "Samoa Dili", + "languages.sag": "Sangho Dili", + "languages.srp": "Sırpça", + "languages.gla": "Galce; İskoçyalı", + "languages.sna": "Shona Dili", + "languages.sin": "Sinhala Dili", + "languages.slk": "Slovakça", + "languages.slv": "Slovence", + "languages.som": "Somali Dili", + "languages.sot": "Güney Sotho Dili", + "languages.spa": "İspanyolca", + "languages.sun": "Sudan Dili", + "languages.swa": "Svahili dili", + "languages.ssw": "Siswati Dili", + "languages.swe": "İsveççe", + "languages.tam": "Tamil Dili", + "languages.tel": "Telugu Dili", + "languages.tgk": "Tacikçe", + "languages.tha": "Taylandça", + "languages.tir": "Tigrinya Dili", + "languages.bod": "Tibetçe", + "languages.tuk": "Türkmence", + "languages.tgl": "Tagalog Dili", + "languages.tsn": "Tsvana Dili", + "languages.ton": "Tonga Dili", + "languages.tur": "Türkçe", + "languages.tso": "Tsonga Dili", + "languages.tat": "Tatarca", + "languages.twi": "Twi Dili", + "languages.tah": "Tahitice", + "languages.uig": "Uygurca", + "languages.ukr": "Ukraynaca", + "languages.urd": "Urduca", + "languages.uzb": "Özbekçe", + "languages.ven": "Venda Dili", + "languages.vie": "Vietnam Dili", + "languages.vol": "Volapük Dili", + "languages.win": "Valon Dili", + "languages.cym": "Galce", + "languages.wol": "Volof Dili", + "languages.fry": "Batı Frizce", + "languages.xho": "Zosa dili", + "languages.yid": "Yidiş Dili", + "languages.yor": "Yoruba Dili", + "languages.zha": "Zhuang Dili", + "languages.zul": "Zulu Dili", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_ua.json b/sources/lang/Localization_ua.json new file mode 100644 index 0000000..1d701f0 --- /dev/null +++ b/sources/lang/Localization_ua.json @@ -0,0 +1,293 @@ +{ + "about.title": "Про COPS", + "allbooks.alphabetical.many": "Алфавітний покажчик {0} книг(и)", + "allbooks.alphabetical.none": "Назви не вказані", + "allbooks.alphabetical.one": "Єдина книга", + "allbooks.title": "Усі книги", + "authors.alphabetical.many": "Алфавітний покажчик {0} авторів(а)", + "authors.alphabetical.none": "Автори не вказані", + "authors.alphabetical.one": "Єдиний автор", + "authors.title": "Автори", + "authorword.many": "{0} авторів(а)", + "authorword.none": "Немає авторів(а)", + "authorword.one": "1 автор", + "bookentry.author": "{0} з {1}", + "bookword.many": "{0} книг(и)", + "bookword.none": "Немає книг(и)", + "bookword.one": "1 книга", + "bookword.title": "Книги", + "cog.alternate": "Пошук, сортування та фільтри", + "content.series": "Серії:", + "content.series.data": "Книга {0} з серії {1}", + "content.summary": "Короткий зміст", + "customcolumn.boolean.no": "Ні", + "customcolumn.boolean.unknown": "Не встановлено", + "customcolumn.boolean.yes": "Так", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "Не встановлено", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "Алфавітний покажчик {0} серій(ї)", + "customcolumn.description.series.none": "Серії не вказано", + "customcolumn.description.series.one": "Єдина серія", + "customcolumn.enum.unknown": "Не встановлено", + "customcolumn.float.unknown": "Не встановлено", + "customcolumn.int.unknown": "Не встановлено", + "customcolumn.rating.unknown": "Не встановлено", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "Вкажіть Ваш email (для відправки книг електронною поштою)", + "customize.fancybox": "Відкривати картку книги у спливаючому вікні", + "customize.filter": "Увімкнути фільтрацію за жанром", + "customize.ignored": "Виключити категорії", + "customize.paging": "Максимальна кількість книжок на сторінці (-1 - не обмежувати)", + "customize.style": "Тема", + "customize.title": "Налаштування зовнішнього вигляду COPS", + "home.alternate": "Додому", + "i18n.coversection": "Обкладинка", + "language.title": "Мова", + "languages.alphabetical.many": "Алфавітний покажчик {0} мов(и)", + "languages.alphabetical.none": "Мови не вказані", + "languages.alphabetical.one": "Єдина мова", + "languages.title": "Мови", + "mail.messagenotsent": "Повідомлення не може бути відправлено", + "mail.messagesent": "Повідомлення відправлено", + "paging.next.alternate": "Наступний", + "paging.previous.alternate": "Попередній", + "permalink.alternate": "Постійне посилання", + "pubdate.title": "Рік публікації", + "publisher.name": "Видавництво", + "publishers.alphabetical.many": "Алфавітний покажчик of the {0} видавництв(а)", + "publishers.alphabetical.none": "Видавництва не вказані", + "publishers.alphabetical.one": "Єдине видавництво", + "publishers.title": "Видавництва", + "publisherword.many": "{0} видавництв(а)", + "publisherword.none": "Немає видавництв(а)", + "publisherword.one": "1 видавництво", + "ratings.many": "{0} оцінок(ка)", + "ratings.none": "Немає оцінок", + "ratings.one": "1 оцінка", + "ratings.title": "Оцінки", + "ratingword.many": "{0} зірка(ок)", + "ratingword.none": "Немає зірок", + "ratingword.one": "1 зірка", + "recent.list": "{0} нещодавно доданих книжок", + "recent.title": "Останні надходження", + "search.alternate": "Пошук", + "search.result": "Результат пошуку *{0}*", + "search.result.author": "Результат пошуку *{0}* серед авторів", + "search.result.book": "Результат пошуку *{0}* серед книжок", + "search.result.publisher": "Результат пошуку *{0}* серед видавництв", + "search.result.series": "Результат пошуку *{0}* серед серій", + "search.result.tag": "Результат пошуку *{0}* серед жанрів", + "search.sortorder.asc": "Висх.", + "search.sortorder.desc": "Спад.", + "series.alphabetical.many": "Алфавітний покажчик {0} серій(ї)", + "series.alphabetical.none": "Серії не вказано", + "series.alphabetical.one": "Єдина серія", + "series.title": "Серії", + "seriesword.many": "{0} серій(я)", + "seriesword.none": "Немає серій", + "seriesword.one": "1 серія", + "sort.alternate": "Сортування", + "splitByLetter.book.other": "Книги за назвою", + "splitByLetter.letter": "{0} починається з {1}", + "tags.alphabetical.many": "Алфавітний покажчик {0} жанрів(а)", + "tags.alphabetical.none": "Жанри не вказано", + "tags.alphabetical.one": "Єдиний жанр", + "tags.title": "Жанри", + "tagword.many": "{0} жанрів", + "tagword.none": "Немає жанрів", + "tagword.one": "1 жанр", + "tagword.title": "Жанри", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanian", + "languages.amh": "Amharic", + "languages.ara": "Arabic", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Basque", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgarian", + "languages.mya": "Burmese", + "languages.cat": "Catalan", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "Chinese", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croatian", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "English", + "languages.epo": "Esperanto", + "languages.est": "Estonian", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "French", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "German", + "languages.ell": "Greek", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitian", + "languages.hau": "Hausa", + "languages.hed": "Hebrew", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarian", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italian", + "languages.iku": "Inuktitut", + "languages.jpn": "Japanese", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Korean", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolian", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norwegian", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persian", + "languages.pol": "Polish", + "languages.pus": "Pashto", + "languages.por": "Portuguese", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Romanian", + "languages.rus": "Russian", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbian", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spanish", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Українська", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamese", + "languages.vol": "Volapük", + "languages.win": "Walloon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lang/Localization_zh.json b/sources/lang/Localization_zh.json new file mode 100644 index 0000000..269ed04 --- /dev/null +++ b/sources/lang/Localization_zh.json @@ -0,0 +1,293 @@ +{ + "about.title": "关于COPS", + "allbooks.alphabetical.many": "{0} 本书籍的字母索引", + "allbooks.alphabetical.none": "无书籍", + "allbooks.alphabetical.one": "1 本书籍", + "allbooks.title": "所有书籍", + "authors.alphabetical.many": "{0} 位作者的字母索引", + "authors.alphabetical.none": "无作者", + "authors.alphabetical.one": "1 位作者", + "authors.title": "作者", + "authorword.many": "{0} 位作者", + "authorword.none": "未知", + "authorword.one": "1 位作者", + "bookentry.author": "{0} 由作者 {1}", + "bookword.many": "{0} 本书籍", + "bookword.none": "无书籍", + "bookword.one": "1 本书籍", + "bookword.title": "书名", + "cog.alternate": "搜索, 分类和过滤", + "content.series": "系列:", + "content.series.data": "系列 {1} 的第 {0} 本", + "content.summary": "概要", + "customcolumn.boolean.no": "否", + "customcolumn.boolean.unknown": "未设置", + "customcolumn.boolean.yes": "是", + "customcolumn.date.format": "Y-m-d", + "customcolumn.date.unknown": "未设置", + "customcolumn.description": "Custom column '{0}'", + "customcolumn.description.bool": "Index of a boolean value", + "customcolumn.description.enum.many": "Alphabetical index of the {0} values", + "customcolumn.description.enum.none": "Alphabetical index of absolutely no values", + "customcolumn.description.enum.one": "Alphabetical index of one value", + "customcolumn.description.rating": "Index of ratings", + "customcolumn.description.series.many": "{0} 个系列的字母索引", + "customcolumn.description.series.none": "无系列", + "customcolumn.description.series.one": "1 个系列", + "customcolumn.enum.unknown": "未设置", + "customcolumn.float.unknown": "未设置", + "customcolumn.int.unknown": "未设置", + "customcolumn.rating.unknown": "未设置", + "customcolumn.stars.many": "{0} Stars", + "customcolumn.stars.none": "No Stars", + "customcolumn.stars.one": "1 Star", + "customize.email": "设置您的电子邮件(以允许发送邮件)", + "customize.fancybox": "使用灯箱", + "customize.filter": "打开标签过滤", + "customize.ignored": "Ignored categories", + "customize.paging": "页内最大书籍数(-1表示禁用)", + "customize.style": "主题", + "customize.title": "自定义界面", + "home.alternate": "首页", + "i18n.coversection": "封面", + "language.title": "语言", + "languages.alphabetical.many": "{0} 语言的字母索引", + "languages.alphabetical.none": "无语言", + "languages.alphabetical.one": "1 种语言", + "languages.title": "语言", + "mail.messagenotsent": "信息未发送。", + "mail.messagesent": "信息已发送。", + "paging.next.alternate": "下一页", + "paging.previous.alternate": "上一页", + "permalink.alternate": "永久链接", + "pubdate.title": "出版时间", + "publisher.name": "Publisher", + "publishers.alphabetical.many": "Alphabetical index of the {0} publishers", + "publishers.alphabetical.none": "Alphabetical index of absolutely no publishers", + "publishers.alphabetical.one": "Alphabetical index of the single publisher", + "publishers.title": "Publishers", + "publisherword.many": "{0} publishers", + "publisherword.none": "No publishers", + "publisherword.one": "1 publisher", + "ratings.many": "{0} ratings", + "ratings.none": "no ratings", + "ratings.one": "1 rating", + "ratings.title": "Ratings", + "ratingword.many": "{0} stars", + "ratingword.none": "No star", + "ratingword.one": "1 star", + "recent.list": "{0} 本最近添加的书", + "recent.title": "最近添加", + "search.alternate": "搜索", + "search.result": "*{0}* 的搜索结果", + "search.result.author": "作者中 *{0}* 的搜索结果", + "search.result.book": "书籍中 *{0}* 的搜索结果", + "search.result.publisher": "Search result for *{0}* in publishers", + "search.result.series": "系列中 *{0}* 的搜索结果", + "search.result.tag": "标签中 *{0}* 的搜索结果", + "search.sortorder.asc": "升序", + "search.sortorder.desc": "降序", + "series.alphabetical.many": "{0} 个系列的字母索引", + "series.alphabetical.none": "无系列", + "series.alphabetical.one": "1 个系列", + "series.title": "系列", + "seriesword.many": "{0} 系列", + "seriesword.none": "无系列", + "seriesword.one": "1 个系列", + "sort.alternate": "排序", + "splitByLetter.book.other": "其他书籍", + "splitByLetter.letter": "{0} 以 {1} 开头", + "tags.alphabetical.many": "{0} 个标签的字母索引", + "tags.alphabetical.none": "无标签", + "tags.alphabetical.one": "1 个标签", + "tags.title": "标签", + "tagword.many": "{0} 标签", + "tagword.none": "无标签", + "tagword.one": "1 个标签", + "tagword.title": "标签", + "languages.abk": "Abkhaz", + "languages.aaf": "Afar", + "languages.afr": "Afrikaans", + "languages.aka": "Akan", + "languages.sqi": "Albanian", + "languages.amh": "Amharic", + "languages.ara": "Arabic", + "languages.arg": "Aragonese", + "languages.hye": "Armenian", + "languages.asm": "Assamese", + "languages.ava": "Avaric", + "languages.ave": "Avestan", + "languages.aym": "Aymara", + "languages.aze": "Azerbaijani", + "languages.bam": "Bambara", + "languages.bak": "Bashkir", + "languages.eus": "Basque", + "languages.bel": "Belarusian", + "languages.ben": "Bengali", + "languages.bih": "Bihari", + "languages.bis": "Bislama", + "languages.bos": "Bosnian", + "languages.bre": "Breton", + "languages.bul": "Bulgarian", + "languages.mya": "Burmese", + "languages.cat": "Catalan", + "languages.cha": "Chamorro", + "languages.che": "Chechen", + "languages.nya": "Chichewa", + "languages.zho": "简体中文", + "languages.chv": "Chuvash", + "languages.cor": "Cornish", + "languages.cos": "Corsican", + "languages.cre": "Cree", + "languages.hrv": "Croatian", + "languages.ces": "Czech", + "languages.dan": "Danish", + "languages.div": "Divehi", + "languages.nld": "Dutch", + "languages.dzo": "Dzongkha", + "languages.eng": "英语", + "languages.epo": "Esperanto", + "languages.est": "Estonian", + "languages.ewe": "Ewe", + "languages.fao": "Faroese", + "languages.fij": "Fijian", + "languages.fin": "Finnish", + "languages.fra": "法语", + "languages.ful": "Fula", + "languages.glg": "Galician", + "languages.kat": "Georgian", + "languages.deu": "German", + "languages.ell": "Greek", + "languages.grn": "Guaraní", + "languages.guj": "Gujarati", + "languages.hat": "Haitian", + "languages.hau": "Hausa", + "languages.hed": "Hebrew", + "languages.her": "Herero", + "languages.hin": "Hindi", + "languages.hmo": "Hiri Motu", + "languages.hun": "Hungarian", + "languages.ina": "Interlingua", + "languages.ind": "Indonesian", + "languages.ile": "Interlingue", + "languages.gle": "Irish", + "languages.ibo": "Igbo", + "languages.ipk": "Inupiaq", + "languages.ido": "Ido", + "languages.isl": "Icelandic", + "languages.ita": "Italian", + "languages.iku": "Inuktitut", + "languages.jpn": "日语", + "languages.jav": "Javanese", + "languages.kal": "Kalaallisut", + "languages.kan": "Kannada", + "languages.kau": "Kanuri", + "languages.kas": "Kashmiri", + "languages.kaz": "Kazakh", + "languages.khm": "Khmer", + "languages.kik": "Kikuyu", + "languages.kin": "Kinyarwanda", + "languages.kir": "Kyrgyz", + "languages.kom": "Komi", + "languages.kon": "Kongo", + "languages.kor": "Korean", + "languages.kur": "Kurdish", + "languages.kua": "Kwanyama", + "languages.lat": "Latin", + "languages.ltz": "Luxembourgish", + "languages.lug": "Ganda", + "languages.lim": "Limburgish", + "languages.lin": "Lingala", + "languages.lao": "Lao", + "languages.lit": "Lithuanian", + "languages.lub": "Luba-Katanga", + "languages.lav": "Latvian", + "languages.glv": "Manx", + "languages.mkd": "Macedonian", + "languages.mlg": "Malagasy", + "languages.msa": "Malay", + "languages.mal": "Malayalam", + "languages.mlt": "Maltese", + "languages.mri": "Māori", + "languages.mar": "Marathi", + "languages.mah": "Marshallese", + "languages.mon": "Mongolian", + "languages.nau": "Nauru", + "languages.nav": "Navajo", + "languages.nob": "Norwegian Bokmål", + "languages.nde": "North Ndebele", + "languages.nep": "Nepali", + "languages.ndo": "Ndonga", + "languages.nno": "Norwegian Nynorsk", + "languages.nor": "Norwegian", + "languages.iii": "Nuosu", + "languages.nbl": "South Ndebele", + "languages.oci": "Occitan", + "languages.oji": "Ojibwe", + "languages.chu": "Old Church Slavonic", + "languages.orm": "Oromo", + "languages.ori": "Oriya", + "languages.oss": "Ossetian", + "languages.pan": "Panjabi", + "languages.pli": "Pāli", + "languages.fas": "Persian", + "languages.pol": "Polish", + "languages.pus": "Pashto", + "languages.por": "Portuguese", + "languages.que": "Quechua", + "languages.roh": "Romansh", + "languages.run": "Kirundi", + "languages.ron": "Romanian", + "languages.rus": "Russian", + "languages.san": "Sanskrit", + "languages.srd": "Sardinian", + "languages.snd": "Sindhi", + "languages.sme": "Northern Sami", + "languages.smo": "Samoan", + "languages.sag": "Sango", + "languages.srp": "Serbian", + "languages.gla": "Scottish Gaelic", + "languages.sna": "Shona", + "languages.sin": "Sinhala", + "languages.slk": "Slovak", + "languages.slv": "Slovene", + "languages.som": "Somali", + "languages.sot": "Southern Sotho", + "languages.spa": "Spanish", + "languages.sun": "Sundanese", + "languages.swa": "Swahili", + "languages.ssw": "Swati", + "languages.swe": "Swedish", + "languages.tam": "Tamil", + "languages.tel": "Telugu", + "languages.tgk": "Tajik", + "languages.tha": "Thai", + "languages.tir": "Tigrinya", + "languages.bod": "Tibetan Standard", + "languages.tuk": "Turkmen", + "languages.tgl": "Tagalog", + "languages.tsn": "Tswana", + "languages.ton": "Tonga", + "languages.tur": "Turkish", + "languages.tso": "Tsonga", + "languages.tat": "Tatar", + "languages.twi": "Twi", + "languages.tah": "Tahitian", + "languages.uig": "Uighur", + "languages.ukr": "Ukrainian", + "languages.urd": "Urdu", + "languages.uzb": "Uzbek", + "languages.ven": "Venda", + "languages.vie": "Vietnamese", + "languages.vol": "Volapük", + "languages.win": "Walloon", + "languages.cym": "Welsh", + "languages.wol": "Wolof", + "languages.fry": "Western Frisian", + "languages.xho": "Xhosa", + "languages.yid": "Yiddish", + "languages.yor": "Yoruba", + "languages.zha": "Zhuang", + "languages.zul": "Zulu", + "DO_NOT_TRANSLATE": "end" +} diff --git a/sources/lib/Author.php b/sources/lib/Author.php new file mode 100644 index 0000000..85e2860 --- /dev/null +++ b/sources/lib/Author.php @@ -0,0 +1,94 @@ + + */ + +class Author extends Base +{ + const ALL_AUTHORS_ID = "cops:authors"; + + const AUTHOR_COLUMNS = "authors.id as id, authors.name as name, authors.sort as sort, count(*) as count"; + const SQL_AUTHORS_BY_FIRST_LETTER = "select {0} from authors, books_authors_link where author = authors.id and upper (authors.sort) like ? group by authors.id, authors.name, authors.sort order by sort"; + const SQL_AUTHORS_FOR_SEARCH = "select {0} from authors, books_authors_link where author = authors.id and (upper (authors.sort) like ? or upper (authors.name) like ?) group by authors.id, authors.name, authors.sort order by sort"; + const SQL_ALL_AUTHORS = "select {0} from authors, books_authors_link where author = authors.id group by authors.id, authors.name, authors.sort order by sort"; + + public $id; + public $name; + public $sort; + + public function __construct($post) { + $this->id = $post->id; + $this->name = str_replace("|", ",", $post->name); + $this->sort = $post->sort; + } + + public function getUri () { + return "?page=".parent::PAGE_AUTHOR_DETAIL."&id=$this->id"; + } + + public function getEntryId () { + return self::ALL_AUTHORS_ID.":".$this->id; + } + + public static function getEntryIdByLetter ($startingLetter) { + return self::ALL_AUTHORS_ID.":letter:".$startingLetter; + } + + public static function getCount() { + // str_format (localize("authors.alphabetical", count(array)) + return parent::getCountGeneric ("authors", self::ALL_AUTHORS_ID, parent::PAGE_ALL_AUTHORS); + } + + public static function getAllAuthorsByFirstLetter() { + list (, $result) = parent::executeQuery ("select {0} +from authors +group by substr (upper (sort), 1, 1) +order by substr (upper (sort), 1, 1)", "substr (upper (sort), 1, 1) as title, count(*) as count", "", array (), -1); + $entryArray = array(); + while ($post = $result->fetchObject ()) + { + array_push ($entryArray, new Entry ($post->title, Author::getEntryIdByLetter ($post->title), + str_format (localize("authorword", $post->count), $post->count), "text", + array ( new LinkNavigation ("?page=".parent::PAGE_AUTHORS_FIRST_LETTER."&id=". rawurlencode ($post->title))), "", $post->count)); + } + return $entryArray; + } + + public static function getAuthorsByStartingLetter($letter) { + return self::getEntryArray (self::SQL_AUTHORS_BY_FIRST_LETTER, array ($letter . "%")); + } + + public static function getAuthorsForSearch($query) { + return self::getEntryArray (self::SQL_AUTHORS_FOR_SEARCH, array ($query . "%", $query . "%")); + } + + public static function getAllAuthors() { + return self::getEntryArray (self::SQL_ALL_AUTHORS, array ()); + } + + public static function getEntryArray ($query, $params) { + return Base::getEntryArrayWithBookNumber ($query, self::AUTHOR_COLUMNS, $params, "Author"); + } + + public static function getAuthorById ($authorId) { + $result = parent::getDb ()->prepare('select ' . self::AUTHOR_COLUMNS . ' from authors where id = ?'); + $result->execute (array ($authorId)); + $post = $result->fetchObject (); + return new Author ($post); + } + + public static function getAuthorByBookId ($bookId) { + $result = parent::getDb ()->prepare('select authors.id as id, authors.name as name, authors.sort as sort from authors, books_authors_link +where author = authors.id +and book = ?'); + $result->execute (array ($bookId)); + $authorArray = array (); + while ($post = $result->fetchObject ()) { + array_push ($authorArray, new Author ($post)); + } + return $authorArray; + } +} diff --git a/sources/lib/Base.php b/sources/lib/Base.php new file mode 100644 index 0000000..e21883a --- /dev/null +++ b/sources/lib/Base.php @@ -0,0 +1,213 @@ + + */ + +abstract class Base +{ + const PAGE_INDEX = "index"; + const PAGE_ALL_AUTHORS = "1"; + const PAGE_AUTHORS_FIRST_LETTER = "2"; + const PAGE_AUTHOR_DETAIL = "3"; + const PAGE_ALL_BOOKS = "4"; + const PAGE_ALL_BOOKS_LETTER = "5"; + const PAGE_ALL_SERIES = "6"; + const PAGE_SERIE_DETAIL = "7"; + const PAGE_OPENSEARCH = "8"; + const PAGE_OPENSEARCH_QUERY = "9"; + const PAGE_ALL_RECENT_BOOKS = "10"; + const PAGE_ALL_TAGS = "11"; + const PAGE_TAG_DETAIL = "12"; + const PAGE_BOOK_DETAIL = "13"; + const PAGE_ALL_CUSTOMS = "14"; + const PAGE_CUSTOM_DETAIL = "15"; + const PAGE_ABOUT = "16"; + const PAGE_ALL_LANGUAGES = "17"; + const PAGE_LANGUAGE_DETAIL = "18"; + const PAGE_CUSTOMIZE = "19"; + const PAGE_ALL_PUBLISHERS = "20"; + const PAGE_PUBLISHER_DETAIL = "21"; + const PAGE_ALL_RATINGS = "22"; + const PAGE_RATING_DETAIL = "23"; + + const COMPATIBILITY_XML_ALDIKO = "aldiko"; + + private static $db = NULL; + + public static function isMultipleDatabaseEnabled () { + global $config; + return is_array ($config['calibre_directory']); + } + + public static function useAbsolutePath () { + global $config; + $path = self::getDbDirectory(); + return preg_match ('/^\//', $path) || // Linux / + preg_match ('/^\w\:/', $path); // Windows X: + } + + public static function noDatabaseSelected () { + return self::isMultipleDatabaseEnabled () && is_null (GetUrlParam (DB)); + } + + public static function getDbList () { + global $config; + if (self::isMultipleDatabaseEnabled ()) { + return $config['calibre_directory']; + } else { + return array ("" => $config['calibre_directory']); + } + } + + public static function getDbNameList () { + global $config; + if (self::isMultipleDatabaseEnabled ()) { + return array_keys ($config['calibre_directory']); + } else { + return array (""); + } + } + + public static function getDbName ($database = NULL) { + global $config; + if (self::isMultipleDatabaseEnabled ()) { + if (is_null ($database)) $database = GetUrlParam (DB, 0); + if (!is_null($database) && !preg_match('/^\d+$/', $database)) { + self::error ($database); + } + $array = array_keys ($config['calibre_directory']); + return $array[$database]; + } + return ""; + } + + public static function getDbDirectory ($database = NULL) { + global $config; + if (self::isMultipleDatabaseEnabled ()) { + if (is_null ($database)) $database = GetUrlParam (DB, 0); + if (!is_null($database) && !preg_match('/^\d+$/', $database)) { + self::error ($database); + } + $array = array_values ($config['calibre_directory']); + return $array[$database]; + } + return $config['calibre_directory']; + } + + + public static function getDbFileName ($database = NULL) { + return self::getDbDirectory ($database) .'metadata.db'; + } + + private static function error ($database) { + if (php_sapi_name() != "cli") { + header("location: checkconfig.php?err=1"); + } + throw new Exception("Database <{$database}> not found."); + } + + public static function getDb ($database = NULL) { + if (is_null (self::$db)) { + try { + if (is_readable (self::getDbFileName ($database))) { + self::$db = new PDO('sqlite:'. self::getDbFileName ($database)); + if (useNormAndUp ()) { + self::$db->sqliteCreateFunction ('normAndUp', 'normAndUp', 1); + } + } else { + self::error ($database); + } + } catch (Exception $e) { + self::error ($database); + } + } + return self::$db; + } + + public static function checkDatabaseAvailability () { + if (self::noDatabaseSelected ()) { + for ($i = 0; $i < count (self::getDbList ()); $i++) { + self::getDb ($i); + self::clearDb (); + } + } else { + self::getDb (); + } + return true; + } + + public static function clearDb () { + self::$db = NULL; + } + + public static function executeQuerySingle ($query, $database = NULL) { + return self::getDb ($database)->query($query)->fetchColumn(); + } + + public static function getCountGeneric($table, $id, $pageId, $numberOfString = NULL) { + if (!$numberOfString) { + $numberOfString = $table . ".alphabetical"; + } + $count = self::executeQuerySingle ('select count(*) from ' . $table); + if ($count == 0) return NULL; + $entry = new Entry (localize($table . ".title"), $id, + str_format (localize($numberOfString, $count), $count), "text", + array ( new LinkNavigation ("?page=".$pageId)), "", $count); + return $entry; + } + + public static function getEntryArrayWithBookNumber ($query, $columns, $params, $category) { + /* @var $result PDOStatement */ + + list (, $result) = self::executeQuery ($query, $columns, "", $params, -1); + $entryArray = array(); + while ($post = $result->fetchObject ()) + { + /* @var $instance Author|Tag|Serie|Publisher */ + + $instance = new $category ($post); + if (property_exists($post, "sort")) { + $title = $post->sort; + } else { + $title = $post->name; + } + array_push ($entryArray, new Entry ($title, $instance->getEntryId (), + str_format (localize("bookword", $post->count), $post->count), "text", + array ( new LinkNavigation ($instance->getUri ())), "", $post->count)); + } + return $entryArray; + } + + public static function executeQuery($query, $columns, $filter, $params, $n, $database = NULL, $numberPerPage = NULL) { + $totalResult = -1; + + if (useNormAndUp ()) { + $query = preg_replace("/upper/", "normAndUp", $query); + $columns = preg_replace("/upper/", "normAndUp", $columns); + } + + if (is_null ($numberPerPage)) { + $numberPerPage = getCurrentOption ("max_item_per_page"); + } + + if ($numberPerPage != -1 && $n != -1) + { + // First check total number of results + $result = self::getDb ($database)->prepare (str_format ($query, "count(*)", $filter)); + $result->execute ($params); + $totalResult = $result->fetchColumn (); + + // Next modify the query and params + $query .= " limit ?, ?"; + array_push ($params, ($n - 1) * $numberPerPage, $numberPerPage); + } + + $result = self::getDb ($database)->prepare(str_format ($query, $columns, $filter)); + $result->execute ($params); + return array ($totalResult, $result); + } + +} diff --git a/sources/lib/Book.php b/sources/lib/Book.php new file mode 100644 index 0000000..66854e7 --- /dev/null +++ b/sources/lib/Book.php @@ -0,0 +1,651 @@ + + */ + +// Silly thing because PHP forbid string concatenation in class const +define ('SQL_BOOKS_LEFT_JOIN', 'left outer join comments on comments.book = books.id + left outer join books_ratings_link on books_ratings_link.book = books.id + left outer join ratings on books_ratings_link.rating = ratings.id '); +define ('SQL_BOOKS_ALL', 'select {0} from books ' . SQL_BOOKS_LEFT_JOIN . ' order by books.sort '); +define ('SQL_BOOKS_BY_PUBLISHER', 'select {0} from books_publishers_link, books ' . SQL_BOOKS_LEFT_JOIN . ' + where books_publishers_link.book = books.id and publisher = ? {1} order by publisher'); +define ('SQL_BOOKS_BY_FIRST_LETTER', 'select {0} from books ' . SQL_BOOKS_LEFT_JOIN . ' + where upper (books.sort) like ? order by books.sort'); +define ('SQL_BOOKS_BY_AUTHOR', 'select {0} from books_authors_link, books ' . SQL_BOOKS_LEFT_JOIN . ' + left outer join books_series_link on books_series_link.book = books.id + where books_authors_link.book = books.id and author = ? {1} order by series desc, series_index asc, pubdate asc'); +define ('SQL_BOOKS_BY_SERIE', 'select {0} from books_series_link, books ' . SQL_BOOKS_LEFT_JOIN . ' + where books_series_link.book = books.id and series = ? {1} order by series_index'); +define ('SQL_BOOKS_BY_TAG', 'select {0} from books_tags_link, books ' . SQL_BOOKS_LEFT_JOIN . ' + where books_tags_link.book = books.id and tag = ? {1} order by sort'); +define ('SQL_BOOKS_BY_LANGUAGE', 'select {0} from books_languages_link, books ' . SQL_BOOKS_LEFT_JOIN . ' + where books_languages_link.book = books.id and lang_code = ? {1} order by sort'); +define ('SQL_BOOKS_BY_CUSTOM', 'select {0} from {2}, books ' . SQL_BOOKS_LEFT_JOIN . ' + where {2}.book = books.id and {2}.{3} = ? {1} order by sort'); +define ('SQL_BOOKS_BY_CUSTOM_BOOL_TRUE', 'select {0} from {2}, books ' . SQL_BOOKS_LEFT_JOIN . ' + where {2}.book = books.id and {2}.value = 1 {1} order by sort'); +define ('SQL_BOOKS_BY_CUSTOM_BOOL_FALSE', 'select {0} from {2}, books ' . SQL_BOOKS_LEFT_JOIN . ' + where {2}.book = books.id and {2}.value = 0 {1} order by sort'); +define ('SQL_BOOKS_BY_CUSTOM_BOOL_NULL', 'select {0} from books ' . SQL_BOOKS_LEFT_JOIN . ' + where books.id not in (select book from {2}) {1} order by sort'); +define ('SQL_BOOKS_BY_CUSTOM_RATING', 'select {0} from books ' . SQL_BOOKS_LEFT_JOIN . ' + left join {2} on {2}.book = books.id + left join {3} on {3}.id = {2}.{4} + where {3}.value = ? order by sort'); +define ('SQL_BOOKS_BY_CUSTOM_RATING_NULL', 'select {0} from books ' . SQL_BOOKS_LEFT_JOIN . ' + left join {2} on {2}.book = books.id + left join {3} on {3}.id = {2}.{4} + where ((books.id not in (select {2}.book from {2})) or ({3}.value = 0)) {1} order by sort'); +define ('SQL_BOOKS_BY_CUSTOM_DATE', 'select {0} from {2}, books ' . SQL_BOOKS_LEFT_JOIN . ' + where {2}.book = books.id and date({2}.value) = ? {1} order by sort'); +define ('SQL_BOOKS_BY_CUSTOM_DIRECT', 'select {0} from {2}, books ' . SQL_BOOKS_LEFT_JOIN . ' + where {2}.book = books.id and {2}.value = ? {1} order by sort'); +define ('SQL_BOOKS_BY_CUSTOM_DIRECT_ID', 'select {0} from {2}, books ' . SQL_BOOKS_LEFT_JOIN . ' + where {2}.book = books.id and {2}.id = ? {1} order by sort'); +define ('SQL_BOOKS_QUERY', 'select {0} from books ' . SQL_BOOKS_LEFT_JOIN . ' + where ( + exists (select null from authors, books_authors_link where book = books.id and author = authors.id and authors.name like ?) or + exists (select null from tags, books_tags_link where book = books.id and tag = tags.id and tags.name like ?) or + exists (select null from series, books_series_link on book = books.id and books_series_link.series = series.id and series.name like ?) or + exists (select null from publishers, books_publishers_link where book = books.id and books_publishers_link.publisher = publishers.id and publishers.name like ?) or + title like ?) {1} order by books.sort'); +define ('SQL_BOOKS_RECENT', 'select {0} from books ' . SQL_BOOKS_LEFT_JOIN . ' + where 1=1 {1} order by timestamp desc limit '); +define ('SQL_BOOKS_BY_RATING', 'select {0} from books ' . SQL_BOOKS_LEFT_JOIN . ' + where books_ratings_link.book = books.id and ratings.id = ? {1} order by sort'); + +class Book extends Base +{ + const ALL_BOOKS_UUID = 'urn:uuid'; + const ALL_BOOKS_ID = 'cops:books'; + const ALL_RECENT_BOOKS_ID = 'cops:recentbooks'; + const BOOK_COLUMNS = 'books.id as id, books.title as title, text as comment, path, timestamp, pubdate, series_index, uuid, has_cover, ratings.rating'; + + const SQL_BOOKS_LEFT_JOIN = SQL_BOOKS_LEFT_JOIN; + const SQL_BOOKS_ALL = SQL_BOOKS_ALL; + const SQL_BOOKS_BY_PUBLISHER = SQL_BOOKS_BY_PUBLISHER; + const SQL_BOOKS_BY_FIRST_LETTER = SQL_BOOKS_BY_FIRST_LETTER; + const SQL_BOOKS_BY_AUTHOR = SQL_BOOKS_BY_AUTHOR; + const SQL_BOOKS_BY_SERIE = SQL_BOOKS_BY_SERIE; + const SQL_BOOKS_BY_TAG = SQL_BOOKS_BY_TAG; + const SQL_BOOKS_BY_LANGUAGE = SQL_BOOKS_BY_LANGUAGE; + const SQL_BOOKS_BY_CUSTOM = SQL_BOOKS_BY_CUSTOM; + const SQL_BOOKS_BY_CUSTOM_BOOL_TRUE = SQL_BOOKS_BY_CUSTOM_BOOL_TRUE; + const SQL_BOOKS_BY_CUSTOM_BOOL_FALSE = SQL_BOOKS_BY_CUSTOM_BOOL_FALSE; + const SQL_BOOKS_BY_CUSTOM_BOOL_NULL = SQL_BOOKS_BY_CUSTOM_BOOL_NULL; + const SQL_BOOKS_BY_CUSTOM_RATING = SQL_BOOKS_BY_CUSTOM_RATING; + const SQL_BOOKS_BY_CUSTOM_RATING_NULL = SQL_BOOKS_BY_CUSTOM_RATING_NULL; + const SQL_BOOKS_BY_CUSTOM_DATE = SQL_BOOKS_BY_CUSTOM_DATE; + const SQL_BOOKS_BY_CUSTOM_DIRECT = SQL_BOOKS_BY_CUSTOM_DIRECT; + const SQL_BOOKS_BY_CUSTOM_DIRECT_ID = SQL_BOOKS_BY_CUSTOM_DIRECT_ID; + const SQL_BOOKS_QUERY = SQL_BOOKS_QUERY; + const SQL_BOOKS_RECENT = SQL_BOOKS_RECENT; + const SQL_BOOKS_BY_RATING = SQL_BOOKS_BY_RATING; + + const BAD_SEARCH = 'QQQQQ'; + + public $id; + public $title; + public $timestamp; + public $pubdate; + public $path; + public $uuid; + public $hasCover; + public $relativePath; + public $seriesIndex; + public $comment; + public $rating; + public $datas = NULL; + public $authors = NULL; + public $publisher = NULL; + public $serie = NULL; + public $tags = NULL; + public $languages = NULL; + public $format = array (); + + + public function __construct($line) { + $this->id = $line->id; + $this->title = $line->title; + $this->timestamp = strtotime($line->timestamp); + $this->pubdate = $line->pubdate; + $this->path = Base::getDbDirectory() . $line->path; + $this->relativePath = $line->path; + $this->seriesIndex = $line->series_index; + $this->comment = $line->comment; + $this->uuid = $line->uuid; + $this->hasCover = $line->has_cover; + if (!file_exists($this->getFilePath('jpg'))) { + // double check + $this->hasCover = 0; + } + $this->rating = $line->rating; + } + + public function getEntryId() { + return self::ALL_BOOKS_UUID.':'.$this->uuid; + } + + public static function getEntryIdByLetter ($startingLetter) { + return self::ALL_BOOKS_ID.':letter:'.$startingLetter; + } + + public function getUri () { + return '?page='.parent::PAGE_BOOK_DETAIL.'&id=' . $this->id; + } + + public function getDetailUrl () { + $urlParam = $this->getUri(); + if (!is_null(GetUrlParam(DB))) $urlParam = addURLParameter($urlParam, DB, GetUrlParam (DB)); + return 'index.php' . $urlParam; + } + + public function getTitle () { + return $this->title; + } + + /* Other class (author, series, tag, ...) initialization and accessors */ + + /** + * @return Author[] + */ + public function getAuthors () { + if (is_null($this->authors)) { + $this->authors = Author::getAuthorByBookId($this->id); + } + return $this->authors; + } + + public function getAuthorsName () { + return implode(', ', array_map(function ($author) { return $author->name; }, $this->getAuthors())); + } + + public function getAuthorsSort () { + return implode(', ', array_map(function ($author) { return $author->sort; }, $this->getAuthors())); + } + + public function getPublisher () { + if (is_null($this->publisher)) { + $this->publisher = Publisher::getPublisherByBookId($this->id); + } + return $this->publisher; + } + + /** + * @return Serie + */ + public function getSerie() { + if (is_null($this->serie)) { + $this->serie = Serie::getSerieByBookId($this->id); + } + return $this->serie; + } + + /** + * @return string + */ + public function getLanguages() { + $lang = array(); + $result = parent::getDb()->prepare('select languages.lang_code + from books_languages_link, languages + where books_languages_link.lang_code = languages.id + and book = ? + order by item_order'); + $result->execute(array($this->id)); + while ($post = $result->fetchObject()) + { + array_push($lang, Language::getLanguageString($post->lang_code)); + } + return implode(', ', $lang); + } + + /** + * @return Tag[] + */ + public function getTags() { + if (is_null ($this->tags)) { + $this->tags = array(); + + $result = parent::getDb()->prepare('select tags.id as id, name + from books_tags_link, tags + where tag = tags.id + and book = ? + order by name'); + $result->execute(array($this->id)); + while ($post = $result->fetchObject()) + { + array_push($this->tags, new Tag($post)); + } + } + return $this->tags; + } + + public function getTagsName() { + return implode(', ', array_map(function ($tag) { return $tag->name; }, $this->getTags())); + } + + /** + * @return Data[] + */ + public function getDatas() + { + if (is_null($this->datas)) { + $this->datas = Data::getDataByBook($this); + } + return $this->datas; + } + + /* End of other class (author, series, tag, ...) initialization and accessors */ + + public static function getFilterString() { + $filter = getURLParam('tag', NULL); + if (empty($filter)) return ''; + + $exists = true; + if (preg_match("/^!(.*)$/", $filter, $matches)) { + $exists = false; + $filter = $matches[1]; + } + + $result = 'exists (select null from books_tags_link, tags where books_tags_link.book = books.id and books_tags_link.tag = tags.id and tags.name = "' . $filter . '")'; + + if (!$exists) { + $result = 'not ' . $result; + } + + return 'and ' . $result; + } + + public function GetMostInterestingDataToSendToKindle() + { + $bestFormatForKindle = array('EPUB', 'PDF', 'AZW3', 'MOBI'); + $bestRank = -1; + $bestData = NULL; + foreach ($this->getDatas() as $data) { + $key = array_search($data->format, $bestFormatForKindle); + if ($key !== false && $key > $bestRank) { + $bestRank = $key; + $bestData = $data; + } + } + return $bestData; + } + + public function getDataById($idData) + { + $reduced = array_filter($this->getDatas(), function ($data) use ($idData) { + return $data->id == $idData; + }); + return reset($reduced); + } + + public function getRating() { + if (is_null($this->rating) || $this->rating == 0) { + return ''; + } + $retour = ''; + for ($i = 0; $i < $this->rating / 2; $i++) { + $retour .= '★'; + } + for ($i = 0; $i < 5 - $this->rating / 2; $i++) { + $retour .= '☆'; + } + return $retour; + } + + public function getPubDate() { + if (empty ($this->pubdate)) { + return ''; + } + $dateY = (int) substr($this->pubdate, 0, 4); + if ($dateY > 102) { + return str_pad($dateY, 4, '0', STR_PAD_LEFT); + } + return ''; + } + + public function getComment($withSerie = true) { + $addition = ''; + $se = $this->getSerie (); + if (!is_null ($se) && $withSerie) { + $addition = $addition . '' . localize('content.series') . '' . str_format(localize('content.series.data'), $this->seriesIndex, htmlspecialchars($se->name)) . "
    \n"; + } + if (preg_match('/<\/(div|p|a|span)>/', $this->comment)) + { + return $addition . html2xhtml($this->comment); + } + else + { + return $addition . htmlspecialchars($this->comment); + } + } + + public function getDataFormat($format) { + $reduced = array_filter($this->getDatas(), function ($data) use ($format) { + return $data->format == $format; + }); + return reset($reduced); + } + + public function getFilePath($extension, $idData = NULL, $relative = false) + { + if ($extension == 'jpg') + { + $file = 'cover.jpg'; + } + else + { + $data = $this->getDataById($idData); + if (!$data) return NULL; + $file = $data->name . '.' . strtolower($data->format); + } + + if ($relative) + { + return $this->relativePath.'/'.$file; + } + else + { + return $this->path.'/'.$file; + } + } + + public function getUpdatedEpub($idData) + { + global $config; + $data = $this->getDataById($idData); + + try + { + $epub = new EPub($data->getLocalPath()); + + $epub->Title($this->title); + $authorArray = array(); + foreach ($this->getAuthors() as $author) { + $authorArray[$author->sort] = $author->name; + } + $epub->Authors($authorArray); + $epub->Language($this->getLanguages()); + $epub->Description ($this->getComment(false)); + $epub->Subjects($this->getTagsName()); + $epub->Cover2($this->getFilePath('jpg'), 'image/jpeg'); + $epub->Calibre($this->uuid); + $se = $this->getSerie(); + if (!is_null($se)) { + $epub->Serie($se->name); + $epub->SerieIndex($this->seriesIndex); + } + if ($config['cops_provide_kepub'] == '1' && preg_match('/Kobo/', $_SERVER['HTTP_USER_AGENT'])) { + $epub->updateForKepub(); + } + $epub->download($data->getUpdatedFilenameEpub()); + } + catch (Exception $e) + { + echo 'Exception : ' . $e->getMessage(); + } + } + + public function getThumbnail($width, $height, $outputfile = NULL) { + if (is_null($width) && is_null($height)) { + return false; + } + + $file = $this->getFilePath('jpg'); + // get image size + if ($size = GetImageSize($file)) { + $w = $size[0]; + $h = $size[1]; + //set new size + if (!is_null($width)) { + $nw = $width; + if ($nw >= $w) { return false; } + $nh = ($nw*$h)/$w; + } else { + $nh = $height; + if ($nh >= $h) { return false; } + $nw = ($nh*$w)/$h; + } + } else { + return false; + } + + //draw the image + $src_img = imagecreatefromjpeg($file); + $dst_img = imagecreatetruecolor($nw,$nh); + imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $nw, $nh, $w, $h);//resizing the image + imagejpeg($dst_img,$outputfile,80); + imagedestroy($src_img); + imagedestroy($dst_img); + + return true; + } + + public function getLinkArray () + { + $linkArray = array(); + + if ($this->hasCover) + { + array_push($linkArray, Data::getLink($this, 'jpg', 'image/jpeg', Link::OPDS_IMAGE_TYPE, 'cover.jpg', NULL)); + + array_push($linkArray, Data::getLink($this, 'jpg', 'image/jpeg', Link::OPDS_THUMBNAIL_TYPE, 'cover.jpg', NULL)); + } + + foreach ($this->getDatas() as $data) + { + if ($data->isKnownType()) + { + array_push($linkArray, $data->getDataLink(Link::OPDS_ACQUISITION_TYPE, $data->format)); + } + } + + foreach ($this->getAuthors() as $author) { + /* @var $author Author */ + array_push($linkArray, new LinkNavigation($author->getUri(), 'related', str_format(localize('bookentry.author'), localize('splitByLetter.book.other'), $author->name))); + } + + $serie = $this->getSerie(); + if (!is_null ($serie)) { + array_push($linkArray, new LinkNavigation($serie->getUri(), 'related', str_format(localize('content.series.data'), $this->seriesIndex, $serie->name))); + } + + return $linkArray; + } + + + public function getEntry() { + return new EntryBook($this->getTitle(), $this->getEntryId(), + $this->getComment(), 'text/html', + $this->getLinkArray(), $this); + } + + public static function getBookCount($database = NULL) { + return parent::executeQuerySingle('select count(*) from books', $database); + } + + public static function getCount() { + global $config; + $nBooks = parent::executeQuerySingle('select count(*) from books'); + $result = array(); + $entry = new Entry(localize('allbooks.title'), + self::ALL_BOOKS_ID, + str_format(localize('allbooks.alphabetical', $nBooks), $nBooks), 'text', + array(new LinkNavigation('?page='.parent::PAGE_ALL_BOOKS)), '', $nBooks); + array_push($result, $entry); + if ($config['cops_recentbooks_limit'] > 0) { + $entry = new Entry(localize('recent.title'), + self::ALL_RECENT_BOOKS_ID, + str_format(localize('recent.list'), $config['cops_recentbooks_limit']), 'text', + array ( new LinkNavigation ('?page='.parent::PAGE_ALL_RECENT_BOOKS)), '', $config['cops_recentbooks_limit']); + array_push($result, $entry); + } + return $result; + } + + public static function getBooksByAuthor($authorId, $n) { + return self::getEntryArray(self::SQL_BOOKS_BY_AUTHOR, array($authorId), $n); + } + + public static function getBooksByRating($ratingId, $n) { + return self::getEntryArray(self::SQL_BOOKS_BY_RATING, array($ratingId), $n); + } + + public static function getBooksByPublisher($publisherId, $n) { + return self::getEntryArray(self::SQL_BOOKS_BY_PUBLISHER, array($publisherId), $n); + } + + public static function getBooksBySeries($serieId, $n) { + return self::getEntryArray(self::SQL_BOOKS_BY_SERIE, array($serieId), $n); + } + + public static function getBooksByTag($tagId, $n) { + return self::getEntryArray(self::SQL_BOOKS_BY_TAG, array($tagId), $n); + } + + public static function getBooksByLanguage($languageId, $n) { + return self::getEntryArray(self::SQL_BOOKS_BY_LANGUAGE, array($languageId), $n); + } + + /** + * @param $customColumn CustomColumn + * @param $id integer + * @param $n integer + * @return array + */ + public static function getBooksByCustom($customColumn, $id, $n) { + list($query, $params) = $customColumn->getQuery($id); + + return self::getEntryArray($query, $params, $n); + } + + public static function getBookById($bookId) { + $result = parent::getDb()->prepare('select ' . self::BOOK_COLUMNS . ' +from books ' . self::SQL_BOOKS_LEFT_JOIN . ' +where books.id = ?'); + $result->execute(array($bookId)); + while ($post = $result->fetchObject()) + { + $book = new Book($post); + return $book; + } + return NULL; + } + + public static function getBookByDataId($dataId) { + $result = parent::getDb()->prepare('select ' . self::BOOK_COLUMNS . ', data.name, data.format +from data, books ' . self::SQL_BOOKS_LEFT_JOIN . ' +where data.book = books.id and data.id = ?'); + $result->execute(array($dataId)); + while ($post = $result->fetchObject()) + { + $book = new Book($post); + $data = new Data($post, $book); + $data->id = $dataId; + $book->datas = array($data); + return $book; + } + return NULL; + } + + public static function getBooksByQuery($query, $n, $database = NULL, $numberPerPage = NULL) { + $i = 0; + $critArray = array(); + foreach (array(PageQueryResult::SCOPE_AUTHOR, + PageQueryResult::SCOPE_TAG, + PageQueryResult::SCOPE_SERIES, + PageQueryResult::SCOPE_PUBLISHER, + PageQueryResult::SCOPE_BOOK) as $key) { + if (in_array($key, getCurrentOption('ignored_categories')) || + (!array_key_exists($key, $query) && !array_key_exists('all', $query))) { + $critArray[$i] = self::BAD_SEARCH; + } + else { + if (array_key_exists($key, $query)) { + $critArray[$i] = $query[$key]; + } else { + $critArray[$i] = $query["all"]; + } + } + $i++; + } + return self::getEntryArray(self::SQL_BOOKS_QUERY, $critArray, $n, $database, $numberPerPage); + } + + public static function getBooks($n) { + list ($entryArray, $totalNumber) = self::getEntryArray(self::SQL_BOOKS_ALL , array (), $n); + return array($entryArray, $totalNumber); + } + + public static function getAllBooks() { + /* @var $result PDOStatement */ + + list (, $result) = parent::executeQuery('select {0} +from books +group by substr (upper (sort), 1, 1) +order by substr (upper (sort), 1, 1)', 'substr (upper (sort), 1, 1) as title, count(*) as count', self::getFilterString(), array(), -1); + + $entryArray = array(); + while ($post = $result->fetchObject()) + { + array_push($entryArray, new Entry($post->title, Book::getEntryIdByLetter($post->title), + str_format(localize('bookword', $post->count), $post->count), 'text', + array(new LinkNavigation('?page='.parent::PAGE_ALL_BOOKS_LETTER.'&id='. rawurlencode($post->title))), '', $post->count)); + } + return $entryArray; + } + + public static function getBooksByStartingLetter($letter, $n, $database = NULL, $numberPerPage = NULL) { + return self::getEntryArray(self::SQL_BOOKS_BY_FIRST_LETTER, array($letter . '%'), $n, $database, $numberPerPage); + } + + public static function getEntryArray($query, $params, $n, $database = NULL, $numberPerPage = NULL) { + /* @var $totalNumber integer */ + /* @var $result PDOStatement */ + list($totalNumber, $result) = parent::executeQuery($query, self::BOOK_COLUMNS, self::getFilterString(), $params, $n, $database, $numberPerPage); + + $entryArray = array(); + while ($post = $result->fetchObject()) + { + $book = new Book($post); + array_push($entryArray, $book->getEntry()); + } + return array($entryArray, $totalNumber); + } + + public static function getAllRecentBooks() { + global $config; + list ($entryArray, ) = self::getEntryArray(self::SQL_BOOKS_RECENT . $config['cops_recentbooks_limit'], array(), -1); + return $entryArray; + } + + /** + * The values of all the specified columns + * + * @param string[] $columns + * @return CustomColumn[] + */ + public function getCustomColumnValues($columns, $asArray = false) { + $result = array(); + + foreach ($columns as $lookup) { + $col = CustomColumnType::createByLookup($lookup); + if (!is_null($col)) { + $cust = $col->getCustomByBook($this); + if (!is_null($cust)) { + if ($asArray) { + array_push($result, $cust->toArray()); + } else { + array_push($result, $cust); + } + } + } + } + + return $result; + } +} diff --git a/sources/lib/CustomColumn.php b/sources/lib/CustomColumn.php new file mode 100644 index 0000000..195bdfd --- /dev/null +++ b/sources/lib/CustomColumn.php @@ -0,0 +1,109 @@ + + */ + +/** + * A CustomColumn with an value + */ +class CustomColumn extends Base +{ + /* @var string|integer the ID of the value */ + public $valueID; + /* @var string the (string) representation of the value */ + public $value; + /* @var CustomColumnType the custom column that contains the value */ + public $customColumnType; + /* @var string the value encoded for HTML displaying */ + public $htmlvalue; + + /** + * CustomColumn constructor. + * + * @param integer $pid id of the chosen value + * @param string $pvalue string representation of the value + * @param CustomColumnType $pcustomColumnType the CustomColumn this value lives in + */ + public function __construct($pid, $pvalue, $pcustomColumnType) + { + $this->valueID = $pid; + $this->value = $pvalue; + $this->customColumnType = $pcustomColumnType; + $this->htmlvalue = $this->customColumnType->encodeHTMLValue($this->value); + } + + /** + * Get the URI to show all books with this value + * + * @return string + */ + public function getUri() + { + return $this->customColumnType->getUri($this->valueID); + } + + /** + * Get the EntryID to show all books with this value + * + * @return string + */ + public function getEntryId() + { + return $this->customColumnType->getEntryId($this->valueID); + } + + /** + * Get the query to find all books with this value + * the returning array has two values: + * - first the query (string) + * - second an array of all PreparedStatement parameters + * + * @return array + */ + public function getQuery() + { + return $this->customColumnType->getQuery($this->valueID); + } + + /** + * Return the value of this column as an HTML snippet + * + * @return string + */ + public function getHTMLEncodedValue() + { + return $this->htmlvalue; + } + + /** + * Create an CustomColumn by CustomColumnID and ValueID + * + * @param integer $customId the id of the customColumn + * @param integer $id the id of the chosen value + * @return CustomColumn|null + */ + public static function createCustom($customId, $id) + { + $columnType = CustomColumnType::createByCustomID($customId); + + return $columnType->getCustom($id); + } + + /** + * Return this object as an array + * + * @return array + */ + public function toArray() + { + return array( + 'valueID' => $this->valueID, + 'value' => $this->value, + 'customColumnType' => (array)$this->customColumnType, + 'htmlvalue' => $this->htmlvalue, + ); + } +} diff --git a/sources/lib/CustomColumnType.php b/sources/lib/CustomColumnType.php new file mode 100644 index 0000000..dda3819 --- /dev/null +++ b/sources/lib/CustomColumnType.php @@ -0,0 +1,314 @@ + + */ + +/** + * A single calibre custom column + */ +abstract class CustomColumnType extends Base +{ + const ALL_CUSTOMS_ID = "cops:custom"; + + const CUSTOM_TYPE_TEXT = "text"; // type 1 + 2 + const CUSTOM_TYPE_COMMENT = "comments"; // type 3 + const CUSTOM_TYPE_SERIES = "series"; // type 4 + const CUSTOM_TYPE_ENUM = "enumeration"; // type 5 + const CUSTOM_TYPE_DATE = "datetime"; // type 6 + const CUSTOM_TYPE_FLOAT = "float"; // type 7 + const CUSTOM_TYPE_INT = "int"; // type 8 + const CUSTOM_TYPE_RATING = "rating"; // type 9 + const CUSTOM_TYPE_BOOL = "bool"; // type 10 + const CUSTOM_TYPE_COMPOSITE = "composite"; // type 11 + 12 + + /** @var array[integer]CustomColumnType */ + private static $customColumnCacheID = array(); + + /** @var array[string]CustomColumnType */ + private static $customColumnCacheLookup = array(); + + /** @var integer the id of this column */ + public $customId; + /** @var string name/title of this column */ + public $columnTitle; + /** @var string the datatype of this column (one of the CUSTOM_TYPE_* constant values) */ + public $datatype; + /** @var null|Entry[] */ + private $customValues = NULL; + + protected function __construct($pcustomId, $pdatatype) + { + $this->columnTitle = self::getTitleByCustomID($pcustomId); + $this->customId = $pcustomId; + $this->datatype = $pdatatype; + $this->customValues = NULL; + } + + /** + * The URI to show all book swith a specific value in this column + * + * @param string|integer $id the id of the value to show + * @return string + */ + public function getUri($id) + { + return "?page=" . parent::PAGE_CUSTOM_DETAIL . "&custom={$this->customId}&id={$id}"; + } + + /** + * The URI to show all the values of this column + * + * @return string + */ + public function getUriAllCustoms() + { + return "?page=" . parent::PAGE_ALL_CUSTOMS . "&custom={$this->customId}"; + } + + /** + * The EntryID to show all book swith a specific value in this column + * + * @param string|integer $id the id of the value to show + * @return string + */ + public function getEntryId($id) + { + return self::ALL_CUSTOMS_ID . ":" . $this->customId . ":" . $id; + } + + /** + * The EntryID to show all the values of this column + * + * @return string + */ + public function getAllCustomsId() + { + return self::ALL_CUSTOMS_ID . ":" . $this->customId; + } + + /** + * The title of this column + * + * @return string + */ + public function getTitle() + { + return $this->columnTitle; + } + + /** + * The description of this column as it is definied in the database + * + * @return string|null + */ + public function getDatabaseDescription() + { + $result = $this->getDb()->prepare('SELECT display FROM custom_columns WHERE id = ?'); + $result->execute(array($this->customId)); + if ($post = $result->fetchObject()) { + $json = json_decode($post->display); + return (isset($json->description) && !empty($json->description)) ? $json->description : NULL; + } + return NULL; + } + + /** + * Get the Entry for this column + * This is used in the initializeContent method to display e.g. the index page + * + * @return Entry + */ + public function getCount() + { + $ptitle = $this->getTitle(); + $pid = $this->getAllCustomsId(); + $pcontent = $this->getDescription(); + $pcontentType = $this->datatype; + $plinkArray = array(new LinkNavigation($this->getUriAllCustoms())); + $pclass = ""; + $pcount = $this->getDistinctValueCount(); + + return new Entry($ptitle, $pid, $pcontent, $pcontentType, $plinkArray, $pclass, $pcount); + } + + /** + * Get the amount of distinct values for this column + * + * @return int + */ + protected function getDistinctValueCount() + { + return count($this->getAllCustomValues()); + } + + /** + * Encode a value of this column ready to be displayed in an HTML document + * + * @param integer|string $value + * @return string + */ + public function encodeHTMLValue($value) + { + return htmlspecialchars($value); + } + + /** + * Get the datatype of a CustomColumn by its customID + * + * @param integer $customId + * @return string|null + */ + private static function getDatatypeByCustomID($customId) + { + $result = parent::getDb()->prepare('SELECT datatype FROM custom_columns WHERE id = ?'); + $result->execute(array($customId)); + if ($post = $result->fetchObject()) { + return $post->datatype; + } + return NULL; + } + + /** + * Create a CustomColumnType by CustomID + * + * @param integer $customId the id of the custom column + * @return CustomColumnType|null + * @throws Exception If the $customId is not found or the datatype is unknown + */ + public static function createByCustomID($customId) + { + // Reuse already created CustomColumns for performance + if (array_key_exists($customId, self::$customColumnCacheID)) + return self::$customColumnCacheID[$customId]; + + $datatype = self::getDatatypeByCustomID($customId); + + switch ($datatype) { + case self::CUSTOM_TYPE_TEXT: + return self::$customColumnCacheID[$customId] = new CustomColumnTypeText($customId); + case self::CUSTOM_TYPE_SERIES: + return self::$customColumnCacheID[$customId] = new CustomColumnTypeSeries($customId); + case self::CUSTOM_TYPE_ENUM: + return self::$customColumnCacheID[$customId] = new CustomColumnTypeEnumeration($customId); + case self::CUSTOM_TYPE_COMMENT: + return self::$customColumnCacheID[$customId] = new CustomColumnTypeComment($customId); + case self::CUSTOM_TYPE_DATE: + return self::$customColumnCacheID[$customId] = new CustomColumnTypeDate($customId); + case self::CUSTOM_TYPE_FLOAT: + return self::$customColumnCacheID[$customId] = new CustomColumnTypeFloat($customId); + case self::CUSTOM_TYPE_INT: + return self::$customColumnCacheID[$customId] = new CustomColumnTypeInteger($customId); + case self::CUSTOM_TYPE_RATING: + return self::$customColumnCacheID[$customId] = new CustomColumnTypeRating($customId); + case self::CUSTOM_TYPE_BOOL: + return self::$customColumnCacheID[$customId] = new CustomColumnTypeBool($customId); + case self::CUSTOM_TYPE_COMPOSITE: + return NULL; //TODO Currently not supported + default: + throw new Exception("Unkown column type: " . $datatype); + } + } + + /** + * Create a CustomColumnType by its lookup name + * + * @param string $lookup the lookup-name of the custom column + * @return CustomColumnType|null + */ + public static function createByLookup($lookup) + { + // Reuse already created CustomColumns for performance + if (array_key_exists($lookup, self::$customColumnCacheLookup)) + return self::$customColumnCacheLookup[$lookup]; + + $result = parent::getDb()->prepare('SELECT id FROM custom_columns WHERE label = ?'); + $result->execute(array($lookup)); + if ($post = $result->fetchObject()) { + return self::$customColumnCacheLookup[$lookup] = self::createByCustomID($post->id); + } + return self::$customColumnCacheLookup[$lookup] = NULL; + } + + /** + * Return an entry array for all possible (in the DB used) values of this column + * These are the values used in the getUriAllCustoms() page + * + * @return Entry[] + */ + public function getAllCustomValues() + { + // lazy loading + if ($this->customValues == NULL) + $this->customValues = $this->getAllCustomValuesFromDatabase(); + + return $this->customValues; + } + + /** + * Get the title of a CustomColumn by its customID + * + * @param integer $customId + * @return string + */ + protected static function getTitleByCustomID($customId) + { + $result = parent::getDb()->prepare('SELECT name FROM custom_columns WHERE id = ?'); + $result->execute(array($customId)); + if ($post = $result->fetchObject()) { + return $post->name; + } + return ""; + } + + /** + * Get the query to find all books with a specific value of this column + * the returning array has two values: + * - first the query (string) + * - second an array of all PreparedStatement parameters + * + * @param string|integer $id the id of the searched value + * @return array + */ + abstract public function getQuery($id); + + /** + * Get a CustomColumn for a specified (by ID) value + * + * @param string|integer $id the id of the searched value + * @return CustomColumn + */ + abstract public function getCustom($id); + + /** + * Return an entry array for all possible (in the DB used) values of this column by querying the database + * + * @return Entry[] + */ + abstract protected function getAllCustomValuesFromDatabase(); + + /** + * The description used in the index page + * + * @return string + */ + abstract public function getDescription(); + + /** + * Find the value of this column for a specific book + * + * @param Book $book + * @return CustomColumn + */ + public abstract function getCustomByBook($book); + + /** + * Is this column searchable by value + * only searchable columns can be displayed on the index page + * + * @return bool + */ + public abstract function isSearchable(); +} diff --git a/sources/lib/CustomColumnTypeBool.php b/sources/lib/CustomColumnTypeBool.php new file mode 100644 index 0000000..1ac577f --- /dev/null +++ b/sources/lib/CustomColumnTypeBool.php @@ -0,0 +1,94 @@ + + */ + +class CustomColumnTypeBool extends CustomColumnType +{ + // PHP pre 5.6 does not support const arrays + private $BOOLEAN_NAMES = array( + -1 => "customcolumn.boolean.unknown", // localize("customcolumn.boolean.unknown") + 00 => "customcolumn.boolean.no", // localize("customcolumn.boolean.no") + +1 => "customcolumn.boolean.yes", // localize("customcolumn.boolean.yes") + ); + + protected function __construct($pcustomId) + { + parent::__construct($pcustomId, self::CUSTOM_TYPE_BOOL); + } + + /** + * Get the name of the sqlite table for this column + * + * @return string|null + */ + private function getTableName() + { + return "custom_column_{$this->customId}"; + } + + public function getQuery($id) + { + if ($id == -1) { + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM_BOOL_NULL, "{0}", "{1}", $this->getTableName()); + return array($query, array()); + } else if ($id == 0) { + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM_BOOL_FALSE, "{0}", "{1}", $this->getTableName()); + return array($query, array()); + } else if ($id == 1) { + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM_BOOL_TRUE, "{0}", "{1}", $this->getTableName()); + return array($query, array()); + } else { + return NULL; + } + } + + public function getCustom($id) + { + return new CustomColumn($id, localize($this->BOOLEAN_NAMES[$id]), $this); + } + + protected function getAllCustomValuesFromDatabase() + { + $queryFormat = "SELECT coalesce({0}.value, -1) AS id, count(*) AS count FROM books LEFT JOIN {0} ON books.id = {0}.book GROUP BY {0}.value ORDER BY {0}.value"; + $query = str_format($queryFormat, $this->getTableName()); + $result = $this->getDb()->query($query); + + $entryArray = array(); + while ($post = $result->fetchObject()) { + $entryPContent = str_format(localize("bookword", $post->count), $post->count); + $entryPLinkArray = array(new LinkNavigation ($this->getUri($post->id))); + + $entry = new Entry(localize($this->BOOLEAN_NAMES[$post->id]), $this->getEntryId($post->id), $entryPContent, $this->datatype, $entryPLinkArray, "", $post->count); + + array_push($entryArray, $entry); + } + return $entryArray; + } + + public function getDescription() + { + return localize("customcolumn.description.bool"); + } + + public function getCustomByBook($book) + { + $queryFormat = "SELECT {0}.value AS boolvalue FROM {0} WHERE {0}.book = {1}"; + $query = str_format($queryFormat, $this->getTableName(), $book->id); + + $result = $this->getDb()->query($query); + if ($post = $result->fetchObject()) { + return new CustomColumn($post->boolvalue, localize($this->BOOLEAN_NAMES[$post->boolvalue]), $this); + } else { + return new CustomColumn(-1, localize($this->BOOLEAN_NAMES[-1]), $this); + } + } + + public function isSearchable() + { + return true; + } +} diff --git a/sources/lib/CustomColumnTypeComment.php b/sources/lib/CustomColumnTypeComment.php new file mode 100644 index 0000000..3aae772 --- /dev/null +++ b/sources/lib/CustomColumnTypeComment.php @@ -0,0 +1,70 @@ + + */ + +class CustomColumnTypeComment extends CustomColumnType +{ + protected function __construct($pcustomId) + { + parent::__construct($pcustomId, self::CUSTOM_TYPE_COMMENT); + } + + /** + * Get the name of the sqlite table for this column + * + * @return string|null + */ + private function getTableName() + { + return "custom_column_{$this->customId}"; + } + + public function getQuery($id) + { + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM_DIRECT_ID, "{0}", "{1}", $this->getTableName()); + return array($query, array($id)); + } + + public function getCustom($id) + { + return new CustomColumn($id, $id, $this); + } + + public function encodeHTMLValue($value) + { + return "
    " . $value . "
    "; // no htmlspecialchars, this is already HTML + } + + protected function getAllCustomValuesFromDatabase() + { + return NULL; + } + + public function getDescription() + { + $desc = $this->getDatabaseDescription(); + if ($desc === NULL || empty($desc)) $desc = str_format(localize("customcolumn.description"), $this->getTitle()); + return $desc; + } + + public function getCustomByBook($book) + { + $queryFormat = "SELECT {0}.id AS id, {0}.value AS value FROM {0} WHERE {0}.book = {1}"; + $query = str_format($queryFormat, $this->getTableName(), $book->id); + + $result = $this->getDb()->query($query); + if ($post = $result->fetchObject()) { + return new CustomColumn($post->id, $post->value, $this); + } + return new CustomColumn(NULL, localize("customcolumn.float.unknown"), $this); + } + + public function isSearchable() + { + return false; + } +} diff --git a/sources/lib/CustomColumnTypeDate.php b/sources/lib/CustomColumnTypeDate.php new file mode 100644 index 0000000..cc3df35 --- /dev/null +++ b/sources/lib/CustomColumnTypeDate.php @@ -0,0 +1,87 @@ + + */ + +class CustomColumnTypeDate extends CustomColumnType +{ + protected function __construct($pcustomId) + { + parent::__construct($pcustomId, self::CUSTOM_TYPE_DATE); + } + + /** + * Get the name of the sqlite table for this column + * + * @return string|null + */ + private function getTableName() + { + return "custom_column_{$this->customId}"; + } + + public function getQuery($id) + { + $date = new DateTime($id); + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM_DATE, "{0}", "{1}", $this->getTableName()); + return array($query, array($date->format("Y-m-d"))); + } + + public function getCustom($id) + { + $date = new DateTime($id); + + return new CustomColumn($id, $date->format(localize("customcolumn.date.format")), $this); + } + + protected function getAllCustomValuesFromDatabase() + { + $queryFormat = "SELECT date(value) AS datevalue, count(*) AS count FROM {0} GROUP BY datevalue"; + $query = str_format($queryFormat, $this->getTableName()); + $result = $this->getDb()->query($query); + + $entryArray = array(); + while ($post = $result->fetchObject()) { + $date = new DateTime($post->datevalue); + $id = $date->format("Y-m-d"); + + $entryPContent = str_format(localize("bookword", $post->count), $post->count); + $entryPLinkArray = array(new LinkNavigation ($this->getUri($id))); + + $entry = new Entry($date->format(localize("customcolumn.date.format")), $this->getEntryId($id), $entryPContent, $this->datatype, $entryPLinkArray, "", $post->count); + + array_push($entryArray, $entry); + } + + return $entryArray; + } + + public function getDescription() + { + $desc = $this->getDatabaseDescription(); + if ($desc === NULL || empty($desc)) $desc = str_format(localize("customcolumn.description"), $this->getTitle()); + return $desc; + } + + public function getCustomByBook($book) + { + $queryFormat = "SELECT date({0}.value) AS datevalue FROM {0} WHERE {0}.book = {1}"; + $query = str_format($queryFormat, $this->getTableName(), $book->id); + + $result = $this->getDb()->query($query); + if ($post = $result->fetchObject()) { + $date = new DateTime($post->datevalue); + + return new CustomColumn($date->format("Y-m-d"), $date->format(localize("customcolumn.date.format")), $this); + } + return new CustomColumn(NULL, localize("customcolumn.date.unknown"), $this); + } + + public function isSearchable() + { + return true; + } +} diff --git a/sources/lib/CustomColumnTypeEnumeration.php b/sources/lib/CustomColumnTypeEnumeration.php new file mode 100644 index 0000000..c4e303c --- /dev/null +++ b/sources/lib/CustomColumnTypeEnumeration.php @@ -0,0 +1,102 @@ + + */ + +class CustomColumnTypeEnumeration extends CustomColumnType +{ + protected function __construct($pcustomId) + { + parent::__construct($pcustomId, self::CUSTOM_TYPE_ENUM); + } + + /** + * Get the name of the sqlite table for this column + * + * @return string|null + */ + private function getTableName() + { + return "custom_column_{$this->customId}"; + } + + /** + * Get the name of the linking sqlite table for this column + * (or NULL if there is no linktable) + * + * @return string|null + */ + private function getTableLinkName() + { + return "books_custom_column_{$this->customId}_link"; + } + + /** + * Get the name of the linking column in the linktable + * + * @return string|null + */ + private function getTableLinkColumn() + { + return "value"; + } + + public function getQuery($id) + { + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM, "{0}", "{1}", $this->getTableLinkName(), $this->getTableLinkColumn()); + return array($query, array($id)); + } + + public function getCustom($id) + { + $result = $this->getDb()->prepare(str_format("SELECT id, value AS name FROM {0} WHERE id = ?", $this->getTableName())); + $result->execute(array($id)); + if ($post = $result->fetchObject()) { + return new CustomColumn ($id, $post->name, $this); + } + return NULL; + } + + protected function getAllCustomValuesFromDatabase() + { + $queryFormat = "SELECT {0}.id AS id, {0}.value AS name, count(*) AS count FROM {0}, {1} WHERE {0}.id = {1}.{2} GROUP BY {0}.id, {0}.value ORDER BY {0}.value"; + $query = str_format($queryFormat, $this->getTableName(), $this->getTableLinkName(), $this->getTableLinkColumn()); + + $result = $this->getDb()->query($query); + $entryArray = array(); + while ($post = $result->fetchObject()) { + $entryPContent = str_format(localize("bookword", $post->count), $post->count); + $entryPLinkArray = array(new LinkNavigation ($this->getUri($post->id))); + + $entry = new Entry ($post->name, $this->getEntryId($post->id), $entryPContent, $this->datatype, $entryPLinkArray, "", $post->count); + + array_push($entryArray, $entry); + } + return $entryArray; + } + + public function getDescription() + { + return str_format(localize("customcolumn.description.enum", $this->getDistinctValueCount()), $this->getDistinctValueCount()); + } + + public function getCustomByBook($book) + { + $queryFormat = "SELECT {0}.id AS id, {0}.{2} AS name FROM {0}, {1} WHERE {0}.id = {1}.{2} AND {1}.book = {3}"; + $query = str_format($queryFormat, $this->getTableName(), $this->getTableLinkName(), $this->getTableLinkColumn(), $book->id); + + $result = $this->getDb()->query($query); + if ($post = $result->fetchObject()) { + return new CustomColumn($post->id, $post->name, $this); + } + return new CustomColumn(NULL, localize("customcolumn.enum.unknown"), $this); + } + + public function isSearchable() + { + return true; + } +} diff --git a/sources/lib/CustomColumnTypeFloat.php b/sources/lib/CustomColumnTypeFloat.php new file mode 100644 index 0000000..c7f21f5 --- /dev/null +++ b/sources/lib/CustomColumnTypeFloat.php @@ -0,0 +1,78 @@ + + */ + +class CustomColumnTypeFloat extends CustomColumnType +{ + protected function __construct($pcustomId) + { + parent::__construct($pcustomId, self::CUSTOM_TYPE_FLOAT); + } + + /** + * Get the name of the sqlite table for this column + * + * @return string|null + */ + private function getTableName() + { + return "custom_column_{$this->customId}"; + } + + public function getQuery($id) + { + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM_DIRECT, "{0}", "{1}", $this->getTableName()); + return array($query, array($id)); + } + + public function getCustom($id) + { + return new CustomColumn($id, $id, $this); + } + + protected function getAllCustomValuesFromDatabase() + { + $queryFormat = "SELECT value AS id, count(*) AS count FROM {0} GROUP BY value"; + $query = str_format($queryFormat, $this->getTableName()); + + $result = $this->getDb()->query($query); + $entryArray = array(); + while ($post = $result->fetchObject()) { + $entryPContent = str_format(localize("bookword", $post->count), $post->count); + $entryPLinkArray = array(new LinkNavigation($this->getUri($post->id))); + + $entry = new Entry($post->id, $this->getEntryId($post->id), $entryPContent, $this->datatype, $entryPLinkArray, "", $post->count); + + array_push($entryArray, $entry); + } + return $entryArray; + } + + public function getDescription() + { + $desc = $this->getDatabaseDescription(); + if ($desc === NULL || empty($desc)) $desc = str_format(localize("customcolumn.description"), $this->getTitle()); + return $desc; + } + + public function getCustomByBook($book) + { + $queryFormat = "SELECT {0}.value AS value FROM {0} WHERE {0}.book = {1}"; + $query = str_format($queryFormat, $this->getTableName(), $book->id); + + $result = $this->getDb()->query($query); + if ($post = $result->fetchObject()) { + return new CustomColumn($post->value, $post->value, $this); + } + return new CustomColumn(NULL, localize("customcolumn.float.unknown"), $this); + } + + public function isSearchable() + { + return true; + } +} diff --git a/sources/lib/CustomColumnTypeInteger.php b/sources/lib/CustomColumnTypeInteger.php new file mode 100644 index 0000000..82e7f37 --- /dev/null +++ b/sources/lib/CustomColumnTypeInteger.php @@ -0,0 +1,78 @@ + + */ + +class CustomColumnTypeInteger extends CustomColumnType +{ + protected function __construct($pcustomId) + { + parent::__construct($pcustomId, self::CUSTOM_TYPE_INT); + } + + /** + * Get the name of the sqlite table for this column + * + * @return string|null + */ + private function getTableName() + { + return "custom_column_{$this->customId}"; + } + + public function getQuery($id) + { + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM_DIRECT, "{0}", "{1}", $this->getTableName()); + return array($query, array($id)); + } + + public function getCustom($id) + { + return new CustomColumn($id, $id, $this); + } + + protected function getAllCustomValuesFromDatabase() + { + $queryFormat = "SELECT value AS id, count(*) AS count FROM {0} GROUP BY value"; + $query = str_format($queryFormat, $this->getTableName()); + + $result = $this->getDb()->query($query); + $entryArray = array(); + while ($post = $result->fetchObject()) { + $entryPContent = str_format(localize("bookword", $post->count), $post->count); + $entryPLinkArray = array(new LinkNavigation($this->getUri($post->id))); + + $entry = new Entry($post->id, $this->getEntryId($post->id), $entryPContent, $this->datatype, $entryPLinkArray, "", $post->count); + + array_push($entryArray, $entry); + } + return $entryArray; + } + + public function getDescription() + { + $desc = $this->getDatabaseDescription(); + if ($desc === NULL || empty($desc)) $desc = str_format(localize("customcolumn.description"), $this->getTitle()); + return $desc; + } + + public function getCustomByBook($book) + { + $queryFormat = "SELECT {0}.value AS value FROM {0} WHERE {0}.book = {1}"; + $query = str_format($queryFormat, $this->getTableName(), $book->id); + + $result = $this->getDb()->query($query); + if ($post = $result->fetchObject()) { + return new CustomColumn($post->value, $post->value, $this); + } + return new CustomColumn(NULL, localize("customcolumn.int.unknown"), $this); + } + + public function isSearchable() + { + return true; + } +} diff --git a/sources/lib/CustomColumnTypeRating.php b/sources/lib/CustomColumnTypeRating.php new file mode 100644 index 0000000..c1ceb98 --- /dev/null +++ b/sources/lib/CustomColumnTypeRating.php @@ -0,0 +1,110 @@ + + */ + +class CustomColumnTypeRating extends CustomColumnType +{ + protected function __construct($pcustomId) + { + parent::__construct($pcustomId, self::CUSTOM_TYPE_RATING); + } + + /** + * Get the name of the sqlite table for this column + * + * @return string|null + */ + private function getTableName() + { + return "custom_column_{$this->customId}"; + } + + /** + * Get the name of the linking sqlite table for this column + * (or NULL if there is no linktable) + * + * @return string|null + */ + private function getTableLinkName() + { + return "books_custom_column_{$this->customId}_link"; + } + + /** + * Get the name of the linking column in the linktable + * + * @return string|null + */ + private function getTableLinkColumn() + { + return "value"; + } + + public function getQuery($id) + { + if ($id == 0) { + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM_RATING_NULL, "{0}", "{1}", $this->getTableLinkName(), $this->getTableName(), $this->getTableLinkColumn()); + return array($query, array()); + } else { + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM_RATING, "{0}", "{1}", $this->getTableLinkName(), $this->getTableName(), $this->getTableLinkColumn()); + return array($query, array($id)); + } + } + + public function getCustom($id) + { + return new CustomColumn ($id, str_format(localize("customcolumn.stars", $id / 2), $id / 2), $this); + } + + protected function getAllCustomValuesFromDatabase() + { + $queryFormat = "SELECT coalesce({0}.value, 0) AS value, count(*) AS count FROM books LEFT JOIN {1} ON books.id = {1}.book LEFT JOIN {0} ON {0}.id = {1}.value GROUP BY coalesce({0}.value, -1)"; + $query = str_format($queryFormat, $this->getTableName(), $this->getTableLinkName()); + $result = $this->getDb()->query($query); + + $countArray = array(0 => 0, 2 => 0, 4 => 0, 6 => 0, 8 => 0, 10 => 0); + while ($row = $result->fetchObject()) { + $countArray[$row->value] = $row->count; + } + + $entryArray = array(); + + for ($i = 0; $i <= 5; $i++) { + $count = $countArray[$i * 2]; + $name = str_format(localize("customcolumn.stars", $i), $i); + $entryid = $this->getEntryId($i * 2); + $content = str_format(localize("bookword", $count), $count); + $linkarray = array(new LinkNavigation($this->getUri($i * 2))); + $entry = new Entry($name, $entryid, $content, $this->datatype, $linkarray, "", $count); + array_push($entryArray, $entry); + } + + return $entryArray; + } + + public function getDescription() + { + return localize("customcolumn.description.rating"); + } + + public function getCustomByBook($book) + { + $queryFormat = "SELECT {0}.value AS value FROM {0}, {1} WHERE {0}.id = {1}.{2} AND {1}.book = {3}"; + $query = str_format($queryFormat, $this->getTableName(), $this->getTableLinkName(), $this->getTableLinkColumn(), $book->id); + + $result = $this->getDb()->query($query); + if ($post = $result->fetchObject()) { + return new CustomColumn($post->value, str_format(localize("customcolumn.stars", $post->value / 2), $post->value / 2), $this); + } + return new CustomColumn(NULL, localize("customcolumn.rating.unknown"), $this); + } + + public function isSearchable() + { + return true; + } +} diff --git a/sources/lib/CustomColumnTypeSeries.php b/sources/lib/CustomColumnTypeSeries.php new file mode 100644 index 0000000..e37295e --- /dev/null +++ b/sources/lib/CustomColumnTypeSeries.php @@ -0,0 +1,102 @@ + + */ + +class CustomColumnTypeSeries extends CustomColumnType +{ + protected function __construct($pcustomId) + { + parent::__construct($pcustomId, self::CUSTOM_TYPE_SERIES); + } + + /** + * Get the name of the sqlite table for this column + * + * @return string|null + */ + private function getTableName() + { + return "custom_column_{$this->customId}"; + } + + /** + * Get the name of the linking sqlite table for this column + * (or NULL if there is no linktable) + * + * @return string|null + */ + private function getTableLinkName() + { + return "books_custom_column_{$this->customId}_link"; + } + + /** + * Get the name of the linking column in the linktable + * + * @return string|null + */ + private function getTableLinkColumn() + { + return "value"; + } + + public function getQuery($id) + { + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM, "{0}", "{1}", $this->getTableLinkName(), $this->getTableLinkColumn()); + return array($query, array($id)); + } + + public function getCustom($id) + { + $result = $this->getDb()->prepare(str_format("SELECT id, value AS name FROM {0} WHERE id = ?", $this->getTableName())); + $result->execute(array($id)); + if ($post = $result->fetchObject()) { + return new CustomColumn($id, $post->name, $this); + } + return NULL; + } + + protected function getAllCustomValuesFromDatabase() + { + $queryFormat = "SELECT {0}.id AS id, {0}.value AS name, count(*) AS count FROM {0}, {1} WHERE {0}.id = {1}.{2} GROUP BY {0}.id, {0}.value ORDER BY {0}.value"; + $query = str_format($queryFormat, $this->getTableName(), $this->getTableLinkName(), $this->getTableLinkColumn()); + + $result = $this->getDb()->query($query); + $entryArray = array(); + while ($post = $result->fetchObject()) { + $entryPContent = str_format(localize("bookword", $post->count), $post->count); + $entryPLinkArray = array(new LinkNavigation($this->getUri($post->id))); + + $entry = new Entry($post->name, $this->getEntryId($post->id), $entryPContent, $this->datatype, $entryPLinkArray, "", $post->count); + + array_push($entryArray, $entry); + } + return $entryArray; + } + + public function getDescription() + { + return str_format(localize("customcolumn.description.series", $this->getDistinctValueCount()), $this->getDistinctValueCount()); + } + + public function getCustomByBook($book) + { + $queryFormat = "SELECT {0}.id AS id, {1}.{2} AS name, {1}.extra AS extra FROM {0}, {1} WHERE {0}.id = {1}.{2} AND {1}.book = {3}"; + $query = str_format($queryFormat, $this->getTableName(), $this->getTableLinkName(), $this->getTableLinkColumn(), $book->id); + + $result = $this->getDb()->query($query); + if ($post = $result->fetchObject()) { + return new CustomColumn($post->id, $post->name . " [" . $post->extra . "]", $this); + } + return new CustomColumn(NULL, "", $this); + } + + public function isSearchable() + { + return true; + } +} diff --git a/sources/lib/CustomColumnTypeText.php b/sources/lib/CustomColumnTypeText.php new file mode 100644 index 0000000..b2b21cd --- /dev/null +++ b/sources/lib/CustomColumnTypeText.php @@ -0,0 +1,105 @@ + + */ + +class CustomColumnTypeText extends CustomColumnType +{ + protected function __construct($pcustomId) + { + parent::__construct($pcustomId, self::CUSTOM_TYPE_TEXT); + } + + /** + * Get the name of the sqlite table for this column + * + * @return string|null + */ + private function getTableName() + { + return "custom_column_{$this->customId}"; + } + + /** + * Get the name of the linking sqlite table for this column + * (or NULL if there is no linktable) + * + * @return string|null + */ + private function getTableLinkName() + { + return "books_custom_column_{$this->customId}_link"; + } + + /** + * Get the name of the linking column in the linktable + * + * @return string|null + */ + private function getTableLinkColumn() + { + return "value"; + } + + public function getQuery($id) + { + $query = str_format(Book::SQL_BOOKS_BY_CUSTOM, "{0}", "{1}", $this->getTableLinkName(), $this->getTableLinkColumn()); + return array($query, array($id)); + } + + public function getCustom($id) + { + $result = $this->getDb()->prepare(str_format("SELECT id, value AS name FROM {0} WHERE id = ?", $this->getTableName())); + $result->execute(array($id)); + if ($post = $result->fetchObject()) { + return new CustomColumn($id, $post->name, $this); + } + return NULL; + } + + protected function getAllCustomValuesFromDatabase() + { + $queryFormat = "SELECT {0}.id AS id, {0}.value AS name, count(*) AS count FROM {0}, {1} WHERE {0}.id = {1}.{2} GROUP BY {0}.id, {0}.value ORDER BY {0}.value"; + $query = str_format($queryFormat, $this->getTableName(), $this->getTableLinkName(), $this->getTableLinkColumn()); + + $result = $this->getDb()->query($query); + $entryArray = array(); + while ($post = $result->fetchObject()) + { + $entryPContent = str_format(localize("bookword", $post->count), $post->count); + $entryPLinkArray = array(new LinkNavigation ($this->getUri($post->id))); + + $entry = new Entry($post->name, $this->getEntryId($post->id), $entryPContent, $this->datatype, $entryPLinkArray, "", $post->count); + + array_push($entryArray, $entry); + } + return $entryArray; + } + + public function getDescription() + { + $desc = $this->getDatabaseDescription(); + if ($desc === NULL || empty($desc)) $desc = str_format(localize("customcolumn.description"), $this->getTitle()); + return $desc; + } + + public function getCustomByBook($book) + { + $queryFormat = "SELECT {0}.id AS id, {0}.{2} AS name FROM {0}, {1} WHERE {0}.id = {1}.{2} AND {1}.book = {3} ORDER BY {0}.value"; + $query = str_format($queryFormat, $this->getTableName(), $this->getTableLinkName(), $this->getTableLinkColumn(), $book->id); + + $result = $this->getDb()->query($query); + if ($post = $result->fetchObject()) { + return new CustomColumn($post->id, $post->name, $this); + } + return new CustomColumn(NULL, "", $this); + } + + public function isSearchable() + { + return true; + } +} diff --git a/sources/lib/Data.php b/sources/lib/Data.php new file mode 100644 index 0000000..4c8eddf --- /dev/null +++ b/sources/lib/Data.php @@ -0,0 +1,208 @@ + + */ + +class Data extends Base +{ + public $id; + public $name; + public $format; + public $realFormat; + public $extension; + public $book; + + public static $mimetypes = array( + 'aac' => 'audio/aac', + 'azw' => 'application/x-mobipocket-ebook', + 'azw1' => 'application/x-topaz-ebook', + 'azw2' => 'application/x-kindle-application', + 'azw3' => 'application/x-mobi8-ebook', + 'cbz' => 'application/x-cbz', + 'cbr' => 'application/x-cbr', + 'djv' => 'image/vnd.djvu', + 'djvu' => 'image/vnd.djvu', + 'doc' => 'application/msword', + 'epub' => 'application/epub+zip', + 'fb2' => 'text/fb2+xml', + 'ibooks'=> 'application/x-ibooks+zip', + 'kepub' => 'application/epub+zip', + 'kobo' => 'application/x-koboreader-ebook', + 'm4a' => 'audio/mp4', + 'mobi' => 'application/x-mobipocket-ebook', + 'mp3' => 'audio/mpeg', + 'lit' => 'application/x-ms-reader', + 'lrs' => 'text/x-sony-bbeb+xml', + 'lrf' => 'application/x-sony-bbeb', + 'lrx' => 'application/x-sony-bbeb', + 'ncx' => 'application/x-dtbncx+xml', + 'opf' => 'application/oebps-package+xml', + 'otf' => 'application/x-font-opentype', + 'pdb' => 'application/vnd.palm', + 'pdf' => 'application/pdf', + 'prc' => 'application/x-mobipocket-ebook', + 'rtf' => 'application/rtf', + 'svg' => 'image/svg+xml', + 'ttf' => 'application/x-font-truetype', + 'tpz' => 'application/x-topaz-ebook', + 'wav' => 'audio/wav', + 'wmf' => 'image/wmf', + 'xhtml' => 'application/xhtml+xml', + 'xpgt' => 'application/adobe-page-template+xml', + 'zip' => 'application/zip' + ); + + public function __construct($post, $book = null) { + $this->id = $post->id; + $this->name = $post->name; + $this->format = $post->format; + $this->realFormat = str_replace ("ORIGINAL_", "", $post->format); + $this->extension = strtolower ($this->realFormat); + $this->book = $book; + } + + public function isKnownType () { + return array_key_exists ($this->extension, self::$mimetypes); + } + + public function getMimeType () { + $result = "application/octet-stream"; + if ($this->isKnownType ()) { + return self::$mimetypes [$this->extension]; + } elseif (function_exists('finfo_open') === true) { + $finfo = finfo_open(FILEINFO_MIME_TYPE); + + if (is_resource($finfo) === true) + { + $result = finfo_file($finfo, $this->getLocalPath ()); + } + + finfo_close($finfo); + + } + return $result; + } + + public function isEpubValidOnKobo () { + return $this->format == "EPUB" || $this->format == "KEPUB"; + } + + public function getFilename () { + return $this->name . "." . strtolower ($this->format); + } + + public function getUpdatedFilename () { + return $this->book->getAuthorsSort () . " - " . $this->book->title; + } + + public function getUpdatedFilenameEpub () { + return $this->getUpdatedFilename () . ".epub"; + } + + public function getUpdatedFilenameKepub () { + $str = $this->getUpdatedFilename () . ".kepub.epub"; + return str_replace(array(':', '#', '&'), + array('-', '-', ' '), $str ); + } + + public function getDataLink ($rel, $title = NULL) { + global $config; + + if ($rel == Link::OPDS_ACQUISITION_TYPE && $config['cops_use_url_rewriting'] == "1") { + return $this->getHtmlLinkWithRewriting($title); + } + + return self::getLink ($this->book, $this->extension, $this->getMimeType (), $rel, $this->getFilename (), $this->id, $title); + } + + public function getHtmlLink () { + return $this->getDataLink(Link::OPDS_ACQUISITION_TYPE)->href; + } + + public function getLocalPath () { + return $this->book->path . "/" . $this->getFilename (); + } + + public function getHtmlLinkWithRewriting ($title = NULL) { + global $config; + + $database = ""; + if (!is_null (GetUrlParam (DB))) $database = GetUrlParam (DB) . "/"; + + $href = "download/" . $this->id . "/" . $database; + + if ($config['cops_provide_kepub'] == "1" && + $this->isEpubValidOnKobo () && + preg_match("/Kobo/", $_SERVER['HTTP_USER_AGENT'])) { + $href .= rawurlencode ($this->getUpdatedFilenameKepub ()); + } else { + $href .= rawurlencode ($this->getFilename ()); + } + return new Link ($href, $this->getMimeType (), Link::OPDS_ACQUISITION_TYPE, $title); + } + + public static function getDataByBook ($book) { + $out = array (); + $result = parent::getDb ()->prepare('select id, format, name + from data where book = ?'); + $result->execute (array ($book->id)); + + while ($post = $result->fetchObject ()) + { + array_push ($out, new Data ($post, $book)); + } + return $out; + } + + public static function handleThumbnailLink ($urlParam, $height) { + global $config; + + if (is_null ($height)) { + if (preg_match ('/feed.php/', $_SERVER["SCRIPT_NAME"])) { + $height = $config['cops_opds_thumbnail_height']; + } + else + { + $height = $config['cops_html_thumbnail_height']; + } + } + if ($config['cops_thumbnail_handling'] != "1") { + $urlParam = addURLParameter($urlParam, "height", $height); + } + + return $urlParam; + } + + public static function getLink ($book, $type, $mime, $rel, $filename, $idData, $title = NULL, $height = NULL) + { + global $config; + + $urlParam = addURLParameter("", "data", $idData); + + if (Base::useAbsolutePath () || + $rel == Link::OPDS_THUMBNAIL_TYPE || + ($type == "epub" && $config['cops_update_epub-metadata'])) + { + if ($type != "jpg") $urlParam = addURLParameter($urlParam, "type", $type); + if ($rel == Link::OPDS_THUMBNAIL_TYPE) { + $urlParam = self::handleThumbnailLink($urlParam, $height); + } + $urlParam = addURLParameter($urlParam, "id", $book->id); + if (!is_null (GetUrlParam (DB))) $urlParam = addURLParameter ($urlParam, DB, GetUrlParam (DB)); + if ($config['cops_thumbnail_handling'] != "1" && + !empty ($config['cops_thumbnail_handling']) && + $rel == Link::OPDS_THUMBNAIL_TYPE) { + return new Link ($config['cops_thumbnail_handling'], $mime, $rel, $title); + } else { + return new Link ("fetch.php?" . $urlParam, $mime, $rel, $title); + } + } + else + { + return new Link (str_replace('%2F','/',rawurlencode ($book->path."/".$filename)), $mime, $rel, $title); + } + } +} diff --git a/sources/lib/Entry.php b/sources/lib/Entry.php new file mode 100644 index 0000000..dedfff8 --- /dev/null +++ b/sources/lib/Entry.php @@ -0,0 +1,78 @@ + + */ + +class Entry +{ + public $title; + public $id; + public $content; + public $numberOfElement; + public $contentType; + public $linkArray; + public $localUpdated; + public $className; + private static $updated = NULL; + + public static $icons = array( + Author::ALL_AUTHORS_ID => 'images/author.png', + Serie::ALL_SERIES_ID => 'images/serie.png', + Book::ALL_RECENT_BOOKS_ID => 'images/recent.png', + Tag::ALL_TAGS_ID => 'images/tag.png', + Language::ALL_LANGUAGES_ID => 'images/language.png', + CustomColumnType::ALL_CUSTOMS_ID => 'images/custom.png', + Rating::ALL_RATING_ID => 'images/rating.png', + "cops:books$" => 'images/allbook.png', + "cops:books:letter" => 'images/allbook.png', + Publisher::ALL_PUBLISHERS_ID => 'images/publisher.png' + ); + + public function getUpdatedTime () { + if (!is_null ($this->localUpdated)) { + return date (DATE_ATOM, $this->localUpdated); + } + if (is_null (self::$updated)) { + self::$updated = time(); + } + return date (DATE_ATOM, self::$updated); + } + + public function getNavLink () { + foreach ($this->linkArray as $link) { + /* @var $link LinkNavigation */ + + if ($link->type != Link::OPDS_NAVIGATION_TYPE) { continue; } + + return $link->hrefXhtml (); + } + return "#"; + } + + public function __construct($ptitle, $pid, $pcontent, $pcontentType, $plinkArray, $pclass = "", $pcount = 0) { + global $config; + $this->title = $ptitle; + $this->id = $pid; + $this->content = $pcontent; + $this->contentType = $pcontentType; + $this->linkArray = $plinkArray; + $this->className = $pclass; + $this->numberOfElement = $pcount; + + if ($config['cops_show_icons'] == 1) + { + foreach (self::$icons as $reg => $image) + { + if (preg_match ("/" . $reg . "/", $pid)) { + array_push ($this->linkArray, new Link (getUrlWithVersion ($image), "image/png", Link::OPDS_THUMBNAIL_TYPE)); + break; + } + } + } + + if (!is_null (GetUrlParam (DB))) $this->id = str_replace ("cops:", "cops:" . GetUrlParam (DB) . ":", $this->id); + } +} diff --git a/sources/lib/EntryBook.php b/sources/lib/EntryBook.php new file mode 100644 index 0000000..04d1cb6 --- /dev/null +++ b/sources/lib/EntryBook.php @@ -0,0 +1,47 @@ + + */ + +class EntryBook extends Entry +{ + public $book; + + /** + * EntryBook constructor. + * @param string $ptitle + * @param integer $pid + * @param string $pcontent + * @param string $pcontentType + * @param array $plinkArray + * @param Book $pbook + */ + public function __construct($ptitle, $pid, $pcontent, $pcontentType, $plinkArray, $pbook) { + parent::__construct ($ptitle, $pid, $pcontent, $pcontentType, $plinkArray); + $this->book = $pbook; + $this->localUpdated = $pbook->timestamp; + } + + public function getCoverThumbnail () { + foreach ($this->linkArray as $link) { + /* @var $link LinkNavigation */ + + if ($link->rel == Link::OPDS_THUMBNAIL_TYPE) + return $link->hrefXhtml (); + } + return null; + } + + public function getCover () { + foreach ($this->linkArray as $link) { + /* @var $link LinkNavigation */ + + if ($link->rel == Link::OPDS_IMAGE_TYPE) + return $link->hrefXhtml (); + } + return null; + } +} diff --git a/sources/lib/JSON_renderer.php b/sources/lib/JSON_renderer.php new file mode 100644 index 0000000..4df3df5 --- /dev/null +++ b/sources/lib/JSON_renderer.php @@ -0,0 +1,254 @@ + + */ + +require_once dirname(__FILE__) . '/../base.php'; + +class JSONRenderer +{ + /** + * @param Book $book + * @return array + */ + public static function getBookContentArray ($book) { + global $config; + $i = 0; + $preferedData = array (); + foreach ($config['cops_prefered_format'] as $format) + { + if ($i == 2) { break; } + if ($data = $book->getDataFormat ($format)) { + $i++; + array_push ($preferedData, array ("url" => $data->getHtmlLink (), "name" => $format)); + } + } + + $publisher = $book->getPublisher(); + if (is_null ($publisher)) { + $pn = ""; + $pu = ""; + } else { + $pn = $publisher->name; + $link = new LinkNavigation ($publisher->getUri ()); + $pu = $link->hrefXhtml (); + } + + $serie = $book->getSerie (); + if (is_null ($serie)) { + $sn = ""; + $scn = ""; + $su = ""; + } else { + $sn = $serie->name; + $scn = str_format (localize ("content.series.data"), $book->seriesIndex, $serie->name); + $link = new LinkNavigation ($serie->getUri ()); + $su = $link->hrefXhtml (); + } + $cc = $book->getCustomColumnValues($config['cops_calibre_custom_column_list'], true); + + return array ("id" => $book->id, + "hasCover" => $book->hasCover, + "preferedData" => $preferedData, + "rating" => $book->getRating (), + "publisherName" => $pn, + "publisherurl" => $pu, + "pubDate" => $book->getPubDate (), + "languagesName" => $book->getLanguages (), + "authorsName" => $book->getAuthorsName (), + "tagsName" => $book->getTagsName (), + "seriesName" => $sn, + "seriesIndex" => $book->seriesIndex, + "seriesCompleteName" => $scn, + "seriesurl" => $su, + "customcolumns_list" => $cc); + } + + /** + * @param Book $book + * @return array + */ + public static function getFullBookContentArray ($book) { + global $config; + $out = self::getBookContentArray ($book); + $database = GetUrlParam (DB); + + $out ["coverurl"] = Data::getLink ($book, "jpg", "image/jpeg", Link::OPDS_IMAGE_TYPE, "cover.jpg", NULL)->hrefXhtml (); + $out ["thumbnailurl"] = Data::getLink ($book, "jpg", "image/jpeg", Link::OPDS_THUMBNAIL_TYPE, "cover.jpg", NULL, NULL, $config['cops_html_thumbnail_height'] * 2)->hrefXhtml (); + $out ["content"] = $book->getComment (false); + $out ["datas"] = array (); + $dataKindle = $book->GetMostInterestingDataToSendToKindle (); + foreach ($book->getDatas() as $data) { + $tab = array ("id" => $data->id, "format" => $data->format, "url" => $data->getHtmlLink (), "mail" => 0, "readerUrl" => ""); + if (!empty ($config['cops_mail_configuration']) && !is_null ($dataKindle) && $data->id == $dataKindle->id) { + $tab ["mail"] = 1; + } + if ($data->format == "EPUB") { + $tab ["readerUrl"] = "epubreader.php?data={$data->id}&db={$database}"; + } + array_push ($out ["datas"], $tab); + } + $out ["authors"] = array (); + foreach ($book->getAuthors () as $author) { + $link = new LinkNavigation ($author->getUri ()); + array_push ($out ["authors"], array ("name" => $author->name, "url" => $link->hrefXhtml ())); + } + $out ["tags"] = array (); + foreach ($book->getTags () as $tag) { + $link = new LinkNavigation ($tag->getUri ()); + array_push ($out ["tags"], array ("name" => $tag->name, "url" => $link->hrefXhtml ())); + } + $out ["customcolumns_preview"] = $book->getCustomColumnValues($config['cops_calibre_custom_column_preview'], true); + + return $out; + } + + public static function getContentArray ($entry) { + if ($entry instanceof EntryBook) { + $out = array ( "title" => $entry->title); + $out ["book"] = self::getBookContentArray ($entry->book); + return $out; + } + return array ( "title" => $entry->title, "content" => $entry->content, "navlink" => $entry->getNavLink (), "number" => $entry->numberOfElement ); + } + + public static function getContentArrayTypeahead ($page) { + $out = array (); + foreach ($page->entryArray as $entry) { + if ($entry instanceof EntryBook) { + array_push ($out, array ("class" => $entry->className, "title" => $entry->title, "navlink" => $entry->book->getDetailUrl ())); + } else { + if (empty ($entry->className) xor Base::noDatabaseSelected ()) { + array_push ($out, array ("class" => $entry->className, "title" => $entry->title, "navlink" => $entry->getNavLink ())); + } else { + array_push ($out, array ("class" => $entry->className, "title" => $entry->content, "navlink" => $entry->getNavLink ())); + } + } + } + return $out; + } + + public static function addCompleteArray ($in) { + global $config; + $out = $in; + + $out ["c"] = array ("version" => VERSION, "i18n" => array ( + "coverAlt" => localize("i18n.coversection"), + "authorsTitle" => localize("authors.title"), + "bookwordTitle" => localize("bookword.title"), + "tagsTitle" => localize("tags.title"), + "seriesTitle" => localize("series.title"), + "customizeTitle" => localize ("customize.title"), + "aboutTitle" => localize ("about.title"), + "previousAlt" => localize ("paging.previous.alternate"), + "nextAlt" => localize ("paging.next.alternate"), + "searchAlt" => localize ("search.alternate"), + "sortAlt" => localize ("sort.alternate"), + "homeAlt" => localize ("home.alternate"), + "cogAlt" => localize ("cog.alternate"), + "permalinkAlt" => localize ("permalink.alternate"), + "publisherName" => localize("publisher.name"), + "pubdateTitle" => localize("pubdate.title"), + "languagesTitle" => localize("language.title"), + "contentTitle" => localize("content.summary"), + "sortorderAsc" => localize("search.sortorder.asc"), + "sortorderDesc" => localize("search.sortorder.desc"), + "customizeEmail" => localize("customize.email")), + "url" => array ( + "detailUrl" => "index.php?page=13&id={0}&db={1}", + "coverUrl" => "fetch.php?id={0}&db={1}", + "thumbnailUrl" => "fetch.php?height=" . $config['cops_html_thumbnail_height'] . "&id={0}&db={1}"), + "config" => array ( + "use_fancyapps" => $config ["cops_use_fancyapps"], + "max_item_per_page" => $config['cops_max_item_per_page'], + "kindleHack" => "", + "server_side_rendering" => useServerSideRendering (), + "html_tag_filter" => $config['cops_html_tag_filter'])); + if ($config['cops_thumbnail_handling'] == "1") { + $out ["c"]["url"]["thumbnailUrl"] = $out ["c"]["url"]["coverUrl"]; + } else if (!empty ($config['cops_thumbnail_handling'])) { + $out ["c"]["url"]["thumbnailUrl"] = $config['cops_thumbnail_handling']; + } + if (preg_match("/./", $_SERVER['HTTP_USER_AGENT'])) { + $out ["c"]["config"]["kindleHack"] = 'style="text-decoration: none !important;"'; + } + return $out; + } + + public static function getJson ($complete = false) { + global $config; + $page = getURLParam ("page", Base::PAGE_INDEX); + $query = getURLParam ("query"); + $search = getURLParam ("search"); + $qid = getURLParam ("id"); + $n = getURLParam ("n", "1"); + $database = GetUrlParam (DB); + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + if ($search) { + return self::getContentArrayTypeahead ($currentPage); + } + + $out = array ( "title" => $currentPage->title); + $entries = array (); + foreach ($currentPage->entryArray as $entry) { + array_push ($entries, self::getContentArray ($entry)); + } + if (!is_null ($currentPage->book)) { + $out ["book"] = self::getFullBookContentArray ($currentPage->book); + } + $out ["databaseId"] = GetUrlParam (DB, ""); + $out ["databaseName"] = Base::getDbName (); + if ($out ["databaseId"] == "") { + $out ["databaseName"] = ""; + } + $out ["fullTitle"] = $out ["title"]; + if ($out ["databaseId"] != "" && $out ["databaseName"] != $out ["fullTitle"]) { + $out ["fullTitle"] = $out ["databaseName"] . " > " . $out ["fullTitle"]; + } + $out ["page"] = $page; + $out ["multipleDatabase"] = Base::isMultipleDatabaseEnabled () ? 1 : 0; + $out ["entries"] = $entries; + $out ["isPaginated"] = 0; + if ($currentPage->isPaginated ()) { + $prevLink = $currentPage->getPrevLink (); + $nextLink = $currentPage->getNextLink (); + $out ["isPaginated"] = 1; + $out ["prevLink"] = ""; + if (!is_null ($prevLink)) { + $out ["prevLink"] = $prevLink->hrefXhtml (); + } + $out ["nextLink"] = ""; + if (!is_null ($nextLink)) { + $out ["nextLink"] = $nextLink->hrefXhtml (); + } + $out ["maxPage"] = $currentPage->getMaxPage (); + $out ["currentPage"] = $currentPage->n; + } + if (!is_null (getURLParam ("complete")) || $complete) { + $out = self::addCompleteArray ($out); + } + + $out ["containsBook"] = 0; + if ($currentPage->containsBook ()) { + $out ["containsBook"] = 1; + } + + $out["abouturl"] = "index.php" . addURLParameter ("?page=" . Base::PAGE_ABOUT, DB, $database); + + if ($page == Base::PAGE_ABOUT) { + $temp = preg_replace ("/\About COPS\<\/h1\>/", "

    About COPS " . VERSION . "

    ", file_get_contents('about.html')); + $out ["fullhtml"] = $temp; + } + + $out ["homeurl"] = "index.php"; + if ($page != Base::PAGE_INDEX && !is_null ($database)) $out ["homeurl"] = $out ["homeurl"] . "?" . addURLParameter ("", DB, $database); + + return $out; + } +} \ No newline at end of file diff --git a/sources/lib/Language.php b/sources/lib/Language.php new file mode 100644 index 0000000..bdf5dc8 --- /dev/null +++ b/sources/lib/Language.php @@ -0,0 +1,69 @@ + + */ + +class Language extends Base +{ + const ALL_LANGUAGES_ID = "cops:languages"; + + public $id; + public $lang_code; + + public function __construct($pid, $plang_code) { + $this->id = $pid; + $this->lang_code = $plang_code; + } + + public function getUri () { + return "?page=".parent::PAGE_LANGUAGE_DETAIL."&id=$this->id"; + } + + public function getEntryId () { + return self::ALL_LANGUAGES_ID.":".$this->id; + } + + public static function getLanguageString ($code) { + $string = localize("languages.".$code); + if (preg_match ("/^languages/", $string)) { + return $code; + } + return $string; + } + + public static function getCount() { + // str_format (localize("languages.alphabetical", count(array)) + return parent::getCountGeneric ("languages", self::ALL_LANGUAGES_ID, parent::PAGE_ALL_LANGUAGES); + } + + public static function getLanguageById ($languageId) { + $result = parent::getDb ()->prepare('select id, lang_code from languages where id = ?'); + $result->execute (array ($languageId)); + if ($post = $result->fetchObject ()) { + return new Language ($post->id, Language::getLanguageString ($post->lang_code)); + } + return NULL; + } + + + + public static function getAllLanguages() { + $result = parent::getDb ()->query('select languages.id as id, languages.lang_code as lang_code, count(*) as count +from languages, books_languages_link +where languages.id = books_languages_link.lang_code +group by languages.id, books_languages_link.lang_code +order by languages.lang_code'); + $entryArray = array(); + while ($post = $result->fetchObject ()) + { + $language = new Language ($post->id, $post->lang_code); + array_push ($entryArray, new Entry (Language::getLanguageString ($language->lang_code), $language->getEntryId (), + str_format (localize("bookword", $post->count), $post->count), "text", + array ( new LinkNavigation ($language->getUri ())), "", $post->count)); + } + return $entryArray; + } +} diff --git a/sources/lib/Link.php b/sources/lib/Link.php new file mode 100644 index 0000000..15d483a --- /dev/null +++ b/sources/lib/Link.php @@ -0,0 +1,41 @@ + + */ + +class Link +{ + const OPDS_THUMBNAIL_TYPE = "http://opds-spec.org/image/thumbnail"; + const OPDS_IMAGE_TYPE = "http://opds-spec.org/image"; + const OPDS_ACQUISITION_TYPE = "http://opds-spec.org/acquisition"; + const OPDS_NAVIGATION_TYPE = "application/atom+xml;profile=opds-catalog;kind=navigation"; + const OPDS_PAGING_TYPE = "application/atom+xml;profile=opds-catalog;kind=acquisition"; + + public $href; + public $type; + public $rel; + public $title; + public $facetGroup; + public $activeFacet; + + public function __construct($phref, $ptype, $prel = NULL, $ptitle = NULL, $pfacetGroup = NULL, $pactiveFacet = FALSE) { + $this->href = $phref; + $this->type = $ptype; + $this->rel = $prel; + $this->title = $ptitle; + $this->facetGroup = $pfacetGroup; + $this->activeFacet = $pactiveFacet; + } + + public function hrefXhtml () { + return $this->href; + } + + public function getScriptName() { + $parts = explode('/', $_SERVER["SCRIPT_NAME"]); + return $parts[count($parts) - 1]; + } +} diff --git a/sources/lib/LinkFacet.php b/sources/lib/LinkFacet.php new file mode 100644 index 0000000..9ea9d63 --- /dev/null +++ b/sources/lib/LinkFacet.php @@ -0,0 +1,16 @@ + + */ + +class LinkFacet extends Link +{ + public function __construct($phref, $ptitle = NULL, $pfacetGroup = NULL, $pactiveFacet = FALSE) { + parent::__construct ($phref, Link::OPDS_PAGING_TYPE, "http://opds-spec.org/facet", $ptitle, $pfacetGroup, $pactiveFacet); + if (!is_null (GetUrlParam (DB))) $this->href = addURLParameter ($this->href, DB, GetUrlParam (DB)); + $this->href = parent::getScriptName() . $this->href; + } +} diff --git a/sources/lib/LinkNavigation.php b/sources/lib/LinkNavigation.php new file mode 100644 index 0000000..98e6f93 --- /dev/null +++ b/sources/lib/LinkNavigation.php @@ -0,0 +1,21 @@ + + */ + +class LinkNavigation extends Link +{ + public function __construct($phref, $prel = NULL, $ptitle = NULL) { + parent::__construct ($phref, Link::OPDS_NAVIGATION_TYPE, $prel, $ptitle); + if (!is_null (GetUrlParam (DB))) $this->href = addURLParameter ($this->href, DB, GetUrlParam (DB)); + if (!preg_match ("#^\?(.*)#", $this->href) && !empty ($this->href)) $this->href = "?" . $this->href; + if (preg_match ("/(bookdetail|getJSON).php/", parent::getScriptName())) { + $this->href = "index.php" . $this->href; + } else { + $this->href = parent::getScriptName() . $this->href; + } + } +} diff --git a/sources/lib/OPDS_renderer.php b/sources/lib/OPDS_renderer.php new file mode 100644 index 0000000..893e342 --- /dev/null +++ b/sources/lib/OPDS_renderer.php @@ -0,0 +1,278 @@ + + */ + +require_once dirname(__FILE__) . '/../base.php'; + +class OPDSRenderer +{ + private $xmlStream = NULL; + private $updated = NULL; + + private function getUpdatedTime () { + if (is_null ($this->updated)) { + $this->updated = time(); + } + return date (DATE_ATOM, $this->updated); + } + + private function getXmlStream () { + if (is_null ($this->xmlStream)) { + $this->xmlStream = new XMLWriter(); + $this->xmlStream->openMemory(); + $this->xmlStream->setIndent (true); + } + return $this->xmlStream; + } + + public function getOpenSearch () { + global $config; + $xml = new XMLWriter (); + $xml->openMemory (); + $xml->setIndent (true); + $xml->startDocument('1.0','UTF-8'); + $xml->startElement ("OpenSearchDescription"); + $xml->writeAttribute ("xmlns", "http://a9.com/-/spec/opensearch/1.1/"); + $xml->startElement ("ShortName"); + $xml->text ("My catalog"); + $xml->endElement (); + $xml->startElement ("Description"); + $xml->text ("Search for ebooks"); + $xml->endElement (); + $xml->startElement ("InputEncoding"); + $xml->text ("UTF-8"); + $xml->endElement (); + $xml->startElement ("OutputEncoding"); + $xml->text ("UTF-8"); + $xml->endElement (); + $xml->startElement ("Image"); + $xml->writeAttribute ("type", "image/x-icon"); + $xml->writeAttribute ("width", "16"); + $xml->writeAttribute ("height", "16"); + $xml->text ($config['cops_icon']); + $xml->endElement (); + $xml->startElement ("Url"); + $xml->writeAttribute ("type", 'application/atom+xml'); + $urlparam = "?query={searchTerms}"; + if (!is_null (GetUrlParam (DB))) $urlparam = addURLParameter ($urlparam, DB, GetUrlParam (DB)); + $urlparam = str_replace ("%7B", "{", $urlparam); + $urlparam = str_replace ("%7D", "}", $urlparam); + $xml->writeAttribute ("template", $config['cops_full_url'] . 'feed.php' . $urlparam); + $xml->endElement (); + $xml->startElement ("Query"); + $xml->writeAttribute ("role", "example"); + $xml->writeAttribute ("searchTerms", "robot"); + $xml->endElement (); + $xml->endElement (); + $xml->endDocument(); + return $xml->outputMemory(true); + } + + private function startXmlDocument ($page) { + global $config; + self::getXmlStream ()->startDocument('1.0','UTF-8'); + self::getXmlStream ()->startElement ("feed"); + self::getXmlStream ()->writeAttribute ("xmlns", "http://www.w3.org/2005/Atom"); + self::getXmlStream ()->writeAttribute ("xmlns:xhtml", "http://www.w3.org/1999/xhtml"); + self::getXmlStream ()->writeAttribute ("xmlns:opds", "http://opds-spec.org/2010/catalog"); + self::getXmlStream ()->writeAttribute ("xmlns:opensearch", "http://a9.com/-/spec/opensearch/1.1/"); + self::getXmlStream ()->writeAttribute ("xmlns:dcterms", "http://purl.org/dc/terms/"); + self::getXmlStream ()->startElement ("title"); + self::getXmlStream ()->text ($page->title); + self::getXmlStream ()->endElement (); + if ($page->subtitle != "") + { + self::getXmlStream ()->startElement ("subtitle"); + self::getXmlStream ()->text ($page->subtitle); + self::getXmlStream ()->endElement (); + } + self::getXmlStream ()->startElement ("id"); + if ($page->idPage) + { + $idPage = $page->idPage; + if (!is_null (GetUrlParam (DB))) $idPage = str_replace ("cops:", "cops:" . GetUrlParam (DB) . ":", $idPage); + self::getXmlStream ()->text ($idPage); + } + else + { + self::getXmlStream ()->text ($_SERVER['REQUEST_URI']); + } + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("updated"); + self::getXmlStream ()->text (self::getUpdatedTime ()); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("icon"); + self::getXmlStream ()->text ($page->favicon); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("author"); + self::getXmlStream ()->startElement ("name"); + self::getXmlStream ()->text ($page->authorName); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("uri"); + self::getXmlStream ()->text ($page->authorUri); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("email"); + self::getXmlStream ()->text ($page->authorEmail); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->endElement (); + $link = new LinkNavigation ("", "start", "Home"); + self::renderLink ($link); + $link = new LinkNavigation ("?" . getQueryString (), "self"); + self::renderLink ($link); + $urlparam = "?"; + if (!is_null (GetUrlParam (DB))) $urlparam = addURLParameter ($urlparam, DB, GetUrlParam (DB)); + if ($config['cops_generate_invalid_opds_stream'] == 0 || preg_match("/(MantanoReader|FBReader)/", $_SERVER['HTTP_USER_AGENT'])) { + // Good and compliant way of handling search + $urlparam = addURLParameter ($urlparam, "page", Base::PAGE_OPENSEARCH); + $link = new Link ("feed.php" . $urlparam, "application/opensearchdescription+xml", "search", "Search here"); + } + else + { + // Bad way, will be removed when OPDS client are fixed + $urlparam = addURLParameter ($urlparam, "query", "{searchTerms}"); + $urlparam = str_replace ("%7B", "{", $urlparam); + $urlparam = str_replace ("%7D", "}", $urlparam); + $link = new Link ($config['cops_full_url'] . 'feed.php' . $urlparam, "application/atom+xml", "search", "Search here"); + } + self::renderLink ($link); + if ($page->containsBook () && !is_null ($config['cops_books_filter']) && count ($config['cops_books_filter']) > 0) { + $Urlfilter = getURLParam ("tag", ""); + foreach ($config['cops_books_filter'] as $lib => $filter) { + $link = new LinkFacet ("?" . addURLParameter (getQueryString (), "tag", $filter), $lib, localize ("tagword.title"), $filter == $Urlfilter); + self::renderLink ($link); + } + } + } + + private function endXmlDocument () { + self::getXmlStream ()->endElement (); + self::getXmlStream ()->endDocument (); + return self::getXmlStream ()->outputMemory(true); + } + + private function renderLink ($link) { + self::getXmlStream ()->startElement ("link"); + self::getXmlStream ()->writeAttribute ("href", $link->href); + self::getXmlStream ()->writeAttribute ("type", $link->type); + if (!is_null ($link->rel)) { + self::getXmlStream ()->writeAttribute ("rel", $link->rel); + } + if (!is_null ($link->title)) { + self::getXmlStream ()->writeAttribute ("title", $link->title); + } + if (!is_null ($link->facetGroup)) { + self::getXmlStream ()->writeAttribute ("opds:facetGroup", $link->facetGroup); + } + if ($link->activeFacet) { + self::getXmlStream ()->writeAttribute ("opds:activeFacet", "true"); + } + self::getXmlStream ()->endElement (); + } + + private function getPublicationDate($book) { + $dateYmd = substr($book->pubdate, 0, 10); + $pubdate = \DateTime::createFromFormat('Y-m-d', $dateYmd); + if ($pubdate === false || + $pubdate->format ("Y") == "0101" || + $pubdate->format ("Y") == "0100") { + return ""; + } + return $pubdate->format("Y-m-d"); + } + + private function renderEntry ($entry) { + self::getXmlStream ()->startElement ("title"); + self::getXmlStream ()->text ($entry->title); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("updated"); + self::getXmlStream ()->text (self::getUpdatedTime ()); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("id"); + self::getXmlStream ()->text ($entry->id); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("content"); + self::getXmlStream ()->writeAttribute ("type", $entry->contentType); + if ($entry->contentType == "text") { + self::getXmlStream ()->text ($entry->content); + } else { + self::getXmlStream ()->writeRaw ($entry->content); + } + self::getXmlStream ()->endElement (); + foreach ($entry->linkArray as $link) { + self::renderLink ($link); + } + + if (get_class ($entry) != "EntryBook") { + return; + } + + foreach ($entry->book->getAuthors () as $author) { + self::getXmlStream ()->startElement ("author"); + self::getXmlStream ()->startElement ("name"); + self::getXmlStream ()->text ($author->name); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("uri"); + self::getXmlStream ()->text ("feed.php" . $author->getUri ()); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->endElement (); + } + foreach ($entry->book->getTags () as $category) { + self::getXmlStream ()->startElement ("category"); + self::getXmlStream ()->writeAttribute ("term", $category->name); + self::getXmlStream ()->writeAttribute ("label", $category->name); + self::getXmlStream ()->endElement (); + } + if ($entry->book->getPubDate () != "") { + self::getXmlStream ()->startElement ("dcterms:issued"); + self::getXmlStream ()->text (self::getPublicationDate($entry->book)); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("published"); + self::getXmlStream ()->text (self::getPublicationDate($entry->book) . "T08:08:08Z"); + self::getXmlStream ()->endElement (); + } + + $lang = $entry->book->getLanguages (); + if (!empty ($lang)) { + self::getXmlStream ()->startElement ("dcterms:language"); + self::getXmlStream ()->text ($lang); + self::getXmlStream ()->endElement (); + } + + } + + public function render ($page) { + global $config; + self::startXmlDocument ($page); + if ($page->isPaginated ()) + { + self::getXmlStream ()->startElement ("opensearch:totalResults"); + self::getXmlStream ()->text ($page->totalNumber); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("opensearch:itemsPerPage"); + self::getXmlStream ()->text ($config['cops_max_item_per_page']); + self::getXmlStream ()->endElement (); + self::getXmlStream ()->startElement ("opensearch:startIndex"); + self::getXmlStream ()->text (($page->n - 1) * $config['cops_max_item_per_page'] + 1); + self::getXmlStream ()->endElement (); + $prevLink = $page->getPrevLink (); + $nextLink = $page->getNextLink (); + if (!is_null ($prevLink)) { + self::renderLink ($prevLink); + } + if (!is_null ($nextLink)) { + self::renderLink ($nextLink); + } + } + foreach ($page->entryArray as $entry) { + self::getXmlStream ()->startElement ("entry"); + self::renderEntry ($entry); + self::getXmlStream ()->endElement (); + } + return self::endXmlDocument (); + } +} + diff --git a/sources/lib/Page.php b/sources/lib/Page.php new file mode 100644 index 0000000..4fb4b17 --- /dev/null +++ b/sources/lib/Page.php @@ -0,0 +1,180 @@ + + */ + +class Page +{ + public $title; + public $subtitle = ""; + public $authorName = ""; + public $authorUri = ""; + public $authorEmail = ""; + public $idPage; + public $idGet; + public $query; + public $favicon; + public $n; + public $book; + public $totalNumber = -1; + + /* @var Entry[] */ + public $entryArray = array(); + + public static function getPage ($pageId, $id, $query, $n) + { + switch ($pageId) { + case Base::PAGE_ALL_AUTHORS : + return new PageAllAuthors ($id, $query, $n); + case Base::PAGE_AUTHORS_FIRST_LETTER : + return new PageAllAuthorsLetter ($id, $query, $n); + case Base::PAGE_AUTHOR_DETAIL : + return new PageAuthorDetail ($id, $query, $n); + case Base::PAGE_ALL_TAGS : + return new PageAllTags ($id, $query, $n); + case Base::PAGE_TAG_DETAIL : + return new PageTagDetail ($id, $query, $n); + case Base::PAGE_ALL_LANGUAGES : + return new PageAllLanguages ($id, $query, $n); + case Base::PAGE_LANGUAGE_DETAIL : + return new PageLanguageDetail ($id, $query, $n); + case Base::PAGE_ALL_CUSTOMS : + return new PageAllCustoms ($id, $query, $n); + case Base::PAGE_CUSTOM_DETAIL : + return new PageCustomDetail ($id, $query, $n); + case Base::PAGE_ALL_RATINGS : + return new PageAllRating ($id, $query, $n); + case Base::PAGE_RATING_DETAIL : + return new PageRatingDetail ($id, $query, $n); + case Base::PAGE_ALL_SERIES : + return new PageAllSeries ($id, $query, $n); + case Base::PAGE_ALL_BOOKS : + return new PageAllBooks ($id, $query, $n); + case Base::PAGE_ALL_BOOKS_LETTER: + return new PageAllBooksLetter ($id, $query, $n); + case Base::PAGE_ALL_RECENT_BOOKS : + return new PageRecentBooks ($id, $query, $n); + case Base::PAGE_SERIE_DETAIL : + return new PageSerieDetail ($id, $query, $n); + case Base::PAGE_OPENSEARCH_QUERY : + return new PageQueryResult ($id, $query, $n); + case Base::PAGE_BOOK_DETAIL : + return new PageBookDetail ($id, $query, $n); + case Base::PAGE_ALL_PUBLISHERS: + return new PageAllPublishers ($id, $query, $n); + case Base::PAGE_PUBLISHER_DETAIL : + return new PagePublisherDetail ($id, $query, $n); + case Base::PAGE_ABOUT : + return new PageAbout ($id, $query, $n); + case Base::PAGE_CUSTOMIZE : + return new PageCustomize ($id, $query, $n); + default: + $page = new Page ($id, $query, $n); + $page->idPage = "cops:catalog"; + return $page; + } + } + + public function __construct($pid, $pquery, $pn) { + global $config; + + $this->idGet = $pid; + $this->query = $pquery; + $this->n = $pn; + $this->favicon = $config['cops_icon']; + $this->authorName = empty($config['cops_author_name']) ? utf8_encode('Sébastien Lucas') : $config['cops_author_name']; + $this->authorUri = empty($config['cops_author_uri']) ? 'http://blog.slucas.fr' : $config['cops_author_uri']; + $this->authorEmail = empty($config['cops_author_email']) ? 'sebastien@slucas.fr' : $config['cops_author_email']; + } + + public function InitializeContent () + { + global $config; + $this->title = $config['cops_title_default']; + $this->subtitle = $config['cops_subtitle_default']; + if (Base::noDatabaseSelected ()) { + $i = 0; + foreach (Base::getDbNameList () as $key) { + $nBooks = Book::getBookCount ($i); + array_push ($this->entryArray, new Entry ($key, "cops:{$i}:catalog", + str_format (localize ("bookword", $nBooks), $nBooks), "text", + array ( new LinkNavigation ("?" . DB . "={$i}")), "", $nBooks)); + $i++; + Base::clearDb (); + } + } else { + if (!in_array (PageQueryResult::SCOPE_AUTHOR, getCurrentOption ('ignored_categories'))) { + array_push ($this->entryArray, Author::getCount()); + } + if (!in_array (PageQueryResult::SCOPE_SERIES, getCurrentOption ('ignored_categories'))) { + $series = Serie::getCount(); + if (!is_null ($series)) array_push ($this->entryArray, $series); + } + if (!in_array (PageQueryResult::SCOPE_PUBLISHER, getCurrentOption ('ignored_categories'))) { + $publisher = Publisher::getCount(); + if (!is_null ($publisher)) array_push ($this->entryArray, $publisher); + } + if (!in_array (PageQueryResult::SCOPE_TAG, getCurrentOption ('ignored_categories'))) { + $tags = Tag::getCount(); + if (!is_null ($tags)) array_push ($this->entryArray, $tags); + } + if (!in_array (PageQueryResult::SCOPE_RATING, getCurrentOption ('ignored_categories'))) { + $rating = Rating::getCount(); + if (!is_null ($rating)) array_push ($this->entryArray, $rating); + } + if (!in_array ("language", getCurrentOption ('ignored_categories'))) { + $languages = Language::getCount(); + if (!is_null ($languages)) array_push ($this->entryArray, $languages); + } + foreach ($config['cops_calibre_custom_column'] as $lookup) { + $customColumn = CustomColumnType::createByLookup($lookup); + if (!is_null ($customColumn) && $customColumn->isSearchable()) { + array_push ($this->entryArray, $customColumn->getCount()); + } + } + $this->entryArray = array_merge ($this->entryArray, Book::getCount()); + + if (Base::isMultipleDatabaseEnabled ()) $this->title = Base::getDbName (); + } + } + + public function isPaginated () + { + return (getCurrentOption ("max_item_per_page") != -1 && + $this->totalNumber != -1 && + $this->totalNumber > getCurrentOption ("max_item_per_page")); + } + + public function getNextLink () + { + $currentUrl = preg_replace ("/\&n=.*?$/", "", "?" . getQueryString ()); + if (($this->n) * getCurrentOption ("max_item_per_page") < $this->totalNumber) { + return new LinkNavigation ($currentUrl . "&n=" . ($this->n + 1), "next", localize ("paging.next.alternate")); + } + return NULL; + } + + public function getPrevLink () + { + $currentUrl = preg_replace ("/\&n=.*?$/", "", "?" . getQueryString ()); + if ($this->n > 1) { + return new LinkNavigation ($currentUrl . "&n=" . ($this->n - 1), "previous", localize ("paging.previous.alternate")); + } + return NULL; + } + + public function getMaxPage () + { + return ceil ($this->totalNumber / getCurrentOption ("max_item_per_page")); + } + + public function containsBook () + { + if (count ($this->entryArray) == 0) return false; + if (get_class ($this->entryArray [0]) == "EntryBook") return true; + return false; + } +} diff --git a/sources/lib/PageAbout.php b/sources/lib/PageAbout.php new file mode 100644 index 0000000..9d10bd4 --- /dev/null +++ b/sources/lib/PageAbout.php @@ -0,0 +1,15 @@ + + */ + +class PageAbout extends Page +{ + public function InitializeContent () + { + $this->title = localize ("about.title"); + } +} diff --git a/sources/lib/PageAllAuthors.php b/sources/lib/PageAllAuthors.php new file mode 100644 index 0000000..239e7cd --- /dev/null +++ b/sources/lib/PageAllAuthors.php @@ -0,0 +1,22 @@ + + */ + +class PageAllAuthors extends Page +{ + public function InitializeContent () + { + $this->title = localize("authors.title"); + if (getCurrentOption ("author_split_first_letter") == 1) { + $this->entryArray = Author::getAllAuthorsByFirstLetter(); + } + else { + $this->entryArray = Author::getAllAuthors(); + } + $this->idPage = Author::ALL_AUTHORS_ID; + } +} diff --git a/sources/lib/PageAllAuthorsLetter.php b/sources/lib/PageAllAuthorsLetter.php new file mode 100644 index 0000000..7acc39a --- /dev/null +++ b/sources/lib/PageAllAuthorsLetter.php @@ -0,0 +1,17 @@ + + */ + +class PageAllAuthorsLetter extends Page +{ + public function InitializeContent () + { + $this->idPage = Author::getEntryIdByLetter ($this->idGet); + $this->entryArray = Author::getAuthorsByStartingLetter ($this->idGet); + $this->title = str_format (localize ("splitByLetter.letter"), str_format (localize ("authorword", count ($this->entryArray)), count ($this->entryArray)), $this->idGet); + } +} diff --git a/sources/lib/PageAllBooks.php b/sources/lib/PageAllBooks.php new file mode 100644 index 0000000..88d5151 --- /dev/null +++ b/sources/lib/PageAllBooks.php @@ -0,0 +1,22 @@ + + */ + +class PageAllBooks extends Page +{ + public function InitializeContent () + { + $this->title = localize ("allbooks.title"); + if (getCurrentOption ("titles_split_first_letter") == 1) { + $this->entryArray = Book::getAllBooks(); + } + else { + list ($this->entryArray, $this->totalNumber) = Book::getBooks ($this->n); + } + $this->idPage = Book::ALL_BOOKS_ID; + } +} diff --git a/sources/lib/PageAllBooksLetter.php b/sources/lib/PageAllBooksLetter.php new file mode 100644 index 0000000..98bd36c --- /dev/null +++ b/sources/lib/PageAllBooksLetter.php @@ -0,0 +1,22 @@ + + */ + +class PageAllBooksLetter extends Page +{ + public function InitializeContent () + { + list ($this->entryArray, $this->totalNumber) = Book::getBooksByStartingLetter ($this->idGet, $this->n); + $this->idPage = Book::getEntryIdByLetter ($this->idGet); + + $count = $this->totalNumber; + if ($count == -1) + $count = count ($this->entryArray); + + $this->title = str_format (localize ("splitByLetter.letter"), str_format (localize ("bookword", $count), $count), $this->idGet); + } +} diff --git a/sources/lib/PageAllCustoms.php b/sources/lib/PageAllCustoms.php new file mode 100644 index 0000000..1f7282d --- /dev/null +++ b/sources/lib/PageAllCustoms.php @@ -0,0 +1,20 @@ + + */ + +class PageAllCustoms extends Page +{ + public function InitializeContent () + { + $customId = getURLParam ("custom", NULL); + $columnType = CustomColumnType::createByCustomID($customId); + + $this->title = $columnType->getTitle(); + $this->entryArray = $columnType->getAllCustomValues(); + $this->idPage = $columnType->getAllCustomsId(); + } +} diff --git a/sources/lib/PageAllLanguages.php b/sources/lib/PageAllLanguages.php new file mode 100644 index 0000000..1217e39 --- /dev/null +++ b/sources/lib/PageAllLanguages.php @@ -0,0 +1,17 @@ + + */ + +class PageAllLanguages extends Page +{ + public function InitializeContent () + { + $this->title = localize("languages.title"); + $this->entryArray = Language::getAllLanguages(); + $this->idPage = Language::ALL_LANGUAGES_ID; + } +} diff --git a/sources/lib/PageAllPublishers.php b/sources/lib/PageAllPublishers.php new file mode 100644 index 0000000..80157a6 --- /dev/null +++ b/sources/lib/PageAllPublishers.php @@ -0,0 +1,17 @@ + + */ + +class PageAllPublishers extends Page +{ + public function InitializeContent () + { + $this->title = localize("publishers.title"); + $this->entryArray = Publisher::getAllPublishers(); + $this->idPage = Publisher::ALL_PUBLISHERS_ID; + } +} diff --git a/sources/lib/PageAllRating.php b/sources/lib/PageAllRating.php new file mode 100644 index 0000000..798fc3d --- /dev/null +++ b/sources/lib/PageAllRating.php @@ -0,0 +1,17 @@ + + */ + +class PageAllRating extends Page +{ + public function InitializeContent () + { + $this->title = localize("ratings.title"); + $this->entryArray = Rating::getAllRatings(); + $this->idPage = Rating::ALL_RATING_ID; + } +} diff --git a/sources/lib/PageAllSeries.php b/sources/lib/PageAllSeries.php new file mode 100644 index 0000000..5998e58 --- /dev/null +++ b/sources/lib/PageAllSeries.php @@ -0,0 +1,17 @@ + + */ + +class PageAllSeries extends Page +{ + public function InitializeContent () + { + $this->title = localize("series.title"); + $this->entryArray = Serie::getAllSeries(); + $this->idPage = Serie::ALL_SERIES_ID; + } +} diff --git a/sources/lib/PageAllTags.php b/sources/lib/PageAllTags.php new file mode 100644 index 0000000..c8994af --- /dev/null +++ b/sources/lib/PageAllTags.php @@ -0,0 +1,17 @@ + + */ + +class PageAllTags extends Page +{ + public function InitializeContent () + { + $this->title = localize("tags.title"); + $this->entryArray = Tag::getAllTags(); + $this->idPage = Tag::ALL_TAGS_ID; + } +} diff --git a/sources/lib/PageAuthorDetail.php b/sources/lib/PageAuthorDetail.php new file mode 100644 index 0000000..d502390 --- /dev/null +++ b/sources/lib/PageAuthorDetail.php @@ -0,0 +1,18 @@ + + */ + +class PageAuthorDetail extends Page +{ + public function InitializeContent () + { + $author = Author::getAuthorById ($this->idGet); + $this->idPage = $author->getEntryId (); + $this->title = $author->name; + list ($this->entryArray, $this->totalNumber) = Book::getBooksByAuthor ($this->idGet, $this->n); + } +} diff --git a/sources/lib/PageBookDetail.php b/sources/lib/PageBookDetail.php new file mode 100644 index 0000000..7eeadde --- /dev/null +++ b/sources/lib/PageBookDetail.php @@ -0,0 +1,16 @@ + + */ + +class PageBookDetail extends Page +{ + public function InitializeContent () + { + $this->book = Book::getBookById ($this->idGet); + $this->title = $this->book->title; + } +} diff --git a/sources/lib/PageCustomDetail.php b/sources/lib/PageCustomDetail.php new file mode 100644 index 0000000..29b33fa --- /dev/null +++ b/sources/lib/PageCustomDetail.php @@ -0,0 +1,19 @@ + + */ + +class PageCustomDetail extends Page +{ + public function InitializeContent () + { + $customId = getURLParam ("custom", NULL); + $custom = CustomColumn::createCustom ($customId, $this->idGet); + $this->idPage = $custom->getEntryId (); + $this->title = $custom->value; + list ($this->entryArray, $this->totalNumber) = Book::getBooksByCustom ($custom, $this->idGet, $this->n); + } +} diff --git a/sources/lib/PageCustomize.php b/sources/lib/PageCustomize.php new file mode 100644 index 0000000..80fcd14 --- /dev/null +++ b/sources/lib/PageCustomize.php @@ -0,0 +1,100 @@ + + */ + +class PageCustomize extends Page +{ + private function isChecked ($key, $testedValue = 1) { + $value = getCurrentOption ($key); + if (is_array ($value)) { + if (in_array ($testedValue, $value)) { + return "checked='checked'"; + } + } else { + if ($value == $testedValue) { + return "checked='checked'"; + } + } + return ""; + } + + private function isSelected ($key, $value) { + if (getCurrentOption ($key) == $value) { + return "selected='selected'"; + } + return ""; + } + + private function getStyleList () { + $result = array (); + foreach (glob ("templates/" . getCurrentTemplate () . "/styles/style-*.css") as $filename) { + if (preg_match ('/styles\/style-(.*?)\.css/', $filename, $m)) { + array_push ($result, $m [1]); + } + } + return $result; + } + + public function InitializeContent () + { + $this->title = localize ("customize.title"); + $this->entryArray = array (); + + $ignoredBaseArray = array (PageQueryResult::SCOPE_AUTHOR, + PageQueryResult::SCOPE_TAG, + PageQueryResult::SCOPE_SERIES, + PageQueryResult::SCOPE_PUBLISHER, + PageQueryResult::SCOPE_RATING, + "language"); + + $content = ""; + array_push ($this->entryArray, new Entry ("Template", "", + "Click to switch to Bootstrap", "text", + array ())); + if (!preg_match("/(Kobo|Kindle\/3.0|EBRD1101)/", $_SERVER['HTTP_USER_AGENT'])) { + $content .= ''; + } else { + foreach ($this-> getStyleList () as $filename) { + $content .= "isChecked ("style", $filename) . " />"; + } + } + array_push ($this->entryArray, new Entry (localize ("customize.style"), "", + $content, "text", + array ())); + if (!useServerSideRendering ()) { + $content = 'isChecked ("use_fancyapps") . ' />'; + array_push ($this->entryArray, new Entry (localize ("customize.fancybox"), "", + $content, "text", + array ())); + } + $content = ''; + array_push ($this->entryArray, new Entry (localize ("customize.paging"), "", + $content, "text", + array ())); + $content = ''; + array_push ($this->entryArray, new Entry (localize ("customize.email"), "", + $content, "text", + array ())); + $content = 'isChecked ("html_tag_filter") . ' />'; + array_push ($this->entryArray, new Entry (localize ("customize.filter"), "", + $content, "text", + array ())); + $content = ""; + foreach ($ignoredBaseArray as $key) { + $keyPlural = preg_replace ('/(ss)$/', 's', $key . "s"); + $content .= 'isChecked ("ignored_categories", $key) . ' > ' . localize ("{$keyPlural}.title") . ' '; + } + + array_push ($this->entryArray, new Entry (localize ("customize.ignored"), "", + $content, "text", + array ())); + } +} diff --git a/sources/lib/PageLanguageDetail.php b/sources/lib/PageLanguageDetail.php new file mode 100644 index 0000000..dbbf86a --- /dev/null +++ b/sources/lib/PageLanguageDetail.php @@ -0,0 +1,18 @@ + + */ + +class PageLanguageDetail extends Page +{ + public function InitializeContent () + { + $language = Language::getLanguageById ($this->idGet); + $this->idPage = $language->getEntryId (); + $this->title = $language->lang_code; + list ($this->entryArray, $this->totalNumber) = Book::getBooksByLanguage ($this->idGet, $this->n); + } +} diff --git a/sources/lib/PagePublisherDetail.php b/sources/lib/PagePublisherDetail.php new file mode 100644 index 0000000..7b597f9 --- /dev/null +++ b/sources/lib/PagePublisherDetail.php @@ -0,0 +1,18 @@ + + */ + +class PagePublisherDetail extends Page +{ + public function InitializeContent () + { + $publisher = Publisher::getPublisherById ($this->idGet); + $this->title = $publisher->name; + list ($this->entryArray, $this->totalNumber) = Book::getBooksByPublisher ($this->idGet, $this->n); + $this->idPage = $publisher->getEntryId (); + } +} diff --git a/sources/lib/PageQueryResult.php b/sources/lib/PageQueryResult.php new file mode 100644 index 0000000..7bafffc --- /dev/null +++ b/sources/lib/PageQueryResult.php @@ -0,0 +1,163 @@ + + */ + +class PageQueryResult extends Page +{ + const SCOPE_TAG = "tag"; + const SCOPE_RATING = "rating"; + const SCOPE_SERIES = "series"; + const SCOPE_AUTHOR = "author"; + const SCOPE_BOOK = "book"; + const SCOPE_PUBLISHER = "publisher"; + + private function useTypeahead () { + return !is_null (getURLParam ("search")); + } + + private function searchByScope ($scope, $limit = FALSE) { + $n = $this->n; + $numberPerPage = NULL; + $queryNormedAndUp = trim($this->query); + if (useNormAndUp ()) { + $queryNormedAndUp = normAndUp ($this->query); + } + if ($limit) { + $n = 1; + $numberPerPage = 5; + } + switch ($scope) { + case self::SCOPE_BOOK : + $array = Book::getBooksByStartingLetter ('%' . $queryNormedAndUp, $n, NULL, $numberPerPage); + break; + case self::SCOPE_AUTHOR : + $array = Author::getAuthorsForSearch ('%' . $queryNormedAndUp); + break; + case self::SCOPE_SERIES : + $array = Serie::getAllSeriesByQuery ($queryNormedAndUp); + break; + case self::SCOPE_TAG : + $array = Tag::getAllTagsByQuery ($queryNormedAndUp, $n, NULL, $numberPerPage); + break; + case self::SCOPE_PUBLISHER : + $array = Publisher::getAllPublishersByQuery ($queryNormedAndUp); + break; + default: + $array = Book::getBooksByQuery ( + array ("all" => "%" . $queryNormedAndUp . "%"), $n); + } + + return $array; + } + + public function doSearchByCategory () { + $database = GetUrlParam (DB); + $out = array (); + $pagequery = Base::PAGE_OPENSEARCH_QUERY; + $dbArray = array (""); + $d = $database; + $query = $this->query; + // Special case when no databases were chosen, we search on all databases + if (Base::noDatabaseSelected ()) { + $dbArray = Base::getDbNameList (); + $d = 0; + } + foreach ($dbArray as $key) { + if (Base::noDatabaseSelected ()) { + array_push ($this->entryArray, new Entry ($key, DB . ":query:{$d}", + " ", "text", + array ( new LinkNavigation ("?" . DB . "={$d}")), "tt-header")); + Base::getDb ($d); + } + foreach (array (PageQueryResult::SCOPE_BOOK, + PageQueryResult::SCOPE_AUTHOR, + PageQueryResult::SCOPE_SERIES, + PageQueryResult::SCOPE_TAG, + PageQueryResult::SCOPE_PUBLISHER) as $key) { + if (in_array($key, getCurrentOption ('ignored_categories'))) { + continue; + } + $array = $this->searchByScope ($key, TRUE); + + $i = 0; + if (count ($array) == 2 && is_array ($array [0])) { + $total = $array [1]; + $array = $array [0]; + } else { + $total = count($array); + } + if ($total > 0) { + // Comment to help the perl i18n script + // str_format (localize("bookword", count($array)) + // str_format (localize("authorword", count($array)) + // str_format (localize("seriesword", count($array)) + // str_format (localize("tagword", count($array)) + // str_format (localize("publisherword", count($array)) + array_push ($this->entryArray, new Entry (str_format (localize ("search.result.{$key}"), $this->query), DB . ":query:{$d}:{$key}", + str_format (localize("{$key}word", $total), $total), "text", + array ( new LinkNavigation ("?page={$pagequery}&query={$query}&db={$d}&scope={$key}")), + Base::noDatabaseSelected () ? "" : "tt-header", $total)); + } + if (!Base::noDatabaseSelected () && $this->useTypeahead ()) { + foreach ($array as $entry) { + array_push ($this->entryArray, $entry); + $i++; + if ($i > 4) { break; }; + } + } + } + $d++; + if (Base::noDatabaseSelected ()) { + Base::clearDb (); + } + } + return $out; + } + + public function InitializeContent () + { + $scope = getURLParam ("scope"); + if (empty ($scope)) { + $this->title = str_format (localize ("search.result"), $this->query); + } else { + // Comment to help the perl i18n script + // str_format (localize ("search.result.author"), $this->query) + // str_format (localize ("search.result.tag"), $this->query) + // str_format (localize ("search.result.series"), $this->query) + // str_format (localize ("search.result.book"), $this->query) + // str_format (localize ("search.result.publisher"), $this->query) + $this->title = str_format (localize ("search.result.{$scope}"), $this->query); + } + + $crit = "%" . $this->query . "%"; + + // Special case when we are doing a search and no database is selected + if (Base::noDatabaseSelected () && !$this->useTypeahead ()) { + $i = 0; + foreach (Base::getDbNameList () as $key) { + Base::clearDb (); + list ($array, $totalNumber) = Book::getBooksByQuery (array ("all" => $crit), 1, $i, 1); + array_push ($this->entryArray, new Entry ($key, DB . ":query:{$i}", + str_format (localize ("bookword", $totalNumber), $totalNumber), "text", + array ( new LinkNavigation ("?" . DB . "={$i}&page=9&query=" . $this->query)), "", $totalNumber)); + $i++; + } + return; + } + if (empty ($scope)) { + $this->doSearchByCategory (); + return; + } + + $array = $this->searchByScope ($scope); + if (count ($array) == 2 && is_array ($array [0])) { + list ($this->entryArray, $this->totalNumber) = $array; + } else { + $this->entryArray = $array; + } + } +} diff --git a/sources/lib/PageRatingDetail.php b/sources/lib/PageRatingDetail.php new file mode 100644 index 0000000..64c22c6 --- /dev/null +++ b/sources/lib/PageRatingDetail.php @@ -0,0 +1,18 @@ + + */ + +class PageRatingDetail extends Page +{ + public function InitializeContent () + { + $rating = Rating::getRatingById ($this->idGet); + $this->idPage = $rating->getEntryId (); + $this->title =str_format (localize ("ratingword", $rating->name/2), $rating->name/2); + list ($this->entryArray, $this->totalNumber) = Book::getBooksByRating ($this->idGet, $this->n); + } +} diff --git a/sources/lib/PageRecentBooks.php b/sources/lib/PageRecentBooks.php new file mode 100644 index 0000000..2d484ed --- /dev/null +++ b/sources/lib/PageRecentBooks.php @@ -0,0 +1,17 @@ + + */ + +class PageRecentBooks extends Page +{ + public function InitializeContent () + { + $this->title = localize ("recent.title"); + $this->entryArray = Book::getAllRecentBooks (); + $this->idPage = Book::ALL_RECENT_BOOKS_ID; + } +} diff --git a/sources/lib/PageSerieDetail.php b/sources/lib/PageSerieDetail.php new file mode 100644 index 0000000..f3d87cc --- /dev/null +++ b/sources/lib/PageSerieDetail.php @@ -0,0 +1,18 @@ + + */ + +class PageSerieDetail extends Page +{ + public function InitializeContent () + { + $serie = Serie::getSerieById ($this->idGet); + $this->title = $serie->name; + list ($this->entryArray, $this->totalNumber) = Book::getBooksBySeries ($this->idGet, $this->n); + $this->idPage = $serie->getEntryId (); + } +} diff --git a/sources/lib/PageTagDetail.php b/sources/lib/PageTagDetail.php new file mode 100644 index 0000000..0fe1c58 --- /dev/null +++ b/sources/lib/PageTagDetail.php @@ -0,0 +1,18 @@ + + */ + +class PageTagDetail extends Page +{ + public function InitializeContent () + { + $tag = Tag::getTagById ($this->idGet); + $this->idPage = $tag->getEntryId (); + $this->title = $tag->name; + list ($this->entryArray, $this->totalNumber) = Book::getBooksByTag ($this->idGet, $this->n); + } +} diff --git a/sources/lib/Publisher.php b/sources/lib/Publisher.php new file mode 100644 index 0000000..892f982 --- /dev/null +++ b/sources/lib/Publisher.php @@ -0,0 +1,66 @@ + + */ + +class Publisher extends Base +{ + const ALL_PUBLISHERS_ID = "cops:publishers"; + const PUBLISHERS_COLUMNS = "publishers.id as id, publishers.name as name, count(*) as count"; + const SQL_ALL_PUBLISHERS = "select {0} from publishers, books_publishers_link where publishers.id = publisher group by publishers.id, publishers.name order by publishers.name"; + const SQL_PUBLISHERS_FOR_SEARCH = "select {0} from publishers, books_publishers_link where publishers.id = publisher and upper (publishers.name) like ? group by publishers.id, publishers.name order by publishers.name"; + + + public $id; + public $name; + + public function __construct($post) { + $this->id = $post->id; + $this->name = $post->name; + } + + public function getUri () { + return "?page=".parent::PAGE_PUBLISHER_DETAIL."&id=$this->id"; + } + + public function getEntryId () { + return self::ALL_PUBLISHERS_ID.":".$this->id; + } + + public static function getCount() { + // str_format (localize("publishers.alphabetical", count(array)) + return parent::getCountGeneric ("publishers", self::ALL_PUBLISHERS_ID, parent::PAGE_ALL_PUBLISHERS); + } + + public static function getPublisherByBookId ($bookId) { + $result = parent::getDb ()->prepare('select publishers.id as id, name +from books_publishers_link, publishers +where publishers.id = publisher and book = ?'); + $result->execute (array ($bookId)); + if ($post = $result->fetchObject ()) { + return new Publisher ($post); + } + return NULL; + } + + public static function getPublisherById ($publisherId) { + $result = parent::getDb ()->prepare('select id, name +from publishers where id = ?'); + $result->execute (array ($publisherId)); + if ($post = $result->fetchObject ()) { + return new Publisher ($post); + } + return NULL; + } + + public static function getAllPublishers() { + return Base::getEntryArrayWithBookNumber (self::SQL_ALL_PUBLISHERS, self::PUBLISHERS_COLUMNS, array (), "Publisher"); + } + + public static function getAllPublishersByQuery($query) { + return Base::getEntryArrayWithBookNumber (self::SQL_PUBLISHERS_FOR_SEARCH, self::PUBLISHERS_COLUMNS, array ('%' . $query . '%'), "Publisher"); + } +} diff --git a/sources/lib/Rating.php b/sources/lib/Rating.php new file mode 100644 index 0000000..db79ef4 --- /dev/null +++ b/sources/lib/Rating.php @@ -0,0 +1,60 @@ +id = $pid; + $this->name = $pname; + } + + public function getUri () { + return "?page=".parent::PAGE_RATING_DETAIL."&id=$this->id"; + } + + public function getEntryId () { + return self::ALL_RATING_ID.":".$this->id; + } + + public static function getCount() { + // str_format (localize("ratings", count(array)) + return parent::getCountGeneric ("ratings", self::ALL_RATING_ID, parent::PAGE_ALL_RATINGS, "ratings"); + } + + public static function getAllRatings() { + return self::getEntryArray (self::SQL_ALL_RATINGS, array ()); + } + + public static function getEntryArray ($query, $params) { + list (, $result) = parent::executeQuery ($query, self::RATING_COLUMNS, "", $params, -1); + $entryArray = array(); + while ($post = $result->fetchObject ()) + { + $ratingObj = new Rating ($post->id, $post->rating); + $rating=$post->rating/2; + $rating = str_format (localize("ratingword", $rating), $rating); + array_push ($entryArray, new Entry ($rating, $ratingObj->getEntryId (), + str_format (localize("bookword", $post->count), $post->count), "text", + array ( new LinkNavigation ($ratingObj->getUri ())), "", $post->count)); + } + return $entryArray; + } + + public static function getRatingById ($ratingId) { + $result = parent::getDb ()->prepare('select rating from ratings where id = ?'); + $result->execute (array ($ratingId)); + return new Rating ($ratingId, $result->fetchColumn ()); + } +} diff --git a/sources/lib/Serie.php b/sources/lib/Serie.php new file mode 100644 index 0000000..f4c1ecb --- /dev/null +++ b/sources/lib/Serie.php @@ -0,0 +1,64 @@ + + */ + +class Serie extends Base +{ + const ALL_SERIES_ID = "cops:series"; + const SERIES_COLUMNS = "series.id as id, series.name as name, series.sort as sort, count(*) as count"; + const SQL_ALL_SERIES = "select {0} from series, books_series_link where series.id = series group by series.id, series.name, series.sort order by series.sort"; + const SQL_SERIES_FOR_SEARCH = "select {0} from series, books_series_link where series.id = series and upper (series.name) like ? group by series.id, series.name, series.sort order by series.sort"; + + public $id; + public $name; + + public function __construct($post) { + $this->id = $post->id; + $this->name = $post->name; + } + + public function getUri () { + return "?page=".parent::PAGE_SERIE_DETAIL."&id=$this->id"; + } + + public function getEntryId () { + return self::ALL_SERIES_ID.":".$this->id; + } + + public static function getCount() { + // str_format (localize("series.alphabetical", count(array)) + return parent::getCountGeneric ("series", self::ALL_SERIES_ID, parent::PAGE_ALL_SERIES); + } + + public static function getSerieByBookId ($bookId) { + $result = parent::getDb ()->prepare('select series.id as id, name +from books_series_link, series +where series.id = series and book = ?'); + $result->execute (array ($bookId)); + if ($post = $result->fetchObject ()) { + return new Serie ($post); + } + return NULL; + } + + public static function getSerieById ($serieId) { + $result = parent::getDb ()->prepare('select id, name from series where id = ?'); + $result->execute (array ($serieId)); + if ($post = $result->fetchObject ()) { + return new Serie ($post); + } + return NULL; + } + + public static function getAllSeries() { + return Base::getEntryArrayWithBookNumber (self::SQL_ALL_SERIES, self::SERIES_COLUMNS, array (), "Serie"); + } + + public static function getAllSeriesByQuery($query) { + return Base::getEntryArrayWithBookNumber (self::SQL_SERIES_FOR_SEARCH, self::SERIES_COLUMNS, array ('%' . $query . '%'), "Serie"); + } +} diff --git a/sources/lib/Tag.php b/sources/lib/Tag.php new file mode 100644 index 0000000..174f121 --- /dev/null +++ b/sources/lib/Tag.php @@ -0,0 +1,63 @@ + + */ + +class Tag extends Base +{ + const ALL_TAGS_ID = "cops:tags"; + const TAG_COLUMNS = "tags.id as id, tags.name as name, count(*) as count"; + const SQL_ALL_TAGS = "select {0} from tags, books_tags_link where tags.id = tag group by tags.id, tags.name order by tags.name"; + + public $id; + public $name; + + public function __construct($post) { + $this->id = $post->id; + $this->name = $post->name; + } + + public function getUri () { + return "?page=".parent::PAGE_TAG_DETAIL."&id=$this->id"; + } + + public function getEntryId () { + return self::ALL_TAGS_ID.":".$this->id; + } + + public static function getCount() { + // str_format (localize("tags.alphabetical", count(array)) + return parent::getCountGeneric ("tags", self::ALL_TAGS_ID, parent::PAGE_ALL_TAGS); + } + + public static function getTagById ($tagId) { + $result = parent::getDb ()->prepare('select id, name from tags where id = ?'); + $result->execute (array ($tagId)); + if ($post = $result->fetchObject ()) { + return new Tag ($post); + } + return NULL; + } + + public static function getAllTags() { + return Base::getEntryArrayWithBookNumber (self::SQL_ALL_TAGS, self::TAG_COLUMNS, array (), "Tag"); + } + + public static function getAllTagsByQuery($query, $n, $database = NULL, $numberPerPage = NULL) { + $columns = "tags.id as id, tags.name as name, (select count(*) from books_tags_link where tags.id = tag) as count"; + $sql = 'select {0} from tags where upper (tags.name) like ? {1} order by tags.name'; + list ($totalNumber, $result) = parent::executeQuery ($sql, $columns, "", array ('%' . $query . '%'), $n, $database, $numberPerPage); + $entryArray = array(); + while ($post = $result->fetchObject ()) + { + $tag = new Tag ($post); + array_push ($entryArray, new Entry ($tag->name, $tag->getEntryId (), + str_format (localize("bookword", $post->count), $post->count), "text", + array ( new LinkNavigation ($tag->getUri ())))); + } + return array ($entryArray, $totalNumber); + } +} diff --git a/sources/login.html b/sources/login.html new file mode 100644 index 0000000..dfe01d7 --- /dev/null +++ b/sources/login.html @@ -0,0 +1,97 @@ + + + + + + COPS + + + + + +
    +
    + + + +
    +
    + + diff --git a/sources/phpunit.xml.dist b/sources/phpunit.xml.dist new file mode 100644 index 0000000..44059e1 --- /dev/null +++ b/sources/phpunit.xml.dist @@ -0,0 +1,30 @@ + + + + + + ./ + + ./resources + ./test + ./saucetest + ./vendor + config.php + config_default.php + + + + + + + + + + ./test/ + + + diff --git a/sources/resources/epub-loader/BaseExport.class.php b/sources/resources/epub-loader/BaseExport.class.php new file mode 100644 index 0000000..95915b4 --- /dev/null +++ b/sources/resources/epub-loader/BaseExport.class.php @@ -0,0 +1,209 @@ + + */ + +class BaseExport +{ + protected $mProperties = null; + protected $mFileName = ''; + protected $mSearch = null; + protected $mReplace = null; + + public $mFormatProperty = true; + + /** + * Open an export file (or create if file does not exist) + * + * @param string Export file name + * @param boolean Force file creation + */ + public function __construct($inFileName, $inCreate = false) + { + if ($inCreate && file_exists($inFileName)) { + if (!unlink($inFileName)) { + $error = sprintf('Cannot remove file: %s', $inFileName); + throw new Exception($error); + } + } + + $this->mFileName = $inFileName; + + $this->mProperties = array(); + } + + public function ClearProperties() + { + $this->mProperties = array(); + } + + public function SetProperty($inKey, $inValue) + { + // Don't store empty keys + if (empty($inKey)) { + return; + } + + if ($this->mFormatProperty) { + $inValue = $this->FormatProperty($inValue); + } + + $this->mProperties[$inKey] = $inValue; + } + + /** + * Format a property + * + * @param string or array of strings to format + * @return string or array of strings formated + */ + protected function FormatProperty($inValue) + { + if (!isset($inValue)) { + return ''; + } + if (is_numeric($inValue)) { + return (string)$inValue; + } + if (is_array($inValue)) { + // Recursive call for arrays + foreach ($inValue as $key => $value) { + $inValue[$key] = $this->FormatProperty($value); + } + return $inValue; + } + if (!is_string($inValue) || empty($inValue)) { + return ''; + } + + // Replace html entities with normal characters + $str = html_entity_decode($inValue, ENT_COMPAT, 'UTF-8'); + // Replace characters + if (isset($this->mSearch)) { + $str = str_replace($this->mSearch, $this->mReplace, $str); + } + + // Strip double spaces + while (strpos($str, ' ') !== false) { + $str = str_replace(' ', ' ', $str); + } + + // Trim + $str = trim($str); + + return $str; + } + + /** + * Save data to file + * + * @throws Exception if error + */ + public function SaveToFile() + { + // Write the file + $content = $this->GetContent(); + if (!file_put_contents($this->mFileName, $content)) { + $error = sprintf('Cannot save export to file: %s', $this->mFileName); + throw new Exception($error); + } + } + + /** + * Send download http headers + * + * @param string $inFileName Download file name to display in the browser + * @param int $inFileSize Download file size + * @param string $inCodeSet Charset + * @throws exception if http headers have been already sent + * + * @return void + */ + private function SendDownloadHeaders($inFileName, $inFileSize = null, $inCodeSet = 'utf-8') + { + // Throws excemtion if http headers have been already sent + $filename = ''; + $linenum = 0; + if (headers_sent($filename, $linenum)) { + $error = sprintf('Http headers already sent by file: %s ligne %d', $filename, $linenum); + throw new Exception($error); + } + + $inFileName = str_replace(' ', '', basename($inFileName)); // Cleanup file name + $ext = strtolower(substr(strrchr($inFileName, '.'), 1)); + + switch ($ext) { + case 'pdf': + $contentType = 'application/pdf'; + break; + case 'zip': + $contentType = 'application/zip'; + break; + case 'xml': + $contentType = 'text/xml'; + if (!empty($inCodeSet)) { + $contentType .= '; charset=' . $inCodeSet . '"'; + } + break; + case 'txt': + $contentType = 'text/plain'; + if (!empty($inCodeSet)) { + $contentType .= '; charset=' . $inCodeSet . '"'; + } + break; + case 'csv': + $contentType = 'text/csv'; + if (!empty($inCodeSet)) { + $contentType .= '; charset=' . $inCodeSet . '"'; + } + break; + case 'html': + $contentType = 'text/html'; + if (!empty($inCodeSet)) { + $contentType .= '; charset=' . $inCodeSet . '"'; + } + break; + default: + $contentType = 'application/force-download'; + break; + } + + // Send http headers for download + header('Content-disposition: attachment; filename="' . $inFileName . '"'); + Header('Content-Type: ' . $contentType); + //header('Content-Transfer-Encoding: binary'); + if (isset($inFileSize)) { + header('Content-Length: ' . $inFileSize); + } + + // Send http headers to remove the browser cache + header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); + header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . ' GMT'); + header('Cache-Control: no-store, no-cache, must-revalidate'); + header('Cache-Control: post-check=0, pre-check=0', false); + header('Pragma: no-cache'); + } + + /** + * Download export and stop further script execution + */ + public function Download() + { + $content = $this->GetContent(); + + // Send http download headers + $size = strlen($content); + $this->SendDownloadHeaders($this->mFileName, $size); + + // Send file content to download + echo $content; + + exit; + } + +} + +?> diff --git a/sources/resources/epub-loader/BookExport.class.php b/sources/resources/epub-loader/BookExport.class.php new file mode 100644 index 0000000..643982e --- /dev/null +++ b/sources/resources/epub-loader/BookExport.class.php @@ -0,0 +1,143 @@ + + */ + +require_once(realpath(dirname(__FILE__)) . '/CsvExport.class.php'); + +class BookExport +{ + private $mExport = null; + private $mNbBook = 0; + + const eExportTypeCsv = 1; + const CsvSeparator = "\t"; + + /** + * Open an export file (or create if file does not exist) + * + * @param string Export file name + * @param enum Export type + * @param boolean Force file creation + * @throws Exception if error + */ + public function __construct($inFileName, $inExportType, $inCreate = false) + { + switch ($inExportType) { + case self::eExportTypeCsv: + $this->mExport = new CsvExport($inFileName, $inCreate); + break; + default: + $error = sprintf('Incorrect export type: %d', $inExportType); + throw new Exception($error); + } + } + + /** + * Add an epub to the export + * + * @param string Epub file name + * @throws Exception if error + * + * @return string Empty string or error if any + */ + public function AddEpub($inFileName) + { + $error = ''; + + try { + // Load the book infos + $bookInfos = new BookInfos(); + $bookInfos->LoadFromEpub($inFileName); + // Add the book + $this->AddBook($bookInfos); + } + catch (Exception $e) { + $error = $e->getMessage(); + } + + return $error; + } + + /** + * Add a new book to the export + * + * @param object BookInfo object + * @throws Exception if error + * + * @return void + */ + private function AddBook($inBookInfo) + { + // Add export header + if ($this->mNbBook++ == 0) { + $i = 1; + $this->mExport->SetProperty($i++, 'Format'); + $this->mExport->SetProperty($i++, 'Path'); + $this->mExport->SetProperty($i++, 'Name'); + $this->mExport->SetProperty($i++, 'Uuid'); + $this->mExport->SetProperty($i++, 'Uri'); + $this->mExport->SetProperty($i++, 'Title'); + $this->mExport->SetProperty($i++, 'Authors'); + $this->mExport->SetProperty($i++, 'AuthorsSort'); + $this->mExport->SetProperty($i++, 'Language'); + $this->mExport->SetProperty($i++, 'Description'); + $this->mExport->SetProperty($i++, 'Subjects'); + $this->mExport->SetProperty($i++, 'Cover'); + $this->mExport->SetProperty($i++, 'Isbn'); + $this->mExport->SetProperty($i++, 'Rights'); + $this->mExport->SetProperty($i++, 'Publisher'); + $this->mExport->SetProperty($i++, 'Serie'); + $this->mExport->SetProperty($i++, 'SerieIndex'); + $this->mExport->SetProperty($i++, 'CreationDate'); + $this->mExport->SetProperty($i++, 'ModificationDate'); + $this->mExport->AddContent(); + } + + // Add book infos to the export + $i = 1; + $this->mExport->SetProperty($i++, $inBookInfo->mFormat); + $this->mExport->SetProperty($i++, $inBookInfo->mPath); + $this->mExport->SetProperty($i++, $inBookInfo->mName); + $this->mExport->SetProperty($i++, $inBookInfo->mUuid); + $this->mExport->SetProperty($i++, $inBookInfo->mUri); + $this->mExport->SetProperty($i++, $inBookInfo->mTitle); + $this->mExport->SetProperty($i++, implode(' - ', $inBookInfo->mAuthors)); + $this->mExport->SetProperty($i++, implode(' - ', array_keys($inBookInfo->mAuthors))); + $this->mExport->SetProperty($i++, $inBookInfo->mLanguage); + $this->mExport->SetProperty($i++, $inBookInfo->mDescription); + $this->mExport->SetProperty($i++, implode(' - ', $inBookInfo->mSubjects)); + $this->mExport->SetProperty($i++, $inBookInfo->mCover); + $this->mExport->SetProperty($i++, $inBookInfo->mIsbn); + $this->mExport->SetProperty($i++, $inBookInfo->mRights); + $this->mExport->SetProperty($i++, $inBookInfo->mPublisher); + $this->mExport->SetProperty($i++, $inBookInfo->mSerie); + $this->mExport->SetProperty($i++, $inBookInfo->mSerieIndex); + $this->mExport->SetProperty($i++, $inBookInfo->mCreationDate); + $this->mExport->SetProperty($i++, $inBookInfo->mModificationDate); + + $this->mExport->AddContent(); + } + + /** + * Download export and stop further script execution + */ + public function Download() + { + $this->mExport->Download(); + } + + /** + * Save export to file + */ + public function SaveToFile() + { + $this->mExport->SaveToFile(); + } + +} + +?> diff --git a/sources/resources/epub-loader/BookInfos.class.php b/sources/resources/epub-loader/BookInfos.class.php new file mode 100644 index 0000000..a4ca0c5 --- /dev/null +++ b/sources/resources/epub-loader/BookInfos.class.php @@ -0,0 +1,74 @@ + + */ + +require_once(realpath(dirname(__FILE__)) . '/ZipFile.class.php'); +require_once(realpath(dirname(dirname(__FILE__))) . '/php-epub-meta/epub.php'); + +/** + * BookInfos class contains informations about a book, + * and methods to load this informations from multiple sources (eg epub file) + */ +class BookInfos +{ + public $mPath = ''; + public $mName = ''; + public $mFormat = ''; + public $mUuid = ''; + public $mUri = ''; + public $mTitle = ''; + public $mAuthors = null; + public $mLanguage = ''; + public $mDescription = ''; + public $mSubjects = null; + public $mCover = ''; + public $mIsbn = ''; + public $mRights = ''; + public $mPublisher = ''; + public $mSerie = ''; + public $mSerieIndex = ''; + public $mCreationDate = ''; + public $mModificationDate = ''; + + /** + * Loads book infos from an epub file + * + * @param string Epub full file name + * @throws Exception if error + * + * @return void + */ + public function LoadFromEpub($inFileName) + { + // Load the epub file + $ePub = new EPub($inFileName, 'ZipFile'); + + // Get the epub infos + $this->mFormat = 'epub'; + $this->mPath = pathinfo($inFileName, PATHINFO_DIRNAME); + $this->mName = pathinfo($inFileName, PATHINFO_FILENAME); + $this->mUuid = $ePub->Uuid(); + $this->mUri = $ePub->Uri(); + $this->mTitle = $ePub->Title(); + $this->mAuthors = $ePub->Authors(); + $this->mLanguage = $ePub->Language(); + $this->mDescription = $ePub->Description(); + $this->mSubjects = $ePub->Subjects(); + $cover = $ePub->Cover(); + $this->mCover = ($cover['found'] !== false) ? $cover['found'] : ''; + $this->mIsbn = $ePub->ISBN(); + $this->mRights = $ePub->Copyright(); + $this->mPublisher = $ePub->Publisher(); + $this->mSerie = $ePub->Serie(); + $this->mSerieIndex = $ePub->SerieIndex(); + $this->mCreationDate = $ePub->CreationDate(); + $this->mModificationDate = $ePub->ModificationDate(); + } + +} + +?> \ No newline at end of file diff --git a/sources/resources/epub-loader/CalibreDbLoader.class.php b/sources/resources/epub-loader/CalibreDbLoader.class.php new file mode 100644 index 0000000..10892b7 --- /dev/null +++ b/sources/resources/epub-loader/CalibreDbLoader.class.php @@ -0,0 +1,420 @@ + + */ + +require_once(realpath(dirname(__FILE__)) . '/BookInfos.class.php'); + +/** + * Calibre database sql file that comes unmodified from Calibre project: + * /calibre/resources/metadata_sqlite.sql + */ +define('CalibreCreateDbSql', realpath(dirname(__FILE__)) . '/metadata_sqlite.sql'); + +/** + * CalibreDbLoader class allows to open or create a new Calibre database, + * and then add BookInfos objects into the database + */ +class CalibreDbLoader +{ + private $mDb = null; + + /** + * Open a Calibre database (or create if database does not exist) + * + * @param string Calibre database file name + * @param boolean Force database creation + */ + public function __construct($inDbFileName, $inCreate = false) + { + if ($inCreate) { + $this->CreateDatabase($inDbFileName); + } + else { + $this->OpenDatabase($inDbFileName); + } + } + + /** + * Create an sqlite database + * + * @param string Database file name + * @throws Exception if error + * + * @return void + */ + private function CreateDatabase($inDbFileName) + { + // Read the sql file + $content = file_get_contents(CalibreCreateDbSql); + if ($content === false) { + $error = sprintf('Cannot read sql file: %s', CalibreCreateDbSql); + throw new Exception($error); + } + + // Remove the database file + if (file_exists($inDbFileName) && !unlink($inDbFileName)) { + $error = sprintf('Cannot remove database file: %s', $inDbFileName); + throw new Exception($error); + } + + // Create the new database file + $this->OpenDatabase($inDbFileName); + + // Create the database tables + try { + $sqlArray = explode('CREATE ', $content); + foreach ($sqlArray as $sql) { + $sql = trim($sql); + if (empty($sql)) { + continue; + } + $sql = 'CREATE ' . $sql; + $str = strtolower($sql); + if (strpos($str, 'create view') !== false) { + continue; + } + if (strpos($str, 'title_sort') !== false) { + continue; + } + $stmt = $this->mDb->prepare($sql); + $stmt->execute(); + } + } + catch (Exception $e) { + $error = sprintf('Cannot create database: %s', $e->getMessage()); + throw new Exception($error); + } + } + + /** + * Open an sqlite database + * + * @param string Database file name + * @throws Exception if error + * + * @return void + */ + private function OpenDatabase($inDbFileName) + { + try { + // Init the Data Source Name + $dsn = 'sqlite:' . $inDbFileName; + // Open the database + $this->mDb = new PDO($dsn); // Send an exception if error + $this->mDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + //echo sprintf('Init database ok for: %s%s', $dsn, '
    '); + } + catch (Exception $e) { + $error = sprintf('Cannot open database [%s]: %s', $dsn, $e->getMessage()); + throw new Exception($error); + } + } + + /** + * Add an epub to the db + * + * @param string Epub file name + * @throws Exception if error + * + * @return string Empty string or error if any + */ + public function AddEpub($inFileName) + { + $error = ''; + + try { + // Load the book infos + $bookInfos = new BookInfos(); + $bookInfos->LoadFromEpub($inFileName); + // Add the book + $this->AddBook($bookInfos); + } + catch (Exception $e) { + $error = $e->getMessage(); + } + + return $error; + + } + + /** + * Add a new book into the db + * + * @param object BookInfo object + * @throws Exception if error + * + * @return void + */ + private function AddBook($inBookInfo) + { + // Check if the book uuid does not already exist + $sql = 'select b.id, b.title, b.path, d.name, d.format from books as b, data as d where d.book = b.id and uuid=:uuid'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':uuid', $inBookInfo->mUuid); + $stmt->execute(); + while ($post = $stmt->fetchObject()) { + $error = sprintf('Multiple book id for uuid: %s (already in file "%s/%s.%s" title "%s")', $inBookInfo->mUuid, $post->path, $post->name, $post->format, $post->title); + throw new Exception($error); + } + // Add the book + $sql = 'insert into books(title, sort, pubdate, last_modified, series_index, uuid, path) values(:title, :sort, :pubdate, :lastmodified, :serieindex, :uuid, :path)'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':title', $inBookInfo->mTitle); + $stmt->bindParam(':sort', $inBookInfo->mTitle); + $stmt->bindParam(':pubdate', empty($inBookInfo->mCreationDate) ? null : $inBookInfo->mCreationDate); + $stmt->bindParam(':lastmodified', empty($inBookInfo->mModificationDate) ? '2000-01-01 00:00:00+00:00' : $inBookInfo->mModificationDate); + $stmt->bindParam(':serieindex', $inBookInfo->mSerieIndex); + $stmt->bindParam(':uuid', $inBookInfo->mUuid); + $stmt->bindParam(':path', $inBookInfo->mPath); + $stmt->execute(); + // Get the book id + $sql = 'select id from books where uuid=:uuid'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':uuid', $inBookInfo->mUuid); + $stmt->execute(); + $idBook = null; + while ($post = $stmt->fetchObject()) { + $idBook = $post->id; + break; + } + if (!isset($idBook)) { + $error = sprintf('Cannot find book id for uuid: %s', $inBookInfo->mUuid); + throw new Exception($error); + } + // Add the book formats + $sql = 'insert into data(book, format, name, uncompressed_size) values(:idBook, :format, :name, 0)'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':idBook', $idBook, PDO::PARAM_INT); + $stmt->bindParam(':format', $inBookInfo->mFormat); + $stmt->bindParam(':name', $inBookInfo->mName); + $stmt->execute(); + // Add the book comments + $sql = 'insert into comments(book, text) values(:idBook, :text)'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':idBook', $idBook, PDO::PARAM_INT); + $stmt->bindParam(':text', $inBookInfo->mDescription); + $stmt->execute(); + // Add the book identifiers + if (!empty($inBookInfo->mUri)) { + $sql = 'insert into identifiers(book, type, val) values(:idBook, :type, :value)'; + $identifiers = array(); + $identifiers['URI'] = $inBookInfo->mUri; + $identifiers['ISBN'] = $inBookInfo->mIsbn; + foreach ($identifiers as $key => $value) { + if (empty($value)) { + continue; + } + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':idBook', $idBook, PDO::PARAM_INT); + $stmt->bindParam(':type', $key); + $stmt->bindParam(':value', $value); + $stmt->execute(); + } + } + // Add the book serie + if (!empty($inBookInfo->mSerie)) { + // Get the serie id + $sql = 'select id from series where name=:serie'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':serie', $inBookInfo->mSerie); + $stmt->execute(); + $post = $stmt->fetchObject(); + if ($post) { + $idSerie = $post->id; + } + else { + // Add a new serie + $sql = 'insert into series(name, sort) values(:serie, :sort)'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':serie', $inBookInfo->mSerie); + $stmt->bindParam(':sort', $inBookInfo->mSerie); + $stmt->execute(); + // Get the serie id + $sql = 'select id from series where name=:serie'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':serie', $inBookInfo->mSerie); + $stmt->execute(); + $idSerie = null; + while ($post = $stmt->fetchObject()) { + if (!isset($idSerie)) { + $idSerie = $post->id; + } + else { + $error = sprintf('Multiple series for name: %s', $inBookInfo->mSerie); + throw new Exception($error); + } + } + if (!isset($idSerie)) { + $error = sprintf('Cannot find serie id for name: %s', $inBookInfo->mSerie); + throw new Exception($error); + } + } + // Add the book serie link + $sql = 'insert into books_series_link(book, series) values(:idBook, :idSerie)'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':idBook', $idBook, PDO::PARAM_INT); + $stmt->bindParam(':idSerie', $idSerie, PDO::PARAM_INT); + $stmt->execute(); + } + // Add the book authors + foreach ($inBookInfo->mAuthors as $authorSort => $author) { + // Get the author id + $sql = 'select id from authors where name=:author'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':author', $author); + $stmt->execute(); + $post = $stmt->fetchObject(); + if ($post) { + $idAuthor = $post->id; + } + else { + // Add a new author + $sql = 'insert into authors(name, sort) values(:author, :sort)'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':author', $author); + $stmt->bindParam(':sort', $authorSort); + $stmt->execute(); + // Get the author id + $sql = 'select id from authors where name=:author'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':author', $author); + $stmt->execute(); + $idAuthor = null; + while ($post = $stmt->fetchObject()) { + if (!isset($idAuthor)) { + $idAuthor = $post->id; + } + else { + $error = sprintf('Multiple authors for name: %s', $author); + throw new Exception($error); + } + } + if (!isset($idAuthor)) { + $error = sprintf('Cannot find author id for name: %s', $author); + throw new Exception($error); + } + } + // Add the book author link + $sql = 'insert into books_authors_link(book, author) values(:idBook, :idAuthor)'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':idBook', $idBook, PDO::PARAM_INT); + $stmt->bindParam(':idAuthor', $idAuthor, PDO::PARAM_INT); + $stmt->execute(); + } + // Add the book language + { + // Get the language id + $sql = 'select id from languages where lang_code=:language'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':language', $inBookInfo->mLanguage); + $stmt->execute(); + $post = $stmt->fetchObject(); + if ($post) { + $idLanguage = $post->id; + } + else { + // Add a new language + $sql = 'insert into languages(lang_code) values(:language)'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':language', $inBookInfo->mLanguage); + $stmt->execute(); + // Get the language id + $sql = 'select id from languages where lang_code=:language'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':language', $inBookInfo->mLanguage); + $stmt->execute(); + $idLanguage = null; + while ($post = $stmt->fetchObject()) { + if (!isset($idLanguage)) { + $idLanguage = $post->id; + } + else { + $error = sprintf('Multiple languages for lang_code: %s', $inBookInfo->mLanguage); + throw new Exception($error); + } + } + if (!isset($idLanguage)) { + $error = sprintf('Cannot find language id for lang_code: %s', $inBookInfo->mLanguage); + throw new Exception($error); + } + } + // Add the book language link + $itemOder = 0; + $sql = 'insert into books_languages_link(book, lang_code, item_order) values(:idBook, :idLanguage, :itemOrder)'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':idBook', $idBook, PDO::PARAM_INT); + $stmt->bindParam(':idLanguage', $idLanguage, PDO::PARAM_INT); + $stmt->bindParam(':itemOrder', $itemOder, PDO::PARAM_INT); + $stmt->execute(); + } + // Add the book tags (subjects) + foreach ($inBookInfo->mSubjects as $subject) { + // Get the subject id + $sql = 'select id from tags where name=:subject'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':subject', $subject); + $stmt->execute(); + $post = $stmt->fetchObject(); + if ($post) { + $idSubject = $post->id; + } + else { + // Add a new subject + $sql = 'insert into tags(name) values(:subject)'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':subject', $subject); + $stmt->execute(); + // Get the subject id + $sql = 'select id from tags where name=:subject'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':subject', $subject); + $stmt->execute(); + $idSubject = null; + while ($post = $stmt->fetchObject()) { + if (!isset($idSubject)) { + $idSubject = $post->id; + } + else { + $error = sprintf('Multiple subjects for name: %s', $subject); + throw new Exception($error); + } + } + if (!isset($idSubject)) { + $error = sprintf('Cannot find subject id for name: %s', $subject); + throw new Exception($error); + } + } + // Add the book subject link + $sql = 'insert into books_tags_link(book, tag) values(:idBook, :idSubject)'; + $stmt = $this->mDb->prepare($sql); + $stmt->bindParam(':idBook', $idBook, PDO::PARAM_INT); + $stmt->bindParam(':idSubject', $idSubject, PDO::PARAM_INT); + $stmt->execute(); + } + } + + /** + * Check database for debug + * + * @return void + */ + private function CheckDatabase() + { + // Retrieve some infos for check only + $sql = 'select id, title, sort from books'; + $stmt = $this->mDb->prepare($sql); + $stmt->execute(); + while ($post = $stmt->fetchObject()) { + $id = $post->id; + $title = $post->title; + $sort = $post->sort; + } + } + +} + +?> diff --git a/sources/resources/epub-loader/CsvExport.class.php b/sources/resources/epub-loader/CsvExport.class.php new file mode 100644 index 0000000..595d699 --- /dev/null +++ b/sources/resources/epub-loader/CsvExport.class.php @@ -0,0 +1,77 @@ + + */ + +require_once(realpath(dirname(__FILE__)) . '/BaseExport.class.php'); + +class CsvExport extends BaseExport +{ + private $mLines = null; + + const CsvSeparator = "\t"; + + /** + * Open an export file (or create if file does not exist) + * + * @param string Export file name + * @param boolean Force file creation + */ + public function __construct($inFileName, $inCreate = false) + { + $this->mSearch = array("\r", "\n", self::CsvSeparator); + $this->mReplace = array('', '
    ', ''); + + // Init container + $this->mLines = array(); + + parent::__construct($inFileName, $inCreate); + } + + /** + * Add the current properties into the export content + * and reset the properties + */ + public function AddContent() + { + $text = ''; + foreach ($this->mProperties as $key => $value) { + $info = ''; + if (is_array($value)) { + foreach ($value as $value1) { + // Escape quotes + if (strpos($value1, '\'') !== false) { + $value1 = '\'' . str_replace('\'', '\'\'', $value1) . '\''; + } + $text .= $value1 . self::CsvSeparator; + } + continue; + } + else { + // Escape quotes + if (strpos($value, '\'') !== false) { + $value = '\'' . str_replace('\'', '\'\'', $value) . '\''; + } + $info = $value; + } + $text .= $info . self::CsvSeparator; + } + + $this->mLines[] = $text; + + $this->ClearProperties(); + } + + protected function GetContent() + { + $text = implode("\n", $this->mLines) . "\n"; + + return $text; + } + +} + +?> diff --git a/sources/resources/epub-loader/README b/sources/resources/epub-loader/README new file mode 100644 index 0000000..cde011a --- /dev/null +++ b/sources/resources/epub-loader/README @@ -0,0 +1,17 @@ +## ============================================================================= +## epub-loader readme +## ============================================================================= + +epub-loader is a utility ressource for ebooks. + +- CalibreDbLoader class allows create Calibre databases and add ebooks +- BookExport class allows to export ebooks metadata in csv files +- The app directory contains samples and allows to run actions + + +## Installation +## ----------------------------------------------------------------------------- + +- If a first-time install, copy app/config.php.example to app/config.php +- Edit config.php to match your config +- Open the app directory url diff --git a/sources/resources/epub-loader/ZipFile.class.php b/sources/resources/epub-loader/ZipFile.class.php new file mode 100644 index 0000000..abcbd82 --- /dev/null +++ b/sources/resources/epub-loader/ZipFile.class.php @@ -0,0 +1,119 @@ + + */ + +/** + * ZipFile class allows to open files inside a zip file with the standard php zip functions + */ +class ZipFile +{ + private $mZip; + private $mEntries; + + public function __construct() + { + $this->mZip = null; + $this->mEntries = null; + } + + /** + * Destructor + */ + public function __destruct() + { + $this->Close(); + } + + /** + * Open a zip file and read it's entries + * + * @param string $inFileName + * @return boolean True if zip file has been correctly opended, else false + */ + public function Open($inFileName) + { + $this->Close(); + + $this->mZip = zip_open($inFileName); + if (!$this->mZip) { + return false; + } + + $this->mEntries = array(); + + while ($entry = zip_read($this->mZip)) { + $fileName = zip_entry_name($entry); + $this->mEntries[$fileName] = $entry; + } + + return true; + } + + /** + * Check if a file exist in the zip entries + * + * @param string $inFileName File to search + * + * @return boolean True if the file exist, else false + */ + public function FileExists($inFileName) + { + if (!isset($this->mZip)) { + return false; + } + + if (!isset($this->mEntries[$inFileName])) { + return false; + } + + return true; + } + + /** + * Read the content of a file in the zip entries + * + * @param string $inFileName File to search + * + * @return mixed File content the file exist, else false + */ + public function FileRead($inFileName) + { + if (!isset($this->mZip)) { + return false; + } + + if (!isset($this->mEntries[$inFileName])) { + return false; + } + + $entry = $this->mEntries[$inFileName]; + if (!zip_entry_open($this->mZip, $entry)) { + return false; + } + $data = zip_entry_read($entry, zip_entry_filesize($entry)); + zip_entry_close($entry); + + return $data; + } + + /** + * Close the zip file + * + * @return void + */ + public function Close() + { + if (!isset($this->mZip)) { + return false; + } + + zip_close($this->mZip); + } + +} + +?> \ No newline at end of file diff --git a/sources/resources/epub-loader/app/.gitignore b/sources/resources/epub-loader/app/.gitignore new file mode 100644 index 0000000..0d00eb9 --- /dev/null +++ b/sources/resources/epub-loader/app/.gitignore @@ -0,0 +1 @@ +epub-loader-config.php diff --git a/sources/resources/epub-loader/app/action_csv_export.php b/sources/resources/epub-loader/app/action_csv_export.php new file mode 100644 index 0000000..693feef --- /dev/null +++ b/sources/resources/epub-loader/app/action_csv_export.php @@ -0,0 +1,31 @@ + + */ + +// Init csv file +$fileName = $dbConfig['db_path'] . DIRECTORY_SEPARATOR . basename($dbConfig['db_path']) . '_metadata.csv'; +try { + // Open or create the export file + $export = new BookExport($fileName, BookExport::eExportTypeCsv, true); + echo sprintf('Export ebooks to %s', $fileName) . '
    '; + // Add the epub files into the export file + if (!empty($dbConfig['epub_path'])) { + $fileList = RecursiveGlob($dbConfig['epub_path'], '*.epub'); + foreach ($fileList as $file) { + $error = $export->AddEpub($file); + if (!empty($error)) { + $gErrorArray[$file] = $error; + } + } + } + $export->SaveToFile(); +} +catch (Exception $e) { + $gErrorArray[$fileName] = $e->getMessage(); +} + +?> diff --git a/sources/resources/epub-loader/app/action_db_load.php b/sources/resources/epub-loader/app/action_db_load.php new file mode 100644 index 0000000..ad21afc --- /dev/null +++ b/sources/resources/epub-loader/app/action_db_load.php @@ -0,0 +1,30 @@ + + */ + +// Init database file +$fileName = $dbConfig['db_path'] . DIRECTORY_SEPARATOR . 'metadata.db'; +try { + // Open or create the database + $db = new CalibreDbLoader($fileName, $gConfig['create_db']); + echo sprintf('Load database %s', $fileName) . '
    '; + // Add the epub files into the database + if (!empty($dbConfig['epub_path'])) { + $fileList = RecursiveGlob($dbConfig['epub_path'], '*.epub'); + foreach ($fileList as $file) { + $error = $db->AddEpub($file); + if (!empty($error)) { + $gErrorArray[$file] = $error; + } + } + } +} +catch (Exception $e) { + $gErrorArray[$fileName] = $e->getMessage(); +} + +?> diff --git a/sources/resources/epub-loader/app/cops-feed.php b/sources/resources/epub-loader/app/cops-feed.php new file mode 100644 index 0000000..698404b --- /dev/null +++ b/sources/resources/epub-loader/app/cops-feed.php @@ -0,0 +1,27 @@ + + */ + +// Include config file +$fileName = __DIR__ . DIRECTORY_SEPARATOR . 'epub-loader-config.php'; +if (!file_exists($fileName)) { + die ('Missing configuration file: ' . $fileName); +} +require_once($fileName); + +// Add cops directory to include path +$includePath = ini_get('include_path'); +ini_set('include_path', $includePath . PATH_SEPARATOR . $gConfig['cops_directory']); + +// Include COPS feed +$fileName = $gConfig['cops_directory'] . '/feed.php'; +if (!file_exists($fileName)) { + die ('Incorrect include file: ' . $fileName); +} +require_once($fileName); + +?> diff --git a/sources/resources/epub-loader/app/epub-loader-config.php.example b/sources/resources/epub-loader/app/epub-loader-config.php.example new file mode 100644 index 0000000..a0140d5 --- /dev/null +++ b/sources/resources/epub-loader/app/epub-loader-config.php.example @@ -0,0 +1,60 @@ + + */ + +$gConfig = array(); + +/** + * Application name + */ +$gConfig['app_name'] = 'Epub loader'; + +/** + * Admin email + */ +$gConfig['admin_email'] = 'didier.corbiere@opale-concept.com'; + +/** + * Cops directory + * + * This is the base path of Cops library + */ +$gConfig['cops_directory'] = dirname(dirname(dirname(__DIR__))); +if (!is_dir($gConfig['cops_directory'])) { + die ('Incorrect Cops directory: ' . $gConfig['cops_directory']); +} + +/** + * Create Calibre databases ? + * + * If true: databases are removed and recreated before loading ebooks + * If false: append ebooks into databases + */ +$gConfig['create_db'] = true; + +/** + * Databases infos + * + * For each database: + * name: The database name to display + * db_path: The path where to create the database + * epub_path: The path where to look for the epub files to load + * pdf_path: The path where to look for pdf files + */ +$gConfig['databases'] = array(); +$gConfig['databases'][] = array('name' => 'Littérature classique', 'db_path' => '/opt/ebooks/calibre/demo', 'epub_path' => '/opt/ebooks/epub/demo', 'pdf_path' => ''); +$gConfig['databases'][] = array('name' => 'Bibliothèque numérique romande', 'db_path' => '/opt/ebooks/calibre/bnr', 'epub_path' => '/opt/ebooks/epub/bnr', 'pdf_path' => ''); +$gConfig['databases'][] = array('name' => 'La Bibliothèque d\'Ebooks', 'db_path' => '/opt/ebooks/calibre/bibebook', 'epub_path' => '/opt/ebooks/epub/bibebook', 'pdf_path' => ''); + +/** + * Available actions + */ +$gConfig['actions'] = array(); +$gConfig['actions']['csv_export'] = 'Csv export'; +$gConfig['actions']['db_load'] = 'Create database'; + +?> diff --git a/sources/resources/epub-loader/app/footer.php b/sources/resources/epub-loader/app/footer.php new file mode 100644 index 0000000..13b1631 --- /dev/null +++ b/sources/resources/epub-loader/app/footer.php @@ -0,0 +1,47 @@ + + + +' . "\n"; + $str .= '
    ' . "\n"; + $title = 'Errors (' . count($gErrorArray) . ')'; + $str .= ' ' . "\n"; + $str .= ' ' . "\n"; + $str .= ' ' . "\n"; + $str .= ' ' . "\n"; + foreach ($gErrorArray as $fileName => $error) { + // Display error + $str .= ' ' . "\n"; + $str .= ' ' . "\n"; + $str .= ' ' . "\n"; + $str .= ' ' . "\n"; + } + $str .= '
    ' . $title . '
    ' . $fileName . '' . $error . '
    ' . "\n"; + $str .= '
    ' . "\n"; + $str .= ' ' . "\n"; + echo $str; + } +?> + + + + + + + + diff --git a/sources/resources/epub-loader/app/header.php b/sources/resources/epub-loader/app/header.php new file mode 100644 index 0000000..a4a93a2 --- /dev/null +++ b/sources/resources/epub-loader/app/header.php @@ -0,0 +1,88 @@ + + + + + <?php echo $gConfig['app_name']; ?> + + + + + + + +
    + +
    + + + +
    diff --git a/sources/resources/epub-loader/app/index.php b/sources/resources/epub-loader/app/index.php new file mode 100644 index 0000000..ce78a1f --- /dev/null +++ b/sources/resources/epub-loader/app/index.php @@ -0,0 +1,151 @@ + + */ + +//------------------------------------------------------------------------------ +// Include files +//------------------------------------------------------------------------------ + +// Include config file +$fileName = __DIR__ . DIRECTORY_SEPARATOR . 'epub-loader-config.php'; +if (!file_exists($fileName)) { + die ('Missing configuration file: ' . $fileName); +} +require_once($fileName); + +// Include Calibre database loader class +$fileName = $gConfig['cops_directory'] . '/resources/epub-loader/CalibreDbLoader.class.php'; +if (!file_exists($fileName)) { + die ('Incorrect include file: ' . $fileName); +} +require_once($fileName); + +// Include book export class +$fileName = $gConfig['cops_directory'] . '/resources/epub-loader/BookExport.class.php'; +if (!file_exists($fileName)) { + die ('Incorrect include file: ' . $fileName); +} +require_once($fileName); + +//------------------------------------------------------------------------------ +// Start application +//------------------------------------------------------------------------------ + +// Global vars +$gErrorArray = array(); + +// Get the url parameters +$action = isset($_GET['action']) ? $_GET['action'] : null; +$dbNum = isset($_GET['dbnum']) ? (int)$_GET['dbnum'] : null; + +// Include html header +require_once(__DIR__ . DIRECTORY_SEPARATOR . 'header.php'); + +/** + * Recursive get files + * + * @param string Base directory to search in + * @param string Search pattern + */ +function RecursiveGlob($inPath = '', $inPattern = '*') +{ + $res = array(); + + // Check path + if (!is_dir($inPath)) { + return $res; + } + + // Get the list of directories + if (substr($inPath, -1) != DIRECTORY_SEPARATOR) { + $inPath .= DIRECTORY_SEPARATOR; + } + + // Add files from the current directory + $files = glob($inPath . $inPattern, GLOB_MARK | GLOB_NOSORT); + foreach ($files as $item) { + if (substr($item, -1) == DIRECTORY_SEPARATOR) { + continue; + } + $res[] = $item; + } + + // Scan sub directories + $paths = glob($inPath . '*', GLOB_MARK | GLOB_ONLYDIR | GLOB_NOSORT); + foreach ($paths as $path) { + $res = array_merge($res, RecursiveGlob($path, $inPattern)); + } + + return $res; +} + +// Html content +if (isset($action) && isset($dbNum)) { + if (!isset($gConfig['databases'][$dbNum])) { + die ('Incorrect database num: ' . $dbNum); + } + $dbConfig = $gConfig['databases'][$dbNum]; + $dbPath = $dbConfig['db_path']; + if (!is_dir($dbPath)) { + if (!mkdir($dbPath, 0755, true)) { + die ('Cannot create directory: ' . $dbPath); + } + } + $fileName = sprintf('%s%saction_%s.php', __DIR__, DIRECTORY_SEPARATOR, $action); + if (!file_exists($fileName)) { + die ('Incorrect action file: ' . $fileName); + } + require_once($fileName); +} +else { + if (!isset($action)) { + // Display the available actions + $str = ''; + $str .= '
    ' . 'Select action' . '
    ' . "\n"; + $str .= '
      ' . "\n"; + foreach ($gConfig['actions'] as $action => $actionInfo) { + $str .= '
    • ' . "\n"; + $str .= ' ' . $actionInfo . '' . "\n"; + $str .= '
    • ' . "\n"; + } + $str .= '
    ' . "\n"; + echo $str; + } + else { + // Display databases + $str = ''; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $actionTitle = $gConfig['actions'][$action]; + foreach ($gConfig['databases'] as $dbNum => $dbConfig) { + $fileList = RecursiveGlob($dbConfig['epub_path'], '*.epub'); + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $str .= '' . "\n"; + $numWork++; + } + $str .= '
    ' . 'Db num' . '' . 'Db name' . '' . 'Action' . '' . 'Db Path' . '' . 'Epub path' . '' . 'Nb Files' . '
    ' . $dbNum . '' . $dbConfig['name'] . '' . '' . $actionTitle . '' . '' . $dbConfig['db_path'] . '' . $dbConfig['epub_path'] . '' . count($fileList) . '
    ' . "\n"; + echo $str; + } +} + +// Include html footer +require_once(__DIR__ . DIRECTORY_SEPARATOR . 'footer.php'); + +?> diff --git a/sources/resources/epub-loader/metadata_sqlite.sql b/sources/resources/epub-loader/metadata_sqlite.sql new file mode 100644 index 0000000..83f55c2 --- /dev/null +++ b/sources/resources/epub-loader/metadata_sqlite.sql @@ -0,0 +1,549 @@ +CREATE TABLE authors ( id INTEGER PRIMARY KEY, + name TEXT NOT NULL COLLATE NOCASE, + sort TEXT COLLATE NOCASE, + link TEXT NOT NULL DEFAULT "", + UNIQUE(name) + ); +CREATE TABLE books ( id INTEGER PRIMARY KEY AUTOINCREMENT, + title TEXT NOT NULL DEFAULT 'Unknown' COLLATE NOCASE, + sort TEXT COLLATE NOCASE, + timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + pubdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + series_index REAL NOT NULL DEFAULT 1.0, + author_sort TEXT COLLATE NOCASE, + isbn TEXT DEFAULT "" COLLATE NOCASE, + lccn TEXT DEFAULT "" COLLATE NOCASE, + path TEXT NOT NULL DEFAULT "", + flags INTEGER NOT NULL DEFAULT 1, + uuid TEXT, + has_cover BOOL DEFAULT 0, + last_modified TIMESTAMP NOT NULL DEFAULT "2000-01-01 00:00:00+00:00"); +CREATE TABLE books_authors_link ( id INTEGER PRIMARY KEY, + book INTEGER NOT NULL, + author INTEGER NOT NULL, + UNIQUE(book, author) + ); +CREATE TABLE books_languages_link ( id INTEGER PRIMARY KEY, + book INTEGER NOT NULL, + lang_code INTEGER NOT NULL, + item_order INTEGER NOT NULL DEFAULT 0, + UNIQUE(book, lang_code) + ); +CREATE TABLE books_plugin_data(id INTEGER PRIMARY KEY, + book INTEGER NON NULL, + name TEXT NON NULL, + val TEXT NON NULL, + UNIQUE(book,name)); +CREATE TABLE books_publishers_link ( id INTEGER PRIMARY KEY, + book INTEGER NOT NULL, + publisher INTEGER NOT NULL, + UNIQUE(book) + ); +CREATE TABLE books_ratings_link ( id INTEGER PRIMARY KEY, + book INTEGER NOT NULL, + rating INTEGER NOT NULL, + UNIQUE(book, rating) + ); +CREATE TABLE books_series_link ( id INTEGER PRIMARY KEY, + book INTEGER NOT NULL, + series INTEGER NOT NULL, + UNIQUE(book) + ); +CREATE TABLE books_tags_link ( id INTEGER PRIMARY KEY, + book INTEGER NOT NULL, + tag INTEGER NOT NULL, + UNIQUE(book, tag) + ); +CREATE TABLE comments ( id INTEGER PRIMARY KEY, + book INTEGER NON NULL, + text TEXT NON NULL COLLATE NOCASE, + UNIQUE(book) + ); +CREATE TABLE conversion_options ( id INTEGER PRIMARY KEY, + format TEXT NOT NULL COLLATE NOCASE, + book INTEGER, + data BLOB NOT NULL, + UNIQUE(format,book) + ); +CREATE TABLE custom_columns ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + label TEXT NOT NULL, + name TEXT NOT NULL, + datatype TEXT NOT NULL, + mark_for_delete BOOL DEFAULT 0 NOT NULL, + editable BOOL DEFAULT 1 NOT NULL, + display TEXT DEFAULT "{}" NOT NULL, + is_multiple BOOL DEFAULT 0 NOT NULL, + normalized BOOL NOT NULL, + UNIQUE(label) + ); +CREATE TABLE data ( id INTEGER PRIMARY KEY, + book INTEGER NON NULL, + format TEXT NON NULL COLLATE NOCASE, + uncompressed_size INTEGER NON NULL, + name TEXT NON NULL, + UNIQUE(book, format) +); +CREATE TABLE feeds ( id INTEGER PRIMARY KEY, + title TEXT NOT NULL, + script TEXT NOT NULL, + UNIQUE(title) + ); +CREATE TABLE identifiers ( id INTEGER PRIMARY KEY, + book INTEGER NON NULL, + type TEXT NON NULL DEFAULT "isbn" COLLATE NOCASE, + val TEXT NON NULL COLLATE NOCASE, + UNIQUE(book, type) + ); +CREATE TABLE languages ( id INTEGER PRIMARY KEY, + lang_code TEXT NON NULL COLLATE NOCASE, + UNIQUE(lang_code) + ); +CREATE TABLE library_id ( id INTEGER PRIMARY KEY, + uuid TEXT NOT NULL, + UNIQUE(uuid) + ); +CREATE TABLE metadata_dirtied(id INTEGER PRIMARY KEY, + book INTEGER NOT NULL, + UNIQUE(book)); +CREATE TABLE preferences(id INTEGER PRIMARY KEY, + key TEXT NON NULL, + val TEXT NON NULL, + UNIQUE(key)); +CREATE TABLE publishers ( id INTEGER PRIMARY KEY, + name TEXT NOT NULL COLLATE NOCASE, + sort TEXT COLLATE NOCASE, + UNIQUE(name) + ); +CREATE TABLE ratings ( id INTEGER PRIMARY KEY, + rating INTEGER CHECK(rating > -1 AND rating < 11), + UNIQUE (rating) + ); +CREATE TABLE series ( id INTEGER PRIMARY KEY, + name TEXT NOT NULL COLLATE NOCASE, + sort TEXT COLLATE NOCASE, + UNIQUE (name) + ); +CREATE TABLE tags ( id INTEGER PRIMARY KEY, + name TEXT NOT NULL COLLATE NOCASE, + UNIQUE (name) + ); +CREATE VIEW meta AS + SELECT id, title, + (SELECT sortconcat(bal.id, name) FROM books_authors_link AS bal JOIN authors ON(author = authors.id) WHERE book = books.id) authors, + (SELECT name FROM publishers WHERE publishers.id IN (SELECT publisher from books_publishers_link WHERE book=books.id)) publisher, + (SELECT rating FROM ratings WHERE ratings.id IN (SELECT rating from books_ratings_link WHERE book=books.id)) rating, + timestamp, + (SELECT MAX(uncompressed_size) FROM data WHERE book=books.id) size, + (SELECT concat(name) FROM tags WHERE tags.id IN (SELECT tag from books_tags_link WHERE book=books.id)) tags, + (SELECT text FROM comments WHERE book=books.id) comments, + (SELECT name FROM series WHERE series.id IN (SELECT series FROM books_series_link WHERE book=books.id)) series, + series_index, + sort, + author_sort, + (SELECT concat(format) FROM data WHERE data.book=books.id) formats, + isbn, + path, + lccn, + pubdate, + flags, + uuid + FROM books; +CREATE VIEW tag_browser_authors AS SELECT + id, + name, + (SELECT COUNT(id) FROM books_authors_link WHERE author=authors.id) count, + (SELECT AVG(ratings.rating) + FROM books_authors_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.author=authors.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0) avg_rating, + sort AS sort + FROM authors; +CREATE VIEW tag_browser_filtered_authors AS SELECT + id, + name, + (SELECT COUNT(books_authors_link.id) FROM books_authors_link WHERE + author=authors.id AND books_list_filter(book)) count, + (SELECT AVG(ratings.rating) + FROM books_authors_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.author=authors.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0 AND + books_list_filter(bl.book)) avg_rating, + sort AS sort + FROM authors; +CREATE VIEW tag_browser_filtered_publishers AS SELECT + id, + name, + (SELECT COUNT(books_publishers_link.id) FROM books_publishers_link WHERE + publisher=publishers.id AND books_list_filter(book)) count, + (SELECT AVG(ratings.rating) + FROM books_publishers_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.publisher=publishers.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0 AND + books_list_filter(bl.book)) avg_rating, + name AS sort + FROM publishers; +CREATE VIEW tag_browser_filtered_ratings AS SELECT + id, + rating, + (SELECT COUNT(books_ratings_link.id) FROM books_ratings_link WHERE + rating=ratings.id AND books_list_filter(book)) count, + (SELECT AVG(ratings.rating) + FROM books_ratings_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.rating=ratings.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0 AND + books_list_filter(bl.book)) avg_rating, + rating AS sort + FROM ratings; +CREATE VIEW tag_browser_filtered_series AS SELECT + id, + name, + (SELECT COUNT(books_series_link.id) FROM books_series_link WHERE + series=series.id AND books_list_filter(book)) count, + (SELECT AVG(ratings.rating) + FROM books_series_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.series=series.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0 AND + books_list_filter(bl.book)) avg_rating, + (title_sort(name)) AS sort + FROM series; +CREATE VIEW tag_browser_filtered_tags AS SELECT + id, + name, + (SELECT COUNT(books_tags_link.id) FROM books_tags_link WHERE + tag=tags.id AND books_list_filter(book)) count, + (SELECT AVG(ratings.rating) + FROM books_tags_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.tag=tags.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0 AND + books_list_filter(bl.book)) avg_rating, + name AS sort + FROM tags; +CREATE VIEW tag_browser_publishers AS SELECT + id, + name, + (SELECT COUNT(id) FROM books_publishers_link WHERE publisher=publishers.id) count, + (SELECT AVG(ratings.rating) + FROM books_publishers_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.publisher=publishers.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0) avg_rating, + name AS sort + FROM publishers; +CREATE VIEW tag_browser_ratings AS SELECT + id, + rating, + (SELECT COUNT(id) FROM books_ratings_link WHERE rating=ratings.id) count, + (SELECT AVG(ratings.rating) + FROM books_ratings_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.rating=ratings.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0) avg_rating, + rating AS sort + FROM ratings; +CREATE VIEW tag_browser_series AS SELECT + id, + name, + (SELECT COUNT(id) FROM books_series_link WHERE series=series.id) count, + (SELECT AVG(ratings.rating) + FROM books_series_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.series=series.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0) avg_rating, + (title_sort(name)) AS sort + FROM series; +CREATE VIEW tag_browser_tags AS SELECT + id, + name, + (SELECT COUNT(id) FROM books_tags_link WHERE tag=tags.id) count, + (SELECT AVG(ratings.rating) + FROM books_tags_link AS tl, books_ratings_link AS bl, ratings + WHERE tl.tag=tags.id AND bl.book=tl.book AND + ratings.id = bl.rating AND ratings.rating <> 0) avg_rating, + name AS sort + FROM tags; +CREATE INDEX authors_idx ON books (author_sort COLLATE NOCASE); +CREATE INDEX books_authors_link_aidx ON books_authors_link (author); +CREATE INDEX books_authors_link_bidx ON books_authors_link (book); +CREATE INDEX books_idx ON books (sort COLLATE NOCASE); +CREATE INDEX books_languages_link_aidx ON books_languages_link (lang_code); +CREATE INDEX books_languages_link_bidx ON books_languages_link (book); +CREATE INDEX books_publishers_link_aidx ON books_publishers_link (publisher); +CREATE INDEX books_publishers_link_bidx ON books_publishers_link (book); +CREATE INDEX books_ratings_link_aidx ON books_ratings_link (rating); +CREATE INDEX books_ratings_link_bidx ON books_ratings_link (book); +CREATE INDEX books_series_link_aidx ON books_series_link (series); +CREATE INDEX books_series_link_bidx ON books_series_link (book); +CREATE INDEX books_tags_link_aidx ON books_tags_link (tag); +CREATE INDEX books_tags_link_bidx ON books_tags_link (book); +CREATE INDEX comments_idx ON comments (book); +CREATE INDEX conversion_options_idx_a ON conversion_options (format COLLATE NOCASE); +CREATE INDEX conversion_options_idx_b ON conversion_options (book); +CREATE INDEX custom_columns_idx ON custom_columns (label); +CREATE INDEX data_idx ON data (book); +CREATE INDEX formats_idx ON data (format); +CREATE INDEX languages_idx ON languages (lang_code COLLATE NOCASE); +CREATE INDEX publishers_idx ON publishers (name COLLATE NOCASE); +CREATE INDEX series_idx ON series (name COLLATE NOCASE); +CREATE INDEX tags_idx ON tags (name COLLATE NOCASE); +CREATE TRIGGER books_delete_trg + AFTER DELETE ON books + BEGIN + DELETE FROM books_authors_link WHERE book=OLD.id; + DELETE FROM books_publishers_link WHERE book=OLD.id; + DELETE FROM books_ratings_link WHERE book=OLD.id; + DELETE FROM books_series_link WHERE book=OLD.id; + DELETE FROM books_tags_link WHERE book=OLD.id; + DELETE FROM books_languages_link WHERE book=OLD.id; + DELETE FROM data WHERE book=OLD.id; + DELETE FROM comments WHERE book=OLD.id; + DELETE FROM conversion_options WHERE book=OLD.id; + DELETE FROM books_plugin_data WHERE book=OLD.id; + DELETE FROM identifiers WHERE book=OLD.id; + END; +CREATE TRIGGER books_insert_trg AFTER INSERT ON books + BEGIN + UPDATE books SET sort=title_sort(NEW.title),uuid=uuid4() WHERE id=NEW.id; + END; +CREATE TRIGGER books_update_trg + AFTER UPDATE ON books + BEGIN + UPDATE books SET sort=title_sort(NEW.title) + WHERE id=NEW.id AND OLD.title <> NEW.title; + END; +CREATE TRIGGER fkc_comments_insert + BEFORE INSERT ON comments + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + END; + END; +CREATE TRIGGER fkc_comments_update + BEFORE UPDATE OF book ON comments + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + END; + END; +CREATE TRIGGER fkc_data_insert + BEFORE INSERT ON data + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + END; + END; +CREATE TRIGGER fkc_data_update + BEFORE UPDATE OF book ON data + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + END; + END; +CREATE TRIGGER fkc_delete_on_authors + BEFORE DELETE ON authors + BEGIN + SELECT CASE + WHEN (SELECT COUNT(id) FROM books_authors_link WHERE author=OLD.id) > 0 + THEN RAISE(ABORT, 'Foreign key violation: authors is still referenced') + END; + END; +CREATE TRIGGER fkc_delete_on_languages + BEFORE DELETE ON languages + BEGIN + SELECT CASE + WHEN (SELECT COUNT(id) FROM books_languages_link WHERE lang_code=OLD.id) > 0 + THEN RAISE(ABORT, 'Foreign key violation: language is still referenced') + END; + END; +CREATE TRIGGER fkc_delete_on_languages_link + BEFORE INSERT ON books_languages_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + WHEN (SELECT id from languages WHERE id=NEW.lang_code) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: lang_code not in languages') + END; + END; +CREATE TRIGGER fkc_delete_on_publishers + BEFORE DELETE ON publishers + BEGIN + SELECT CASE + WHEN (SELECT COUNT(id) FROM books_publishers_link WHERE publisher=OLD.id) > 0 + THEN RAISE(ABORT, 'Foreign key violation: publishers is still referenced') + END; + END; +CREATE TRIGGER fkc_delete_on_series + BEFORE DELETE ON series + BEGIN + SELECT CASE + WHEN (SELECT COUNT(id) FROM books_series_link WHERE series=OLD.id) > 0 + THEN RAISE(ABORT, 'Foreign key violation: series is still referenced') + END; + END; +CREATE TRIGGER fkc_delete_on_tags + BEFORE DELETE ON tags + BEGIN + SELECT CASE + WHEN (SELECT COUNT(id) FROM books_tags_link WHERE tag=OLD.id) > 0 + THEN RAISE(ABORT, 'Foreign key violation: tags is still referenced') + END; + END; +CREATE TRIGGER fkc_insert_books_authors_link + BEFORE INSERT ON books_authors_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + WHEN (SELECT id from authors WHERE id=NEW.author) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: author not in authors') + END; + END; +CREATE TRIGGER fkc_insert_books_publishers_link + BEFORE INSERT ON books_publishers_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + WHEN (SELECT id from publishers WHERE id=NEW.publisher) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: publisher not in publishers') + END; + END; +CREATE TRIGGER fkc_insert_books_ratings_link + BEFORE INSERT ON books_ratings_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + WHEN (SELECT id from ratings WHERE id=NEW.rating) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: rating not in ratings') + END; + END; +CREATE TRIGGER fkc_insert_books_series_link + BEFORE INSERT ON books_series_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + WHEN (SELECT id from series WHERE id=NEW.series) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: series not in series') + END; + END; +CREATE TRIGGER fkc_insert_books_tags_link + BEFORE INSERT ON books_tags_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + WHEN (SELECT id from tags WHERE id=NEW.tag) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: tag not in tags') + END; + END; +CREATE TRIGGER fkc_update_books_authors_link_a + BEFORE UPDATE OF book ON books_authors_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + END; + END; +CREATE TRIGGER fkc_update_books_authors_link_b + BEFORE UPDATE OF author ON books_authors_link + BEGIN + SELECT CASE + WHEN (SELECT id from authors WHERE id=NEW.author) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: author not in authors') + END; + END; +CREATE TRIGGER fkc_update_books_languages_link_a + BEFORE UPDATE OF book ON books_languages_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + END; + END; +CREATE TRIGGER fkc_update_books_languages_link_b + BEFORE UPDATE OF lang_code ON books_languages_link + BEGIN + SELECT CASE + WHEN (SELECT id from languages WHERE id=NEW.lang_code) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: lang_code not in languages') + END; + END; +CREATE TRIGGER fkc_update_books_publishers_link_a + BEFORE UPDATE OF book ON books_publishers_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + END; + END; +CREATE TRIGGER fkc_update_books_publishers_link_b + BEFORE UPDATE OF publisher ON books_publishers_link + BEGIN + SELECT CASE + WHEN (SELECT id from publishers WHERE id=NEW.publisher) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: publisher not in publishers') + END; + END; +CREATE TRIGGER fkc_update_books_ratings_link_a + BEFORE UPDATE OF book ON books_ratings_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + END; + END; +CREATE TRIGGER fkc_update_books_ratings_link_b + BEFORE UPDATE OF rating ON books_ratings_link + BEGIN + SELECT CASE + WHEN (SELECT id from ratings WHERE id=NEW.rating) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: rating not in ratings') + END; + END; +CREATE TRIGGER fkc_update_books_series_link_a + BEFORE UPDATE OF book ON books_series_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + END; + END; +CREATE TRIGGER fkc_update_books_series_link_b + BEFORE UPDATE OF series ON books_series_link + BEGIN + SELECT CASE + WHEN (SELECT id from series WHERE id=NEW.series) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: series not in series') + END; + END; +CREATE TRIGGER fkc_update_books_tags_link_a + BEFORE UPDATE OF book ON books_tags_link + BEGIN + SELECT CASE + WHEN (SELECT id from books WHERE id=NEW.book) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: book not in books') + END; + END; +CREATE TRIGGER fkc_update_books_tags_link_b + BEFORE UPDATE OF tag ON books_tags_link + BEGIN + SELECT CASE + WHEN (SELECT id from tags WHERE id=NEW.tag) IS NULL + THEN RAISE(ABORT, 'Foreign key violation: tag not in tags') + END; + END; +CREATE TRIGGER series_insert_trg + AFTER INSERT ON series + BEGIN + UPDATE series SET sort=NEW.name WHERE id=NEW.id; + END; +CREATE TRIGGER series_update_trg + AFTER UPDATE ON series + BEGIN + UPDATE series SET sort=NEW.name WHERE id=NEW.id; + END; +pragma user_version=21; diff --git a/sources/resources/monocle/scripts/monocore.js b/sources/resources/monocle/scripts/monocore.js new file mode 100644 index 0000000..ae8b645 --- /dev/null +++ b/sources/resources/monocle/scripts/monocore.js @@ -0,0 +1,5641 @@ +/*! + * Monocle - A silky, tactile browser-based ebook JavaScript library. + * + * Copyright 2012, Joseph Pearson + * Licensed under the MIT license. + */ + + +Monocle = { + VERSION: "3.2.0" +}; + + +Monocle.Dimensions = {}; +Monocle.Controls = {}; +Monocle.Flippers = {}; +Monocle.Panels = {}; +// A class that tests the browser environment for required capabilities and +// known bugs (for which we have workarounds). +// +Monocle.Env = function () { + + var API = { constructor: Monocle.Env } + var k = API.constants = API.constructor; + var p = API.properties = { + // Assign to a function before running survey in order to get + // results as they come in. The function should take two arguments: + // testName and value. + resultCallback: null + } + + // These are private variables so they don't clutter up properties. + var css = Monocle.Browser.css; + var activeTestName = null; + var frameLoadCallback = null; + var testFrame = null; + var testFrameCntr = null; + var testFrameSize = 100; + var surveyCallback = null; + + + function survey(cb) { + surveyCallback = cb; + runNextTest(); + } + + + function runNextTest() { + var test = envTests.shift(); + if (!test) { return completed(); } + activeTestName = test[0]; + try { test[1](); } catch (e) { result(e); } + } + + + // Each test should call this to say "I'm finished, run the next test." + // + function result(val) { + API[activeTestName] = val; + if (p.resultCallback) { p.resultCallback(activeTestName, val); } + runNextTest(); + return val; + } + + + // Invoked after all tests have run. + // + function completed() { + // Remove the test frame after a slight delay (otherwise Gecko spins). + Monocle.defer(removeTestFrame); + + if (typeof surveyCallback == "function") { + fn = surveyCallback; + surveyCallback = null; + fn(API); + } + } + + + // A bit of sugar for simplifying a detection pattern: does this + // function exist? + // + // Pass a string snippet of JavaScript to be evaluated. + // + function testForFunction(str) { + return function () { result(typeof eval(str) == "function"); } + } + + + // A bit of sugar to indicate that the detection function for this test + // hasn't been written yet... + // + // Pass the value you want assigned for the test until it is implemented. + // + function testNotYetImplemented(rslt) { + return function () { result(rslt); } + } + + + // Loads (or reloads) a hidden iframe so that we can test browser features. + // + // cb is the callback that is fired when the test frame's content is loaded. + // + // src is optional, in which case it defaults to 4. If provided, it can be + // a number (specifying the number of pages of default content), or a string, + // which will be loaded as a URL. + // + function loadTestFrame(cb, src) { + if (!testFrame) { testFrame = createTestFrame(); } + frameLoadCallback = cb; + + src = src || 4; + + if (typeof src == "number") { + var pgs = []; + for (var i = 1, ii = src; i <= ii; ++i) { + pgs.push("
    Page "+i+"
    "); + } + var divStyle = [ + "display:inline-block", + "line-height:"+testFrameSize+"px", + "width:"+testFrameSize+"px" + ].join(";"); + src = "javascript:'"+ + ''+ + ''+ + ''+pgs.join("")+''+ + "'"; + } + + testFrame.src = src; + } + + + // Creates the hidden test frame and returns it. + // + function createTestFrame() { + testFrameCntr = document.createElement('div'); + testFrameCntr.style.cssText = [ + "width:"+testFrameSize+"px", + "height:"+testFrameSize+"px", + "overflow:hidden", + "position:absolute", + "visibility:hidden" + ].join(";"); + document.body.appendChild(testFrameCntr); + + var fr = document.createElement('iframe'); + testFrameCntr.appendChild(fr); + fr.setAttribute("scrolling", "no"); + fr.style.cssText = [ + "width:100%", + "height:100%", + "border:none", + "background:#900" + ].join(";"); + fr.addEventListener( + "load", + function () { + if (!fr.contentDocument || !fr.contentDocument.body) { return; } + var bd = fr.contentDocument.body; + bd.style.cssText = ([ + "margin:0", + "padding:0", + "position:absolute", + "height:100%", + "width:100%", + "-webkit-column-width:"+testFrameSize+"px", + "-webkit-column-gap:0", + "-webkit-column-fill:auto", + "-moz-column-width:"+testFrameSize+"px", + "-moz-column-gap:0", + "-moz-column-fill:auto", + "-o-column-width:"+testFrameSize+"px", + "-o-column-gap:0", + "-o-column-fill:auto", + "column-width:"+testFrameSize+"px", + "column-gap:0", + "column-fill:auto" + ].join(";")); + if (bd.scrollHeight > testFrameSize) { + bd.style.cssText += ["min-width:200%", "overflow:hidden"].join(";"); + if (bd.scrollHeight <= testFrameSize) { + bd.className = "column-force"; + } else { + bd.className = "column-failed "+bd.scrollHeight; + } + } + frameLoadCallback(fr); + }, + false + ); + return fr; + } + + + function removeTestFrame() { + if (testFrameCntr && testFrameCntr.parentNode) { + testFrameCntr.parentNode.removeChild(testFrameCntr); + } + } + + + function columnedWidth(fr) { + var bd = fr.contentDocument.body; + var de = fr.contentDocument.documentElement; + return Math.max(bd.scrollWidth, de.scrollWidth); + } + + + var envTests = [ + + // TEST FOR REQUIRED CAPABILITIES + + ["supportsW3CEvents", testForFunction("window.addEventListener")], + ["supportsCustomEvents", testForFunction("document.createEvent")], + ["supportsColumns", function () { + result(css.supportsPropertyWithAnyPrefix('column-width')); + }], + ["supportsTransform", function () { + result(css.supportsProperty([ + 'transformProperty', + 'WebkitTransform', + 'MozTransform', + 'OTransform', + 'msTransform' + ])); + }], + + + // TEST FOR OPTIONAL CAPABILITIES + + // Does it do CSS transitions? + ["supportsTransition", function () { + result(css.supportsPropertyWithAnyPrefix('transition')) + }], + + // Can we find nodes in a document with an XPath? + // + ["supportsXPath", testForFunction("document.evaluate")], + + // Can we find nodes in a document natively with a CSS selector? + // + ["supportsQuerySelector", testForFunction("document.querySelector")], + + // Can we do 3d transforms? + // + ["supportsTransform3d", function () { + result( + css.supportsMediaQueryProperty('transform-3d') && + css.supportsProperty([ + 'perspectiveProperty', + 'WebkitPerspective', + 'MozPerspective', + 'OPerspective', + 'msPerspective' + ]) && + !Monocle.Browser.renders.slow // Some older browsers can't be trusted. + ); + }], + + + // Commonly-used browser functionality + ["supportsOfflineCache", function () { + result(typeof window.applicationCache != 'undefined'); + }], + + ["supportsLocalStorage", function () { + // NB: Some duplicitous early Android browsers claim to have + // localStorage, but calls to getItem() fail. + result( + typeof window.localStorage != "undefined" && + typeof window.localStorage.getItem == "function" + ) + }], + + + // CHECK OUT OUR CONTEXT + + // Does the device have a MobileSafari-style touch interface? + // + ["touch", function () { + result( + ('ontouchstart' in window) || + css.supportsMediaQueryProperty('touch-enabled') + ); + }], + + // Is the Reader embedded, or in the top-level window? + // + ["embedded", function () { result(top != self) }], + + + // TEST FOR CERTAIN RENDERING OR INTERACTION BUGS + + // iOS (at least up to version 4.1) makes a complete hash of touch events + // when an iframe is overlapped by other elements. It's a dog's breakfast. + // See test/bugs/ios-frame-touch-bug for details. + // + ["brokenIframeTouchModel", function () { + result(Monocle.Browser.iOSVersionBelow("4.2")); + }], + + // Webkit-based browsers put floated elements in the wrong spot when + // columns are used -- they appear way down where they would be if there + // were no columns. Presumably the float positions are calculated before + // the columns. A bug has been lodged, and it's fixed in recent WebKits. + // + ["floatsIgnoreColumns", function () { + if (!Monocle.Browser.is.WebKit) { return result(false); } + match = navigator.userAgent.match(/AppleWebKit\/([\d\.]+)/); + if (!match) { return result(false); } + return result(match[1] < "534.30"); + }], + + // The latest engines all agree that if a body is translated leftwards, + // its scrollWidth is shortened. But some older WebKits (notably iOS4) + // do not subtract translateX values from scrollWidth. In this case, + // we should not add the translate back when calculating the width. + // + ["widthsIgnoreTranslate", function () { + loadTestFrame(function (fr) { + var firstWidth = columnedWidth(fr); + var s = fr.contentDocument.body.style; + var props = css.toDOMProps("transform"); + for (var i = 0, ii = props.length; i < ii; ++i) { + s[props[i]] = "translateX(-600px)"; + } + var secondWidth = columnedWidth(fr); + for (i = 0, ii = props.length; i < ii; ++i) { + s[props[i]] = "none"; + } + result(secondWidth == firstWidth); + }); + }], + + // On Android browsers, if the component iframe has a relative width (ie, + // 100%), the width of the entire browser will keep expanding and expanding + // to fit the width of the body of the iframe (which, with columns, is + // massive). So, 100% is treated as "of the body content" rather than "of + // the parent dimensions". In this scenario, we need to give the component + // iframe a fixed width in pixels. + // + // In iOS, the frame is clipped by overflow:hidden, so this doesn't seem to + // be a problem. + // + ["relativeIframeExpands", function () { + result(navigator.userAgent.indexOf("Android 2") >= 0); + }], + + // iOS3 will pause JavaScript execution if it gets a style-change + a + // scroll change on a component body. Weirdly, this seems to break GBCR + // in iOS4. + // + ["scrollToApplyStyle", function () { + result(Monocle.Browser.iOSVersionBelow("4")); + }], + + + // TEST FOR OTHER QUIRKY BROWSER BEHAVIOUR + + // Older versions of WebKit (iOS3, Kindle3) need a min-width set on the + // body of the iframe at 200%. This forces columns. But when this + // min-width is set, it's more difficult to recognise 1 page components, + // so we generally don't want to force it unless we have to. + // + ["forceColumns", function () { + loadTestFrame(function (fr) { + var bd = fr.contentDocument.body; + result(bd.className ? true : false); + }); + }], + + // A component iframe's body is absolutely positioned. This means that + // the documentElement should have a height of 0, since it contains nothing + // other than an absolutely positioned element. + // + // But for some browsers (Gecko and Opera), the documentElement is as + // wide as the full columned content, and the body is only as wide as + // the iframe element (ie, the first column). + // + // It gets weirder. Gecko sometimes behaves like WebKit (not clipping the + // body) IF the component has been loaded via HTML/JS/Nodes, not URL. Still + // can't reproduce outside Monocle. + // + // FIXME: If we can figure out a reliable behaviour for Gecko, we should + // use it to precalculate the workaround. At the moment, this test isn't + // used, but it belongs in src/dimensions/columns.js#columnedDimensions(). + // + // ["iframeBodyWidthClipped", function () { + // loadTestFrame(function (fr) { + // var doc = fr.contentDocument; + // result( + // doc.body.scrollWidth <= testFrameSize && + // doc.documentElement.scrollWidth > testFrameSize + // ); + // }) + // }], + + // Finding the page that a given HTML node is on is typically done by + // calculating the offset of its rectange from the body's rectangle. + // + // But if this information isn't provided by the browser, we need to use + // node.scrollIntoView and check the scrollOffset. Basically iOS3 is the + // only target platform that doesn't give us the rectangle info. + // + ["findNodesByScrolling", function () { + result(typeof document.body.getBoundingClientRect !== "function"); + }], + + // In MobileSafari browsers, iframes are rendered at the width and height + // of their content, rather than having scrollbars. So in that case, it's + // the containing element (the "sheaf") that must be scrolled, not the + // iframe body. + // + ["sheafIsScroller", function () { + loadTestFrame(function (fr) { + result(fr.parentNode.scrollWidth > testFrameSize); + }); + }], + + // For some reason, iOS MobileSafari sometimes loses track of a page after + // slideOut -- it thinks it has an x-translation of 0, rather than -768 or + // whatever. So the page gets "stuck" there, until it is given a non-zero + // x-translation. The workaround is to set a non-zero duration on the jumpIn, + // which seems to force WebKit to recalculate the x of the page. Weird, yeah. + // + ["stickySlideOut", function () { + result(Monocle.Browser.is.MobileSafari); + }], + + + // Chrome and Firefox incorrectly clip text when the dimensions of + // a page are not an integer. IE10 clips text when the page dimensions + // are rounded. + // + ['roundPageDimensions', function () { + result(!Monocle.Browser.is.IE); + }], + + + + // In IE10, the element of the iframe's document has scrollbars, + // unless you set its style.overflow to 'hidden'. + // + ['documentElementHasScrollbars', function () { + result(Monocle.Browser.is.IE); + }], + + + // Older versions of iOS (<6) would render blank pages if they were + // off the screen when their layout/position was updated. + // + ['offscreenRenderingClipped', function () { + result(Monocle.Browser.iOSVersionBelow('6')); + }], + + + // Gecko is better at loading content with document.write than with + // javascript: URLs. With the latter, it tends to put cruft in history, + // and gets confused by . + ['loadHTMLWithDocWrite', function () { + result(Monocle.Browser.is.Gecko || Monocle.Browser.is.Opera); + }] + + ]; + + + function isCompatible() { + return ( + API.supportsW3CEvents && + API.supportsCustomEvents && + API.supportsColumns && + API.supportsTransform && + !API.brokenIframeTouchModel + ); + } + + + API.survey = survey; + API.isCompatible = isCompatible; + + return API; +} +; +// A class for manipulating CSS properties in a browser-engine-aware way. +// +Monocle.CSS = function () { + + var API = { constructor: Monocle.CSS } + var k = API.constants = API.constructor; + var p = API.properties = { + guineapig: document.createElement('div') + } + + + // Returns engine-specific properties, + // + // eg: + // + // toCSSProps('transform') + // + // ... in WebKit, this will return: + // + // ['transform', '-webkit-transform'] + // + function toCSSProps(prop) { + var props = [prop]; + var eng = k.engines.indexOf(Monocle.Browser.engine); + if (eng) { + var pf = k.prefixes[eng]; + if (pf) { + props.push(pf+prop); + } + } + return props; + } + + + // Returns an engine-specific CSS string. + // + // eg: + // + // toCSSDeclaration('column-width', '300px') + // + // ... in Mozilla, this will return: + // + // "column-width: 300px; -moz-column-width: 300px;" + // + function toCSSDeclaration(prop, val) { + var props = toCSSProps(prop); + for (var i = 0, ii = props.length; i < ii; ++i) { + props[i] += ": "+val+";"; + } + return props.join(""); + } + + + // Returns an array of DOM properties specific to this engine. + // + // eg: + // + // toDOMProps('column-width') + // + // ... in Opera, this will return: + // + // [columnWidth, OColumnWidth] + // + function toDOMProps(prop) { + var parts = prop.split('-'); + for (var i = parts.length; i > 0; --i) { + parts[i] = capStr(parts[i]); + } + + var props = [parts.join('')]; + var eng = k.engines.indexOf(Monocle.Browser.engine); + if (eng) { + var pf = k.domprefixes[eng]; + if (pf) { + parts[0] = capStr(parts[0]); + props.push(pf+parts.join('')); + } + } + return props; + } + + + // Is this exact property (or any in this array of properties) supported + // by this engine? + // + function supportsProperty(props) { + for (var i in props) { + if (p.guineapig.style[props[i]] !== undefined) { return true; } + } + return false; + } // Thanks modernizr! + + + + // Is this property (or a prefixed variant) supported by this engine? + // + function supportsPropertyWithAnyPrefix(prop) { + return supportsProperty(toDOMProps(prop)); + } + + + function supportsMediaQuery(query) { + var gpid = "monocle_guineapig"; + p.guineapig.id = gpid; + var st = document.createElement('style'); + st.textContent = query+'{#'+gpid+'{height:3px}}'; + (document.head || document.getElementsByTagName('head')[0]).appendChild(st); + document.documentElement.appendChild(p.guineapig); + + var result = p.guineapig.offsetHeight === 3; + + st.parentNode.removeChild(st); + p.guineapig.parentNode.removeChild(p.guineapig); + + return result; + } // Thanks modernizr! + + + function supportsMediaQueryProperty(prop) { + return supportsMediaQuery( + '@media (' + k.prefixes.join(prop+'),(') + 'monocle__)' + ); + } + + + function capStr(wd) { + return wd ? wd.charAt(0).toUpperCase() + wd.substr(1) : ""; + } + + + API.toCSSProps = toCSSProps; + API.toCSSDeclaration = toCSSDeclaration; + API.toDOMProps = toDOMProps; + API.supportsProperty = supportsProperty; + API.supportsPropertyWithAnyPrefix = supportsPropertyWithAnyPrefix; + API.supportsMediaQuery = supportsMediaQuery; + API.supportsMediaQueryProperty = supportsMediaQueryProperty; + + return API; +} + + +Monocle.CSS.engines = ["W3C", "WebKit", "Gecko", "Opera", "IE", "Konqueror"]; +Monocle.CSS.prefixes = ["", "-webkit-", "-moz-", "-o-", "-ms-", "-khtml-"]; +Monocle.CSS.domprefixes = ["", "Webkit", "Moz", "O", "ms", "Khtml"]; +// STUBS - simple debug functions and polyfills to normalise client +// execution environments. + + +// A little console stub if not initialized in a console-equipped browser. +// +if (typeof window.console == "undefined") { + window.console = { messages: [] } + window.console.log = function (msg) { + this.messages.push(msg); + } + window.console.warn = window.console.log; +} + + +// A simple version of console.dir that works on iOS. +// +window.console.compatDir = function (obj) { + var stringify = function (o) { + var parts = []; + for (x in o) { + parts.push(x + ": " + o[x]); + } + return parts.join(";\n"); + } + + var out = stringify(obj); + window.console.log(out); + return out; +} + + +// This is called by Monocle methods and practices that are no longer +// recommended and will soon be removed. +// +window.console.deprecation = function (msg) { + console.warn("[DEPRECATION]: "+msg); + if (typeof console.trace == "function") { + console.trace(); + } +} + + +// A convenient alias for setTimeout that assumes 0 if no timeout is specified. +// +Monocle.defer = function (fn, time) { + if (typeof fn == "function") { + return setTimeout(fn, time || 0); + } +} +; +Monocle.Browser = {}; + +// Compare the user-agent string to a string or regex pattern. +// +Monocle.Browser.uaMatch = function (test) { + var ua = navigator.userAgent; + if (typeof test == "string") { return ua.indexOf(test) >= 0; } + return !!ua.match(test); +} + + +// Detect the browser engine and set boolean flags for reference. +// +Monocle.Browser.is = { + IE: !!(window.attachEvent && !Monocle.Browser.uaMatch('Opera')), + Opera: Monocle.Browser.uaMatch('Opera'), + WebKit: Monocle.Browser.uaMatch(/Apple\s?WebKit/), + Gecko: Monocle.Browser.uaMatch('Gecko') && !Monocle.Browser.uaMatch('KHTML'), + MobileSafari: Monocle.Browser.uaMatch(/OS \d_.*AppleWebKit.*Mobile/) +} + + +// Set the browser engine string. +// +if (Monocle.Browser.is.IE) { + Monocle.Browser.engine = "IE"; +} else if (Monocle.Browser.is.Opera) { + Monocle.Browser.engine = "Opera"; +} else if (Monocle.Browser.is.WebKit) { + Monocle.Browser.engine = "WebKit"; +} else if (Monocle.Browser.is.Gecko) { + Monocle.Browser.engine = "Gecko"; +} else { + console.warn("Unknown engine; assuming W3C compliant."); + Monocle.Browser.engine = "W3C"; +} + + +// Detect the client platform (typically device/operating system). +// +Monocle.Browser.on = { + iPhone: Monocle.Browser.is.MobileSafari && screen.width == 320, + iPad: Monocle.Browser.is.MobileSafari && screen.width == 768, + UIWebView: ( + Monocle.Browser.is.MobileSafari && + !Monocle.Browser.uaMatch('Safari') && + !navigator.standalone + ), + BlackBerry: Monocle.Browser.uaMatch('BlackBerry'), + Android: ( + Monocle.Browser.uaMatch('Android') || + Monocle.Browser.uaMatch(/Linux;.*EBRD/) // Sony Readers + ), + MacOSX: ( + Monocle.Browser.uaMatch('Mac OS X') && + !Monocle.Browser.is.MobileSafari + ), + Kindle3: Monocle.Browser.uaMatch(/Kindle\/3/) +} + + +// It is only because MobileSafari is responsible for so much anguish that +// we special-case it here. Not a badge of honour. +// +if (Monocle.Browser.is.MobileSafari) { + (function () { + var ver = navigator.userAgent.match(/ OS ([\d_]+)/); + if (ver) { + Monocle.Browser.iOSVersion = ver[1].replace(/_/g, '.'); + } else { + console.warn("Unknown MobileSafari user agent: "+navigator.userAgent); + } + })(); +} +Monocle.Browser.iOSVersionBelow = function (strOrNum) { + return !!Monocle.Browser.iOSVersion && Monocle.Browser.iOSVersion < strOrNum; +} + + +// Some browser environments are too slow or too problematic for +// special animation effects. +// +// FIXME: These tests are too opinionated. Replace with more targeted tests. +// +Monocle.Browser.renders = (function () { + var ua = navigator.userAgent; + var caps = {}; + caps.eInk = Monocle.Browser.on.Kindle3; + caps.slow = ( + caps.eInk || + (Monocle.Browser.on.Android && !ua.match(/Chrome/)) || + Monocle.Browser.on.Blackberry || + ua.match(/NintendoBrowser/) + ); + return caps; +})(); + + +// A helper class for sniffing CSS features and creating CSS rules +// appropriate to the current rendering engine. +// +Monocle.Browser.css = new Monocle.CSS(); + + +// During Reader initialization, this method is called to create the +// "environment", which tests for the existence of various browser +// features and bugs, then invokes the callback to continue initialization. +// +// If the survey has already been conducted and the env exists, calls +// callback immediately. +// +Monocle.Browser.survey = function (callback) { + if (!Monocle.Browser.env) { + Monocle.Browser.env = new Monocle.Env(); + Monocle.Browser.env.survey(callback); + } else if (typeof callback == "function") { + callback(); + } +} +; +Gala = {} + + +// Register an event listener. +// +Gala.listen = function (elem, evtType, fn, useCapture) { + elem = Gala.$(elem); + if (elem.addEventListener) { + elem.addEventListener(evtType, fn, useCapture || false); + } else if (elem.attachEvent) { + if (evtType.indexOf(':') < 1) { + elem.attachEvent('on'+evtType, fn); + } else { + var h = (Gala.IE_REGISTRATIONS[elem] = Gala.IE_REGISTRATIONS[elem] || {}); + var a = (h[evtType] = h[evtType] || []); + a.push(fn); + } + } +} + + +// Remove an event listener. +// +Gala.deafen = function (elem, evtType, fn, useCapture) { + elem = Gala.$(elem); + if (elem.removeEventListener) { + elem.removeEventListener(evtType, fn, useCapture || false); + } else if (elem.detachEvent) { + if (evtType.indexOf(':') < 1) { + elem.detachEvent('on'+evtType, fn); + } else { + var h = (Gala.IE_REGISTRATIONS[elem] = Gala.IE_REGISTRATIONS[elem] || {}); + var a = (h[evtType] = h[evtType] || []); + for (var i = 0, ii = a.length; i < ii; ++i) { + if (a[i] == fn) { a.splice(i, 1); } + } + } + } +} + + +// Fire an event on the element. +// +// The data supplied to this function will be available in the event object in +// the 'm' property -- eg, alert(evt.m) --> 'foo' +// +Gala.dispatch = function (elem, evtType, data, cancelable) { + elem = Gala.$(elem); + if (elem.dispatchEvent) { + var evt = document.createEvent('Events'); + evt.initEvent(evtType, false, cancelable || false); + evt.m = data; + return elem.dispatchEvent(evt); + } else if (elem.attachEvent && evtType.indexOf(':') >= 0) { + if (!Gala.IE_REGISTRATIONS[elem]) { return true; } + var evtHandlers = Gala.IE_REGISTRATIONS[elem][evtType]; + if (!evtHandlers || evtHandlers.length < 1) { return true; } + var evt = { + type: evtType, + currentTarget: elem, + target: elem, + m: data, + defaultPrevented: false, + preventDefault: function () { evt.defaultPrevented = true; } + } + var q, processQueue = Gala.IE_INVOCATION_QUEUE.length == 0; + for (var i = 0, ii = evtHandlers.length; i < ii; ++i) { + q = { elem: elem, evtType: evtType, handler: evtHandlers[i], evt: evt } + Gala.IE_INVOCATION_QUEUE.push(q); + } + if (processQueue) { + while (q = Gala.IE_INVOCATION_QUEUE.shift()) { + //console.log("IE EVT on %s: '%s' with data: %s", q.elem, q.evtType, q.evt.m); + q.handler(q.evt); + } + } + return !(cancelable && evt.defaultPrevented); + } else { + console.warn('[GALA] Cannot dispatch non-namespaced events: '+evtType); + return true; + } +} + + +// Prevents the browser-default action on an event and stops it from +// propagating up the DOM tree. +// +Gala.stop = function (evt) { + evt = evt || window.event; + if (evt.preventDefault) { evt.preventDefault(); } + if (evt.stopPropagation) { evt.stopPropagation(); } + evt.returnValue = false; + evt.cancelBubble = true; + return false; +} + + +// Add a group of listeners, which is just a hash of { evtType: callback, ... } +// +Gala.listenGroup = function (elem, listeners, useCapture) { + for (evtType in listeners) { + Gala.listen(elem, evtType, listeners[evtType], useCapture || false); + } +} + + +// Remove a group of listeners. +// +Gala.deafenGroup = function (elem, listeners, useCapture) { + for (evtType in listeners) { + Gala.deafen(elem, evtType, listeners[evtType], useCapture || false); + } +} + + +// Replace a group of listeners with another group, re-using the same +// 'listeners' object -- a common pattern. +// +Gala.replaceGroup = function (elem, listeners, newListeners, useCapture) { + Gala.deafenGroup(elem, listeners, useCapture || false); + for (evtType in listeners) { delete listeners[evtType]; } + for (evtType in newListeners) { listeners[evtType] = newListeners[evtType]; } + Gala.listenGroup(elem, listeners, useCapture || false); + return listeners; +} + + +// Listen for a tap or a click event. +// +// Returns a 'listener' object that can be passed to Gala.deafenGroup(). +// +// If 'tapClass' is undefined, it defaults to 'tapping'. If it is a blank +// string, no class is assigned. +// +Gala.onTap = function (elem, fn, tapClass) { + elem = Gala.$(elem); + if (typeof tapClass == 'undefined') { tapClass = Gala.TAPPING_CLASS; } + var tapping = false; + var fns = { + start: function (evt) { + tapping = true; + if (tapClass) { elem.classList.add(tapClass); } + }, + move: function (evt) { + if (!tapping) { return; } + tapping = false; + if (tapClass) { elem.classList.remove(tapClass); } + }, + end: function (evt) { + if (!tapping) { return; } + fns.move(evt); + evt.currentTarget = evt.currentTarget || evt.srcElement; + fn(evt); + }, + noop: function (evt) {} + } + var noopOnClick = function (listeners) { + Gala.listen(elem, 'click', listeners.click = fns.noop); + } + Gala.listen(window, 'gala:contact:cancel', fns.move); + return Gala.onContact(elem, fns, false, noopOnClick); +} + + +// Register a series of functions to listen for the start, move, end +// events of a mouse or touch interaction. +// +// 'fns' argument is an object like: +// +// { +// 'start': function () { ... }, +// 'move': function () { ... }, +// 'end': function () { ... }, +// 'cancel': function () { ... } +// } +// +// All of the functions in this object are optional. +// +// Returns an object that can later be passed to Gala.deafenGroup. +// +Gala.onContact = function (elem, fns, useCapture, initCallback) { + elem = Gala.$(elem); + var listeners = null; + var inited = false; + + // If we see a touchstart event, register all these listeners. + var touchListeners = function () { + var l = {} + if (fns.start) { + l.touchstart = function (evt) { + if (evt.touches.length <= 1) { fns.start(evt); } + } + } + if (fns.move) { + l.touchmove = function (evt) { + if (evt.touches.length <= 1) { fns.move(evt); } + } + } + if (fns.end) { + l.touchend = function (evt) { + if (evt.touches.length <= 1) { fns.end(evt); } + } + } + if (fns.cancel) { + l.touchcancel = fns.cancel; + } + return l; + } + + // Whereas if we see a mousedown event, register all these listeners. + var mouseListeners = function () { + var l = {}; + if (fns.start) { + l.mousedown = function (evt) { if (evt.button < 2) { fns.start(evt); } } + } + if (fns.move) { + l.mousemove = fns.move; + } + if (fns.end) { + l.mouseup = function (evt) { if (evt.button < 2) { fns.end(evt); } } + } + // if (fns.cancel) { + // l.mouseout = function (evt) { + // obj = evt.relatedTarget || evt.fromElement; + // while (obj && (obj = obj.parentNode)) { if (obj == elem) { return; } } + // fns.cancel(evt); + // } + // } + return l; + } + + if (typeof Gala.CONTACT_MODE == 'undefined') { + var contactInit = function (evt, newListeners, mode) { + if (inited) { return; } + Gala.CONTACT_MODE = Gala.CONTACT_MODE || mode; + if (Gala.CONTACT_MODE != mode) { return; } + Gala.replaceGroup(elem, listeners, newListeners, useCapture); + if (typeof initCallback == 'function') { initCallback(listeners); } + if (listeners[evt.type]) { listeners[evt.type](evt); } + inited = true; + } + var touchInit = function (evt) { + contactInit(evt, touchListeners(), 'touch'); + } + var mouseInit = function (evt) { + contactInit(evt, mouseListeners(), 'mouse'); + } + listeners = { + 'touchstart': touchInit, + 'touchmove': touchInit, + 'touchend': touchInit, + 'touchcancel': touchInit, + 'mousedown': mouseInit, + 'mousemove': mouseInit, + 'mouseup': mouseInit, + 'mouseout': mouseInit + } + } else if (Gala.CONTACT_MODE == 'touch') { + listeners = touchListeners(); + } else if (Gala.CONTACT_MODE == 'mouse') { + listeners = mouseListeners(); + } + + Gala.listenGroup(elem, listeners); + if (typeof initCallback == 'function') { initCallback(listeners); } + return listeners; +} + + +// The Gala.Cursor object provides more detail coordinates for the contact +// event, and normalizes differences between touch and mouse coordinates. +// +// If you have a contact event listener, you can get the coordinates for it +// with: +// +// var cursor = new Gala.Cursor(evt); +// +Gala.Cursor = function (evt) { + var API = { constructor: Gala.Cursor } + + + function initialize() { + var ci = + evt.type.indexOf('mouse') == 0 ? evt : + ['touchstart', 'touchmove'].indexOf(evt.type) >= 0 ? evt.targetTouches[0] : + ['touchend', 'touchcancel'].indexOf(evt.type) >= 0 ? evt.changedTouches[0] : + null; + + // Basic coordinates (provided by the event). + API.pageX = ci.pageX; + API.pageY = ci.pageY; + API.clientX = ci.clientX; + API.clientY = ci.clientY; + API.screenX = ci.screenX; + API.screenY = ci.screenY; + + // Coordinates relative to the target element for the event. + var tgt = API.target = evt.target || evt.srcElement; + while (tgt.nodeType != 1 && tgt.parentNode) { tgt = tgt.parentNode; } + assignOffsetFor(tgt, 'offset'); + + // Coordinates relative to the element that the event was registered on. + var registrant = evt.currentTarget; + if (registrant && typeof registrant.offsetLeft != 'undefined') { + assignOffsetFor(registrant, 'registrant'); + } + } + + + function assignOffsetFor(elem, attr) { + var r; + if (elem.getBoundingClientRect) { + var er = elem.getBoundingClientRect(); + var dr = document.documentElement.getBoundingClientRect(); + r = { left: er.left - dr.left, top: er.top - dr.top } + } else { + r = { left: elem.offsetLeft, top: elem.offsetTop } + while (elem = elem.offsetParent) { + if (elem.offsetLeft || elem.offsetTop) { + r.left += elem.offsetLeft; + r.top += elem.offsetTop; + } + } + } + API[attr+'X'] = API.pageX - r.left; + API[attr+'Y'] = API.pageY - r.top; + } + + + initialize(); + + return API; +} + + +// A little utility to dereference ids into elements. You've seen this before. +// +Gala.$ = function (elem) { + if (typeof elem == 'string') { elem = document.getElementById(elem); } + return elem; +} + + + +// CONSTANTS +// +Gala.TAPPING_CLASS = 'tapping'; +Gala.IE_REGISTRATIONS = {} +Gala.IE_INVOCATION_QUEUE = [] +; +// A shortcut for creating a bookdata object from a 'data' hash. +// +// eg: +// +// Monocle.bookData({ components: ['intro.html', 'ch1.html', 'ch2.html'] }); +// +// All keys in the 'data' hash are optional: +// +// components: must be an array of component urls +// chapters: must be an array of nested chapters (the usual bookdata structure) +// metadata: must be a hash of key/values +// getComponentFn: override the default way to fetch components via id +// +Monocle.bookData = function (data) { + return { + getComponents: function () { + return data.components || ['anonymous']; + }, + getContents: function () { + return data.chapters || []; + }, + getComponent: data.getComponent || function (id) { + return { url: id } + }, + getMetaData: function (key) { + return (data.metadata || {})[key]; + }, + data: data + } +} + + +// A shortcut for creating a bookdata object from an array of element ids. +// +// eg: +// +// Monocle.bookDataFromIds(['part1', 'part2']); +// +Monocle.bookDataFromIds = function (elementIds) { + return Monocle.bookData({ + components: elementIds, + getComponent: function (cmptId) { + return { nodes: [document.getElementById(cmptId)] } + } + }); +} + + +// A shortcut for creating a bookdata object from an array of nodes. +// +// eg: +// +// Monocle.bookDataFromNodes([document.getElementById('content')]); +// +Monocle.bookDataFromNodes = function (nodes) { + return Monocle.bookData({ + getComponent: function (n) { return { 'nodes': nodes }; } + }); +} +; +Monocle.Factory = function (element, label, index, reader) { + + var API = { constructor: Monocle.Factory }; + var k = API.constants = API.constructor; + var p = API.properties = { + element: element, + label: label, + index: index, + reader: reader, + prefix: reader.properties.classPrefix || '' + } + + + // If index is null, uses the first available slot. If index is not null and + // the slot is not free, throws an error. + // + function initialize() { + if (!p.label) { return; } + // Append the element to the reader's graph of DOM elements. + var node = p.reader.properties.graph; + node[p.label] = node[p.label] || []; + if (typeof p.index == 'undefined' && node[p.label][p.index]) { + throw('Element already exists in graph: '+p.label+'['+p.index+']'); + } else { + p.index = p.index || node[p.label].length; + } + node[p.label][p.index] = p.element; + + // Add the label as a class name. + addClass(p.label); + } + + + // Finds an element that has been created in the context of the current + // reader, with the given label. If oIndex is not provided, returns first. + // If oIndex is provided (eg, n), returns the nth element with the label. + // + function find(oLabel, oIndex) { + if (!p.reader.properties.graph[oLabel]) { + return null; + } + return p.reader.properties.graph[oLabel][oIndex || 0]; + } + + + // Takes an elements and assimilates it into the reader -- essentially + // giving it a "dom" object of it's own. It will then be accessible via find. + // + // Note that (as per comments for initialize), if oIndex is provided and + // there is no free slot in the array for this label at that index, an + // error will be thrown. + // + function claim(oElement, oLabel, oIndex) { + return oElement.dom = new Monocle.Factory( + oElement, + oLabel, + oIndex, + p.reader + ); + } + + + // Create an element with the given label. + // + // The last argument (whether third or fourth) is the options hash. Your + // options are: + // + // class - the classname for the element. Must only be one name. + // html - the innerHTML for the element. + // text - the innerText for the element (an alternative to html, simpler). + // + // Returns the created element. + // + function make(tagName, oLabel, index_or_options, or_options) { + var oIndex, options; + if (arguments.length == 1) { + oLabel = null, + oIndex = 0; + options = {}; + } else if (arguments.length == 2) { + oIndex = 0; + options = {}; + } else if (arguments.length == 4) { + oIndex = arguments[2]; + options = arguments[3]; + } else if (arguments.length == 3) { + var lastArg = arguments[arguments.length - 1]; + if (typeof lastArg == "number") { + oIndex = lastArg; + options = {}; + } else { + oIndex = 0; + options = lastArg; + } + } + + var oElement = document.createElement(tagName); + claim(oElement, oLabel, oIndex); + if (options['class']) { + oElement.className += " "+p.prefix+options['class']; + } + if (options['html']) { + oElement.innerHTML = options['html']; + } + if (options['text']) { + oElement.appendChild(document.createTextNode(options['text'])); + } + + return oElement; + } + + + // Creates an element by passing all the given arguments to make. Then + // appends the element as a child of the current element. + // + function append(tagName, oLabel, index_or_options, or_options) { + var oElement = make.apply(this, arguments); + p.element.appendChild(oElement); + return oElement; + } + + + // Returns an array of [label, index, reader] for the given element. + // A simple way to introspect the arguments required for #find, for eg. + // + function address() { + return [p.label, p.index, p.reader]; + } + + + // Apply a set of style rules (hash or string) to the current element. + // See Monocle.Styles.applyRules for more info. + // + function setStyles(rules) { + return Monocle.Styles.applyRules(p.element, rules); + } + + + function setBetaStyle(property, value) { + return Monocle.Styles.affix(p.element, property, value); + } + + + // ClassName manipulation functions - with thanks to prototype.js! + + // Returns true if one of the current element's classnames matches name -- + // classPrefix aware (so don't concate the prefix onto it). + // + function hasClass(name) { + name = p.prefix + name; + var klass = p.element.className; + if (!klass) { return false; } + if (klass == name) { return true; } + return new RegExp("(^|\\s)"+name+"(\\s|$)").test(klass); + } + + + // Adds name to the classnames of the current element (prepending the + // reader's classPrefix first). + // + function addClass(name) { + if (hasClass(name)) { return; } + var gap = p.element.className ? ' ' : ''; + return p.element.className += gap+p.prefix+name; + } + + + // Removes (classPrefix+)name from the classnames of the current element. + // + function removeClass(name) { + var reName = new RegExp("(^|\\s+)"+p.prefix+name+"(\\s+|$)"); + var reTrim = /^\s+|\s+$/g; + var klass = p.element.className; + p.element.className = klass.replace(reName, ' ').replace(reTrim, ''); + return p.element.className; + } + + + API.find = find; + API.claim = claim; + API.make = make; + API.append = append; + API.address = address; + + API.setStyles = setStyles; + API.setBetaStyle = setBetaStyle; + API.hasClass = hasClass; + API.addClass = addClass; + API.removeClass = removeClass; + + initialize(); + + return API; +} +; +Monocle.Events = {}; + + +Monocle.Events.wrapper = function (fn) { + return function (evt) { evt.m = new Gala.Cursor(evt); fn(evt); } +} + + +Monocle.Events.listen = Gala.listen; + + +Monocle.Events.deafen = Gala.deafen; + + +Monocle.Events.dispatch = Gala.dispatch; + + +Monocle.Events.listenForTap = function (elem, fn, tapClass) { + return Gala.onTap(elem, Monocle.Events.wrapper(fn), tapClass); +} + + +Monocle.Events.deafenForTap = Gala.deafenGroup; + + +Monocle.Events.listenForContact = function (elem, fns, options) { + options = options || { useCapture: false }; + var wrappers = {}; + for (evtType in fns) { + wrappers[evtType] = Monocle.Events.wrapper(fns[evtType]); + } + return Gala.onContact(elem, wrappers, options.useCapture); +} + + +Monocle.Events.deafenForContact = Gala.deafenGroup; + + +// Listen for the next transition-end event on the given element, call +// the function, then deafen. +// +// Returns a function that can be used to cancel the listen early. +// +Monocle.Events.afterTransition = function (elem, fn) { + var evtName = "transitionend"; + if (Monocle.Browser.is.WebKit) { + evtName = 'webkitTransitionEnd'; + } else if (Monocle.Browser.is.Opera) { + evtName = 'oTransitionEnd'; + } + var l = null, cancel = null; + l = function () { fn(); cancel(); } + cancel = function () { Monocle.Events.deafen(elem, evtName, l); } + Monocle.Events.listen(elem, evtName, l); + return cancel; +} +; +Monocle.Styles = { + + // Takes a hash and returns a string. + rulesToString: function (rules) { + if (typeof rules != 'string') { + var parts = []; + for (var declaration in rules) { + parts.push(declaration+": "+rules[declaration]+";") + } + rules = parts.join(" "); + } + return rules; + }, + + + // Takes a hash or string of CSS property assignments and applies them + // to the element. + // + applyRules: function (elem, rules) { + rules = Monocle.Styles.rulesToString(rules); + elem.style.cssText += ';'+rules; + return elem.style.cssText; + }, + + + // Generates cross-browser properties for a given property. + // ie, affix(, 'transition', 'linear 100ms') would apply that value + // to webkitTransition for WebKit browsers, and to MozTransition for Gecko. + // + affix: function (elem, property, value) { + var target = elem.style ? elem.style : elem; + var props = Monocle.Browser.css.toDOMProps(property); + while (props.length) { target[props.shift()] = value; } + }, + + + setX: function (elem, x) { + var s = elem.style; + if (typeof x == "number") { x += "px"; } + var val = Monocle.Browser.env.supportsTransform3d ? + 'translate3d('+x+', 0, 0)' : + 'translateX('+x+')'; + val = (x == '0px') ? 'none' : val; + s.webkitTransform = s.MozTransform = s.OTransform = s.transform = val; + return x; + }, + + + setY: function (elem, y) { + var s = elem.style; + if (typeof y == "number") { y += "px"; } + var val = Monocle.Browser.env.supportsTransform3d ? + 'translate3d(0, '+y+', 0)' : + 'translateY('+y+')'; + val = (y == '0px') ? 'none' : val; + s.webkitTransform = s.MozTransform = s.OTransform = s.transform = val; + return y; + }, + + + getX: function (elem) { + var currStyle = document.defaultView.getComputedStyle(elem, null); + var re = /matrix\([^,]+,[^,]+,[^,]+,[^,]+,\s*([^,]+),[^\)]+\)/; + var props = Monocle.Browser.css.toDOMProps('transform'); + var matrix = null; + while (props.length && !matrix) { + matrix = currStyle[props.shift()]; + } + return parseInt(matrix.match(re)[1]); + }, + + + transitionFor: function (elem, prop, duration, timing, delay) { + var tProps = Monocle.Browser.css.toDOMProps('transition'); + var pProps = Monocle.Browser.css.toCSSProps(prop); + timing = timing || "linear"; + delay = (delay || 0)+"ms"; + for (var i = 0, ii = tProps.length; i < ii; ++i) { + var t = "none"; + if (duration) { + t = [pProps[i], duration+"ms", timing, delay].join(" "); + } + elem.style[tProps[i]] = t; + } + } + +} + + +// These rule definitions are more or less compulsory for Monocle to behave +// as expected. Which is why they appear here and not in the stylesheet. +// Adjust them if you know what you're doing. +// +Monocle.Styles.container = { + "position": "absolute", + "overflow": "hidden", + "top": "0", + "left": "0", + "bottom": "0", + "right": "0" +} + +Monocle.Styles.page = { + "position": "absolute", + "z-index": "1", + "-webkit-user-select": "none", + "-moz-user-select": "none", + "-ms-user-select": "none", + "user-select": "none", + "-webkit-transform": "translate3d(0,0,0)", + "visibility": "visible" + + /* + "background": "white", + "top": "0", + "left": "0", + "bottom": "0", + "right": "0" + */ +} + +Monocle.Styles.sheaf = { + "position": "absolute", + "overflow": "hidden" + + /* + "top": "0", + "left": "0", + "bottom": "0", + "right": "0" + */ +} + +Monocle.Styles.component = { + "width": "100%", + "height": "100%", + "border": "none", + "-webkit-user-select": "none", + "-moz-user-select": "none", + "-ms-user-select": "none", + "user-select": "none" +} + +Monocle.Styles.control = { + "z-index": "100", + "cursor": "pointer" +} + +Monocle.Styles.overlay = { + "position": "absolute", + "display": "none", + "width": "100%", + "height": "100%", + "z-index": "1000" +} +; +Monocle.Formatting = function (reader, optStyles, optScale) { + var API = { constructor: Monocle.Formatting }; + var k = API.constants = API.constructor; + var p = API.properties = { + reader: reader, + + // An array of style rules that are automatically applied to every page. + stylesheets: [], + + // A multiplier on the default font-size of each element in every + // component. If null, the multiplier is not applied (or it is removed). + fontScale: null + } + + + function initialize() { + p.fontScale = optScale; + clampStylesheets(optStyles); + p.reader.listen('monocle:componentmodify', persistOnComponentChange); + } + + + // Clamp page frames to a set of styles that reduce Monocle breakage. + // + function clampStylesheets(implStyles) { + var defCSS = k.DEFAULT_STYLE_RULES; + if (Monocle.Browser.env.floatsIgnoreColumns) { + defCSS.push("html#RS\\:monocle * { float: none !important; }"); + } + p.defaultStyles = addPageStyles(defCSS, false); + if (implStyles) { + p.initialStyles = addPageStyles(implStyles, false); + } + } + + + function persistOnComponentChange(evt) { + var doc = evt.m['document']; + doc.documentElement.id = p.reader.properties.systemId; + adjustFontScaleForDoc(doc, p.fontScale); + for (var i = 0; i < p.stylesheets.length; ++i) { + if (p.stylesheets[i]) { + addPageStylesheet(doc, i); + } + } + } + + + /* PAGE STYLESHEETS */ + + // API for adding a new stylesheet to all components. styleRules should be + // a string of CSS rules. restorePlace defaults to true. + // + // Returns a sheet index value that can be used with updatePageStyles + // and removePageStyles. + // + function addPageStyles(styleRules, restorePlace) { + return changingStylesheet(function () { + p.stylesheets.push(styleRules); + var sheetIndex = p.stylesheets.length - 1; + + var i = 0, cmpt = null; + while (cmpt = p.reader.dom.find('component', i++)) { + addPageStylesheet(cmpt.contentDocument, sheetIndex); + } + return sheetIndex; + }, restorePlace); + } + + + // API for updating the styleRules in an existing page stylesheet across + // all components. Takes a sheet index value obtained via addPageStyles. + // + function updatePageStyles(sheetIndex, styleRules, restorePlace) { + return changingStylesheet(function () { + p.stylesheets[sheetIndex] = styleRules; + if (typeof styleRules.join == "function") { + styleRules = styleRules.join("\n"); + } + + var i = 0, cmpt = null; + while (cmpt = p.reader.dom.find('component', i++)) { + var doc = cmpt.contentDocument; + var styleTag = doc.getElementById('monStylesheet'+sheetIndex); + if (!styleTag) { + console.warn('No such stylesheet: ' + sheetIndex); + return; + } + if (styleTag.styleSheet) { + styleTag.styleSheet.cssText = styleRules; + } else { + styleTag.replaceChild( + doc.createTextNode(styleRules), + styleTag.firstChild + ); + } + } + }, restorePlace); + } + + + // API for removing a page stylesheet from all components. Takes a sheet + // index value obtained via addPageStyles. + // + function removePageStyles(sheetIndex, restorePlace) { + return changingStylesheet(function () { + p.stylesheets[sheetIndex] = null; + var i = 0, cmpt = null; + while (cmpt = p.reader.dom.find('component', i++)) { + var doc = cmpt.contentDocument; + var styleTag = doc.getElementById('monStylesheet'+sheetIndex); + styleTag.parentNode.removeChild(styleTag); + } + }, restorePlace); + } + + + // Wraps all API-based stylesheet changes (add, update, remove) in a + // brace of custom events (stylesheetchanging/stylesheetchange), and + // recalculates component dimensions if specified (default to true). + // + function changingStylesheet(callback, restorePlace) { + restorePlace = (restorePlace === false) ? false : true; + if (restorePlace) { + dispatchChanging(); + } + var result = callback(); + if (restorePlace) { + p.reader.recalculateDimensions(true); + Monocle.defer(dispatchChange); + } else { + p.reader.recalculateDimensions(false); + } + return result; + } + + + function dispatchChanging() { + p.reader.dispatchEvent("monocle:stylesheetchanging", {}); + } + + + function dispatchChange() { + p.reader.dispatchEvent("monocle:stylesheetchange", {}); + } + + + // Private method for adding a stylesheet to a component. Used by + // addPageStyles. + // + function addPageStylesheet(doc, sheetIndex) { + var styleRules = p.stylesheets[sheetIndex]; + + if (!styleRules) { + return; + } + + if (!doc || !doc.documentElement) { + return; + } + + var head = doc.getElementsByTagName('head')[0]; + if (!head) { + head = doc.createElement('head'); + doc.documentElement.appendChild(head); + } + + if (typeof styleRules.join == "function") { + styleRules = styleRules.join("\n"); + } + + var styleTag = doc.createElement('style'); + styleTag.type = 'text/css'; + styleTag.id = "monStylesheet"+sheetIndex; + if (styleTag.styleSheet) { + styleTag.styleSheet.cssText = styleRules; + } else { + styleTag.appendChild(doc.createTextNode(styleRules)); + } + + head.appendChild(styleTag); + + return styleTag; + } + + + /* FONT SCALING */ + + function setFontScale(scale, restorePlace) { + p.fontScale = scale; + if (restorePlace) { + dispatchChanging(); + } + var i = 0, cmpt = null; + while (cmpt = p.reader.dom.find('component', i++)) { + adjustFontScaleForDoc(cmpt.contentDocument, scale); + } + if (restorePlace) { + p.reader.recalculateDimensions(true); + dispatchChange(); + } else { + p.reader.recalculateDimensions(false); + } + } + + + function adjustFontScaleForDoc(doc, scale) { + var elems = doc.getElementsByTagName('*'); + if (scale) { + scale = parseFloat(scale); + if (!doc.body.pfsSwept) { + sweepElements(doc, elems); + } + + // Iterate over each element, applying scale to the original + // font-size. If a proportional font sizing is already applied to + // the element, update existing cssText, otherwise append new cssText. + // + for (var j = 0, jj = elems.length; j < jj; ++j) { + var newFs = fsProperty(elems[j].pfsOriginal, scale); + if (elems[j].pfsApplied) { + replaceFontSizeInStyle(elems[j], newFs); + } else { + elems[j].style.cssText += newFs; + } + elems[j].pfsApplied = scale; + } + } else if (doc.body.pfsSwept) { + // Iterate over each element, removing proportional font-sizing flag + // and property from cssText. + for (var j = 0, jj = elems.length; j < jj; ++j) { + if (elems[j].pfsApplied) { + var oprop = elems[j].pfsOriginalProp; + var opropDec = oprop ? 'font-size: '+oprop+' ! important;' : ''; + replaceFontSizeInStyle(elems[j], opropDec); + elems[j].pfsApplied = null; + } + } + + // Establish new baselines in case classes have changed. + sweepElements(doc, elems); + } + } + + + function sweepElements(doc, elems) { + // Iterate over each element, looking at its font size and storing + // the original value against the element. + for (var i = 0, ii = elems.length; i < ii; ++i) { + var currStyle = doc.defaultView.getComputedStyle(elems[i], null); + var fs = parseFloat(currStyle.getPropertyValue('font-size')); + elems[i].pfsOriginal = fs; + elems[i].pfsOriginalProp = elems[i].style.fontSize; + } + doc.body.pfsSwept = true; + } + + + function fsProperty(orig, scale) { + return 'font-size: '+(orig*scale)+'px ! important;'; + } + + + function replaceFontSizeInStyle(elem, newProp) { + var lastFs = /font-size:[^;]/ + elem.style.cssText = elem.style.cssText.replace(lastFs, newProp); + } + + + API.addPageStyles = addPageStyles; + API.updatePageStyles = updatePageStyles; + API.removePageStyles = removePageStyles; + API.setFontScale = setFontScale; + + initialize(); + + return API; +} + + + +Monocle.Formatting.DEFAULT_STYLE_RULES = [ + "html#RS\\:monocle * {" + + "-webkit-font-smoothing: subpixel-antialiased;" + + "text-rendering: auto !important;" + + "word-wrap: break-word !important;" + + "overflow: visible !important;" + + "}", + "html#RS\\:monocle body {" + + "margin: 0 !important;"+ + "border: none !important;" + + "padding: 0 !important;" + + "width: 100% !important;" + + "position: absolute !important;" + + "-webkit-text-size-adjust: none;" + + "}", + "html#RS\\:monocle body * {" + + "max-width: 100% !important;" + + "}", + "html#RS\\:monocle img, html#RS\\:monocle video, html#RS\\:monocle object, html#RS\\:monocle svg {" + + "max-height: 95% !important;" + + "height: auto !important;" + + "}" +] +; +// READER +// +// +// The full DOM hierarchy created by Reader is: +// +// box +// -> container +// -> pages (the number of page elements is determined by the flipper) +// -> sheaf (basically just sets the margins) +// -> component (an iframe created by the current component) +// -> body (the document.body of the iframe) +// -> page controls +// -> standard controls +// -> overlay +// -> modal/popover controls +// +// +// Options: +// +// flipper: The class of page flipper to use. +// +// panels: The class of panels to use +// +// stylesheet: A string of CSS rules to apply to the contents of each +// component loaded into the reader. +// +// fontScale: a float to multiply against the default font-size of each +// element in each component. +// +// place: A book locus for the page to open to when the reader is +// initialized. (See comments at Book#pageNumberAt for more about +// the locus option). +// +// systemId: the id for root elements of components, defaults to "RS:monocle" +// +Monocle.Reader = function (node, bookData, options, onLoadCallback) { + + var API = { constructor: Monocle.Reader } + var k = API.constants = API.constructor; + var p = API.properties = { + // Initialization-completed flag. + initialized: false, + + // The active book. + book: null, + + // DOM graph of factory-generated objects. + graph: {}, + + // Id applied to the HTML element of each component, can be used to scope + // CSS rules. + systemId: (options ? options.systemId : null) || k.DEFAULT_SYSTEM_ID, + + // Prefix for classnames for any created element. + classPrefix: k.DEFAULT_CLASS_PREFIX, + + // Registered control objects (see addControl). Hashes of the form: + // { + // control: , + // elements: , + // controlType: + // } + controls: [], + + // After the reader has been resized, this resettable timer must expire + // the place is restored. + resizeTimer: null + } + + var dom; + + + // Inspects the browser environment and kicks off preparing the container. + // + function initialize() { + options = options || {} + + Monocle.Browser.survey(prepareBox); + } + + + // Sets up the container and internal elements. + // + function prepareBox() { + var box = node; + if (typeof box == "string") { box = document.getElementById(box); } + dom = API.dom = box.dom = new Monocle.Factory(box, 'box', 0, API); + + API.billboard = new Monocle.Billboard(API); + + if (!Monocle.Browser.env.isCompatible()) { + if (dispatchEvent("monocle:incompatible", {}, true)) { + fatalSystemMessage(k.COMPATIBILITY_INFO); + } + return; + } + + dispatchEvent("monocle:initializing", API); + + bookData = bookData || Monocle.bookDataFromNodes([box.cloneNode(true)]); + var bk = new Monocle.Book(bookData, options.preloadWindow || 1); + + box.innerHTML = ""; + + // Make sure the box div is absolutely or relatively positioned. + positionBox(); + + // Attach the page-flipping gadget. + attachFlipper(options.flipper); + + // Create the essential DOM elements. + createReaderElements(); + + // Create the selection object. + API.selection = new Monocle.Selection(API); + + // Create the formatting object. + API.formatting = new Monocle.Formatting( + API, + options.stylesheet, + options.fontScale + ); + + primeFrames(options.primeURL, function () { + // Make the reader elements look pretty. + applyStyles(); + + p.flipper.listenForInteraction(options.panels); + + setBook(bk, options.place, function () { + if (onLoadCallback) { onLoadCallback(API); } + dispatchEvent("monocle:loaded", API); + }); + }); + } + + + function positionBox() { + var currPosVal; + var box = dom.find('box'); + if (document.defaultView) { + var currStyle = document.defaultView.getComputedStyle(box, null); + currPosVal = currStyle.getPropertyValue('position'); + } else if (box.currentStyle) { + currPosVal = box.currentStyle.position + } + if (["absolute", "relative"].indexOf(currPosVal) == -1) { + box.style.position = "relative"; + } + } + + + function attachFlipper(flipperClass) { + if (!flipperClass) { + if (Monocle.Browser.renders.slow) { + flipperClass = Monocle.Flippers.Instant; + } else { + flipperClass = Monocle.Flippers.Slider; + } + } + + p.flipper = new flipperClass(API, null, p.readerOptions); + } + + + function createReaderElements() { + var cntr = dom.append('div', 'container'); + for (var i = 0; i < p.flipper.pageCount; ++i) { + var page = cntr.dom.append('div', 'page', i); + page.style.visibility = "hidden"; + page.m = { reader: API, pageIndex: i, place: null } + page.m.sheafDiv = page.dom.append('div', 'sheaf', i); + page.m.activeFrame = page.m.sheafDiv.dom.append('iframe', 'component', i); + page.m.activeFrame.m = { 'pageDiv': page }; + page.m.activeFrame.setAttribute('frameBorder', 0); + page.m.activeFrame.setAttribute('scrolling', 'no'); + p.flipper.addPage(page); + } + dom.append('div', 'overlay'); + dispatchEvent("monocle:loading", API); + } + + + // Opens the frame to a particular URL (usually 'about:blank'). + // + function primeFrames(url, callback) { + url = url || (Monocle.Browser.on.UIWebView ? "blank.html" : "about:blank"); + + var pageCount = 0; + + var cb = function (evt) { + var frame = evt.target || evt.srcElement; + Monocle.Events.deafen(frame, 'load', cb); + dispatchEvent( + 'monocle:frameprimed', + { frame: frame, pageIndex: pageCount } + ); + if ((pageCount += 1) == p.flipper.pageCount) { + Monocle.defer(callback); + } + } + + forEachPage(function (page) { + Monocle.Events.listen(page.m.activeFrame, 'load', cb); + page.m.activeFrame.src = url; + }); + } + + + function applyStyles() { + dom.find('container').dom.setStyles(Monocle.Styles.container); + forEachPage(function (page, i) { + page.dom.setStyles(Monocle.Styles.page); + dom.find('sheaf', i).dom.setStyles(Monocle.Styles.sheaf); + var cmpt = dom.find('component', i) + cmpt.dom.setStyles(Monocle.Styles.component); + }); + lockFrameWidths(); + dom.find('overlay').dom.setStyles(Monocle.Styles.overlay); + dispatchEvent('monocle:styles'); + } + + + function lockingFrameWidths() { + if (!Monocle.Browser.env.relativeIframeExpands) { return; } + for (var i = 0, cmpt; cmpt = dom.find('component', i); ++i) { + cmpt.style.display = "none"; + } + } + + + function lockFrameWidths() { + if (!Monocle.Browser.env.relativeIframeExpands) { return; } + for (var i = 0, cmpt; cmpt = dom.find('component', i); ++i) { + cmpt.style.width = cmpt.parentNode.offsetWidth+"px"; + cmpt.style.display = "block"; + } + } + + + // Apply the book, move to a particular place or just the first page, wait + // for everything to complete, then fire the callback. + // + function setBook(bk, place, callback) { + p.book = bk; + var pageCount = 0; + if (typeof callback == 'function') { + var watchers = { + 'monocle:componentchange': function (evt) { + dispatchEvent('monocle:firstcomponentchange', evt.m); + return (pageCount += 1) == p.flipper.pageCount; + }, + 'monocle:componentfailed': function (evt) { + fatalSystemMessage(k.LOAD_FAILURE_INFO); + return true; + }, + 'monocle:turn': function (evt) { + deafen('monocle:componentfailed', listener); + callback(); + return true; + } + } + var listener = function (evt) { + if (watchers[evt.type](evt)) { deafen(evt.type, listener); } + } + for (evtType in watchers) { listen(evtType, listener) } + } + p.flipper.moveTo(place || { page: 1 }, initialized); + } + + + function getBook() { + return p.book; + } + + + function initialized() { + p.initialized = true; + } + + + // Attempts to restore the place we were up to in the book before the + // reader was resized. + // + // The delay ensures that if we get multiple calls to this function in + // a short period, we don't do lots of expensive recalculations. + // + function resized() { + if (!p.initialized) { + console.warn('Attempt to resize book before initialization.'); + } + lockingFrameWidths(); + if (!dispatchEvent("monocle:resizing", {}, true)) { + return; + } + clearTimeout(p.resizeTimer); + p.resizeTimer = Monocle.defer(performResize, k.RESIZE_DELAY); + } + + + function performResize() { + lockFrameWidths(); + recalculateDimensions(true, afterResized); + } + + + function afterResized() { + dispatchEvent('monocle:resize'); + } + + + function recalculateDimensions(andRestorePlace, callback) { + if (!p.book) { return; } + dispatchEvent("monocle:recalculating"); + + var place, locus; + if (andRestorePlace !== false) { + var place = getPlace(); + var locus = { percent: place ? place.percentageThrough() : 0 }; + } + + forEachPage(function (pageDiv) { + pageDiv.m.activeFrame.m.component.updateDimensions(pageDiv); + }); + + var cb = function () { + dispatchEvent("monocle:recalculated"); + Monocle.defer(callback); + } + Monocle.defer(function () { locus ? p.flipper.moveTo(locus, cb) : cb; }); + } + + + // Returns the current page number in the book. + // + // The pageDiv argument is optional - typically defaults to whatever the + // flipper thinks is the "active" page. + // + function pageNumber(pageDiv) { + var place = getPlace(pageDiv); + return place ? (place.pageNumber() || 1) : 1; + } + + + // Returns the current "place" in the book -- ie, the page number, chapter + // title, etc. + // + // The pageDiv argument is optional - typically defaults to whatever the + // flipper thinks is the "active" page. + // + function getPlace(pageDiv) { + if (!p.initialized) { + console.warn('Attempt to access place before initialization.'); + } + return p.flipper.getPlace(pageDiv); + } + + + // Moves the current page as specified by the locus. See + // Monocle.Book#pageNumberAt for documentation on the locus argument. + // + // The callback argument is optional. + // + function moveTo(locus, callback) { + if (!p.initialized) { + console.warn('Attempt to move place before initialization.'); + } + if (!p.book.isValidLocus(locus)) { + dispatchEvent( + "monocle:notfound", + { href: locus ? locus.componentId : "anonymous" } + ); + return false; + } + var fn = callback; + if (!locus.direction) { + dispatchEvent('monocle:jumping', { locus: locus }); + fn = function () { + dispatchEvent('monocle:jump', { locus: locus }); + if (callback) { callback(); } + } + } + p.flipper.moveTo(locus, fn); + return true; + } + + + // Moves to the relevant element in the relevant component. + // + function skipToChapter(src) { + var locus = p.book.locusOfChapter(src); + return moveTo(locus); + } + + + // Valid types: + // - standard (an overlay above the pages) + // - page (within the page) + // - modal (overlay where click-away does nothing, for a single control) + // - hud (overlay that multiple controls can share) + // - popover (overlay where click-away removes the ctrl elements) + // - invisible + // + // Options: + // - hidden -- creates and hides the ctrl elements; + // use showControl to show them + // - container -- specify an existing DOM element to contain the control. + // + function addControl(ctrl, cType, options) { + for (var i = 0; i < p.controls.length; ++i) { + if (p.controls[i].control == ctrl) { + console.warn("Already added control: %o", ctrl); + return; + } + } + + options = options || {}; + + var ctrlData = { control: ctrl, elements: [], controlType: cType } + p.controls.push(ctrlData); + + var addControlTo = function (cntr) { + if (cntr == 'container') { + cntr = options.container || dom.find('container'); + if (typeof cntr == 'string') { cntr = document.getElementById(cntr); } + if (!cntr.dom) { dom.claim(cntr, 'controlContainer'); } + } else if (cntr == 'overlay') { + cntr = dom.find('overlay'); + } + if (typeof ctrl.createControlElements != 'function') { return; } + var ctrlElem = ctrl.createControlElements(cntr); + if (!ctrlElem) { return; } + cntr.appendChild(ctrlElem); + ctrlData.elements.push(ctrlElem); + Monocle.Styles.applyRules(ctrlElem, Monocle.Styles.control); + return ctrlElem; + } + + if (!cType || cType == 'standard' || cType == 'invisible') { + addControlTo('container'); + } else if (cType == 'page') { + forEachPage(addControlTo); + } else if (cType == 'modal' || cType == 'popover' || cType == 'hud') { + addControlTo('overlay'); + ctrlData.usesOverlay = true; + } else if (cType == 'invisible') { + addControlTo('container'); + } else { + console.warn('Unknown control type: ' + cType); + } + + if (options.hidden) { + hideControl(ctrl); + } else { + showControl(ctrl); + } + + if (typeof ctrl.assignToReader == 'function') { + ctrl.assignToReader(API); + } + + return ctrl; + } + + + function dataForControl(ctrl) { + for (var i = 0; i < p.controls.length; ++i) { + if (p.controls[i].control == ctrl) { + return p.controls[i]; + } + } + } + + + function hideControl(ctrl) { + var controlData = dataForControl(ctrl); + if (!controlData) { + console.warn("No data for control: " + ctrl); + return; + } + if (controlData.hidden) { + return; + } + for (var i = 0; i < controlData.elements.length; ++i) { + controlData.elements[i].style.display = "none"; + } + if (controlData.usesOverlay) { + var overlay = dom.find('overlay'); + overlay.style.display = "none"; + Monocle.Events.deafenForContact(overlay, overlay.listeners); + if (controlData.controlType != 'hud') { + dispatchEvent('monocle:modal:off'); + } + } + controlData.hidden = true; + if (ctrl.properties) { + ctrl.properties.hidden = true; + } + dispatchEvent('monocle:controlhide', { control: ctrl }, false); + } + + + function showControl(ctrl) { + var controlData = dataForControl(ctrl); + if (!controlData) { + console.warn("No data for control: " + ctrl); + return false; + } + + if (showingControl(ctrl)) { + return false; + } + + var overlay = dom.find('overlay'); + if (controlData.usesOverlay && controlData.controlType != "hud") { + for (var i = 0, ii = p.controls.length; i < ii; ++i) { + if (p.controls[i].usesOverlay && !p.controls[i].hidden) { + return false; + } + } + overlay.style.display = "block"; + dispatchEvent('monocle:modal:on'); + } + + for (var i = 0; i < controlData.elements.length; ++i) { + controlData.elements[i].style.display = "block"; + } + + if (controlData.controlType == "popover") { + var onControl = function (evt) { + var obj = evt.target; + do { + if (obj == controlData.elements[0]) { return true; } + } while (obj && (obj = obj.parentNode)); + return false; + } + overlay.listeners = Monocle.Events.listenForContact( + overlay, + { + start: function (evt) { if (!onControl(evt)) { hideControl(ctrl); } }, + move: function (evt) { if (!onControl(evt)) { evt.preventDefault(); } } + } + ); + } + controlData.hidden = false; + if (ctrl.properties) { + ctrl.properties.hidden = false; + } + dispatchEvent('monocle:controlshow', { control: ctrl }, false); + return true; + } + + + function showingControl(ctrl) { + var controlData = dataForControl(ctrl); + return controlData.hidden == false; + } + + + function dispatchEvent(evtType, data, cancelable) { + return Monocle.Events.dispatch(dom.find('box'), evtType, data, cancelable); + } + + + function listen(evtType, fn, useCapture) { + Monocle.Events.listen(dom.find('box'), evtType, fn, useCapture); + } + + + function deafen(evtType, fn) { + Monocle.Events.deafen(dom.find('box'), evtType, fn); + } + + + function visiblePages() { + return p.flipper.visiblePages ? + p.flipper.visiblePages() : + [dom.find('page')]; + } + + + function forEachPage(callback) { + for (var i = 0, ii = p.flipper.pageCount; i < ii; ++i) { + var page = dom.find('page', i); + callback(page, i); + } + } + + + /* The Reader PageStyles API is deprecated - it has moved to Formatting */ + + function addPageStyles(styleRules, restorePlace) { + console.deprecation("Use reader.formatting.addPageStyles instead."); + return API.formatting.addPageStyles(styleRules, restorePlace); + } + + + function updatePageStyles(sheetIndex, styleRules, restorePlace) { + console.deprecation("Use reader.formatting.updatePageStyles instead."); + return API.formatting.updatePageStyles(sheetIndex, styleRules, restorePlace); + } + + + function removePageStyles(sheetIndex, restorePlace) { + console.deprecation("Use reader.formatting.removePageStyles instead."); + return API.formatting.removePageStyles(sheetIndex, restorePlace); + } + + + function fatalSystemMessage(msg) { + var info = dom.make('div', 'book_fatality', { html: msg }); + var box = dom.find('box'); + var bbOrigin = [box.offsetWidth / 2, box.offsetHeight / 2]; + API.billboard.show(info, { closeButton: false, from: bbOrigin }); + } + + + API.getBook = getBook; + API.getPlace = getPlace; + API.moveTo = moveTo; + API.skipToChapter = skipToChapter; + API.resized = resized; + API.recalculateDimensions = recalculateDimensions; + API.addControl = addControl; + API.hideControl = hideControl; + API.showControl = showControl; + API.showingControl = showingControl; + API.dispatchEvent = dispatchEvent; + API.listen = listen; + API.deafen = deafen; + API.visiblePages = visiblePages; + + // Deprecated! + API.addPageStyles = addPageStyles; + API.updatePageStyles = updatePageStyles; + API.removePageStyles = removePageStyles; + + initialize(); + + return API; +} + + +Monocle.Reader.RESIZE_DELAY = Monocle.Browser.renders.slow ? 500 : 100; +Monocle.Reader.DEFAULT_SYSTEM_ID = 'RS:monocle' +Monocle.Reader.DEFAULT_CLASS_PREFIX = 'monelem_' +Monocle.Reader.DEFAULT_STYLE_RULES = Monocle.Formatting.DEFAULT_STYLE_RULES; +Monocle.Reader.COMPATIBILITY_INFO = + "

    Incompatible browser

    "+ + "

    Unfortunately, your browser isn't able to display this book. "+ + "If possible, try again in another browser or on another device.

    "; +Monocle.Reader.LOAD_FAILURE_INFO = + "

    Book could not be loaded

    "+ + "

    Sorry, parts of the book could not be retrieved.
    "+ + "Please check your connection and refresh to try again.

    "; +/* BOOK */ + +/* The Book handles movement through the content by the reader page elements. + * + * It's responsible for instantiating components as they are required, + * and for calculating which component and page number to move to (based on + * requests from the Reader). + * + */ + +Monocle.Book = function (dataSource, preloadWindow) { + + var API = { constructor: Monocle.Book } + var k = API.constants = API.constructor; + var p = API.properties = { + dataSource: dataSource, + preloadWindow: preloadWindow, + cmptLoadQueue: {}, + components: [], + chapters: {} // flat arrays of chapters per component + } + + + function initialize() { + p.componentIds = dataSource.getComponents(); + p.contents = dataSource.getContents(); + p.lastCIndex = p.componentIds.length - 1; + } + + + // Adjusts the given locus object to provide the page number within the + // current component. + // + // If the locus implies movement to another component, the locus + // 'componentId' property will be updated to point to this component, and + // the 'load' property will be set to true, which should be taken as a + // sign to call loadPageAt with a callback. + // + // The locus argument is an object that has one of the following properties: + // + // - page: positive integer. Counting up from the start of component. + // - pagesBack: negative integer. Counting back from the end of component. + // - percent: float indicating percentage through the component + // - direction: integer relative to the current page number for this pageDiv + // - position: string, one of "start" or "end", moves to corresponding point + // in the given component + // - anchor: an element id within the component + // - xpath: the node at this XPath within the component + // - selector: the first node at this CSS selector within the component + // + // The locus object can also specify a componentId. If it is not provided + // we default to the currently active component, and if that doesn't exist, + // we default to the very first component. + // + // The locus result will be an object with the following properties: + // + // - load: boolean, true if loading component required, false otherwise + // - componentId: component to load (current componentId if load is false) + // - if load is false: + // - page + // - if load is true: + // - one of page / pagesBack / percent / direction / position / anchor + // + function pageNumberAt(pageDiv, locus) { + locus.load = false; + var currComponent = pageDiv.m.activeFrame ? + pageDiv.m.activeFrame.m.component : + null; + var component = null; + var cIndex = p.componentIds.indexOf(locus.componentId); + if (cIndex < 0 && !currComponent) { + // No specified component, no current component. Load first component. + locus.load = true; + locus.componentId = p.componentIds[0]; + return locus; + } else if ( + cIndex < 0 && + locus.componentId && + currComponent.properties.id != locus.componentId + ) { + // Invalid component, say not found. + pageDiv.m.reader.dispatchEvent( + "monocle:notfound", + { href: locus.componentId } + ); + return null; + } else if (cIndex < 0) { + // No specified (or invalid) component, use current component. + component = currComponent; + locus.componentId = pageDiv.m.activeFrame.m.component.properties.id; + cIndex = p.componentIds.indexOf(locus.componentId); + } else if (!p.components[cIndex] || p.components[cIndex] != currComponent) { + // Specified component differs from current component. Load specified. + locus.load = true; + return locus; + } else { + component = currComponent; + } + + // If we're here, then the locus is based on the current component. + var result = { load: false, componentId: locus.componentId, page: 1 } + + // Get the current last page. + lastPageNum = component.lastPageNumber(); + + // Deduce the page number for the given locus. + if (typeof(locus.page) == "number") { + result.page = locus.page; + } else if (typeof(locus.pagesBack) == "number") { + result.page = lastPageNum + locus.pagesBack; + } else if (typeof(locus.percent) == "number") { + var place = new Monocle.Place(); + place.setPlace(component, 1); + result.page = place.pageAtPercentageThrough(locus.percent); + } else if (typeof(locus.direction) == "number") { + if (!pageDiv.m.place) { + console.warn("Can't move in a direction if pageDiv has no place."); + } + result.page = pageDiv.m.place.pageNumber(); + result.page += locus.direction; + } else if (typeof(locus.anchor) == "string") { + result.page = component.pageForChapter(locus.anchor, pageDiv); + } else if (typeof(locus.xpath) == "string") { + result.page = component.pageForXPath(locus.xpath, pageDiv); + } else if (typeof(locus.selector) == "string") { + result.page = component.pageForSelector(locus.selector, pageDiv); + } else if (typeof(locus.position) == "string") { + if (locus.position == "start") { + result.page = 1; + } else if (locus.position == "end") { + result.page = lastPageNum['new']; + } + } else { + console.warn("Unrecognised locus: " + locus); + } + + if (result.page < 1) { + if (cIndex == 0) { + // On first page of book. + result.page = 1; + result.boundarystart = true; + } else { + // Moving backwards from current component. + result.load = true; + result.componentId = p.componentIds[cIndex - 1]; + result.pagesBack = result.page; + result.page = null; + } + } else if (result.page > lastPageNum) { + if (cIndex == p.lastCIndex) { + // On last page of book. + result.page = lastPageNum; + result.boundaryend = true; + } else { + // Moving forwards from current component. + result.load = true; + result.componentId = p.componentIds[cIndex + 1]; + result.page -= lastPageNum; + } + } + + return result; + } + + + // Same as pageNumberAt, but if a load is not flagged, this will + // automatically update the pageDiv's place to the given pageNumber. + // + // If you call this (ie, from a flipper), you are effectively entering into + // a contract to move the frame offset to the given page returned in the + // locus if load is false. + // + function setPageAt(pageDiv, locus) { + locus = pageNumberAt(pageDiv, locus); + if (locus && !locus.load) { + var evtData = { locus: locus, page: pageDiv } + if (locus.boundarystart) { + pageDiv.m.reader.dispatchEvent('monocle:boundarystart', evtData); + } else if (locus.boundaryend) { + pageDiv.m.reader.dispatchEvent('monocle:boundaryend', evtData); + } else { + var component = p.components[p.componentIds.indexOf(locus.componentId)]; + pageDiv.m.place = pageDiv.m.place || new Monocle.Place(); + pageDiv.m.place.setPlace(component, locus.page); + + var evtData = { + page: pageDiv, + locus: locus, + pageNumber: pageDiv.m.place.pageNumber(), + componentId: locus.componentId + } + pageDiv.m.reader.dispatchEvent("monocle:pagechange", evtData); + } + } + return locus; + } + + + // Will load the given component into the pageDiv's frame, then invoke the + // callback with resulting locus (provided by pageNumberAt). + // + // If the resulting page number is outside the bounds of the new component, + // (ie, pageNumberAt again requests a load), this will recurse into further + // components until non-loading locus is returned by pageNumberAt. Then the + // callback will fire with that locus. + // + // As with setPageAt, if you call this you're obliged to move the frame + // offset to the given page in the locus passed to the callback. + // + function loadPageAt(pageDiv, locus, onLoad, onFail) { + var cIndex = p.componentIds.indexOf(locus.componentId); + if (!locus.load || cIndex < 0) { + locus = pageNumberAt(pageDiv, locus); + } + + if (!locus) { + return onFail ? onFail() : null; + } + + if (!locus.load) { + return onLoad(locus); + } + + var findPageNumber = function () { + locus = setPageAt(pageDiv, locus); + if (!locus) { + return onFail ? onFail() : null; + } else if (locus.load) { + loadPageAt(pageDiv, locus, onLoad, onFail) + } else { + onLoad(locus); + } + } + + var applyComponent = function (component) { + component.applyTo(pageDiv, findPageNumber); + for (var l = 1; l <= p.preloadWindow; ++l) { + deferredPreloadComponent(cIndex+l, l*k.PRELOAD_INTERVAL); + } + } + + loadComponent(cIndex, applyComponent, onFail, pageDiv); + } + + + // If your flipper doesn't care whether a component needs to be + // loaded before the page can be set, you can use this shortcut. + // + function setOrLoadPageAt(pageDiv, locus, onLoad, onFail) { + locus = setPageAt(pageDiv, locus); + if (!locus) { + if (onFail) { onFail(); } + } else if (locus.load) { + loadPageAt(pageDiv, locus, onLoad, onFail); + } else { + onLoad(locus); + } + } + + + // Fetches the component source from the dataSource. + // + // 'index' is the index of the component in the + // dataSource.getComponents array. + // + // 'onLoad' is invoked when the source is received. + // + // 'onFail' is optional, and is invoked if the source could not be fetched. + // + // 'pageDiv' is optional, and simply allows firing events on + // the reader object that has requested this component, ONLY if + // the source has not already been received. + // + function loadComponent(index, onLoad, onFail, pageDiv) { + if (p.components[index]) { + return onLoad(p.components[index]); + } + + var cmptId = p.components[index]; + var evtData = { 'page': pageDiv, 'component': cmptId, 'index': index }; + pageDiv.m.reader.dispatchEvent('monocle:componentloading', evtData); + + var onCmptLoad = function (cmpt) { + evtData['component'] = cmpt; + pageDiv.m.reader.dispatchEvent('monocle:componentloaded', evtData); + onLoad(cmpt); + } + + var onCmptFail = function (cmptId) { + console.warn("Failed to load component: "+cmptId); + pageDiv.m.reader.dispatchEvent('monocle:componentfailed', evtData); + if (onFail) { onFail(); } + } + + _loadComponent(index, onCmptLoad, onCmptFail); + } + + + function preloadComponent(index) { + if (p.components[index]) { return; } + var cmptId = p.componentIds[index]; + if (!cmptId) { return; } + if (p.cmptLoadQueue[cmptId]) { return; } + _loadComponent(index); + } + + + function deferredPreloadComponent(index, delay) { + Monocle.defer(function () { preloadComponent(index); }, delay); + } + + + function _loadComponent(index, successCallback, failureCallback) { + var cmptId = p.componentIds[index]; + var queueItem = { success: successCallback, failure: failureCallback }; + if (p.cmptLoadQueue[cmptId]) { + return p.cmptLoadQueue[cmptId] = queueItem; + } else { + p.cmptLoadQueue[cmptId] = queueItem; + } + + var onCmptFail = function () { + fireLoadQueue(cmptId, 'failure', cmptId); + } + + var onCmptLoad = function (cmptSource) { + if (cmptSource === false) { return onCmptFail(); } + p.components[index] = new Monocle.Component( + API, + cmptId, + index, + chaptersForComponent(cmptId), + cmptSource + ); + fireLoadQueue(cmptId, 'success', p.components[index]); + } + + var cmptSource = p.dataSource.getComponent(cmptId, onCmptLoad); + if (cmptSource && !p.components[index]) { + onCmptLoad(cmptSource); + } else if (cmptSource === false) { + onCmptFail(); + } + } + + + function fireLoadQueue(cmptId, cbName, args) { + if (typeof p.cmptLoadQueue[cmptId][cbName] == 'function') { + p.cmptLoadQueue[cmptId][cbName](args); + } + p.cmptLoadQueue[cmptId] = null; + } + + + // Returns an array of chapter objects that are found in the given component. + // + // A chapter object has this format: + // + // { + // title: "Chapter 1", + // fragment: null + // } + // + // The fragment property of a chapter object is either null (the chapter + // starts at the head of the component) or the fragment part of the URL + // (eg, "foo" in "index.html#foo"). + // + function chaptersForComponent(cmptId) { + if (p.chapters[cmptId]) { + return p.chapters[cmptId]; + } + p.chapters[cmptId] = []; + var matcher = new RegExp('^'+decodeURIComponent(cmptId)+"(\#(.+)|$)"); + var matches; + var recurser = function (chp) { + if (matches = decodeURIComponent(chp.src).match(matcher)) { + p.chapters[cmptId].push({ + title: chp.title, + fragment: matches[2] || null + }); + } + if (chp.children) { + for (var i = 0; i < chp.children.length; ++i) { + recurser(chp.children[i]); + } + } + } + + for (var i = 0; i < p.contents.length; ++i) { + recurser(p.contents[i]); + } + return p.chapters[cmptId]; + } + + + // Returns a locus for the chapter that has the URL given in the + // 'src' argument. + // + // See the comments at pageNumberAt for an explanation of locus objects. + // + function locusOfChapter(src) { + var matcher = new RegExp('^(.+?)(#(.*))?$'); + var matches = src.match(matcher); + if (!matches) { return null; } + var cmptId = componentIdMatching(matches[1]); + if (!cmptId) { return null; } + var locus = { componentId: cmptId } + matches[3] ? locus.anchor = matches[3] : locus.position = "start"; + return locus; + } + + + function isValidLocus(locus) { + if (!locus) { return false; } + if (locus.componentId && !componentIdMatching(locus.componentId)) { + return false; + } + return true; + } + + + function componentIdMatching(str) { + str = decodeURIComponent(str); + for (var i = 0, ii = p.componentIds.length; i < ii; ++i) { + if (decodeURIComponent(p.componentIds[i]) == str) { return str; } + } + return null; + } + + + function componentWeights() { + if (!p.weights) { + p.weights = dataSource.getMetaData('componentWeights') || []; + if (!p.weights.length) { + var cmptSize = 1.0 / p.componentIds.length; + for (var i = 0, ii = p.componentIds.length; i < ii; ++i) { + p.weights.push(cmptSize); + } + } + } + return p.weights; + } + + + API.getMetaData = dataSource.getMetaData; + API.pageNumberAt = pageNumberAt; + API.setPageAt = setPageAt; + API.loadPageAt = loadPageAt; + API.setOrLoadPageAt = setOrLoadPageAt; + API.chaptersForComponent = chaptersForComponent; + API.locusOfChapter = locusOfChapter; + API.isValidLocus = isValidLocus; + API.componentWeights = componentWeights; + + initialize(); + + return API; +} + + +// Legacy function. Deprecated. +// +Monocle.Book.fromNodes = function (nodes) { + console.deprecation("Book.fromNodes() will soon be removed."); + return new Monocle.Book(Monocle.bookDataFromNodes(nodes)); +} + +Monocle.Book.PRELOAD_INTERVAL = 1000; +// PLACE + +Monocle.Place = function () { + + var API = { constructor: Monocle.Place } + var k = API.constants = API.constructor; + var p = API.properties = { + component: null, + percent: null + } + + + function setPlace(cmpt, pageN) { + p.component = cmpt; + p.percent = pageN / cmpt.lastPageNumber(); + p.chapter = null; + } + + + function setPercentageThrough(cmpt, percent) { + p.component = cmpt; + p.percent = percent; + p.chapter = null; + } + + + function componentId() { + return p.component.properties.id; + } + + + // How far we are through the component at the "top of the page". + // + // 0 - start of book. 1.0 - end of book. + // + function percentAtTopOfPage() { + if (k.PAGE_ANCHOR == 'bottom') { + return p.percent - 1.0 / p.component.lastPageNumber(); + } else { + return p.percent; + } + } + + + function percentOnPage() { + return percentAtTopOfPage() + k.PAGE_ANCHOR_OFFSET / pagesInComponent(); + } + + + // How far we are through the component at the "bottom of the page". + // + function percentAtBottomOfPage() { + if (k.PAGE_ANCHOR == 'bottom') { + return p.percent; + } else { + return p.percent + 1.0 / p.component.lastPageNumber(); + } + } + + + // The page number at a given point (0: start, 1: end) within the component. + // + function pageAtPercentageThrough(percent) { + var pages = pagesInComponent(); + if (typeof percent != 'number') { percent = 0; } + return Math.max(Math.round(pages * percent), 1); + } + + + // The page number of this point within the component. + // + function pageNumber() { + return pageAtPercentageThrough(p.percent); + } + + + function pagesInComponent() { + return p.component.lastPageNumber(); + } + + + function chapterInfo() { + if (p.chapter) { + return p.chapter; + } + return p.chapter = p.component.chapterForPage(pageNumber()+1); + } + + + function chapterTitle() { + var chp = chapterInfo(); + return chp ? chp.title : null; + } + + + function chapterSrc() { + var src = componentId(); + var cinfo = chapterInfo(); + if (cinfo && cinfo.fragment) { + src += "#" + cinfo.fragment; + } + return src; + } + + + function getLocus(options) { + options = options || {}; + var locus = { + page: pageNumber(), + componentId: componentId() + } + if (options.direction) { + locus.page += options.direction; + } else { + locus.percent = percentAtBottomOfPage(); + } + return locus; + } + + + // Returns how far this place is in the entire book (0 - start, 1.0 - end). + // + function percentageOfBook() { + var book = p.component.properties.book; + var componentIds = book.properties.componentIds; + var weights = book.componentWeights(); + var cmptIndex = p.component.properties.index; + var pc = weights[cmptIndex] * p.percent; + for (var i = 0, ii = cmptIndex; i < ii; ++i) { pc += weights[i]; } + + // Note: This is a decent estimation of current page number and total + // number of pages, but it's very approximate. Could be improved by storing + // the page counts of all components accessed (since the dimensions of the + // reader last changed), and averaging the result across them. (You + // probably want to ignore calcs for components < 2 or 3 pages long, too. + // The bigger the component, the more accurate the calculation.) + // + // var bkPages = p.component.lastPageNumber() / weights[cmptIndex]; + // console.log('Page: '+ Math.floor(pc*bkPages)+ ' of '+ Math.floor(bkPages)); + + return pc; + } + + + function onFirstPageOfBook() { + return p.component.properties.index == 0 && pageNumber() == 1; + } + + + function onLastPageOfBook() { + return ( + p.component.properties.index == + p.component.properties.book.properties.lastCIndex && + pageNumber() == p.component.lastPageNumber() + ); + } + + + API.setPlace = setPlace; + API.setPercentageThrough = setPercentageThrough; + API.componentId = componentId; + API.percentAtTopOfPage = percentAtTopOfPage; + API.percentOnPage = percentOnPage; + API.percentAtBottomOfPage = percentAtBottomOfPage; + API.pageAtPercentageThrough = pageAtPercentageThrough; + API.pageNumber = pageNumber; + API.pagesInComponent = pagesInComponent; + API.chapterInfo = chapterInfo; + API.chapterTitle = chapterTitle; + API.chapterSrc = chapterSrc; + API.getLocus = getLocus; + API.percentageOfBook = percentageOfBook; + API.onFirstPageOfBook = onFirstPageOfBook; + API.onLastPageOfBook = onLastPageOfBook; + + API.percentageThrough = k.PAGE_ANCHOR == 'bottom' ? percentAtBottomOfPage : + k.PAGE_ANCHOR == 'offset' ? percentOnPage : + percentAtTopOfPage; + + return API; +} + + +// Can set this to 'top', 'offset' or 'bottom'. Old Monocle behaviour is 'bottom'. +// +Monocle.Place.PAGE_ANCHOR = 'offset'; +Monocle.Place.PAGE_ANCHOR_OFFSET = 0.1; + + +Monocle.Place.FromPageNumber = function (component, pageNumber) { + var place = new Monocle.Place(); + place.setPlace(component, pageNumber); + return place; +} + + +Monocle.Place.FromPercentageThrough = function (component, percent) { + var place = new Monocle.Place(); + place.setPercentageThrough(component, percent); + return place; +} + + +// We can't create a place from a percentage of the book, because the +// component may not have been loaded yet. But we can get a locus. +// +Monocle.Place.percentOfBookToLocus = function (reader, percent) { + var book = reader.getBook(); + var componentIds = book.properties.componentIds; + var weights = book.componentWeights(); + var cmptIndex = 0, cmptWeight = 0; + percent = Math.min(percent, 0.99999); + while (percent >= 0) { + cmptWeight = weights[cmptIndex]; + percent -= weights[cmptIndex]; + if (percent >= 0) { + cmptIndex += 1; + if (cmptIndex >= weights.length) { + console.error('Unable to calculate locus from percentage: '+percent); + return; + } + } + } + var cmptPercent = (percent + cmptWeight) / cmptWeight; + return { componentId: componentIds[cmptIndex], percent: cmptPercent } +} +; +/* COMPONENT */ + +// See the properties declaration for details of constructor arguments. +// +Monocle.Component = function (book, id, index, chapters, source) { + + var API = { constructor: Monocle.Component } + var k = API.constants = API.constructor; + var p = API.properties = { + // a back-reference to the public API of the book that owns this component + book: book, + + // the string that represents this component in the book's component array + id: id, + + // the position in the book's components array of this component + index: index, + + // The chapters argument is an array of objects that list the chapters that + // can be found in this component. A chapter object is defined as: + // + // { + // title: str, + // fragment: str, // optional anchor id + // percent: n // how far into the component the chapter begins + // } + // + // NOTE: the percent property is calculated by the component - you only need + // to pass in the title and the optional id string. + // + chapters: chapters, + + // the frame provided by dataSource.getComponent() for this component + source: source + } + + + // Makes this component the active component for the pageDiv. There are + // several strategies for this (see loadFrame). + // + // When the component has been loaded into the pageDiv's frame, the callback + // will be invoked with the pageDiv and this component as arguments. + // + function applyTo(pageDiv, callback) { + prepareSource(pageDiv.m.reader); + + var evtData = { 'page': pageDiv, 'source': p.source }; + pageDiv.m.reader.dispatchEvent('monocle:componentchanging', evtData); + + var onLoaded = function () { + setupFrame( + pageDiv, + pageDiv.m.activeFrame, + function () { callback(pageDiv, API) } + ); + } + + Monocle.defer(function () { loadFrame(pageDiv, onLoaded); }); + } + + + // Loads this component into the given frame, using one of the following + // strategies: + // + // * HTML - a HTML string + // * URL - a URL string + // * Nodes - an array of DOM body nodes (NB: no way to populate head) + // * Document - a DOM DocumentElement object + // + function loadFrame(pageDiv, callback) { + var frame = pageDiv.m.activeFrame; + + // We own this frame now. + frame.m.component = API; + + // Hide the frame while we're changing it. + frame.style.visibility = "hidden"; + + frame.whenDocumentReady = function () { + var doc = frame.contentDocument; + var evtData = { 'page': pageDiv, 'document': doc, 'component': API }; + pageDiv.m.reader.dispatchEvent('monocle:componentmodify', evtData); + frame.whenDocumentReady = null; + } + + if (p.source.html) { + return loadFrameFromHTML(p.source.html || p.source, frame, callback); + } else if (p.source.url) { + return loadFrameFromURL(p.source.url, frame, callback); + } else if (p.source.doc) { + return loadFrameFromDocument(p.source.doc, frame, callback); + } + } + + + // LOAD STRATEGY: HTML + // Loads a HTML string into the given frame, invokes the callback once loaded. + // + function loadFrameFromHTML(src, frame, callback) { + var fn = function () { + Monocle.Events.deafen(frame, 'load', fn); + frame.whenDocumentReady(); + Monocle.defer(callback); + } + Monocle.Events.listen(frame, 'load', fn); + if (Monocle.Browser.env.loadHTMLWithDocWrite) { + frame.contentDocument.open('text/html', 'replace'); + frame.contentDocument.write(src); + frame.contentDocument.close(); + } else { + frame.contentWindow['monCmptData'] = src; + frame.src = "javascript:window['monCmptData'];" + } + } + + + // LOAD STRATEGY: URL + // Loads the URL into the given frame, invokes callback once loaded. + // + function loadFrameFromURL(url, frame, callback) { + // If it's a relative path, we need to make it absolute. + if (!url.match(/^\//)) { + url = absoluteURL(url); + } + var onDocumentReady = function () { + Monocle.Events.deafen(frame, 'load', onDocumentReady); + frame.whenDocumentReady(); + } + var onDocumentLoad = function () { + Monocle.Events.deafen(frame, 'load', onDocumentLoad); + Monocle.defer(callback); + } + Monocle.Events.listen(frame, 'load', onDocumentReady); + Monocle.Events.listen(frame, 'load', onDocumentLoad); + frame.contentWindow.location.replace(url); + } + + + // LOAD STRATEGY: DOCUMENT + // Replaces the DocumentElement of the given frame with the given srcDoc. + // Invokes the callback when loaded. + // + function loadFrameFromDocument(srcDoc, frame, callback) { + var doc = frame.contentDocument; + + // WebKit has an interesting quirk. The tag must exist in the + // document being replaced, not the new document. + if (Monocle.Browser.is.WebKit) { + var srcBase = srcDoc.querySelector('base'); + if (srcBase) { + var head = doc.querySelector('head'); + if (!head) { + try { + head = doc.createElement('head'); + prependChild(doc.documentElement, head); + } catch (e) { + head = doc.body; + } + } + var base = doc.createElement('base'); + base.setAttribute('href', srcBase.href); + head.appendChild(base); + } + } + + doc.replaceChild( + doc.importNode(srcDoc.documentElement, true), + doc.documentElement + ); + + // NB: It's a significant problem with this load strategy that there's + // no indication when it is complete. + Monocle.defer(callback); + } + + + // Once a frame is loaded with this component, call this method to style + // and measure its contents. + // + function setupFrame(pageDiv, frame, callback) { + updateDimensions(pageDiv, function () { + frame.style.visibility = "visible"; + + // Find the place of any chapters in the component. + locateChapters(pageDiv); + + // Nothing can prevent iframe scrolling on Android, so we have to undo it. + if (Monocle.Browser.on.Android) { + Monocle.Events.listen(frame.contentWindow, 'scroll', function () { + frame.contentWindow.scrollTo(0,0); + }); + } + + // Announce that the component has changed. + var doc = frame.contentDocument; + var evtData = { 'page': pageDiv, 'document': doc, 'component': API }; + pageDiv.m.reader.dispatchEvent('monocle:componentchange', evtData); + + callback(); + }); + } + + + // Checks whether the pageDiv dimensions have changed. If they have, + // remeasures dimensions and returns true. Otherwise returns false. + // + function updateDimensions(pageDiv, callback) { + pageDiv.m.dimensions.update(function (pageLength) { + p.pageLength = pageLength; + if (typeof callback == "function") { callback() }; + }); + } + + + // Iterates over all the chapters that are within this component + // (according to the array we were provided on initialization) and finds + // their location (in percentage terms) within the text. + // + // Stores this percentage with the chapter object in the chapters array. + // + function locateChapters(pageDiv) { + if (p.chapters[0] && typeof p.chapters[0].percent == "number") { + return; + } + var doc = pageDiv.m.activeFrame.contentDocument; + for (var i = 0; i < p.chapters.length; ++i) { + var chp = p.chapters[i]; + chp.percent = 0; + if (chp.fragment) { + var node = doc.getElementById(chp.fragment); + chp.percent = pageDiv.m.dimensions.percentageThroughOfNode(node); + } + } + return p.chapters; + } + + + // For a given page number within the component, return the chapter that + // starts on or most-recently-before this page. + // + // Useful, for example, in displaying the current chapter title as a + // running head on the page. + // + function chapterForPage(pageN) { + var cand = null; + var percent = (pageN - 1) / p.pageLength; + for (var i = 0; i < p.chapters.length; ++i) { + if (percent >= p.chapters[i].percent) { + cand = p.chapters[i]; + } else { + return cand; + } + } + return cand; + } + + + // For a given chapter fragment (the bit after the hash + // in eg, "index.html#foo"), return the page number on which + // the chapter starts. If the fragment is null or blank, will + // return the first page of the component. + // + function pageForChapter(fragment, pageDiv) { + if (!fragment) { + return 1; + } + for (var i = 0; i < p.chapters.length; ++i) { + if (p.chapters[i].fragment == fragment) { + return percentToPageNumber(p.chapters[i].percent); + } + } + var doc = pageDiv.m.activeFrame.contentDocument; + var node = doc.getElementById(fragment); + var percent = pageDiv.m.dimensions.percentageThroughOfNode(node); + return percentToPageNumber(percent); + } + + + function pageForXPath(xpath, pageDiv) { + var doc = pageDiv.m.activeFrame.contentDocument; + var percent = 0; + if (Monocle.Browser.env.supportsXPath) { + var node = doc.evaluate(xpath, doc, null, 9, null).singleNodeValue; + if (node) { + percent = pageDiv.m.dimensions.percentageThroughOfNode(node); + } + } else { + console.warn("XPath not supported in this client."); + } + return percentToPageNumber(percent); + } + + + function pageForSelector(selector, pageDiv) { + var doc = pageDiv.m.activeFrame.contentDocument; + var percent = 0; + if (Monocle.Browser.env.supportsQuerySelector) { + var node = doc.querySelector(selector); + if (node) { + percent = pageDiv.m.dimensions.percentageThroughOfNode(node); + } + } else { + console.warn("querySelector not supported in this client."); + } + return percentToPageNumber(percent); + } + + + function percentToPageNumber(pc) { + return Math.floor(pc * p.pageLength) + 1; + } + + + // A public getter for p.pageLength. + // + function lastPageNumber() { + return p.pageLength; + } + + + function prepareSource(reader) { + if (p.sourcePrepared) { return; } + p.sourcePrepared = true; + + if (typeof p.source == "string") { + p.source = { html: p.source }; + } + + // If supplied as escaped javascript, unescape it to HTML by evalling it. + if (p.source.javascript) { + console.deprecation( + "Loading a component by 'javascript' is deprecated. " + + "Use { 'html': src } -- no need to escape or clean the string." + ); + var src = p.source.javascript; + src = src.replace(/\\n/g, "\n"); + src = src.replace(/\\r/g, "\r"); + src = src.replace(/\\'/g, "'"); + p.source = { html: src }; + } + + // If supplied as DOM nodes, convert to HTML by concatenating outerHTMLs. + if (p.source.nodes) { + var srcs = []; + for (var i = 0, ii = p.source.nodes.length; i < ii; ++i) { + var node = p.source.nodes[i]; + if (node.outerHTML) { + srcs.push(node.outerHTML); + } else { + var div = document.createElement('div'); + div.appendChild(node.cloneNode(true)); + srcs.push(div.innerHTML); + delete(div); + } + } + p.source = { html: srcs.join('') }; + } + + if (p.source.html && !p.source.html.match(new RegExp("", "im"))) { + var baseURI = computeBaseURI(reader); + if (baseURI) { + p.source.html = p.source.html.replace( + new RegExp("(]*>)", "im"), + '$1' + ); + } + } + + if (p.source.doc && !p.source.doc.querySelector('base')) { + var srcHead = p.source.doc.querySelector('head') || p.source.doc.body; + var baseURI = computeBaseURI(reader); + if (srcHead && baseURI) { + var srcBase = p.source.doc.createElement('base'); + srcBase.setAttribute('href', baseURI); + prependChild(srcHead, srcBase); + } + } + } + + + function computeBaseURI(reader) { + var evtData = { cmptId: p.id, cmptURI: absoluteURL(p.id) } + if (reader.dispatchEvent('monocle:component:baseuri', evtData, true)) { + return evtData.cmptURI; + } + } + + + function absoluteURL(url) { + var link = document.createElement('a'); + link.setAttribute('href', url); + result = link.href; + delete(link); + return result; + } + + + function prependChild(pr, el) { + pr.firstChild ? pr.insertBefore(el, pr.firstChild) : pr.appendChild(el); + } + + + API.applyTo = applyTo; + API.updateDimensions = updateDimensions; + API.chapterForPage = chapterForPage; + API.pageForChapter = pageForChapter; + API.pageForXPath = pageForXPath; + API.pageForSelector = pageForSelector; + API.lastPageNumber = lastPageNumber; + + return API; +} +; +Monocle.Selection = function (reader) { + var API = { constructor: Monocle.Selection }; + var k = API.constants = API.constructor; + var p = API.properties = { + reader: reader, + lastSelection: [] + }; + + + function initialize() { + if (k.SELECTION_POLLING_INTERVAL) { + setInterval(pollSelection, k.SELECTION_POLLING_INTERVAL); + } + } + + + function pollSelection() { + var index = 0, frame = null; + while (frame = reader.dom.find('component', index++)) { + if (frame.contentWindow) { + pollSelectionOnWindow(frame.contentWindow, index); + } + } + } + + + function pollSelectionOnWindow(win, index) { + var sel = win.getSelection(); + var lm = p.lastSelection[index] || {}; + var nm = p.lastSelection[index] = { + selected: anythingSelected(win), + range: sel.rangeCount ? sel.getRangeAt(0) : null, + string: sel.toString() + }; + if (nm.selected) { + nm.rangeStartContainer = nm.range.startContainer; + nm.rangeEndContainer = nm.range.endContainer; + nm.rangeStartOffset = nm.range.startOffset; + nm.rangeEndOffset = nm.range.endOffset; + if (!sameRange(nm, lm)) { + p.reader.dispatchEvent('monocle:selection', nm); + } + } else if (lm.selected) { + p.reader.dispatchEvent('monocle:deselection', lm); + } + } + + + function sameRange(m1, m2) { + return ( + m1.rangeStartContainer == m2.rangeStartContainer && + m1.rangeEndContainer == m2.rangeEndContainer && + m1.rangeStartOffset == m2.rangeStartOffset && + m1.rangeEndOffset == m2.rangeEndOffset + ); + } + + + // Given a window object, remove any user selections within. Trivial in + // most browsers, but involving major mojo on iOS. + // + function deselect() { + var index = 0, frame = null; + while (frame = reader.dom.find('component', index++)) { + deselectOnWindow(frame.contentWindow); + } + } + + + function deselectOnWindow(win) { + win = win || window; + if (!anythingSelected(win)) { return; } + + if (Monocle.Browser.iOSVersion && !Monocle.Browser.iOSVersionBelow(5)) { + preservingScale(function () { + preservingScrollPosition(function () { + var inp = document.createElement('input'); + inp.style.cssText = [ + 'position: absolute', + 'top: 0', + 'left: 0', + 'width: 0', + 'height: 0' + ].join(';'); + document.body.appendChild(inp); + inp.focus(); + document.body.removeChild(inp); + }) + }); + } + + var sel = win.getSelection(); + sel.removeAllRanges(); + win.document.body.scrollLeft = 0; + win.document.body.scrollTop = 0; + } + + + function preservingScrollPosition(fn) { + var sx = window.scrollX, sy = window.scrollY; + fn(); + window.scrollTo(sx, sy); + } + + + function preservingScale(fn) { + var head = document.querySelector('head'); + var ovp = head.querySelector('meta[name=viewport]'); + var createViewportMeta = function (content) { + var elem = document.createElement('meta'); + elem.setAttribute('name', 'viewport'); + elem.setAttribute('content', content); + head.appendChild(elem); + return elem; + } + + if (ovp) { + var ovpcontent = ovp.getAttribute('content'); + var re = /user-scalable\s*=\s*([^,$\s])*/; + var result = ovpcontent.match(re); + if (result && ['no', '0'].indexOf(result[1]) >= 0) { + fn(); + } else { + var nvpcontent = ovpcontent.replace(re, ''); + nvpcontent += nvpcontent ? ', ' : ''; + nvpcontent += 'user-scalable=no'; + head.removeChild(ovp); + var nvp = createViewportMeta(nvpcontent); + fn(); + head.removeChild(nvp); + head.appendChild(ovp); + } + } else { + var nvp = createViewportMeta('user-scalable=no'); + fn(); + nvp.setAttribute('content', 'user-scalable=yes'); + } + } + + + function anythingSelected(win) { + return !win.getSelection().isCollapsed; + } + + + API.deselect = deselect; + + + initialize(); + + return API; +} + + +Monocle.Selection.SELECTION_POLLING_INTERVAL = 250; +Monocle.Billboard = function (reader) { + var API = { constructor: Monocle.Billboard }; + var k = API.constants = API.constructor; + var p = API.properties = { + reader: reader, + cntr: null + }; + + + function show(urlOrElement, options) { + p.reader.dispatchEvent('monocle:modal:on'); + if (p.cntr) { return console.warn("Modal billboard already showing."); } + + var options = options || {}; + var elem = urlOrElement; + p.cntr = reader.dom.append('div', k.CLS.cntr); + if (typeof urlOrElement == 'string') { + var url = urlOrElement; + p.inner = elem = p.cntr.dom.append('iframe', k.CLS.inner); + elem.setAttribute('src', url); + } else { + p.inner = p.cntr.dom.append('div', k.CLS.inner); + p.inner.appendChild(elem); + } + p.dims = [ + elem.naturalWidth || elem.offsetWidth, + elem.naturalHeight || elem.offsetHeight + ]; + if (options.closeButton != false) { + var cBtn = p.cntr.dom.append('div', k.CLS.closeButton); + Monocle.Events.listenForTap(cBtn, hide); + } + align(options.align || 'left top'); + p.reader.listen('monocle:resize', align); + + shrink(options.from); + Monocle.defer(grow); + } + + + function hide(evt) { + shrink(); + Monocle.Events.afterTransition(p.cntr, remove); + } + + + function grow() { + Monocle.Styles.transitionFor(p.cntr, 'transform', k.ANIM_MS, 'ease-in-out'); + Monocle.Styles.affix(p.cntr, 'transform', 'translate(0, 0) scale(1)'); + } + + + function shrink(from) { + p.from = from || p.from || [0,0]; + var translate = 'translate('+p.from[0]+'px, '+p.from[1]+'px)'; + var scale = 'scale(0)'; + if (typeof p.from[2] === 'number') { + scale = 'scaleX('+(p.from[2] / p.cntr.offsetWidth)+') '; + scale += 'scaleY('+(p.from[3] / p.cntr.offsetHeight)+')'; + } + Monocle.Styles.affix(p.cntr, 'transform', translate+' '+scale); + } + + + function remove () { + p.cntr.parentNode.removeChild(p.cntr); + p.cntr = p.inner = null; + p.reader.deafen('monocle:resize', align); + p.reader.dispatchEvent('monocle:modal:off'); + } + + + function align(loc) { + p.alignment = (typeof loc == 'string') ? loc : p.alignment; + if (!p.alignment) { return; } + if (p.dims[0] > p.inner.offsetWidth || p.dims[1] > p.inner.offsetHeight) { + p.cntr.dom.addClass(k.CLS.oversized); + } else { + p.cntr.dom.removeClass(k.CLS.oversized); + } + + var s = p.alignment.split(/\s+/); + var l = 0, t = 0; + var w = (p.inner.scrollWidth - p.inner.offsetWidth); + var h = (p.inner.scrollHeight - p.inner.offsetHeight); + if (s[0].match(/^\d+$/)) { + l = Math.max(0, parseInt(s[0]) - (p.inner.offsetWidth / 2)); + } else if (s[0] == 'center') { + l = w / 2; + } else if (s[0] == 'right') { + l = w; + } + if (s[1] && s[1].match(/^\d+$/)) { + t = Math.max(0, parseInt(s[1]) - (p.inner.offsetHeight / 2)); + } else if (!s[1] || s[1] == 'center') { + t = h / 2; + } else if (s[1] == 'bottom') { + t = h; + } + p.inner.scrollLeft = l; + p.inner.scrollTop = t; + } + + + API.show = show; + API.hide = hide; + API.align= align; + + return API; +} + + +Monocle.Billboard.CLS = { + cntr: 'billboard_container', + inner: 'billboard_inner', + closeButton: 'billboard_close', + oversized: 'billboard_oversized' +} + +Monocle.Billboard.ANIM_MS = 400; +// A panel is an invisible column of interactivity. When contact occurs +// (mousedown, touchstart), the panel expands to the full width of its +// container, to catch all interaction events and prevent them from hitting +// other things. +// +// Panels are used primarily to provide hit zones for page flipping +// interactions, but you can do whatever you like with them. +// +// After instantiating a panel and adding it to the reader as a control, +// you can call listenTo() with a hash of methods for any of 'start', 'move' +// 'end' and 'cancel'. +// +Monocle.Controls.Panel = function () { + + var API = { constructor: Monocle.Controls.Panel } + var k = API.constants = API.constructor; + var p = API.properties = { + evtCallbacks: {} + } + + function createControlElements(cntr) { + p.div = cntr.dom.make('div', k.CLS.panel); + p.div.dom.setStyles(k.DEFAULT_STYLES); + Monocle.Events.listenForContact( + p.div, + { + 'start': start, + 'move': move, + 'end': end, + 'cancel': cancel + }, + { useCapture: false } + ); + return p.div; + } + + + function setDirection(dir) { + p.direction = dir; + } + + + function listenTo(evtCallbacks) { + p.evtCallbacks = evtCallbacks; + } + + + function deafen() { + p.evtCallbacks = {} + } + + + function start(evt) { + p.contact = true; + evt.m.offsetX += p.div.offsetLeft; + evt.m.offsetY += p.div.offsetTop; + expand(); + invoke('start', evt); + } + + + function move(evt) { + if (!p.contact) { + return; + } + invoke('move', evt); + } + + + function end(evt) { + if (!p.contact) { + return; + } + Monocle.Events.deafenForContact(p.div, p.listeners); + contract(); + p.contact = false; + invoke('end', evt); + } + + + function cancel(evt) { + if (!p.contact) { + return; + } + Monocle.Events.deafenForContact(p.div, p.listeners); + contract(); + p.contact = false; + invoke('cancel', evt); + } + + + function invoke(evtType, evt) { + if (p.evtCallbacks[evtType]) { + p.evtCallbacks[evtType](p.direction, evt.m.offsetX, evt.m.offsetY, API); + } + evt.preventDefault(); + } + + + function expand() { + if (p.expanded) { + return; + } + p.div.dom.addClass(k.CLS.expanded); + p.expanded = true; + } + + + function contract(evt) { + if (!p.expanded) { + return; + } + p.div.dom.removeClass(k.CLS.expanded); + p.expanded = false; + } + + + API.createControlElements = createControlElements; + API.listenTo = listenTo; + API.deafen = deafen; + API.expand = expand; + API.contract = contract; + API.setDirection = setDirection; + + return API; +} + + +Monocle.Controls.Panel.CLS = { + panel: 'panel', + expanded: 'controls_panel_expanded' +} +Monocle.Controls.Panel.DEFAULT_STYLES = { + position: 'absolute', + height: '100%' +} +; +// The simplest page-flipping interaction system: contact to the left half of +// the reader turns back one page, contact to the right half turns forward +// one page. +// +Monocle.Panels.TwoPane = function (flipper, evtCallbacks) { + + var API = { constructor: Monocle.Panels.TwoPane } + var k = API.constants = API.constructor; + var p = API.properties = {} + + + function initialize() { + p.panels = { + forwards: new Monocle.Controls.Panel(), + backwards: new Monocle.Controls.Panel() + } + + for (dir in p.panels) { + flipper.properties.reader.addControl(p.panels[dir]); + p.panels[dir].listenTo(evtCallbacks); + p.panels[dir].setDirection(flipper.constants[dir.toUpperCase()]); + var style = { "width": k.WIDTH }; + style[(dir == "forwards" ? "right" : "left")] = 0; + p.panels[dir].properties.div.dom.setStyles(style); + } + } + + + initialize(); + + return API; +} + +Monocle.Panels.TwoPane.WIDTH = "50%"; +// A three-pane system of page interaction. The left 33% turns backwards, the +// right 33% turns forwards, and contact on the middle third causes the +// system to go into "interactive mode". In this mode, the page-flipping panels +// are only active in the margins, and all of the actual text content of the +// book is selectable. The user can exit "interactive mode" by hitting the little +// IMode icon in the lower right corner of the reader. +// +Monocle.Panels.IMode = function (flipper, evtCallbacks) { + + var API = { constructor: Monocle.Panels.IMode } + var k = API.constants = API.constructor; + var p = API.properties = {} + + + function initialize() { + p.flipper = flipper; + p.reader = flipper.properties.reader; + p.panels = { + forwards: new Monocle.Controls.Panel(), + backwards: new Monocle.Controls.Panel() + } + p.divs = {} + + for (dir in p.panels) { + p.reader.addControl(p.panels[dir]); + p.divs[dir] = p.panels[dir].properties.div; + p.panels[dir].listenTo(evtCallbacks); + p.panels[dir].setDirection(flipper.constants[dir.toUpperCase()]); + p.divs[dir].style.width = "33%"; + p.divs[dir].style[dir == "forwards" ? "right" : "left"] = 0; + } + + p.panels.central = new Monocle.Controls.Panel(); + p.reader.addControl(p.panels.central); + p.divs.central = p.panels.central.properties.div; + p.divs.central.dom.setStyles({ left: "33%", width: "34%" }); + menuCallbacks({ end: modeOn }); + + for (dir in p.panels) { + p.divs[dir].dom.addClass('panels_imode_panel'); + p.divs[dir].dom.addClass('panels_imode_'+dir+'Panel'); + } + + p.toggleIcon = { + createControlElements: function (cntr) { + var div = cntr.dom.make('div', 'panels_imode_toggleIcon'); + Monocle.Events.listenForTap(div, modeOff); + return div; + } + } + p.reader.addControl(p.toggleIcon, null, { hidden: true }); + } + + + function menuCallbacks(callbacks) { + p.menuCallbacks = callbacks; + p.panels.central.listenTo(p.menuCallbacks); + } + + + function toggle() { + p.interactive ? modeOff() : modeOn(); + } + + + function modeOn() { + if (p.interactive) { + return; + } + + p.panels.central.contract(); + + var page = p.reader.visiblePages()[0]; + var sheaf = page.m.sheafDiv; + var bw = sheaf.offsetLeft; + var fw = page.offsetWidth - (sheaf.offsetLeft + sheaf.offsetWidth); + bw = Math.floor(((bw - 2) / page.offsetWidth) * 10000 / 100 ) + "%"; + fw = Math.floor(((fw - 2) / page.offsetWidth) * 10000 / 100 ) + "%"; + + startCameo(function () { + p.divs.forwards.style.width = fw; + p.divs.backwards.style.width = bw; + Monocle.Styles.affix(p.divs.central, 'transform', 'translateY(-100%)'); + }); + + p.reader.showControl(p.toggleIcon); + + p.interactive = true; + } + + + function modeOff() { + if (!p.interactive) { + return; + } + + p.panels.central.contract(); + + p.reader.selection.deselect(); + + startCameo(function () { + p.divs.forwards.style.width = "33%"; + p.divs.backwards.style.width = "33%"; + Monocle.Styles.affix(p.divs.central, 'transform', 'translateY(0)'); + }); + + p.reader.hideControl(p.toggleIcon); + + p.interactive = false; + } + + + function startCameo(fn) { + // Set transitions on the panels. + var trn = Monocle.Panels.IMode.CAMEO_DURATION+"ms ease-in"; + Monocle.Styles.affix(p.divs.forwards, 'transition', "width "+trn); + Monocle.Styles.affix(p.divs.backwards, 'transition', "width "+trn); + Monocle.Styles.affix(p.divs.central, 'transition', "-webkit-transform "+trn); + + // Temporarily disable listeners. + for (var pan in p.panels) { + p.panels[pan].deafen(); + } + + // Set the panels to opaque. + for (var div in p.divs) { + p.divs[div].style.opacity = 1; + } + + if (typeof WebkitTransitionEvent != "undefined") { + p.cameoListener = Monocle.Events.listen( + p.divs.central, + 'webkitTransitionEnd', + endCameo + ); + } else { + setTimeout(endCameo, k.CAMEO_DURATION); + } + fn(); + } + + + function endCameo() { + setTimeout(function () { + // Remove panel transitions. + var trn = "opacity linear " + Monocle.Panels.IMode.LINGER_DURATION + "ms"; + Monocle.Styles.affix(p.divs.forwards, 'transition', trn); + Monocle.Styles.affix(p.divs.backwards, 'transition', trn); + Monocle.Styles.affix(p.divs.central, 'transition', trn); + + // Set the panels to transparent. + for (var div in p.divs) { + p.divs[div].style.opacity = 0; + } + + // Re-enable listeners. + p.panels.forwards.listenTo(evtCallbacks); + p.panels.backwards.listenTo(evtCallbacks); + p.panels.central.listenTo(p.menuCallbacks); + }, Monocle.Panels.IMode.LINGER_DURATION); + + + if (p.cameoListener) { + Monocle.Events.deafen(p.divs.central, 'webkitTransitionEnd', endCameo); + } + } + + + API.toggle = toggle; + API.modeOn = modeOn; + API.modeOff = modeOff; + API.menuCallbacks = menuCallbacks; + + initialize(); + + return API; +} + +Monocle.Panels.IMode.CAMEO_DURATION = 250; +Monocle.Panels.IMode.LINGER_DURATION = 250; +Monocle.Panels.eInk = function (flipper, evtCallbacks) { + + var API = { constructor: Monocle.Panels.eInk } + var k = API.constants = API.constructor; + var p = API.properties = { + flipper: flipper + } + + + function initialize() { + p.panel = new Monocle.Controls.Panel(); + p.reader = p.flipper.properties.reader; + p.reader.addControl(p.panel); + + p.panel.listenTo({ end: function (panel, x) { + if (x < p.panel.properties.div.offsetWidth / 2) { + p.panel.setDirection(flipper.constants.BACKWARDS); + } else { + p.panel.setDirection(flipper.constants.FORWARDS); + } + evtCallbacks.end(panel, x); + } }); + + var s = p.panel.properties.div.style; + p.reader.listen("monocle:componentchanging", function () { + s.opacity = 1; + Monocle.defer(function () { s.opacity = 0 }, 40); + }); + s.width = "100%"; + s.background = "#000"; + s.opacity = 0; + + if (k.LISTEN_FOR_KEYS) { + Monocle.Events.listen(window.top.document, 'keyup', handleKeyEvent); + } + } + + + function handleKeyEvent(evt) { + var eventCharCode = evt.charCode || evt.keyCode; + var dir = null; + if (eventCharCode == k.KEYS["PAGEUP"]) { + dir = flipper.constants.BACKWARDS; + } else if (eventCharCode == k.KEYS["PAGEDOWN"]) { + dir = flipper.constants.FORWARDS; + } + if (dir) { + flipper.moveTo({ direction: dir }); + evt.preventDefault(); + } + } + + + initialize(); + + return API; +} + + +Monocle.Panels.eInk.LISTEN_FOR_KEYS = true; +Monocle.Panels.eInk.KEYS = { "PAGEUP": 33, "PAGEDOWN": 34 }; +// Provides page-flipping panels only in the margins of the book. This is not +// entirely suited to small screens with razor-thin margins, but is an +// appropriate panel class for larger screens (like, say, an iPad). +// +// Since the flipper hit zones are only in the margins, the actual text content +// of the book is always selectable. +// +Monocle.Panels.Marginal = function (flipper, evtCallbacks) { + + var API = { constructor: Monocle.Panels.Marginal } + var k = API.constants = API.constructor; + var p = API.properties = {} + + + function initialize() { + p.panels = { + forwards: new Monocle.Controls.Panel(), + backwards: new Monocle.Controls.Panel() + } + + for (dir in p.panels) { + flipper.properties.reader.addControl(p.panels[dir]); + p.panels[dir].listenTo(evtCallbacks); + p.panels[dir].setDirection(flipper.constants[dir.toUpperCase()]); + with (p.panels[dir].properties.div.style) { + dir == "forwards" ? right = 0 : left = 0; + } + } + setWidths(); + } + + + function setWidths() { + var page = flipper.properties.reader.dom.find('page'); + var sheaf = page.m.sheafDiv; + var bw = sheaf.offsetLeft; + var fw = page.offsetWidth - (sheaf.offsetLeft + sheaf.offsetWidth); + bw = Math.floor(((bw - 2) / page.offsetWidth) * 10000 / 100) + "%"; + fw = Math.floor(((fw - 2) / page.offsetWidth) * 10000 / 100) + "%"; + p.panels.forwards.properties.div.style.width = fw; + p.panels.backwards.properties.div.style.width = bw; + } + + + API.setWidths = setWidths; + + initialize(); + + return API; +} +; +Monocle.Panels.Magic = function (flipper, evtCallbacks) { + + var API = { constructor: Monocle.Panels.Magic } + var k = API.constants = API.constructor; + var p = API.properties = { + flipper: flipper, + evtCallbacks: evtCallbacks, + parts: {}, + action: {}, + contacts: [], + startListeners: [], + disabled: false + } + + + function initialize() { + p.reader = flipper.properties.reader; + p.parts = { + reader: p.reader.dom.find('box'), + cmpts: [] + } + for (var i = 0; i < p.flipper.pageCount; ++i) { + p.parts.cmpts.push(p.reader.dom.find('component', i)); + } + initListeners(); + + p.reader.listen('monocle:componentmodify', initListeners); + p.reader.listen('monocle:magic:init', initListeners); + p.reader.listen('monocle:magic:halt', haltListeners); + p.reader.listen('monocle:modal:on', disable); + p.reader.listen('monocle:modal:off', enable); + Monocle.Events.listen(window, 'gala:contact:cancel', resetAction); + } + + + function initListeners(evt) { + //console.log('magic:init'); + stopListening(); + startListening(); + } + + + function haltListeners(evt) { + //console.log('magic:halt'); + stopListening(); + } + + + function disable(evt) { + //console.log('modal:on - halting magic'); + stopListening(); + p.disabled = true; + } + + + function enable(evt) { + //console.log('modal:off - initing magic'); + p.disabled = false; + startListening(); + } + + + function startListening() { + if (p.disabled || p.startListeners.length) { return; } + + p.startListeners.push([ + p.parts.reader, + Monocle.Events.listenForContact( + p.parts.reader, + { 'start': translatorFunction(p.parts.reader, readerContactStart) } + ) + ]); + + for (var i = 0, ii = p.parts.cmpts.length; i < ii; ++i) { + p.startListeners.push([ + p.parts.cmpts[i].contentDocument.defaultView, + Monocle.Events.listenForContact( + p.parts.cmpts[i].contentDocument.defaultView, + { 'start': translatorFunction(p.parts.cmpts[i], cmptContactStart) } + ) + ]); + } + } + + + function stopListening() { + if (p.disabled || !p.startListeners.length) { return; } + for (var j = 0, jj = p.startListeners.length; j < jj; ++j) { + Monocle.Events.deafenForContact( + p.startListeners[j][0], + p.startListeners[j][1] + ); + } + p.startListeners = []; + } + + + function listenForMoveAndEnd(fnMove, fnEnd) { + listenOnElem( + document.defaultView, + translatorFunction(document.documentElement, fnMove), + translatorFunction(document.documentElement, fnEnd) + ); + for (var i = 0, ii = p.parts.cmpts.length; i < ii; ++i) { + listenOnElem( + p.parts.cmpts[i].contentDocument.defaultView, + translatorFunction(p.parts.cmpts[i], fnMove), + translatorFunction(p.parts.cmpts[i], fnEnd) + ); + } + } + + + function listenOnElem(elem, fnMove, fnEnd) { + var contactListeners = Monocle.Events.listenForContact( + elem, + { + 'move': fnMove, + 'end': function (evt) { deafenContactListeners(); fnEnd(evt); } + } + ); + p.contacts.push([elem, contactListeners]); + } + + + function deafenContactListeners() { + for (var i = 0, ii = p.contacts.length; i < ii; ++i) { + Monocle.Events.deafenForContact(p.contacts[i][0], p.contacts[i][1]); + } + p.contacts = []; + } + + + function readerContactStart(evt) { + listenForMoveAndEnd(readerContactMove, readerContactEnd); + p.action.startX = evt.m.readerX; + p.action.startY = evt.m.readerY; + p.action.screenX = evt.m.screenX; + p.action.screenY = evt.m.screenY; + p.action.dir = evt.m.readerX > halfway() ? k.FORWARDS : k.BACKWARDS; + p.action.handled = !dispatch('monocle:magic:contact:start', evt); + if (!p.action.handled) { invoke('start', evt); } + } + + + function readerContactMove(evt) { + if (p.action.handled) { + dispatch('monocle:magic:contact:move', evt); + } else { + invoke('move', evt); + } + // Can't prevent mousemove, so has no effect there. Preventing default + // for touchmove will override scrolling, while still allowing selection. + evt.preventDefault(); + } + + + function readerContactEnd(evt) { + p.action.endX = evt.m.readerX; + p.action.endY = evt.m.readerY; + if (dispatch('monocle:magic:contact', evt)) { invoke('end', evt); } + p.action = {}; + } + + + function cmptContactStart(evt) { + if (actionIsCancelled(evt)) { return resetAction(); } + p.action.startX = evt.m.readerX; + p.action.startY = evt.m.readerY; + p.action.screenX = evt.m.screenX; + p.action.screenY = evt.m.screenY; + listenForMoveAndEnd(cmptContactMove, cmptContactEnd); + } + + + function cmptContactMove(evt) { + if (actionIsEmpty()) { return; } + if (actionIsCancelled(evt)) { return resetAction(); } + + // Can't prevent mousemove, so has no effect there. Preventing default + // for touchmove will override scrolling, while still allowing selection. + evt.preventDefault(); + } + + + function cmptContactEnd(evt) { + if (actionIsEmpty()) { return; } + if (actionIsCancelled(evt)) { return resetAction(); } + p.action.endX = evt.m.readerX; + p.action.endY = evt.m.readerY; + if (Math.abs(p.action.endX - p.action.startX) < k.LEEWAY) { + p.action.dir = p.action.startX > halfway() ? k.FORWARDS : k.BACKWARDS; + } else { + p.action.dir = p.action.startX > p.action.endX ? k.FORWARDS : k.BACKWARDS; + } + + if (dispatch('monocle:magic:contact', evt)) { + invoke('start', evt); + invoke('end', evt); + } + p.action = {}; + } + + + // Adds two new properties to evt.m: + // - readerX + // - readerY + // + // Calculated as the offset of the click from the top left of reader element. + // + // Then calls the passed function. + // + function translatorFunction(registrant, callback) { + return function (evt) { + translatingReaderOffset(registrant, evt, callback); + } + } + + + function translatingReaderOffset(registrant, evt, callback) { + if (typeof p.action.screenX != 'undefined') { + evt.m.readerX = p.action.startX + (evt.m.screenX - p.action.screenX); + evt.m.readerY = p.action.startY + (evt.m.screenY - p.action.screenY); + } else { + var dr = document.documentElement.getBoundingClientRect(); + var rr = p.parts.reader.getBoundingClientRect(); + rr = { left: rr.left - dr.left, top: rr.top - dr.top } + + if (evt.view == window) { + evt.m.readerX = Math.round(evt.m.pageX - rr.left); + evt.m.readerY = Math.round(evt.m.pageY - rr.top); + } else { + var er = registrant.getBoundingClientRect(); + er = { left: er.left - dr.left, top: er.top - dr.top } + evt.m.readerX = Math.round((er.left - rr.left) + evt.m.clientX); + evt.m.readerY = Math.round((er.top - rr.top) + evt.m.clientY); + } + } + + callback(evt); + } + + + function halfway() { + return p.parts.reader.offsetWidth / 2; + } + + + function resetAction() { + p.action = {}; + deafenContactListeners(); + } + + + function actionIsCancelled(evt) { + var win = evt.target.ownerDocument.defaultView; + return (evt.defaultPrevented || !win.getSelection().isCollapsed); + } + + + function actionIsEmpty() { + return typeof p.action.startX == 'undefined'; + } + + + // Returns true if the event WAS NOT cancelled. + function dispatch(evtName, trigger) { + var rr = p.parts.reader.getBoundingClientRect(); + var evtData = { + trigger: trigger, + start: { x: p.action.startX, y: p.action.startY }, + end: { x: p.action.endX, y: p.action.endY }, + max: { x: rr.right - rr.left, y: rr.bottom - rr.top } + } + return p.reader.dispatchEvent(evtName, evtData, true); + } + + + function invoke(evtType, evt) { + if (p.evtCallbacks[evtType]) { + p.evtCallbacks[evtType](p.action.dir, evt.m.readerX, evt.m.readerY, API); + } + } + + + API.enable = enable; + API.disable = disable; + + initialize(); + + return API; +} + + +Monocle.Panels.Magic.LEEWAY = 3; +Monocle.Panels.Magic.FORWARDS = 1; +Monocle.Panels.Magic.BACKWARDS = -1; +Monocle.Dimensions.Columns = function (pageDiv) { + + var API = { constructor: Monocle.Dimensions.Columns } + var k = API.constants = API.constructor; + var p = API.properties = { + page: pageDiv, + reader: pageDiv.m.reader, + length: 0, + width: 0 + } + + // Logically, forceColumn browsers can't have a gap, because that would + // make the minWidth > 200%. But how much greater? Not worth the effort. + k.GAP = Monocle.Browser.env.forceColumns ? 0 : 20; + + function update(callback) { + setColumnWidth(); + Monocle.defer(function () { + p.length = columnCount(); + if (Monocle.DEBUG) { + console.log( + 'page['+p.page.m.pageIndex+'] -> '+p.length+ + ' ('+p.page.m.activeFrame.m.component.properties.id+')' + ); + } + callback(p.length); + }); + } + + + function setColumnWidth() { + var pdims = pageDimensions(); + var ce = columnedElement(); + + p.width = pdims.width; + + var rules = Monocle.Styles.rulesToString(k.STYLE["columned"]); + rules += Monocle.Browser.css.toCSSDeclaration('column-width', pdims.col+'px'); + rules += Monocle.Browser.css.toCSSDeclaration('column-gap', k.GAP+'px'); + rules += Monocle.Browser.css.toCSSDeclaration('column-fill', 'auto'); + rules += Monocle.Browser.css.toCSSDeclaration('transform', 'none'); + + if (Monocle.Browser.env.forceColumns && ce.scrollHeight > pdims.height) { + rules += Monocle.Styles.rulesToString(k.STYLE['column-force']); + if (Monocle.DEBUG) { + console.warn("Force columns ("+ce.scrollHeight+" > "+pdims.height+")"); + } + } + + if (ce.style.cssText != rules) { + // Update offset because we're translating to zero. + p.page.m.offset = 0; + + // IE10 hack. + if (Monocle.Browser.env.documentElementHasScrollbars) { + ce.ownerDocument.documentElement.style.overflow = 'hidden'; + } + + // Apply body style changes. + ce.style.cssText = rules; + + if (Monocle.Browser.env.scrollToApplyStyle) { + ce.scrollLeft = 0; + } + } + } + + + // Returns the element to which columns CSS should be applied. + // + function columnedElement() { + return p.page.m.activeFrame.contentDocument.body; + } + + + // Returns the width of the offsettable area of the columned element. By + // definition, the number of pages is always this divided by the + // width of a single page (eg, the client area of the columned element). + // + function columnedWidth() { + var bd = columnedElement(); + var de = p.page.m.activeFrame.contentDocument.documentElement; + + var w = Math.max(bd.scrollWidth, de.scrollWidth); + + // Add one because the final column doesn't have right gutter. + // w += k.GAP; + + if (!Monocle.Browser.env.widthsIgnoreTranslate && p.page.m.offset) { + w += p.page.m.offset; + } + return w; + } + + + function pageDimensions() { + var elem = p.page.m.sheafDiv; + var w = elem.clientWidth; + if (elem.getBoundingClientRect) { w = elem.getBoundingClientRect().width; } + if (Monocle.Browser.env.roundPageDimensions) { w = Math.round(w); } + return { col: w, width: w + k.GAP, height: elem.clientHeight } + } + + + function columnCount() { + return Math.ceil(columnedWidth() / pageDimensions().width) + } + + + function locusToOffset(locus) { + return pageDimensions().width * (locus.page - 1); + } + + + // Moves the columned element to the offset implied by the locus. + // + // The 'transition' argument is optional, allowing the translation to be + // animated. If not given, no change is made to the columned element's + // transition property. + // + function translateToLocus(locus, transition) { + var offset = locusToOffset(locus); + p.page.m.offset = offset; + translateToOffset(offset, transition); + return offset; + } + + + function translateToOffset(offset, transition) { + var ce = columnedElement(); + if (transition) { + Monocle.Styles.affix(ce, "transition", transition); + } + // NB: can't use setX as it causes a flicker on iOS. + Monocle.Styles.affix(ce, "transform", "translateX(-"+offset+"px)"); + } + + + function percentageThroughOfNode(target) { + if (!target) { return 0; } + var doc = p.page.m.activeFrame.contentDocument; + var offset = 0; + if (Monocle.Browser.env.findNodesByScrolling) { + // First, remove translation... + translateToOffset(0); + + // Store scroll offsets for all windows. + var win = s = p.page.m.activeFrame.contentWindow; + var scrollers = [ + [win, win.scrollX, win.scrollY], + [window, window.scrollX, window.scrollY] + ]; + //while (s != s.parent) { scrollers.push([s, s.scrollX]); s = s.parent; } + + if (Monocle.Browser.env.sheafIsScroller) { + var scroller = p.page.m.sheafDiv; + var x = scroller.scrollLeft; + target.scrollIntoView(); + offset = scroller.scrollLeft; + } else { + var scroller = win; + var x = scroller.scrollX; + target.scrollIntoView(); + offset = scroller.scrollX; + } + + // Restore scroll offsets for all windows. + while (s = scrollers.shift()) { + s[0].scrollTo(s[1], s[2]); + } + + // ... finally, replace translation. + translateToOffset(p.page.m.offset); + } else { + offset = target.getBoundingClientRect().left; + offset -= doc.body.getBoundingClientRect().left; + } + + // We know at least 1px will be visible, and offset should not be 0. + offset += 1; + + // Percent is the offset divided by the total width of the component. + var percent = offset / (p.length * p.width); + + // Page number would be offset divided by the width of a single page. + // var pageNum = Math.ceil(offset / pageDimensions().width); + + return percent; + } + + + API.update = update; + API.percentageThroughOfNode = percentageThroughOfNode; + + API.locusToOffset = locusToOffset; + API.translateToLocus = translateToLocus; + + return API; +} + + +Monocle.Dimensions.Columns.STYLE = { + // Most of these are already applied to body, but they're repeated here + // in case columnedElement() is ever anything other than body. + "columned": { + "margin": "0", + "padding": "0", + "height": "100%", + "width": "100%", + "position": "absolute" + }, + "column-force": { + "min-width": "200%", + "overflow": "hidden" + } +} +; +Monocle.Flippers.Slider = function (reader) { + + var API = { constructor: Monocle.Flippers.Slider } + var k = API.constants = API.constructor; + var p = API.properties = { + reader: reader, + pageCount: 2, + activeIndex: 1, + turnData: {}, + nextPageReady: true + } + + + function initialize() { + p.reader.listen("monocle:componentchanging", showWaitControl); + } + + + function addPage(pageDiv) { + pageDiv.m.dimensions = new Monocle.Dimensions.Columns(pageDiv); + + // BROWSERHACK: Firefox 4 is prone to beachballing on the first page turn + // unless a zeroed translateX has been applied to the page div. + Monocle.Styles.setX(pageDiv, 0); + } + + + function visiblePages() { + return [upperPage()]; + } + + + function listenForInteraction(panelClass) { + if (typeof panelClass != "function") { + panelClass = k.DEFAULT_PANELS_CLASS; + if (!panelClass) { + console.warn("Invalid panel class.") + } + } + p.panels = new panelClass( + API, + { + 'start': lift, + 'move': turning, + 'end': release, + 'cancel': release + } + ); + } + + + function getPlace(pageDiv) { + pageDiv = pageDiv || upperPage(); + return pageDiv.m ? pageDiv.m.place : null; + } + + + function moveTo(locus, callback) { + var cb = function () { + if (typeof callback == "function") { callback(); } + announceTurn(); + } + setPage(upperPage(), locus, function () { prepareNextPage(cb) }); + } + + + function setPage(pageDiv, locus, onLoad, onFail) { + p.reader.getBook().setOrLoadPageAt( + pageDiv, + locus, + function (locus) { + pageDiv.m.dimensions.translateToLocus(locus); + Monocle.defer(onLoad); + }, + onFail + ); + } + + + function upperPage() { + return p.reader.dom.find('page', p.activeIndex); + } + + + function lowerPage() { + return p.reader.dom.find('page', (p.activeIndex + 1) % 2); + } + + + function flipPages() { + upperPage().style.zIndex = 1; + lowerPage().style.zIndex = 2; + return p.activeIndex = (p.activeIndex + 1) % 2; + } + + + function lift(dir, boxPointX) { + if (p.turnData.lifting || p.turnData.releasing) { return; } + + p.reader.selection.deselect(); + + p.turnData.points = { + start: boxPointX, + min: boxPointX, + max: boxPointX + } + p.turnData.lifting = true; + + var place = getPlace(); + + if (dir == k.FORWARDS) { + if (place.onLastPageOfBook()) { + p.reader.dispatchEvent( + 'monocle:boundaryend', + { + locus: getPlace().getLocus({ direction : dir }), + page: upperPage() + } + ); + resetTurnData(); + return; + } + onGoingForward(boxPointX); + } else if (dir == k.BACKWARDS) { + if (place.onFirstPageOfBook()) { + p.reader.dispatchEvent( + 'monocle:boundarystart', + { + locus: getPlace().getLocus({ direction : dir }), + page: upperPage() + } + ); + resetTurnData(); + return; + } + onGoingBackward(boxPointX); + } else { + console.warn("Invalid direction: " + dir); + } + } + + + function turning(dir, boxPointX) { + if (!p.turnData.points) { return; } + if (p.turnData.lifting || p.turnData.releasing) { return; } + checkPoint(boxPointX); + slideToCursor(boxPointX, null, "0"); + } + + + function release(dir, boxPointX) { + if (!p.turnData.points) { + return; + } + if (p.turnData.lifting) { + p.turnData.releaseArgs = [dir, boxPointX]; + return; + } + if (p.turnData.releasing) { + return; + } + + checkPoint(boxPointX); + + p.turnData.releasing = true; + + if (dir == k.FORWARDS) { + if ( + p.turnData.points.tap || + p.turnData.points.start - boxPointX > 60 || + p.turnData.points.min >= boxPointX + ) { + // Completing forward turn + slideOut(afterGoingForward); + } else { + // Cancelling forward turn + slideIn(afterCancellingForward); + } + } else if (dir == k.BACKWARDS) { + if ( + p.turnData.points.tap || + boxPointX - p.turnData.points.start > 60 || + p.turnData.points.max <= boxPointX + ) { + // Completing backward turn + slideIn(afterGoingBackward); + } else { + // Cancelling backward turn + slideOut(afterCancellingBackward); + } + } else { + console.warn("Invalid direction: " + dir); + } + } + + + function checkPoint(boxPointX) { + p.turnData.points.min = Math.min(p.turnData.points.min, boxPointX); + p.turnData.points.max = Math.max(p.turnData.points.max, boxPointX); + p.turnData.points.tap = p.turnData.points.max - p.turnData.points.min < 10; + } + + + function onGoingForward(x) { + if (p.nextPageReady == false) { + prepareNextPage(function () { lifted(x); }, resetTurnData); + } else { + lifted(x); + } + } + + + function onGoingBackward(x) { + var lp = lowerPage(), up = upperPage(); + var onFail = function () { slideOut(afterCancellingBackward); } + + if (Monocle.Browser.env.offscreenRenderingClipped) { + // set lower to "the page before upper" + setPage( + lp, + getPlace(up).getLocus({ direction: k.BACKWARDS }), + function () { + // flip lower to upper, ready to slide in from left + flipPages(); + // move lower off the screen to the left + jumpOut(lp, function () { lifted(x); }); + }, + onFail + ); + } else { + jumpOut(lp, function () { + flipPages(); + setPage( + lp, + getPlace(up).getLocus({ direction: k.BACKWARDS }), + function () { lifted(x); }, + onFail + ); + }); + } + } + + + function afterGoingForward() { + var up = upperPage(), lp = lowerPage(); + flipPages(); + jumpIn(up, function () { prepareNextPage(announceTurn); }); + } + + + function afterGoingBackward() { + announceTurn(); + } + + + function afterCancellingForward() { + announceCancel(); + } + + + function afterCancellingBackward() { + flipPages(); // flip upper to lower + jumpIn(lowerPage(), function () { prepareNextPage(announceCancel); }); + } + + + // Prepares the lower page to show the next page after the current page, + // and calls onLoad when done. + // + // Note that if the next page is a new component, and it fails to load, + // onFail will be called. If onFail is not supplied, onLoad will be called. + // + function prepareNextPage(onLoad, onFail) { + setPage( + lowerPage(), + getPlace().getLocus({ direction: k.FORWARDS }), + onLoad, + function () { + onFail ? onFail() : onLoad(); + p.nextPageReady = false; + } + ); + } + + + function lifted(x) { + p.turnData.lifting = false; + p.reader.dispatchEvent('monocle:turning'); + var releaseArgs = p.turnData.releaseArgs; + if (releaseArgs) { + p.turnData.releaseArgs = null; + release(releaseArgs[0], releaseArgs[1]); + } else if (x) { + slideToCursor(x); + } + } + + + function announceTurn() { + p.nextPageReady = true; + p.reader.dispatchEvent('monocle:turn'); + resetTurnData(); + } + + + function announceCancel() { + p.reader.dispatchEvent('monocle:turn:cancel'); + resetTurnData(); + } + + + function resetTurnData() { + hideWaitControl(); + p.turnData = {}; + } + + + function setX(elem, x, options, callback) { + var duration, transition; + + if (!options.duration) { + duration = 0; + } else { + duration = parseInt(options.duration); + } + + if (Monocle.Browser.env.supportsTransition) { + Monocle.Styles.transitionFor( + elem, + 'transform', + duration, + options.timing, + options.delay + ); + + if (Monocle.Browser.env.supportsTransform3d) { + Monocle.Styles.affix(elem, 'transform', 'translate3d('+x+'px,0,0)'); + } else { + Monocle.Styles.affix(elem, 'transform', 'translateX('+x+'px)'); + } + + if (typeof callback == "function") { + if (duration && Monocle.Styles.getX(elem) != x) { + Monocle.Events.afterTransition(elem, callback); + } else { + Monocle.defer(callback); + } + } + } else { + // Old-school JS animation. + elem.currX = elem.currX || 0; + var completeTransition = function () { + elem.currX = x; + Monocle.Styles.setX(elem, x); + if (typeof callback == "function") { callback(); } + } + if (!duration) { + completeTransition(); + } else { + var stamp = (new Date()).getTime(); + var frameRate = 40; + var step = (x - elem.currX) * (frameRate / duration); + var stepFn = function () { + var destX = elem.currX + step; + var timeElapsed = ((new Date()).getTime() - stamp) >= duration; + var pastDest = (destX > x && elem.currX < x) || + (destX < x && elem.currX > x); + if (timeElapsed || pastDest) { + completeTransition(); + } else { + Monocle.Styles.setX(elem, destX); + elem.currX = destX; + setTimeout(stepFn, frameRate); + } + } + stepFn(); + } + } + } + + + function jumpIn(pageDiv, callback) { + opts = { duration: (Monocle.Browser.env.stickySlideOut ? 1 : 0) } + setX(pageDiv, 0, opts, callback); + } + + + function jumpOut(pageDiv, callback) { + setX(pageDiv, 0 - pageDiv.offsetWidth, { duration: 0 }, callback); + } + + + // NB: Slides are always done by the visible upper page. + + function slideIn(callback) { + setX(upperPage(), 0, slideOpts(), callback); + } + + + function slideOut(callback) { + setX(upperPage(), 0 - upperPage().offsetWidth, slideOpts(), callback); + } + + + function slideToCursor(cursorX, callback, duration) { + setX( + upperPage(), + Math.min(0, cursorX - upperPage().offsetWidth), + { duration: duration || k.FOLLOW_DURATION }, + callback + ); + } + + + function slideOpts() { + var opts = { timing: 'ease-in', duration: 320 } + var now = (new Date()).getTime(); + if (p.lastSlide && now - p.lastSlide < 1500) { opts.duration *= 0.5; } + p.lastSlide = now; + return opts; + } + + + function ensureWaitControl() { + if (p.waitControl) { return; } + p.waitControl = { + createControlElements: function (holder) { + return holder.dom.make('div', 'flippers_slider_wait'); + } + } + p.reader.addControl(p.waitControl, 'page'); + } + + + function showWaitControl() { + ensureWaitControl(); + p.reader.dom.find('flippers_slider_wait', 0).style.opacity = 1; + p.reader.dom.find('flippers_slider_wait', 1).style.opacity = 1; + } + + + function hideWaitControl() { + ensureWaitControl(); + p.reader.dom.find('flippers_slider_wait', 0).style.opacity = 0; + p.reader.dom.find('flippers_slider_wait', 1).style.opacity = 0; + } + + + // THIS IS THE CORE API THAT ALL FLIPPERS MUST PROVIDE. + API.pageCount = p.pageCount; + API.addPage = addPage; + API.getPlace = getPlace; + API.moveTo = moveTo; + API.listenForInteraction = listenForInteraction; + + // OPTIONAL API - WILL BE INVOKED (WHERE RELEVANT) IF PROVIDED. + API.visiblePages = visiblePages; + + initialize(); + + return API; +} + + +// Constants +Monocle.Flippers.Slider.DEFAULT_PANELS_CLASS = Monocle.Panels.TwoPane; +Monocle.Flippers.Slider.FORWARDS = 1; +Monocle.Flippers.Slider.BACKWARDS = -1; +Monocle.Flippers.Slider.FOLLOW_DURATION = 100; +Monocle.Flippers.Scroller = function (reader, setPageFn) { + + var API = { constructor: Monocle.Flippers.Scroller } + var k = API.constants = API.constructor; + var p = API.properties = { + pageCount: 1, + duration: 300 + } + + + function initialize() { + p.reader = reader; + p.setPageFn = setPageFn; + } + + + function addPage(pageDiv) { + pageDiv.m.dimensions = new Monocle.Dimensions.Columns(pageDiv); + } + + + function page() { + return p.reader.dom.find('page'); + } + + + function listenForInteraction(panelClass) { + if (typeof panelClass != "function") { + panelClass = k.DEFAULT_PANELS_CLASS; + } + p.panels = new panelClass( + API, + { + 'end': turn + } + ); + } + + + function turn(dir) { + if (p.turning) { return; } + p.reader.selection.deselect(); + moveTo({ page: getPlace().pageNumber() + dir}); + p.reader.dispatchEvent('monocle:turning'); + } + + + function getPlace() { + return page().m.place; + } + + + function moveTo(locus, callback) { + var fn = frameToLocus; + if (typeof callback == "function") { + fn = function (locus) { frameToLocus(locus); callback(locus); } + } + p.reader.getBook().setOrLoadPageAt(page(), locus, fn); + } + + + function frameToLocus(locus) { + if (locus.boundarystart || locus.boundaryend) { return; } + p.turning = true; + var dims = page().m.dimensions; + var fr = page().m.activeFrame; + var bdy = fr.contentDocument.body; + var anim = true; + if (p.activeComponent != fr.m.component) { + // No animation. + p.activeComponent = fr.m.component; + dims.translateToLocus(locus, "none"); + Monocle.defer(turned); + } else if (Monocle.Browser.env.supportsTransition) { + // Native animation. + dims.translateToLocus(locus, p.duration+"ms ease-in 0ms"); + Monocle.Events.afterTransition(bdy, turned); + } else { + // Old-school JS animation. + var x = dims.locusToOffset(locus); + var finalX = 0 - x; + var stamp = (new Date()).getTime(); + var frameRate = 40; + var currX = p.currX || 0; + var step = (finalX - currX) * (frameRate / p.duration); + var stepFn = function () { + var destX = currX + step; + if ( + (new Date()).getTime() - stamp > p.duration || + Math.abs(currX - finalX) <= Math.abs((currX + step) - finalX) + ) { + Monocle.Styles.setX(bdy, finalX); + turned(); + } else { + Monocle.Styles.setX(bdy, destX); + currX = destX; + setTimeout(stepFn, frameRate); + } + p.currX = destX; + } + stepFn(); + } + } + + + function turned() { + p.turning = false; + p.reader.dispatchEvent('monocle:turn'); + } + + + // THIS IS THE CORE API THAT ALL FLIPPERS MUST PROVIDE. + API.pageCount = p.pageCount; + API.addPage = addPage; + API.getPlace = getPlace; + API.moveTo = moveTo; + API.listenForInteraction = listenForInteraction; + + initialize(); + + return API; +} + +Monocle.Flippers.Scroller.speed = 200; // How long the animation takes +Monocle.Flippers.Scroller.rate = 20; // frame-rate of the animation +Monocle.Flippers.Scroller.FORWARDS = 1; +Monocle.Flippers.Scroller.BACKWARDS = -1; +Monocle.Flippers.Scroller.DEFAULT_PANELS_CLASS = Monocle.Panels.TwoPane; +Monocle.Flippers.Instant = function (reader) { + + var API = { constructor: Monocle.Flippers.Instant } + var k = API.constants = API.constructor; + var p = API.properties = { + pageCount: 1 + } + + + function initialize() { + p.reader = reader; + } + + + function addPage(pageDiv) { + pageDiv.m.dimensions = new Monocle.Dimensions.Columns(pageDiv); + } + + + function getPlace() { + return page().m.place; + } + + + function moveTo(locus, callback) { + var fn = frameToLocus; + if (typeof callback == "function") { + fn = function (locus) { frameToLocus(locus); callback(locus); } + } + p.reader.getBook().setOrLoadPageAt(page(), locus, fn); + } + + + function listenForInteraction(panelClass) { + if (typeof panelClass != "function") { + if (Monocle.Browser.on.Kindle3) { + panelClass = Monocle.Panels.eInk; + } + panelClass = panelClass || k.DEFAULT_PANELS_CLASS; + } + if (!panelClass) { throw("Panels not found."); } + p.panels = new panelClass(API, { 'end': turn }); + } + + + function page() { + return p.reader.dom.find('page'); + } + + + function turn(dir) { + p.reader.selection.deselect(); + moveTo({ page: getPlace().pageNumber() + dir}); + p.reader.dispatchEvent('monocle:turning'); + } + + + function frameToLocus(locus) { + page().m.dimensions.translateToLocus(locus); + Monocle.defer(function () { p.reader.dispatchEvent('monocle:turn'); }); + } + + + // THIS IS THE CORE API THAT ALL FLIPPERS MUST PROVIDE. + API.pageCount = p.pageCount; + API.addPage = addPage; + API.getPlace = getPlace; + API.moveTo = moveTo; + API.listenForInteraction = listenForInteraction; + + initialize(); + + return API; +} + +Monocle.Flippers.Instant.FORWARDS = 1; +Monocle.Flippers.Instant.BACKWARDS = -1; +Monocle.Flippers.Instant.DEFAULT_PANELS_CLASS = Monocle.Panels.TwoPane; + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/resources/monocle/scripts/monoctrl.js b/sources/resources/monocle/scripts/monoctrl.js new file mode 100644 index 0000000..5e71552 --- /dev/null +++ b/sources/resources/monocle/scripts/monoctrl.js @@ -0,0 +1,985 @@ +Monocle.Controls.Contents = function (reader) { + + var API = { constructor: Monocle.Controls.Contents } + var k = API.constants = API.constructor; + var p = API.properties = { + reader: reader + } + + + function createControlElements() { + var div = reader.dom.make('div', 'controls_contents_container'); + contentsForBook(div, reader.getBook()); + return div; + } + + + function contentsForBook(div, book) { + while (div.hasChildNodes()) { + div.removeChild(div.firstChild); + } + var list = div.dom.append('ol', 'controls_contents_list'); + + var contents = book.properties.contents; + for (var i = 0; i < contents.length; ++i) { + chapterBuilder(list, contents[i], 0); + } + } + + + function chapterBuilder(list, chp, padLvl) { + var index = list.childNodes.length; + var li = list.dom.append('li', 'controls_contents_chapter', index); + var span = li.dom.append( + 'span', + 'controls_contents_chapterTitle', + index, + { html: chp.title } + ); + span.style.paddingLeft = padLvl + "em"; + + var invoked = function () { + p.reader.skipToChapter(chp.src); + p.reader.hideControl(API); + } + + Monocle.Events.listenForTap(li, invoked, 'controls_contents_chapter_active'); + + if (chp.children) { + for (var i = 0; i < chp.children.length; ++i) { + chapterBuilder(list, chp.children[i], padLvl + 1); + } + } + } + + + API.createControlElements = createControlElements; + + return API; +} +; +Monocle.Controls.Magnifier = function (reader) { + + var API = { constructor: Monocle.Controls.Magnifier } + var k = API.constants = API.constructor; + var p = API.properties = { + buttons: [], + magnified: false + } + + + function initialize() { + p.reader = reader; + } + + + function createControlElements(holder) { + var btn = holder.dom.make('div', 'controls_magnifier_button'); + btn.smallA = btn.dom.append('span', 'controls_magnifier_a', { text: 'A' }); + btn.largeA = btn.dom.append('span', 'controls_magnifier_A', { text: 'A' }); + p.buttons.push(btn); + Monocle.Events.listenForTap(btn, toggleMagnification); + return btn; + } + + + function toggleMagnification(evt) { + var opacities; + p.magnified = !p.magnified; + if (p.magnified) { + opacities = [0.3, 1]; + p.reader.formatting.setFontScale(k.MAGNIFICATION, true); + } else { + opacities = [1, 0.3]; + p.reader.formatting.setFontScale(null, true); + } + + for (var i = 0; i < p.buttons.length; i++) { + p.buttons[i].smallA.style.opacity = opacities[0]; + p.buttons[i].largeA.style.opacity = opacities[1]; + } + } + + API.createControlElements = createControlElements; + + initialize(); + + return API; +} + + +Monocle.Controls.Magnifier.MAGNIFICATION = 1.2; +// A panel is an invisible column of interactivity. When contact occurs +// (mousedown, touchstart), the panel expands to the full width of its +// container, to catch all interaction events and prevent them from hitting +// other things. +// +// Panels are used primarily to provide hit zones for page flipping +// interactions, but you can do whatever you like with them. +// +// After instantiating a panel and adding it to the reader as a control, +// you can call listenTo() with a hash of methods for any of 'start', 'move' +// 'end' and 'cancel'. +// +Monocle.Controls.Panel = function () { + + var API = { constructor: Monocle.Controls.Panel } + var k = API.constants = API.constructor; + var p = API.properties = { + evtCallbacks: {} + } + + function createControlElements(cntr) { + p.div = cntr.dom.make('div', k.CLS.panel); + p.div.dom.setStyles(k.DEFAULT_STYLES); + Monocle.Events.listenForContact( + p.div, + { + 'start': start, + 'move': move, + 'end': end, + 'cancel': cancel + }, + { useCapture: false } + ); + return p.div; + } + + + function setDirection(dir) { + p.direction = dir; + } + + + function listenTo(evtCallbacks) { + p.evtCallbacks = evtCallbacks; + } + + + function deafen() { + p.evtCallbacks = {} + } + + + function start(evt) { + p.contact = true; + evt.m.offsetX += p.div.offsetLeft; + evt.m.offsetY += p.div.offsetTop; + expand(); + invoke('start', evt); + } + + + function move(evt) { + if (!p.contact) { + return; + } + invoke('move', evt); + } + + + function end(evt) { + if (!p.contact) { + return; + } + Monocle.Events.deafenForContact(p.div, p.listeners); + contract(); + p.contact = false; + invoke('end', evt); + } + + + function cancel(evt) { + if (!p.contact) { + return; + } + Monocle.Events.deafenForContact(p.div, p.listeners); + contract(); + p.contact = false; + invoke('cancel', evt); + } + + + function invoke(evtType, evt) { + if (p.evtCallbacks[evtType]) { + p.evtCallbacks[evtType](p.direction, evt.m.offsetX, evt.m.offsetY, API); + } + evt.preventDefault(); + } + + + function expand() { + if (p.expanded) { + return; + } + p.div.dom.addClass(k.CLS.expanded); + p.expanded = true; + } + + + function contract(evt) { + if (!p.expanded) { + return; + } + p.div.dom.removeClass(k.CLS.expanded); + p.expanded = false; + } + + + API.createControlElements = createControlElements; + API.listenTo = listenTo; + API.deafen = deafen; + API.expand = expand; + API.contract = contract; + API.setDirection = setDirection; + + return API; +} + + +Monocle.Controls.Panel.CLS = { + panel: 'panel', + expanded: 'controls_panel_expanded' +} +Monocle.Controls.Panel.DEFAULT_STYLES = { + position: 'absolute', + height: '100%' +} +; +Monocle.Controls.PlaceSaver = function (bookId) { + + var API = { constructor: Monocle.Controls.PlaceSaver } + var k = API.constants = API.constructor; + var p = API.properties = {} + + + function initialize() { + applyToBook(bookId); + } + + + function assignToReader(reader) { + p.reader = reader; + p.reader.listen('monocle:turn', savePlaceToCookie); + } + + + function applyToBook(bookId) { + p.bkTitle = bookId.toLowerCase().replace(/[^a-z0-9]/g, ''); + p.prefix = k.COOKIE_NAMESPACE + p.bkTitle + "."; + } + + + function setCookie(key, value, days) { + var expires = ""; + if (days) { + var d = new Date(); + d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000)); + expires = "; expires="+d.toGMTString(); + } + var path = "; path=/"; + document.cookie = p.prefix + key + "=" + value + expires + path; + return value; + } + + + function getCookie(key) { + if (!document.cookie) { + return null; + } + var regex = new RegExp(p.prefix + key + "=(.+?)(;|$)"); + var matches = document.cookie.match(regex); + if (matches) { + return matches[1]; + } else { + return null; + } + } + + + function savePlaceToCookie() { + var place = p.reader.getPlace(); + setCookie( + "component", + encodeURIComponent(place.componentId()), + k.COOKIE_EXPIRES_IN_DAYS + ); + setCookie( + "percent", + place.percentageThrough(), + k.COOKIE_EXPIRES_IN_DAYS + ); + } + + + function savedPlace() { + var locus = { + componentId: getCookie('component'), + percent: getCookie('percent') + } + if (locus.componentId && locus.percent) { + locus.componentId = decodeURIComponent(locus.componentId); + locus.percent = parseFloat(locus.percent); + return locus; + } else { + return null; + } + } + + + function restorePlace() { + var locus = savedPlace(); + if (locus) { + p.reader.moveTo(locus); + } + } + + + API.assignToReader = assignToReader; + API.savedPlace = savedPlace; + API.restorePlace = restorePlace; + + initialize(); + + return API; +} + +Monocle.Controls.PlaceSaver.COOKIE_NAMESPACE = "monocle.controls.placesaver."; +Monocle.Controls.PlaceSaver.COOKIE_EXPIRES_IN_DAYS = 7; // Set to 0 for session-based expiry. +; +Monocle.Controls.Scrubber = function (reader) { + + var API = { constructor: Monocle.Controls.Scrubber } + var k = API.constants = API.constructor; + var p = API.properties = {} + + + function initialize() { + p.reader = reader; + p.reader.listen('monocle:turn', updateNeedles); + updateNeedles(); + } + + + function pixelToPlace(x, cntr) { + if (!p.componentIds) { + p.componentIds = p.reader.getBook().properties.componentIds; + p.componentWidth = 100 / p.componentIds.length; + } + var pc = (x / cntr.offsetWidth) * 100; + var cmpt = p.componentIds[Math.floor(pc / p.componentWidth)]; + var cmptPc = ((pc % p.componentWidth) / p.componentWidth); + return { componentId: cmpt, percentageThrough: cmptPc }; + } + + + function placeToPixel(place, cntr) { + if (!p.componentIds) { + p.componentIds = p.reader.getBook().properties.componentIds; + p.componentWidth = 100 / p.componentIds.length; + } + var componentIndex = p.componentIds.indexOf(place.componentId()); + var pc = p.componentWidth * componentIndex; + pc += place.percentageThrough() * p.componentWidth; + return Math.round((pc / 100) * cntr.offsetWidth); + } + + + function updateNeedles() { + if (p.hidden || !p.reader.dom.find(k.CLS.container)) { + return; + } + var place = p.reader.getPlace(); + var x = placeToPixel(place, p.reader.dom.find(k.CLS.container)); + var needle, i = 0; + for (var i = 0, needle; needle = p.reader.dom.find(k.CLS.needle, i); ++i) { + setX(needle, x - needle.offsetWidth / 2); + p.reader.dom.find(k.CLS.trail, i).style.width = x + "px"; + } + } + + + function setX(node, x) { + var cntr = p.reader.dom.find(k.CLS.container); + x = Math.min(cntr.offsetWidth - node.offsetWidth, x); + x = Math.max(x, 0); + Monocle.Styles.setX(node, x); + } + + + function createControlElements(holder) { + var cntr = holder.dom.make('div', k.CLS.container); + var track = cntr.dom.append('div', k.CLS.track); + var needleTrail = cntr.dom.append('div', k.CLS.trail); + var needle = cntr.dom.append('div', k.CLS.needle); + var bubble = cntr.dom.append('div', k.CLS.bubble); + + var cntrListeners, bodyListeners; + + var moveEvt = function (evt, x) { + evt.preventDefault(); + x = (typeof x == "number") ? x : evt.m.registrantX; + var place = pixelToPlace(x, cntr); + setX(needle, x - needle.offsetWidth / 2); + var book = p.reader.getBook(); + var chps = book.chaptersForComponent(place.componentId); + var cmptIndex = p.componentIds.indexOf(place.componentId); + var chp = chps[Math.floor(chps.length * place.percentageThrough)]; + if (cmptIndex > -1 && book.properties.components[cmptIndex]) { + var actualPlace = Monocle.Place.FromPercentageThrough( + book.properties.components[cmptIndex], + place.percentageThrough + ); + chp = actualPlace.chapterInfo() || chp; + } + + if (chp) { + bubble.innerHTML = chp.title; + } + setX(bubble, x - bubble.offsetWidth / 2); + + p.lastX = x; + return place; + } + + var endEvt = function (evt) { + var place = moveEvt(evt, p.lastX); + p.reader.moveTo({ + percent: place.percentageThrough, + componentId: place.componentId + }); + Monocle.Events.deafenForContact(cntr, cntrListeners); + Monocle.Events.deafenForContact(document.body, bodyListeners); + bubble.style.display = "none"; + } + + var startFn = function (evt) { + bubble.style.display = "block"; + moveEvt(evt); + cntrListeners = Monocle.Events.listenForContact( + cntr, + { move: moveEvt } + ); + bodyListeners = Monocle.Events.listenForContact( + document.body, + { end: endEvt } + ); + } + + Monocle.Events.listenForContact(cntr, { start: startFn }); + + return cntr; + } + + + API.createControlElements = createControlElements; + API.updateNeedles = updateNeedles; + + initialize(); + + return API; +} + +Monocle.Controls.Scrubber.CLS = { + container: 'controls_scrubber_container', + track: 'controls_scrubber_track', + needle: 'controls_scrubber_needle', + trail: 'controls_scrubber_trail', + bubble: 'controls_scrubber_bubble' +} +; +Monocle.Controls.Spinner = function (reader) { + + var API = { constructor: Monocle.Controls.Spinner } + var k = API.constants = API.constructor; + var p = API.properties = { + reader: reader, + divs: [], + repeaters: {}, + showForPages: [] + } + + + function createControlElements(cntr) { + var anim = cntr.dom.make('div', 'controls_spinner_anim'); + anim.dom.append('div', 'controls_spinner_inner'); + p.divs.push(anim); + return anim; + } + + + function registerSpinEvent(startEvtType, stopEvtType) { + var label = startEvtType; + p.reader.listen(startEvtType, function (evt) { spin(label, evt) }); + p.reader.listen(stopEvtType, function (evt) { spun(label, evt) }); + } + + + // Registers spin/spun event handlers for certain time-consuming events. + // + function listenForUsualDelays() { + registerSpinEvent('monocle:componentloading', 'monocle:componentloaded'); + registerSpinEvent('monocle:componentchanging', 'monocle:componentchange'); + registerSpinEvent('monocle:resizing', 'monocle:resize'); + registerSpinEvent('monocle:jumping', 'monocle:jump'); + registerSpinEvent('monocle:recalculating', 'monocle:recalculated'); + p.reader.listen('monocle:notfound', forceSpun); + p.reader.listen('monocle:componentfailed', forceSpun); + } + + + // Displays the spinner. Both arguments are optional. + // + function spin(label, evt) { + label = label || k.GENERIC_LABEL; + p.repeaters[label] = true; + p.reader.showControl(API); + + // If the delay is on a page other than the page we've been assigned to, + // don't show the animation. p.global ensures that if an event affects + // all pages, the animation is always shown, even if other events in this + // spin cycle are page-specific. + var page = (evt && evt.m && evt.m.page) ? evt.m.page : null; + if (page && p.divs.length > 1) { + p.showForPages[page.m.pageIndex] = true; + } else { + p.global = true; + p.reader.dispatchEvent('monocle:modal:on'); + } + for (var i = 0; i < p.divs.length; ++i) { + var show = (p.global || p.showForPages[i]) ? true : false; + p.divs[i].dom[show ? 'removeClass' : 'addClass']('dormant'); + } + } + + + // Stops displaying the spinner. Both arguments are optional. + // + function spun(label, evt) { + label = label || k.GENERIC_LABEL; + p.repeaters[label] = false; + for (var l in p.repeaters) { + if (p.repeaters[l]) { return; } + } + forceSpun(); + } + + + function forceSpun() { + if (p.global) { p.reader.dispatchEvent('monocle:modal:off'); } + p.global = false; + p.repeaters = {}; + p.showForPages = []; + for (var i = 0; i < p.divs.length; ++i) { + p.divs[i].dom.addClass('dormant'); + } + } + + + API.createControlElements = createControlElements; + API.registerSpinEvent = registerSpinEvent; + API.listenForUsualDelays = listenForUsualDelays; + API.spin = spin; + API.spun = spun; + API.forceSpun = forceSpun; + + return API; +} + +Monocle.Controls.Spinner.GENERIC_LABEL = "generic"; +Monocle.Controls.Stencil = function (reader, behaviorClasses) { + + var API = { constructor: Monocle.Controls.Stencil } + var k = API.constants = API.constructor; + var p = API.properties = { + reader: reader, + behaviors: [], + components: {}, + masks: [] + } + + + // Create the stencil container and listen for draw/update events. + // + function createControlElements(holder) { + behaviorClasses = behaviorClasses || k.DEFAULT_BEHAVIORS; + for (var i = 0, ii = behaviorClasses.length; i < ii; ++i) { + addBehavior(behaviorClasses[i]); + } + p.container = holder.dom.make('div', k.CLS.container); + p.reader.listen('monocle:turning', hide); + p.reader.listen('monocle:turn:cancel', show); + p.reader.listen('monocle:turn', update); + p.reader.listen('monocle:stylesheetchange', update); + p.reader.listen('monocle:resize', update); + update(); + return p.container; + } + + + // Pass this method an object that responds to 'findElements(doc)' with + // an array of DOM elements for that document, and to 'fitMask(elem, mask)'. + // + // After you have added all your behaviors this way, you would typically + // call update() to make them take effect immediately. + // + function addBehavior(bhvrClass) { + var bhvr = new bhvrClass(API); + if (typeof bhvr.findElements != 'function') { + console.warn('Missing "findElements" method for behavior: %o', bhvr); + } + if (typeof bhvr.fitMask != 'function') { + console.warn('Missing "fitMask" method for behavior: %o', bhvr); + } + p.behaviors.push(bhvr); + } + + + // Resets any pre-calculated rectangles for the active component, + // recalculates them, and forces masks to be "drawn" (moved into the new + // rectangular locations). + // + function update() { + var visPages = p.reader.visiblePages(); + if (!visPages || !visPages.length) { return; } + var pageDiv = visPages[0]; + var cmptId = pageComponentId(pageDiv); + if (!cmptId) { return; } + p.components[cmptId] = null; + calculateRectangles(pageDiv); + draw(); + } + + + function hide() { + p.container.style.display = 'none'; + } + + + function show() { + p.container.style.display = 'block'; + } + + + // Removes any existing masks. + function clear() { + while (p.container.childNodes.length) { + p.container.removeChild(p.container.lastChild); + } + } + + + // Aligns the stencil container to the shape of the page, then moves the + // masks to sit above any currently visible rectangles. + // + function draw() { + var pageDiv = p.reader.visiblePages()[0]; + var cmptId = pageComponentId(pageDiv); + if (!p.components[cmptId]) { + return; + } + + // Position the container. + alignToComponent(pageDiv); + + // Clear old masks. + clear(); + + // Layout the masks. + if (!p.disabled) { + show(); + var rects = p.components[cmptId]; + if (rects && rects.length) { + layoutRectangles(pageDiv, rects); + } + } + } + + + // Iterate over all the elements in the active component, and + // create an array of rectangular points corresponding to their positions. + // + function calculateRectangles(pageDiv) { + var cmptId = pageComponentId(pageDiv); + if (!p.components[cmptId]) { + p.components[cmptId] = []; + } else { + return; + } + + var doc = pageDiv.m.activeFrame.contentDocument; + var offset = getOffset(pageDiv); + + for (var b = 0, bb = p.behaviors.length; b < bb; ++b) { + var bhvr = p.behaviors[b]; + var elems = bhvr.findElements(doc); + for (var i = 0; i < elems.length; ++i) { + var elem = elems[i]; + if (elem.getClientRects) { + var r = elem.getClientRects(); + for (var j = 0; j < r.length; j++) { + p.components[cmptId].push({ + element: elem, + behavior: bhvr, + left: Math.ceil(r[j].left + offset.l), + top: Math.ceil(r[j].top), + width: Math.floor(r[j].width), + height: Math.floor(r[j].height) + }); + } + } + } + } + + return p.components[cmptId]; + } + + + // Update location of visible rectangles - creating as required. + // + function layoutRectangles(pageDiv, rects) { + var offset = getOffset(pageDiv); + var visRects = []; + for (var i = 0; i < rects.length; ++i) { + if (rectVisible(rects[i], offset.l, offset.l + offset.w)) { + visRects.push(rects[i]); + } + } + + for (i = 0; i < visRects.length; ++i) { + var r = visRects[i]; + var cr = { + left: r.left - offset.l, + top: r.top, + width: r.width, + height: r.height + }; + var mask = createMask(r.element, r.behavior); + mask.dom.setStyles({ + display: 'block', + left: cr.left+"px", + top: cr.top+"px", + width: cr.width+"px", + height: cr.height+"px", + position: 'absolute' + }); + mask.stencilRect = cr; + } + } + + + // Find the offset position in pixels from the left of the current page. + // + function getOffset(pageDiv) { + return { + l: pageDiv.m.offset || 0, + w: pageDiv.m.dimensions.properties.width + }; + } + + + // Is this area presently on the screen? + // + function rectVisible(rect, l, r) { + return rect.left >= l && rect.left < r; + } + + + // Returns the active component id for the given page, or the current + // page if no argument passed in. + // + function pageComponentId(pageDiv) { + pageDiv = pageDiv || p.reader.visiblePages()[0]; + if (!pageDiv.m.activeFrame.m.component) { return; } + return pageDiv.m.activeFrame.m.component.properties.id; + } + + + // Positions the stencil container over the active frame. + // + function alignToComponent(pageDiv) { + cmpt = pageDiv.m.activeFrame.parentNode; + p.container.dom.setStyles({ + left: cmpt.offsetLeft+"px", + top: cmpt.offsetTop+"px" + }); + } + + + function createMask(element, bhvr) { + var mask = p.container.dom.append(bhvr.maskTagName || 'div', k.CLS.mask); + Monocle.Events.listenForContact(mask, { + start: function () { p.reader.dispatchEvent('monocle:magic:halt'); }, + move: function (evt) { evt.preventDefault(); }, + end: function () { p.reader.dispatchEvent('monocle:magic:init'); } + }); + bhvr.fitMask(element, mask); + return mask; + } + + + // Make the active masks visible (by giving them a class -- override style + // in monoctrl.css). + // + function toggleHighlights() { + var cls = k.CLS.highlights; + if (p.container.dom.hasClass(cls)) { + p.container.dom.removeClass(cls); + } else { + p.container.dom.addClass(cls); + } + } + + + function disable() { + p.disabled = true; + draw(); + } + + + function enable() { + p.disabled = false; + draw(); + } + + + function filterElement(elem, behavior) { + if (typeof behavior.filterElement == 'function') { + return behavior.filterElement(elem); + } + return elem; + } + + + function maskAssigned(elem, mask, behavior) { + if (typeof behavior.maskAssigned == 'function') { + return behavior.maskAssigned(elem, mask); + } + return false; + } + + + API.createControlElements = createControlElements; + API.addBehavior = addBehavior; + API.draw = draw; + API.update = update; + API.toggleHighlights = toggleHighlights; + + return API; +} + + +Monocle.Controls.Stencil.CLS = { + container: 'controls_stencil_container', + mask: 'controls_stencil_mask', + highlights: 'controls_stencil_highlighted' +} + + + +Monocle.Controls.Stencil.Links = function (stencil) { + var API = { constructor: Monocle.Controls.Stencil.Links } + + // Optionally specify the HTML tagname of the mask. + API.maskTagName = 'a'; + + // Returns an array of all the elements in the given doc that should + // be covered with a stencil mask for interactivity. + // + // (Hint: doc.querySelectorAll() is your friend.) + // + API.findElements = function (doc) { + return doc.querySelectorAll('a[href]'); + } + + + // Return an element. It should usually be a child of the container element, + // with a className of the given maskClass. You set up the interactivity of + // the mask element here. + // + API.fitMask = function (link, mask) { + var hrefObject = deconstructHref(link); + + if (hrefObject.internal) { + mask.setAttribute('href', 'javascript:"Skip to chapter"'); + mask.onclick = function (evt) { + stencil.properties.reader.skipToChapter(hrefObject.internal); + evt.preventDefault(); + return false; + } + } else { + mask.setAttribute('href', hrefObject.external); + mask.setAttribute('target', '_blank'); + mask.onclick = function (evt) { return true; } + } + + link.onclick = function (evt) { + evt.preventDefault(); + return false; + } + } + + + // Returns an object with either: + // + // - an 'external' property -- an absolute URL with a protocol, + // host & etc, which should be treated as an external resource (eg, + // open in new window) + // + // OR + // + // - an 'internal' property -- a relative URL (with optional hash anchor), + // that is treated as a link to component in the book + // + // A weird but useful property of tags is that while + // link.getAttribute('href') will return the actual string value of the + // attribute (eg, 'foo.html'), link.href will return the absolute URL (eg, + // 'http://example.com/monocles/foo.html'). + // + function deconstructHref(elem) { + var loc = document.location; + var origin = loc.protocol+'//'+loc.host; + var href = elem.href; + var path = href.substring(origin.length); + var ext = { external: href }; + + // Anchor tags with 'target' attributes are always external URLs. + if (elem.getAttribute('target')) { + return ext; + } + // URLs with a different protocol or domain are always external. + //console.log("Domain test: %s <=> %s", origin, href); + if (href.indexOf(origin) != 0) { + return ext; + } + + // If it is in a sub-path of the current path, it's internal. + var topPath = loc.pathname.replace(/[^\/]*\.[^\/]+$/,''); + if (topPath[topPath.length - 1] != '/') { + topPath += '/'; + } + //console.log("Sub-path test: %s <=> %s", topPath, path); + if (path.indexOf(topPath) == 0) { + return { internal: path.substring(topPath.length) } + } + + // If it's a root-relative URL and it's in our list of component ids, + // it's internal. + var cmptIds = stencil.properties.reader.getBook().properties.componentIds; + for (var i = 0, ii = cmptIds.length; i < ii; ++i) { + //console.log("Component test: %s <=> %s", cmptIds[i], path); + if (path.indexOf(cmptIds[i]) == 0) { + return { internal: path } + } + } + + // Otherwise it's external. + return ext; + } + + + return API; +} + + +Monocle.Controls.Stencil.DEFAULT_BEHAVIORS = [Monocle.Controls.Stencil.Links]; diff --git a/sources/resources/monocle/styles/monocore.css b/sources/resources/monocle/styles/monocore.css new file mode 100644 index 0000000..02b4951 --- /dev/null +++ b/sources/resources/monocle/styles/monocore.css @@ -0,0 +1,195 @@ +/*=========================================================================== + +This is a base-level Monocle stylesheet. It assumes no class-prefix has been +given to the Reader during initialisation - if one has, you can copy and +modify this stylesheet accordingly. + +---------------------------------------------------------------------------*/ + +/* The reader object that holds pretty much everything. + * (A direct child of the element passed to reader initialisation). */ + +div.monelem_container { + background-color: black; +} + + +/* The div that mimics a leaf of paper in a book. */ +div.monelem_page { + background: white; + top: 0; + left: 0; + bottom: 3px; + right: 5px; + border-right: 1px solid #999; +} + + +/* The div within the page that determines page margins. */ +div.monelem_sheaf { + top: 1em; + left: 1em; + bottom: 1em; + right: 1em; +} + + +/* The iframe within the page that loads the content of the book. */ +div.monelem_component { +} + + +/* A panel that sits above the entire reader object, holding controls. */ +div.monelem_overlay { +} + + +/* A full-size panel to display an announcement (iframe or div) */ +div.monelem_billboard_container { + background: #FFF; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: 2000; + -webkit-transform: scale(0); + -moz-transform: scale(0); + transform: scale(0); + -webkit-transform-origin: -0 -0; + -moz-transform-origin: -0 -0; + transform-origin: -0 -0; +} + +.monelem_billboard_inner { + height: 100%; + width: 100%; + border: none; + overflow: auto; + /*-webkit-overflow-scrolling: touch;*/ /* This is sexy, but crashy. */ +} + +div.monelem_billboard_inner { + min-width: 100%; + min-height: 100%; + text-align: center; + vertical-align: middle; + display: -webkit-box; + -webkit-box-pack: center; + -webkit-box-align: center; +} + + +div.monelem_billboard_close { + position: absolute; + top: 0; + right: 0; + width: 50px; + height: 30px; + color: white; + background: #C00; + cursor: pointer; + border-bottom-left-radius: 4px; + text-shadow: 1px 1px 1px #900; + font: 9pt Helvetica Neue, Helvetica, sans-serif; +} + +div.monelem_billboard_close:after { + display: block; + content: 'Close'; + width: 100%; + line-height: 30px; + text-align: center; +} + +div.monelem_book_fatality { + font-family: Helvetica Neue, Helvetica, sans-serif; + margin: 0 auto; + max-width: 75%; +} + +div.monelem_book_fatality p { + line-height: 1.4; +} + + +/*=========================================================================== + PANELS +---------------------------------------------------------------------------*/ + + +.monelem_panels_imode_panel { + background: rgba(255,255,255,0.7); + opacity: 0; +} + +.monelem_panels_imode_backwardsPanel { + -webkit-box-shadow: 1px 1px 3px #777; + -moz-box-shadow: 1px 1px 3px #777; + box-shadow: 1px 1px 3px #777; +} + +.monelem_panels_imode_forwardsPanel { + -webkit-box-shadow: -1px 1px 3px #777; + -moz-box-shadow: -1px 1px 3px #777; + box-shadow: -1px 1px 3px #777; +} + +.monelem_panels_imode_centralPanel { +} + +.monelem_panels_imode_toggleIcon { + position: absolute; + right: 0; + bottom: 0; + width: 50px; + height: 50px; + background-repeat: no-repeat; + background-position: center center; +} + +/* If you modify this you could significantly change the way panels work. */ +div.monelem_controls_panel_expanded { + left: 0 !important; + width: 100% !important; + z-index: 1001 !important; +} + +/*=========================================================================== + Flippers +---------------------------------------------------------------------------*/ + +div.monelem_flippers_slider_wait { + position: absolute; + right: 0px; + top: 0px; + width: 92px; + height: 112px; + background-repeat: no-repeat; + -webkit-background-size: 100%; + -moz-background-size: 100%; + background-size: 100%; +} + +@media screen and (max-width: 640px) { + div.monelem_flippers_slider_wait { + width: 61px; + height: 75px; + } +} + + +/*=========================================================================== + DATA URIs + + These are data-uri packed images, inlined for loading speed and simplicity. + Placed at the end of this file because they're visually noisy... +---------------------------------------------------------------------------*/ + +div.monelem_panels_imode_toggleIcon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAaCAYAAABPY4eKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1%2B%2FAAAABV0RVh0Q3JlYXRpb24gVGltZQAzMC82LzEwBMfmVwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAANYSURBVEiJtdZbiNVVFMfxj8cx85JkIGlqSESgOGA9WIQgGmTRUyRaYFJDnUWYGV2eyiCpkIbEKJI1UqYvUkmFDxFBgpghonajSDCM7hcxLSnt4ulh%2F2c4HufMTOH8Xs75%2F%2Ffa67v3%2Bu%2B91hphGJWZNUzCXJyKiHd6xxqNhhGDTB6NOViAyzARY3EaP%2BNL7MCBiPi9Ze4leBlTsR9jcCnuiYgDbeGZeV4F7EINe7EP3%2BJ49W4GrsZ8NPAGXouIk5k5F93YFhHPVT5H4kbcjaX1ev3kWfDMPB9P4ko8ERE7BopONWcOVmMc1uBRrG8Oc5Ptq1hdr9cPdrQMTMUWfBQRCweD9ioiPsQtmbkeu7G8P3ClsZSI98EzcxqeUsLXM1RwZs7ErRiJKXgQN2Tmzoj4qsV2Hn7BYcq369UaHIqI5yPizyGCx2MPfsRVOBoR6%2FA%2BNmXmqCbbm%2FAiMiJO9cEzcwEuwLODwMZk5oXVLYA6PouIF%2FC6cvBgI37D0mreStyJroh4r9df785XYGtEHG8Hfnjb1w08Xu2qq3regtOZuaka2whV5NZieWY%2BhkV4ICJ2N%2FusZeYMJQm8NdCuuxdPH4HENGzsXjx9REQcqRxvR2dEfNBrHxF7lHywGPXW7085cEvwZkScHAheaRz%2BwngcqyAnlEPan%2Fbh5oj4rr%2FBDlyOXUMA%2Fx%2F9oFytM5SZs3t6epbWlOtxeJjg%2BzEmMye3vF%2BCYx2YhdFnTTs3OoQT2JqZ3TiC2zETyzrwrnIwhkMTqwVsxW24GLsiYmWj0dCBo2gNy7nSRfgpIjZjM6WU1ut1lHt%2BGLOHCd6J79sN1pSkMSUzJwwD%2FBoD5I9aRHyiFIVFQ3D2j1KR%2Fh7MMDPnY1JE7GwLr3434N5BnI3GFRiFzuai0Ub34aWBDGr0pcKPM%2FPpqovpT11KoVinNAvXt1lkLTNXKFesXU1HUz3HI0plWqW0QGcoIjYoERpMy7AS17b2da06o43KzLF4RanRzwwx3%2FfOHYW7lL5ubUR83p9do9Ho%2B99fDzcZDynfdxPejog%2FBoCOxHW4AxOwKiK%2BaGc%2FILzJ6ULcXznciwM4qFSzCUob3Km0UCeU3W5v5%2B8%2FwZsWMQvzlN1Nq8C%2F4ht8qkRm72B%2B%2BoP%2FC0sEOftJmUbfAAAAAElFTkSuQmCC); +} + +div.monelem_flippers_slider_wait { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAABwCAMAAACkX%2BcnAAAB0VBMVEUAAACDg4OEhISFhYWGhoaHh4eIiIiJiIiJiYmKioqLi4uMjIyNjY2Ojo6Pj4%2BQkJCRkZGSkpKTk5OUlJSVlZWWlpaXl5eYmJiZmZmampqbm5ucnJycnJ2dnZ2dnZ6dnZ%2Benp6enp%2Bfn5%2Bfn6CgoKCgoKGhoKChoaGioqKjo6OkpKSlpaWmpaWmpqaoqKiqqqqrq6usrKytra2urq6wsLCxsbGzs7O0tLS0tLW1tbW1tba1tbe2tri4uLi4uLm4uLq6ury7u7y8vLy8vL28vL%2B9vb2%2Bvr6%2Bvr%2B%2Fv7%2B%2Fv8HAwMDAwMLAwMPBwcPCwsPExMTExMXFxcXGxsbHx8fIyMjJycrOztDOztHPz9DPz9HR0dTS0tTT09TT09XU1NbU1NfV1dfW1tjW1tnX19fX19rY2Nra2tva2tzd3eDe3t7f39%2Fh4eHi4uLl5enn5%2Bnp6ezp6e3q6u3q6u7r6%2B7r6%2B%2Fs7O%2Fs7PDt7fDt7fHu7vHu7vLv7%2B%2Fv7%2FLv7%2FPw8PDw8PPw8PTx8fTx8fXy8vXy8vbz8%2Fbz8%2Ff09Pf09Pj19fj19fn29vn39%2Fn39%2Fr4%2BPr4%2BPv5%2Bfv6%2Bvv6%2Bvz7%2B%2Fz7%2B%2F38%2FP39%2Ff39%2Ff7%2B%2Fv7%2B%2Fv%2F%2F%2F%2F%2BHSJEZAAAAAXRSTlMAQObYZgAAA5dJREFUaN61lk1uE0EQhd%2BrsQlREAgkFkQKLJByteQU3IIdd2OBYIFASFmAFLurWPT0uOfXme6aWUXy6PNL9XPXR3z6DSI93wQ0GkHjzweapM%2B%2Btn8SMAERPzKQQKN7IDRhD2APgkbumucvXp24T3s%2BH47H7%2F9U1AxmpvaDzV5IUMBfD0CbQXYPly93K%2BEiwneqphpMVc3e7p492zciQhGKNN2bX%2F42shJOEQFIQgAKgfgdpvFz7d58%2FPO4Fn5PiggBAUkAYhoUMJipwU5vhsfjWjhESMTsBChQVVMDYICadfjD4VAAFyGYZVcN7Vzar4iP6frkd5RuLjG7WlCFwdSy4ICtPlBAKJLNhYBq6HKf8IHrx4J7IQX5maqFLHeC3yrWwyEiFACSzlTVVFNuzQZTAG%2BrLoQwVT1kubvGF4wlVj2vi2isuvWrbiXJIUISYKwL5qpuWgbvXQHxSCeqbiXwvOrpClC1QdXViuAQUnpXgE1U%2FSb%2BUwVVF7JfdTWN2G4uFyiaeZz6oOpB1drzTF0sSw6ySdc5Y%2FZe1SPeCpPfS6p6yq4arK16V5eyAwWEp6oTEKpqewXEygBW9iMabzsAZjqoOkuTL227tjJvSg8UaG%2FGhW33obSK8d4dVj1eAV3VrXQsuBtXvd12XdWteCxg2nbobbuU2xQsHst42zHe6lllypOnbcdUeZ62HUzNoOXJz4vdpZXDz4rde5TDz4rdsQ6%2BLHZNxVjOip3VJD8ndjVtOSt2rEp%2BRuxCHXxZ7G6tCr4sdhUX1xPETmvhC2KndWNZFjtUjmVR7KRyLItiF2qTL4ndtdXCF8Tuqhq%2BIHaonfmi2Ek1fEHsQjV8YdtVt2VR7DzgM2J36QCfFbsbB%2Fi82MEBPit2HvBZsfMYy6zYuSSfq7oLfE7sLpzgk2J37QKfETt1gc%2BJnQ98Rux84NNiJ07wSbELTvBpsXOCT4rdRz%2F4WOzMCz4pdl7wKbGDG3xC7NzGMiV2jvCx2PnNfELsbvzgY7FrHOFjsXOEj7YdHeFjsfOF96sePOFjsXOED8XutSt8sO2uXOFDsfOFD6ruCx9U3Rc%2BEDt3eC52zvC%2B2DnD%2B2LnDe9V3RveEzt3eC527vBc7NzhudhtAe%2BuAH94VnV%2FeCZ2G8BzscMmUxdgi5lnYrcF%2FCR2wCZHSvftP9x2m8DTttsEnsRuK7hs8%2FPPxG4beCt2G8HbbbcNPG67reAUEfwHRePBMkvuZ4wAAAAASUVORK5CYII%3D); +} diff --git a/sources/resources/monocle/styles/monoctrl.css b/sources/resources/monocle/styles/monoctrl.css new file mode 100644 index 0000000..89e8ab6 --- /dev/null +++ b/sources/resources/monocle/styles/monoctrl.css @@ -0,0 +1,169 @@ +/*=========================================================================== + CONTROLS + + The standard Monocle stylesheet for the optional Monocle controls. See + comments for monocore.css, which apply here too. +---------------------------------------------------------------------------*/ + +/* Contents */ + +div.monelem_controls_contents_container { + position: absolute; + width: 75%; + height: 75%; + left: 12.5%; + top: 12.5%; + background: #EEE; + border: 2px solid #F7F7F7; + border-radius: 9px; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + -moz-border-radius: 9px; + -webkit-border-radius: 9px; + box-shadow: 1px 2px 6px rgba(0,0,0,0.5); + -moz-box-shadow: 1px 2px 6px rgba(0,0,0,0.5); + -webkit-box-shadow: 1px 2px 6px rgba(0,0,0,0.5); +} + +ol.monelem_controls_contents_list { + margin: 6px; + padding: 0; +} + +li.monelem_controls_contents_chapter { + list-style: none; + line-height: 220%; + padding-left: 1em; + padding-right: 2em; + border-bottom: 2px groove #FEFEFE; + cursor: pointer; +} + +li.monelem_controls_contents_chapter_active { + background: #999; + color: white; +} + +/* Magnifier */ + +.monelem_controls_magnifier_button { + cursor: pointer; + color: #555; + position: absolute; + top: 2px; + right: 10px; + padding: 0 2px; +} + +.monelem_controls_magnifier_a { + font-size: 11px; +} + +.monelem_controls_magnifier_A { + font-size: 18px; + opacity: 0.3; +} + + +/* Spinner */ + +.monelem_controls_spinner_anim { + position: absolute; + width: 100%; + height: 100%; + background-color: white; + background-repeat: no-repeat; + background-position: center center; +} +.monelem_controls_spinner_anim.monelem_dormant { + width: 0; + height: 0; +} + + +/* Scrubber */ + +div.monelem_controls_scrubber_container { + position: absolute; + left: 1em; + right: 1em; + bottom: 4px; + height: 30px; + background: rgba(255,255,255,0.8); +} + +div.monelem_controls_scrubber_track { + margin-top: 10px; + height: 5px; + border: 1px solid #999; + cursor: pointer; +} + +div.monelem_controls_scrubber_needle { + position: absolute; + width: 14px; + height: 14px; + top: 5px; + background: #CCC; + border: 1px solid #999; + border-radius: 8px; + -moz-border-radius: 8px; + -webkit-border-radius: 8px; +} + +div.monelem_controls_scrubber_trail { + position: absolute; + background: #DDD; + top: 11px; + left: 1px; + height: 5px; +} + +div.monelem_controls_scrubber_bubble { + display: none; + position: absolute; + padding: 1em; + min-width: 20%; + max-width: 30%; + bottom: 2.5em; + background: rgba(0, 0, 0, 0.9); + color: #CCC; + font: bold 12px Lucida Grande, Tahoma, Helvetica, Arial, sans-serif; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + + +/* Stencil */ +div.monelem_controls_stencil_container { + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; +} + +.monelem_controls_stencil_mask { + display: block; + position: absolute; +} + +div.monelem_controls_stencil_highlighted .monelem_controls_stencil_mask { + background: rgba(0,0,255,0.15); +} + + +/*=========================================================================== + DATA URIs + + These are data-uri packed images, inlined for loading speed and simplicity. + Placed at the end of this file because they're visually noisy... +---------------------------------------------------------------------------*/ + +div.monelem_controls_spinner_anim { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA0CAMAAAANBM47AAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAsSAAALEgHS3X78AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M1cbXjNgAAABV0RVh0Q3JlYXRpb24gVGltZQAxNy81LzEwnOhoKAAAAE5QTFRFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxKKmWQAAABp0Uk5TAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBl0wLilAAAC8klEQVQYGZXBB2LjOAADQFCimtVFEoD//9HLbrJxipzoZoBToYptUwV8V/Xrsc8RP6i7aduPXHI69mWIAR9UY6Is5rnCuTBsWXeLkijbTFOLf7okW6R8zxEnwphskfIrifJdW4u/RtlpbGLsdjoHfDNkSZTSNg192w3jchSJEtcawCRzDvgjLPINX1SbSSvNXcC7eNuLXpQuTFbp8CZkH/isyS68H0PAF+0iUzxoNni33HPAR51UxDHgRLObslLEw3TPFT7oKPqIeOImURs+WJ0CHlqKXgLOxL4NgyRqxbuqeMNDXURPOBNWSokquRRP+GeVOzwcLlpwJmx3WVJuY2ZRi1ezfOBhdNGGU52ZhrloBzqSucKLerdLxLtIKlc4Nd9LA6wuNTC5aAbQZzs3eFhE9Tg3mw2wqkQgHCZrTJK3iIcoasMTvXX0E30EAK2k+Wbrho8mky2eCLslSz3+2ERKucVHIZsbnqp2WWXEX60ossMnrakeP+jGocabg9SGzyaXHHDRpOIO/zRjDWCTNlzVsLjFm4bODapE33BZoke8mVy8oqXY4rLNXvFmEnXDKJYaly3SjlchkSOwiCngstFMeDXLE4CVygGX3e6FawUgzFIKANbiHHDZ7U4qL7c5SWzxYqFywGXjvVD3F3Zu8ccs5gqXzeYx7CTTWOOvnmTEZZu0ItSxrvAmZrrHZYme8dkhLbiqLkUDPlvMA1cNIiM+613Y4KJNSviiprTgmrrQM75arVzhkllUxFetqBlXVEXa8d0hMeKCxVSH73rRG37XidpxZlXRiN9UhYUtztRFVI+fhUPFE851KlSHn4TNxTueGU2yx3PVbipVeGpxIaeAJ2IynRv8YHEp3iNOjRRdGvxotGjONb7pD7M4RfyiK6ZclhYf1bdDprRW+FW9SZSUlqGtq1BVTTftRaKce1zS7bIpWyW/oK0i38tU4apupWyRsijKVhoj/o+6W45cJEoqaR+bgP8txH5a1nUZ2gq/+Q/51T5MhuG3fQAAAABJRU5ErkJggg==); +} diff --git a/sources/resources/transliteration-data/x00.php b/sources/resources/transliteration-data/x00.php new file mode 100644 index 0000000..14a2050 --- /dev/null +++ b/sources/resources/transliteration-data/x00.php @@ -0,0 +1,44 @@ + '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x90 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xA0 => ' ', '!', 'C/', 'PS', '$?', 'Y=', '|', 'SS', '"', '(c)', 'a', '<<', '!', '', '(r)', '-', + 0xB0 => 'deg', '+-', '2', '3', '\'', 'u', 'P', '*', ',', '1', 'o', '>>', '1/4', '1/2', '3/4', '?', + 0xC0 => 'A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', + 0xD0 => 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'x', 'O', 'U', 'U', 'U', 'U', 'Y', 'Th', 'ss', + 0xE0 => 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', + 0xF0 => 'd', 'n', 'o', 'o', 'o', 'o', 'o', '/', 'o', 'u', 'u', 'u', 'u', 'y', 'th', 'y', +); + +// Overrides for Danish input. +$variant['da'] = array( + 0xC5 => 'Aa', + 0xC6 => 'Ae', + 0xD8 => 'Oe', + 0xE5 => 'aa', + 0xE6 => 'ae', + 0xF8 => 'oe', +); + +// Overrides for German input. +$variant['de'] = array( + 0xC4 => 'Ae', + 0xD6 => 'Oe', + 0xDC => 'Ue', + 0xE4 => 'ae', + 0xF6 => 'oe', + 0xFC => 'ue', + 0xDF => 'ss', +); + +// Overrides for Spanish input. +$variant['es'] = array( + 0xE1 => 'a', + 0xE9 => 'e', + 0xED => 'i', + 0xF3 => 'o', + 0xFA => 'u', + 0xF1 => 'n', +); diff --git a/sources/resources/transliteration-data/x01.php b/sources/resources/transliteration-data/x01.php new file mode 100644 index 0000000..3b13fea --- /dev/null +++ b/sources/resources/transliteration-data/x01.php @@ -0,0 +1,36 @@ + 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', + 0x10 => 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', + 0x20 => 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', + 0x30 => 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', + 0x40 => 'l', 'L', 'l', 'N', 'n', 'N', 'n', 'N', 'n', '\'n', 'NG', 'ng', 'O', 'o', 'O', 'o', + 0x50 => 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', + 0x60 => 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', + 0x70 => 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', + 0x80 => 'b', 'B', 'B', 'b', '6', '6', 'O', 'C', 'c', 'D', 'D', 'D', 'd', 'd', '3', '@', + 0x90 => 'E', 'F', 'f', 'G', 'G', 'hv', 'I', 'I', 'K', 'k', 'l', 'l', 'W', 'N', 'n', 'O', + 0xA0 => 'O', 'o', 'OI', 'oi', 'P', 'p', 'YR', '2', '2', 'SH', 'sh', 't', 'T', 't', 'T', 'U', + 0xB0 => 'u', 'Y', 'V', 'Y', 'y', 'Z', 'z', 'ZH', 'ZH', 'zh', 'zh', '2', '5', '5', 'ts', 'w', + 0xC0 => '|', '||', '|=', '!', 'DZ', 'Dz', 'dz', 'LJ', 'Lj', 'lj', 'NJ', 'Nj', 'nj', 'A', 'a', 'I', + 0xD0 => 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', '@', 'A', 'a', + 0xE0 => 'A', 'a', 'AE', 'ae', 'G', 'g', 'G', 'g', 'K', 'k', 'O', 'o', 'O', 'o', 'ZH', 'zh', + 0xF0 => 'j', 'DZ', 'D', 'dz', 'G', 'g', 'HV', 'W', 'N', 'n', 'A', 'a', 'AE', 'ae', 'O', 'o', +); + +// Overrides for Esperanto input. +$variant['eo'] = array( + 0x08 => 'Cx', + 0x09 => 'cx', + 0x1C => 'Gx', + 0x1D => 'gx', + 0x24 => 'Hx', + 0x25 => 'hx', + 0x34 => 'Jx', + 0x35 => 'jx', + 0x5C => 'Sx', + 0x5D => 'sx', + 0x6C => 'Ux', + 0x6D => 'ux', +); diff --git a/sources/resources/transliteration-data/x02.php b/sources/resources/transliteration-data/x02.php new file mode 100644 index 0000000..5d41686 --- /dev/null +++ b/sources/resources/transliteration-data/x02.php @@ -0,0 +1,20 @@ + 'A', 'a', 'A', 'a', 'E', 'e', 'E', 'e', 'I', 'i', 'I', 'i', 'O', 'o', 'O', 'o', + 0x10 => 'R', 'r', 'R', 'r', 'U', 'u', 'U', 'u', 'S', 's', 'T', 't', 'Y', 'y', 'H', 'h', + 0x20 => 'N', 'd', 'OU', 'ou', 'Z', 'z', 'A', 'a', 'E', 'e', 'O', 'o', 'O', 'o', 'O', 'o', + 0x30 => 'O', 'o', 'Y', 'y', 'l', 'n', 't', 'j', 'db', 'qp', 'A', 'C', 'c', 'L', 'T', 's', + 0x40 => 'z', '?', '?', 'B', 'U', 'V', 'E', 'e', 'J', 'j', 'Q', 'q', 'R', 'r', 'Y', 'y', + 0x50 => 'a', 'a', 'a', 'b', 'o', 'c', 'd', 'd', 'e', '@', '@', 'e', 'e', 'e', 'e', 'j', + 0x60 => 'g', 'g', 'g', 'g', 'u', 'Y', 'h', 'h', 'i', 'i', 'I', 'l', 'l', 'l', 'lZ', 'W', + 0x70 => 'W', 'm', 'n', 'n', 'n', 'o', 'OE', 'O', 'F', 'R', 'R', 'R', 'R', 'r', 'r', 'R', + 0x80 => 'R', 'R', 's', 'S', 'j', 'S', 'S', 't', 't', 'U', 'U', 'v', '^', 'W', 'Y', 'Y', + 0x90 => 'z', 'z', 'Z', 'Z', '?', '?', '?', 'C', '@', 'B', 'E', 'G', 'H', 'j', 'k', 'L', + 0xA0 => 'q', '?', '?', 'dz', 'dZ', 'dz', 'ts', 'tS', 'tC', 'fN', 'ls', 'lz', 'WW', ']]', 'h', 'h', + 0xB0 => 'k', 'h', 'j', 'r', 'r', 'r', 'r', 'w', 'y', '\'', '"', '`', '\'', '`', '`', '\'', + 0xC0 => '?', '?', '<', '>', '^', 'V', '^', 'V', '\'', '-', '/', '\\', ',', '_', '\\', '/', + 0xD0 => ':', '.', '`', '\'', '^', 'V', '+', '-', 'V', '.', '@', ',', '~', '"', 'R', 'X', + 0xE0 => 'G', 'l', 's', 'x', '?', '', '', '', '', '', '', '', 'V', '=', '"', NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x03.php b/sources/resources/transliteration-data/x03.php new file mode 100644 index 0000000..2667fa1 --- /dev/null +++ b/sources/resources/transliteration-data/x03.php @@ -0,0 +1,20 @@ + '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x10 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x20 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x30 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x40 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, NULL, NULL, NULL, '\'', ',', NULL, NULL, NULL, NULL, '', NULL, NULL, NULL, '?', NULL, + 0x80 => NULL, NULL, NULL, NULL, '', '', 'A', ';', 'E', 'I', 'I', NULL, 'O', NULL, 'U', 'O', + 0x90 => 'I', 'A', 'V', 'G', 'D', 'E', 'Z', 'I', 'Th', 'I', 'K', 'L', 'M', 'N', 'X', 'O', + 0xA0 => 'P', 'R', NULL, 'S', 'T', 'Y', 'F', 'H', 'Ps', 'O', 'I', 'Y', 'a', 'e', 'i', 'i', + 0xB0 => 'y', 'a', 'v', 'g', 'd', 'e', 'z', 'i', 'th', 'i', 'k', 'l', 'm', 'n', 'x', 'o', + 0xC0 => 'p', 'r', 's', 's', 't', 'y', 'f', 'h', 'ps', 'o', 'i', 'y', 'o', 'y', 'o', NULL, + 0xD0 => 'b', 'th', 'U', 'U', 'U', 'ph', 'p', '&', NULL, NULL, 'St', 'st', 'W', 'w', 'Q', 'q', + 0xE0 => 'Sp', 'sp', 'Sh', 'sh', 'F', 'f', 'Kh', 'kh', 'H', 'h', 'G', 'g', 'CH', 'ch', 'Ti', 'ti', + 0xF0 => 'k', 'r', 'c', 'j', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x04.php b/sources/resources/transliteration-data/x04.php new file mode 100644 index 0000000..6c0a160 --- /dev/null +++ b/sources/resources/transliteration-data/x04.php @@ -0,0 +1,56 @@ + 'Jo', 'Yo', 'Dj', 'Gj', 'Ie', 'Dz', 'I', 'Yi', 'J', 'Lj', 'Nj', 'Tsh', 'Kj', 'I', 'U', 'Dzh', + 0x10 => 'A', 'B', 'V', 'G', 'D', 'E', 'Zh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', + 0x20 => 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Shch', '', 'Y', '', 'E', 'Yu', 'Ya', + 0x30 => 'a', 'b', 'v', 'g', 'd', 'e', 'zh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', + 0x40 => 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'shch', '', 'y', '', 'e', 'yu', 'ya', + 0x50 => 'je', 'yo', 'dj', 'gj', 'ie', 'dz', 'i', 'yi', 'j', 'lj', 'nj', 'tsh', 'kj', 'i', 'u', 'dzh', + 0x60 => 'O', 'o', 'E', 'e', 'Ie', 'ie', 'E', 'e', 'Ie', 'ie', 'O', 'o', 'Io', 'io', 'Ks', 'ks', + 0x70 => 'Ps', 'ps', 'F', 'f', 'Y', 'y', 'Y', 'y', 'u', 'u', 'O', 'o', 'O', 'o', 'Ot', 'ot', + 0x80 => 'Q', 'q', '*1000*', '', '', '', '', NULL, '*100.000*', '*1.000.000*', NULL, NULL, '"', '"', 'R\'', 'r\'', + 0x90 => 'G\'', 'g\'', 'G\'', 'g\'', 'G\'', 'g\'', 'Zh\'', 'zh\'', 'Z\'', 'z\'', 'K\'', 'k\'', 'K\'', 'k\'', 'K\'', 'k\'', + 0xA0 => 'K\'', 'k\'', 'N\'', 'n\'', 'Ng', 'ng', 'P\'', 'p\'', 'Kh', 'kh', 'S\'', 's\'', 'T\'', 't\'', 'U', 'u', + 0xB0 => 'U\'', 'u\'', 'Kh\'', 'kh\'', 'Tts', 'tts', 'Ch\'', 'ch\'', 'Ch\'', 'ch\'', 'H', 'h', 'Ch', 'ch', 'Ch\'', 'ch\'', + 0xC0 => '`', 'Zh', 'zh', 'K\'', 'k\'', NULL, NULL, 'N\'', 'n\'', NULL, NULL, 'Ch', 'ch', NULL, NULL, NULL, + 0xD0 => 'a', 'a', 'A', 'a', 'Ae', 'ae', 'Ie', 'ie', '@', '@', '@', '@', 'Zh', 'zh', 'Z', 'z', + 0xE0 => 'Dz', 'dz', 'I', 'i', 'I', 'i', 'O', 'o', 'O', 'o', 'O', 'o', 'E', 'e', 'U', 'u', + 0xF0 => 'U', 'u', 'U', 'u', 'Ch', 'ch', NULL, NULL, 'Y', 'y', NULL, NULL, NULL, NULL, NULL, NULL, +); + +// Overrides for Kyrgyz input. +$variant['kg'] = array( + 0x01 => 'E', + 0x16 => 'C', + 0x19 => 'J', + 0x25 => 'X', + 0x26 => 'TS', + 0x29 => 'SCH', + 0x2E => 'JU', + 0x2F => 'JA', + 0x36 => 'c', + 0x39 => 'j', + 0x45 => 'x', + 0x46 => 'ts', + 0x49 => 'sch', + 0x4E => 'ju', + 0x4F => 'ja', + 0x51 => 'e', + 0xA2 => 'H', + 0xA3 => 'h', + 0xAE => 'W', + 0xAF => 'w', + 0xE8 => 'Q', + 0xE9 => 'q', +); + +// Overrides for Ukrainian input. +$variant['uk'] = array( + 0x90 => 'G', + 0x91 => 'g', + 0x04 => 'YE', + 0x54 => 'ye', + 0x18 => 'Y', + 0x38 => 'y', +); diff --git a/sources/resources/transliteration-data/x05.php b/sources/resources/transliteration-data/x05.php new file mode 100644 index 0000000..b6a7356 --- /dev/null +++ b/sources/resources/transliteration-data/x05.php @@ -0,0 +1,20 @@ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x10 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x20 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x30 => NULL, 'A', 'B', 'G', 'D', 'E', 'Z', 'E', 'E', 'T`', 'Zh', 'I', 'L', 'Kh', 'Ts', 'K', + 0x40 => 'H', 'Dz', 'Gh', 'Ch', 'M', 'Y', 'N', 'Sh', 'O', 'Ch`', 'P', 'J', 'Rh', 'S', 'V', 'T', + 0x50 => 'R', 'Ts`', 'W', 'P`', 'K`', 'O', 'F', NULL, NULL, '<', '\'', '/', '!', ',', '?', '.', + 0x60 => NULL, 'a', 'b', 'g', 'd', 'e', 'z', 'e', 'e', 't`', 'zh', 'i', 'l', 'kh', 'ts', 'k', + 0x70 => 'h', 'dz', 'gh', 'ch', 'm', 'y', 'n', 'sh', 'o', 'ch`', 'p', 'j', 'rh', 's', 'v', 't', + 0x80 => 'r', 'ts`', 'w', 'p`', 'k`', 'o', 'f', 'ew', NULL, '.', '-', NULL, NULL, NULL, NULL, NULL, + 0x90 => NULL, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xA0 => '', '', NULL, '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xB0 => '@', 'e', 'a', 'o', 'i', 'e', 'e', 'a', 'a', 'o', NULL, 'u', '\'', '', '', '', + 0xC0 => '', '', '', ':', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => '', 'b', 'g', 'd', 'h', 'v', 'z', 'kh', 't', 'y', 'k', 'k', 'l', 'm', 'm', 'n', + 0xE0 => 'n', 's', '`', 'p', 'p', 'ts', 'ts', 'q', 'r', 'sh', 't', NULL, NULL, NULL, NULL, NULL, + 0xF0 => 'V', 'oy', 'i', '\'', '"', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x06.php b/sources/resources/transliteration-data/x06.php new file mode 100644 index 0000000..fbc1a0a --- /dev/null +++ b/sources/resources/transliteration-data/x06.php @@ -0,0 +1,20 @@ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, ',', NULL, NULL, NULL, + 0x10 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, ';', NULL, NULL, NULL, '?', + 0x20 => NULL, '', 'a', '\'', 'w\'', '', 'y\'', '', 'b', '@', 't', 'th', 'j', 'H', 'kh', 'd', + 0x30 => 'dh', 'r', 'z', 's', 'sh', 'S', 'D', 'T', 'Z', '`', 'G', NULL, NULL, NULL, NULL, NULL, + 0x40 => '', 'f', 'q', 'k', 'l', 'm', 'n', 'h', 'w', '~', 'y', 'an', 'un', 'in', 'a', 'u', + 0x50 => 'i', 'W', '', '', '\'', '\'', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '%', '.', ',', '*', NULL, NULL, + 0x70 => '', '\'', '\'', '\'', '', '\'', '\'w', '\'u', '\'y', 'tt', 'tth', 'b', 't', 'T', 'p', 'th', + 0x80 => 'bh', '\'h', 'H', 'ny', 'dy', 'H', 'ch', 'cch', 'dd', 'D', 'D', 'Dt', 'dh', 'ddh', 'd', 'D', + 0x90 => 'D', 'rr', 'R', 'R', 'R', 'R', 'R', 'R', 'j', 'R', 'S', 'S', 'S', 'S', 'S', 'T', + 0xA0 => 'GH', 'F', 'F', 'F', 'v', 'f', 'ph', 'Q', 'Q', 'kh', 'k', 'K', 'K', 'ng', 'K', 'g', + 0xB0 => 'G', 'N', 'G', 'G', 'G', 'L', 'L', 'L', 'L', 'N', 'N', 'N', 'N', 'N', 'h', 'Ch', + 0xC0 => 'hy', 'h', 'H', '@', 'W', 'oe', 'oe', 'u', 'yu', 'yu', 'W', 'v', 'y', 'Y', 'Y', 'W', + 0xD0 => '', '', 'y', 'y\'', '.', 'ae', '', '', '', '', '', '', '', '@', '#', '', + 0xE0 => '', '', '', '', '', '', '', '', '', '^', '', '', '', '', NULL, NULL, + 0xF0 => '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'Sh', 'D', 'Gh', '&', '+m', NULL, +); diff --git a/sources/resources/transliteration-data/x07.php b/sources/resources/transliteration-data/x07.php new file mode 100644 index 0000000..6c6f4f4 --- /dev/null +++ b/sources/resources/transliteration-data/x07.php @@ -0,0 +1,20 @@ + '//', '/', ',', '!', '!', '-', ',', ',', ';', '?', '~', '{', '}', '*', NULL, '', + 0x10 => '\'', '', 'b', 'g', 'g', 'd', 'd', 'h', 'w', 'z', 'H', 't', 't', 'y', 'yh', 'k', + 0x20 => 'l', 'm', 'n', 's', 's', '`', 'p', 'p', 'S', 'q', 'r', 'sh', 't', NULL, NULL, NULL, + 0x30 => 'a', 'a', 'a', 'A', 'A', 'A', 'e', 'e', 'e', 'E', 'i', 'i', 'u', 'u', 'u', 'o', + 0x40 => '', '`', '\'', '', '', 'X', 'Q', '@', '@', '|', '+', NULL, NULL, NULL, NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => 'h', 'sh', 'n', 'r', 'b', 'L', 'k', '\'', 'v', 'm', 'f', 'dh', 'th', 'l', 'g', 'ny', + 0x90 => 's', 'd', 'z', 't', 'y', 'p', 'j', 'ch', 'tt', 'hh', 'kh', 'th', 'z', 'sh', 's', 'd', + 0xA0 => 't', 'z', '`', 'gh', 'q', 'w', 'a', 'aa', 'i', 'ee', 'u', 'oo', 'e', 'ey', 'o', 'oa', + 0xB0 => '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x09.php b/sources/resources/transliteration-data/x09.php new file mode 100644 index 0000000..b891abd --- /dev/null +++ b/sources/resources/transliteration-data/x09.php @@ -0,0 +1,20 @@ + NULL, 'N', 'N', 'H', NULL, 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', 'eN', 'e', 'e', + 0x10 => 'ai', 'oN', 'o', 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', + 0x20 => 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', 'nnn', 'p', 'ph', 'b', 'bh', 'm', 'y', + 0x30 => 'r', 'rr', 'l', 'l', 'lll', 'v', 'sh', 'ss', 's', 'h', NULL, NULL, '\'', '\'', 'aa', 'i', + 0x40 => 'ii', 'u', 'uu', 'R', 'RR', 'eN', 'e', 'e', 'ai', 'oN', 'o', 'o', 'au', '', NULL, NULL, + 0x50 => 'AUM', '\'', '\'', '`', '\'', NULL, NULL, NULL, 'q', 'khh', 'ghh', 'z', 'dddh', 'rh', 'f', 'yy', + 0x60 => 'RR', 'LL', 'L', 'LL', ' / ', ' // ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 0x70 => '.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, 'N', 'N', 'H', NULL, 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', NULL, NULL, 'e', + 0x90 => 'ai', NULL, NULL, 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', + 0xA0 => 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', NULL, 'p', 'ph', 'b', 'bh', 'm', 'y', + 0xB0 => 'r', NULL, 'l', NULL, NULL, NULL, 'sh', 'ss', 's', 'h', NULL, NULL, '\'', NULL, 'aa', 'i', + 0xC0 => 'ii', 'u', 'uu', 'R', 'RR', NULL, NULL, 'e', 'ai', NULL, NULL, 'o', 'au', '', NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, '+', NULL, NULL, NULL, NULL, 'rr', 'rh', NULL, 'yy', + 0xE0 => 'RR', 'LL', 'L', 'LL', NULL, NULL, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 0xF0 => 'r\'', 'r`', 'Rs', 'Rs', '1/', '2/', '3/', '4/', ' 1 - 1/', '/16', '', NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x0a.php b/sources/resources/transliteration-data/x0a.php new file mode 100644 index 0000000..fca4c8e --- /dev/null +++ b/sources/resources/transliteration-data/x0a.php @@ -0,0 +1,20 @@ + NULL, NULL, 'N', NULL, NULL, 'a', 'aa', 'i', 'ii', 'u', 'uu', NULL, NULL, NULL, NULL, 'ee', + 0x10 => 'ai', NULL, NULL, 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', + 0x20 => 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', NULL, 'p', 'ph', 'b', 'bb', 'm', 'y', + 0x30 => 'r', NULL, 'l', 'll', NULL, 'v', 'sh', NULL, 's', 'h', NULL, NULL, '\'', NULL, 'aa', 'i', + 0x40 => 'ii', 'u', 'uu', NULL, NULL, NULL, NULL, 'ee', 'ai', NULL, NULL, 'oo', 'au', '', NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'khh', 'ghh', 'z', 'rr', NULL, 'f', NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 0x70 => 'N', 'H', '', '', 'G.E.O.', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, 'N', 'N', 'H', NULL, 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', NULL, 'eN', NULL, 'e', + 0x90 => 'ai', 'oN', NULL, 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', + 0xA0 => 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', NULL, 'p', 'ph', 'b', 'bh', 'm', 'ya', + 0xB0 => 'r', NULL, 'l', 'll', NULL, 'v', 'sh', 'ss', 's', 'h', NULL, NULL, '\'', '\'', 'aa', 'i', + 0xC0 => 'ii', 'u', 'uu', 'R', 'RR', 'eN', NULL, 'e', 'ai', 'oN', NULL, 'o', 'au', '', NULL, NULL, + 0xD0 => 'AUM', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => 'RR', NULL, NULL, NULL, NULL, NULL, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x0b.php b/sources/resources/transliteration-data/x0b.php new file mode 100644 index 0000000..32f711b --- /dev/null +++ b/sources/resources/transliteration-data/x0b.php @@ -0,0 +1,20 @@ + NULL, 'N', 'N', 'H', NULL, 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', NULL, NULL, 'e', + 0x10 => 'ai', NULL, NULL, 'o', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', + 0x20 => 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', NULL, 'p', 'ph', 'b', 'bh', 'm', 'y', + 0x30 => 'r', NULL, 'l', 'll', NULL, '', 'sh', 'ss', 's', 'h', NULL, NULL, '\'', '\'', 'aa', 'i', + 0x40 => 'ii', 'u', 'uu', 'R', NULL, NULL, NULL, 'e', 'ai', NULL, NULL, 'o', 'au', '', NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, '+', '+', NULL, NULL, NULL, NULL, 'rr', 'rh', NULL, 'yy', + 0x60 => 'RR', 'LL', NULL, NULL, NULL, NULL, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 0x70 => '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, NULL, 'N', 'H', NULL, 'a', 'aa', 'i', 'ii', 'u', 'uu', NULL, NULL, NULL, 'e', 'ee', + 0x90 => 'ai', NULL, 'o', 'oo', 'au', 'k', NULL, NULL, NULL, 'ng', 'c', NULL, 'j', NULL, 'ny', 'tt', + 0xA0 => NULL, NULL, NULL, 'nn', 't', NULL, NULL, NULL, 'n', 'nnn', 'p', NULL, NULL, NULL, 'm', 'y', + 0xB0 => 'r', 'rr', 'l', 'll', 'lll', 'v', NULL, 'ss', 's', 'h', NULL, NULL, NULL, NULL, 'aa', 'i', + 0xC0 => 'ii', 'u', 'uu', NULL, NULL, NULL, 'e', 'ee', 'ai', NULL, 'o', 'oo', 'au', '', NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, '+', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 0xF0 => '+10+', '+100+', '+1000+', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x0c.php b/sources/resources/transliteration-data/x0c.php new file mode 100644 index 0000000..96bf72d --- /dev/null +++ b/sources/resources/transliteration-data/x0c.php @@ -0,0 +1,20 @@ + NULL, 'N', 'N', 'H', NULL, 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', NULL, 'e', 'ee', + 0x10 => 'ai', NULL, 'o', 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', + 0x20 => 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', NULL, 'p', 'ph', 'b', 'bh', 'm', 'y', + 0x30 => 'r', 'rr', 'l', 'll', NULL, 'v', 'sh', 'ss', 's', 'h', NULL, NULL, NULL, NULL, 'aa', 'i', + 0x40 => 'ii', 'u', 'uu', 'R', 'RR', NULL, 'e', 'ee', 'ai', NULL, 'o', 'oo', 'au', '', NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, '+', '+', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => 'RR', 'LL', NULL, NULL, NULL, NULL, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, NULL, 'N', 'H', NULL, 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', NULL, 'e', 'ee', + 0x90 => 'ai', NULL, 'o', 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', + 0xA0 => 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', NULL, 'p', 'ph', 'b', 'bh', 'm', 'y', + 0xB0 => 'r', 'rr', 'l', 'll', NULL, 'v', 'sh', 'ss', 's', 'h', NULL, NULL, NULL, NULL, 'aa', 'i', + 0xC0 => 'ii', 'u', 'uu', 'R', 'RR', NULL, 'e', 'ee', 'ai', NULL, 'o', 'oo', 'au', '', NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, '+', '+', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'lll', NULL, + 0xE0 => 'RR', 'LL', NULL, NULL, NULL, NULL, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x0d.php b/sources/resources/transliteration-data/x0d.php new file mode 100644 index 0000000..59b8e4f --- /dev/null +++ b/sources/resources/transliteration-data/x0d.php @@ -0,0 +1,20 @@ + NULL, NULL, 'N', 'H', NULL, 'a', 'aa', 'i', 'ii', 'u', 'uu', 'R', 'L', NULL, 'e', 'ee', + 0x10 => 'ai', NULL, 'o', 'oo', 'au', 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'tt', + 0x20 => 'tth', 'dd', 'ddh', 'nn', 't', 'th', 'd', 'dh', 'n', NULL, 'p', 'ph', 'b', 'bh', 'm', 'y', + 0x30 => 'r', 'rr', 'l', 'll', 'lll', 'v', 'sh', 'ss', 's', 'h', NULL, NULL, NULL, NULL, 'aa', 'i', + 0x40 => 'ii', 'u', 'uu', 'R', NULL, NULL, 'e', 'ee', 'ai', '', 'o', 'oo', 'au', '', NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, '+', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => 'RR', 'LL', NULL, NULL, NULL, NULL, '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, NULL, 'N', 'H', NULL, 'a', 'aa', 'ae', 'aae', 'i', 'ii', 'u', 'uu', 'R', 'RR', 'L', + 0x90 => 'LL', 'e', 'ee', 'ai', 'o', 'oo', 'au', NULL, NULL, NULL, 'k', 'kh', 'g', 'gh', 'ng', 'nng', + 0xA0 => 'c', 'ch', 'j', 'jh', 'ny', 'jny', 'nyj', 'tt', 'tth', 'dd', 'ddh', 'nn', 'nndd', 't', 'th', 'd', + 0xB0 => 'dh', 'n', NULL, 'nd', 'p', 'ph', 'b', 'bh', 'm', 'mb', 'y', 'r', NULL, 'l', NULL, NULL, + 0xC0 => 'v', 'sh', 'ss', 's', 'h', 'll', 'f', NULL, NULL, NULL, '', NULL, NULL, NULL, NULL, 'aa', + 0xD0 => 'ae', 'aae', 'i', 'ii', 'u', NULL, 'uu', NULL, 'R', 'e', 'ee', 'ai', 'o', 'oo', 'au', 'L', + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, 'RR', 'LL', ' . ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x0e.php b/sources/resources/transliteration-data/x0e.php new file mode 100644 index 0000000..5cf2935 --- /dev/null +++ b/sources/resources/transliteration-data/x0e.php @@ -0,0 +1,20 @@ + NULL, 'k', 'kh', 'kh', 'kh', 'kh', 'kh', 'ng', 'cch', 'ch', 'ch', 'ch', 'ch', 'y', 'd', 't', + 0x10 => 'th', 'th', 'th', 'n', 'd', 't', 'th', 'th', 'th', 'n', 'b', 'p', 'ph', 'f', 'ph', 'f', + 0x20 => 'ph', 'm', 'y', 'r', 'R', 'l', 'L', 'w', 's', 's', 's', 'h', 'l', '`', 'h', '~', + 0x30 => 'a', 'a', 'aa', 'am', 'i', 'ii', 'ue', 'uue', 'u', 'uu', '\'', NULL, NULL, NULL, NULL, 'Bh.', + 0x40 => 'e', 'ae', 'o', 'ai', 'ai', 'ao', '+', '', '', '', '', '', '', 'M', '', ' * ', + 0x50 => '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' // ', ' /// ', NULL, NULL, NULL, NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, 'k', 'kh', NULL, 'kh', NULL, NULL, 'ng', 'ch', NULL, 's', NULL, NULL, 'ny', NULL, NULL, + 0x90 => NULL, NULL, NULL, NULL, 'd', 'h', 'th', 'th', NULL, 'n', 'b', 'p', 'ph', 'f', 'ph', 'f', + 0xA0 => NULL, 'm', 'y', 'r', NULL, 'l', NULL, 'w', NULL, NULL, 's', 'h', NULL, '`', '', '~', + 0xB0 => 'a', '', 'aa', 'am', 'i', 'ii', 'y', 'yy', 'u', 'uu', NULL, 'o', 'l', 'ny', NULL, NULL, + 0xC0 => 'e', 'ei', 'o', 'ay', 'ai', NULL, '+', NULL, '', '', '', '', '', 'M', NULL, NULL, + 0xD0 => '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', NULL, NULL, 'hn', 'hm', NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x0f.php b/sources/resources/transliteration-data/x0f.php new file mode 100644 index 0000000..964ce04 --- /dev/null +++ b/sources/resources/transliteration-data/x0f.php @@ -0,0 +1,20 @@ + 'AUM', '', '', '', '', '', '', '', ' // ', ' * ', '', '-', ' / ', ' / ', ' // ', ' -/ ', + 0x10 => ' +/ ', ' X/ ', ' /XX/ ', ' /X/ ', ',', '', '', '', '', '', '', '', '', '', '', '', + 0x20 => '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.5', '1.5', '2.5', '3.5', '4.5', '5.5', + 0x30 => '6.5', '7.5', '8.5', '-.5', '+', '*', '^', '_', '', '~', NULL, ']', '[[', ']]', '', '', + 0x40 => 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', NULL, 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', + 0x50 => 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'ts', 'tsh', 'dz', 'dzh', 'w', 'zh', 'z', + 0x60 => '\'', 'y', 'r', 'l', 'sh', 'ssh', 's', 'h', 'a', 'kss', 'r', NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, 'aa', 'i', 'ii', 'u', 'uu', 'R', 'RR', 'L', 'LL', 'e', 'ee', 'o', 'oo', 'M', 'H', + 0x80 => 'i', 'ii', '', '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, + 0x90 => 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', NULL, 'ny', 'tt', 'tth', 'dd', 'ddh', 'nn', 't', + 0xA0 => 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'ts', 'tsh', 'dz', 'dzh', 'w', 'zh', 'z', + 0xB0 => '\'', 'y', 'r', 'l', 'sh', 'ss', 's', 'h', 'a', 'kss', 'w', 'y', 'r', NULL, 'X', ' :X: ', + 0xC0 => ' /O/ ', ' /o/ ', ' \\o\\ ', ' (O) ', '', '', '', '', '', '', '', '', '', NULL, NULL, '', + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x10.php b/sources/resources/transliteration-data/x10.php new file mode 100644 index 0000000..fd64a33 --- /dev/null +++ b/sources/resources/transliteration-data/x10.php @@ -0,0 +1,20 @@ + 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 'nny', 'tt', 'tth', 'dd', 'ddh', 'nn', + 0x10 => 'tt', 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'l', 'w', 's', 'h', + 0x20 => 'll', 'a', NULL, 'i', 'ii', 'u', 'uu', 'e', NULL, 'o', 'au', NULL, 'aa', 'i', 'ii', 'u', + 0x30 => 'uu', 'e', 'ai', NULL, NULL, NULL, 'N', '\'', ':', '', NULL, NULL, NULL, NULL, NULL, NULL, + 0x40 => '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' / ', ' // ', 'n*', 'r*', 'l*', 'e*', + 0x50 => 'sh', 'ss', 'R', 'RR', 'L', 'LL', 'R', 'RR', 'L', 'LL', NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x90 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xA0 => 'A', 'B', 'G', 'D', 'E', 'V', 'Z', 'T`', 'I', 'K', 'L', 'M', 'N', 'O', 'P', 'Zh', + 0xB0 => 'R', 'S', 'T', 'U', 'P`', 'K`', 'G\'', 'Q', 'Sh', 'Ch`', 'C`', 'Z\'', 'C', 'Ch', 'X', 'J', + 0xC0 => 'H', 'E', 'Y', 'W', 'Xh', 'OE', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => 'a', 'b', 'g', 'd', 'e', 'v', 'z', 't`', 'i', 'k', 'l', 'm', 'n', 'o', 'p', 'zh', + 0xE0 => 'r', 's', 't', 'u', 'p`', 'k`', 'g\'', 'q', 'sh', 'ch`', 'c`', 'z\'', 'c', 'ch', 'x', 'j', + 0xF0 => 'h', 'e', 'y', 'w', 'xh', 'oe', 'f', NULL, NULL, NULL, NULL, ' // ', NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x11.php b/sources/resources/transliteration-data/x11.php new file mode 100644 index 0000000..4edf2aa --- /dev/null +++ b/sources/resources/transliteration-data/x11.php @@ -0,0 +1,20 @@ + 'g', 'gg', 'n', 'd', 'dd', 'r', 'm', 'b', 'bb', 's', 'ss', '', 'j', 'jj', 'c', 'k', + 0x10 => 't', 'p', 'h', 'ng', 'nn', 'nd', 'nb', 'dg', 'rn', 'rr', 'rh', 'rN', 'mb', 'mN', 'bg', 'bn', + 0x20 => '', 'bs', 'bsg', 'bst', 'bsb', 'bss', 'bsj', 'bj', 'bc', 'bt', 'bp', 'bN', 'bbN', 'sg', 'sn', 'sd', + 0x30 => 'sr', 'sm', 'sb', 'sbg', 'sss', 's', 'sj', 'sc', 'sk', 'st', 'sp', 'sh', '', '', '', '', + 0x40 => 'Z', 'g', 'd', 'm', 'b', 's', 'Z', '', 'j', 'c', 't', 'p', 'N', 'j', '', '', + 0x50 => '', '', 'ck', 'ch', '', '', 'pb', 'pN', 'hh', 'Q', NULL, NULL, NULL, NULL, NULL, '', + 0x60 => '', 'a', 'ae', 'ya', 'yae', 'eo', 'e', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', 'yo', 'u', 'weo', + 0x70 => 'we', 'wi', 'yu', 'eu', 'yi', 'i', 'a-o', 'a-u', 'ya-o', 'ya-yo', 'eo-o', 'eo-u', 'eo-eu', 'yeo-o', 'yeo-u', 'o-eo', + 0x80 => 'o-e', 'o-ye', 'o-o', 'o-u', 'yo-ya', 'yo-yae', 'yo-yeo', 'yo-o', 'yo-i', 'u-a', 'u-ae', 'u-eo-eu', 'u-ye', 'u-u', 'yu-a', 'yu-eo', + 0x90 => 'yu-e', 'yu-yeo', 'yu-ye', 'yu-u', 'yu-i', 'eu-u', 'eu-eu', 'yi-u', 'i-a', 'i-ya', 'i-o', 'i-u', 'i-eu', 'i-U', 'U', 'U-eo', + 0xA0 => 'U-u', 'U-i', 'UU', NULL, NULL, NULL, NULL, NULL, 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'l', + 0xB0 => 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', 'lh', 'm', 'b', 'bs', 's', 'ss', 'ng', 'j', 'c', 'k', + 0xC0 => 't', 'p', 'h', 'gl', 'gsg', 'ng', 'nd', 'ns', 'nZ', 'nt', 'dg', 'tl', 'lgs', 'ln', 'ld', 'lth', + 0xD0 => 'll', 'lmg', 'lms', 'lbs', 'lbh', 'rNp', 'lss', 'lZ', 'lk', 'lQ', 'mg', 'ml', 'mb', 'ms', 'mss', 'mZ', + 0xE0 => 'mc', 'mh', 'mN', 'bl', 'bp', 'ph', 'pN', 'sg', 'sd', 'sl', 'sb', 'Z', 'g', 'ss', '', 'kh', + 0xF0 => 'N', 'Ns', 'NZ', 'pb', 'pN', 'hn', 'hl', 'hm', 'hb', 'Q', NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x12.php b/sources/resources/transliteration-data/x12.php new file mode 100644 index 0000000..5bccba9 --- /dev/null +++ b/sources/resources/transliteration-data/x12.php @@ -0,0 +1,20 @@ + 'ha', 'hu', 'hi', 'haa', 'hee', 'he', 'ho', NULL, 'la', 'lu', 'li', 'laa', 'lee', 'le', 'lo', 'lwa', + 0x10 => 'hha', 'hhu', 'hhi', 'hhaa', 'hhee', 'hhe', 'hho', 'hhwa', 'ma', 'mu', 'mi', 'maa', 'mee', 'me', 'mo', 'mwa', + 0x20 => 'sza', 'szu', 'szi', 'szaa', 'szee', 'sze', 'szo', 'szwa', 'ra', 'ru', 'ri', 'raa', 'ree', 're', 'ro', 'rwa', + 0x30 => 'sa', 'su', 'si', 'saa', 'see', 'se', 'so', 'swa', 'sha', 'shu', 'shi', 'shaa', 'shee', 'she', 'sho', 'shwa', + 0x40 => 'qa', 'qu', 'qi', 'qaa', 'qee', 'qe', 'qo', NULL, 'qwa', NULL, 'qwi', 'qwaa', 'qwee', 'qwe', NULL, NULL, + 0x50 => 'qha', 'qhu', 'qhi', 'qhaa', 'qhee', 'qhe', 'qho', NULL, 'qhwa', NULL, 'qhwi', 'qhwaa', 'qhwee', 'qhwe', NULL, NULL, + 0x60 => 'ba', 'bu', 'bi', 'baa', 'bee', 'be', 'bo', 'bwa', 'va', 'vu', 'vi', 'vaa', 'vee', 've', 'vo', 'vwa', + 0x70 => 'ta', 'tu', 'ti', 'taa', 'tee', 'te', 'to', 'twa', 'ca', 'cu', 'ci', 'caa', 'cee', 'ce', 'co', 'cwa', + 0x80 => 'xa', 'xu', 'xi', 'xaa', 'xee', 'xe', 'xo', NULL, 'xwa', NULL, 'xwi', 'xwaa', 'xwee', 'xwe', NULL, NULL, + 0x90 => 'na', 'nu', 'ni', 'naa', 'nee', 'ne', 'no', 'nwa', 'nya', 'nyu', 'nyi', 'nyaa', 'nyee', 'nye', 'nyo', 'nywa', + 0xA0 => '\'a', '\'u', NULL, '\'aa', '\'ee', '\'e', '\'o', '\'wa', 'ka', 'ku', 'ki', 'kaa', 'kee', 'ke', 'ko', NULL, + 0xB0 => 'kwa', NULL, 'kwi', 'kwaa', 'kwee', 'kwe', NULL, NULL, 'kxa', 'kxu', 'kxi', 'kxaa', 'kxee', 'kxe', 'kxo', NULL, + 0xC0 => 'kxwa', NULL, 'kxwi', 'kxwaa', 'kxwee', 'kxwe', NULL, NULL, 'wa', 'wu', 'wi', 'waa', 'wee', 'we', 'wo', NULL, + 0xD0 => '`a', '`u', '`i', '`aa', '`ee', '`e', '`o', NULL, 'za', 'zu', 'zi', 'zaa', 'zee', 'ze', 'zo', 'zwa', + 0xE0 => 'zha', 'zhu', 'zhi', 'zhaa', 'zhee', 'zhe', 'zho', 'zhwa', 'ya', 'yu', 'yi', 'yaa', 'yee', 'ye', 'yo', NULL, + 0xF0 => 'da', 'du', 'di', 'daa', 'dee', 'de', 'do', 'dwa', 'dda', 'ddu', 'ddi', 'ddaa', 'ddee', 'dde', 'ddo', 'ddwa', +); diff --git a/sources/resources/transliteration-data/x13.php b/sources/resources/transliteration-data/x13.php new file mode 100644 index 0000000..6b4d526 --- /dev/null +++ b/sources/resources/transliteration-data/x13.php @@ -0,0 +1,20 @@ + 'ja', 'ju', 'ji', 'jaa', 'jee', 'je', 'jo', 'jwa', 'ga', 'gu', 'gi', 'gaa', 'gee', 'ge', 'go', NULL, + 0x10 => 'gwa', NULL, 'gwi', 'gwaa', 'gwee', 'gwe', NULL, NULL, 'gga', 'ggu', 'ggi', 'ggaa', 'ggee', 'gge', 'ggo', NULL, + 0x20 => 'tha', 'thu', 'thi', 'thaa', 'thee', 'the', 'tho', 'thwa', 'cha', 'chu', 'chi', 'chaa', 'chee', 'che', 'cho', 'chwa', + 0x30 => 'pha', 'phu', 'phi', 'phaa', 'phee', 'phe', 'pho', 'phwa', 'tsa', 'tsu', 'tsi', 'tsaa', 'tsee', 'tse', 'tso', 'tswa', + 0x40 => 'tza', 'tzu', 'tzi', 'tzaa', 'tzee', 'tze', 'tzo', NULL, 'fa', 'fu', 'fi', 'faa', 'fee', 'fe', 'fo', 'fwa', + 0x50 => 'pa', 'pu', 'pi', 'paa', 'pee', 'pe', 'po', 'pwa', 'rya', 'mya', 'fya', NULL, NULL, NULL, NULL, NULL, + 0x60 => NULL, ' ', '.', ',', ';', ':', ':: ', '?', '//', '1', '2', '3', '4', '5', '6', '7', + 0x70 => '8', '9', '10+', '20+', '30+', '40+', '50+', '60+', '70+', '80+', '90+', '100+', '10,000+', NULL, NULL, NULL, + 0x80 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x90 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xA0 => 'a', 'e', 'i', 'o', 'u', 'v', 'ga', 'ka', 'ge', 'gi', 'go', 'gu', 'gv', 'ha', 'he', 'hi', + 0xB0 => 'ho', 'hu', 'hv', 'la', 'le', 'li', 'lo', 'lu', 'lv', 'ma', 'me', 'mi', 'mo', 'mu', 'na', 'hna', + 0xC0 => 'nah', 'ne', 'ni', 'no', 'nu', 'nv', 'qua', 'que', 'qui', 'quo', 'quu', 'quv', 'sa', 's', 'se', 'si', + 0xD0 => 'so', 'su', 'sv', 'da', 'ta', 'de', 'te', 'di', 'ti', 'do', 'du', 'dv', 'dla', 'tla', 'tle', 'tli', + 0xE0 => 'tlo', 'tlu', 'tlv', 'tsa', 'tse', 'tsi', 'tso', 'tsu', 'tsv', 'wa', 'we', 'wi', 'wo', 'wu', 'wv', 'ya', + 0xF0 => 'ye', 'yi', 'yo', 'yu', 'yv', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x14.php b/sources/resources/transliteration-data/x14.php new file mode 100644 index 0000000..11b3ba6 --- /dev/null +++ b/sources/resources/transliteration-data/x14.php @@ -0,0 +1,20 @@ + NULL, 'ai', 'aai', 'i', 'ii', 'u', 'uu', 'oo', 'ee', 'i', 'a', 'aa', 'we', 'we', 'wi', 'wi', + 0x10 => 'wii', 'wii', 'wo', 'wo', 'woo', 'woo', 'woo', 'wa', 'wa', 'waa', 'waa', 'waa', 'ai', 'w', '\'', 't', + 0x20 => 'k', 'sh', 's', 'n', 'w', 'n', NULL, 'w', 'c', '?', 'l', 'en', 'in', 'on', 'an', 'pai', + 0x30 => 'paai', 'pi', 'pii', 'pu', 'puu', 'poo', 'hee', 'hi', 'pa', 'paa', 'pwe', 'pwe', 'pwi', 'pwi', 'pwii', 'pwii', + 0x40 => 'pwo', 'pwo', 'pwoo', 'pwoo', 'pwa', 'pwa', 'pwaa', 'pwaa', 'pwaa', 'p', 'p', 'h', 'tai', 'taai', 'ti', 'tii', + 0x50 => 'tu', 'tuu', 'too', 'dee', 'di', 'ta', 'taa', 'twe', 'twe', 'twi', 'twi', 'twii', 'twii', 'two', 'two', 'twoo', + 0x60 => 'twoo', 'twa', 'twa', 'twaa', 'twaa', 'twaa', 't', 'tte', 'tti', 'tto', 'tta', 'kai', 'kaai', 'ki', 'kii', 'ku', + 0x70 => 'kuu', 'koo', 'ka', 'kaa', 'kwe', 'kwe', 'kwi', 'kwi', 'kwii', 'kwii', 'kwo', 'kwo', 'kwoo', 'kwoo', 'kwa', 'kwa', + 0x80 => 'kwaa', 'kwaa', 'kwaa', 'k', 'kw', 'keh', 'kih', 'koh', 'kah', 'gai', 'caai', 'gi', 'gii', 'gu', 'guu', 'coo', + 0x90 => 'ga', 'gaa', 'cwe', 'cwe', 'cwi', 'cwi', 'cwii', 'cwii', 'cwo', 'cwo', 'cwoo', 'cwoo', 'cwa', 'cwa', 'cwaa', 'cwaa', + 0xA0 => 'cwaa', 'g', 'th', 'mai', 'maai', 'mi', 'mii', 'mu', 'muu', 'moo', 'ma', 'maa', 'mwe', 'mwe', 'mwi', 'mwi', + 0xB0 => 'mwii', 'mwii', 'mwo', 'mwo', 'mwoo', 'mwoo', 'mwa', 'mwa', 'mwaa', 'mwaa', 'mwaa', 'm', 'm', 'mh', 'm', 'm', + 0xC0 => 'nai', 'naai', 'ni', 'nii', 'nu', 'nuu', 'noo', 'na', 'naa', 'nwe', 'nwe', 'nwa', 'nwa', 'nwaa', 'nwaa', 'nwaa', + 0xD0 => 'n', 'ng', 'nh', 'lai', 'laai', 'li', 'lii', 'lu', 'luu', 'loo', 'la', 'laa', 'lwe', 'lwe', 'lwi', 'lwi', + 0xE0 => 'lwii', 'lwii', 'lwo', 'lwo', 'lwoo', 'lwoo', 'lwa', 'lwa', 'lwaa', 'lwaa', 'l', 'l', 'l', 'sai', 'saai', 'si', + 0xF0 => 'sii', 'su', 'suu', 'soo', 'sa', 'saa', 'swe', 'swe', 'swi', 'swi', 'swii', 'swii', 'swo', 'swo', 'swoo', 'swoo', +); diff --git a/sources/resources/transliteration-data/x15.php b/sources/resources/transliteration-data/x15.php new file mode 100644 index 0000000..f365b0e --- /dev/null +++ b/sources/resources/transliteration-data/x15.php @@ -0,0 +1,20 @@ + 'swa', 'swa', 'swaa', 'swaa', 'swaa', 's', 's', 'sw', 's', 'sk', 'skw', 'sW', 'spwa', 'stwa', 'skwa', 'scwa', + 0x10 => 'she', 'shi', 'shii', 'sho', 'shoo', 'sha', 'shaa', 'shwe', 'shwe', 'shwi', 'shwi', 'shwii', 'shwii', 'shwo', 'shwo', 'shwoo', + 0x20 => 'shwoo', 'shwa', 'shwa', 'shwaa', 'shwaa', 'sh', 'jai', 'yaai', 'ji', 'jii', 'ju', 'juu', 'yoo', 'ja', 'jaa', 'ywe', + 0x30 => 'ywe', 'ywi', 'ywi', 'ywii', 'ywii', 'ywo', 'ywo', 'ywoo', 'ywoo', 'ywa', 'ywa', 'ywaa', 'ywaa', 'ywaa', 'j', 'y', + 0x40 => 'y', 'yi', 're', 'rai', 'le', 'raai', 'ri', 'rii', 'ru', 'ruu', 'lo', 'ra', 'raa', 'la', 'rwaa', 'rwaa', + 0x50 => 'r', 'r', 'r', 'vai', 'faai', 'vi', 'vii', 'vu', 'vuu', 'va', 'vaa', 'fwaa', 'fwaa', 'v', 'the', 'the', + 0x60 => 'thi', 'thi', 'thii', 'thii', 'tho', 'thoo', 'tha', 'thaa', 'thwaa', 'thwaa', 'th', 'tthe', 'tthi', 'ttho', 'ttha', 'tth', + 0x70 => 'tye', 'tyi', 'tyo', 'tya', 'he', 'hi', 'hii', 'ho', 'hoo', 'ha', 'haa', 'h', 'h', 'hk', 'qaai', 'qi', + 0x80 => 'qii', 'qu', 'quu', 'qa', 'qaa', 'q', 'tlhe', 'tlhi', 'tlho', 'tlha', 're', 'ri', 'ro', 'ra', 'ngaai', 'ngi', + 0x90 => 'ngii', 'ngu', 'nguu', 'nga', 'ngaa', 'ng', 'nng', 'she', 'shi', 'sho', 'sha', 'the', 'thi', 'tho', 'tha', 'th', + 0xA0 => 'lhi', 'lhii', 'lho', 'lhoo', 'lha', 'lhaa', 'lh', 'the', 'thi', 'thii', 'tho', 'thoo', 'tha', 'thaa', 'th', 'b', + 0xB0 => 'e', 'i', 'o', 'a', 'we', 'wi', 'wo', 'wa', 'ne', 'ni', 'no', 'na', 'ke', 'ki', 'ko', 'ka', + 0xC0 => 'he', 'hi', 'ho', 'ha', 'ghu', 'gho', 'ghe', 'ghee', 'ghi', 'gha', 'ru', 'ro', 're', 'ree', 'ri', 'ra', + 0xD0 => 'wu', 'wo', 'we', 'wee', 'wi', 'wa', 'hwu', 'hwo', 'hwe', 'hwee', 'hwi', 'hwa', 'thu', 'tho', 'the', 'thee', + 0xE0 => 'thi', 'tha', 'ttu', 'tto', 'tte', 'ttee', 'tti', 'tta', 'pu', 'po', 'pe', 'pee', 'pi', 'pa', 'p', 'gu', + 0xF0 => 'go', 'ge', 'gee', 'gi', 'ga', 'khu', 'kho', 'khe', 'khee', 'khi', 'kha', 'kku', 'kko', 'kke', 'kkee', 'kki', +); diff --git a/sources/resources/transliteration-data/x16.php b/sources/resources/transliteration-data/x16.php new file mode 100644 index 0000000..78f0432 --- /dev/null +++ b/sources/resources/transliteration-data/x16.php @@ -0,0 +1,20 @@ + 'kka', 'kk', 'nu', 'no', 'ne', 'nee', 'ni', 'na', 'mu', 'mo', 'me', 'mee', 'mi', 'ma', 'yu', 'yo', + 0x10 => 'ye', 'yee', 'yi', 'ya', 'ju', 'ju', 'jo', 'je', 'jee', 'ji', 'ji', 'ja', 'jju', 'jjo', 'jje', 'jjee', + 0x20 => 'jji', 'jja', 'lu', 'lo', 'le', 'lee', 'li', 'la', 'dlu', 'dlo', 'dle', 'dlee', 'dli', 'dla', 'lhu', 'lho', + 0x30 => 'lhe', 'lhee', 'lhi', 'lha', 'tlhu', 'tlho', 'tlhe', 'tlhee', 'tlhi', 'tlha', 'tlu', 'tlo', 'tle', 'tlee', 'tli', 'tla', + 0x40 => 'zu', 'zo', 'ze', 'zee', 'zi', 'za', 'z', 'z', 'dzu', 'dzo', 'dze', 'dzee', 'dzi', 'dza', 'su', 'so', + 0x50 => 'se', 'see', 'si', 'sa', 'shu', 'sho', 'she', 'shee', 'shi', 'sha', 'sh', 'tsu', 'tso', 'tse', 'tsee', 'tsi', + 0x60 => 'tsa', 'chu', 'cho', 'che', 'chee', 'chi', 'cha', 'ttsu', 'ttso', 'ttse', 'ttsee', 'ttsi', 'ttsa', 'X', '.', 'qai', + 0x70 => 'ngai', 'nngi', 'nngii', 'nngo', 'nngoo', 'nnga', 'nngaa', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => ' ', 'b', 'l', 'f', 's', 'n', 'h', 'd', 't', 'c', 'q', 'm', 'g', 'ng', 'z', 'r', + 0x90 => 'a', 'o', 'u', 'e', 'i', 'ch', 'th', 'ph', 'p', 'x', 'p', '<', '>', NULL, NULL, NULL, + 0xA0 => 'f', 'v', 'u', 'yr', 'y', 'w', 'th', 'th', 'a', 'o', 'ac', 'ae', 'o', 'o', 'o', 'oe', + 0xB0 => 'on', 'r', 'k', 'c', 'k', 'g', 'ng', 'g', 'g', 'w', 'h', 'h', 'h', 'h', 'n', 'n', + 0xC0 => 'n', 'i', 'e', 'j', 'g', 'ae', 'a', 'eo', 'p', 'z', 's', 's', 's', 'c', 'z', 't', + 0xD0 => 't', 'd', 'b', 'b', 'p', 'p', 'e', 'm', 'm', 'm', 'l', 'l', 'ng', 'ng', 'd', 'o', + 0xE0 => 'ear', 'ior', 'qu', 'qu', 'qu', 's', 'yr', 'yr', 'yr', 'q', 'x', '.', ':', '+', '17', '18', + 0xF0 => '19', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x17.php b/sources/resources/transliteration-data/x17.php new file mode 100644 index 0000000..23a2d74 --- /dev/null +++ b/sources/resources/transliteration-data/x17.php @@ -0,0 +1,20 @@ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x10 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x20 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x30 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x40 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => 'k', 'kh', 'g', 'gh', 'ng', 'c', 'ch', 'j', 'jh', 'ny', 't', 'tth', 'd', 'ddh', 'nn', 't', + 0x90 => 'th', 'd', 'dh', 'n', 'p', 'ph', 'b', 'bh', 'm', 'y', 'r', 'l', 'v', 'sh', 'ss', 's', + 0xA0 => 'h', 'l', 'q', 'a', 'aa', 'i', 'ii', 'u', 'uk', 'uu', 'uuv', 'ry', 'ryy', 'ly', 'lyy', 'e', + 0xB0 => 'ai', 'oo', 'oo', 'au', 'a', 'aa', 'aa', 'i', 'ii', 'y', 'yy', 'u', 'uu', 'ua', 'oe', 'ya', + 0xC0 => 'ie', 'e', 'ae', 'ai', 'oo', 'au', 'M', 'H', 'a`', '', '', '', 'r', '', '!', '', + 0xD0 => '', '', '', '', '.', ' // ', ':', '+', '++', ' * ', ' /// ', 'KR', '\'', NULL, NULL, NULL, + 0xE0 => '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x18.php b/sources/resources/transliteration-data/x18.php new file mode 100644 index 0000000..b6863fd --- /dev/null +++ b/sources/resources/transliteration-data/x18.php @@ -0,0 +1,20 @@ + ' @ ', ' ... ', ',', '. ', ': ', ' // ', '', '-', ',', '. ', '', '', '', '', '', NULL, + 0x10 => '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', NULL, NULL, NULL, NULL, NULL, NULL, + 0x20 => 'a', 'e', 'i', 'o', 'u', 'O', 'U', 'ee', 'n', 'ng', 'b', 'p', 'q', 'g', 'm', 'l', + 0x30 => 's', 'sh', 't', 'd', 'ch', 'j', 'y', 'r', 'w', 'f', 'k', 'kha', 'ts', 'z', 'h', 'zr', + 0x40 => 'lh', 'zh', 'ch', '-', 'e', 'i', 'o', 'u', 'O', 'U', 'ng', 'b', 'p', 'q', 'g', 'm', + 0x50 => 't', 'd', 'ch', 'j', 'ts', 'y', 'w', 'k', 'g', 'h', 'jy', 'ny', 'dz', 'e', 'i', 'iy', + 0x60 => 'U', 'u', 'ng', 'k', 'g', 'h', 'p', 'sh', 't', 'd', 'j', 'f', 'g', 'h', 'ts', 'z', + 0x70 => 'r', 'ch', 'zh', 'i', 'k', 'r', 'f', 'zh', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, 'H', 'X', 'W', 'M', ' 3 ', ' 333 ', 'a', 'i', 'k', 'ng', 'c', 'tt', 'tth', 'dd', 'nn', + 0x90 => 't', 'd', 'p', 'ph', 'ss', 'zh', 'z', 'a', 't', 'zh', 'gh', 'ng', 'c', 'jh', 'tta', 'ddh', + 0xA0 => 't', 'dh', 'ss', 'cy', 'zh', 'z', 'u', 'y', 'bh', '\'', NULL, NULL, NULL, NULL, NULL, NULL, + 0xB0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x1e.php b/sources/resources/transliteration-data/x1e.php new file mode 100644 index 0000000..a9efdcf --- /dev/null +++ b/sources/resources/transliteration-data/x1e.php @@ -0,0 +1,20 @@ + 'A', 'a', 'B', 'b', 'B', 'b', 'B', 'b', 'C', 'c', 'D', 'd', 'D', 'd', 'D', 'd', + 0x10 => 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'F', 'f', + 0x20 => 'G', 'g', 'H', 'h', 'H', 'h', 'H', 'h', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', + 0x30 => 'K', 'k', 'K', 'k', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'M', 'm', + 0x40 => 'M', 'm', 'M', 'm', 'N', 'n', 'N', 'n', 'N', 'n', 'N', 'n', 'O', 'o', 'O', 'o', + 0x50 => 'O', 'o', 'O', 'o', 'P', 'p', 'P', 'p', 'R', 'r', 'R', 'r', 'R', 'r', 'R', 'r', + 0x60 => 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', + 0x70 => 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'V', 'v', 'V', 'v', + 0x80 => 'W', 'w', 'W', 'w', 'W', 'w', 'W', 'w', 'W', 'w', 'X', 'x', 'X', 'x', 'Y', 'y', + 0x90 => 'Z', 'z', 'Z', 'z', 'Z', 'z', 'h', 't', 'w', 'y', 'a', 'S', NULL, NULL, NULL, NULL, + 0xA0 => 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', + 0xB0 => 'A', 'a', 'A', 'a', 'A', 'a', 'A', 'a', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', + 0xC0 => 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'I', 'i', 'I', 'i', 'O', 'o', 'O', 'o', + 0xD0 => 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', 'O', 'o', + 0xE0 => 'O', 'o', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', + 0xF0 => 'U', 'u', 'Y', 'y', 'Y', 'y', 'Y', 'y', 'Y', 'y', NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x1f.php b/sources/resources/transliteration-data/x1f.php new file mode 100644 index 0000000..d90e48a --- /dev/null +++ b/sources/resources/transliteration-data/x1f.php @@ -0,0 +1,20 @@ + 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 0x10 => 'e', 'e', 'e', 'e', 'e', 'e', NULL, NULL, 'E', 'E', 'E', 'E', 'E', 'E', NULL, NULL, + 0x20 => 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', + 0x30 => 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'i', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I', + 0x40 => 'o', 'o', 'o', 'o', 'o', 'o', NULL, NULL, 'O', 'O', 'O', 'O', 'O', 'O', NULL, NULL, + 0x50 => 'u', 'u', 'u', 'u', 'u', 'u', 'u', 'u', NULL, 'U', NULL, 'U', NULL, 'U', NULL, 'U', + 0x60 => 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', + 0x70 => 'a', 'a', 'e', 'e', 'e', 'e', 'i', 'i', 'o', 'o', 'u', 'u', 'o', 'o', NULL, NULL, + 0x80 => 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', + 0x90 => 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'e', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', + 0xA0 => 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', + 0xB0 => 'a', 'a', 'a', 'a', 'a', NULL, 'a', 'a', 'A', 'A', 'A', 'A', 'A', '\'', 'i', '\'', + 0xC0 => '~', '"~', 'e', 'e', 'e', NULL, 'e', 'e', 'E', 'E', 'E', 'E', 'E', '\'`', '\'\'', '\'~', + 0xD0 => 'i', 'i', 'i', 'i', NULL, NULL, 'i', 'i', 'I', 'I', 'I', 'I', NULL, '`\'', '`\'', '`~', + 0xE0 => 'u', 'u', 'u', 'u', 'R', 'R', 'u', 'u', 'U', 'U', 'U', 'U', 'R', '"`', '"\'', '`', + 0xF0 => NULL, NULL, 'o', 'o', 'o', NULL, 'o', 'o', 'O', 'O', 'O', 'O', 'O', '\'', '`', NULL, +); diff --git a/sources/resources/transliteration-data/x20.php b/sources/resources/transliteration-data/x20.php new file mode 100644 index 0000000..b21e909 --- /dev/null +++ b/sources/resources/transliteration-data/x20.php @@ -0,0 +1,23 @@ + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', '', '', + 0x10 => '-', '-', '-', '-', '--', '--', '||', '_', '\'', '\'', ',', '\'', '"', '"', ',,', '"', + 0x20 => '+', '++', '*', '*>', '.', '..', '...', '.', ' +', ' + +', '', '', '', '', '', ' ', + 0x30 => '%0', '%00', '\'', '\'\'', '\'\'\'', '`', '``', '```', '^', '<', '>', '*', '!!', '!?', '-', '_', + 0x40 => '-', '^', '***', '--', '/', '-[', ']-', NULL, '?!', '!?', '7', 'PP', '(]', '[)', NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '', '', '', '', '', '', + 0x70 => '0', '', '', '', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', 'n', + 0x80 => '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '-', '=', '(', ')', NULL, + 0x90 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xA0 => 'ECU', 'CL', 'Cr', 'FF', 'L', 'mil', 'N', 'Pts', 'Rs', 'W', 'NS', 'D', 'EU', 'K', 'T', 'Dr', + 0xB0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xE0 => '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x21.php b/sources/resources/transliteration-data/x21.php new file mode 100644 index 0000000..6db627a --- /dev/null +++ b/sources/resources/transliteration-data/x21.php @@ -0,0 +1,20 @@ + '', '', 'C', '', '', '', '', '', '', '', 'g', 'H', 'H', 'H', 'h', '', + 0x10 => 'I', 'I', 'L', 'l', 'lb', 'N', 'no', '(p)', 'P', 'P', 'Q', 'R', 'R', 'R', '', '', + 0x20 => '(sm)', '(tel)', '(tm)', '', 'Z', '', NULL, 'mho', 'Z', '', NULL, NULL, 'B', 'C', 'e', 'e', + 0x30 => '', 'F', NULL, 'M', 'o', '', '', '', '', 'i', 'Q', '(fax)', 'pi', '', '', 'Pi', + 0x40 => '', 'G', 'L', 'L', 'Y', 'D', 'd', 'e', 'i', 'j', '', '', 'per', '', NULL, NULL, + 0x50 => NULL, NULL, NULL, ' 1/3 ', ' 2/3 ', ' 1/5 ', ' 2/5 ', ' 3/5 ', ' 4/5 ', ' 1/6 ', ' 5/6 ', ' 1/8 ', ' 3/8 ', ' 5/8 ', ' 7/8 ', ' 1/', + 0x60 => 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII', 'L', 'C', 'D', 'M', + 0x70 => 'i', 'ii', 'iii', 'iv', 'v', 'vi', 'vii', 'viii', 'ix', 'x', 'xi', 'xii', 'l', 'c', 'd', 'm', + 0x80 => '(D', 'D)', '((|))', ')', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x90 => '-', '|', '-', '|', '-', '|', '\\', '/', '\\', '/', '-', '-', '~', '~', '-', '|', + 0xA0 => '-', '|', '-', '-', '-', '|', '-', '|', '|', '-', '-', '-', '-', '-', '-', '|', + 0xB0 => '|', '|', '|', '|', '|', '|', '^', 'V', '\\', '=', 'V', '^', '-', '-', '|', '|', + 0xC0 => '-', '-', '|', '|', '=', '|', '=', '=', '|', '=', '|', '=', '=', '=', '=', '=', + 0xD0 => '=', '|', '=', '|', '=', '|', '\\', '/', '\\', '/', '=', '=', '~', '~', '|', '|', + 0xE0 => '-', '|', '-', '|', '-', '-', '-', '|', '-', '|', '|', '|', '|', '|', '|', '|', + 0xF0 => '-', '\\', '\\', '|', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x22.php b/sources/resources/transliteration-data/x22.php new file mode 100644 index 0000000..5db61e0 --- /dev/null +++ b/sources/resources/transliteration-data/x22.php @@ -0,0 +1,20 @@ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x10 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x20 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x30 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x40 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x90 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xA0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xB0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x23.php b/sources/resources/transliteration-data/x23.php new file mode 100644 index 0000000..5db61e0 --- /dev/null +++ b/sources/resources/transliteration-data/x23.php @@ -0,0 +1,20 @@ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x10 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x20 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x30 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x40 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x90 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xA0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xB0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x24.php b/sources/resources/transliteration-data/x24.php new file mode 100644 index 0000000..8f0a865 --- /dev/null +++ b/sources/resources/transliteration-data/x24.php @@ -0,0 +1,20 @@ + '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x10 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x20 => '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x30 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x40 => '', '', '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x70 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x80 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x90 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xA0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xB0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xC0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xD0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xE0 => '', '', '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x25.php b/sources/resources/transliteration-data/x25.php new file mode 100644 index 0000000..7d0dc01 --- /dev/null +++ b/sources/resources/transliteration-data/x25.php @@ -0,0 +1,20 @@ + '-', '-', '|', '|', '-', '-', '|', '|', '-', '-', '|', '|', '+', '+', '+', '+', + 0x10 => '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', + 0x20 => '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', + 0x30 => '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', + 0x40 => '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '-', '-', '|', '|', + 0x50 => '-', '|', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', + 0x60 => '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', + 0x70 => '+', '/', '\\', 'X', '-', '|', '-', '|', '-', '|', '-', '|', '-', '|', '-', '|', + 0x80 => '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', + 0x90 => '#', '#', '#', '#', '-', '|', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xA0 => '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', + 0xB0 => '#', '#', '^', '^', '^', '^', '>', '>', '>', '>', '>', '>', 'V', 'V', 'V', 'V', + 0xC0 => '<', '<', '<', '<', '<', '<', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', + 0xD0 => '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', + 0xE0 => '*', '*', '*', '*', '*', '*', '*', '#', '#', '#', '#', '#', '^', '^', '^', 'O', + 0xF0 => '#', '#', '#', '#', '#', '#', '#', '#', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x26.php b/sources/resources/transliteration-data/x26.php new file mode 100644 index 0000000..30e3e72 --- /dev/null +++ b/sources/resources/transliteration-data/x26.php @@ -0,0 +1,20 @@ + '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x10 => '', '', '', '', NULL, NULL, NULL, NULL, NULL, '', '', '', '', '', '', '', + 0x20 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x30 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x40 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x50 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x60 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x70 => '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x90 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xA0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xB0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x27.php b/sources/resources/transliteration-data/x27.php new file mode 100644 index 0000000..7039171 --- /dev/null +++ b/sources/resources/transliteration-data/x27.php @@ -0,0 +1,20 @@ + NULL, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x10 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x20 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x30 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x40 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x50 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', NULL, + 0x60 => NULL, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x70 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x80 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x90 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xA0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xB0 => NULL, '', '', '', '', '', '', '', '', '', '', '', '', '', '', NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x28.php b/sources/resources/transliteration-data/x28.php new file mode 100644 index 0000000..800657b --- /dev/null +++ b/sources/resources/transliteration-data/x28.php @@ -0,0 +1,20 @@ + ' ', 'a', '1', 'b', '\'', 'k', '2', 'l', '@', 'c', 'i', 'f', '/', 'm', 's', 'p', + 0x10 => '"', 'e', '3', 'h', '9', 'o', '6', 'r', '^', 'd', 'j', 'g', '>', 'n', 't', 'q', + 0x20 => ',', '*', '5', '<', '-', 'u', '8', 'v', '.', '%', '[', '$', '+', 'x', '!', '&', + 0x30 => ';', ':', '4', '\\', '0', 'z', '7', '(', '_', '?', 'w', ']', '#', 'y', ')', '=', + 0x40 => '[d7]', '[d17]', '[d27]', '[d127]', '[d37]', '[d137]', '[d237]', '[d1237]', '[d47]', '[d147]', '[d247]', '[d1247]', '[d347]', '[d1347]', '[d2347]', '[d12347]', + 0x50 => '[d57]', '[d157]', '[d257]', '[d1257]', '[d357]', '[d1357]', '[d2357]', '[d12357]', '[d457]', '[d1457]', '[d2457]', '[d12457]', '[d3457]', '[d13457]', '[d23457]', '[d123457]', + 0x60 => '[d67]', '[d167]', '[d267]', '[d1267]', '[d367]', '[d1367]', '[d2367]', '[d12367]', '[d467]', '[d1467]', '[d2467]', '[d12467]', '[d3467]', '[d13467]', '[d23467]', '[d123467]', + 0x70 => '[d567]', '[d1567]', '[d2567]', '[d12567]', '[d3567]', '[d13567]', '[d23567]', '[d123567]', '[d4567]', '[d14567]', '[d24567]', '[d124567]', '[d34567]', '[d134567]', '[d234567]', '[d1234567]', + 0x80 => '[d8]', '[d18]', '[d28]', '[d128]', '[d38]', '[d138]', '[d238]', '[d1238]', '[d48]', '[d148]', '[d248]', '[d1248]', '[d348]', '[d1348]', '[d2348]', '[d12348]', + 0x90 => '[d58]', '[d158]', '[d258]', '[d1258]', '[d358]', '[d1358]', '[d2358]', '[d12358]', '[d458]', '[d1458]', '[d2458]', '[d12458]', '[d3458]', '[d13458]', '[d23458]', '[d123458]', + 0xA0 => '[d68]', '[d168]', '[d268]', '[d1268]', '[d368]', '[d1368]', '[d2368]', '[d12368]', '[d468]', '[d1468]', '[d2468]', '[d12468]', '[d3468]', '[d13468]', '[d23468]', '[d123468]', + 0xB0 => '[d568]', '[d1568]', '[d2568]', '[d12568]', '[d3568]', '[d13568]', '[d23568]', '[d123568]', '[d4568]', '[d14568]', '[d24568]', '[d124568]', '[d34568]', '[d134568]', '[d234568]', '[d1234568]', + 0xC0 => '[d78]', '[d178]', '[d278]', '[d1278]', '[d378]', '[d1378]', '[d2378]', '[d12378]', '[d478]', '[d1478]', '[d2478]', '[d12478]', '[d3478]', '[d13478]', '[d23478]', '[d123478]', + 0xD0 => '[d578]', '[d1578]', '[d2578]', '[d12578]', '[d3578]', '[d13578]', '[d23578]', '[d123578]', '[d4578]', '[d14578]', '[d24578]', '[d124578]', '[d34578]', '[d134578]', '[d234578]', '[d1234578]', + 0xE0 => '[d678]', '[d1678]', '[d2678]', '[d12678]', '[d3678]', '[d13678]', '[d23678]', '[d123678]', '[d4678]', '[d14678]', '[d24678]', '[d124678]', '[d34678]', '[d134678]', '[d234678]', '[d1234678]', + 0xF0 => '[d5678]', '[d15678]', '[d25678]', '[d125678]', '[d35678]', '[d135678]', '[d235678]', '[d1235678]', '[d45678]', '[d145678]', '[d245678]', '[d1245678]', '[d345678]', '[d1345678]', '[d2345678]', '[d12345678]', +); diff --git a/sources/resources/transliteration-data/x2e.php b/sources/resources/transliteration-data/x2e.php new file mode 100644 index 0000000..5db61e0 --- /dev/null +++ b/sources/resources/transliteration-data/x2e.php @@ -0,0 +1,20 @@ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x10 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x20 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x30 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x40 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x90 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xA0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xB0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x2f.php b/sources/resources/transliteration-data/x2f.php new file mode 100644 index 0000000..5db61e0 --- /dev/null +++ b/sources/resources/transliteration-data/x2f.php @@ -0,0 +1,20 @@ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x10 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x20 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x30 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x40 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x90 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xA0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xB0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x30.php b/sources/resources/transliteration-data/x30.php new file mode 100644 index 0000000..c3b86bf --- /dev/null +++ b/sources/resources/transliteration-data/x30.php @@ -0,0 +1,20 @@ + ' ', ',', '. ', '"', '[JIS]', '"', '/', '0', '<', '> ', '<<', '>> ', '[', '] ', '{', '} ', + 0x10 => '[(', ')] ', '@', 'X ', '[', '] ', '[[', ']] ', '((', ')) ', '[[', ']] ', '~ ', '``', '\'\'', ',,', + 0x20 => '@', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '', '', '', '', '', + 0x30 => '~', '+', '+', '+', '+', '', '@', ' // ', '+10+', '+20+', '+30+', NULL, NULL, NULL, '', '', + 0x40 => NULL, 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', + 0x50 => 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'si', 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', + 0x60 => 'da', 'ti', 'di', 'tu', 'tu', 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', + 0x70 => 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', + 0x80 => 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', + 0x90 => 'wi', 'we', 'wo', 'n', 'vu', NULL, NULL, NULL, NULL, '', '', '', '', '"', '"', NULL, + 0xA0 => NULL, 'a', 'a', 'i', 'i', 'u', 'u', 'e', 'e', 'o', 'o', 'ka', 'ga', 'ki', 'gi', 'ku', + 0xB0 => 'gu', 'ke', 'ge', 'ko', 'go', 'sa', 'za', 'si', 'zi', 'su', 'zu', 'se', 'ze', 'so', 'zo', 'ta', + 0xC0 => 'da', 'ti', 'di', 'tu', 'tu', 'du', 'te', 'de', 'to', 'do', 'na', 'ni', 'nu', 'ne', 'no', 'ha', + 0xD0 => 'ba', 'pa', 'hi', 'bi', 'pi', 'hu', 'bu', 'pu', 'he', 'be', 'pe', 'ho', 'bo', 'po', 'ma', 'mi', + 0xE0 => 'mu', 'me', 'mo', 'ya', 'ya', 'yu', 'yu', 'yo', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wa', + 0xF0 => 'wi', 'we', 'wo', 'n', 'vu', 'ka', 'ke', 'va', 'vi', 've', 'vo', '', '', '"', '"', NULL, +); diff --git a/sources/resources/transliteration-data/x31.php b/sources/resources/transliteration-data/x31.php new file mode 100644 index 0000000..cbbdd52 --- /dev/null +++ b/sources/resources/transliteration-data/x31.php @@ -0,0 +1,20 @@ + NULL, NULL, NULL, NULL, NULL, 'B', 'P', 'M', 'F', 'D', 'T', 'N', 'L', 'G', 'K', 'H', + 0x10 => 'J', 'Q', 'X', 'ZH', 'CH', 'SH', 'R', 'Z', 'C', 'S', 'A', 'O', 'E', 'EH', 'AI', 'EI', + 0x20 => 'AU', 'OU', 'AN', 'EN', 'ANG', 'ENG', 'ER', 'I', 'U', 'IU', 'V', 'NG', 'GN', NULL, NULL, NULL, + 0x30 => NULL, 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'dd', 'r', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', + 0x40 => 'rh', 'm', 'b', 'bb', 'bs', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', 'a', + 0x50 => 'ae', 'ya', 'yae', 'eo', 'e', 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', 'yo', 'u', 'weo', 'we', 'wi', + 0x60 => 'yu', 'eu', 'yi', 'i', '', 'nn', 'nd', 'ns', 'nZ', 'lgs', 'ld', 'lbs', 'lZ', 'lQ', 'mb', 'ms', + 0x70 => 'mZ', 'mN', 'bg', '', 'bsg', 'bst', 'bj', 'bt', 'bN', 'bbN', 'sg', 'sn', 'sd', 'sb', 'sj', 'Z', + 0x80 => '', 'N', 'Ns', 'NZ', 'pN', 'hh', 'Q', 'yo-ya', 'yo-yae', 'yo-i', 'yu-yeo', 'yu-ye', 'yu-i', 'U', 'U-i', NULL, + 0x90 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xA0 => 'BU', 'ZI', 'JI', 'GU', 'EE', 'ENN', 'OO', 'ONN', 'IR', 'ANN', 'INN', 'UNN', 'IM', 'NGG', 'AINN', 'AUNN', + 0xB0 => 'AM', 'OM', 'ONG', 'INNN', 'P', 'T', 'K', 'H', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x32.php b/sources/resources/transliteration-data/x32.php new file mode 100644 index 0000000..239d482 --- /dev/null +++ b/sources/resources/transliteration-data/x32.php @@ -0,0 +1,20 @@ + '(g)', '(n)', '(d)', '(r)', '(m)', '(b)', '(s)', '()', '(j)', '(c)', '(k)', '(t)', '(p)', '(h)', '(ga)', '(na)', + 0x10 => '(da)', '(ra)', '(ma)', '(ba)', '(sa)', '(a)', '(ja)', '(ca)', '(ka)', '(ta)', '(pa)', '(ha)', '(ju)', NULL, NULL, NULL, + 0x20 => '(1) ', '(2) ', '(3) ', '(4) ', '(5) ', '(6) ', '(7) ', '(8) ', '(9) ', '(10) ', '(Yue) ', '(Huo) ', '(Shui) ', '(Mu) ', '(Jin) ', '(Tu) ', + 0x30 => '(Ri) ', '(Zhu) ', '(You) ', '(She) ', '(Ming) ', '(Te) ', '(Cai) ', '(Zhu) ', '(Lao) ', '(Dai) ', '(Hu) ', '(Xue) ', '(Jian) ', '(Qi) ', '(Zi) ', '(Xie) ', + 0x40 => '(Ji) ', '(Xiu) ', '<<', '>>', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => '(g)', '(n)', '(d)', '(r)', '(m)', '(b)', '(s)', '()', '(j)', '(c)', '(k)', '(t)', '(p)', '(h)', '(ga)', '(na)', + 0x70 => '(da)', '(ra)', '(ma)', '(ba)', '(sa)', '(a)', '(ja)', '(ca)', '(ka)', '(ta)', '(pa)', '(ha)', NULL, NULL, NULL, 'KIS ', + 0x80 => '(1) ', '(2) ', '(3) ', '(4) ', '(5) ', '(6) ', '(7) ', '(8) ', '(9) ', '(10) ', '(Yue) ', '(Huo) ', '(Shui) ', '(Mu) ', '(Jin) ', '(Tu) ', + 0x90 => '(Ri) ', '(Zhu) ', '(You) ', '(She) ', '(Ming) ', '(Te) ', '(Cai) ', '(Zhu) ', '(Lao) ', '(Mi) ', '(Nan) ', '(Nu) ', '(Shi) ', '(You) ', '(Yin) ', '(Zhu) ', + 0xA0 => '(Xiang) ', '(Xiu) ', '(Xie) ', '(Zheng) ', '(Shang) ', '(Zhong) ', '(Xia) ', '(Zuo) ', '(You) ', '(Yi) ', '(Zong) ', '(Xue) ', '(Jian) ', '(Qi) ', '(Zi) ', '(Xie) ', + 0xB0 => '(Ye) ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => '1M', '2M', '3M', '4M', '5M', '6M', '7M', '8M', '9M', '10M', '11M', '12M', NULL, NULL, NULL, NULL, + 0xD0 => 'a', 'i', 'u', 'u', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', 'ta', + 0xE0 => 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', 'mi', + 0xF0 => 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'wi', 'we', 'wo', NULL, +); diff --git a/sources/resources/transliteration-data/x33.php b/sources/resources/transliteration-data/x33.php new file mode 100644 index 0000000..cbb21cc --- /dev/null +++ b/sources/resources/transliteration-data/x33.php @@ -0,0 +1,20 @@ + 'apartment', 'alpha', 'ampere', 'are', 'inning', 'inch', 'won', 'escudo', 'acre', 'ounce', 'ohm', 'kai-ri', 'carat', 'calorie', 'gallon', 'gamma', + 0x10 => 'giga', 'guinea', 'curie', 'guilder', 'kilo', 'kilogram', 'kilometer', 'kilowatt', 'gram', 'gram ton', 'cruzeiro', 'krone', 'case', 'koruna', 'co-op', 'cycle', + 0x20 => 'centime', 'shilling', 'centi', 'cent', 'dozen', 'desi', 'dollar', 'ton', 'nano', 'knot', 'heights', 'percent', 'parts', 'barrel', 'piaster', 'picul', + 0x30 => 'pico', 'building', 'farad', 'feet', 'bushel', 'franc', 'hectare', 'peso', 'pfennig', 'hertz', 'pence', 'page', 'beta', 'point', 'volt', 'hon', + 0x40 => 'pound', 'hall', 'horn', 'micro', 'mile', 'mach', 'mark', 'mansion', 'micron', 'milli', 'millibar', 'mega', 'megaton', 'meter', 'yard', 'yard', + 0x50 => 'yuan', 'liter', 'lira', 'rupee', 'ruble', 'rem', 'roentgen', 'watt', '0h', '1h', '2h', '3h', '4h', '5h', '6h', '7h', + 0x60 => '8h', '9h', '10h', '11h', '12h', '13h', '14h', '15h', '16h', '17h', '18h', '19h', '20h', '21h', '22h', '23h', + 0x70 => '24h', 'HPA', 'da', 'AU', 'bar', 'oV', 'pc', NULL, NULL, NULL, NULL, 'Heisei', 'Syouwa', 'Taisyou', 'Meiji', 'Inc.', + 0x80 => 'pA', 'nA', 'microamp', 'mA', 'kA', 'kB', 'MB', 'GB', 'cal', 'kcal', 'pF', 'nF', 'microFarad', 'microgram', 'mg', 'kg', + 0x90 => 'Hz', 'kHz', 'MHz', 'GHz', 'THz', 'microliter', 'ml', 'dl', 'kl', 'fm', 'nm', 'micrometer', 'mm', 'cm', 'km', 'mm^2', + 0xA0 => 'cm^2', 'm^2', 'km^2', 'mm^4', 'cm^3', 'm^3', 'km^3', 'm/s', 'm/s^2', 'Pa', 'kPa', 'MPa', 'GPa', 'rad', 'rad/s', 'rad/s^2', + 0xB0 => 'ps', 'ns', 'microsecond', 'ms', 'pV', 'nV', 'microvolt', 'mV', 'kV', 'MV', 'pW', 'nW', 'microwatt', 'mW', 'kW', 'MW', + 0xC0 => 'kOhm', 'MOhm', 'a.m.', 'Bq', 'cc', 'cd', 'C/kg', 'Co.', 'dB', 'Gy', 'ha', 'HP', 'in', 'K.K.', 'KM', 'kt', + 0xD0 => 'lm', 'ln', 'log', 'lx', 'mb', 'mil', 'mol', 'pH', 'p.m.', 'PPM', 'PR', 'sr', 'Sv', 'Wb', NULL, NULL, + 0xE0 => '1d', '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d', '10d', '11d', '12d', '13d', '14d', '15d', '16d', + 0xF0 => '17d', '18d', '19d', '20d', '21d', '22d', '23d', '24d', '25d', '26d', '27d', '28d', '29d', '30d', '31d', NULL, +); diff --git a/sources/resources/transliteration-data/x4d.php b/sources/resources/transliteration-data/x4d.php new file mode 100644 index 0000000..5db61e0 --- /dev/null +++ b/sources/resources/transliteration-data/x4d.php @@ -0,0 +1,20 @@ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x10 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x20 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x30 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x40 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x90 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xA0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xB0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/x4e.php b/sources/resources/transliteration-data/x4e.php new file mode 100644 index 0000000..b5aa8e8 --- /dev/null +++ b/sources/resources/transliteration-data/x4e.php @@ -0,0 +1,20 @@ + 'Yi ', 'Ding ', 'Kao ', 'Qi ', 'Shang ', 'Xia ', NULL, 'Mo ', 'Zhang ', 'San ', 'Shang ', 'Xia ', 'Ji ', 'Bu ', 'Yu ', 'Mian ', + 0x10 => 'Gai ', 'Chou ', 'Chou ', 'Zhuan ', 'Qie ', 'Pi ', 'Shi ', 'Shi ', 'Qiu ', 'Bing ', 'Ye ', 'Cong ', 'Dong ', 'Si ', 'Cheng ', 'Diu ', + 0x20 => 'Qiu ', 'Liang ', 'Diu ', 'You ', 'Liang ', 'Yan ', 'Bing ', 'Sang ', 'Gun ', 'Jiu ', 'Ge ', 'Ya ', 'Qiang ', 'Zhong ', 'Ji ', 'Jie ', + 0x30 => 'Feng ', 'Guan ', 'Chuan ', 'Chan ', 'Lin ', 'Zhuo ', 'Zhu ', 'Ha ', 'Wan ', 'Dan ', 'Wei ', 'Zhu ', 'Jing ', 'Li ', 'Ju ', 'Pie ', + 0x40 => 'Fu ', 'Yi ', 'Yi ', 'Nai ', 'Shime ', 'Jiu ', 'Jiu ', 'Zhe ', 'Yao ', 'Yi ', NULL, 'Zhi ', 'Wu ', 'Zha ', 'Hu ', 'Fa ', + 0x50 => 'Le ', 'Zhong ', 'Ping ', 'Pang ', 'Qiao ', 'Hu ', 'Guai ', 'Cheng ', 'Cheng ', 'Yi ', 'Yin ', NULL, 'Mie ', 'Jiu ', 'Qi ', 'Ye ', + 0x60 => 'Xi ', 'Xiang ', 'Gai ', 'Diu ', 'Hal ', NULL, 'Shu ', 'Twul ', 'Shi ', 'Ji ', 'Nang ', 'Jia ', 'Kel ', 'Shi ', NULL, 'Ol ', + 0x70 => 'Mai ', 'Luan ', 'Cal ', 'Ru ', 'Xue ', 'Yan ', 'Fu ', 'Sha ', 'Na ', 'Gan ', 'Sol ', 'El ', 'Cwul ', NULL, 'Gan ', 'Chi ', + 0x80 => 'Gui ', 'Gan ', 'Luan ', 'Lin ', 'Yi ', 'Jue ', 'Liao ', 'Ma ', 'Yu ', 'Zheng ', 'Shi ', 'Shi ', 'Er ', 'Chu ', 'Yu ', 'Yu ', + 0x90 => 'Yu ', 'Yun ', 'Hu ', 'Qi ', 'Wu ', 'Jing ', 'Si ', 'Sui ', 'Gen ', 'Gen ', 'Ya ', 'Xie ', 'Ya ', 'Qi ', 'Ya ', 'Ji ', + 0xA0 => 'Tou ', 'Wang ', 'Kang ', 'Ta ', 'Jiao ', 'Hai ', 'Yi ', 'Chan ', 'Heng ', 'Mu ', NULL, 'Xiang ', 'Jing ', 'Ting ', 'Liang ', 'Xiang ', + 0xB0 => 'Jing ', 'Ye ', 'Qin ', 'Bo ', 'You ', 'Xie ', 'Dan ', 'Lian ', 'Duo ', 'Wei ', 'Ren ', 'Ren ', 'Ji ', 'La ', 'Wang ', 'Yi ', + 0xC0 => 'Shi ', 'Ren ', 'Le ', 'Ding ', 'Ze ', 'Jin ', 'Pu ', 'Chou ', 'Ba ', 'Zhang ', 'Jin ', 'Jie ', 'Bing ', 'Reng ', 'Cong ', 'Fo ', + 0xD0 => 'San ', 'Lun ', 'Sya ', 'Cang ', 'Zi ', 'Shi ', 'Ta ', 'Zhang ', 'Fu ', 'Xian ', 'Xian ', 'Tuo ', 'Hong ', 'Tong ', 'Ren ', 'Qian ', + 0xE0 => 'Gan ', 'Yi ', 'Di ', 'Dai ', 'Ling ', 'Yi ', 'Chao ', 'Chang ', 'Sa ', NULL, 'Yi ', 'Mu ', 'Men ', 'Ren ', 'Jia ', 'Chao ', + 0xF0 => 'Yang ', 'Qian ', 'Zhong ', 'Pi ', 'Wan ', 'Wu ', 'Jian ', 'Jie ', 'Yao ', 'Feng ', 'Cang ', 'Ren ', 'Wang ', 'Fen ', 'Di ', 'Fang ', +); diff --git a/sources/resources/transliteration-data/x4f.php b/sources/resources/transliteration-data/x4f.php new file mode 100644 index 0000000..1ac8d05 --- /dev/null +++ b/sources/resources/transliteration-data/x4f.php @@ -0,0 +1,20 @@ + 'Zhong ', 'Qi ', 'Pei ', 'Yu ', 'Diao ', 'Dun ', 'Wen ', 'Yi ', 'Xin ', 'Kang ', 'Yi ', 'Ji ', 'Ai ', 'Wu ', 'Ji ', 'Fu ', + 0x10 => 'Fa ', 'Xiu ', 'Jin ', 'Bei ', 'Dan ', 'Fu ', 'Tang ', 'Zhong ', 'You ', 'Huo ', 'Hui ', 'Yu ', 'Cui ', 'Chuan ', 'San ', 'Wei ', + 0x20 => 'Chuan ', 'Che ', 'Ya ', 'Xian ', 'Shang ', 'Chang ', 'Lun ', 'Cang ', 'Xun ', 'Xin ', 'Wei ', 'Zhu ', NULL, 'Xuan ', 'Nu ', 'Bo ', + 0x30 => 'Gu ', 'Ni ', 'Ni ', 'Xie ', 'Ban ', 'Xu ', 'Ling ', 'Zhou ', 'Shen ', 'Qu ', 'Si ', 'Beng ', 'Si ', 'Jia ', 'Pi ', 'Yi ', + 0x40 => 'Si ', 'Ai ', 'Zheng ', 'Dian ', 'Han ', 'Mai ', 'Dan ', 'Zhu ', 'Bu ', 'Qu ', 'Bi ', 'Shao ', 'Ci ', 'Wei ', 'Di ', 'Zhu ', + 0x50 => 'Zuo ', 'You ', 'Yang ', 'Ti ', 'Zhan ', 'He ', 'Bi ', 'Tuo ', 'She ', 'Yu ', 'Yi ', 'Fo ', 'Zuo ', 'Kou ', 'Ning ', 'Tong ', + 0x60 => 'Ni ', 'Xuan ', 'Qu ', 'Yong ', 'Wa ', 'Qian ', NULL, 'Ka ', NULL, 'Pei ', 'Huai ', 'He ', 'Lao ', 'Xiang ', 'Ge ', 'Yang ', + 0x70 => 'Bai ', 'Fa ', 'Ming ', 'Jia ', 'Er ', 'Bing ', 'Ji ', 'Hen ', 'Huo ', 'Gui ', 'Quan ', 'Tiao ', 'Jiao ', 'Ci ', 'Yi ', 'Shi ', + 0x80 => 'Xing ', 'Shen ', 'Tuo ', 'Kan ', 'Zhi ', 'Gai ', 'Lai ', 'Yi ', 'Chi ', 'Kua ', 'Guang ', 'Li ', 'Yin ', 'Shi ', 'Mi ', 'Zhu ', + 0x90 => 'Xu ', 'You ', 'An ', 'Lu ', 'Mou ', 'Er ', 'Lun ', 'Tong ', 'Cha ', 'Chi ', 'Xun ', 'Gong ', 'Zhou ', 'Yi ', 'Ru ', 'Jian ', + 0xA0 => 'Xia ', 'Jia ', 'Zai ', 'Lu ', 'Ko ', 'Jiao ', 'Zhen ', 'Ce ', 'Qiao ', 'Kuai ', 'Chai ', 'Ning ', 'Nong ', 'Jin ', 'Wu ', 'Hou ', + 0xB0 => 'Jiong ', 'Cheng ', 'Zhen ', 'Zuo ', 'Chou ', 'Qin ', 'Lu ', 'Ju ', 'Shu ', 'Ting ', 'Shen ', 'Tuo ', 'Bo ', 'Nan ', 'Hao ', 'Bian ', + 0xC0 => 'Tui ', 'Yu ', 'Xi ', 'Cu ', 'E ', 'Qiu ', 'Xu ', 'Kuang ', 'Ku ', 'Wu ', 'Jun ', 'Yi ', 'Fu ', 'Lang ', 'Zu ', 'Qiao ', + 0xD0 => 'Li ', 'Yong ', 'Hun ', 'Jing ', 'Xian ', 'San ', 'Pai ', 'Su ', 'Fu ', 'Xi ', 'Li ', 'Fu ', 'Ping ', 'Bao ', 'Yu ', 'Si ', + 0xE0 => 'Xia ', 'Xin ', 'Xiu ', 'Yu ', 'Ti ', 'Che ', 'Chou ', NULL, 'Yan ', 'Lia ', 'Li ', 'Lai ', NULL, 'Jian ', 'Xiu ', 'Fu ', + 0xF0 => 'He ', 'Ju ', 'Xiao ', 'Pai ', 'Jian ', 'Biao ', 'Chu ', 'Fei ', 'Feng ', 'Ya ', 'An ', 'Bei ', 'Yu ', 'Xin ', 'Bi ', 'Jian ', +); diff --git a/sources/resources/transliteration-data/x50.php b/sources/resources/transliteration-data/x50.php new file mode 100644 index 0000000..d9b537e --- /dev/null +++ b/sources/resources/transliteration-data/x50.php @@ -0,0 +1,20 @@ + 'Chang ', 'Chi ', 'Bing ', 'Zan ', 'Yao ', 'Cui ', 'Lia ', 'Wan ', 'Lai ', 'Cang ', 'Zong ', 'Ge ', 'Guan ', 'Bei ', 'Tian ', 'Shu ', + 0x10 => 'Shu ', 'Men ', 'Dao ', 'Tan ', 'Jue ', 'Chui ', 'Xing ', 'Peng ', 'Tang ', 'Hou ', 'Yi ', 'Qi ', 'Ti ', 'Gan ', 'Jing ', 'Jie ', + 0x20 => 'Sui ', 'Chang ', 'Jie ', 'Fang ', 'Zhi ', 'Kong ', 'Juan ', 'Zong ', 'Ju ', 'Qian ', 'Ni ', 'Lun ', 'Zhuo ', 'Wei ', 'Luo ', 'Song ', + 0x30 => 'Leng ', 'Hun ', 'Dong ', 'Zi ', 'Ben ', 'Wu ', 'Ju ', 'Nai ', 'Cai ', 'Jian ', 'Zhai ', 'Ye ', 'Zhi ', 'Sha ', 'Qing ', NULL, + 0x40 => 'Ying ', 'Cheng ', 'Jian ', 'Yan ', 'Nuan ', 'Zhong ', 'Chun ', 'Jia ', 'Jie ', 'Wei ', 'Yu ', 'Bing ', 'Ruo ', 'Ti ', 'Wei ', 'Pian ', + 0x50 => 'Yan ', 'Feng ', 'Tang ', 'Wo ', 'E ', 'Xie ', 'Che ', 'Sheng ', 'Kan ', 'Di ', 'Zuo ', 'Cha ', 'Ting ', 'Bei ', 'Ye ', 'Huang ', + 0x60 => 'Yao ', 'Zhan ', 'Chou ', 'Yan ', 'You ', 'Jian ', 'Xu ', 'Zha ', 'Ci ', 'Fu ', 'Bi ', 'Zhi ', 'Zong ', 'Mian ', 'Ji ', 'Yi ', + 0x70 => 'Xie ', 'Xun ', 'Si ', 'Duan ', 'Ce ', 'Zhen ', 'Ou ', 'Tou ', 'Tou ', 'Bei ', 'Za ', 'Lu ', 'Jie ', 'Wei ', 'Fen ', 'Chang ', + 0x80 => 'Gui ', 'Sou ', 'Zhi ', 'Su ', 'Xia ', 'Fu ', 'Yuan ', 'Rong ', 'Li ', 'Ru ', 'Yun ', 'Gou ', 'Ma ', 'Bang ', 'Dian ', 'Tang ', + 0x90 => 'Hao ', 'Jie ', 'Xi ', 'Shan ', 'Qian ', 'Jue ', 'Cang ', 'Chu ', 'San ', 'Bei ', 'Xiao ', 'Yong ', 'Yao ', 'Tan ', 'Suo ', 'Yang ', + 0xA0 => 'Fa ', 'Bing ', 'Jia ', 'Dai ', 'Zai ', 'Tang ', NULL, 'Bin ', 'Chu ', 'Nuo ', 'Can ', 'Lei ', 'Cui ', 'Yong ', 'Zao ', 'Zong ', + 0xB0 => 'Peng ', 'Song ', 'Ao ', 'Chuan ', 'Yu ', 'Zhai ', 'Cou ', 'Shang ', 'Qiang ', 'Jing ', 'Chi ', 'Sha ', 'Han ', 'Zhang ', 'Qing ', 'Yan ', + 0xC0 => 'Di ', 'Xi ', 'Lu ', 'Bei ', 'Piao ', 'Jin ', 'Lian ', 'Lu ', 'Man ', 'Qian ', 'Xian ', 'Tan ', 'Ying ', 'Dong ', 'Zhuan ', 'Xiang ', + 0xD0 => 'Shan ', 'Qiao ', 'Jiong ', 'Tui ', 'Zun ', 'Pu ', 'Xi ', 'Lao ', 'Chang ', 'Guang ', 'Liao ', 'Qi ', 'Deng ', 'Chan ', 'Wei ', 'Ji ', + 0xE0 => 'Fan ', 'Hui ', 'Chuan ', 'Jian ', 'Dan ', 'Jiao ', 'Jiu ', 'Seng ', 'Fen ', 'Xian ', 'Jue ', 'E ', 'Jiao ', 'Jian ', 'Tong ', 'Lin ', + 0xF0 => 'Bo ', 'Gu ', NULL, 'Su ', 'Xian ', 'Jiang ', 'Min ', 'Ye ', 'Jin ', 'Jia ', 'Qiao ', 'Pi ', 'Feng ', 'Zhou ', 'Ai ', 'Sai ', +); diff --git a/sources/resources/transliteration-data/x51.php b/sources/resources/transliteration-data/x51.php new file mode 100644 index 0000000..87c9504 --- /dev/null +++ b/sources/resources/transliteration-data/x51.php @@ -0,0 +1,20 @@ + 'Yi ', 'Jun ', 'Nong ', 'Chan ', 'Yi ', 'Dang ', 'Jing ', 'Xuan ', 'Kuai ', 'Jian ', 'Chu ', 'Dan ', 'Jiao ', 'Sha ', 'Zai ', NULL, + 0x10 => 'Bin ', 'An ', 'Ru ', 'Tai ', 'Chou ', 'Chai ', 'Lan ', 'Ni ', 'Jin ', 'Qian ', 'Meng ', 'Wu ', 'Ning ', 'Qiong ', 'Ni ', 'Chang ', + 0x20 => 'Lie ', 'Lei ', 'Lu ', 'Kuang ', 'Bao ', 'Du ', 'Biao ', 'Zan ', 'Zhi ', 'Si ', 'You ', 'Hao ', 'Chen ', 'Chen ', 'Li ', 'Teng ', + 0x30 => 'Wei ', 'Long ', 'Chu ', 'Chan ', 'Rang ', 'Shu ', 'Hui ', 'Li ', 'Luo ', 'Zan ', 'Nuo ', 'Tang ', 'Yan ', 'Lei ', 'Nang ', 'Er ', + 0x40 => 'Wu ', 'Yun ', 'Zan ', 'Yuan ', 'Xiong ', 'Chong ', 'Zhao ', 'Xiong ', 'Xian ', 'Guang ', 'Dui ', 'Ke ', 'Dui ', 'Mian ', 'Tu ', 'Chang ', + 0x50 => 'Er ', 'Dui ', 'Er ', 'Xin ', 'Tu ', 'Si ', 'Yan ', 'Yan ', 'Shi ', 'Shi ', 'Dang ', 'Qian ', 'Dou ', 'Fen ', 'Mao ', 'Shen ', + 0x60 => 'Dou ', 'Bai ', 'Jing ', 'Li ', 'Huang ', 'Ru ', 'Wang ', 'Nei ', 'Quan ', 'Liang ', 'Yu ', 'Ba ', 'Gong ', 'Liu ', 'Xi ', NULL, + 0x70 => 'Lan ', 'Gong ', 'Tian ', 'Guan ', 'Xing ', 'Bing ', 'Qi ', 'Ju ', 'Dian ', 'Zi ', 'Ppwun ', 'Yang ', 'Jian ', 'Shou ', 'Ji ', 'Yi ', + 0x80 => 'Ji ', 'Chan ', 'Jiong ', 'Mao ', 'Ran ', 'Nei ', 'Yuan ', 'Mao ', 'Gang ', 'Ran ', 'Ce ', 'Jiong ', 'Ce ', 'Zai ', 'Gua ', 'Jiong ', + 0x90 => 'Mao ', 'Zhou ', 'Mou ', 'Gou ', 'Xu ', 'Mian ', 'Mi ', 'Rong ', 'Yin ', 'Xie ', 'Kan ', 'Jun ', 'Nong ', 'Yi ', 'Mi ', 'Shi ', + 0xA0 => 'Guan ', 'Meng ', 'Zhong ', 'Ju ', 'Yuan ', 'Ming ', 'Kou ', 'Lam ', 'Fu ', 'Xie ', 'Mi ', 'Bing ', 'Dong ', 'Tai ', 'Gang ', 'Feng ', + 0xB0 => 'Bing ', 'Hu ', 'Chong ', 'Jue ', 'Hu ', 'Kuang ', 'Ye ', 'Leng ', 'Pan ', 'Fu ', 'Min ', 'Dong ', 'Xian ', 'Lie ', 'Xia ', 'Jian ', + 0xC0 => 'Jing ', 'Shu ', 'Mei ', 'Tu ', 'Qi ', 'Gu ', 'Zhun ', 'Song ', 'Jing ', 'Liang ', 'Qing ', 'Diao ', 'Ling ', 'Dong ', 'Gan ', 'Jian ', + 0xD0 => 'Yin ', 'Cou ', 'Yi ', 'Li ', 'Cang ', 'Ming ', 'Zhuen ', 'Cui ', 'Si ', 'Duo ', 'Jin ', 'Lin ', 'Lin ', 'Ning ', 'Xi ', 'Du ', + 0xE0 => 'Ji ', 'Fan ', 'Fan ', 'Fan ', 'Feng ', 'Ju ', 'Chu ', 'Tako ', 'Feng ', 'Mok ', 'Ci ', 'Fu ', 'Feng ', 'Ping ', 'Feng ', 'Kai ', + 0xF0 => 'Huang ', 'Kai ', 'Gan ', 'Deng ', 'Ping ', 'Qu ', 'Xiong ', 'Kuai ', 'Tu ', 'Ao ', 'Chu ', 'Ji ', 'Dang ', 'Han ', 'Han ', 'Zao ', +); diff --git a/sources/resources/transliteration-data/x52.php b/sources/resources/transliteration-data/x52.php new file mode 100644 index 0000000..3d8e9dc --- /dev/null +++ b/sources/resources/transliteration-data/x52.php @@ -0,0 +1,20 @@ + 'Dao ', 'Diao ', 'Dao ', 'Ren ', 'Ren ', 'Chuang ', 'Fen ', 'Qie ', 'Yi ', 'Ji ', 'Kan ', 'Qian ', 'Cun ', 'Chu ', 'Wen ', 'Ji ', + 0x10 => 'Dan ', 'Xing ', 'Hua ', 'Wan ', 'Jue ', 'Li ', 'Yue ', 'Lie ', 'Liu ', 'Ze ', 'Gang ', 'Chuang ', 'Fu ', 'Chu ', 'Qu ', 'Ju ', + 0x20 => 'Shan ', 'Min ', 'Ling ', 'Zhong ', 'Pan ', 'Bie ', 'Jie ', 'Jie ', 'Bao ', 'Li ', 'Shan ', 'Bie ', 'Chan ', 'Jing ', 'Gua ', 'Gen ', + 0x30 => 'Dao ', 'Chuang ', 'Kui ', 'Ku ', 'Duo ', 'Er ', 'Zhi ', 'Shua ', 'Quan ', 'Cha ', 'Ci ', 'Ke ', 'Jie ', 'Gui ', 'Ci ', 'Gui ', + 0x40 => 'Kai ', 'Duo ', 'Ji ', 'Ti ', 'Jing ', 'Lou ', 'Gen ', 'Ze ', 'Yuan ', 'Cuo ', 'Xue ', 'Ke ', 'La ', 'Qian ', 'Cha ', 'Chuang ', + 0x50 => 'Gua ', 'Jian ', 'Cuo ', 'Li ', 'Ti ', 'Fei ', 'Pou ', 'Chan ', 'Qi ', 'Chuang ', 'Zi ', 'Gang ', 'Wan ', 'Bo ', 'Ji ', 'Duo ', + 0x60 => 'Qing ', 'Yan ', 'Zhuo ', 'Jian ', 'Ji ', 'Bo ', 'Yan ', 'Ju ', 'Huo ', 'Sheng ', 'Jian ', 'Duo ', 'Duan ', 'Wu ', 'Gua ', 'Fu ', + 0x70 => 'Sheng ', 'Jian ', 'Ge ', 'Zha ', 'Kai ', 'Chuang ', 'Juan ', 'Chan ', 'Tuan ', 'Lu ', 'Li ', 'Fou ', 'Shan ', 'Piao ', 'Kou ', 'Jiao ', + 0x80 => 'Gua ', 'Qiao ', 'Jue ', 'Hua ', 'Zha ', 'Zhuo ', 'Lian ', 'Ju ', 'Pi ', 'Liu ', 'Gui ', 'Jiao ', 'Gui ', 'Jian ', 'Jian ', 'Tang ', + 0x90 => 'Huo ', 'Ji ', 'Jian ', 'Yi ', 'Jian ', 'Zhi ', 'Chan ', 'Cuan ', 'Mo ', 'Li ', 'Zhu ', 'Li ', 'Ya ', 'Quan ', 'Ban ', 'Gong ', + 0xA0 => 'Jia ', 'Wu ', 'Mai ', 'Lie ', 'Jin ', 'Keng ', 'Xie ', 'Zhi ', 'Dong ', 'Zhu ', 'Nu ', 'Jie ', 'Qu ', 'Shao ', 'Yi ', 'Zhu ', + 0xB0 => 'Miao ', 'Li ', 'Jing ', 'Lao ', 'Lao ', 'Juan ', 'Kou ', 'Yang ', 'Wa ', 'Xiao ', 'Mou ', 'Kuang ', 'Jie ', 'Lie ', 'He ', 'Shi ', + 0xC0 => 'Ke ', 'Jing ', 'Hao ', 'Bo ', 'Min ', 'Chi ', 'Lang ', 'Yong ', 'Yong ', 'Mian ', 'Ke ', 'Xun ', 'Juan ', 'Qing ', 'Lu ', 'Pou ', + 0xD0 => 'Meng ', 'Lai ', 'Le ', 'Kai ', 'Mian ', 'Dong ', 'Xu ', 'Xu ', 'Kan ', 'Wu ', 'Yi ', 'Xun ', 'Weng ', 'Sheng ', 'Lao ', 'Mu ', + 0xE0 => 'Lu ', 'Piao ', 'Shi ', 'Ji ', 'Qin ', 'Qiang ', 'Jiao ', 'Quan ', 'Yang ', 'Yi ', 'Jue ', 'Fan ', 'Juan ', 'Tong ', 'Ju ', 'Dan ', + 0xF0 => 'Xie ', 'Mai ', 'Xun ', 'Xun ', 'Lu ', 'Li ', 'Che ', 'Rang ', 'Quan ', 'Bao ', 'Shao ', 'Yun ', 'Jiu ', 'Bao ', 'Gou ', 'Wu ', +); diff --git a/sources/resources/transliteration-data/x53.php b/sources/resources/transliteration-data/x53.php new file mode 100644 index 0000000..ee5c039 --- /dev/null +++ b/sources/resources/transliteration-data/x53.php @@ -0,0 +1,20 @@ + 'Yun ', 'Mwun ', 'Nay ', 'Gai ', 'Gai ', 'Bao ', 'Cong ', NULL, 'Xiong ', 'Peng ', 'Ju ', 'Tao ', 'Ge ', 'Pu ', 'An ', 'Pao ', + 0x10 => 'Fu ', 'Gong ', 'Da ', 'Jiu ', 'Qiong ', 'Bi ', 'Hua ', 'Bei ', 'Nao ', 'Chi ', 'Fang ', 'Jiu ', 'Yi ', 'Za ', 'Jiang ', 'Kang ', + 0x20 => 'Jiang ', 'Kuang ', 'Hu ', 'Xia ', 'Qu ', 'Bian ', 'Gui ', 'Qie ', 'Zang ', 'Kuang ', 'Fei ', 'Hu ', 'Tou ', 'Gui ', 'Gui ', 'Hui ', + 0x30 => 'Dan ', 'Gui ', 'Lian ', 'Lian ', 'Suan ', 'Du ', 'Jiu ', 'Qu ', 'Xi ', 'Pi ', 'Qu ', 'Yi ', 'Qia ', 'Yan ', 'Bian ', 'Ni ', + 0x40 => 'Qu ', 'Shi ', 'Xin ', 'Qian ', 'Nian ', 'Sa ', 'Zu ', 'Sheng ', 'Wu ', 'Hui ', 'Ban ', 'Shi ', 'Xi ', 'Wan ', 'Hua ', 'Xie ', + 0x50 => 'Wan ', 'Bei ', 'Zu ', 'Zhuo ', 'Xie ', 'Dan ', 'Mai ', 'Nan ', 'Dan ', 'Ji ', 'Bo ', 'Shuai ', 'Bu ', 'Kuang ', 'Bian ', 'Bu ', + 0x60 => 'Zhan ', 'Qia ', 'Lu ', 'You ', 'Lu ', 'Xi ', 'Gua ', 'Wo ', 'Xie ', 'Jie ', 'Jie ', 'Wei ', 'Ang ', 'Qiong ', 'Zhi ', 'Mao ', + 0x70 => 'Yin ', 'Wei ', 'Shao ', 'Ji ', 'Que ', 'Luan ', 'Shi ', 'Juan ', 'Xie ', 'Xu ', 'Jin ', 'Que ', 'Wu ', 'Ji ', 'E ', 'Qing ', + 0x80 => 'Xi ', NULL, 'Han ', 'Zhan ', 'E ', 'Ting ', 'Li ', 'Zhe ', 'Han ', 'Li ', 'Ya ', 'Ya ', 'Yan ', 'She ', 'Zhi ', 'Zha ', + 0x90 => 'Pang ', NULL, 'He ', 'Ya ', 'Zhi ', 'Ce ', 'Pang ', 'Ti ', 'Li ', 'She ', 'Hou ', 'Ting ', 'Zui ', 'Cuo ', 'Fei ', 'Yuan ', + 0xA0 => 'Ce ', 'Yuan ', 'Xiang ', 'Yan ', 'Li ', 'Jue ', 'Sha ', 'Dian ', 'Chu ', 'Jiu ', 'Qin ', 'Ao ', 'Gui ', 'Yan ', 'Si ', 'Li ', + 0xB0 => 'Chang ', 'Lan ', 'Li ', 'Yan ', 'Yan ', 'Yuan ', 'Si ', 'Gong ', 'Lin ', 'Qiu ', 'Qu ', 'Qu ', 'Uk ', 'Lei ', 'Du ', 'Xian ', + 0xC0 => 'Zhuan ', 'San ', 'Can ', 'Can ', 'Can ', 'Can ', 'Ai ', 'Dai ', 'You ', 'Cha ', 'Ji ', 'You ', 'Shuang ', 'Fan ', 'Shou ', 'Guai ', + 0xD0 => 'Ba ', 'Fa ', 'Ruo ', 'Shi ', 'Shu ', 'Zhuo ', 'Qu ', 'Shou ', 'Bian ', 'Xu ', 'Jia ', 'Pan ', 'Sou ', 'Gao ', 'Wei ', 'Sou ', + 0xE0 => 'Die ', 'Rui ', 'Cong ', 'Kou ', 'Gu ', 'Ju ', 'Ling ', 'Gua ', 'Tao ', 'Kou ', 'Zhi ', 'Jiao ', 'Zhao ', 'Ba ', 'Ding ', 'Ke ', + 0xF0 => 'Tai ', 'Chi ', 'Shi ', 'You ', 'Qiu ', 'Po ', 'Xie ', 'Hao ', 'Si ', 'Tan ', 'Chi ', 'Le ', 'Diao ', 'Ji ', NULL, 'Hong ', +); diff --git a/sources/resources/transliteration-data/x54.php b/sources/resources/transliteration-data/x54.php new file mode 100644 index 0000000..bf08fa2 --- /dev/null +++ b/sources/resources/transliteration-data/x54.php @@ -0,0 +1,20 @@ + 'Mie ', 'Xu ', 'Mang ', 'Chi ', 'Ge ', 'Xuan ', 'Yao ', 'Zi ', 'He ', 'Ji ', 'Diao ', 'Cun ', 'Tong ', 'Ming ', 'Hou ', 'Li ', + 0x10 => 'Tu ', 'Xiang ', 'Zha ', 'Xia ', 'Ye ', 'Lu ', 'A ', 'Ma ', 'Ou ', 'Xue ', 'Yi ', 'Jun ', 'Chou ', 'Lin ', 'Tun ', 'Yin ', + 0x20 => 'Fei ', 'Bi ', 'Qin ', 'Qin ', 'Jie ', 'Bu ', 'Fou ', 'Ba ', 'Dun ', 'Fen ', 'E ', 'Han ', 'Ting ', 'Hang ', 'Shun ', 'Qi ', + 0x30 => 'Hong ', 'Zhi ', 'Shen ', 'Wu ', 'Wu ', 'Chao ', 'Ne ', 'Xue ', 'Xi ', 'Chui ', 'Dou ', 'Wen ', 'Hou ', 'Ou ', 'Wu ', 'Gao ', + 0x40 => 'Ya ', 'Jun ', 'Lu ', 'E ', 'Ge ', 'Mei ', 'Ai ', 'Qi ', 'Cheng ', 'Wu ', 'Gao ', 'Fu ', 'Jiao ', 'Hong ', 'Chi ', 'Sheng ', + 0x50 => 'Ne ', 'Tun ', 'Fu ', 'Yi ', 'Dai ', 'Ou ', 'Li ', 'Bai ', 'Yuan ', 'Kuai ', NULL, 'Qiang ', 'Wu ', 'E ', 'Shi ', 'Quan ', + 0x60 => 'Pen ', 'Wen ', 'Ni ', 'M ', 'Ling ', 'Ran ', 'You ', 'Di ', 'Zhou ', 'Shi ', 'Zhou ', 'Tie ', 'Xi ', 'Yi ', 'Qi ', 'Ping ', + 0x70 => 'Zi ', 'Gu ', 'Zi ', 'Wei ', 'Xu ', 'He ', 'Nao ', 'Xia ', 'Pei ', 'Yi ', 'Xiao ', 'Shen ', 'Hu ', 'Ming ', 'Da ', 'Qu ', + 0x80 => 'Ju ', 'Gem ', 'Za ', 'Tuo ', 'Duo ', 'Pou ', 'Pao ', 'Bi ', 'Fu ', 'Yang ', 'He ', 'Zha ', 'He ', 'Hai ', 'Jiu ', 'Yong ', + 0x90 => 'Fu ', 'Que ', 'Zhou ', 'Wa ', 'Ka ', 'Gu ', 'Ka ', 'Zuo ', 'Bu ', 'Long ', 'Dong ', 'Ning ', 'Tha ', 'Si ', 'Xian ', 'Huo ', + 0xA0 => 'Qi ', 'Er ', 'E ', 'Guang ', 'Zha ', 'Xi ', 'Yi ', 'Lie ', 'Zi ', 'Mie ', 'Mi ', 'Zhi ', 'Yao ', 'Ji ', 'Zhou ', 'Ge ', + 0xB0 => 'Shuai ', 'Zan ', 'Xiao ', 'Ke ', 'Hui ', 'Kua ', 'Huai ', 'Tao ', 'Xian ', 'E ', 'Xuan ', 'Xiu ', 'Wai ', 'Yan ', 'Lao ', 'Yi ', + 0xC0 => 'Ai ', 'Pin ', 'Shen ', 'Tong ', 'Hong ', 'Xiong ', 'Chi ', 'Wa ', 'Ha ', 'Zai ', 'Yu ', 'Di ', 'Pai ', 'Xiang ', 'Ai ', 'Hen ', + 0xD0 => 'Kuang ', 'Ya ', 'Da ', 'Xiao ', 'Bi ', 'Yue ', NULL, 'Hua ', 'Sasou ', 'Kuai ', 'Duo ', NULL, 'Ji ', 'Nong ', 'Mou ', 'Yo ', + 0xE0 => 'Hao ', 'Yuan ', 'Long ', 'Pou ', 'Mang ', 'Ge ', 'E ', 'Chi ', 'Shao ', 'Li ', 'Na ', 'Zu ', 'He ', 'Ku ', 'Xiao ', 'Xian ', + 0xF0 => 'Lao ', 'Bo ', 'Zhe ', 'Zha ', 'Liang ', 'Ba ', 'Mie ', 'Le ', 'Sui ', 'Fou ', 'Bu ', 'Han ', 'Heng ', 'Geng ', 'Shuo ', 'Ge ', +); diff --git a/sources/resources/transliteration-data/x55.php b/sources/resources/transliteration-data/x55.php new file mode 100644 index 0000000..436e093 --- /dev/null +++ b/sources/resources/transliteration-data/x55.php @@ -0,0 +1,20 @@ + 'You ', 'Yan ', 'Gu ', 'Gu ', 'Bai ', 'Han ', 'Suo ', 'Chun ', 'Yi ', 'Ai ', 'Jia ', 'Tu ', 'Xian ', 'Huan ', 'Li ', 'Xi ', + 0x10 => 'Tang ', 'Zuo ', 'Qiu ', 'Che ', 'Wu ', 'Zao ', 'Ya ', 'Dou ', 'Qi ', 'Di ', 'Qin ', 'Ma ', 'Mal ', 'Hong ', 'Dou ', 'Kes ', + 0x20 => 'Lao ', 'Liang ', 'Suo ', 'Zao ', 'Huan ', 'Lang ', 'Sha ', 'Ji ', 'Zuo ', 'Wo ', 'Feng ', 'Yin ', 'Hu ', 'Qi ', 'Shou ', 'Wei ', + 0x30 => 'Shua ', 'Chang ', 'Er ', 'Li ', 'Qiang ', 'An ', 'Jie ', 'Yo ', 'Nian ', 'Yu ', 'Tian ', 'Lai ', 'Sha ', 'Xi ', 'Tuo ', 'Hu ', + 0x40 => 'Ai ', 'Zhou ', 'Nou ', 'Ken ', 'Zhuo ', 'Zhuo ', 'Shang ', 'Di ', 'Heng ', 'Lan ', 'A ', 'Xiao ', 'Xiang ', 'Tun ', 'Wu ', 'Wen ', + 0x50 => 'Cui ', 'Sha ', 'Hu ', 'Qi ', 'Qi ', 'Tao ', 'Dan ', 'Dan ', 'Ye ', 'Zi ', 'Bi ', 'Cui ', 'Chuo ', 'He ', 'Ya ', 'Qi ', + 0x60 => 'Zhe ', 'Pei ', 'Liang ', 'Xian ', 'Pi ', 'Sha ', 'La ', 'Ze ', 'Qing ', 'Gua ', 'Pa ', 'Zhe ', 'Se ', 'Zhuan ', 'Nie ', 'Guo ', + 0x70 => 'Luo ', 'Yan ', 'Di ', 'Quan ', 'Tan ', 'Bo ', 'Ding ', 'Lang ', 'Xiao ', NULL, 'Tang ', 'Chi ', 'Ti ', 'An ', 'Jiu ', 'Dan ', + 0x80 => 'Ke ', 'Yong ', 'Wei ', 'Nan ', 'Shan ', 'Yu ', 'Zhe ', 'La ', 'Jie ', 'Hou ', 'Han ', 'Die ', 'Zhou ', 'Chai ', 'Wai ', 'Re ', + 0x90 => 'Yu ', 'Yin ', 'Zan ', 'Yao ', 'Wo ', 'Mian ', 'Hu ', 'Yun ', 'Chuan ', 'Hui ', 'Huan ', 'Huan ', 'Xi ', 'He ', 'Ji ', 'Kui ', + 0xA0 => 'Zhong ', 'Wei ', 'Sha ', 'Xu ', 'Huang ', 'Du ', 'Nie ', 'Xuan ', 'Liang ', 'Yu ', 'Sang ', 'Chi ', 'Qiao ', 'Yan ', 'Dan ', 'Pen ', + 0xB0 => 'Can ', 'Li ', 'Yo ', 'Zha ', 'Wei ', 'Miao ', 'Ying ', 'Pen ', 'Phos ', 'Kui ', 'Xi ', 'Yu ', 'Jie ', 'Lou ', 'Ku ', 'Sao ', + 0xC0 => 'Huo ', 'Ti ', 'Yao ', 'He ', 'A ', 'Xiu ', 'Qiang ', 'Se ', 'Yong ', 'Su ', 'Hong ', 'Xie ', 'Yi ', 'Suo ', 'Ma ', 'Cha ', + 0xD0 => 'Hai ', 'Ke ', 'Ta ', 'Sang ', 'Tian ', 'Ru ', 'Sou ', 'Wa ', 'Ji ', 'Pang ', 'Wu ', 'Xian ', 'Shi ', 'Ge ', 'Zi ', 'Jie ', + 0xE0 => 'Luo ', 'Weng ', 'Wa ', 'Si ', 'Chi ', 'Hao ', 'Suo ', 'Jia ', 'Hai ', 'Suo ', 'Qin ', 'Nie ', 'He ', 'Cis ', 'Sai ', 'Ng ', + 0xF0 => 'Ge ', 'Na ', 'Dia ', 'Ai ', NULL, 'Tong ', 'Bi ', 'Ao ', 'Ao ', 'Lian ', 'Cui ', 'Zhe ', 'Mo ', 'Sou ', 'Sou ', 'Tan ', +); diff --git a/sources/resources/transliteration-data/x56.php b/sources/resources/transliteration-data/x56.php new file mode 100644 index 0000000..7f909f0 --- /dev/null +++ b/sources/resources/transliteration-data/x56.php @@ -0,0 +1,20 @@ + 'Di ', 'Qi ', 'Jiao ', 'Chong ', 'Jiao ', 'Kai ', 'Tan ', 'San ', 'Cao ', 'Jia ', 'Ai ', 'Xiao ', 'Piao ', 'Lou ', 'Ga ', 'Gu ', + 0x10 => 'Xiao ', 'Hu ', 'Hui ', 'Guo ', 'Ou ', 'Xian ', 'Ze ', 'Chang ', 'Xu ', 'Po ', 'De ', 'Ma ', 'Ma ', 'Hu ', 'Lei ', 'Du ', + 0x20 => 'Ga ', 'Tang ', 'Ye ', 'Beng ', 'Ying ', 'Saai ', 'Jiao ', 'Mi ', 'Xiao ', 'Hua ', 'Mai ', 'Ran ', 'Zuo ', 'Peng ', 'Lao ', 'Xiao ', + 0x30 => 'Ji ', 'Zhu ', 'Chao ', 'Kui ', 'Zui ', 'Xiao ', 'Si ', 'Hao ', 'Fu ', 'Liao ', 'Qiao ', 'Xi ', 'Xiu ', 'Tan ', 'Tan ', 'Mo ', + 0x40 => 'Xun ', 'E ', 'Zun ', 'Fan ', 'Chi ', 'Hui ', 'Zan ', 'Chuang ', 'Cu ', 'Dan ', 'Yu ', 'Tun ', 'Cheng ', 'Jiao ', 'Ye ', 'Xi ', + 0x50 => 'Qi ', 'Hao ', 'Lian ', 'Xu ', 'Deng ', 'Hui ', 'Yin ', 'Pu ', 'Jue ', 'Qin ', 'Xun ', 'Nie ', 'Lu ', 'Si ', 'Yan ', 'Ying ', + 0x60 => 'Da ', 'Dan ', 'Yu ', 'Zhou ', 'Jin ', 'Nong ', 'Yue ', 'Hui ', 'Qi ', 'E ', 'Zao ', 'Yi ', 'Shi ', 'Jiao ', 'Yuan ', 'Ai ', + 0x70 => 'Yong ', 'Jue ', 'Kuai ', 'Yu ', 'Pen ', 'Dao ', 'Ge ', 'Xin ', 'Dun ', 'Dang ', 'Sin ', 'Sai ', 'Pi ', 'Pi ', 'Yin ', 'Zui ', + 0x80 => 'Ning ', 'Di ', 'Lan ', 'Ta ', 'Huo ', 'Ru ', 'Hao ', 'Xia ', 'Ya ', 'Duo ', 'Xi ', 'Chou ', 'Ji ', 'Jin ', 'Hao ', 'Ti ', + 0x90 => 'Chang ', NULL, NULL, 'Ca ', 'Ti ', 'Lu ', 'Hui ', 'Bo ', 'You ', 'Nie ', 'Yin ', 'Hu ', 'Mo ', 'Huang ', 'Zhe ', 'Li ', + 0xA0 => 'Liu ', 'Haai ', 'Nang ', 'Xiao ', 'Mo ', 'Yan ', 'Li ', 'Lu ', 'Long ', 'Fu ', 'Dan ', 'Chen ', 'Pin ', 'Pi ', 'Xiang ', 'Huo ', + 0xB0 => 'Mo ', 'Xi ', 'Duo ', 'Ku ', 'Yan ', 'Chan ', 'Ying ', 'Rang ', 'Dian ', 'La ', 'Ta ', 'Xiao ', 'Jiao ', 'Chuo ', 'Huan ', 'Huo ', + 0xC0 => 'Zhuan ', 'Nie ', 'Xiao ', 'Ca ', 'Li ', 'Chan ', 'Chai ', 'Li ', 'Yi ', 'Luo ', 'Nang ', 'Zan ', 'Su ', 'Xi ', 'So ', 'Jian ', + 0xD0 => 'Za ', 'Zhu ', 'Lan ', 'Nie ', 'Nang ', NULL, NULL, 'Wei ', 'Hui ', 'Yin ', 'Qiu ', 'Si ', 'Nin ', 'Jian ', 'Hui ', 'Xin ', + 0xE0 => 'Yin ', 'Nan ', 'Tuan ', 'Tuan ', 'Dun ', 'Kang ', 'Yuan ', 'Jiong ', 'Pian ', 'Yun ', 'Cong ', 'Hu ', 'Hui ', 'Yuan ', 'You ', 'Guo ', + 0xF0 => 'Kun ', 'Cong ', 'Wei ', 'Tu ', 'Wei ', 'Lun ', 'Guo ', 'Qun ', 'Ri ', 'Ling ', 'Gu ', 'Guo ', 'Tai ', 'Guo ', 'Tu ', 'You ', +); diff --git a/sources/resources/transliteration-data/x57.php b/sources/resources/transliteration-data/x57.php new file mode 100644 index 0000000..9c9912c --- /dev/null +++ b/sources/resources/transliteration-data/x57.php @@ -0,0 +1,20 @@ + 'Guo ', 'Yin ', 'Hun ', 'Pu ', 'Yu ', 'Han ', 'Yuan ', 'Lun ', 'Quan ', 'Yu ', 'Qing ', 'Guo ', 'Chuan ', 'Wei ', 'Yuan ', 'Quan ', + 0x10 => 'Ku ', 'Fu ', 'Yuan ', 'Yuan ', 'E ', 'Tu ', 'Tu ', 'Tu ', 'Tuan ', 'Lue ', 'Hui ', 'Yi ', 'Yuan ', 'Luan ', 'Luan ', 'Tu ', + 0x20 => 'Ya ', 'Tu ', 'Ting ', 'Sheng ', 'Pu ', 'Lu ', 'Iri ', 'Ya ', 'Zai ', 'Wei ', 'Ge ', 'Yu ', 'Wu ', 'Gui ', 'Pi ', 'Yi ', + 0x30 => 'Di ', 'Qian ', 'Qian ', 'Zhen ', 'Zhuo ', 'Dang ', 'Qia ', 'Akutsu ', 'Yama ', 'Kuang ', 'Chang ', 'Qi ', 'Nie ', 'Mo ', 'Ji ', 'Jia ', + 0x40 => 'Zhi ', 'Zhi ', 'Ban ', 'Xun ', 'Tou ', 'Qin ', 'Fen ', 'Jun ', 'Keng ', 'Tun ', 'Fang ', 'Fen ', 'Ben ', 'Tan ', 'Kan ', 'Pi ', + 0x50 => 'Zuo ', 'Keng ', 'Bi ', 'Xing ', 'Di ', 'Jing ', 'Ji ', 'Kuai ', 'Di ', 'Jing ', 'Jian ', 'Tan ', 'Li ', 'Ba ', 'Wu ', 'Fen ', + 0x60 => 'Zhui ', 'Po ', 'Pan ', 'Tang ', 'Kun ', 'Qu ', 'Tan ', 'Zhi ', 'Tuo ', 'Gan ', 'Ping ', 'Dian ', 'Gua ', 'Ni ', 'Tai ', 'Pi ', + 0x70 => 'Jiong ', 'Yang ', 'Fo ', 'Ao ', 'Liu ', 'Qiu ', 'Mu ', 'Ke ', 'Gou ', 'Xue ', 'Ba ', 'Chi ', 'Che ', 'Ling ', 'Zhu ', 'Fu ', + 0x80 => 'Hu ', 'Zhi ', 'Chui ', 'La ', 'Long ', 'Long ', 'Lu ', 'Ao ', 'Tay ', 'Pao ', NULL, 'Xing ', 'Dong ', 'Ji ', 'Ke ', 'Lu ', + 0x90 => 'Ci ', 'Chi ', 'Lei ', 'Gai ', 'Yin ', 'Hou ', 'Dui ', 'Zhao ', 'Fu ', 'Guang ', 'Yao ', 'Duo ', 'Duo ', 'Gui ', 'Cha ', 'Yang ', + 0xA0 => 'Yin ', 'Fa ', 'Gou ', 'Yuan ', 'Die ', 'Xie ', 'Ken ', 'Jiong ', 'Shou ', 'E ', 'Ha ', 'Dian ', 'Hong ', 'Wu ', 'Kua ', NULL, + 0xB0 => 'Tao ', 'Dang ', 'Kai ', 'Gake ', 'Nao ', 'An ', 'Xing ', 'Xian ', 'Huan ', 'Bang ', 'Pei ', 'Ba ', 'Yi ', 'Yin ', 'Han ', 'Xu ', + 0xC0 => 'Chui ', 'Cen ', 'Geng ', 'Ai ', 'Peng ', 'Fang ', 'Que ', 'Yong ', 'Xun ', 'Jia ', 'Di ', 'Mai ', 'Lang ', 'Xuan ', 'Cheng ', 'Yan ', + 0xD0 => 'Jin ', 'Zhe ', 'Lei ', 'Lie ', 'Bu ', 'Cheng ', 'Gomi ', 'Bu ', 'Shi ', 'Xun ', 'Guo ', 'Jiong ', 'Ye ', 'Nian ', 'Di ', 'Yu ', + 0xE0 => 'Bu ', 'Ya ', 'Juan ', 'Sui ', 'Pi ', 'Cheng ', 'Wan ', 'Ju ', 'Lun ', 'Zheng ', 'Kong ', 'Chong ', 'Dong ', 'Dai ', 'Tan ', 'An ', + 0xF0 => 'Cai ', 'Shu ', 'Beng ', 'Kan ', 'Zhi ', 'Duo ', 'Yi ', 'Zhi ', 'Yi ', 'Pei ', 'Ji ', 'Zhun ', 'Qi ', 'Sao ', 'Ju ', 'Ni ', +); diff --git a/sources/resources/transliteration-data/x58.php b/sources/resources/transliteration-data/x58.php new file mode 100644 index 0000000..613a6c5 --- /dev/null +++ b/sources/resources/transliteration-data/x58.php @@ -0,0 +1,20 @@ + 'Ku ', 'Ke ', 'Tang ', 'Kun ', 'Ni ', 'Jian ', 'Dui ', 'Jin ', 'Gang ', 'Yu ', 'E ', 'Peng ', 'Gu ', 'Tu ', 'Leng ', NULL, + 0x10 => 'Ya ', 'Qian ', NULL, 'An ', NULL, 'Duo ', 'Nao ', 'Tu ', 'Cheng ', 'Yin ', 'Hun ', 'Bi ', 'Lian ', 'Guo ', 'Die ', 'Zhuan ', + 0x20 => 'Hou ', 'Bao ', 'Bao ', 'Yu ', 'Di ', 'Mao ', 'Jie ', 'Ruan ', 'E ', 'Geng ', 'Kan ', 'Zong ', 'Yu ', 'Huang ', 'E ', 'Yao ', + 0x30 => 'Yan ', 'Bao ', 'Ji ', 'Mei ', 'Chang ', 'Du ', 'Tuo ', 'Yin ', 'Feng ', 'Zhong ', 'Jie ', 'Zhen ', 'Feng ', 'Gang ', 'Chuan ', 'Jian ', + 0x40 => 'Pyeng ', 'Toride ', 'Xiang ', 'Huang ', 'Leng ', 'Duan ', NULL, 'Xuan ', 'Ji ', 'Ji ', 'Kuai ', 'Ying ', 'Ta ', 'Cheng ', 'Yong ', 'Kai ', + 0x50 => 'Su ', 'Su ', 'Shi ', 'Mi ', 'Ta ', 'Weng ', 'Cheng ', 'Tu ', 'Tang ', 'Que ', 'Zhong ', 'Li ', 'Peng ', 'Bang ', 'Sai ', 'Zang ', + 0x60 => 'Dui ', 'Tian ', 'Wu ', 'Cheng ', 'Xun ', 'Ge ', 'Zhen ', 'Ai ', 'Gong ', 'Yan ', 'Kan ', 'Tian ', 'Yuan ', 'Wen ', 'Xie ', 'Liu ', + 0x70 => 'Ama ', 'Lang ', 'Chang ', 'Peng ', 'Beng ', 'Chen ', 'Cu ', 'Lu ', 'Ou ', 'Qian ', 'Mei ', 'Mo ', 'Zhuan ', 'Shuang ', 'Shu ', 'Lou ', + 0x80 => 'Chi ', 'Man ', 'Biao ', 'Jing ', 'Qi ', 'Shu ', 'Di ', 'Zhang ', 'Kan ', 'Yong ', 'Dian ', 'Chen ', 'Zhi ', 'Xi ', 'Guo ', 'Qiang ', + 0x90 => 'Jin ', 'Di ', 'Shang ', 'Mu ', 'Cui ', 'Yan ', 'Ta ', 'Zeng ', 'Qi ', 'Qiang ', 'Liang ', NULL, 'Zhui ', 'Qiao ', 'Zeng ', 'Xu ', + 0xA0 => 'Shan ', 'Shan ', 'Ba ', 'Pu ', 'Kuai ', 'Dong ', 'Fan ', 'Que ', 'Mo ', 'Dun ', 'Dun ', 'Dun ', 'Di ', 'Sheng ', 'Duo ', 'Duo ', + 0xB0 => 'Tan ', 'Deng ', 'Wu ', 'Fen ', 'Huang ', 'Tan ', 'Da ', 'Ye ', 'Sho ', 'Mama ', 'Yu ', 'Qiang ', 'Ji ', 'Qiao ', 'Ken ', 'Yi ', + 0xC0 => 'Pi ', 'Bi ', 'Dian ', 'Jiang ', 'Ye ', 'Yong ', 'Bo ', 'Tan ', 'Lan ', 'Ju ', 'Huai ', 'Dang ', 'Rang ', 'Qian ', 'Xun ', 'Lan ', + 0xD0 => 'Xi ', 'He ', 'Ai ', 'Ya ', 'Dao ', 'Hao ', 'Ruan ', 'Mama ', 'Lei ', 'Kuang ', 'Lu ', 'Yan ', 'Tan ', 'Wei ', 'Huai ', 'Long ', + 0xE0 => 'Long ', 'Rui ', 'Li ', 'Lin ', 'Rang ', 'Ten ', 'Xun ', 'Yan ', 'Lei ', 'Ba ', NULL, 'Shi ', 'Ren ', NULL, 'Zhuang ', 'Zhuang ', + 0xF0 => 'Sheng ', 'Yi ', 'Mai ', 'Ke ', 'Zhu ', 'Zhuang ', 'Hu ', 'Hu ', 'Kun ', 'Yi ', 'Hu ', 'Xu ', 'Kun ', 'Shou ', 'Mang ', 'Zun ', +); diff --git a/sources/resources/transliteration-data/x59.php b/sources/resources/transliteration-data/x59.php new file mode 100644 index 0000000..8957b9b --- /dev/null +++ b/sources/resources/transliteration-data/x59.php @@ -0,0 +1,20 @@ + 'Shou ', 'Yi ', 'Zhi ', 'Gu ', 'Chu ', 'Jiang ', 'Feng ', 'Bei ', 'Cay ', 'Bian ', 'Sui ', 'Qun ', 'Ling ', 'Fu ', 'Zuo ', 'Xia ', + 0x10 => 'Xiong ', NULL, 'Nao ', 'Xia ', 'Kui ', 'Xi ', 'Wai ', 'Yuan ', 'Mao ', 'Su ', 'Duo ', 'Duo ', 'Ye ', 'Qing ', 'Uys ', 'Gou ', + 0x20 => 'Gou ', 'Qi ', 'Meng ', 'Meng ', 'Yin ', 'Huo ', 'Chen ', 'Da ', 'Ze ', 'Tian ', 'Tai ', 'Fu ', 'Guai ', 'Yao ', 'Yang ', 'Hang ', + 0x30 => 'Gao ', 'Shi ', 'Ben ', 'Tai ', 'Tou ', 'Yan ', 'Bi ', 'Yi ', 'Kua ', 'Jia ', 'Duo ', 'Kwu ', 'Kuang ', 'Yun ', 'Jia ', 'Pa ', + 0x40 => 'En ', 'Lian ', 'Huan ', 'Di ', 'Yan ', 'Pao ', 'Quan ', 'Qi ', 'Nai ', 'Feng ', 'Xie ', 'Fen ', 'Dian ', NULL, 'Kui ', 'Zou ', + 0x50 => 'Huan ', 'Qi ', 'Kai ', 'Zha ', 'Ben ', 'Yi ', 'Jiang ', 'Tao ', 'Zang ', 'Ben ', 'Xi ', 'Xiang ', 'Fei ', 'Diao ', 'Xun ', 'Keng ', + 0x60 => 'Dian ', 'Ao ', 'She ', 'Weng ', 'Pan ', 'Ao ', 'Wu ', 'Ao ', 'Jiang ', 'Lian ', 'Duo ', 'Yun ', 'Jiang ', 'Shi ', 'Fen ', 'Huo ', + 0x70 => 'Bi ', 'Lian ', 'Duo ', 'Nu ', 'Nu ', 'Ding ', 'Nai ', 'Qian ', 'Jian ', 'Ta ', 'Jiu ', 'Nan ', 'Cha ', 'Hao ', 'Xian ', 'Fan ', + 0x80 => 'Ji ', 'Shuo ', 'Ru ', 'Fei ', 'Wang ', 'Hong ', 'Zhuang ', 'Fu ', 'Ma ', 'Dan ', 'Ren ', 'Fu ', 'Jing ', 'Yan ', 'Xie ', 'Wen ', + 0x90 => 'Zhong ', 'Pa ', 'Du ', 'Ji ', 'Keng ', 'Zhong ', 'Yao ', 'Jin ', 'Yun ', 'Miao ', 'Pei ', 'Shi ', 'Yue ', 'Zhuang ', 'Niu ', 'Yan ', + 0xA0 => 'Na ', 'Xin ', 'Fen ', 'Bi ', 'Yu ', 'Tuo ', 'Feng ', 'Yuan ', 'Fang ', 'Wu ', 'Yu ', 'Gui ', 'Du ', 'Ba ', 'Ni ', 'Zhou ', + 0xB0 => 'Zhuo ', 'Zhao ', 'Da ', 'Nai ', 'Yuan ', 'Tou ', 'Xuan ', 'Zhi ', 'E ', 'Mei ', 'Mo ', 'Qi ', 'Bi ', 'Shen ', 'Qie ', 'E ', + 0xC0 => 'He ', 'Xu ', 'Fa ', 'Zheng ', 'Min ', 'Ban ', 'Mu ', 'Fu ', 'Ling ', 'Zi ', 'Zi ', 'Shi ', 'Ran ', 'Shan ', 'Yang ', 'Man ', + 0xD0 => 'Jie ', 'Gu ', 'Si ', 'Xing ', 'Wei ', 'Zi ', 'Ju ', 'Shan ', 'Pin ', 'Ren ', 'Yao ', 'Tong ', 'Jiang ', 'Shu ', 'Ji ', 'Gai ', + 0xE0 => 'Shang ', 'Kuo ', 'Juan ', 'Jiao ', 'Gou ', 'Mu ', 'Jian ', 'Jian ', 'Yi ', 'Nian ', 'Zhi ', 'Ji ', 'Ji ', 'Xian ', 'Heng ', 'Guang ', + 0xF0 => 'Jun ', 'Kua ', 'Yan ', 'Ming ', 'Lie ', 'Pei ', 'Yan ', 'You ', 'Yan ', 'Cha ', 'Shen ', 'Yin ', 'Chi ', 'Gui ', 'Quan ', 'Zi ', +); diff --git a/sources/resources/transliteration-data/x5a.php b/sources/resources/transliteration-data/x5a.php new file mode 100644 index 0000000..7ec153e --- /dev/null +++ b/sources/resources/transliteration-data/x5a.php @@ -0,0 +1,20 @@ + 'Song ', 'Wei ', 'Hong ', 'Wa ', 'Lou ', 'Ya ', 'Rao ', 'Jiao ', 'Luan ', 'Ping ', 'Xian ', 'Shao ', 'Li ', 'Cheng ', 'Xiao ', 'Mang ', + 0x10 => 'Fu ', 'Suo ', 'Wu ', 'Wei ', 'Ke ', 'Lai ', 'Chuo ', 'Ding ', 'Niang ', 'Xing ', 'Nan ', 'Yu ', 'Nuo ', 'Pei ', 'Nei ', 'Juan ', + 0x20 => 'Shen ', 'Zhi ', 'Han ', 'Di ', 'Zhuang ', 'E ', 'Pin ', 'Tui ', 'Han ', 'Mian ', 'Wu ', 'Yan ', 'Wu ', 'Xi ', 'Yan ', 'Yu ', + 0x30 => 'Si ', 'Yu ', 'Wa ', NULL, 'Xian ', 'Ju ', 'Qu ', 'Shui ', 'Qi ', 'Xian ', 'Zhui ', 'Dong ', 'Chang ', 'Lu ', 'Ai ', 'E ', + 0x40 => 'E ', 'Lou ', 'Mian ', 'Cong ', 'Pou ', 'Ju ', 'Po ', 'Cai ', 'Ding ', 'Wan ', 'Biao ', 'Xiao ', 'Shu ', 'Qi ', 'Hui ', 'Fu ', + 0x50 => 'E ', 'Wo ', 'Tan ', 'Fei ', 'Wei ', 'Jie ', 'Tian ', 'Ni ', 'Quan ', 'Jing ', 'Hun ', 'Jing ', 'Qian ', 'Dian ', 'Xing ', 'Hu ', + 0x60 => 'Wa ', 'Lai ', 'Bi ', 'Yin ', 'Chou ', 'Chuo ', 'Fu ', 'Jing ', 'Lun ', 'Yan ', 'Lan ', 'Kun ', 'Yin ', 'Ya ', 'Ju ', 'Li ', + 0x70 => 'Dian ', 'Xian ', 'Hwa ', 'Hua ', 'Ying ', 'Chan ', 'Shen ', 'Ting ', 'Dang ', 'Yao ', 'Wu ', 'Nan ', 'Ruo ', 'Jia ', 'Tou ', 'Xu ', + 0x80 => 'Yu ', 'Wei ', 'Ti ', 'Rou ', 'Mei ', 'Dan ', 'Ruan ', 'Qin ', 'Hui ', 'Wu ', 'Qian ', 'Chun ', 'Mao ', 'Fu ', 'Jie ', 'Duan ', + 0x90 => 'Xi ', 'Zhong ', 'Mei ', 'Huang ', 'Mian ', 'An ', 'Ying ', 'Xuan ', 'Jie ', 'Wei ', 'Mei ', 'Yuan ', 'Zhen ', 'Qiu ', 'Ti ', 'Xie ', + 0xA0 => 'Tuo ', 'Lian ', 'Mao ', 'Ran ', 'Si ', 'Pian ', 'Wei ', 'Wa ', 'Jiu ', 'Hu ', 'Ao ', NULL, 'Bou ', 'Xu ', 'Tou ', 'Gui ', + 0xB0 => 'Zou ', 'Yao ', 'Pi ', 'Xi ', 'Yuan ', 'Ying ', 'Rong ', 'Ru ', 'Chi ', 'Liu ', 'Mei ', 'Pan ', 'Ao ', 'Ma ', 'Gou ', 'Kui ', + 0xC0 => 'Qin ', 'Jia ', 'Sao ', 'Zhen ', 'Yuan ', 'Cha ', 'Yong ', 'Ming ', 'Ying ', 'Ji ', 'Su ', 'Niao ', 'Xian ', 'Tao ', 'Pang ', 'Lang ', + 0xD0 => 'Nao ', 'Bao ', 'Ai ', 'Pi ', 'Pin ', 'Yi ', 'Piao ', 'Yu ', 'Lei ', 'Xuan ', 'Man ', 'Yi ', 'Zhang ', 'Kang ', 'Yong ', 'Ni ', + 0xE0 => 'Li ', 'Di ', 'Gui ', 'Yan ', 'Jin ', 'Zhuan ', 'Chang ', 'Ce ', 'Han ', 'Nen ', 'Lao ', 'Mo ', 'Zhe ', 'Hu ', 'Hu ', 'Ao ', + 0xF0 => 'Nen ', 'Qiang ', 'Ma ', 'Pie ', 'Gu ', 'Wu ', 'Jiao ', 'Tuo ', 'Zhan ', 'Mao ', 'Xian ', 'Xian ', 'Mo ', 'Liao ', 'Lian ', 'Hua ', +); diff --git a/sources/resources/transliteration-data/x5b.php b/sources/resources/transliteration-data/x5b.php new file mode 100644 index 0000000..a605257 --- /dev/null +++ b/sources/resources/transliteration-data/x5b.php @@ -0,0 +1,20 @@ + 'Gui ', 'Deng ', 'Zhi ', 'Xu ', 'Yi ', 'Hua ', 'Xi ', 'Hui ', 'Rao ', 'Xi ', 'Yan ', 'Chan ', 'Jiao ', 'Mei ', 'Fan ', 'Fan ', + 0x10 => 'Xian ', 'Yi ', 'Wei ', 'Jiao ', 'Fu ', 'Shi ', 'Bi ', 'Shan ', 'Sui ', 'Qiang ', 'Lian ', 'Huan ', 'Xin ', 'Niao ', 'Dong ', 'Yi ', + 0x20 => 'Can ', 'Ai ', 'Niang ', 'Neng ', 'Ma ', 'Tiao ', 'Chou ', 'Jin ', 'Ci ', 'Yu ', 'Pin ', 'Yong ', 'Xu ', 'Nai ', 'Yan ', 'Tai ', + 0x30 => 'Ying ', 'Can ', 'Niao ', 'Wo ', 'Ying ', 'Mian ', 'Kaka ', 'Ma ', 'Shen ', 'Xing ', 'Ni ', 'Du ', 'Liu ', 'Yuan ', 'Lan ', 'Yan ', + 0x40 => 'Shuang ', 'Ling ', 'Jiao ', 'Niang ', 'Lan ', 'Xian ', 'Ying ', 'Shuang ', 'Shuai ', 'Quan ', 'Mi ', 'Li ', 'Luan ', 'Yan ', 'Zhu ', 'Lan ', + 0x50 => 'Zi ', 'Jie ', 'Jue ', 'Jue ', 'Kong ', 'Yun ', 'Zi ', 'Zi ', 'Cun ', 'Sun ', 'Fu ', 'Bei ', 'Zi ', 'Xiao ', 'Xin ', 'Meng ', + 0x60 => 'Si ', 'Tai ', 'Bao ', 'Ji ', 'Gu ', 'Nu ', 'Xue ', NULL, 'Zhuan ', 'Hai ', 'Luan ', 'Sun ', 'Huai ', 'Mie ', 'Cong ', 'Qian ', + 0x70 => 'Shu ', 'Chan ', 'Ya ', 'Zi ', 'Ni ', 'Fu ', 'Zi ', 'Li ', 'Xue ', 'Bo ', 'Ru ', 'Lai ', 'Nie ', 'Nie ', 'Ying ', 'Luan ', + 0x80 => 'Mian ', 'Ning ', 'Rong ', 'Ta ', 'Gui ', 'Zhai ', 'Qiong ', 'Yu ', 'Shou ', 'An ', 'Tu ', 'Song ', 'Wan ', 'Rou ', 'Yao ', 'Hong ', + 0x90 => 'Yi ', 'Jing ', 'Zhun ', 'Mi ', 'Zhu ', 'Dang ', 'Hong ', 'Zong ', 'Guan ', 'Zhou ', 'Ding ', 'Wan ', 'Yi ', 'Bao ', 'Shi ', 'Shi ', + 0xA0 => 'Chong ', 'Shen ', 'Ke ', 'Xuan ', 'Shi ', 'You ', 'Huan ', 'Yi ', 'Tiao ', 'Shi ', 'Xian ', 'Gong ', 'Cheng ', 'Qun ', 'Gong ', 'Xiao ', + 0xB0 => 'Zai ', 'Zha ', 'Bao ', 'Hai ', 'Yan ', 'Xiao ', 'Jia ', 'Shen ', 'Chen ', 'Rong ', 'Huang ', 'Mi ', 'Kou ', 'Kuan ', 'Bin ', 'Su ', + 0xC0 => 'Cai ', 'Zan ', 'Ji ', 'Yuan ', 'Ji ', 'Yin ', 'Mi ', 'Kou ', 'Qing ', 'Que ', 'Zhen ', 'Jian ', 'Fu ', 'Ning ', 'Bing ', 'Huan ', + 0xD0 => 'Mei ', 'Qin ', 'Han ', 'Yu ', 'Shi ', 'Ning ', 'Qin ', 'Ning ', 'Zhi ', 'Yu ', 'Bao ', 'Kuan ', 'Ning ', 'Qin ', 'Mo ', 'Cha ', + 0xE0 => 'Ju ', 'Gua ', 'Qin ', 'Hu ', 'Wu ', 'Liao ', 'Shi ', 'Zhu ', 'Zhai ', 'Shen ', 'Wei ', 'Xie ', 'Kuan ', 'Hui ', 'Liao ', 'Jun ', + 0xF0 => 'Huan ', 'Yi ', 'Yi ', 'Bao ', 'Qin ', 'Chong ', 'Bao ', 'Feng ', 'Cun ', 'Dui ', 'Si ', 'Xun ', 'Dao ', 'Lu ', 'Dui ', 'Shou ', +); diff --git a/sources/resources/transliteration-data/x5c.php b/sources/resources/transliteration-data/x5c.php new file mode 100644 index 0000000..dad1a39 --- /dev/null +++ b/sources/resources/transliteration-data/x5c.php @@ -0,0 +1,20 @@ + 'Po ', 'Feng ', 'Zhuan ', 'Fu ', 'She ', 'Ke ', 'Jiang ', 'Jiang ', 'Zhuan ', 'Wei ', 'Zun ', 'Xun ', 'Shu ', 'Dui ', 'Dao ', 'Xiao ', + 0x10 => 'Ji ', 'Shao ', 'Er ', 'Er ', 'Er ', 'Ga ', 'Jian ', 'Shu ', 'Chen ', 'Shang ', 'Shang ', 'Mo ', 'Ga ', 'Chang ', 'Liao ', 'Xian ', + 0x20 => 'Xian ', NULL, 'Wang ', 'Wang ', 'You ', 'Liao ', 'Liao ', 'Yao ', 'Mang ', 'Wang ', 'Wang ', 'Wang ', 'Ga ', 'Yao ', 'Duo ', 'Kui ', + 0x30 => 'Zhong ', 'Jiu ', 'Gan ', 'Gu ', 'Gan ', 'Tui ', 'Gan ', 'Gan ', 'Shi ', 'Yin ', 'Chi ', 'Kao ', 'Ni ', 'Jin ', 'Wei ', 'Niao ', + 0x40 => 'Ju ', 'Pi ', 'Ceng ', 'Xi ', 'Bi ', 'Ju ', 'Jie ', 'Tian ', 'Qu ', 'Ti ', 'Jie ', 'Wu ', 'Diao ', 'Shi ', 'Shi ', 'Ping ', + 0x50 => 'Ji ', 'Xie ', 'Chen ', 'Xi ', 'Ni ', 'Zhan ', 'Xi ', NULL, 'Man ', 'E ', 'Lou ', 'Ping ', 'Ti ', 'Fei ', 'Shu ', 'Xie ', + 0x60 => 'Tu ', 'Lu ', 'Lu ', 'Xi ', 'Ceng ', 'Lu ', 'Ju ', 'Xie ', 'Ju ', 'Jue ', 'Liao ', 'Jue ', 'Shu ', 'Xi ', 'Che ', 'Tun ', + 0x70 => 'Ni ', 'Shan ', NULL, 'Xian ', 'Li ', 'Xue ', 'Nata ', NULL, 'Long ', 'Yi ', 'Qi ', 'Ren ', 'Wu ', 'Han ', 'Shen ', 'Yu ', + 0x80 => 'Chu ', 'Sui ', 'Qi ', NULL, 'Yue ', 'Ban ', 'Yao ', 'Ang ', 'Ya ', 'Wu ', 'Jie ', 'E ', 'Ji ', 'Qian ', 'Fen ', 'Yuan ', + 0x90 => 'Qi ', 'Cen ', 'Qian ', 'Qi ', 'Cha ', 'Jie ', 'Qu ', 'Gang ', 'Xian ', 'Ao ', 'Lan ', 'Dao ', 'Ba ', 'Zuo ', 'Zuo ', 'Yang ', + 0xA0 => 'Ju ', 'Gang ', 'Ke ', 'Gou ', 'Xue ', 'Bei ', 'Li ', 'Tiao ', 'Ju ', 'Yan ', 'Fu ', 'Xiu ', 'Jia ', 'Ling ', 'Tuo ', 'Pei ', + 0xB0 => 'You ', 'Dai ', 'Kuang ', 'Yue ', 'Qu ', 'Hu ', 'Po ', 'Min ', 'An ', 'Tiao ', 'Ling ', 'Chi ', 'Yuri ', 'Dong ', 'Cem ', 'Kui ', + 0xC0 => 'Xiu ', 'Mao ', 'Tong ', 'Xue ', 'Yi ', 'Kura ', 'He ', 'Ke ', 'Luo ', 'E ', 'Fu ', 'Xun ', 'Die ', 'Lu ', 'An ', 'Er ', + 0xD0 => 'Gai ', 'Quan ', 'Tong ', 'Yi ', 'Mu ', 'Shi ', 'An ', 'Wei ', 'Hu ', 'Zhi ', 'Mi ', 'Li ', 'Ji ', 'Tong ', 'Wei ', 'You ', + 0xE0 => 'Sang ', 'Xia ', 'Li ', 'Yao ', 'Jiao ', 'Zheng ', 'Luan ', 'Jiao ', 'E ', 'E ', 'Yu ', 'Ye ', 'Bu ', 'Qiao ', 'Qun ', 'Feng ', + 0xF0 => 'Feng ', 'Nao ', 'Li ', 'You ', 'Xian ', 'Hong ', 'Dao ', 'Shen ', 'Cheng ', 'Tu ', 'Geng ', 'Jun ', 'Hao ', 'Xia ', 'Yin ', 'Yu ', +); diff --git a/sources/resources/transliteration-data/x5d.php b/sources/resources/transliteration-data/x5d.php new file mode 100644 index 0000000..ca4f58a --- /dev/null +++ b/sources/resources/transliteration-data/x5d.php @@ -0,0 +1,20 @@ + 'Lang ', 'Kan ', 'Lao ', 'Lai ', 'Xian ', 'Que ', 'Kong ', 'Chong ', 'Chong ', 'Ta ', 'Lin ', 'Hua ', 'Ju ', 'Lai ', 'Qi ', 'Min ', + 0x10 => 'Kun ', 'Kun ', 'Zu ', 'Gu ', 'Cui ', 'Ya ', 'Ya ', 'Gang ', 'Lun ', 'Lun ', 'Leng ', 'Jue ', 'Duo ', 'Zheng ', 'Guo ', 'Yin ', + 0x20 => 'Dong ', 'Han ', 'Zheng ', 'Wei ', 'Yao ', 'Pi ', 'Yan ', 'Song ', 'Jie ', 'Beng ', 'Zu ', 'Jue ', 'Dong ', 'Zhan ', 'Gu ', 'Yin ', + 0x30 => NULL, 'Ze ', 'Huang ', 'Yu ', 'Wei ', 'Yang ', 'Feng ', 'Qiu ', 'Dun ', 'Ti ', 'Yi ', 'Zhi ', 'Shi ', 'Zai ', 'Yao ', 'E ', + 0x40 => 'Zhu ', 'Kan ', 'Lu ', 'Yan ', 'Mei ', 'Gan ', 'Ji ', 'Ji ', 'Huan ', 'Ting ', 'Sheng ', 'Mei ', 'Qian ', 'Wu ', 'Yu ', 'Zong ', + 0x50 => 'Lan ', 'Jue ', 'Yan ', 'Yan ', 'Wei ', 'Zong ', 'Cha ', 'Sui ', 'Rong ', 'Yamashina ', 'Qin ', 'Yu ', 'Kewashii ', 'Lou ', 'Tu ', 'Dui ', + 0x60 => 'Xi ', 'Weng ', 'Cang ', 'Dang ', 'Hong ', 'Jie ', 'Ai ', 'Liu ', 'Wu ', 'Song ', 'Qiao ', 'Zi ', 'Wei ', 'Beng ', 'Dian ', 'Cuo ', + 0x70 => 'Qian ', 'Yong ', 'Nie ', 'Cuo ', 'Ji ', NULL, 'Tao ', 'Song ', 'Zong ', 'Jiang ', 'Liao ', 'Kang ', 'Chan ', 'Die ', 'Cen ', 'Ding ', + 0x80 => 'Tu ', 'Lou ', 'Zhang ', 'Zhan ', 'Zhan ', 'Ao ', 'Cao ', 'Qu ', 'Qiang ', 'Zui ', 'Zui ', 'Dao ', 'Dao ', 'Xi ', 'Yu ', 'Bo ', + 0x90 => 'Long ', 'Xiang ', 'Ceng ', 'Bo ', 'Qin ', 'Jiao ', 'Yan ', 'Lao ', 'Zhan ', 'Lin ', 'Liao ', 'Liao ', 'Jin ', 'Deng ', 'Duo ', 'Zun ', + 0xA0 => 'Jiao ', 'Gui ', 'Yao ', 'Qiao ', 'Yao ', 'Jue ', 'Zhan ', 'Yi ', 'Xue ', 'Nao ', 'Ye ', 'Ye ', 'Yi ', 'E ', 'Xian ', 'Ji ', + 0xB0 => 'Xie ', 'Ke ', 'Xi ', 'Di ', 'Ao ', 'Zui ', NULL, 'Ni ', 'Rong ', 'Dao ', 'Ling ', 'Za ', 'Yu ', 'Yue ', 'Yin ', NULL, + 0xC0 => 'Jie ', 'Li ', 'Sui ', 'Long ', 'Long ', 'Dian ', 'Ying ', 'Xi ', 'Ju ', 'Chan ', 'Ying ', 'Kui ', 'Yan ', 'Wei ', 'Nao ', 'Quan ', + 0xD0 => 'Chao ', 'Cuan ', 'Luan ', 'Dian ', 'Dian ', NULL, 'Yan ', 'Yan ', 'Yan ', 'Nao ', 'Yan ', 'Chuan ', 'Gui ', 'Chuan ', 'Zhou ', 'Huang ', + 0xE0 => 'Jing ', 'Xun ', 'Chao ', 'Chao ', 'Lie ', 'Gong ', 'Zuo ', 'Qiao ', 'Ju ', 'Gong ', 'Kek ', 'Wu ', 'Pwu ', 'Pwu ', 'Chai ', 'Qiu ', + 0xF0 => 'Qiu ', 'Ji ', 'Yi ', 'Si ', 'Ba ', 'Zhi ', 'Zhao ', 'Xiang ', 'Yi ', 'Jin ', 'Xun ', 'Juan ', 'Phas ', 'Xun ', 'Jin ', 'Fu ', +); diff --git a/sources/resources/transliteration-data/x5e.php b/sources/resources/transliteration-data/x5e.php new file mode 100644 index 0000000..53eae83 --- /dev/null +++ b/sources/resources/transliteration-data/x5e.php @@ -0,0 +1,20 @@ + 'Za ', 'Bi ', 'Shi ', 'Bu ', 'Ding ', 'Shuai ', 'Fan ', 'Nie ', 'Shi ', 'Fen ', 'Pa ', 'Zhi ', 'Xi ', 'Hu ', 'Dan ', 'Wei ', + 0x10 => 'Zhang ', 'Tang ', 'Dai ', 'Ma ', 'Pei ', 'Pa ', 'Tie ', 'Fu ', 'Lian ', 'Zhi ', 'Zhou ', 'Bo ', 'Zhi ', 'Di ', 'Mo ', 'Yi ', + 0x20 => 'Yi ', 'Ping ', 'Qia ', 'Juan ', 'Ru ', 'Shuai ', 'Dai ', 'Zheng ', 'Shui ', 'Qiao ', 'Zhen ', 'Shi ', 'Qun ', 'Xi ', 'Bang ', 'Dai ', + 0x30 => 'Gui ', 'Chou ', 'Ping ', 'Zhang ', 'Sha ', 'Wan ', 'Dai ', 'Wei ', 'Chang ', 'Sha ', 'Qi ', 'Ze ', 'Guo ', 'Mao ', 'Du ', 'Hou ', + 0x40 => 'Zheng ', 'Xu ', 'Mi ', 'Wei ', 'Wo ', 'Fu ', 'Yi ', 'Bang ', 'Ping ', 'Tazuna ', 'Gong ', 'Pan ', 'Huang ', 'Dao ', 'Mi ', 'Jia ', + 0x50 => 'Teng ', 'Hui ', 'Zhong ', 'Shan ', 'Man ', 'Mu ', 'Biao ', 'Guo ', 'Ze ', 'Mu ', 'Bang ', 'Zhang ', 'Jiong ', 'Chan ', 'Fu ', 'Zhi ', + 0x60 => 'Hu ', 'Fan ', 'Chuang ', 'Bi ', 'Hei ', NULL, 'Mi ', 'Qiao ', 'Chan ', 'Fen ', 'Meng ', 'Bang ', 'Chou ', 'Mie ', 'Chu ', 'Jie ', + 0x70 => 'Xian ', 'Lan ', 'Gan ', 'Ping ', 'Nian ', 'Qian ', 'Bing ', 'Bing ', 'Xing ', 'Gan ', 'Yao ', 'Huan ', 'You ', 'You ', 'Ji ', 'Guang ', + 0x80 => 'Pi ', 'Ting ', 'Ze ', 'Guang ', 'Zhuang ', 'Mo ', 'Qing ', 'Bi ', 'Qin ', 'Dun ', 'Chuang ', 'Gui ', 'Ya ', 'Bai ', 'Jie ', 'Xu ', + 0x90 => 'Lu ', 'Wu ', NULL, 'Ku ', 'Ying ', 'Di ', 'Pao ', 'Dian ', 'Ya ', 'Miao ', 'Geng ', 'Ci ', 'Fu ', 'Tong ', 'Pang ', 'Fei ', + 0xA0 => 'Xiang ', 'Yi ', 'Zhi ', 'Tiao ', 'Zhi ', 'Xiu ', 'Du ', 'Zuo ', 'Xiao ', 'Tu ', 'Gui ', 'Ku ', 'Pang ', 'Ting ', 'You ', 'Bu ', + 0xB0 => 'Ding ', 'Cheng ', 'Lai ', 'Bei ', 'Ji ', 'An ', 'Shu ', 'Kang ', 'Yong ', 'Tuo ', 'Song ', 'Shu ', 'Qing ', 'Yu ', 'Yu ', 'Miao ', + 0xC0 => 'Sou ', 'Ce ', 'Xiang ', 'Fei ', 'Jiu ', 'He ', 'Hui ', 'Liu ', 'Sha ', 'Lian ', 'Lang ', 'Sou ', 'Jian ', 'Pou ', 'Qing ', 'Jiu ', + 0xD0 => 'Jiu ', 'Qin ', 'Ao ', 'Kuo ', 'Lou ', 'Yin ', 'Liao ', 'Dai ', 'Lu ', 'Yi ', 'Chu ', 'Chan ', 'Tu ', 'Si ', 'Xin ', 'Miao ', + 0xE0 => 'Chang ', 'Wu ', 'Fei ', 'Guang ', 'Koc ', 'Kuai ', 'Bi ', 'Qiang ', 'Xie ', 'Lin ', 'Lin ', 'Liao ', 'Lu ', NULL, 'Ying ', 'Xian ', + 0xF0 => 'Ting ', 'Yong ', 'Li ', 'Ting ', 'Yin ', 'Xun ', 'Yan ', 'Ting ', 'Di ', 'Po ', 'Jian ', 'Hui ', 'Nai ', 'Hui ', 'Gong ', 'Nian ', +); diff --git a/sources/resources/transliteration-data/x5f.php b/sources/resources/transliteration-data/x5f.php new file mode 100644 index 0000000..81bb9ec --- /dev/null +++ b/sources/resources/transliteration-data/x5f.php @@ -0,0 +1,20 @@ + 'Kai ', 'Bian ', 'Yi ', 'Qi ', 'Nong ', 'Fen ', 'Ju ', 'Yan ', 'Yi ', 'Zang ', 'Bi ', 'Yi ', 'Yi ', 'Er ', 'San ', 'Shi ', + 0x10 => 'Er ', 'Shi ', 'Shi ', 'Gong ', 'Diao ', 'Yin ', 'Hu ', 'Fu ', 'Hong ', 'Wu ', 'Tui ', 'Chi ', 'Jiang ', 'Ba ', 'Shen ', 'Di ', + 0x20 => 'Zhang ', 'Jue ', 'Tao ', 'Fu ', 'Di ', 'Mi ', 'Xian ', 'Hu ', 'Chao ', 'Nu ', 'Jing ', 'Zhen ', 'Yi ', 'Mi ', 'Quan ', 'Wan ', + 0x30 => 'Shao ', 'Ruo ', 'Xuan ', 'Jing ', 'Dun ', 'Zhang ', 'Jiang ', 'Qiang ', 'Peng ', 'Dan ', 'Qiang ', 'Bi ', 'Bi ', 'She ', 'Dan ', 'Jian ', + 0x40 => 'Gou ', 'Sei ', 'Fa ', 'Bi ', 'Kou ', 'Nagi ', 'Bie ', 'Xiao ', 'Dan ', 'Kuo ', 'Qiang ', 'Hong ', 'Mi ', 'Kuo ', 'Wan ', 'Jue ', + 0x50 => 'Ji ', 'Ji ', 'Gui ', 'Dang ', 'Lu ', 'Lu ', 'Tuan ', 'Hui ', 'Zhi ', 'Hui ', 'Hui ', 'Yi ', 'Yi ', 'Yi ', 'Yi ', 'Huo ', + 0x60 => 'Huo ', 'Shan ', 'Xing ', 'Wen ', 'Tong ', 'Yan ', 'Yan ', 'Yu ', 'Chi ', 'Cai ', 'Biao ', 'Diao ', 'Bin ', 'Peng ', 'Yong ', 'Piao ', + 0x70 => 'Zhang ', 'Ying ', 'Chi ', 'Chi ', 'Zhuo ', 'Tuo ', 'Ji ', 'Pang ', 'Zhong ', 'Yi ', 'Wang ', 'Che ', 'Bi ', 'Chi ', 'Ling ', 'Fu ', + 0x80 => 'Wang ', 'Zheng ', 'Cu ', 'Wang ', 'Jing ', 'Dai ', 'Xi ', 'Xun ', 'Hen ', 'Yang ', 'Huai ', 'Lu ', 'Hou ', 'Wa ', 'Cheng ', 'Zhi ', + 0x90 => 'Xu ', 'Jing ', 'Tu ', 'Cong ', NULL, 'Lai ', 'Cong ', 'De ', 'Pai ', 'Xi ', NULL, 'Qi ', 'Chang ', 'Zhi ', 'Cong ', 'Zhou ', + 0xA0 => 'Lai ', 'Yu ', 'Xie ', 'Jie ', 'Jian ', 'Chi ', 'Jia ', 'Bian ', 'Huang ', 'Fu ', 'Xun ', 'Wei ', 'Pang ', 'Yao ', 'Wei ', 'Xi ', + 0xB0 => 'Zheng ', 'Piao ', 'Chi ', 'De ', 'Zheng ', 'Zheng ', 'Bie ', 'De ', 'Chong ', 'Che ', 'Jiao ', 'Wei ', 'Jiao ', 'Hui ', 'Mei ', 'Long ', + 0xC0 => 'Xiang ', 'Bao ', 'Qu ', 'Xin ', 'Shu ', 'Bi ', 'Yi ', 'Le ', 'Ren ', 'Dao ', 'Ding ', 'Gai ', 'Ji ', 'Ren ', 'Ren ', 'Chan ', + 0xD0 => 'Tan ', 'Te ', 'Te ', 'Gan ', 'Qi ', 'Shi ', 'Cun ', 'Zhi ', 'Wang ', 'Mang ', 'Xi ', 'Fan ', 'Ying ', 'Tian ', 'Min ', 'Min ', + 0xE0 => 'Zhong ', 'Chong ', 'Wu ', 'Ji ', 'Wu ', 'Xi ', 'Ye ', 'You ', 'Wan ', 'Cong ', 'Zhong ', 'Kuai ', 'Yu ', 'Bian ', 'Zhi ', 'Qi ', + 0xF0 => 'Cui ', 'Chen ', 'Tai ', 'Tun ', 'Qian ', 'Nian ', 'Hun ', 'Xiong ', 'Niu ', 'Wang ', 'Xian ', 'Xin ', 'Kang ', 'Hu ', 'Kai ', 'Fen ', +); diff --git a/sources/resources/transliteration-data/x60.php b/sources/resources/transliteration-data/x60.php new file mode 100644 index 0000000..bdedd3d --- /dev/null +++ b/sources/resources/transliteration-data/x60.php @@ -0,0 +1,20 @@ + 'Huai ', 'Tai ', 'Song ', 'Wu ', 'Ou ', 'Chang ', 'Chuang ', 'Ju ', 'Yi ', 'Bao ', 'Chao ', 'Min ', 'Pei ', 'Zuo ', 'Zen ', 'Yang ', + 0x10 => 'Kou ', 'Ban ', 'Nu ', 'Nao ', 'Zheng ', 'Pa ', 'Bu ', 'Tie ', 'Gu ', 'Hu ', 'Ju ', 'Da ', 'Lian ', 'Si ', 'Chou ', 'Di ', + 0x20 => 'Dai ', 'Yi ', 'Tu ', 'You ', 'Fu ', 'Ji ', 'Peng ', 'Xing ', 'Yuan ', 'Ni ', 'Guai ', 'Fu ', 'Xi ', 'Bi ', 'You ', 'Qie ', + 0x30 => 'Xuan ', 'Cong ', 'Bing ', 'Huang ', 'Xu ', 'Chu ', 'Pi ', 'Xi ', 'Xi ', 'Tan ', 'Koraeru ', 'Zong ', 'Dui ', NULL, 'Ki ', 'Yi ', + 0x40 => 'Chi ', 'Ren ', 'Xun ', 'Shi ', 'Xi ', 'Lao ', 'Heng ', 'Kuang ', 'Mu ', 'Zhi ', 'Xie ', 'Lian ', 'Tiao ', 'Huang ', 'Die ', 'Hao ', + 0x50 => 'Kong ', 'Gui ', 'Heng ', 'Xi ', 'Xiao ', 'Shu ', 'S ', 'Kua ', 'Qiu ', 'Yang ', 'Hui ', 'Hui ', 'Chi ', 'Jia ', 'Yi ', 'Xiong ', + 0x60 => 'Guai ', 'Lin ', 'Hui ', 'Zi ', 'Xu ', 'Chi ', 'Xiang ', 'Nu ', 'Hen ', 'En ', 'Ke ', 'Tong ', 'Tian ', 'Gong ', 'Quan ', 'Xi ', + 0x70 => 'Qia ', 'Yue ', 'Peng ', 'Ken ', 'De ', 'Hui ', 'E ', 'Kyuu ', 'Tong ', 'Yan ', 'Kai ', 'Ce ', 'Nao ', 'Yun ', 'Mang ', 'Yong ', + 0x80 => 'Yong ', 'Yuan ', 'Pi ', 'Kun ', 'Qiao ', 'Yue ', 'Yu ', 'Yu ', 'Jie ', 'Xi ', 'Zhe ', 'Lin ', 'Ti ', 'Han ', 'Hao ', 'Qie ', + 0x90 => 'Ti ', 'Bu ', 'Yi ', 'Qian ', 'Hui ', 'Xi ', 'Bei ', 'Man ', 'Yi ', 'Heng ', 'Song ', 'Quan ', 'Cheng ', 'Hui ', 'Wu ', 'Wu ', + 0xA0 => 'You ', 'Li ', 'Liang ', 'Huan ', 'Cong ', 'Yi ', 'Yue ', 'Li ', 'Nin ', 'Nao ', 'E ', 'Que ', 'Xuan ', 'Qian ', 'Wu ', 'Min ', + 0xB0 => 'Cong ', 'Fei ', 'Bei ', 'Duo ', 'Cui ', 'Chang ', 'Men ', 'Li ', 'Ji ', 'Guan ', 'Guan ', 'Xing ', 'Dao ', 'Qi ', 'Kong ', 'Tian ', + 0xC0 => 'Lun ', 'Xi ', 'Kan ', 'Kun ', 'Ni ', 'Qing ', 'Chou ', 'Dun ', 'Guo ', 'Chan ', 'Liang ', 'Wan ', 'Yuan ', 'Jin ', 'Ji ', 'Lin ', + 0xD0 => 'Yu ', 'Huo ', 'He ', 'Quan ', 'Tan ', 'Ti ', 'Ti ', 'Nie ', 'Wang ', 'Chuo ', 'Bu ', 'Hun ', 'Xi ', 'Tang ', 'Xin ', 'Wei ', + 0xE0 => 'Hui ', 'E ', 'Rui ', 'Zong ', 'Jian ', 'Yong ', 'Dian ', 'Ju ', 'Can ', 'Cheng ', 'De ', 'Bei ', 'Qie ', 'Can ', 'Dan ', 'Guan ', + 0xF0 => 'Duo ', 'Nao ', 'Yun ', 'Xiang ', 'Zhui ', 'Die ', 'Huang ', 'Chun ', 'Qiong ', 'Re ', 'Xing ', 'Ce ', 'Bian ', 'Hun ', 'Zong ', 'Ti ', +); diff --git a/sources/resources/transliteration-data/x61.php b/sources/resources/transliteration-data/x61.php new file mode 100644 index 0000000..dcfba4e --- /dev/null +++ b/sources/resources/transliteration-data/x61.php @@ -0,0 +1,20 @@ + 'Qiao ', 'Chou ', 'Bei ', 'Xuan ', 'Wei ', 'Ge ', 'Qian ', 'Wei ', 'Yu ', 'Yu ', 'Bi ', 'Xuan ', 'Huan ', 'Min ', 'Bi ', 'Yi ', + 0x10 => 'Mian ', 'Yong ', 'Kai ', 'Dang ', 'Yin ', 'E ', 'Chen ', 'Mou ', 'Ke ', 'Ke ', 'Yu ', 'Ai ', 'Qie ', 'Yan ', 'Nuo ', 'Gan ', + 0x20 => 'Yun ', 'Zong ', 'Sai ', 'Leng ', 'Fen ', NULL, 'Kui ', 'Kui ', 'Que ', 'Gong ', 'Yun ', 'Su ', 'Su ', 'Qi ', 'Yao ', 'Song ', + 0x30 => 'Huang ', 'Ji ', 'Gu ', 'Ju ', 'Chuang ', 'Ni ', 'Xie ', 'Kai ', 'Zheng ', 'Yong ', 'Cao ', 'Sun ', 'Shen ', 'Bo ', 'Kai ', 'Yuan ', + 0x40 => 'Xie ', 'Hun ', 'Yong ', 'Yang ', 'Li ', 'Sao ', 'Tao ', 'Yin ', 'Ci ', 'Xu ', 'Qian ', 'Tai ', 'Huang ', 'Yun ', 'Shen ', 'Ming ', + 0x50 => NULL, 'She ', 'Cong ', 'Piao ', 'Mo ', 'Mu ', 'Guo ', 'Chi ', 'Can ', 'Can ', 'Can ', 'Cui ', 'Min ', 'Te ', 'Zhang ', 'Tong ', + 0x60 => 'Ao ', 'Shuang ', 'Man ', 'Guan ', 'Que ', 'Zao ', 'Jiu ', 'Hui ', 'Kai ', 'Lian ', 'Ou ', 'Song ', 'Jin ', 'Yin ', 'Lu ', 'Shang ', + 0x70 => 'Wei ', 'Tuan ', 'Man ', 'Qian ', 'She ', 'Yong ', 'Qing ', 'Kang ', 'Di ', 'Zhi ', 'Lou ', 'Juan ', 'Qi ', 'Qi ', 'Yu ', 'Ping ', + 0x80 => 'Liao ', 'Cong ', 'You ', 'Chong ', 'Zhi ', 'Tong ', 'Cheng ', 'Qi ', 'Qu ', 'Peng ', 'Bei ', 'Bie ', 'Chun ', 'Jiao ', 'Zeng ', 'Chi ', + 0x90 => 'Lian ', 'Ping ', 'Kui ', 'Hui ', 'Qiao ', 'Cheng ', 'Yin ', 'Yin ', 'Xi ', 'Xi ', 'Dan ', 'Tan ', 'Duo ', 'Dui ', 'Dui ', 'Su ', + 0xA0 => 'Jue ', 'Ce ', 'Xiao ', 'Fan ', 'Fen ', 'Lao ', 'Lao ', 'Chong ', 'Han ', 'Qi ', 'Xian ', 'Min ', 'Jing ', 'Liao ', 'Wu ', 'Can ', + 0xB0 => 'Jue ', 'Cu ', 'Xian ', 'Tan ', 'Sheng ', 'Pi ', 'Yi ', 'Chu ', 'Xian ', 'Nao ', 'Dan ', 'Tan ', 'Jing ', 'Song ', 'Han ', 'Jiao ', + 0xC0 => 'Wai ', 'Huan ', 'Dong ', 'Qin ', 'Qin ', 'Qu ', 'Cao ', 'Ken ', 'Xie ', 'Ying ', 'Ao ', 'Mao ', 'Yi ', 'Lin ', 'Se ', 'Jun ', + 0xD0 => 'Huai ', 'Men ', 'Lan ', 'Ai ', 'Lin ', 'Yan ', 'Gua ', 'Xia ', 'Chi ', 'Yu ', 'Yin ', 'Dai ', 'Meng ', 'Ai ', 'Meng ', 'Dui ', + 0xE0 => 'Qi ', 'Mo ', 'Lan ', 'Men ', 'Chou ', 'Zhi ', 'Nuo ', 'Nuo ', 'Yan ', 'Yang ', 'Bo ', 'Zhi ', 'Kuang ', 'Kuang ', 'You ', 'Fu ', + 0xF0 => 'Liu ', 'Mie ', 'Cheng ', NULL, 'Chan ', 'Meng ', 'Lan ', 'Huai ', 'Xuan ', 'Rang ', 'Chan ', 'Ji ', 'Ju ', 'Huan ', 'She ', 'Yi ', +); diff --git a/sources/resources/transliteration-data/x62.php b/sources/resources/transliteration-data/x62.php new file mode 100644 index 0000000..7b2b707 --- /dev/null +++ b/sources/resources/transliteration-data/x62.php @@ -0,0 +1,20 @@ + 'Lian ', 'Nan ', 'Mi ', 'Tang ', 'Jue ', 'Gang ', 'Gang ', 'Gang ', 'Ge ', 'Yue ', 'Wu ', 'Jian ', 'Xu ', 'Shu ', 'Rong ', 'Xi ', + 0x10 => 'Cheng ', 'Wo ', 'Jie ', 'Ge ', 'Jian ', 'Qiang ', 'Huo ', 'Qiang ', 'Zhan ', 'Dong ', 'Qi ', 'Jia ', 'Die ', 'Zei ', 'Jia ', 'Ji ', + 0x20 => 'Shi ', 'Kan ', 'Ji ', 'Kui ', 'Gai ', 'Deng ', 'Zhan ', 'Chuang ', 'Ge ', 'Jian ', 'Jie ', 'Yu ', 'Jian ', 'Yan ', 'Lu ', 'Xi ', + 0x30 => 'Zhan ', 'Xi ', 'Xi ', 'Chuo ', 'Dai ', 'Qu ', 'Hu ', 'Hu ', 'Hu ', 'E ', 'Shi ', 'Li ', 'Mao ', 'Hu ', 'Li ', 'Fang ', + 0x40 => 'Suo ', 'Bian ', 'Dian ', 'Jiong ', 'Shang ', 'Yi ', 'Yi ', 'Shan ', 'Hu ', 'Fei ', 'Yan ', 'Shou ', 'T ', 'Cai ', 'Zha ', 'Qiu ', + 0x50 => 'Le ', 'Bu ', 'Ba ', 'Da ', 'Reng ', 'Fu ', 'Hameru ', 'Zai ', 'Tuo ', 'Zhang ', 'Diao ', 'Kang ', 'Yu ', 'Ku ', 'Han ', 'Shen ', + 0x60 => 'Cha ', 'Yi ', 'Gu ', 'Kou ', 'Wu ', 'Tuo ', 'Qian ', 'Zhi ', 'Ren ', 'Kuo ', 'Men ', 'Sao ', 'Yang ', 'Niu ', 'Ban ', 'Che ', + 0x70 => 'Rao ', 'Xi ', 'Qian ', 'Ban ', 'Jia ', 'Yu ', 'Fu ', 'Ao ', 'Xi ', 'Pi ', 'Zhi ', 'Zi ', 'E ', 'Dun ', 'Zhao ', 'Cheng ', + 0x80 => 'Ji ', 'Yan ', 'Kuang ', 'Bian ', 'Chao ', 'Ju ', 'Wen ', 'Hu ', 'Yue ', 'Jue ', 'Ba ', 'Qin ', 'Zhen ', 'Zheng ', 'Yun ', 'Wan ', + 0x90 => 'Nu ', 'Yi ', 'Shu ', 'Zhua ', 'Pou ', 'Tou ', 'Dou ', 'Kang ', 'Zhe ', 'Pou ', 'Fu ', 'Pao ', 'Ba ', 'Ao ', 'Ze ', 'Tuan ', + 0xA0 => 'Kou ', 'Lun ', 'Qiang ', NULL, 'Hu ', 'Bao ', 'Bing ', 'Zhi ', 'Peng ', 'Tan ', 'Pu ', 'Pi ', 'Tai ', 'Yao ', 'Zhen ', 'Zha ', + 0xB0 => 'Yang ', 'Bao ', 'He ', 'Ni ', 'Yi ', 'Di ', 'Chi ', 'Pi ', 'Za ', 'Mo ', 'Mo ', 'Shen ', 'Ya ', 'Chou ', 'Qu ', 'Min ', + 0xC0 => 'Chu ', 'Jia ', 'Fu ', 'Zhan ', 'Zhu ', 'Dan ', 'Chai ', 'Mu ', 'Nian ', 'La ', 'Fu ', 'Pao ', 'Ban ', 'Pai ', 'Ling ', 'Na ', + 0xD0 => 'Guai ', 'Qian ', 'Ju ', 'Tuo ', 'Ba ', 'Tuo ', 'Tuo ', 'Ao ', 'Ju ', 'Zhuo ', 'Pan ', 'Zhao ', 'Bai ', 'Bai ', 'Di ', 'Ni ', + 0xE0 => 'Ju ', 'Kuo ', 'Long ', 'Jian ', NULL, 'Yong ', 'Lan ', 'Ning ', 'Bo ', 'Ze ', 'Qian ', 'Hen ', 'Gua ', 'Shi ', 'Jie ', 'Zheng ', + 0xF0 => 'Nin ', 'Gong ', 'Gong ', 'Quan ', 'Shuan ', 'Cun ', 'Zan ', 'Kao ', 'Chi ', 'Xie ', 'Ce ', 'Hui ', 'Pin ', 'Zhuai ', 'Shi ', 'Na ', +); diff --git a/sources/resources/transliteration-data/x63.php b/sources/resources/transliteration-data/x63.php new file mode 100644 index 0000000..a637d07 --- /dev/null +++ b/sources/resources/transliteration-data/x63.php @@ -0,0 +1,20 @@ + 'Bo ', 'Chi ', 'Gua ', 'Zhi ', 'Kuo ', 'Duo ', 'Duo ', 'Zhi ', 'Qie ', 'An ', 'Nong ', 'Zhen ', 'Ge ', 'Jiao ', 'Ku ', 'Dong ', + 0x10 => 'Ru ', 'Tiao ', 'Lie ', 'Zha ', 'Lu ', 'Die ', 'Wa ', 'Jue ', 'Mushiru ', 'Ju ', 'Zhi ', 'Luan ', 'Ya ', 'Zhua ', 'Ta ', 'Xie ', + 0x20 => 'Nao ', 'Dang ', 'Jiao ', 'Zheng ', 'Ji ', 'Hui ', 'Xun ', 'Ku ', 'Ai ', 'Tuo ', 'Nuo ', 'Cuo ', 'Bo ', 'Geng ', 'Ti ', 'Zhen ', + 0x30 => 'Cheng ', 'Suo ', 'Suo ', 'Keng ', 'Mei ', 'Long ', 'Ju ', 'Peng ', 'Jian ', 'Yi ', 'Ting ', 'Shan ', 'Nuo ', 'Wan ', 'Xie ', 'Cha ', + 0x40 => 'Feng ', 'Jiao ', 'Wu ', 'Jun ', 'Jiu ', 'Tong ', 'Kun ', 'Huo ', 'Tu ', 'Zhuo ', 'Pou ', 'Le ', 'Ba ', 'Han ', 'Shao ', 'Nie ', + 0x50 => 'Juan ', 'Ze ', 'Song ', 'Ye ', 'Jue ', 'Bu ', 'Huan ', 'Bu ', 'Zun ', 'Yi ', 'Zhai ', 'Lu ', 'Sou ', 'Tuo ', 'Lao ', 'Sun ', + 0x60 => 'Bang ', 'Jian ', 'Huan ', 'Dao ', NULL, 'Wan ', 'Qin ', 'Peng ', 'She ', 'Lie ', 'Min ', 'Men ', 'Fu ', 'Bai ', 'Ju ', 'Dao ', + 0x70 => 'Wo ', 'Ai ', 'Juan ', 'Yue ', 'Zong ', 'Chen ', 'Chui ', 'Jie ', 'Tu ', 'Ben ', 'Na ', 'Nian ', 'Nuo ', 'Zu ', 'Wo ', 'Xi ', + 0x80 => 'Xian ', 'Cheng ', 'Dian ', 'Sao ', 'Lun ', 'Qing ', 'Gang ', 'Duo ', 'Shou ', 'Diao ', 'Pou ', 'Di ', 'Zhang ', 'Gun ', 'Ji ', 'Tao ', + 0x90 => 'Qia ', 'Qi ', 'Pai ', 'Shu ', 'Qian ', 'Ling ', 'Yi ', 'Ya ', 'Jue ', 'Zheng ', 'Liang ', 'Gua ', 'Yi ', 'Huo ', 'Shan ', 'Zheng ', + 0xA0 => 'Lue ', 'Cai ', 'Tan ', 'Che ', 'Bing ', 'Jie ', 'Ti ', 'Kong ', 'Tui ', 'Yan ', 'Cuo ', 'Zou ', 'Ju ', 'Tian ', 'Qian ', 'Ken ', + 0xB0 => 'Bai ', 'Shou ', 'Jie ', 'Lu ', 'Guo ', 'Haba ', NULL, 'Zhi ', 'Dan ', 'Mang ', 'Xian ', 'Sao ', 'Guan ', 'Peng ', 'Yuan ', 'Nuo ', + 0xC0 => 'Jian ', 'Zhen ', 'Jiu ', 'Jian ', 'Yu ', 'Yan ', 'Kui ', 'Nan ', 'Hong ', 'Rou ', 'Pi ', 'Wei ', 'Sai ', 'Zou ', 'Xuan ', 'Miao ', + 0xD0 => 'Ti ', 'Nie ', 'Cha ', 'Shi ', 'Zong ', 'Zhen ', 'Yi ', 'Shun ', 'Heng ', 'Bian ', 'Yang ', 'Huan ', 'Yan ', 'Zuan ', 'An ', 'Xu ', + 0xE0 => 'Ya ', 'Wo ', 'Ke ', 'Chuai ', 'Ji ', 'Ti ', 'La ', 'La ', 'Cheng ', 'Kai ', 'Jiu ', 'Jiu ', 'Tu ', 'Jie ', 'Hui ', 'Geng ', + 0xF0 => 'Chong ', 'Shuo ', 'She ', 'Xie ', 'Yuan ', 'Qian ', 'Ye ', 'Cha ', 'Zha ', 'Bei ', 'Yao ', NULL, NULL, 'Lan ', 'Wen ', 'Qin ', +); diff --git a/sources/resources/transliteration-data/x64.php b/sources/resources/transliteration-data/x64.php new file mode 100644 index 0000000..da91353 --- /dev/null +++ b/sources/resources/transliteration-data/x64.php @@ -0,0 +1,20 @@ + 'Chan ', 'Ge ', 'Lou ', 'Zong ', 'Geng ', 'Jiao ', 'Gou ', 'Qin ', 'Yong ', 'Que ', 'Chou ', 'Chi ', 'Zhan ', 'Sun ', 'Sun ', 'Bo ', + 0x10 => 'Chu ', 'Rong ', 'Beng ', 'Cuo ', 'Sao ', 'Ke ', 'Yao ', 'Dao ', 'Zhi ', 'Nu ', 'Xie ', 'Jian ', 'Sou ', 'Qiu ', 'Gao ', 'Xian ', + 0x20 => 'Shuo ', 'Sang ', 'Jin ', 'Mie ', 'E ', 'Chui ', 'Nuo ', 'Shan ', 'Ta ', 'Jie ', 'Tang ', 'Pan ', 'Ban ', 'Da ', 'Li ', 'Tao ', + 0x30 => 'Hu ', 'Zhi ', 'Wa ', 'Xia ', 'Qian ', 'Wen ', 'Qiang ', 'Tian ', 'Zhen ', 'E ', 'Xi ', 'Nuo ', 'Quan ', 'Cha ', 'Zha ', 'Ge ', + 0x40 => 'Wu ', 'En ', 'She ', 'Kang ', 'She ', 'Shu ', 'Bai ', 'Yao ', 'Bin ', 'Sou ', 'Tan ', 'Sa ', 'Chan ', 'Suo ', 'Liao ', 'Chong ', + 0x50 => 'Chuang ', 'Guo ', 'Bing ', 'Feng ', 'Shuai ', 'Di ', 'Qi ', 'Sou ', 'Zhai ', 'Lian ', 'Tang ', 'Chi ', 'Guan ', 'Lu ', 'Luo ', 'Lou ', + 0x60 => 'Zong ', 'Gai ', 'Hu ', 'Zha ', 'Chuang ', 'Tang ', 'Hua ', 'Cui ', 'Nai ', 'Mo ', 'Jiang ', 'Gui ', 'Ying ', 'Zhi ', 'Ao ', 'Zhi ', + 0x70 => 'Nie ', 'Man ', 'Shan ', 'Kou ', 'Shu ', 'Suo ', 'Tuan ', 'Jiao ', 'Mo ', 'Mo ', 'Zhe ', 'Xian ', 'Keng ', 'Piao ', 'Jiang ', 'Yin ', + 0x80 => 'Gou ', 'Qian ', 'Lue ', 'Ji ', 'Ying ', 'Jue ', 'Pie ', 'Pie ', 'Lao ', 'Dun ', 'Xian ', 'Ruan ', 'Kui ', 'Zan ', 'Yi ', 'Xun ', + 0x90 => 'Cheng ', 'Cheng ', 'Sa ', 'Nao ', 'Heng ', 'Si ', 'Qian ', 'Huang ', 'Da ', 'Zun ', 'Nian ', 'Lin ', 'Zheng ', 'Hui ', 'Zhuang ', 'Jiao ', + 0xA0 => 'Ji ', 'Cao ', 'Dan ', 'Dan ', 'Che ', 'Bo ', 'Che ', 'Jue ', 'Xiao ', 'Liao ', 'Ben ', 'Fu ', 'Qiao ', 'Bo ', 'Cuo ', 'Zhuo ', + 0xB0 => 'Zhuan ', 'Tuo ', 'Pu ', 'Qin ', 'Dun ', 'Nian ', NULL, 'Xie ', 'Lu ', 'Jiao ', 'Cuan ', 'Ta ', 'Han ', 'Qiao ', 'Zhua ', 'Jian ', + 0xC0 => 'Gan ', 'Yong ', 'Lei ', 'Kuo ', 'Lu ', 'Shan ', 'Zhuo ', 'Ze ', 'Pu ', 'Chuo ', 'Ji ', 'Dang ', 'Suo ', 'Cao ', 'Qing ', 'Jing ', + 0xD0 => 'Huan ', 'Jie ', 'Qin ', 'Kuai ', 'Dan ', 'Xi ', 'Ge ', 'Pi ', 'Bo ', 'Ao ', 'Ju ', 'Ye ', NULL, 'Mang ', 'Sou ', 'Mi ', + 0xE0 => 'Ji ', 'Tai ', 'Zhuo ', 'Dao ', 'Xing ', 'Lan ', 'Ca ', 'Ju ', 'Ye ', 'Ru ', 'Ye ', 'Ye ', 'Ni ', 'Hu ', 'Ji ', 'Bin ', + 0xF0 => 'Ning ', 'Ge ', 'Zhi ', 'Jie ', 'Kuo ', 'Mo ', 'Jian ', 'Xie ', 'Lie ', 'Tan ', 'Bai ', 'Sou ', 'Lu ', 'Lue ', 'Rao ', 'Zhi ', +); diff --git a/sources/resources/transliteration-data/x65.php b/sources/resources/transliteration-data/x65.php new file mode 100644 index 0000000..4c066ff --- /dev/null +++ b/sources/resources/transliteration-data/x65.php @@ -0,0 +1,20 @@ + 'Pan ', 'Yang ', 'Lei ', 'Sa ', 'Shu ', 'Zan ', 'Nian ', 'Xian ', 'Jun ', 'Huo ', 'Li ', 'La ', 'Han ', 'Ying ', 'Lu ', 'Long ', + 0x10 => 'Qian ', 'Qian ', 'Zan ', 'Qian ', 'Lan ', 'San ', 'Ying ', 'Mei ', 'Rang ', 'Chan ', NULL, 'Cuan ', 'Xi ', 'She ', 'Luo ', 'Jun ', + 0x20 => 'Mi ', 'Li ', 'Zan ', 'Luan ', 'Tan ', 'Zuan ', 'Li ', 'Dian ', 'Wa ', 'Dang ', 'Jiao ', 'Jue ', 'Lan ', 'Li ', 'Nang ', 'Zhi ', + 0x30 => 'Gui ', 'Gui ', 'Qi ', 'Xin ', 'Pu ', 'Sui ', 'Shou ', 'Kao ', 'You ', 'Gai ', 'Yi ', 'Gong ', 'Gan ', 'Ban ', 'Fang ', 'Zheng ', + 0x40 => 'Bo ', 'Dian ', 'Kou ', 'Min ', 'Wu ', 'Gu ', 'He ', 'Ce ', 'Xiao ', 'Mi ', 'Chu ', 'Ge ', 'Di ', 'Xu ', 'Jiao ', 'Min ', + 0x50 => 'Chen ', 'Jiu ', 'Zhen ', 'Duo ', 'Yu ', 'Chi ', 'Ao ', 'Bai ', 'Xu ', 'Jiao ', 'Duo ', 'Lian ', 'Nie ', 'Bi ', 'Chang ', 'Dian ', + 0x60 => 'Duo ', 'Yi ', 'Gan ', 'San ', 'Ke ', 'Yan ', 'Dun ', 'Qi ', 'Dou ', 'Xiao ', 'Duo ', 'Jiao ', 'Jing ', 'Yang ', 'Xia ', 'Min ', + 0x70 => 'Shu ', 'Ai ', 'Qiao ', 'Ai ', 'Zheng ', 'Di ', 'Zhen ', 'Fu ', 'Shu ', 'Liao ', 'Qu ', 'Xiong ', 'Xi ', 'Jiao ', 'Sen ', 'Jiao ', + 0x80 => 'Zhuo ', 'Yi ', 'Lian ', 'Bi ', 'Li ', 'Xiao ', 'Xiao ', 'Wen ', 'Xue ', 'Qi ', 'Qi ', 'Zhai ', 'Bin ', 'Jue ', 'Zhai ', NULL, + 0x90 => 'Fei ', 'Ban ', 'Ban ', 'Lan ', 'Yu ', 'Lan ', 'Wei ', 'Dou ', 'Sheng ', 'Liao ', 'Jia ', 'Hu ', 'Xie ', 'Jia ', 'Yu ', 'Zhen ', + 0xA0 => 'Jiao ', 'Wo ', 'Tou ', 'Chu ', 'Jin ', 'Chi ', 'Yin ', 'Fu ', 'Qiang ', 'Zhan ', 'Qu ', 'Zhuo ', 'Zhan ', 'Duan ', 'Zhuo ', 'Si ', + 0xB0 => 'Xin ', 'Zhuo ', 'Zhuo ', 'Qin ', 'Lin ', 'Zhuo ', 'Chu ', 'Duan ', 'Zhu ', 'Fang ', 'Xie ', 'Hang ', 'Yu ', 'Shi ', 'Pei ', 'You ', + 0xC0 => 'Mye ', 'Pang ', 'Qi ', 'Zhan ', 'Mao ', 'Lu ', 'Pei ', 'Pi ', 'Liu ', 'Fu ', 'Fang ', 'Xuan ', 'Jing ', 'Jing ', 'Ni ', 'Zu ', + 0xD0 => 'Zhao ', 'Yi ', 'Liu ', 'Shao ', 'Jian ', 'Es ', 'Yi ', 'Qi ', 'Zhi ', 'Fan ', 'Piao ', 'Fan ', 'Zhan ', 'Guai ', 'Sui ', 'Yu ', + 0xE0 => 'Wu ', 'Ji ', 'Ji ', 'Ji ', 'Huo ', 'Ri ', 'Dan ', 'Jiu ', 'Zhi ', 'Zao ', 'Xie ', 'Tiao ', 'Xun ', 'Xu ', 'Xu ', 'Xu ', + 0xF0 => 'Gan ', 'Han ', 'Tai ', 'Di ', 'Xu ', 'Chan ', 'Shi ', 'Kuang ', 'Yang ', 'Shi ', 'Wang ', 'Min ', 'Min ', 'Tun ', 'Chun ', 'Wu ', +); diff --git a/sources/resources/transliteration-data/x66.php b/sources/resources/transliteration-data/x66.php new file mode 100644 index 0000000..bbc4324 --- /dev/null +++ b/sources/resources/transliteration-data/x66.php @@ -0,0 +1,20 @@ + 'Yun ', 'Bei ', 'Ang ', 'Ze ', 'Ban ', 'Jie ', 'Kun ', 'Sheng ', 'Hu ', 'Fang ', 'Hao ', 'Gui ', 'Chang ', 'Xuan ', 'Ming ', 'Hun ', + 0x10 => 'Fen ', 'Qin ', 'Hu ', 'Yi ', 'Xi ', 'Xin ', 'Yan ', 'Ze ', 'Fang ', 'Tan ', 'Shen ', 'Ju ', 'Yang ', 'Zan ', 'Bing ', 'Xing ', + 0x20 => 'Ying ', 'Xuan ', 'Pei ', 'Zhen ', 'Ling ', 'Chun ', 'Hao ', 'Mei ', 'Zuo ', 'Mo ', 'Bian ', 'Xu ', 'Hun ', 'Zhao ', 'Zong ', 'Shi ', + 0x30 => 'Shi ', 'Yu ', 'Fei ', 'Die ', 'Mao ', 'Ni ', 'Chang ', 'Wen ', 'Dong ', 'Ai ', 'Bing ', 'Ang ', 'Zhou ', 'Long ', 'Xian ', 'Kuang ', + 0x40 => 'Tiao ', 'Chao ', 'Shi ', 'Huang ', 'Huang ', 'Xuan ', 'Kui ', 'Xu ', 'Jiao ', 'Jin ', 'Zhi ', 'Jin ', 'Shang ', 'Tong ', 'Hong ', 'Yan ', + 0x50 => 'Gai ', 'Xiang ', 'Shai ', 'Xiao ', 'Ye ', 'Yun ', 'Hui ', 'Han ', 'Han ', 'Jun ', 'Wan ', 'Xian ', 'Kun ', 'Zhou ', 'Xi ', 'Cheng ', + 0x60 => 'Sheng ', 'Bu ', 'Zhe ', 'Zhe ', 'Wu ', 'Han ', 'Hui ', 'Hao ', 'Chen ', 'Wan ', 'Tian ', 'Zhuo ', 'Zui ', 'Zhou ', 'Pu ', 'Jing ', + 0x70 => 'Xi ', 'Shan ', 'Yi ', 'Xi ', 'Qing ', 'Qi ', 'Jing ', 'Gui ', 'Zhen ', 'Yi ', 'Zhi ', 'An ', 'Wan ', 'Lin ', 'Liang ', 'Chang ', + 0x80 => 'Wang ', 'Xiao ', 'Zan ', 'Hi ', 'Xuan ', 'Xuan ', 'Yi ', 'Xia ', 'Yun ', 'Hui ', 'Fu ', 'Min ', 'Kui ', 'He ', 'Ying ', 'Du ', + 0x90 => 'Wei ', 'Shu ', 'Qing ', 'Mao ', 'Nan ', 'Jian ', 'Nuan ', 'An ', 'Yang ', 'Chun ', 'Yao ', 'Suo ', 'Jin ', 'Ming ', 'Jiao ', 'Kai ', + 0xA0 => 'Gao ', 'Weng ', 'Chang ', 'Qi ', 'Hao ', 'Yan ', 'Li ', 'Ai ', 'Ji ', 'Gui ', 'Men ', 'Zan ', 'Xie ', 'Hao ', 'Mu ', 'Mo ', + 0xB0 => 'Cong ', 'Ni ', 'Zhang ', 'Hui ', 'Bao ', 'Han ', 'Xuan ', 'Chuan ', 'Liao ', 'Xian ', 'Dan ', 'Jing ', 'Pie ', 'Lin ', 'Tun ', 'Xi ', + 0xC0 => 'Yi ', 'Ji ', 'Huang ', 'Tai ', 'Ye ', 'Ye ', 'Li ', 'Tan ', 'Tong ', 'Xiao ', 'Fei ', 'Qin ', 'Zhao ', 'Hao ', 'Yi ', 'Xiang ', + 0xD0 => 'Xing ', 'Sen ', 'Jiao ', 'Bao ', 'Jing ', 'Yian ', 'Ai ', 'Ye ', 'Ru ', 'Shu ', 'Meng ', 'Xun ', 'Yao ', 'Pu ', 'Li ', 'Chen ', + 0xE0 => 'Kuang ', 'Die ', NULL, 'Yan ', 'Huo ', 'Lu ', 'Xi ', 'Rong ', 'Long ', 'Nang ', 'Luo ', 'Luan ', 'Shai ', 'Tang ', 'Yan ', 'Chu ', + 0xF0 => 'Yue ', 'Yue ', 'Qu ', 'Yi ', 'Geng ', 'Ye ', 'Hu ', 'He ', 'Shu ', 'Cao ', 'Cao ', 'Noboru ', 'Man ', 'Ceng ', 'Ceng ', 'Ti ', +); diff --git a/sources/resources/transliteration-data/x67.php b/sources/resources/transliteration-data/x67.php new file mode 100644 index 0000000..957c7de --- /dev/null +++ b/sources/resources/transliteration-data/x67.php @@ -0,0 +1,20 @@ + 'Zui ', 'Can ', 'Xu ', 'Hui ', 'Yin ', 'Qie ', 'Fen ', 'Pi ', 'Yue ', 'You ', 'Ruan ', 'Peng ', 'Ban ', 'Fu ', 'Ling ', 'Fei ', + 0x10 => 'Qu ', NULL, 'Nu ', 'Tiao ', 'Shuo ', 'Zhen ', 'Lang ', 'Lang ', 'Juan ', 'Ming ', 'Huang ', 'Wang ', 'Tun ', 'Zhao ', 'Ji ', 'Qi ', + 0x20 => 'Ying ', 'Zong ', 'Wang ', 'Tong ', 'Lang ', NULL, 'Meng ', 'Long ', 'Mu ', 'Deng ', 'Wei ', 'Mo ', 'Ben ', 'Zha ', 'Zhu ', 'Zhu ', + 0x30 => NULL, 'Zhu ', 'Ren ', 'Ba ', 'Po ', 'Duo ', 'Duo ', 'Dao ', 'Li ', 'Qiu ', 'Ji ', 'Jiu ', 'Bi ', 'Xiu ', 'Ting ', 'Ci ', + 0x40 => 'Sha ', 'Eburi ', 'Za ', 'Quan ', 'Qian ', 'Yu ', 'Gan ', 'Wu ', 'Cha ', 'Shan ', 'Xun ', 'Fan ', 'Wu ', 'Zi ', 'Li ', 'Xing ', + 0x50 => 'Cai ', 'Cun ', 'Ren ', 'Shao ', 'Tuo ', 'Di ', 'Zhang ', 'Mang ', 'Chi ', 'Yi ', 'Gu ', 'Gong ', 'Du ', 'Yi ', 'Qi ', 'Shu ', + 0x60 => 'Gang ', 'Tiao ', 'Moku ', 'Soma ', 'Tochi ', 'Lai ', 'Sugi ', 'Mang ', 'Yang ', 'Ma ', 'Miao ', 'Si ', 'Yuan ', 'Hang ', 'Fei ', 'Bei ', + 0x70 => 'Jie ', 'Dong ', 'Gao ', 'Yao ', 'Xian ', 'Chu ', 'Qun ', 'Pa ', 'Shu ', 'Hua ', 'Xin ', 'Chou ', 'Zhu ', 'Chou ', 'Song ', 'Ban ', + 0x80 => 'Song ', 'Ji ', 'Yue ', 'Jin ', 'Gou ', 'Ji ', 'Mao ', 'Pi ', 'Bi ', 'Wang ', 'Ang ', 'Fang ', 'Fen ', 'Yi ', 'Fu ', 'Nan ', + 0x90 => 'Xi ', 'Hu ', 'Ya ', 'Dou ', 'Xun ', 'Zhen ', 'Yao ', 'Lin ', 'Rui ', 'E ', 'Mei ', 'Zhao ', 'Guo ', 'Zhi ', 'Cong ', 'Yun ', + 0xA0 => 'Waku ', 'Dou ', 'Shu ', 'Zao ', NULL, 'Li ', 'Haze ', 'Jian ', 'Cheng ', 'Matsu ', 'Qiang ', 'Feng ', 'Nan ', 'Xiao ', 'Xian ', 'Ku ', + 0xB0 => 'Ping ', 'Yi ', 'Xi ', 'Zhi ', 'Guai ', 'Xiao ', 'Jia ', 'Jia ', 'Gou ', 'Fu ', 'Mo ', 'Yi ', 'Ye ', 'Ye ', 'Shi ', 'Nie ', + 0xC0 => 'Bi ', 'Duo ', 'Yi ', 'Ling ', 'Bing ', 'Ni ', 'La ', 'He ', 'Pan ', 'Fan ', 'Zhong ', 'Dai ', 'Ci ', 'Yang ', 'Fu ', 'Bo ', + 0xD0 => 'Mou ', 'Gan ', 'Qi ', 'Ran ', 'Rou ', 'Mao ', 'Zhao ', 'Song ', 'Zhe ', 'Xia ', 'You ', 'Shen ', 'Ju ', 'Tuo ', 'Zuo ', 'Nan ', + 0xE0 => 'Ning ', 'Yong ', 'Di ', 'Zhi ', 'Zha ', 'Cha ', 'Dan ', 'Gu ', 'Pu ', 'Jiu ', 'Ao ', 'Fu ', 'Jian ', 'Bo ', 'Duo ', 'Ke ', + 0xF0 => 'Nai ', 'Zhu ', 'Bi ', 'Liu ', 'Chai ', 'Zha ', 'Si ', 'Zhu ', 'Pei ', 'Shi ', 'Guai ', 'Cha ', 'Yao ', 'Jue ', 'Jiu ', 'Shi ', +); diff --git a/sources/resources/transliteration-data/x68.php b/sources/resources/transliteration-data/x68.php new file mode 100644 index 0000000..f60eb65 --- /dev/null +++ b/sources/resources/transliteration-data/x68.php @@ -0,0 +1,20 @@ + 'Zhi ', 'Liu ', 'Mei ', 'Hoy ', 'Rong ', 'Zha ', NULL, 'Biao ', 'Zhan ', 'Jie ', 'Long ', 'Dong ', 'Lu ', 'Sayng ', 'Li ', 'Lan ', + 0x10 => 'Yong ', 'Shu ', 'Xun ', 'Shuan ', 'Qi ', 'Zhen ', 'Qi ', 'Li ', 'Yi ', 'Xiang ', 'Zhen ', 'Li ', 'Su ', 'Gua ', 'Kan ', 'Bing ', + 0x20 => 'Ren ', 'Xiao ', 'Bo ', 'Ren ', 'Bing ', 'Zi ', 'Chou ', 'Yi ', 'Jie ', 'Xu ', 'Zhu ', 'Jian ', 'Zui ', 'Er ', 'Er ', 'You ', + 0x30 => 'Fa ', 'Gong ', 'Kao ', 'Lao ', 'Zhan ', 'Li ', 'Yin ', 'Yang ', 'He ', 'Gen ', 'Zhi ', 'Chi ', 'Ge ', 'Zai ', 'Luan ', 'Fu ', + 0x40 => 'Jie ', 'Hang ', 'Gui ', 'Tao ', 'Guang ', 'Wei ', 'Kuang ', 'Ru ', 'An ', 'An ', 'Juan ', 'Yi ', 'Zhuo ', 'Ku ', 'Zhi ', 'Qiong ', + 0x50 => 'Tong ', 'Sang ', 'Sang ', 'Huan ', 'Jie ', 'Jiu ', 'Xue ', 'Duo ', 'Zhui ', 'Yu ', 'Zan ', 'Kasei ', 'Ying ', 'Masu ', NULL, 'Zhan ', + 0x60 => 'Ya ', 'Nao ', 'Zhen ', 'Dang ', 'Qi ', 'Qiao ', 'Hua ', 'Kuai ', 'Jiang ', 'Zhuang ', 'Xun ', 'Suo ', 'Sha ', 'Zhen ', 'Bei ', 'Ting ', + 0x70 => 'Gua ', 'Jing ', 'Bo ', 'Ben ', 'Fu ', 'Rui ', 'Tong ', 'Jue ', 'Xi ', 'Lang ', 'Liu ', 'Feng ', 'Qi ', 'Wen ', 'Jun ', 'Gan ', + 0x80 => 'Cu ', 'Liang ', 'Qiu ', 'Ting ', 'You ', 'Mei ', 'Bang ', 'Long ', 'Peng ', 'Zhuang ', 'Di ', 'Xuan ', 'Tu ', 'Zao ', 'Ao ', 'Gu ', + 0x90 => 'Bi ', 'Di ', 'Han ', 'Zi ', 'Zhi ', 'Ren ', 'Bei ', 'Geng ', 'Jian ', 'Huan ', 'Wan ', 'Nuo ', 'Jia ', 'Tiao ', 'Ji ', 'Xiao ', + 0xA0 => 'Lu ', 'Huan ', 'Shao ', 'Cen ', 'Fen ', 'Song ', 'Meng ', 'Wu ', 'Li ', 'Li ', 'Dou ', 'Cen ', 'Ying ', 'Suo ', 'Ju ', 'Ti ', + 0xB0 => 'Jie ', 'Kun ', 'Zhuo ', 'Shu ', 'Chan ', 'Fan ', 'Wei ', 'Jing ', 'Li ', 'Bing ', 'Fumoto ', 'Shikimi ', 'Tao ', 'Zhi ', 'Lai ', 'Lian ', + 0xC0 => 'Jian ', 'Zhuo ', 'Ling ', 'Li ', 'Qi ', 'Bing ', 'Zhun ', 'Cong ', 'Qian ', 'Mian ', 'Qi ', 'Qi ', 'Cai ', 'Gun ', 'Chan ', 'Te ', + 0xD0 => 'Fei ', 'Pai ', 'Bang ', 'Pou ', 'Hun ', 'Zong ', 'Cheng ', 'Zao ', 'Ji ', 'Li ', 'Peng ', 'Yu ', 'Yu ', 'Gu ', 'Hun ', 'Dong ', + 0xE0 => 'Tang ', 'Gang ', 'Wang ', 'Di ', 'Xi ', 'Fan ', 'Cheng ', 'Zhan ', 'Qi ', 'Yuan ', 'Yan ', 'Yu ', 'Quan ', 'Yi ', 'Sen ', 'Ren ', + 0xF0 => 'Chui ', 'Leng ', 'Qi ', 'Zhuo ', 'Fu ', 'Ke ', 'Lai ', 'Zou ', 'Zou ', 'Zhuo ', 'Guan ', 'Fen ', 'Fen ', 'Chen ', 'Qiong ', 'Nie ', +); diff --git a/sources/resources/transliteration-data/x69.php b/sources/resources/transliteration-data/x69.php new file mode 100644 index 0000000..d549fa6 --- /dev/null +++ b/sources/resources/transliteration-data/x69.php @@ -0,0 +1,20 @@ + 'Wan ', 'Guo ', 'Lu ', 'Hao ', 'Jie ', 'Yi ', 'Chou ', 'Ju ', 'Ju ', 'Cheng ', 'Zuo ', 'Liang ', 'Qiang ', 'Zhi ', 'Zhui ', 'Ya ', + 0x10 => 'Ju ', 'Bei ', 'Jiao ', 'Zhuo ', 'Zi ', 'Bin ', 'Peng ', 'Ding ', 'Chu ', 'Chang ', 'Kunugi ', 'Momiji ', 'Jian ', 'Gui ', 'Xi ', 'Du ', + 0x20 => 'Qian ', 'Kunugi ', 'Soko ', 'Shide ', 'Luo ', 'Zhi ', 'Ken ', 'Myeng ', 'Tafu ', NULL, 'Peng ', 'Zhan ', NULL, 'Tuo ', 'Sen ', 'Duo ', + 0x30 => 'Ye ', 'Fou ', 'Wei ', 'Wei ', 'Duan ', 'Jia ', 'Zong ', 'Jian ', 'Yi ', 'Shen ', 'Xi ', 'Yan ', 'Yan ', 'Chuan ', 'Zhan ', 'Chun ', + 0x40 => 'Yu ', 'He ', 'Zha ', 'Wo ', 'Pian ', 'Bi ', 'Yao ', 'Huo ', 'Xu ', 'Ruo ', 'Yang ', 'La ', 'Yan ', 'Ben ', 'Hun ', 'Kui ', + 0x50 => 'Jie ', 'Kui ', 'Si ', 'Feng ', 'Xie ', 'Tuo ', 'Zhi ', 'Jian ', 'Mu ', 'Mao ', 'Chu ', 'Hu ', 'Hu ', 'Lian ', 'Leng ', 'Ting ', + 0x60 => 'Nan ', 'Yu ', 'You ', 'Mei ', 'Song ', 'Xuan ', 'Xuan ', 'Ying ', 'Zhen ', 'Pian ', 'Ye ', 'Ji ', 'Jie ', 'Ye ', 'Chu ', 'Shun ', + 0x70 => 'Yu ', 'Cou ', 'Wei ', 'Mei ', 'Di ', 'Ji ', 'Jie ', 'Kai ', 'Qiu ', 'Ying ', 'Rou ', 'Heng ', 'Lou ', 'Le ', 'Hazou ', 'Katsura ', + 0x80 => 'Pin ', 'Muro ', 'Gai ', 'Tan ', 'Lan ', 'Yun ', 'Yu ', 'Chen ', 'Lu ', 'Ju ', 'Sakaki ', NULL, 'Pi ', 'Xie ', 'Jia ', 'Yi ', + 0x90 => 'Zhan ', 'Fu ', 'Nai ', 'Mi ', 'Lang ', 'Rong ', 'Gu ', 'Jian ', 'Ju ', 'Ta ', 'Yao ', 'Zhen ', 'Bang ', 'Sha ', 'Yuan ', 'Zi ', + 0xA0 => 'Ming ', 'Su ', 'Jia ', 'Yao ', 'Jie ', 'Huang ', 'Gan ', 'Fei ', 'Zha ', 'Qian ', 'Ma ', 'Sun ', 'Yuan ', 'Xie ', 'Rong ', 'Shi ', + 0xB0 => 'Zhi ', 'Cui ', 'Yun ', 'Ting ', 'Liu ', 'Rong ', 'Tang ', 'Que ', 'Zhai ', 'Si ', 'Sheng ', 'Ta ', 'Ke ', 'Xi ', 'Gu ', 'Qi ', + 0xC0 => 'Kao ', 'Gao ', 'Sun ', 'Pan ', 'Tao ', 'Ge ', 'Xun ', 'Dian ', 'Nou ', 'Ji ', 'Shuo ', 'Gou ', 'Chui ', 'Qiang ', 'Cha ', 'Qian ', + 0xD0 => 'Huai ', 'Mei ', 'Xu ', 'Gang ', 'Gao ', 'Zhuo ', 'Tuo ', 'Hashi ', 'Yang ', 'Dian ', 'Jia ', 'Jian ', 'Zui ', 'Kashi ', 'Ori ', 'Bin ', + 0xE0 => 'Zhu ', NULL, 'Xi ', 'Qi ', 'Lian ', 'Hui ', 'Yong ', 'Qian ', 'Guo ', 'Gai ', 'Gai ', 'Tuan ', 'Hua ', 'Cu ', 'Sen ', 'Cui ', + 0xF0 => 'Beng ', 'You ', 'Hu ', 'Jiang ', 'Hu ', 'Huan ', 'Kui ', 'Yi ', 'Nie ', 'Gao ', 'Kang ', 'Gui ', 'Gui ', 'Cao ', 'Man ', 'Jin ', +); diff --git a/sources/resources/transliteration-data/x6a.php b/sources/resources/transliteration-data/x6a.php new file mode 100644 index 0000000..586f8ba --- /dev/null +++ b/sources/resources/transliteration-data/x6a.php @@ -0,0 +1,20 @@ + 'Di ', 'Zhuang ', 'Le ', 'Lang ', 'Chen ', 'Cong ', 'Li ', 'Xiu ', 'Qing ', 'Shuang ', 'Fan ', 'Tong ', 'Guan ', 'Ji ', 'Suo ', 'Lei ', + 0x10 => 'Lu ', 'Liang ', 'Mi ', 'Lou ', 'Chao ', 'Su ', 'Ke ', 'Shu ', 'Tang ', 'Biao ', 'Lu ', 'Jiu ', 'Shu ', 'Zha ', 'Shu ', 'Zhang ', + 0x20 => 'Men ', 'Mo ', 'Niao ', 'Yang ', 'Tiao ', 'Peng ', 'Zhu ', 'Sha ', 'Xi ', 'Quan ', 'Heng ', 'Jian ', 'Cong ', NULL, 'Hokuso ', 'Qiang ', + 0x30 => 'Tara ', 'Ying ', 'Er ', 'Xin ', 'Zhi ', 'Qiao ', 'Zui ', 'Cong ', 'Pu ', 'Shu ', 'Hua ', 'Kui ', 'Zhen ', 'Zun ', 'Yue ', 'Zhan ', + 0x40 => 'Xi ', 'Xun ', 'Dian ', 'Fa ', 'Gan ', 'Mo ', 'Wu ', 'Qiao ', 'Nao ', 'Lin ', 'Liu ', 'Qiao ', 'Xian ', 'Run ', 'Fan ', 'Zhan ', + 0x50 => 'Tuo ', 'Lao ', 'Yun ', 'Shun ', 'Tui ', 'Cheng ', 'Tang ', 'Meng ', 'Ju ', 'Cheng ', 'Su ', 'Jue ', 'Jue ', 'Tan ', 'Hui ', 'Ji ', + 0x60 => 'Nuo ', 'Xiang ', 'Tuo ', 'Ning ', 'Rui ', 'Zhu ', 'Chuang ', 'Zeng ', 'Fen ', 'Qiong ', 'Ran ', 'Heng ', 'Cen ', 'Gu ', 'Liu ', 'Lao ', + 0x70 => 'Gao ', 'Chu ', 'Zusa ', 'Nude ', 'Ca ', 'San ', 'Ji ', 'Dou ', 'Shou ', 'Lu ', NULL, NULL, 'Yuan ', 'Ta ', 'Shu ', 'Jiang ', + 0x80 => 'Tan ', 'Lin ', 'Nong ', 'Yin ', 'Xi ', 'Sui ', 'Shan ', 'Zui ', 'Xuan ', 'Cheng ', 'Gan ', 'Ju ', 'Zui ', 'Yi ', 'Qin ', 'Pu ', + 0x90 => 'Yan ', 'Lei ', 'Feng ', 'Hui ', 'Dang ', 'Ji ', 'Sui ', 'Bo ', 'Bi ', 'Ding ', 'Chu ', 'Zhua ', 'Kuai ', 'Ji ', 'Jie ', 'Jia ', + 0xA0 => 'Qing ', 'Zhe ', 'Jian ', 'Qiang ', 'Dao ', 'Yi ', 'Biao ', 'Song ', 'She ', 'Lin ', 'Kunugi ', 'Cha ', 'Meng ', 'Yin ', 'Tao ', 'Tai ', + 0xB0 => 'Mian ', 'Qi ', 'Toan ', 'Bin ', 'Huo ', 'Ji ', 'Qian ', 'Mi ', 'Ning ', 'Yi ', 'Gao ', 'Jian ', 'Yin ', 'Er ', 'Qing ', 'Yan ', + 0xC0 => 'Qi ', 'Mi ', 'Zhao ', 'Gui ', 'Chun ', 'Ji ', 'Kui ', 'Po ', 'Deng ', 'Chu ', NULL, 'Mian ', 'You ', 'Zhi ', 'Guang ', 'Qian ', + 0xD0 => 'Lei ', 'Lei ', 'Sa ', 'Lu ', 'Li ', 'Cuan ', 'Lu ', 'Mie ', 'Hui ', 'Ou ', 'Lu ', 'Jie ', 'Gao ', 'Du ', 'Yuan ', 'Li ', + 0xE0 => 'Fei ', 'Zhuo ', 'Sou ', 'Lian ', 'Tamo ', 'Chu ', NULL, 'Zhu ', 'Lu ', 'Yan ', 'Li ', 'Zhu ', 'Chen ', 'Jie ', 'E ', 'Su ', + 0xF0 => 'Huai ', 'Nie ', 'Yu ', 'Long ', 'Lai ', NULL, 'Xian ', 'Kwi ', 'Ju ', 'Xiao ', 'Ling ', 'Ying ', 'Jian ', 'Yin ', 'You ', 'Ying ', +); diff --git a/sources/resources/transliteration-data/x6b.php b/sources/resources/transliteration-data/x6b.php new file mode 100644 index 0000000..affe5f6 --- /dev/null +++ b/sources/resources/transliteration-data/x6b.php @@ -0,0 +1,20 @@ + 'Xiang ', 'Nong ', 'Bo ', 'Chan ', 'Lan ', 'Ju ', 'Shuang ', 'She ', 'Wei ', 'Cong ', 'Quan ', 'Qu ', 'Cang ', NULL, 'Yu ', 'Luo ', + 0x10 => 'Li ', 'Zan ', 'Luan ', 'Dang ', 'Jue ', 'Em ', 'Lan ', 'Lan ', 'Zhu ', 'Lei ', 'Li ', 'Ba ', 'Nang ', 'Yu ', 'Ling ', 'Tsuki ', + 0x20 => 'Qian ', 'Ci ', 'Huan ', 'Xin ', 'Yu ', 'Yu ', 'Qian ', 'Ou ', 'Xu ', 'Chao ', 'Chu ', 'Chi ', 'Kai ', 'Yi ', 'Jue ', 'Xi ', + 0x30 => 'Xu ', 'Xia ', 'Yu ', 'Kuai ', 'Lang ', 'Kuan ', 'Shuo ', 'Xi ', 'Ai ', 'Yi ', 'Qi ', 'Hu ', 'Chi ', 'Qin ', 'Kuan ', 'Kan ', + 0x40 => 'Kuan ', 'Kan ', 'Chuan ', 'Sha ', 'Gua ', 'Yin ', 'Xin ', 'Xie ', 'Yu ', 'Qian ', 'Xiao ', 'Yi ', 'Ge ', 'Wu ', 'Tan ', 'Jin ', + 0x50 => 'Ou ', 'Hu ', 'Ti ', 'Huan ', 'Xu ', 'Pen ', 'Xi ', 'Xiao ', 'Xu ', 'Xi ', 'Sen ', 'Lian ', 'Chu ', 'Yi ', 'Kan ', 'Yu ', + 0x60 => 'Chuo ', 'Huan ', 'Zhi ', 'Zheng ', 'Ci ', 'Bu ', 'Wu ', 'Qi ', 'Bu ', 'Bu ', 'Wai ', 'Ju ', 'Qian ', 'Chi ', 'Se ', 'Chi ', + 0x70 => 'Se ', 'Zhong ', 'Sui ', 'Sui ', 'Li ', 'Cuo ', 'Yu ', 'Li ', 'Gui ', 'Dai ', 'Dai ', 'Si ', 'Jian ', 'Zhe ', 'Mo ', 'Mo ', + 0x80 => 'Yao ', 'Mo ', 'Cu ', 'Yang ', 'Tian ', 'Sheng ', 'Dai ', 'Shang ', 'Xu ', 'Xun ', 'Shu ', 'Can ', 'Jue ', 'Piao ', 'Qia ', 'Qiu ', + 0x90 => 'Su ', 'Qing ', 'Yun ', 'Lian ', 'Yi ', 'Fou ', 'Zhi ', 'Ye ', 'Can ', 'Hun ', 'Dan ', 'Ji ', 'Ye ', 'Zhen ', 'Yun ', 'Wen ', + 0xA0 => 'Chou ', 'Bin ', 'Ti ', 'Jin ', 'Shang ', 'Yin ', 'Diao ', 'Cu ', 'Hui ', 'Cuan ', 'Yi ', 'Dan ', 'Du ', 'Jiang ', 'Lian ', 'Bin ', + 0xB0 => 'Du ', 'Tsukusu ', 'Jian ', 'Shu ', 'Ou ', 'Duan ', 'Zhu ', 'Yin ', 'Qing ', 'Yi ', 'Sha ', 'Que ', 'Ke ', 'Yao ', 'Jun ', 'Dian ', + 0xC0 => 'Hui ', 'Hui ', 'Gu ', 'Que ', 'Ji ', 'Yi ', 'Ou ', 'Hui ', 'Duan ', 'Yi ', 'Xiao ', 'Wu ', 'Guan ', 'Mu ', 'Mei ', 'Mei ', + 0xD0 => 'Ai ', 'Zuo ', 'Du ', 'Yu ', 'Bi ', 'Bi ', 'Bi ', 'Pi ', 'Pi ', 'Bi ', 'Chan ', 'Mao ', NULL, NULL, 'Pu ', 'Mushiru ', + 0xE0 => 'Jia ', 'Zhan ', 'Sai ', 'Mu ', 'Tuo ', 'Xun ', 'Er ', 'Rong ', 'Xian ', 'Ju ', 'Mu ', 'Hao ', 'Qiu ', 'Dou ', 'Mushiru ', 'Tan ', + 0xF0 => 'Pei ', 'Ju ', 'Duo ', 'Cui ', 'Bi ', 'San ', NULL, 'Mao ', 'Sui ', 'Yu ', 'Yu ', 'Tuo ', 'He ', 'Jian ', 'Ta ', 'San ', +); diff --git a/sources/resources/transliteration-data/x6c.php b/sources/resources/transliteration-data/x6c.php new file mode 100644 index 0000000..96de0ff --- /dev/null +++ b/sources/resources/transliteration-data/x6c.php @@ -0,0 +1,20 @@ + 'Lu ', 'Mu ', 'Li ', 'Tong ', 'Rong ', 'Chang ', 'Pu ', 'Luo ', 'Zhan ', 'Sao ', 'Zhan ', 'Meng ', 'Luo ', 'Qu ', 'Die ', 'Shi ', + 0x10 => 'Di ', 'Min ', 'Jue ', 'Mang ', 'Qi ', 'Pie ', 'Nai ', 'Qi ', 'Dao ', 'Xian ', 'Chuan ', 'Fen ', 'Ri ', 'Nei ', NULL, 'Fu ', + 0x20 => 'Shen ', 'Dong ', 'Qing ', 'Qi ', 'Yin ', 'Xi ', 'Hai ', 'Yang ', 'An ', 'Ya ', 'Ke ', 'Qing ', 'Ya ', 'Dong ', 'Dan ', 'Lu ', + 0x30 => 'Qing ', 'Yang ', 'Yun ', 'Yun ', 'Shui ', 'San ', 'Zheng ', 'Bing ', 'Yong ', 'Dang ', 'Shitamizu ', 'Le ', 'Ni ', 'Tun ', 'Fan ', 'Gui ', + 0x40 => 'Ting ', 'Zhi ', 'Qiu ', 'Bin ', 'Ze ', 'Mian ', 'Cuan ', 'Hui ', 'Diao ', 'Yi ', 'Cha ', 'Zhuo ', 'Chuan ', 'Wan ', 'Fan ', 'Dai ', + 0x50 => 'Xi ', 'Tuo ', 'Mang ', 'Qiu ', 'Qi ', 'Shan ', 'Pai ', 'Han ', 'Qian ', 'Wu ', 'Wu ', 'Xun ', 'Si ', 'Ru ', 'Gong ', 'Jiang ', + 0x60 => 'Chi ', 'Wu ', 'Tsuchi ', NULL, 'Tang ', 'Zhi ', 'Chi ', 'Qian ', 'Mi ', 'Yu ', 'Wang ', 'Qing ', 'Jing ', 'Rui ', 'Jun ', 'Hong ', + 0x70 => 'Tai ', 'Quan ', 'Ji ', 'Bian ', 'Bian ', 'Gan ', 'Wen ', 'Zhong ', 'Fang ', 'Xiong ', 'Jue ', 'Hang ', 'Niou ', 'Qi ', 'Fen ', 'Xu ', + 0x80 => 'Xu ', 'Qin ', 'Yi ', 'Wo ', 'Yun ', 'Yuan ', 'Hang ', 'Yan ', 'Chen ', 'Chen ', 'Dan ', 'You ', 'Dun ', 'Hu ', 'Huo ', 'Qie ', + 0x90 => 'Mu ', 'Rou ', 'Mei ', 'Ta ', 'Mian ', 'Wu ', 'Chong ', 'Tian ', 'Bi ', 'Sha ', 'Zhi ', 'Pei ', 'Pan ', 'Zhui ', 'Za ', 'Gou ', + 0xA0 => 'Liu ', 'Mei ', 'Ze ', 'Feng ', 'Ou ', 'Li ', 'Lun ', 'Cang ', 'Feng ', 'Wei ', 'Hu ', 'Mo ', 'Mei ', 'Shu ', 'Ju ', 'Zan ', + 0xB0 => 'Tuo ', 'Tuo ', 'Tuo ', 'He ', 'Li ', 'Mi ', 'Yi ', 'Fa ', 'Fei ', 'You ', 'Tian ', 'Zhi ', 'Zhao ', 'Gu ', 'Zhan ', 'Yan ', + 0xC0 => 'Si ', 'Kuang ', 'Jiong ', 'Ju ', 'Xie ', 'Qiu ', 'Yi ', 'Jia ', 'Zhong ', 'Quan ', 'Bo ', 'Hui ', 'Mi ', 'Ben ', 'Zhuo ', 'Chu ', + 0xD0 => 'Le ', 'You ', 'Gu ', 'Hong ', 'Gan ', 'Fa ', 'Mao ', 'Si ', 'Hu ', 'Ping ', 'Ci ', 'Fan ', 'Chi ', 'Su ', 'Ning ', 'Cheng ', + 0xE0 => 'Ling ', 'Pao ', 'Bo ', 'Qi ', 'Si ', 'Ni ', 'Ju ', 'Yue ', 'Zhu ', 'Sheng ', 'Lei ', 'Xuan ', 'Xue ', 'Fu ', 'Pan ', 'Min ', + 0xF0 => 'Tai ', 'Yang ', 'Ji ', 'Yong ', 'Guan ', 'Beng ', 'Xue ', 'Long ', 'Lu ', NULL, 'Bo ', 'Xie ', 'Po ', 'Ze ', 'Jing ', 'Yin ', +); diff --git a/sources/resources/transliteration-data/x6d.php b/sources/resources/transliteration-data/x6d.php new file mode 100644 index 0000000..a2a7aa8 --- /dev/null +++ b/sources/resources/transliteration-data/x6d.php @@ -0,0 +1,20 @@ + 'Zhou ', 'Ji ', 'Yi ', 'Hui ', 'Hui ', 'Zui ', 'Cheng ', 'Yin ', 'Wei ', 'Hou ', 'Jian ', 'Yang ', 'Lie ', 'Si ', 'Ji ', 'Er ', + 0x10 => 'Xing ', 'Fu ', 'Sa ', 'Suo ', 'Zhi ', 'Yin ', 'Wu ', 'Xi ', 'Kao ', 'Zhu ', 'Jiang ', 'Luo ', NULL, 'An ', 'Dong ', 'Yi ', + 0x20 => 'Mou ', 'Lei ', 'Yi ', 'Mi ', 'Quan ', 'Jin ', 'Mo ', 'Wei ', 'Xiao ', 'Xie ', 'Hong ', 'Xu ', 'Shuo ', 'Kuang ', 'Tao ', 'Qie ', + 0x30 => 'Ju ', 'Er ', 'Zhou ', 'Ru ', 'Ping ', 'Xun ', 'Xiong ', 'Zhi ', 'Guang ', 'Huan ', 'Ming ', 'Huo ', 'Wa ', 'Qia ', 'Pai ', 'Wu ', + 0x40 => 'Qu ', 'Liu ', 'Yi ', 'Jia ', 'Jing ', 'Qian ', 'Jiang ', 'Jiao ', 'Cheng ', 'Shi ', 'Zhuo ', 'Ce ', 'Pal ', 'Kuai ', 'Ji ', 'Liu ', + 0x50 => 'Chan ', 'Hun ', 'Hu ', 'Nong ', 'Xun ', 'Jin ', 'Lie ', 'Qiu ', 'Wei ', 'Zhe ', 'Jun ', 'Han ', 'Bang ', 'Mang ', 'Zhuo ', 'You ', + 0x60 => 'Xi ', 'Bo ', 'Dou ', 'Wan ', 'Hong ', 'Yi ', 'Pu ', 'Ying ', 'Lan ', 'Hao ', 'Lang ', 'Han ', 'Li ', 'Geng ', 'Fu ', 'Wu ', + 0x70 => 'Lian ', 'Chun ', 'Feng ', 'Yi ', 'Yu ', 'Tong ', 'Lao ', 'Hai ', 'Jin ', 'Jia ', 'Chong ', 'Weng ', 'Mei ', 'Sui ', 'Cheng ', 'Pei ', + 0x80 => 'Xian ', 'Shen ', 'Tu ', 'Kun ', 'Pin ', 'Nie ', 'Han ', 'Jing ', 'Xiao ', 'She ', 'Nian ', 'Tu ', 'Yong ', 'Xiao ', 'Xian ', 'Ting ', + 0x90 => 'E ', 'Su ', 'Tun ', 'Juan ', 'Cen ', 'Ti ', 'Li ', 'Shui ', 'Si ', 'Lei ', 'Shui ', 'Tao ', 'Du ', 'Lao ', 'Lai ', 'Lian ', + 0xA0 => 'Wei ', 'Wo ', 'Yun ', 'Huan ', 'Di ', NULL, 'Run ', 'Jian ', 'Zhang ', 'Se ', 'Fu ', 'Guan ', 'Xing ', 'Shou ', 'Shuan ', 'Ya ', + 0xB0 => 'Chuo ', 'Zhang ', 'Ye ', 'Kong ', 'Wo ', 'Han ', 'Tuo ', 'Dong ', 'He ', 'Wo ', 'Ju ', 'Gan ', 'Liang ', 'Hun ', 'Ta ', 'Zhuo ', + 0xC0 => 'Dian ', 'Qie ', 'De ', 'Juan ', 'Zi ', 'Xi ', 'Yao ', 'Qi ', 'Gu ', 'Guo ', 'Han ', 'Lin ', 'Tang ', 'Zhou ', 'Peng ', 'Hao ', + 0xD0 => 'Chang ', 'Shu ', 'Qi ', 'Fang ', 'Chi ', 'Lu ', 'Nao ', 'Ju ', 'Tao ', 'Cong ', 'Lei ', 'Zhi ', 'Peng ', 'Fei ', 'Song ', 'Tian ', + 0xE0 => 'Pi ', 'Dan ', 'Yu ', 'Ni ', 'Yu ', 'Lu ', 'Gan ', 'Mi ', 'Jing ', 'Ling ', 'Lun ', 'Yin ', 'Cui ', 'Qu ', 'Huai ', 'Yu ', + 0xF0 => 'Nian ', 'Shen ', 'Piao ', 'Chun ', 'Wa ', 'Yuan ', 'Lai ', 'Hun ', 'Qing ', 'Yan ', 'Qian ', 'Tian ', 'Miao ', 'Zhi ', 'Yin ', 'Mi ', +); diff --git a/sources/resources/transliteration-data/x6e.php b/sources/resources/transliteration-data/x6e.php new file mode 100644 index 0000000..5bcc290 --- /dev/null +++ b/sources/resources/transliteration-data/x6e.php @@ -0,0 +1,20 @@ + 'Ben ', 'Yuan ', 'Wen ', 'Re ', 'Fei ', 'Qing ', 'Yuan ', 'Ke ', 'Ji ', 'She ', 'Yuan ', 'Shibui ', 'Lu ', 'Zi ', 'Du ', NULL, + 0x10 => 'Jian ', 'Min ', 'Pi ', 'Tani ', 'Yu ', 'Yuan ', 'Shen ', 'Shen ', 'Rou ', 'Huan ', 'Zhu ', 'Jian ', 'Nuan ', 'Yu ', 'Qiu ', 'Ting ', + 0x20 => 'Qu ', 'Du ', 'Feng ', 'Zha ', 'Bo ', 'Wo ', 'Wo ', 'Di ', 'Wei ', 'Wen ', 'Ru ', 'Xie ', 'Ce ', 'Wei ', 'Ge ', 'Gang ', + 0x30 => 'Yan ', 'Hong ', 'Xuan ', 'Mi ', 'Ke ', 'Mao ', 'Ying ', 'Yan ', 'You ', 'Hong ', 'Miao ', 'Xing ', 'Mei ', 'Zai ', 'Hun ', 'Nai ', + 0x40 => 'Kui ', 'Shi ', 'E ', 'Pai ', 'Mei ', 'Lian ', 'Qi ', 'Qi ', 'Mei ', 'Tian ', 'Cou ', 'Wei ', 'Can ', 'Tuan ', 'Mian ', 'Hui ', + 0x50 => 'Mo ', 'Xu ', 'Ji ', 'Pen ', 'Jian ', 'Jian ', 'Hu ', 'Feng ', 'Xiang ', 'Yi ', 'Yin ', 'Zhan ', 'Shi ', 'Jie ', 'Cheng ', 'Huang ', + 0x60 => 'Tan ', 'Yu ', 'Bi ', 'Min ', 'Shi ', 'Tu ', 'Sheng ', 'Yong ', 'Qu ', 'Zhong ', 'Suei ', 'Jiu ', 'Jiao ', 'Qiou ', 'Yin ', 'Tang ', + 0x70 => 'Long ', 'Huo ', 'Yuan ', 'Nan ', 'Ban ', 'You ', 'Quan ', 'Chui ', 'Liang ', 'Chan ', 'Yan ', 'Chun ', 'Nie ', 'Zi ', 'Wan ', 'Shi ', + 0x80 => 'Man ', 'Ying ', 'Ratsu ', 'Kui ', NULL, 'Jian ', 'Xu ', 'Lu ', 'Gui ', 'Gai ', NULL, NULL, 'Po ', 'Jin ', 'Gui ', 'Tang ', + 0x90 => 'Yuan ', 'Suo ', 'Yuan ', 'Lian ', 'Yao ', 'Meng ', 'Zhun ', 'Sheng ', 'Ke ', 'Tai ', 'Da ', 'Wa ', 'Liu ', 'Gou ', 'Sao ', 'Ming ', + 0xA0 => 'Zha ', 'Shi ', 'Yi ', 'Lun ', 'Ma ', 'Pu ', 'Wei ', 'Li ', 'Cai ', 'Wu ', 'Xi ', 'Wen ', 'Qiang ', 'Ze ', 'Shi ', 'Su ', + 0xB0 => 'Yi ', 'Zhen ', 'Sou ', 'Yun ', 'Xiu ', 'Yin ', 'Rong ', 'Hun ', 'Su ', 'Su ', 'Ni ', 'Ta ', 'Shi ', 'Ru ', 'Wei ', 'Pan ', + 0xC0 => 'Chu ', 'Chu ', 'Pang ', 'Weng ', 'Cang ', 'Mie ', 'He ', 'Dian ', 'Hao ', 'Huang ', 'Xi ', 'Zi ', 'Di ', 'Zhi ', 'Ying ', 'Fu ', + 0xD0 => 'Jie ', 'Hua ', 'Ge ', 'Zi ', 'Tao ', 'Teng ', 'Sui ', 'Bi ', 'Jiao ', 'Hui ', 'Gun ', 'Yin ', 'Gao ', 'Long ', 'Zhi ', 'Yan ', + 0xE0 => 'She ', 'Man ', 'Ying ', 'Chun ', 'Lu ', 'Lan ', 'Luan ', NULL, 'Bin ', 'Tan ', 'Yu ', 'Sou ', 'Hu ', 'Bi ', 'Biao ', 'Zhi ', + 0xF0 => 'Jiang ', 'Kou ', 'Shen ', 'Shang ', 'Di ', 'Mi ', 'Ao ', 'Lu ', 'Hu ', 'Hu ', 'You ', 'Chan ', 'Fan ', 'Yong ', 'Gun ', 'Man ', +); diff --git a/sources/resources/transliteration-data/x6f.php b/sources/resources/transliteration-data/x6f.php new file mode 100644 index 0000000..73fd16d --- /dev/null +++ b/sources/resources/transliteration-data/x6f.php @@ -0,0 +1,20 @@ + 'Qing ', 'Yu ', 'Piao ', 'Ji ', 'Ya ', 'Jiao ', 'Qi ', 'Xi ', 'Ji ', 'Lu ', 'Lu ', 'Long ', 'Jin ', 'Guo ', 'Cong ', 'Lou ', + 0x10 => 'Zhi ', 'Gai ', 'Qiang ', 'Li ', 'Yan ', 'Cao ', 'Jiao ', 'Cong ', 'Qun ', 'Tuan ', 'Ou ', 'Teng ', 'Ye ', 'Xi ', 'Mi ', 'Tang ', + 0x20 => 'Mo ', 'Shang ', 'Han ', 'Lian ', 'Lan ', 'Wa ', 'Li ', 'Qian ', 'Feng ', 'Xuan ', 'Yi ', 'Man ', 'Zi ', 'Mang ', 'Kang ', 'Lei ', + 0x30 => 'Peng ', 'Shu ', 'Zhang ', 'Zhang ', 'Chong ', 'Xu ', 'Huan ', 'Kuo ', 'Jian ', 'Yan ', 'Chuang ', 'Liao ', 'Cui ', 'Ti ', 'Yang ', 'Jiang ', + 0x40 => 'Cong ', 'Ying ', 'Hong ', 'Xun ', 'Shu ', 'Guan ', 'Ying ', 'Xiao ', NULL, NULL, 'Xu ', 'Lian ', 'Zhi ', 'Wei ', 'Pi ', 'Jue ', + 0x50 => 'Jiao ', 'Po ', 'Dang ', 'Hui ', 'Jie ', 'Wu ', 'Pa ', 'Ji ', 'Pan ', 'Gui ', 'Xiao ', 'Qian ', 'Qian ', 'Xi ', 'Lu ', 'Xi ', + 0x60 => 'Xuan ', 'Dun ', 'Huang ', 'Min ', 'Run ', 'Su ', 'Liao ', 'Zhen ', 'Zhong ', 'Yi ', 'Di ', 'Wan ', 'Dan ', 'Tan ', 'Chao ', 'Xun ', + 0x70 => 'Kui ', 'Yie ', 'Shao ', 'Tu ', 'Zhu ', 'San ', 'Hei ', 'Bi ', 'Shan ', 'Chan ', 'Chan ', 'Shu ', 'Tong ', 'Pu ', 'Lin ', 'Wei ', + 0x80 => 'Se ', 'Se ', 'Cheng ', 'Jiong ', 'Cheng ', 'Hua ', 'Jiao ', 'Lao ', 'Che ', 'Gan ', 'Cun ', 'Heng ', 'Si ', 'Shu ', 'Peng ', 'Han ', + 0x90 => 'Yun ', 'Liu ', 'Hong ', 'Fu ', 'Hao ', 'He ', 'Xian ', 'Jian ', 'Shan ', 'Xi ', 'Oki ', NULL, 'Lan ', NULL, 'Yu ', 'Lin ', + 0xA0 => 'Min ', 'Zao ', 'Dang ', 'Wan ', 'Ze ', 'Xie ', 'Yu ', 'Li ', 'Shi ', 'Xue ', 'Ling ', 'Man ', 'Zi ', 'Yong ', 'Kuai ', 'Can ', + 0xB0 => 'Lian ', 'Dian ', 'Ye ', 'Ao ', 'Huan ', 'Zhen ', 'Chan ', 'Man ', 'Dan ', 'Dan ', 'Yi ', 'Sui ', 'Pi ', 'Ju ', 'Ta ', 'Qin ', + 0xC0 => 'Ji ', 'Zhuo ', 'Lian ', 'Nong ', 'Guo ', 'Jin ', 'Fen ', 'Se ', 'Ji ', 'Sui ', 'Hui ', 'Chu ', 'Ta ', 'Song ', 'Ding ', NULL, + 0xD0 => 'Zhu ', 'Lai ', 'Bin ', 'Lian ', 'Mi ', 'Shi ', 'Shu ', 'Mi ', 'Ning ', 'Ying ', 'Ying ', 'Meng ', 'Jin ', 'Qi ', 'Pi ', 'Ji ', + 0xE0 => 'Hao ', 'Ru ', 'Zui ', 'Wo ', 'Tao ', 'Yin ', 'Yin ', 'Dui ', 'Ci ', 'Huo ', 'Jing ', 'Lan ', 'Jun ', 'Ai ', 'Pu ', 'Zhuo ', + 0xF0 => 'Wei ', 'Bin ', 'Gu ', 'Qian ', 'Xing ', 'Hama ', 'Kuo ', 'Fei ', NULL, 'Boku ', 'Jian ', 'Wei ', 'Luo ', 'Zan ', 'Lu ', 'Li ', +); diff --git a/sources/resources/transliteration-data/x70.php b/sources/resources/transliteration-data/x70.php new file mode 100644 index 0000000..818fcea --- /dev/null +++ b/sources/resources/transliteration-data/x70.php @@ -0,0 +1,20 @@ + 'You ', 'Yang ', 'Lu ', 'Si ', 'Jie ', 'Ying ', 'Du ', 'Wang ', 'Hui ', 'Xie ', 'Pan ', 'Shen ', 'Biao ', 'Chan ', 'Mo ', 'Liu ', + 0x10 => 'Jian ', 'Pu ', 'Se ', 'Cheng ', 'Gu ', 'Bin ', 'Huo ', 'Xian ', 'Lu ', 'Qin ', 'Han ', 'Ying ', 'Yong ', 'Li ', 'Jing ', 'Xiao ', + 0x20 => 'Ying ', 'Sui ', 'Wei ', 'Xie ', 'Huai ', 'Hao ', 'Zhu ', 'Long ', 'Lai ', 'Dui ', 'Fan ', 'Hu ', 'Lai ', NULL, NULL, 'Ying ', + 0x30 => 'Mi ', 'Ji ', 'Lian ', 'Jian ', 'Ying ', 'Fen ', 'Lin ', 'Yi ', 'Jian ', 'Yue ', 'Chan ', 'Dai ', 'Rang ', 'Jian ', 'Lan ', 'Fan ', + 0x40 => 'Shuang ', 'Yuan ', 'Zhuo ', 'Feng ', 'She ', 'Lei ', 'Lan ', 'Cong ', 'Qu ', 'Yong ', 'Qian ', 'Fa ', 'Guan ', 'Que ', 'Yan ', 'Hao ', + 0x50 => 'Hyeng ', 'Sa ', 'Zan ', 'Luan ', 'Yan ', 'Li ', 'Mi ', 'Shan ', 'Tan ', 'Dang ', 'Jiao ', 'Chan ', NULL, 'Hao ', 'Ba ', 'Zhu ', + 0x60 => 'Lan ', 'Lan ', 'Nang ', 'Wan ', 'Luan ', 'Xun ', 'Xian ', 'Yan ', 'Gan ', 'Yan ', 'Yu ', 'Huo ', 'Si ', 'Mie ', 'Guang ', 'Deng ', + 0x70 => 'Hui ', 'Xiao ', 'Xiao ', 'Hu ', 'Hong ', 'Ling ', 'Zao ', 'Zhuan ', 'Jiu ', 'Zha ', 'Xie ', 'Chi ', 'Zhuo ', 'Zai ', 'Zai ', 'Can ', + 0x80 => 'Yang ', 'Qi ', 'Zhong ', 'Fen ', 'Niu ', 'Jiong ', 'Wen ', 'Po ', 'Yi ', 'Lu ', 'Chui ', 'Pi ', 'Kai ', 'Pan ', 'Yan ', 'Kai ', + 0x90 => 'Pang ', 'Mu ', 'Chao ', 'Liao ', 'Gui ', 'Kang ', 'Tun ', 'Guang ', 'Xin ', 'Zhi ', 'Guang ', 'Guang ', 'Wei ', 'Qiang ', NULL, 'Da ', + 0xA0 => 'Xia ', 'Zheng ', 'Zhu ', 'Ke ', 'Zhao ', 'Fu ', 'Ba ', 'Duo ', 'Duo ', 'Ling ', 'Zhuo ', 'Xuan ', 'Ju ', 'Tan ', 'Pao ', 'Jiong ', + 0xB0 => 'Pao ', 'Tai ', 'Tai ', 'Bing ', 'Yang ', 'Tong ', 'Han ', 'Zhu ', 'Zha ', 'Dian ', 'Wei ', 'Shi ', 'Lian ', 'Chi ', 'Huang ', NULL, + 0xC0 => 'Hu ', 'Shuo ', 'Lan ', 'Jing ', 'Jiao ', 'Xu ', 'Xing ', 'Quan ', 'Lie ', 'Huan ', 'Yang ', 'Xiao ', 'Xiu ', 'Xian ', 'Yin ', 'Wu ', + 0xD0 => 'Zhou ', 'Yao ', 'Shi ', 'Wei ', 'Tong ', 'Xue ', 'Zai ', 'Kai ', 'Hong ', 'Luo ', 'Xia ', 'Zhu ', 'Xuan ', 'Zheng ', 'Po ', 'Yan ', + 0xE0 => 'Hui ', 'Guang ', 'Zhe ', 'Hui ', 'Kao ', NULL, 'Fan ', 'Shao ', 'Ye ', 'Hui ', NULL, 'Tang ', 'Jin ', 'Re ', NULL, 'Xi ', + 0xF0 => 'Fu ', 'Jiong ', 'Che ', 'Pu ', 'Jing ', 'Zhuo ', 'Ting ', 'Wan ', 'Hai ', 'Peng ', 'Lang ', 'Shan ', 'Hu ', 'Feng ', 'Chi ', 'Rong ', +); diff --git a/sources/resources/transliteration-data/x71.php b/sources/resources/transliteration-data/x71.php new file mode 100644 index 0000000..1bcfb2c --- /dev/null +++ b/sources/resources/transliteration-data/x71.php @@ -0,0 +1,20 @@ + 'Hu ', 'Xi ', 'Shu ', 'He ', 'Xun ', 'Ku ', 'Jue ', 'Xiao ', 'Xi ', 'Yan ', 'Han ', 'Zhuang ', 'Jun ', 'Di ', 'Xie ', 'Ji ', + 0x10 => 'Wu ', NULL, NULL, 'Han ', 'Yan ', 'Huan ', 'Men ', 'Ju ', 'Chou ', 'Bei ', 'Fen ', 'Lin ', 'Kun ', 'Hun ', 'Tun ', 'Xi ', + 0x20 => 'Cui ', 'Wu ', 'Hong ', 'Ju ', 'Fu ', 'Wo ', 'Jiao ', 'Cong ', 'Feng ', 'Ping ', 'Qiong ', 'Ruo ', 'Xi ', 'Qiong ', 'Xin ', 'Zhuo ', + 0x30 => 'Yan ', 'Yan ', 'Yi ', 'Jue ', 'Yu ', 'Gang ', 'Ran ', 'Pi ', 'Gu ', NULL, 'Sheng ', 'Chang ', 'Shao ', NULL, NULL, NULL, + 0x40 => NULL, 'Chen ', 'He ', 'Kui ', 'Zhong ', 'Duan ', 'Xia ', 'Hui ', 'Feng ', 'Lian ', 'Xuan ', 'Xing ', 'Huang ', 'Jiao ', 'Jian ', 'Bi ', + 0x50 => 'Ying ', 'Zhu ', 'Wei ', 'Tuan ', 'Tian ', 'Xi ', 'Nuan ', 'Nuan ', 'Chan ', 'Yan ', 'Jiong ', 'Jiong ', 'Yu ', 'Mei ', 'Sha ', 'Wei ', + 0x60 => 'Ye ', 'Xin ', 'Qiong ', 'Rou ', 'Mei ', 'Huan ', 'Xu ', 'Zhao ', 'Wei ', 'Fan ', 'Qiu ', 'Sui ', 'Yang ', 'Lie ', 'Zhu ', 'Jie ', + 0x70 => 'Gao ', 'Gua ', 'Bao ', 'Hu ', 'Yun ', 'Xia ', NULL, NULL, 'Bian ', 'Gou ', 'Tui ', 'Tang ', 'Chao ', 'Shan ', 'N ', 'Bo ', + 0x80 => 'Huang ', 'Xie ', 'Xi ', 'Wu ', 'Xi ', 'Yun ', 'He ', 'He ', 'Xi ', 'Yun ', 'Xiong ', 'Nai ', 'Shan ', 'Qiong ', 'Yao ', 'Xun ', + 0x90 => 'Mi ', 'Lian ', 'Ying ', 'Wen ', 'Rong ', 'Oozutsu ', NULL, 'Qiang ', 'Liu ', 'Xi ', 'Bi ', 'Biao ', 'Zong ', 'Lu ', 'Jian ', 'Shou ', + 0xA0 => 'Yi ', 'Lou ', 'Feng ', 'Sui ', 'Yi ', 'Tong ', 'Jue ', 'Zong ', 'Yun ', 'Hu ', 'Yi ', 'Zhi ', 'Ao ', 'Wei ', 'Liao ', 'Han ', + 0xB0 => 'Ou ', 'Re ', 'Jiong ', 'Man ', NULL, 'Shang ', 'Cuan ', 'Zeng ', 'Jian ', 'Xi ', 'Xi ', 'Xi ', 'Yi ', 'Xiao ', 'Chi ', 'Huang ', + 0xC0 => 'Chan ', 'Ye ', 'Qian ', 'Ran ', 'Yan ', 'Xian ', 'Qiao ', 'Zun ', 'Deng ', 'Dun ', 'Shen ', 'Jiao ', 'Fen ', 'Si ', 'Liao ', 'Yu ', + 0xD0 => 'Lin ', 'Tong ', 'Shao ', 'Fen ', 'Fan ', 'Yan ', 'Xun ', 'Lan ', 'Mei ', 'Tang ', 'Yi ', 'Jing ', 'Men ', NULL, NULL, 'Ying ', + 0xE0 => 'Yu ', 'Yi ', 'Xue ', 'Lan ', 'Tai ', 'Zao ', 'Can ', 'Sui ', 'Xi ', 'Que ', 'Cong ', 'Lian ', 'Hui ', 'Zhu ', 'Xie ', 'Ling ', + 0xF0 => 'Wei ', 'Yi ', 'Xie ', 'Zhao ', 'Hui ', 'Tatsu ', 'Nung ', 'Lan ', 'Ru ', 'Xian ', 'Kao ', 'Xun ', 'Jin ', 'Chou ', 'Chou ', 'Yao ', +); diff --git a/sources/resources/transliteration-data/x72.php b/sources/resources/transliteration-data/x72.php new file mode 100644 index 0000000..c8f8e5d --- /dev/null +++ b/sources/resources/transliteration-data/x72.php @@ -0,0 +1,20 @@ + 'He ', 'Lan ', 'Biao ', 'Rong ', 'Li ', 'Mo ', 'Bao ', 'Ruo ', 'Lu ', 'La ', 'Ao ', 'Xun ', 'Kuang ', 'Shuo ', NULL, 'Li ', + 0x10 => 'Lu ', 'Jue ', 'Liao ', 'Yan ', 'Xi ', 'Xie ', 'Long ', 'Ye ', NULL, 'Rang ', 'Yue ', 'Lan ', 'Cong ', 'Jue ', 'Tong ', 'Guan ', + 0x20 => NULL, 'Che ', 'Mi ', 'Tang ', 'Lan ', 'Zhu ', NULL, 'Ling ', 'Cuan ', 'Yu ', 'Zhua ', 'Tsumekanmuri ', 'Pa ', 'Zheng ', 'Pao ', 'Cheng ', + 0x30 => 'Yuan ', 'Ai ', 'Wei ', NULL, 'Jue ', 'Jue ', 'Fu ', 'Ye ', 'Ba ', 'Die ', 'Ye ', 'Yao ', 'Zu ', 'Shuang ', 'Er ', 'Qiang ', + 0x40 => 'Chuang ', 'Ge ', 'Zang ', 'Die ', 'Qiang ', 'Yong ', 'Qiang ', 'Pian ', 'Ban ', 'Pan ', 'Shao ', 'Jian ', 'Pai ', 'Du ', 'Chuang ', 'Tou ', + 0x50 => 'Zha ', 'Bian ', 'Die ', 'Bang ', 'Bo ', 'Chuang ', 'You ', NULL, 'Du ', 'Ya ', 'Cheng ', 'Niu ', 'Ushihen ', 'Pin ', 'Jiu ', 'Mou ', + 0x60 => 'Tuo ', 'Mu ', 'Lao ', 'Ren ', 'Mang ', 'Fang ', 'Mao ', 'Mu ', 'Gang ', 'Wu ', 'Yan ', 'Ge ', 'Bei ', 'Si ', 'Jian ', 'Gu ', + 0x70 => 'You ', 'Ge ', 'Sheng ', 'Mu ', 'Di ', 'Qian ', 'Quan ', 'Quan ', 'Zi ', 'Te ', 'Xi ', 'Mang ', 'Keng ', 'Qian ', 'Wu ', 'Gu ', + 0x80 => 'Xi ', 'Li ', 'Li ', 'Pou ', 'Ji ', 'Gang ', 'Zhi ', 'Ben ', 'Quan ', 'Run ', 'Du ', 'Ju ', 'Jia ', 'Jian ', 'Feng ', 'Pian ', + 0x90 => 'Ke ', 'Ju ', 'Kao ', 'Chu ', 'Xi ', 'Bei ', 'Luo ', 'Jie ', 'Ma ', 'San ', 'Wei ', 'Li ', 'Dun ', 'Tong ', NULL, 'Jiang ', + 0xA0 => 'Ikenie ', 'Li ', 'Du ', 'Lie ', 'Pi ', 'Piao ', 'Bao ', 'Xi ', 'Chou ', 'Wei ', 'Kui ', 'Chou ', 'Quan ', 'Fan ', 'Ba ', 'Fan ', + 0xB0 => 'Qiu ', 'Ji ', 'Cai ', 'Chuo ', 'An ', 'Jie ', 'Zhuang ', 'Guang ', 'Ma ', 'You ', 'Kang ', 'Bo ', 'Hou ', 'Ya ', 'Yin ', 'Huan ', + 0xC0 => 'Zhuang ', 'Yun ', 'Kuang ', 'Niu ', 'Di ', 'Qing ', 'Zhong ', 'Mu ', 'Bei ', 'Pi ', 'Ju ', 'Ni ', 'Sheng ', 'Pao ', 'Xia ', 'Tuo ', + 0xD0 => 'Hu ', 'Ling ', 'Fei ', 'Pi ', 'Ni ', 'Ao ', 'You ', 'Gou ', 'Yue ', 'Ju ', 'Dan ', 'Po ', 'Gu ', 'Xian ', 'Ning ', 'Huan ', + 0xE0 => 'Hen ', 'Jiao ', 'He ', 'Zhao ', 'Ji ', 'Xun ', 'Shan ', 'Ta ', 'Rong ', 'Shou ', 'Tong ', 'Lao ', 'Du ', 'Xia ', 'Shi ', 'Hua ', + 0xF0 => 'Zheng ', 'Yu ', 'Sun ', 'Yu ', 'Bi ', 'Mang ', 'Xi ', 'Juan ', 'Li ', 'Xia ', 'Yin ', 'Suan ', 'Lang ', 'Bei ', 'Zhi ', 'Yan ', +); diff --git a/sources/resources/transliteration-data/x73.php b/sources/resources/transliteration-data/x73.php new file mode 100644 index 0000000..9ad2a10 --- /dev/null +++ b/sources/resources/transliteration-data/x73.php @@ -0,0 +1,20 @@ + 'Sha ', 'Li ', 'Han ', 'Xian ', 'Jing ', 'Pai ', 'Fei ', 'Yao ', 'Ba ', 'Qi ', 'Ni ', 'Biao ', 'Yin ', 'Lai ', 'Xi ', 'Jian ', + 0x10 => 'Qiang ', 'Kun ', 'Yan ', 'Guo ', 'Zong ', 'Mi ', 'Chang ', 'Yi ', 'Zhi ', 'Zheng ', 'Ya ', 'Meng ', 'Cai ', 'Cu ', 'She ', 'Kari ', + 0x20 => 'Cen ', 'Luo ', 'Hu ', 'Zong ', 'Ji ', 'Wei ', 'Feng ', 'Wo ', 'Yuan ', 'Xing ', 'Zhu ', 'Mao ', 'Wei ', 'Yuan ', 'Xian ', 'Tuan ', + 0x30 => 'Ya ', 'Nao ', 'Xie ', 'Jia ', 'Hou ', 'Bian ', 'You ', 'You ', 'Mei ', 'Zha ', 'Yao ', 'Sun ', 'Bo ', 'Ming ', 'Hua ', 'Yuan ', + 0x40 => 'Sou ', 'Ma ', 'Yuan ', 'Dai ', 'Yu ', 'Shi ', 'Hao ', NULL, 'Yi ', 'Zhen ', 'Chuang ', 'Hao ', 'Man ', 'Jing ', 'Jiang ', 'Mu ', + 0x50 => 'Zhang ', 'Chan ', 'Ao ', 'Ao ', 'Hao ', 'Cui ', 'Fen ', 'Jue ', 'Bi ', 'Bi ', 'Huang ', 'Pu ', 'Lin ', 'Yu ', 'Tong ', 'Yao ', + 0x60 => 'Liao ', 'Shuo ', 'Xiao ', 'Swu ', 'Ton ', 'Xi ', 'Ge ', 'Juan ', 'Du ', 'Hui ', 'Kuai ', 'Xian ', 'Xie ', 'Ta ', 'Xian ', 'Xun ', + 0x70 => 'Ning ', 'Pin ', 'Huo ', 'Nou ', 'Meng ', 'Lie ', 'Nao ', 'Guang ', 'Shou ', 'Lu ', 'Ta ', 'Xian ', 'Mi ', 'Rang ', 'Huan ', 'Nao ', + 0x80 => 'Luo ', 'Xian ', 'Qi ', 'Jue ', 'Xuan ', 'Miao ', 'Zi ', 'Lu ', 'Lu ', 'Yu ', 'Su ', 'Wang ', 'Qiu ', 'Ga ', 'Ding ', 'Le ', + 0x90 => 'Ba ', 'Ji ', 'Hong ', 'Di ', 'Quan ', 'Gan ', 'Jiu ', 'Yu ', 'Ji ', 'Yu ', 'Yang ', 'Ma ', 'Gong ', 'Wu ', 'Fu ', 'Wen ', + 0xA0 => 'Jie ', 'Ya ', 'Fen ', 'Bian ', 'Beng ', 'Yue ', 'Jue ', 'Yun ', 'Jue ', 'Wan ', 'Jian ', 'Mei ', 'Dan ', 'Pi ', 'Wei ', 'Huan ', + 0xB0 => 'Xian ', 'Qiang ', 'Ling ', 'Dai ', 'Yi ', 'An ', 'Ping ', 'Dian ', 'Fu ', 'Xuan ', 'Xi ', 'Bo ', 'Ci ', 'Gou ', 'Jia ', 'Shao ', + 0xC0 => 'Po ', 'Ci ', 'Ke ', 'Ran ', 'Sheng ', 'Shen ', 'Yi ', 'Zu ', 'Jia ', 'Min ', 'Shan ', 'Liu ', 'Bi ', 'Zhen ', 'Zhen ', 'Jue ', + 0xD0 => 'Fa ', 'Long ', 'Jin ', 'Jiao ', 'Jian ', 'Li ', 'Guang ', 'Xian ', 'Zhou ', 'Gong ', 'Yan ', 'Xiu ', 'Yang ', 'Xu ', 'Luo ', 'Su ', + 0xE0 => 'Zhu ', 'Qin ', 'Ken ', 'Xun ', 'Bao ', 'Er ', 'Xiang ', 'Yao ', 'Xia ', 'Heng ', 'Gui ', 'Chong ', 'Xu ', 'Ban ', 'Pei ', NULL, + 0xF0 => 'Dang ', 'Ei ', 'Hun ', 'Wen ', 'E ', 'Cheng ', 'Ti ', 'Wu ', 'Wu ', 'Cheng ', 'Jun ', 'Mei ', 'Bei ', 'Ting ', 'Xian ', 'Chuo ', +); diff --git a/sources/resources/transliteration-data/x74.php b/sources/resources/transliteration-data/x74.php new file mode 100644 index 0000000..fb491a5 --- /dev/null +++ b/sources/resources/transliteration-data/x74.php @@ -0,0 +1,20 @@ + 'Han ', 'Xuan ', 'Yan ', 'Qiu ', 'Quan ', 'Lang ', 'Li ', 'Xiu ', 'Fu ', 'Liu ', 'Ye ', 'Xi ', 'Ling ', 'Li ', 'Jin ', 'Lian ', + 0x10 => 'Suo ', 'Chiisai ', NULL, 'Wan ', 'Dian ', 'Pin ', 'Zhan ', 'Cui ', 'Min ', 'Yu ', 'Ju ', 'Chen ', 'Lai ', 'Wen ', 'Sheng ', 'Wei ', + 0x20 => 'Dian ', 'Chu ', 'Zhuo ', 'Pei ', 'Cheng ', 'Hu ', 'Qi ', 'E ', 'Kun ', 'Chang ', 'Qi ', 'Beng ', 'Wan ', 'Lu ', 'Cong ', 'Guan ', + 0x30 => 'Yan ', 'Diao ', 'Bei ', 'Lin ', 'Qin ', 'Pi ', 'Pa ', 'Que ', 'Zhuo ', 'Qin ', 'Fa ', NULL, 'Qiong ', 'Du ', 'Jie ', 'Hun ', + 0x40 => 'Yu ', 'Mao ', 'Mei ', 'Chun ', 'Xuan ', 'Ti ', 'Xing ', 'Dai ', 'Rou ', 'Min ', 'Zhen ', 'Wei ', 'Ruan ', 'Huan ', 'Jie ', 'Chuan ', + 0x50 => 'Jian ', 'Zhuan ', 'Yang ', 'Lian ', 'Quan ', 'Xia ', 'Duan ', 'Yuan ', 'Ye ', 'Nao ', 'Hu ', 'Ying ', 'Yu ', 'Huang ', 'Rui ', 'Se ', + 0x60 => 'Liu ', 'Shi ', 'Rong ', 'Suo ', 'Yao ', 'Wen ', 'Wu ', 'Jin ', 'Jin ', 'Ying ', 'Ma ', 'Tao ', 'Liu ', 'Tang ', 'Li ', 'Lang ', + 0x70 => 'Gui ', 'Zhen ', 'Qiang ', 'Cuo ', 'Jue ', 'Zhao ', 'Yao ', 'Ai ', 'Bin ', 'Tu ', 'Chang ', 'Kun ', 'Zhuan ', 'Cong ', 'Jin ', 'Yi ', + 0x80 => 'Cui ', 'Cong ', 'Qi ', 'Li ', 'Ying ', 'Suo ', 'Qiu ', 'Xuan ', 'Ao ', 'Lian ', 'Man ', 'Zhang ', 'Yin ', NULL, 'Ying ', 'Zhi ', + 0x90 => 'Lu ', 'Wu ', 'Deng ', 'Xiou ', 'Zeng ', 'Xun ', 'Qu ', 'Dang ', 'Lin ', 'Liao ', 'Qiong ', 'Su ', 'Huang ', 'Gui ', 'Pu ', 'Jing ', + 0xA0 => 'Fan ', 'Jin ', 'Liu ', 'Ji ', NULL, 'Jing ', 'Ai ', 'Bi ', 'Can ', 'Qu ', 'Zao ', 'Dang ', 'Jiao ', 'Gun ', 'Tan ', 'Hui ', + 0xB0 => 'Huan ', 'Se ', 'Sui ', 'Tian ', NULL, 'Yu ', 'Jin ', 'Lu ', 'Bin ', 'Shou ', 'Wen ', 'Zui ', 'Lan ', 'Xi ', 'Ji ', 'Xuan ', + 0xC0 => 'Ruan ', 'Huo ', 'Gai ', 'Lei ', 'Du ', 'Li ', 'Zhi ', 'Rou ', 'Li ', 'Zan ', 'Qiong ', 'Zhe ', 'Gui ', 'Sui ', 'La ', 'Long ', + 0xD0 => 'Lu ', 'Li ', 'Zan ', 'Lan ', 'Ying ', 'Mi ', 'Xiang ', 'Xi ', 'Guan ', 'Dao ', 'Zan ', 'Huan ', 'Gua ', 'Bo ', 'Die ', 'Bao ', + 0xE0 => 'Hu ', 'Zhi ', 'Piao ', 'Ban ', 'Rang ', 'Li ', 'Wa ', 'Dekaguramu ', 'Jiang ', 'Qian ', 'Fan ', 'Pen ', 'Fang ', 'Dan ', 'Weng ', 'Ou ', + 0xF0 => 'Deshiguramu ', 'Miriguramu ', 'Thon ', 'Hu ', 'Ling ', 'Yi ', 'Ping ', 'Ci ', 'Hekutogura ', 'Juan ', 'Chang ', 'Chi ', 'Sarake ', 'Dang ', 'Meng ', 'Pou ', +); diff --git a/sources/resources/transliteration-data/x75.php b/sources/resources/transliteration-data/x75.php new file mode 100644 index 0000000..cb02a5d --- /dev/null +++ b/sources/resources/transliteration-data/x75.php @@ -0,0 +1,20 @@ + 'Zhui ', 'Ping ', 'Bian ', 'Zhou ', 'Zhen ', 'Senchigura ', 'Ci ', 'Ying ', 'Qi ', 'Xian ', 'Lou ', 'Di ', 'Ou ', 'Meng ', 'Zhuan ', 'Peng ', + 0x10 => 'Lin ', 'Zeng ', 'Wu ', 'Pi ', 'Dan ', 'Weng ', 'Ying ', 'Yan ', 'Gan ', 'Dai ', 'Shen ', 'Tian ', 'Tian ', 'Han ', 'Chang ', 'Sheng ', + 0x20 => 'Qing ', 'Sheng ', 'Chan ', 'Chan ', 'Rui ', 'Sheng ', 'Su ', 'Sen ', 'Yong ', 'Shuai ', 'Lu ', 'Fu ', 'Yong ', 'Beng ', 'Feng ', 'Ning ', + 0x30 => 'Tian ', 'You ', 'Jia ', 'Shen ', 'Zha ', 'Dian ', 'Fu ', 'Nan ', 'Dian ', 'Ping ', 'Ting ', 'Hua ', 'Ting ', 'Quan ', 'Zi ', 'Meng ', + 0x40 => 'Bi ', 'Qi ', 'Liu ', 'Xun ', 'Liu ', 'Chang ', 'Mu ', 'Yun ', 'Fan ', 'Fu ', 'Geng ', 'Tian ', 'Jie ', 'Jie ', 'Quan ', 'Wei ', + 0x50 => 'Fu ', 'Tian ', 'Mu ', 'Tap ', 'Pan ', 'Jiang ', 'Wa ', 'Da ', 'Nan ', 'Liu ', 'Ben ', 'Zhen ', 'Chu ', 'Mu ', 'Mu ', 'Ce ', + 0x60 => 'Cen ', 'Gai ', 'Bi ', 'Da ', 'Zhi ', 'Lue ', 'Qi ', 'Lue ', 'Pan ', 'Kesa ', 'Fan ', 'Hua ', 'Yu ', 'Yu ', 'Mu ', 'Jun ', + 0x70 => 'Yi ', 'Liu ', 'Yu ', 'Die ', 'Chou ', 'Hua ', 'Dang ', 'Chuo ', 'Ji ', 'Wan ', 'Jiang ', 'Sheng ', 'Chang ', 'Tuan ', 'Lei ', 'Ji ', + 0x80 => 'Cha ', 'Liu ', 'Tatamu ', 'Tuan ', 'Lin ', 'Jiang ', 'Jiang ', 'Chou ', 'Bo ', 'Die ', 'Die ', 'Pi ', 'Nie ', 'Dan ', 'Shu ', 'Shu ', + 0x90 => 'Zhi ', 'Yi ', 'Chuang ', 'Nai ', 'Ding ', 'Bi ', 'Jie ', 'Liao ', 'Gong ', 'Ge ', 'Jiu ', 'Zhou ', 'Xia ', 'Shan ', 'Xu ', 'Nue ', + 0xA0 => 'Li ', 'Yang ', 'Chen ', 'You ', 'Ba ', 'Jie ', 'Jue ', 'Zhi ', 'Xia ', 'Cui ', 'Bi ', 'Yi ', 'Li ', 'Zong ', 'Chuang ', 'Feng ', + 0xB0 => 'Zhu ', 'Pao ', 'Pi ', 'Gan ', 'Ke ', 'Ci ', 'Xie ', 'Qi ', 'Dan ', 'Zhen ', 'Fa ', 'Zhi ', 'Teng ', 'Ju ', 'Ji ', 'Fei ', + 0xC0 => 'Qu ', 'Dian ', 'Jia ', 'Xian ', 'Cha ', 'Bing ', 'Ni ', 'Zheng ', 'Yong ', 'Jing ', 'Quan ', 'Chong ', 'Tong ', 'Yi ', 'Kai ', 'Wei ', + 0xD0 => 'Hui ', 'Duo ', 'Yang ', 'Chi ', 'Zhi ', 'Hen ', 'Ya ', 'Mei ', 'Dou ', 'Jing ', 'Xiao ', 'Tong ', 'Tu ', 'Mang ', 'Pi ', 'Xiao ', + 0xE0 => 'Suan ', 'Pu ', 'Li ', 'Zhi ', 'Cuo ', 'Duo ', 'Wu ', 'Sha ', 'Lao ', 'Shou ', 'Huan ', 'Xian ', 'Yi ', 'Peng ', 'Zhang ', 'Guan ', + 0xF0 => 'Tan ', 'Fei ', 'Ma ', 'Lin ', 'Chi ', 'Ji ', 'Dian ', 'An ', 'Chi ', 'Bi ', 'Bei ', 'Min ', 'Gu ', 'Dui ', 'E ', 'Wei ', +); diff --git a/sources/resources/transliteration-data/x76.php b/sources/resources/transliteration-data/x76.php new file mode 100644 index 0000000..97f921f --- /dev/null +++ b/sources/resources/transliteration-data/x76.php @@ -0,0 +1,20 @@ + 'Yu ', 'Cui ', 'Ya ', 'Zhu ', 'Cu ', 'Dan ', 'Shen ', 'Zhung ', 'Ji ', 'Yu ', 'Hou ', 'Feng ', 'La ', 'Yang ', 'Shen ', 'Tu ', + 0x10 => 'Yu ', 'Gua ', 'Wen ', 'Huan ', 'Ku ', 'Jia ', 'Yin ', 'Yi ', 'Lu ', 'Sao ', 'Jue ', 'Chi ', 'Xi ', 'Guan ', 'Yi ', 'Wen ', + 0x20 => 'Ji ', 'Chuang ', 'Ban ', 'Lei ', 'Liu ', 'Chai ', 'Shou ', 'Nue ', 'Dian ', 'Da ', 'Pie ', 'Tan ', 'Zhang ', 'Biao ', 'Shen ', 'Cu ', + 0x30 => 'Luo ', 'Yi ', 'Zong ', 'Chou ', 'Zhang ', 'Zhai ', 'Sou ', 'Suo ', 'Que ', 'Diao ', 'Lou ', 'Lu ', 'Mo ', 'Jin ', 'Yin ', 'Ying ', + 0x40 => 'Huang ', 'Fu ', 'Liao ', 'Long ', 'Qiao ', 'Liu ', 'Lao ', 'Xian ', 'Fei ', 'Dan ', 'Yin ', 'He ', 'Yan ', 'Ban ', 'Xian ', 'Guan ', + 0x50 => 'Guai ', 'Nong ', 'Yu ', 'Wei ', 'Yi ', 'Yong ', 'Pi ', 'Lei ', 'Li ', 'Shu ', 'Dan ', 'Lin ', 'Dian ', 'Lin ', 'Lai ', 'Pie ', + 0x60 => 'Ji ', 'Chi ', 'Yang ', 'Xian ', 'Jie ', 'Zheng ', NULL, 'Li ', 'Huo ', 'Lai ', 'Shaku ', 'Dian ', 'Xian ', 'Ying ', 'Yin ', 'Qu ', + 0x70 => 'Yong ', 'Tan ', 'Dian ', 'Luo ', 'Luan ', 'Luan ', 'Bo ', NULL, 'Gui ', 'Po ', 'Fa ', 'Deng ', 'Fa ', 'Bai ', 'Bai ', 'Qie ', + 0x80 => 'Bi ', 'Zao ', 'Zao ', 'Mao ', 'De ', 'Pa ', 'Jie ', 'Huang ', 'Gui ', 'Ci ', 'Ling ', 'Gao ', 'Mo ', 'Ji ', 'Jiao ', 'Peng ', + 0x90 => 'Gao ', 'Ai ', 'E ', 'Hao ', 'Han ', 'Bi ', 'Wan ', 'Chou ', 'Qian ', 'Xi ', 'Ai ', 'Jiong ', 'Hao ', 'Huang ', 'Hao ', 'Ze ', + 0xA0 => 'Cui ', 'Hao ', 'Xiao ', 'Ye ', 'Po ', 'Hao ', 'Jiao ', 'Ai ', 'Xing ', 'Huang ', 'Li ', 'Piao ', 'He ', 'Jiao ', 'Pi ', 'Gan ', + 0xB0 => 'Pao ', 'Zhou ', 'Jun ', 'Qiu ', 'Cun ', 'Que ', 'Zha ', 'Gu ', 'Jun ', 'Jun ', 'Zhou ', 'Zha ', 'Gu ', 'Zhan ', 'Du ', 'Min ', + 0xC0 => 'Qi ', 'Ying ', 'Yu ', 'Bei ', 'Zhao ', 'Zhong ', 'Pen ', 'He ', 'Ying ', 'He ', 'Yi ', 'Bo ', 'Wan ', 'He ', 'Ang ', 'Zhan ', + 0xD0 => 'Yan ', 'Jian ', 'He ', 'Yu ', 'Kui ', 'Fan ', 'Gai ', 'Dao ', 'Pan ', 'Fu ', 'Qiu ', 'Sheng ', 'Dao ', 'Lu ', 'Zhan ', 'Meng ', + 0xE0 => 'Li ', 'Jin ', 'Xu ', 'Jian ', 'Pan ', 'Guan ', 'An ', 'Lu ', 'Shu ', 'Zhou ', 'Dang ', 'An ', 'Gu ', 'Li ', 'Mu ', 'Cheng ', + 0xF0 => 'Gan ', 'Xu ', 'Mang ', 'Mang ', 'Zhi ', 'Qi ', 'Ruan ', 'Tian ', 'Xiang ', 'Dun ', 'Xin ', 'Xi ', 'Pan ', 'Feng ', 'Dun ', 'Min ', +); diff --git a/sources/resources/transliteration-data/x77.php b/sources/resources/transliteration-data/x77.php new file mode 100644 index 0000000..8002e76 --- /dev/null +++ b/sources/resources/transliteration-data/x77.php @@ -0,0 +1,20 @@ + 'Ming ', 'Sheng ', 'Shi ', 'Yun ', 'Mian ', 'Pan ', 'Fang ', 'Miao ', 'Dan ', 'Mei ', 'Mao ', 'Kan ', 'Xian ', 'Ou ', 'Shi ', 'Yang ', + 0x10 => 'Zheng ', 'Yao ', 'Shen ', 'Huo ', 'Da ', 'Zhen ', 'Kuang ', 'Ju ', 'Shen ', 'Chi ', 'Sheng ', 'Mei ', 'Mo ', 'Zhu ', 'Zhen ', 'Zhen ', + 0x20 => 'Mian ', 'Di ', 'Yuan ', 'Die ', 'Yi ', 'Zi ', 'Zi ', 'Chao ', 'Zha ', 'Xuan ', 'Bing ', 'Mi ', 'Long ', 'Sui ', 'Dong ', 'Mi ', + 0x30 => 'Die ', 'Yi ', 'Er ', 'Ming ', 'Xuan ', 'Chi ', 'Kuang ', 'Juan ', 'Mou ', 'Zhen ', 'Tiao ', 'Yang ', 'Yan ', 'Mo ', 'Zhong ', 'Mai ', + 0x40 => 'Zhao ', 'Zheng ', 'Mei ', 'Jun ', 'Shao ', 'Han ', 'Huan ', 'Di ', 'Cheng ', 'Cuo ', 'Juan ', 'E ', 'Wan ', 'Xian ', 'Xi ', 'Kun ', + 0x50 => 'Lai ', 'Jian ', 'Shan ', 'Tian ', 'Hun ', 'Wan ', 'Ling ', 'Shi ', 'Qiong ', 'Lie ', 'Yai ', 'Jing ', 'Zheng ', 'Li ', 'Lai ', 'Sui ', + 0x60 => 'Juan ', 'Shui ', 'Sui ', 'Du ', 'Bi ', 'Bi ', 'Mu ', 'Hun ', 'Ni ', 'Lu ', 'Yi ', 'Jie ', 'Cai ', 'Zhou ', 'Yu ', 'Hun ', + 0x70 => 'Ma ', 'Xia ', 'Xing ', 'Xi ', 'Gun ', 'Cai ', 'Chun ', 'Jian ', 'Mei ', 'Du ', 'Hou ', 'Xuan ', 'Ti ', 'Kui ', 'Gao ', 'Rui ', + 0x80 => 'Mou ', 'Xu ', 'Fa ', 'Wen ', 'Miao ', 'Chou ', 'Kui ', 'Mi ', 'Weng ', 'Kou ', 'Dang ', 'Chen ', 'Ke ', 'Sou ', 'Xia ', 'Qiong ', + 0x90 => 'Mao ', 'Ming ', 'Man ', 'Shui ', 'Ze ', 'Zhang ', 'Yi ', 'Diao ', 'Ou ', 'Mo ', 'Shun ', 'Cong ', 'Lou ', 'Chi ', 'Man ', 'Piao ', + 0xA0 => 'Cheng ', 'Ji ', 'Meng ', NULL, 'Run ', 'Pie ', 'Xi ', 'Qiao ', 'Pu ', 'Zhu ', 'Deng ', 'Shen ', 'Shun ', 'Liao ', 'Che ', 'Xian ', + 0xB0 => 'Kan ', 'Ye ', 'Xu ', 'Tong ', 'Mou ', 'Lin ', 'Kui ', 'Xian ', 'Ye ', 'Ai ', 'Hui ', 'Zhan ', 'Jian ', 'Gu ', 'Zhao ', 'Qu ', + 0xC0 => 'Wei ', 'Chou ', 'Sao ', 'Ning ', 'Xun ', 'Yao ', 'Huo ', 'Meng ', 'Mian ', 'Bin ', 'Mian ', 'Li ', 'Kuang ', 'Jue ', 'Xuan ', 'Mian ', + 0xD0 => 'Huo ', 'Lu ', 'Meng ', 'Long ', 'Guan ', 'Man ', 'Xi ', 'Chu ', 'Tang ', 'Kan ', 'Zhu ', 'Mao ', 'Jin ', 'Lin ', 'Yu ', 'Shuo ', + 0xE0 => 'Ce ', 'Jue ', 'Shi ', 'Yi ', 'Shen ', 'Zhi ', 'Hou ', 'Shen ', 'Ying ', 'Ju ', 'Zhou ', 'Jiao ', 'Cuo ', 'Duan ', 'Ai ', 'Jiao ', + 0xF0 => 'Zeng ', 'Huo ', 'Bai ', 'Shi ', 'Ding ', 'Qi ', 'Ji ', 'Zi ', 'Gan ', 'Wu ', 'Tuo ', 'Ku ', 'Qiang ', 'Xi ', 'Fan ', 'Kuang ', +); diff --git a/sources/resources/transliteration-data/x78.php b/sources/resources/transliteration-data/x78.php new file mode 100644 index 0000000..9c0863b --- /dev/null +++ b/sources/resources/transliteration-data/x78.php @@ -0,0 +1,20 @@ + 'Dang ', 'Ma ', 'Sha ', 'Dan ', 'Jue ', 'Li ', 'Fu ', 'Min ', 'Nuo ', 'Huo ', 'Kang ', 'Zhi ', 'Qi ', 'Kan ', 'Jie ', 'Fen ', + 0x10 => 'E ', 'Ya ', 'Pi ', 'Zhe ', 'Yan ', 'Sui ', 'Zhuan ', 'Che ', 'Dun ', 'Pan ', 'Yan ', NULL, 'Feng ', 'Fa ', 'Mo ', 'Zha ', + 0x20 => 'Qu ', 'Yu ', 'Luo ', 'Tuo ', 'Tuo ', 'Di ', 'Zhai ', 'Zhen ', 'Ai ', 'Fei ', 'Mu ', 'Zhu ', 'Li ', 'Bian ', 'Nu ', 'Ping ', + 0x30 => 'Peng ', 'Ling ', 'Pao ', 'Le ', 'Po ', 'Bo ', 'Po ', 'Shen ', 'Za ', 'Nuo ', 'Li ', 'Long ', 'Tong ', NULL, 'Li ', 'Aragane ', + 0x40 => 'Chu ', 'Keng ', 'Quan ', 'Zhu ', 'Kuang ', 'Huo ', 'E ', 'Nao ', 'Jia ', 'Lu ', 'Wei ', 'Ai ', 'Luo ', 'Ken ', 'Xing ', 'Yan ', + 0x50 => 'Tong ', 'Peng ', 'Xi ', NULL, 'Hong ', 'Shuo ', 'Xia ', 'Qiao ', NULL, 'Wei ', 'Qiao ', NULL, 'Keng ', 'Xiao ', 'Que ', 'Chan ', + 0x60 => 'Lang ', 'Hong ', 'Yu ', 'Xiao ', 'Xia ', 'Mang ', 'Long ', 'Iong ', 'Che ', 'Che ', 'E ', 'Liu ', 'Ying ', 'Mang ', 'Que ', 'Yan ', + 0x70 => 'Sha ', 'Kun ', 'Yu ', NULL, 'Kaki ', 'Lu ', 'Chen ', 'Jian ', 'Nue ', 'Song ', 'Zhuo ', 'Keng ', 'Peng ', 'Yan ', 'Zhui ', 'Kong ', + 0x80 => 'Ceng ', 'Qi ', 'Zong ', 'Qing ', 'Lin ', 'Jun ', 'Bo ', 'Ding ', 'Min ', 'Diao ', 'Jian ', 'He ', 'Lu ', 'Ai ', 'Sui ', 'Que ', + 0x90 => 'Ling ', 'Bei ', 'Yin ', 'Dui ', 'Wu ', 'Qi ', 'Lun ', 'Wan ', 'Dian ', 'Gang ', 'Pei ', 'Qi ', 'Chen ', 'Ruan ', 'Yan ', 'Die ', + 0xA0 => 'Ding ', 'Du ', 'Tuo ', 'Jie ', 'Ying ', 'Bian ', 'Ke ', 'Bi ', 'Wei ', 'Shuo ', 'Zhen ', 'Duan ', 'Xia ', 'Dang ', 'Ti ', 'Nao ', + 0xB0 => 'Peng ', 'Jian ', 'Di ', 'Tan ', 'Cha ', 'Seki ', 'Qi ', NULL, 'Feng ', 'Xuan ', 'Que ', 'Que ', 'Ma ', 'Gong ', 'Nian ', 'Su ', + 0xC0 => 'E ', 'Ci ', 'Liu ', 'Si ', 'Tang ', 'Bang ', 'Hua ', 'Pi ', 'Wei ', 'Sang ', 'Lei ', 'Cuo ', 'Zhen ', 'Xia ', 'Qi ', 'Lian ', + 0xD0 => 'Pan ', 'Wei ', 'Yun ', 'Dui ', 'Zhe ', 'Ke ', 'La ', NULL, 'Qing ', 'Gun ', 'Zhuan ', 'Chan ', 'Qi ', 'Ao ', 'Peng ', 'Lu ', + 0xE0 => 'Lu ', 'Kan ', 'Qiang ', 'Chen ', 'Yin ', 'Lei ', 'Biao ', 'Qi ', 'Mo ', 'Qi ', 'Cui ', 'Zong ', 'Qing ', 'Chuo ', NULL, 'Ji ', + 0xF0 => 'Shan ', 'Lao ', 'Qu ', 'Zeng ', 'Deng ', 'Jian ', 'Xi ', 'Lin ', 'Ding ', 'Dian ', 'Huang ', 'Pan ', 'Za ', 'Qiao ', 'Di ', 'Li ', +); diff --git a/sources/resources/transliteration-data/x79.php b/sources/resources/transliteration-data/x79.php new file mode 100644 index 0000000..6137903 --- /dev/null +++ b/sources/resources/transliteration-data/x79.php @@ -0,0 +1,20 @@ + 'Tani ', 'Jiao ', NULL, 'Zhang ', 'Qiao ', 'Dun ', 'Xian ', 'Yu ', 'Zhui ', 'He ', 'Huo ', 'Zhai ', 'Lei ', 'Ke ', 'Chu ', 'Ji ', + 0x10 => 'Que ', 'Dang ', 'Yi ', 'Jiang ', 'Pi ', 'Pi ', 'Yu ', 'Pin ', 'Qi ', 'Ai ', 'Kai ', 'Jian ', 'Yu ', 'Ruan ', 'Meng ', 'Pao ', + 0x20 => 'Ci ', NULL, NULL, 'Mie ', 'Ca ', 'Xian ', 'Kuang ', 'Lei ', 'Lei ', 'Zhi ', 'Li ', 'Li ', 'Fan ', 'Que ', 'Pao ', 'Ying ', + 0x30 => 'Li ', 'Long ', 'Long ', 'Mo ', 'Bo ', 'Shuang ', 'Guan ', 'Lan ', 'Zan ', 'Yan ', 'Shi ', 'Shi ', 'Li ', 'Reng ', 'She ', 'Yue ', + 0x40 => 'Si ', 'Qi ', 'Ta ', 'Ma ', 'Xie ', 'Xian ', 'Xian ', 'Zhi ', 'Qi ', 'Zhi ', 'Beng ', 'Dui ', 'Zhong ', NULL, 'Yi ', 'Shi ', + 0x50 => 'You ', 'Zhi ', 'Tiao ', 'Fu ', 'Fu ', 'Mi ', 'Zu ', 'Zhi ', 'Suan ', 'Mei ', 'Zuo ', 'Qu ', 'Hu ', 'Zhu ', 'Shen ', 'Sui ', + 0x60 => 'Ci ', 'Chai ', 'Mi ', 'Lu ', 'Yu ', 'Xiang ', 'Wu ', 'Tiao ', 'Piao ', 'Zhu ', 'Gui ', 'Xia ', 'Zhi ', 'Ji ', 'Gao ', 'Zhen ', + 0x70 => 'Gao ', 'Shui ', 'Jin ', 'Chen ', 'Gai ', 'Kun ', 'Di ', 'Dao ', 'Huo ', 'Tao ', 'Qi ', 'Gu ', 'Guan ', 'Zui ', 'Ling ', 'Lu ', + 0x80 => 'Bing ', 'Jin ', 'Dao ', 'Zhi ', 'Lu ', 'Shan ', 'Bei ', 'Zhe ', 'Hui ', 'You ', 'Xi ', 'Yin ', 'Zi ', 'Huo ', 'Zhen ', 'Fu ', + 0x90 => 'Yuan ', 'Wu ', 'Xian ', 'Yang ', 'Ti ', 'Yi ', 'Mei ', 'Si ', 'Di ', NULL, 'Zhuo ', 'Zhen ', 'Yong ', 'Ji ', 'Gao ', 'Tang ', + 0xA0 => 'Si ', 'Ma ', 'Ta ', NULL, 'Xuan ', 'Qi ', 'Yu ', 'Xi ', 'Ji ', 'Si ', 'Chan ', 'Tan ', 'Kuai ', 'Sui ', 'Li ', 'Nong ', + 0xB0 => 'Ni ', 'Dao ', 'Li ', 'Rang ', 'Yue ', 'Ti ', 'Zan ', 'Lei ', 'Rou ', 'Yu ', 'Yu ', 'Chi ', 'Xie ', 'Qin ', 'He ', 'Tu ', + 0xC0 => 'Xiu ', 'Si ', 'Ren ', 'Tu ', 'Zi ', 'Cha ', 'Gan ', 'Yi ', 'Xian ', 'Bing ', 'Nian ', 'Qiu ', 'Qiu ', 'Chong ', 'Fen ', 'Hao ', + 0xD0 => 'Yun ', 'Ke ', 'Miao ', 'Zhi ', 'Geng ', 'Bi ', 'Zhi ', 'Yu ', 'Mi ', 'Ku ', 'Ban ', 'Pi ', 'Ni ', 'Li ', 'You ', 'Zu ', + 0xE0 => 'Pi ', 'Ba ', 'Ling ', 'Mo ', 'Cheng ', 'Nian ', 'Qin ', 'Yang ', 'Zuo ', 'Zhi ', 'Zhi ', 'Shu ', 'Ju ', 'Zi ', 'Huo ', 'Ji ', + 0xF0 => 'Cheng ', 'Tong ', 'Zhi ', 'Huo ', 'He ', 'Yin ', 'Zi ', 'Zhi ', 'Jie ', 'Ren ', 'Du ', 'Yi ', 'Zhu ', 'Hui ', 'Nong ', 'Fu ', +); diff --git a/sources/resources/transliteration-data/x7a.php b/sources/resources/transliteration-data/x7a.php new file mode 100644 index 0000000..4c14735 --- /dev/null +++ b/sources/resources/transliteration-data/x7a.php @@ -0,0 +1,20 @@ + 'Xi ', 'Kao ', 'Lang ', 'Fu ', 'Ze ', 'Shui ', 'Lu ', 'Kun ', 'Gan ', 'Geng ', 'Ti ', 'Cheng ', 'Tu ', 'Shao ', 'Shui ', 'Ya ', + 0x10 => 'Lun ', 'Lu ', 'Gu ', 'Zuo ', 'Ren ', 'Zhun ', 'Bang ', 'Bai ', 'Ji ', 'Zhi ', 'Zhi ', 'Kun ', 'Leng ', 'Peng ', 'Ke ', 'Bing ', + 0x20 => 'Chou ', 'Zu ', 'Yu ', 'Su ', 'Lue ', NULL, 'Yi ', 'Xi ', 'Bian ', 'Ji ', 'Fu ', 'Bi ', 'Nuo ', 'Jie ', 'Zhong ', 'Zong ', + 0x30 => 'Xu ', 'Cheng ', 'Dao ', 'Wen ', 'Lian ', 'Zi ', 'Yu ', 'Ji ', 'Xu ', 'Zhen ', 'Zhi ', 'Dao ', 'Jia ', 'Ji ', 'Gao ', 'Gao ', + 0x40 => 'Gu ', 'Rong ', 'Sui ', 'You ', 'Ji ', 'Kang ', 'Mu ', 'Shan ', 'Men ', 'Zhi ', 'Ji ', 'Lu ', 'Su ', 'Ji ', 'Ying ', 'Wen ', + 0x50 => 'Qiu ', 'Se ', NULL, 'Yi ', 'Huang ', 'Qie ', 'Ji ', 'Sui ', 'Xiao ', 'Pu ', 'Jiao ', 'Zhuo ', 'Tong ', 'Sai ', 'Lu ', 'Sui ', + 0x60 => 'Nong ', 'Se ', 'Hui ', 'Rang ', 'Nuo ', 'Yu ', 'Bin ', 'Ji ', 'Tui ', 'Wen ', 'Cheng ', 'Huo ', 'Gong ', 'Lu ', 'Biao ', NULL, + 0x70 => 'Rang ', 'Zhuo ', 'Li ', 'Zan ', 'Xue ', 'Wa ', 'Jiu ', 'Qiong ', 'Xi ', 'Qiong ', 'Kong ', 'Yu ', 'Sen ', 'Jing ', 'Yao ', 'Chuan ', + 0x80 => 'Zhun ', 'Tu ', 'Lao ', 'Qie ', 'Zhai ', 'Yao ', 'Bian ', 'Bao ', 'Yao ', 'Bing ', 'Wa ', 'Zhu ', 'Jiao ', 'Qiao ', 'Diao ', 'Wu ', + 0x90 => 'Gui ', 'Yao ', 'Zhi ', 'Chuang ', 'Yao ', 'Tiao ', 'Jiao ', 'Chuang ', 'Jiong ', 'Xiao ', 'Cheng ', 'Kou ', 'Cuan ', 'Wo ', 'Dan ', 'Ku ', + 0xA0 => 'Ke ', 'Zhui ', 'Xu ', 'Su ', 'Guan ', 'Kui ', 'Dou ', NULL, 'Yin ', 'Wo ', 'Wa ', 'Ya ', 'Yu ', 'Ju ', 'Qiong ', 'Yao ', + 0xB0 => 'Yao ', 'Tiao ', 'Chao ', 'Yu ', 'Tian ', 'Diao ', 'Ju ', 'Liao ', 'Xi ', 'Wu ', 'Kui ', 'Chuang ', 'Zhao ', NULL, 'Kuan ', 'Long ', + 0xC0 => 'Cheng ', 'Cui ', 'Piao ', 'Zao ', 'Cuan ', 'Qiao ', 'Qiong ', 'Dou ', 'Zao ', 'Long ', 'Qie ', 'Li ', 'Chu ', 'Shi ', 'Fou ', 'Qian ', + 0xD0 => 'Chu ', 'Hong ', 'Qi ', 'Qian ', 'Gong ', 'Shi ', 'Shu ', 'Miao ', 'Ju ', 'Zhan ', 'Zhu ', 'Ling ', 'Long ', 'Bing ', 'Jing ', 'Jing ', + 0xE0 => 'Zhang ', 'Yi ', 'Si ', 'Jun ', 'Hong ', 'Tong ', 'Song ', 'Jing ', 'Diao ', 'Yi ', 'Shu ', 'Jing ', 'Qu ', 'Jie ', 'Ping ', 'Duan ', + 0xF0 => 'Shao ', 'Zhuan ', 'Ceng ', 'Deng ', 'Cui ', 'Huai ', 'Jing ', 'Kan ', 'Jing ', 'Zhu ', 'Zhu ', 'Le ', 'Peng ', 'Yu ', 'Chi ', 'Gan ', +); diff --git a/sources/resources/transliteration-data/x7b.php b/sources/resources/transliteration-data/x7b.php new file mode 100644 index 0000000..ca8949b --- /dev/null +++ b/sources/resources/transliteration-data/x7b.php @@ -0,0 +1,20 @@ + 'Mang ', 'Zhu ', 'Utsubo ', 'Du ', 'Ji ', 'Xiao ', 'Ba ', 'Suan ', 'Ji ', 'Zhen ', 'Zhao ', 'Sun ', 'Ya ', 'Zhui ', 'Yuan ', 'Hu ', + 0x10 => 'Gang ', 'Xiao ', 'Cen ', 'Pi ', 'Bi ', 'Jian ', 'Yi ', 'Dong ', 'Shan ', 'Sheng ', 'Xia ', 'Di ', 'Zhu ', 'Na ', 'Chi ', 'Gu ', + 0x20 => 'Li ', 'Qie ', 'Min ', 'Bao ', 'Tiao ', 'Si ', 'Fu ', 'Ce ', 'Ben ', 'Pei ', 'Da ', 'Zi ', 'Di ', 'Ling ', 'Ze ', 'Nu ', + 0x30 => 'Fu ', 'Gou ', 'Fan ', 'Jia ', 'Ge ', 'Fan ', 'Shi ', 'Mao ', 'Po ', 'Sey ', 'Jian ', 'Qiong ', 'Long ', 'Souke ', 'Bian ', 'Luo ', + 0x40 => 'Gui ', 'Qu ', 'Chi ', 'Yin ', 'Yao ', 'Xian ', 'Bi ', 'Qiong ', 'Gua ', 'Deng ', 'Jiao ', 'Jin ', 'Quan ', 'Sun ', 'Ru ', 'Fa ', + 0x50 => 'Kuang ', 'Zhu ', 'Tong ', 'Ji ', 'Da ', 'Xing ', 'Ce ', 'Zhong ', 'Kou ', 'Lai ', 'Bi ', 'Shai ', 'Dang ', 'Zheng ', 'Ce ', 'Fu ', + 0x60 => 'Yun ', 'Tu ', 'Pa ', 'Li ', 'Lang ', 'Ju ', 'Guan ', 'Jian ', 'Han ', 'Tong ', 'Xia ', 'Zhi ', 'Cheng ', 'Suan ', 'Shi ', 'Zhu ', + 0x70 => 'Zuo ', 'Xiao ', 'Shao ', 'Ting ', 'Ce ', 'Yan ', 'Gao ', 'Kuai ', 'Gan ', 'Chou ', 'Kago ', 'Gang ', 'Yun ', 'O ', 'Qian ', 'Xiao ', + 0x80 => 'Jian ', 'Pu ', 'Lai ', 'Zou ', 'Bi ', 'Bi ', 'Bi ', 'Ge ', 'Chi ', 'Guai ', 'Yu ', 'Jian ', 'Zhao ', 'Gu ', 'Chi ', 'Zheng ', + 0x90 => 'Jing ', 'Sha ', 'Zhou ', 'Lu ', 'Bo ', 'Ji ', 'Lin ', 'Suan ', 'Jun ', 'Fu ', 'Zha ', 'Gu ', 'Kong ', 'Qian ', 'Quan ', 'Jun ', + 0xA0 => 'Chui ', 'Guan ', 'Yuan ', 'Ce ', 'Ju ', 'Bo ', 'Ze ', 'Qie ', 'Tuo ', 'Luo ', 'Dan ', 'Xiao ', 'Ruo ', 'Jian ', 'Xuan ', 'Bian ', + 0xB0 => 'Sun ', 'Xiang ', 'Xian ', 'Ping ', 'Zhen ', 'Sheng ', 'Hu ', 'Shi ', 'Zhu ', 'Yue ', 'Chun ', 'Lu ', 'Wu ', 'Dong ', 'Xiao ', 'Ji ', + 0xC0 => 'Jie ', 'Huang ', 'Xing ', 'Mei ', 'Fan ', 'Chui ', 'Zhuan ', 'Pian ', 'Feng ', 'Zhu ', 'Hong ', 'Qie ', 'Hou ', 'Qiu ', 'Miao ', 'Qian ', + 0xD0 => NULL, 'Kui ', 'Sik ', 'Lou ', 'Yun ', 'He ', 'Tang ', 'Yue ', 'Chou ', 'Gao ', 'Fei ', 'Ruo ', 'Zheng ', 'Gou ', 'Nie ', 'Qian ', + 0xE0 => 'Xiao ', 'Cuan ', 'Gong ', 'Pang ', 'Du ', 'Li ', 'Bi ', 'Zhuo ', 'Chu ', 'Shai ', 'Chi ', 'Zhu ', 'Qiang ', 'Long ', 'Lan ', 'Jian ', + 0xF0 => 'Bu ', 'Li ', 'Hui ', 'Bi ', 'Di ', 'Cong ', 'Yan ', 'Peng ', 'Sen ', 'Zhuan ', 'Pai ', 'Piao ', 'Dou ', 'Yu ', 'Mie ', 'Zhuan ', +); diff --git a/sources/resources/transliteration-data/x7c.php b/sources/resources/transliteration-data/x7c.php new file mode 100644 index 0000000..7b209c2 --- /dev/null +++ b/sources/resources/transliteration-data/x7c.php @@ -0,0 +1,20 @@ + 'Ze ', 'Xi ', 'Guo ', 'Yi ', 'Hu ', 'Chan ', 'Kou ', 'Cu ', 'Ping ', 'Chou ', 'Ji ', 'Gui ', 'Su ', 'Lou ', 'Zha ', 'Lu ', + 0x10 => 'Nian ', 'Suo ', 'Cuan ', 'Sasara ', 'Suo ', 'Le ', 'Duan ', 'Yana ', 'Xiao ', 'Bo ', 'Mi ', 'Si ', 'Dang ', 'Liao ', 'Dan ', 'Dian ', + 0x20 => 'Fu ', 'Jian ', 'Min ', 'Kui ', 'Dai ', 'Qiao ', 'Deng ', 'Huang ', 'Sun ', 'Lao ', 'Zan ', 'Xiao ', 'Du ', 'Shi ', 'Zan ', NULL, + 0x30 => 'Pai ', 'Hata ', 'Pai ', 'Gan ', 'Ju ', 'Du ', 'Lu ', 'Yan ', 'Bo ', 'Dang ', 'Sai ', 'Ke ', 'Long ', 'Qian ', 'Lian ', 'Bo ', + 0x40 => 'Zhou ', 'Lai ', NULL, 'Lan ', 'Kui ', 'Yu ', 'Yue ', 'Hao ', 'Zhen ', 'Tai ', 'Ti ', 'Mi ', 'Chou ', 'Ji ', NULL, 'Hata ', + 0x50 => 'Teng ', 'Zhuan ', 'Zhou ', 'Fan ', 'Sou ', 'Zhou ', 'Kuji ', 'Zhuo ', 'Teng ', 'Lu ', 'Lu ', 'Jian ', 'Tuo ', 'Ying ', 'Yu ', 'Lai ', + 0x60 => 'Long ', 'Shinshi ', 'Lian ', 'Lan ', 'Qian ', 'Yue ', 'Zhong ', 'Qu ', 'Lian ', 'Bian ', 'Duan ', 'Zuan ', 'Li ', 'Si ', 'Luo ', 'Ying ', + 0x70 => 'Yue ', 'Zhuo ', 'Xu ', 'Mi ', 'Di ', 'Fan ', 'Shen ', 'Zhe ', 'Shen ', 'Nu ', 'Xie ', 'Lei ', 'Xian ', 'Zi ', 'Ni ', 'Cun ', + 0x80 => NULL, 'Qian ', 'Kume ', 'Bi ', 'Ban ', 'Wu ', 'Sha ', 'Kang ', 'Rou ', 'Fen ', 'Bi ', 'Cui ', NULL, 'Li ', 'Chi ', 'Nukamiso ', + 0x90 => 'Ro ', 'Ba ', 'Li ', 'Gan ', 'Ju ', 'Po ', 'Mo ', 'Cu ', 'Nian ', 'Zhou ', 'Li ', 'Su ', 'Tiao ', 'Li ', 'Qi ', 'Su ', + 0xA0 => 'Hong ', 'Tong ', 'Zi ', 'Ce ', 'Yue ', 'Zhou ', 'Lin ', 'Zhuang ', 'Bai ', NULL, 'Fen ', 'Ji ', NULL, 'Sukumo ', 'Liang ', 'Xian ', + 0xB0 => 'Fu ', 'Liang ', 'Can ', 'Geng ', 'Li ', 'Yue ', 'Lu ', 'Ju ', 'Qi ', 'Cui ', 'Bai ', 'Zhang ', 'Lin ', 'Zong ', 'Jing ', 'Guo ', + 0xC0 => 'Kouji ', 'San ', 'San ', 'Tang ', 'Bian ', 'Rou ', 'Mian ', 'Hou ', 'Xu ', 'Zong ', 'Hu ', 'Jian ', 'Zan ', 'Ci ', 'Li ', 'Xie ', + 0xD0 => 'Fu ', 'Ni ', 'Bei ', 'Gu ', 'Xiu ', 'Gao ', 'Tang ', 'Qiu ', 'Sukumo ', 'Cao ', 'Zhuang ', 'Tang ', 'Mi ', 'San ', 'Fen ', 'Zao ', + 0xE0 => 'Kang ', 'Jiang ', 'Mo ', 'San ', 'San ', 'Nuo ', 'Xi ', 'Liang ', 'Jiang ', 'Kuai ', 'Bo ', 'Huan ', NULL, 'Zong ', 'Xian ', 'Nuo ', + 0xF0 => 'Tuan ', 'Nie ', 'Li ', 'Zuo ', 'Di ', 'Nie ', 'Tiao ', 'Lan ', 'Mi ', 'Jiao ', 'Jiu ', 'Xi ', 'Gong ', 'Zheng ', 'Jiu ', 'You ', +); diff --git a/sources/resources/transliteration-data/x7d.php b/sources/resources/transliteration-data/x7d.php new file mode 100644 index 0000000..53ef076 --- /dev/null +++ b/sources/resources/transliteration-data/x7d.php @@ -0,0 +1,20 @@ + 'Ji ', 'Cha ', 'Zhou ', 'Xun ', 'Yue ', 'Hong ', 'Yu ', 'He ', 'Wan ', 'Ren ', 'Wen ', 'Wen ', 'Qiu ', 'Na ', 'Zi ', 'Tou ', + 0x10 => 'Niu ', 'Fou ', 'Jie ', 'Shu ', 'Chun ', 'Pi ', 'Yin ', 'Sha ', 'Hong ', 'Zhi ', 'Ji ', 'Fen ', 'Yun ', 'Ren ', 'Dan ', 'Jin ', + 0x20 => 'Su ', 'Fang ', 'Suo ', 'Cui ', 'Jiu ', 'Zha ', 'Kinu ', 'Jin ', 'Fu ', 'Zhi ', 'Ci ', 'Zi ', 'Chou ', 'Hong ', 'Zha ', 'Lei ', + 0x30 => 'Xi ', 'Fu ', 'Xie ', 'Shen ', 'Bei ', 'Zhu ', 'Qu ', 'Ling ', 'Zhu ', 'Shao ', 'Gan ', 'Yang ', 'Fu ', 'Tuo ', 'Zhen ', 'Dai ', + 0x40 => 'Zhuo ', 'Shi ', 'Zhong ', 'Xian ', 'Zu ', 'Jiong ', 'Ban ', 'Ju ', 'Mo ', 'Shu ', 'Zui ', 'Wata ', 'Jing ', 'Ren ', 'Heng ', 'Xie ', + 0x50 => 'Jie ', 'Zhu ', 'Chou ', 'Gua ', 'Bai ', 'Jue ', 'Kuang ', 'Hu ', 'Ci ', 'Geng ', 'Geng ', 'Tao ', 'Xie ', 'Ku ', 'Jiao ', 'Quan ', + 0x60 => 'Gai ', 'Luo ', 'Xuan ', 'Bing ', 'Xian ', 'Fu ', 'Gei ', 'Tong ', 'Rong ', 'Tiao ', 'Yin ', 'Lei ', 'Xie ', 'Quan ', 'Xu ', 'Lun ', + 0x70 => 'Die ', 'Tong ', 'Si ', 'Jiang ', 'Xiang ', 'Hui ', 'Jue ', 'Zhi ', 'Jian ', 'Juan ', 'Chi ', 'Mian ', 'Zhen ', 'Lu ', 'Cheng ', 'Qiu ', + 0x80 => 'Shu ', 'Bang ', 'Tong ', 'Xiao ', 'Wan ', 'Qin ', 'Geng ', 'Xiu ', 'Ti ', 'Xiu ', 'Xie ', 'Hong ', 'Xi ', 'Fu ', 'Ting ', 'Sui ', + 0x90 => 'Dui ', 'Kun ', 'Fu ', 'Jing ', 'Hu ', 'Zhi ', 'Yan ', 'Jiong ', 'Feng ', 'Ji ', 'Sok ', 'Kase ', 'Zong ', 'Lin ', 'Duo ', 'Li ', + 0xA0 => 'Lu ', 'Liang ', 'Chou ', 'Quan ', 'Shao ', 'Qi ', 'Qi ', 'Zhun ', 'Qi ', 'Wan ', 'Qian ', 'Xian ', 'Shou ', 'Wei ', 'Qi ', 'Tao ', + 0xB0 => 'Wan ', 'Gang ', 'Wang ', 'Beng ', 'Zhui ', 'Cai ', 'Guo ', 'Cui ', 'Lun ', 'Liu ', 'Qi ', 'Zhan ', 'Bei ', 'Chuo ', 'Ling ', 'Mian ', + 0xC0 => 'Qi ', 'Qie ', 'Tan ', 'Zong ', 'Gun ', 'Zou ', 'Yi ', 'Zi ', 'Xing ', 'Liang ', 'Jin ', 'Fei ', 'Rui ', 'Min ', 'Yu ', 'Zong ', + 0xD0 => 'Fan ', 'Lu ', 'Xu ', 'Yingl ', 'Zhang ', 'Kasuri ', 'Xu ', 'Xiang ', 'Jian ', 'Ke ', 'Xian ', 'Ruan ', 'Mian ', 'Qi ', 'Duan ', 'Zhong ', + 0xE0 => 'Di ', 'Min ', 'Miao ', 'Yuan ', 'Xie ', 'Bao ', 'Si ', 'Qiu ', 'Bian ', 'Huan ', 'Geng ', 'Cong ', 'Mian ', 'Wei ', 'Fu ', 'Wei ', + 0xF0 => 'Yu ', 'Gou ', 'Miao ', 'Xie ', 'Lian ', 'Zong ', 'Bian ', 'Yun ', 'Yin ', 'Ti ', 'Gua ', 'Zhi ', 'Yun ', 'Cheng ', 'Chan ', 'Dai ', +); diff --git a/sources/resources/transliteration-data/x7e.php b/sources/resources/transliteration-data/x7e.php new file mode 100644 index 0000000..42dc578 --- /dev/null +++ b/sources/resources/transliteration-data/x7e.php @@ -0,0 +1,20 @@ + 'Xia ', 'Yuan ', 'Zong ', 'Xu ', 'Nawa ', 'Odoshi ', 'Geng ', 'Sen ', 'Ying ', 'Jin ', 'Yi ', 'Zhui ', 'Ni ', 'Bang ', 'Gu ', 'Pan ', + 0x10 => 'Zhou ', 'Jian ', 'Cuo ', 'Quan ', 'Shuang ', 'Yun ', 'Xia ', 'Shuai ', 'Xi ', 'Rong ', 'Tao ', 'Fu ', 'Yun ', 'Zhen ', 'Gao ', 'Ru ', + 0x20 => 'Hu ', 'Zai ', 'Teng ', 'Xian ', 'Su ', 'Zhen ', 'Zong ', 'Tao ', 'Horo ', 'Cai ', 'Bi ', 'Feng ', 'Cu ', 'Li ', 'Suo ', 'Yin ', + 0x30 => 'Xi ', 'Zong ', 'Lei ', 'Zhuan ', 'Qian ', 'Man ', 'Zhi ', 'Lu ', 'Mo ', 'Piao ', 'Lian ', 'Mi ', 'Xuan ', 'Zong ', 'Ji ', 'Shan ', + 0x40 => 'Sui ', 'Fan ', 'Shuai ', 'Beng ', 'Yi ', 'Sao ', 'Mou ', 'Zhou ', 'Qiang ', 'Hun ', 'Sem ', 'Xi ', 'Jung ', 'Xiu ', 'Ran ', 'Xuan ', + 0x50 => 'Hui ', 'Qiao ', 'Zeng ', 'Zuo ', 'Zhi ', 'Shan ', 'San ', 'Lin ', 'Yu ', 'Fan ', 'Liao ', 'Chuo ', 'Zun ', 'Jian ', 'Rao ', 'Chan ', + 0x60 => 'Rui ', 'Xiu ', 'Hui ', 'Hua ', 'Zuan ', 'Xi ', 'Qiang ', 'Un ', 'Da ', 'Sheng ', 'Hui ', 'Xi ', 'Se ', 'Jian ', 'Jiang ', 'Huan ', + 0x70 => 'Zao ', 'Cong ', 'Jie ', 'Jiao ', 'Bo ', 'Chan ', 'Yi ', 'Nao ', 'Sui ', 'Yi ', 'Shai ', 'Xu ', 'Ji ', 'Bin ', 'Qian ', 'Lan ', + 0x80 => 'Pu ', 'Xun ', 'Zuan ', 'Qi ', 'Peng ', 'Li ', 'Mo ', 'Lei ', 'Xie ', 'Zuan ', 'Kuang ', 'You ', 'Xu ', 'Lei ', 'Xian ', 'Chan ', + 0x90 => 'Kou ', 'Lu ', 'Chan ', 'Ying ', 'Cai ', 'Xiang ', 'Xian ', 'Zui ', 'Zuan ', 'Luo ', 'Xi ', 'Dao ', 'Lan ', 'Lei ', 'Lian ', 'Si ', + 0xA0 => 'Jiu ', 'Yu ', 'Hong ', 'Zhou ', 'Xian ', 'He ', 'Yue ', 'Ji ', 'Wan ', 'Kuang ', 'Ji ', 'Ren ', 'Wei ', 'Yun ', 'Hong ', 'Chun ', + 0xB0 => 'Pi ', 'Sha ', 'Gang ', 'Na ', 'Ren ', 'Zong ', 'Lun ', 'Fen ', 'Zhi ', 'Wen ', 'Fang ', 'Zhu ', 'Yin ', 'Niu ', 'Shu ', 'Xian ', + 0xC0 => 'Gan ', 'Xie ', 'Fu ', 'Lian ', 'Zu ', 'Shen ', 'Xi ', 'Zhi ', 'Zhong ', 'Zhou ', 'Ban ', 'Fu ', 'Zhuo ', 'Shao ', 'Yi ', 'Jing ', + 0xD0 => 'Dai ', 'Bang ', 'Rong ', 'Jie ', 'Ku ', 'Rao ', 'Die ', 'Heng ', 'Hui ', 'Gei ', 'Xuan ', 'Jiang ', 'Luo ', 'Jue ', 'Jiao ', 'Tong ', + 0xE0 => 'Geng ', 'Xiao ', 'Juan ', 'Xiu ', 'Xi ', 'Sui ', 'Tao ', 'Ji ', 'Ti ', 'Ji ', 'Xu ', 'Ling ', NULL, 'Xu ', 'Qi ', 'Fei ', + 0xF0 => 'Chuo ', 'Zhang ', 'Gun ', 'Sheng ', 'Wei ', 'Mian ', 'Shou ', 'Beng ', 'Chou ', 'Tao ', 'Liu ', 'Quan ', 'Zong ', 'Zhan ', 'Wan ', 'Lu ', +); diff --git a/sources/resources/transliteration-data/x7f.php b/sources/resources/transliteration-data/x7f.php new file mode 100644 index 0000000..bdb04f8 --- /dev/null +++ b/sources/resources/transliteration-data/x7f.php @@ -0,0 +1,20 @@ + 'Zhui ', 'Zi ', 'Ke ', 'Xiang ', 'Jian ', 'Mian ', 'Lan ', 'Ti ', 'Miao ', 'Qi ', 'Yun ', 'Hui ', 'Si ', 'Duo ', 'Duan ', 'Bian ', + 0x10 => 'Xian ', 'Gou ', 'Zhui ', 'Huan ', 'Di ', 'Lu ', 'Bian ', 'Min ', 'Yuan ', 'Jin ', 'Fu ', 'Ru ', 'Zhen ', 'Feng ', 'Shuai ', 'Gao ', + 0x20 => 'Chan ', 'Li ', 'Yi ', 'Jian ', 'Bin ', 'Piao ', 'Man ', 'Lei ', 'Ying ', 'Suo ', 'Mou ', 'Sao ', 'Xie ', 'Liao ', 'Shan ', 'Zeng ', + 0x30 => 'Jiang ', 'Qian ', 'Zao ', 'Huan ', 'Jiao ', 'Zuan ', 'Fou ', 'Xie ', 'Gang ', 'Fou ', 'Que ', 'Fou ', 'Kaakeru ', 'Bo ', 'Ping ', 'Hou ', + 0x40 => NULL, 'Gang ', 'Ying ', 'Ying ', 'Qing ', 'Xia ', 'Guan ', 'Zun ', 'Tan ', 'Chang ', 'Qi ', 'Weng ', 'Ying ', 'Lei ', 'Tan ', 'Lu ', + 0x50 => 'Guan ', 'Wang ', 'Wang ', 'Gang ', 'Wang ', 'Han ', NULL, 'Luo ', 'Fu ', 'Mi ', 'Fa ', 'Gu ', 'Zhu ', 'Ju ', 'Mao ', 'Gu ', + 0x60 => 'Min ', 'Gang ', 'Ba ', 'Gua ', 'Ti ', 'Juan ', 'Fu ', 'Lin ', 'Yan ', 'Zhao ', 'Zui ', 'Gua ', 'Zhuo ', 'Yu ', 'Zhi ', 'An ', + 0x70 => 'Fa ', 'Nan ', 'Shu ', 'Si ', 'Pi ', 'Ma ', 'Liu ', 'Ba ', 'Fa ', 'Li ', 'Chao ', 'Wei ', 'Bi ', 'Ji ', 'Zeng ', 'Tong ', + 0x80 => 'Liu ', 'Ji ', 'Juan ', 'Mi ', 'Zhao ', 'Luo ', 'Pi ', 'Ji ', 'Ji ', 'Luan ', 'Yang ', 'Mie ', 'Qiang ', 'Ta ', 'Mei ', 'Yang ', + 0x90 => 'You ', 'You ', 'Fen ', 'Ba ', 'Gao ', 'Yang ', 'Gu ', 'Qiang ', 'Zang ', 'Gao ', 'Ling ', 'Yi ', 'Zhu ', 'Di ', 'Xiu ', 'Qian ', + 0xA0 => 'Yi ', 'Xian ', 'Rong ', 'Qun ', 'Qun ', 'Qian ', 'Huan ', 'Zui ', 'Xian ', 'Yi ', 'Yashinau ', 'Qiang ', 'Xian ', 'Yu ', 'Geng ', 'Jie ', + 0xB0 => 'Tang ', 'Yuan ', 'Xi ', 'Fan ', 'Shan ', 'Fen ', 'Shan ', 'Lian ', 'Lei ', 'Geng ', 'Nou ', 'Qiang ', 'Chan ', 'Yu ', 'Gong ', 'Yi ', + 0xC0 => 'Chong ', 'Weng ', 'Fen ', 'Hong ', 'Chi ', 'Chi ', 'Cui ', 'Fu ', 'Xia ', 'Pen ', 'Yi ', 'La ', 'Yi ', 'Pi ', 'Ling ', 'Liu ', + 0xD0 => 'Zhi ', 'Qu ', 'Xi ', 'Xie ', 'Xiang ', 'Xi ', 'Xi ', 'Qi ', 'Qiao ', 'Hui ', 'Hui ', 'Xiao ', 'Se ', 'Hong ', 'Jiang ', 'Di ', + 0xE0 => 'Cui ', 'Fei ', 'Tao ', 'Sha ', 'Chi ', 'Zhu ', 'Jian ', 'Xuan ', 'Shi ', 'Pian ', 'Zong ', 'Wan ', 'Hui ', 'Hou ', 'He ', 'He ', + 0xF0 => 'Han ', 'Ao ', 'Piao ', 'Yi ', 'Lian ', 'Qu ', NULL, 'Lin ', 'Pen ', 'Qiao ', 'Ao ', 'Fan ', 'Yi ', 'Hui ', 'Xuan ', 'Dao ', +); diff --git a/sources/resources/transliteration-data/x80.php b/sources/resources/transliteration-data/x80.php new file mode 100644 index 0000000..5708de6 --- /dev/null +++ b/sources/resources/transliteration-data/x80.php @@ -0,0 +1,20 @@ + 'Yao ', 'Lao ', NULL, 'Kao ', 'Mao ', 'Zhe ', 'Qi ', 'Gou ', 'Gou ', 'Gou ', 'Die ', 'Die ', 'Er ', 'Shua ', 'Ruan ', 'Er ', + 0x10 => 'Nai ', 'Zhuan ', 'Lei ', 'Ting ', 'Zi ', 'Geng ', 'Chao ', 'Hao ', 'Yun ', 'Pa ', 'Pi ', 'Chi ', 'Si ', 'Chu ', 'Jia ', 'Ju ', + 0x20 => 'He ', 'Chu ', 'Lao ', 'Lun ', 'Ji ', 'Tang ', 'Ou ', 'Lou ', 'Nou ', 'Gou ', 'Pang ', 'Ze ', 'Lou ', 'Ji ', 'Lao ', 'Huo ', + 0x30 => 'You ', 'Mo ', 'Huai ', 'Er ', 'Zhe ', 'Ting ', 'Ye ', 'Da ', 'Song ', 'Qin ', 'Yun ', 'Chi ', 'Dan ', 'Dan ', 'Hong ', 'Geng ', + 0x40 => 'Zhi ', NULL, 'Nie ', 'Dan ', 'Zhen ', 'Che ', 'Ling ', 'Zheng ', 'You ', 'Wa ', 'Liao ', 'Long ', 'Zhi ', 'Ning ', 'Tiao ', 'Er ', + 0x50 => 'Ya ', 'Die ', 'Gua ', NULL, 'Lian ', 'Hao ', 'Sheng ', 'Lie ', 'Pin ', 'Jing ', 'Ju ', 'Bi ', 'Di ', 'Guo ', 'Wen ', 'Xu ', + 0x60 => 'Ping ', 'Cong ', 'Shikato ', NULL, 'Ting ', 'Yu ', 'Cong ', 'Kui ', 'Tsuraneru ', 'Kui ', 'Cong ', 'Lian ', 'Weng ', 'Kui ', 'Lian ', 'Lian ', + 0x70 => 'Cong ', 'Ao ', 'Sheng ', 'Song ', 'Ting ', 'Kui ', 'Nie ', 'Zhi ', 'Dan ', 'Ning ', 'Qie ', 'Ji ', 'Ting ', 'Ting ', 'Long ', 'Yu ', + 0x80 => 'Yu ', 'Zhao ', 'Si ', 'Su ', 'Yi ', 'Su ', 'Si ', 'Zhao ', 'Zhao ', 'Rou ', 'Yi ', 'Le ', 'Ji ', 'Qiu ', 'Ken ', 'Cao ', + 0x90 => 'Ge ', 'Di ', 'Huan ', 'Huang ', 'Yi ', 'Ren ', 'Xiao ', 'Ru ', 'Zhou ', 'Yuan ', 'Du ', 'Gang ', 'Rong ', 'Gan ', 'Cha ', 'Wo ', + 0xA0 => 'Chang ', 'Gu ', 'Zhi ', 'Han ', 'Fu ', 'Fei ', 'Fen ', 'Pei ', 'Pang ', 'Jian ', 'Fang ', 'Zhun ', 'You ', 'Na ', 'Hang ', 'Ken ', + 0xB0 => 'Ran ', 'Gong ', 'Yu ', 'Wen ', 'Yao ', 'Jin ', 'Pi ', 'Qian ', 'Xi ', 'Xi ', 'Fei ', 'Ken ', 'Jing ', 'Tai ', 'Shen ', 'Zhong ', + 0xC0 => 'Zhang ', 'Xie ', 'Shen ', 'Wei ', 'Zhou ', 'Die ', 'Dan ', 'Fei ', 'Ba ', 'Bo ', 'Qu ', 'Tian ', 'Bei ', 'Gua ', 'Tai ', 'Zi ', + 0xD0 => 'Ku ', 'Zhi ', 'Ni ', 'Ping ', 'Zi ', 'Fu ', 'Pang ', 'Zhen ', 'Xian ', 'Zuo ', 'Pei ', 'Jia ', 'Sheng ', 'Zhi ', 'Bao ', 'Mu ', + 0xE0 => 'Qu ', 'Hu ', 'Ke ', 'Yi ', 'Yin ', 'Xu ', 'Yang ', 'Long ', 'Dong ', 'Ka ', 'Lu ', 'Jing ', 'Nu ', 'Yan ', 'Pang ', 'Kua ', + 0xF0 => 'Yi ', 'Guang ', 'Gai ', 'Ge ', 'Dong ', 'Zhi ', 'Xiao ', 'Xiong ', 'Xiong ', 'Er ', 'E ', 'Xing ', 'Pian ', 'Neng ', 'Zi ', 'Gui ', +); diff --git a/sources/resources/transliteration-data/x81.php b/sources/resources/transliteration-data/x81.php new file mode 100644 index 0000000..6a19fed --- /dev/null +++ b/sources/resources/transliteration-data/x81.php @@ -0,0 +1,20 @@ + 'Cheng ', 'Tiao ', 'Zhi ', 'Cui ', 'Mei ', 'Xie ', 'Cui ', 'Xie ', 'Mo ', 'Mai ', 'Ji ', 'Obiyaakasu ', NULL, 'Kuai ', 'Sa ', 'Zang ', + 0x10 => 'Qi ', 'Nao ', 'Mi ', 'Nong ', 'Luan ', 'Wan ', 'Bo ', 'Wen ', 'Guan ', 'Qiu ', 'Jiao ', 'Jing ', 'Rou ', 'Heng ', 'Cuo ', 'Lie ', + 0x20 => 'Shan ', 'Ting ', 'Mei ', 'Chun ', 'Shen ', 'Xie ', 'De ', 'Zui ', 'Cu ', 'Xiu ', 'Xin ', 'Tuo ', 'Pao ', 'Cheng ', 'Nei ', 'Fu ', + 0x30 => 'Dou ', 'Tuo ', 'Niao ', 'Noy ', 'Pi ', 'Gu ', 'Gua ', 'Li ', 'Lian ', 'Zhang ', 'Cui ', 'Jie ', 'Liang ', 'Zhou ', 'Pi ', 'Biao ', + 0x40 => 'Lun ', 'Pian ', 'Guo ', 'Kui ', 'Chui ', 'Dan ', 'Tian ', 'Nei ', 'Jing ', 'Jie ', 'La ', 'Yi ', 'An ', 'Ren ', 'Shen ', 'Chuo ', + 0x50 => 'Fu ', 'Fu ', 'Ju ', 'Fei ', 'Qiang ', 'Wan ', 'Dong ', 'Pi ', 'Guo ', 'Zong ', 'Ding ', 'Wu ', 'Mei ', 'Ruan ', 'Zhuan ', 'Zhi ', + 0x60 => 'Cou ', 'Gua ', 'Ou ', 'Di ', 'An ', 'Xing ', 'Nao ', 'Yu ', 'Chuan ', 'Nan ', 'Yun ', 'Zhong ', 'Rou ', 'E ', 'Sai ', 'Tu ', + 0x70 => 'Yao ', 'Jian ', 'Wei ', 'Jiao ', 'Yu ', 'Jia ', 'Duan ', 'Bi ', 'Chang ', 'Fu ', 'Xian ', 'Ni ', 'Mian ', 'Wa ', 'Teng ', 'Tui ', + 0x80 => 'Bang ', 'Qian ', 'Lu ', 'Wa ', 'Sou ', 'Tang ', 'Su ', 'Zhui ', 'Ge ', 'Yi ', 'Bo ', 'Liao ', 'Ji ', 'Pi ', 'Xie ', 'Gao ', + 0x90 => 'Lu ', 'Bin ', 'Ou ', 'Chang ', 'Lu ', 'Guo ', 'Pang ', 'Chuai ', 'Piao ', 'Jiang ', 'Fu ', 'Tang ', 'Mo ', 'Xi ', 'Zhuan ', 'Lu ', + 0xA0 => 'Jiao ', 'Ying ', 'Lu ', 'Zhi ', 'Tara ', 'Chun ', 'Lian ', 'Tong ', 'Peng ', 'Ni ', 'Zha ', 'Liao ', 'Cui ', 'Gui ', 'Xiao ', 'Teng ', + 0xB0 => 'Fan ', 'Zhi ', 'Jiao ', 'Shan ', 'Wu ', 'Cui ', 'Run ', 'Xiang ', 'Sui ', 'Fen ', 'Ying ', 'Tan ', 'Zhua ', 'Dan ', 'Kuai ', 'Nong ', + 0xC0 => 'Tun ', 'Lian ', 'Bi ', 'Yong ', 'Jue ', 'Chu ', 'Yi ', 'Juan ', 'La ', 'Lian ', 'Sao ', 'Tun ', 'Gu ', 'Qi ', 'Cui ', 'Bin ', + 0xD0 => 'Xun ', 'Ru ', 'Huo ', 'Zang ', 'Xian ', 'Biao ', 'Xing ', 'Kuan ', 'La ', 'Yan ', 'Lu ', 'Huo ', 'Zang ', 'Luo ', 'Qu ', 'Zang ', + 0xE0 => 'Luan ', 'Ni ', 'Zang ', 'Chen ', 'Qian ', 'Wo ', 'Guang ', 'Zang ', 'Lin ', 'Guang ', 'Zi ', 'Jiao ', 'Nie ', 'Chou ', 'Ji ', 'Gao ', + 0xF0 => 'Chou ', 'Mian ', 'Nie ', 'Zhi ', 'Zhi ', 'Ge ', 'Jian ', 'Die ', 'Zhi ', 'Xiu ', 'Tai ', 'Zhen ', 'Jiu ', 'Xian ', 'Yu ', 'Cha ', +); diff --git a/sources/resources/transliteration-data/x82.php b/sources/resources/transliteration-data/x82.php new file mode 100644 index 0000000..8386e46 --- /dev/null +++ b/sources/resources/transliteration-data/x82.php @@ -0,0 +1,20 @@ + 'Yao ', 'Yu ', 'Chong ', 'Xi ', 'Xi ', 'Jiu ', 'Yu ', 'Yu ', 'Xing ', 'Ju ', 'Jiu ', 'Xin ', 'She ', 'She ', 'Yadoru ', 'Jiu ', + 0x10 => 'Shi ', 'Tan ', 'Shu ', 'Shi ', 'Tian ', 'Dan ', 'Pu ', 'Pu ', 'Guan ', 'Hua ', 'Tan ', 'Chuan ', 'Shun ', 'Xia ', 'Wu ', 'Zhou ', + 0x20 => 'Dao ', 'Gang ', 'Shan ', 'Yi ', NULL, 'Pa ', 'Tai ', 'Fan ', 'Ban ', 'Chuan ', 'Hang ', 'Fang ', 'Ban ', 'Que ', 'Hesaki ', 'Zhong ', + 0x30 => 'Jian ', 'Cang ', 'Ling ', 'Zhu ', 'Ze ', 'Duo ', 'Bo ', 'Xian ', 'Ge ', 'Chuan ', 'Jia ', 'Lu ', 'Hong ', 'Pang ', 'Xi ', NULL, + 0x40 => 'Fu ', 'Zao ', 'Feng ', 'Li ', 'Shao ', 'Yu ', 'Lang ', 'Ting ', NULL, 'Wei ', 'Bo ', 'Meng ', 'Nian ', 'Ju ', 'Huang ', 'Shou ', + 0x50 => 'Zong ', 'Bian ', 'Mao ', 'Die ', NULL, 'Bang ', 'Cha ', 'Yi ', 'Sao ', 'Cang ', 'Cao ', 'Lou ', 'Dai ', 'Sori ', 'Yao ', 'Tong ', + 0x60 => 'Yofune ', 'Dang ', 'Tan ', 'Lu ', 'Yi ', 'Jie ', 'Jian ', 'Huo ', 'Meng ', 'Qi ', 'Lu ', 'Lu ', 'Chan ', 'Shuang ', 'Gen ', 'Liang ', + 0x70 => 'Jian ', 'Jian ', 'Se ', 'Yan ', 'Fu ', 'Ping ', 'Yan ', 'Yan ', 'Cao ', 'Cao ', 'Yi ', 'Le ', 'Ting ', 'Qiu ', 'Ai ', 'Nai ', + 0x80 => 'Tiao ', 'Jiao ', 'Jie ', 'Peng ', 'Wan ', 'Yi ', 'Chai ', 'Mian ', 'Mie ', 'Gan ', 'Qian ', 'Yu ', 'Yu ', 'Shuo ', 'Qiong ', 'Tu ', + 0x90 => 'Xia ', 'Qi ', 'Mang ', 'Zi ', 'Hui ', 'Sui ', 'Zhi ', 'Xiang ', 'Bi ', 'Fu ', 'Tun ', 'Wei ', 'Wu ', 'Zhi ', 'Qi ', 'Shan ', + 0xA0 => 'Wen ', 'Qian ', 'Ren ', 'Fou ', 'Kou ', 'Jie ', 'Lu ', 'Xu ', 'Ji ', 'Qin ', 'Qi ', 'Yuan ', 'Fen ', 'Ba ', 'Rui ', 'Xin ', + 0xB0 => 'Ji ', 'Hua ', 'Hua ', 'Fang ', 'Wu ', 'Jue ', 'Gou ', 'Zhi ', 'Yun ', 'Qin ', 'Ao ', 'Chu ', 'Mao ', 'Ya ', 'Fei ', 'Reng ', + 0xC0 => 'Hang ', 'Cong ', 'Yin ', 'You ', 'Bian ', 'Yi ', 'Susa ', 'Wei ', 'Li ', 'Pi ', 'E ', 'Xian ', 'Chang ', 'Cang ', 'Meng ', 'Su ', + 0xD0 => 'Yi ', 'Yuan ', 'Ran ', 'Ling ', 'Tai ', 'Tiao ', 'Di ', 'Miao ', 'Qiong ', 'Li ', 'Yong ', 'Ke ', 'Mu ', 'Pei ', 'Bao ', 'Gou ', + 0xE0 => 'Min ', 'Yi ', 'Yi ', 'Ju ', 'Pi ', 'Ruo ', 'Ku ', 'Zhu ', 'Ni ', 'Bo ', 'Bing ', 'Shan ', 'Qiu ', 'Yao ', 'Xian ', 'Ben ', + 0xF0 => 'Hong ', 'Ying ', 'Zha ', 'Dong ', 'Ju ', 'Die ', 'Nie ', 'Gan ', 'Hu ', 'Ping ', 'Mei ', 'Fu ', 'Sheng ', 'Gu ', 'Bi ', 'Wei ', +); diff --git a/sources/resources/transliteration-data/x83.php b/sources/resources/transliteration-data/x83.php new file mode 100644 index 0000000..173dee0 --- /dev/null +++ b/sources/resources/transliteration-data/x83.php @@ -0,0 +1,20 @@ + 'Fu ', 'Zhuo ', 'Mao ', 'Fan ', 'Qie ', 'Mao ', 'Mao ', 'Ba ', 'Zi ', 'Mo ', 'Zi ', 'Di ', 'Chi ', 'Ji ', 'Jing ', 'Long ', + 0x10 => NULL, 'Niao ', NULL, 'Xue ', 'Ying ', 'Qiong ', 'Ge ', 'Ming ', 'Li ', 'Rong ', 'Yin ', 'Gen ', 'Qian ', 'Chai ', 'Chen ', 'Yu ', + 0x20 => 'Xiu ', 'Zi ', 'Lie ', 'Wu ', 'Ji ', 'Kui ', 'Ce ', 'Chong ', 'Ci ', 'Gou ', 'Guang ', 'Mang ', 'Chi ', 'Jiao ', 'Jiao ', 'Fu ', + 0x30 => 'Yu ', 'Zhu ', 'Zi ', 'Jiang ', 'Hui ', 'Yin ', 'Cha ', 'Fa ', 'Rong ', 'Ru ', 'Chong ', 'Mang ', 'Tong ', 'Zhong ', NULL, 'Zhu ', + 0x40 => 'Xun ', 'Huan ', 'Kua ', 'Quan ', 'Gai ', 'Da ', 'Jing ', 'Xing ', 'Quan ', 'Cao ', 'Jing ', 'Er ', 'An ', 'Shou ', 'Chi ', 'Ren ', + 0x50 => 'Jian ', 'Ti ', 'Huang ', 'Ping ', 'Li ', 'Jin ', 'Lao ', 'Shu ', 'Zhuang ', 'Da ', 'Jia ', 'Rao ', 'Bi ', 'Ze ', 'Qiao ', 'Hui ', + 0x60 => 'Qi ', 'Dang ', NULL, 'Rong ', 'Hun ', 'Ying ', 'Luo ', 'Ying ', 'Xun ', 'Jin ', 'Sun ', 'Yin ', 'Mai ', 'Hong ', 'Zhou ', 'Yao ', + 0x70 => 'Du ', 'Wei ', 'Chu ', 'Dou ', 'Fu ', 'Ren ', 'Yin ', 'He ', 'Bi ', 'Bu ', 'Yun ', 'Di ', 'Tu ', 'Sui ', 'Sui ', 'Cheng ', + 0x80 => 'Chen ', 'Wu ', 'Bie ', 'Xi ', 'Geng ', 'Li ', 'Fu ', 'Zhu ', 'Mo ', 'Li ', 'Zhuang ', 'Ji ', 'Duo ', 'Qiu ', 'Sha ', 'Suo ', + 0x90 => 'Chen ', 'Feng ', 'Ju ', 'Mei ', 'Meng ', 'Xing ', 'Jing ', 'Che ', 'Xin ', 'Jun ', 'Yan ', 'Ting ', 'Diao ', 'Cuo ', 'Wan ', 'Han ', + 0xA0 => 'You ', 'Cuo ', 'Jia ', 'Wang ', 'You ', 'Niu ', 'Shao ', 'Xian ', 'Lang ', 'Fu ', 'E ', 'Mo ', 'Wen ', 'Jie ', 'Nan ', 'Mu ', + 0xB0 => 'Kan ', 'Lai ', 'Lian ', 'Shi ', 'Wo ', 'Usagi ', 'Lian ', 'Huo ', 'You ', 'Ying ', 'Ying ', 'Nuc ', 'Chun ', 'Mang ', 'Mang ', 'Ci ', + 0xC0 => 'Wan ', 'Jing ', 'Di ', 'Qu ', 'Dong ', 'Jian ', 'Zou ', 'Gu ', 'La ', 'Lu ', 'Ju ', 'Wei ', 'Jun ', 'Nie ', 'Kun ', 'He ', + 0xD0 => 'Pu ', 'Zi ', 'Gao ', 'Guo ', 'Fu ', 'Lun ', 'Chang ', 'Chou ', 'Song ', 'Chui ', 'Zhan ', 'Men ', 'Cai ', 'Ba ', 'Li ', 'Tu ', + 0xE0 => 'Bo ', 'Han ', 'Bao ', 'Qin ', 'Juan ', 'Xi ', 'Qin ', 'Di ', 'Jie ', 'Pu ', 'Dang ', 'Jin ', 'Zhao ', 'Tai ', 'Geng ', 'Hua ', + 0xF0 => 'Gu ', 'Ling ', 'Fei ', 'Jin ', 'An ', 'Wang ', 'Beng ', 'Zhou ', 'Yan ', 'Ju ', 'Jian ', 'Lin ', 'Tan ', 'Shu ', 'Tian ', 'Dao ', +); diff --git a/sources/resources/transliteration-data/x84.php b/sources/resources/transliteration-data/x84.php new file mode 100644 index 0000000..ead73b7 --- /dev/null +++ b/sources/resources/transliteration-data/x84.php @@ -0,0 +1,20 @@ + 'Hu ', 'Qi ', 'He ', 'Cui ', 'Tao ', 'Chun ', 'Bei ', 'Chang ', 'Huan ', 'Fei ', 'Lai ', 'Qi ', 'Meng ', 'Ping ', 'Wei ', 'Dan ', + 0x10 => 'Sha ', 'Huan ', 'Yan ', 'Yi ', 'Tiao ', 'Qi ', 'Wan ', 'Ce ', 'Nai ', 'Kutabireru ', 'Tuo ', 'Jiu ', 'Tie ', 'Luo ', NULL, NULL, + 0x20 => 'Meng ', NULL, 'Yaji ', NULL, 'Ying ', 'Ying ', 'Ying ', 'Xiao ', 'Sa ', 'Qiu ', 'Ke ', 'Xiang ', 'Wan ', 'Yu ', 'Yu ', 'Fu ', + 0x30 => 'Lian ', 'Xuan ', 'Yuan ', 'Nan ', 'Ze ', 'Wo ', 'Chun ', 'Xiao ', 'Yu ', 'Pian ', 'Mao ', 'An ', 'E ', 'Luo ', 'Ying ', 'Huo ', + 0x40 => 'Gua ', 'Jiang ', 'Mian ', 'Zuo ', 'Zuo ', 'Ju ', 'Bao ', 'Rou ', 'Xi ', 'Xie ', 'An ', 'Qu ', 'Jian ', 'Fu ', 'Lu ', 'Jing ', + 0x50 => 'Pen ', 'Feng ', 'Hong ', 'Hong ', 'Hou ', 'Yan ', 'Tu ', 'Zhu ', 'Zi ', 'Xiang ', 'Shen ', 'Ge ', 'Jie ', 'Jing ', 'Mi ', 'Huang ', + 0x60 => 'Shen ', 'Pu ', 'Gai ', 'Dong ', 'Zhou ', 'Qian ', 'Wei ', 'Bo ', 'Wei ', 'Pa ', 'Ji ', 'Hu ', 'Zang ', 'Jia ', 'Duan ', 'Yao ', + 0x70 => 'Jun ', 'Cong ', 'Quan ', 'Wei ', 'Xian ', 'Kui ', 'Ting ', 'Hun ', 'Xi ', 'Shi ', 'Qi ', 'Lan ', 'Zong ', 'Yao ', 'Yuan ', 'Mei ', + 0x80 => 'Yun ', 'Shu ', 'Di ', 'Zhuan ', 'Guan ', 'Sukumo ', 'Xue ', 'Chan ', 'Kai ', 'Kui ', NULL, 'Jiang ', 'Lou ', 'Wei ', 'Pai ', NULL, + 0x90 => 'Sou ', 'Yin ', 'Shi ', 'Chun ', 'Shi ', 'Yun ', 'Zhen ', 'Lang ', 'Nu ', 'Meng ', 'He ', 'Que ', 'Suan ', 'Yuan ', 'Li ', 'Ju ', + 0xA0 => 'Xi ', 'Pang ', 'Chu ', 'Xu ', 'Tu ', 'Liu ', 'Wo ', 'Zhen ', 'Qian ', 'Zu ', 'Po ', 'Cuo ', 'Yuan ', 'Chu ', 'Yu ', 'Kuai ', + 0xB0 => 'Pan ', 'Pu ', 'Pu ', 'Na ', 'Shuo ', 'Xi ', 'Fen ', 'Yun ', 'Zheng ', 'Jian ', 'Ji ', 'Ruo ', 'Cang ', 'En ', 'Mi ', 'Hao ', + 0xC0 => 'Sun ', 'Zhen ', 'Ming ', 'Sou ', 'Xu ', 'Liu ', 'Xi ', 'Gu ', 'Lang ', 'Rong ', 'Weng ', 'Gai ', 'Cuo ', 'Shi ', 'Tang ', 'Luo ', + 0xD0 => 'Ru ', 'Suo ', 'Xian ', 'Bei ', 'Yao ', 'Gui ', 'Bi ', 'Zong ', 'Gun ', 'Za ', 'Xiu ', 'Ce ', 'Hai ', 'Lan ', NULL, 'Ji ', + 0xE0 => 'Li ', 'Can ', 'Lang ', 'Yu ', NULL, 'Ying ', 'Mo ', 'Diao ', 'Tiao ', 'Mao ', 'Tong ', 'Zhu ', 'Peng ', 'An ', 'Lian ', 'Cong ', + 0xF0 => 'Xi ', 'Ping ', 'Qiu ', 'Jin ', 'Chun ', 'Jie ', 'Wei ', 'Tui ', 'Cao ', 'Yu ', 'Yi ', 'Ji ', 'Liao ', 'Bi ', 'Lu ', 'Su ', +); diff --git a/sources/resources/transliteration-data/x85.php b/sources/resources/transliteration-data/x85.php new file mode 100644 index 0000000..a04abb0 --- /dev/null +++ b/sources/resources/transliteration-data/x85.php @@ -0,0 +1,20 @@ + 'Bu ', 'Zhang ', 'Luo ', 'Jiang ', 'Man ', 'Yan ', 'Ling ', 'Ji ', 'Piao ', 'Gun ', 'Han ', 'Di ', 'Su ', 'Lu ', 'She ', 'Shang ', + 0x10 => 'Di ', 'Mie ', 'Xun ', 'Man ', 'Bo ', 'Di ', 'Cuo ', 'Zhe ', 'Sen ', 'Xuan ', 'Wei ', 'Hu ', 'Ao ', 'Mi ', 'Lou ', 'Cu ', + 0x20 => 'Zhong ', 'Cai ', 'Po ', 'Jiang ', 'Mi ', 'Cong ', 'Niao ', 'Hui ', 'Jun ', 'Yin ', 'Jian ', 'Yan ', 'Shu ', 'Yin ', 'Kui ', 'Chen ', + 0x30 => 'Hu ', 'Sha ', 'Kou ', 'Qian ', 'Ma ', 'Zang ', 'Sonoko ', 'Qiang ', 'Dou ', 'Lian ', 'Lin ', 'Kou ', 'Ai ', 'Bi ', 'Li ', 'Wei ', + 0x40 => 'Ji ', 'Xun ', 'Sheng ', 'Fan ', 'Meng ', 'Ou ', 'Chan ', 'Dian ', 'Xun ', 'Jiao ', 'Rui ', 'Rui ', 'Lei ', 'Yu ', 'Qiao ', 'Chu ', + 0x50 => 'Hua ', 'Jian ', 'Mai ', 'Yun ', 'Bao ', 'You ', 'Qu ', 'Lu ', 'Rao ', 'Hui ', 'E ', 'Teng ', 'Fei ', 'Jue ', 'Zui ', 'Fa ', + 0x60 => 'Ru ', 'Fen ', 'Kui ', 'Shun ', 'Rui ', 'Ya ', 'Xu ', 'Fu ', 'Jue ', 'Dang ', 'Wu ', 'Tong ', 'Si ', 'Xiao ', 'Xi ', 'Long ', + 0x70 => 'Yun ', NULL, 'Qi ', 'Jian ', 'Yun ', 'Sun ', 'Ling ', 'Yu ', 'Xia ', 'Yong ', 'Ji ', 'Hong ', 'Si ', 'Nong ', 'Lei ', 'Xuan ', + 0x80 => 'Yun ', 'Yu ', 'Xi ', 'Hao ', 'Bo ', 'Hao ', 'Ai ', 'Wei ', 'Hui ', 'Wei ', 'Ji ', 'Ci ', 'Xiang ', 'Luan ', 'Mie ', 'Yi ', + 0x90 => 'Leng ', 'Jiang ', 'Can ', 'Shen ', 'Qiang ', 'Lian ', 'Ke ', 'Yuan ', 'Da ', 'Ti ', 'Tang ', 'Xie ', 'Bi ', 'Zhan ', 'Sun ', 'Lian ', + 0xA0 => 'Fan ', 'Ding ', 'Jie ', 'Gu ', 'Xie ', 'Shu ', 'Jian ', 'Kao ', 'Hong ', 'Sa ', 'Xin ', 'Xun ', 'Yao ', 'Hie ', 'Sou ', 'Shu ', + 0xB0 => 'Xun ', 'Dui ', 'Pin ', 'Wei ', 'Neng ', 'Chou ', 'Mai ', 'Ru ', 'Piao ', 'Tai ', 'Qi ', 'Zao ', 'Chen ', 'Zhen ', 'Er ', 'Ni ', + 0xC0 => 'Ying ', 'Gao ', 'Cong ', 'Xiao ', 'Qi ', 'Fa ', 'Jian ', 'Xu ', 'Kui ', 'Jie ', 'Bian ', 'Diao ', 'Mi ', 'Lan ', 'Jin ', 'Cang ', + 0xD0 => 'Miao ', 'Qiong ', 'Qie ', 'Xian ', NULL, 'Ou ', 'Xian ', 'Su ', 'Lu ', 'Yi ', 'Xu ', 'Xie ', 'Li ', 'Yi ', 'La ', 'Lei ', + 0xE0 => 'Xiao ', 'Di ', 'Zhi ', 'Bei ', 'Teng ', 'Yao ', 'Mo ', 'Huan ', 'Piao ', 'Fan ', 'Sou ', 'Tan ', 'Tui ', 'Qiong ', 'Qiao ', 'Wei ', + 0xF0 => 'Liu ', 'Hui ', NULL, 'Gao ', 'Yun ', NULL, 'Li ', 'Shu ', 'Chu ', 'Ai ', 'Lin ', 'Zao ', 'Xuan ', 'Chen ', 'Lai ', 'Huo ', +); diff --git a/sources/resources/transliteration-data/x86.php b/sources/resources/transliteration-data/x86.php new file mode 100644 index 0000000..73c5159 --- /dev/null +++ b/sources/resources/transliteration-data/x86.php @@ -0,0 +1,20 @@ + 'Tuo ', 'Wu ', 'Rui ', 'Rui ', 'Qi ', 'Heng ', 'Lu ', 'Su ', 'Tui ', 'Mang ', 'Yun ', 'Pin ', 'Yu ', 'Xun ', 'Ji ', 'Jiong ', + 0x10 => 'Xian ', 'Mo ', 'Hagi ', 'Su ', 'Jiong ', NULL, 'Nie ', 'Bo ', 'Rang ', 'Yi ', 'Xian ', 'Yu ', 'Ju ', 'Lian ', 'Lian ', 'Yin ', + 0x20 => 'Qiang ', 'Ying ', 'Long ', 'Tong ', 'Wei ', 'Yue ', 'Ling ', 'Qu ', 'Yao ', 'Fan ', 'Mi ', 'Lan ', 'Kui ', 'Lan ', 'Ji ', 'Dang ', + 0x30 => 'Katsura ', 'Lei ', 'Lei ', 'Hua ', 'Feng ', 'Zhi ', 'Wei ', 'Kui ', 'Zhan ', 'Huai ', 'Li ', 'Ji ', 'Mi ', 'Lei ', 'Huai ', 'Luo ', + 0x40 => 'Ji ', 'Kui ', 'Lu ', 'Jian ', 'San ', NULL, 'Lei ', 'Quan ', 'Xiao ', 'Yi ', 'Luan ', 'Men ', 'Bie ', 'Hu ', 'Hu ', 'Lu ', + 0x50 => 'Nue ', 'Lu ', 'Si ', 'Xiao ', 'Qian ', 'Chu ', 'Hu ', 'Xu ', 'Cuo ', 'Fu ', 'Xu ', 'Xu ', 'Lu ', 'Hu ', 'Yu ', 'Hao ', + 0x60 => 'Jiao ', 'Ju ', 'Guo ', 'Bao ', 'Yan ', 'Zhan ', 'Zhan ', 'Kui ', 'Ban ', 'Xi ', 'Shu ', 'Chong ', 'Qiu ', 'Diao ', 'Ji ', 'Qiu ', + 0x70 => 'Cheng ', 'Shi ', NULL, 'Di ', 'Zhe ', 'She ', 'Yu ', 'Gan ', 'Zi ', 'Hong ', 'Hui ', 'Meng ', 'Ge ', 'Sui ', 'Xia ', 'Chai ', + 0x80 => 'Shi ', 'Yi ', 'Ma ', 'Xiang ', 'Fang ', 'E ', 'Pa ', 'Chi ', 'Qian ', 'Wen ', 'Wen ', 'Rui ', 'Bang ', 'Bi ', 'Yue ', 'Yue ', + 0x90 => 'Jun ', 'Qi ', 'Ran ', 'Yin ', 'Qi ', 'Tian ', 'Yuan ', 'Jue ', 'Hui ', 'Qin ', 'Qi ', 'Zhong ', 'Ya ', 'Ci ', 'Mu ', 'Wang ', + 0xA0 => 'Fen ', 'Fen ', 'Hang ', 'Gong ', 'Zao ', 'Fu ', 'Ran ', 'Jie ', 'Fu ', 'Chi ', 'Dou ', 'Piao ', 'Xian ', 'Ni ', 'Te ', 'Qiu ', + 0xB0 => 'You ', 'Zha ', 'Ping ', 'Chi ', 'You ', 'He ', 'Han ', 'Ju ', 'Li ', 'Fu ', 'Ran ', 'Zha ', 'Gou ', 'Pi ', 'Bo ', 'Xian ', + 0xC0 => 'Zhu ', 'Diao ', 'Bie ', 'Bing ', 'Gu ', 'Ran ', 'Qu ', 'She ', 'Tie ', 'Ling ', 'Gu ', 'Dan ', 'Gu ', 'Ying ', 'Li ', 'Cheng ', + 0xD0 => 'Qu ', 'Mou ', 'Ge ', 'Ci ', 'Hui ', 'Hui ', 'Mang ', 'Fu ', 'Yang ', 'Wa ', 'Lie ', 'Zhu ', 'Yi ', 'Xian ', 'Kuo ', 'Jiao ', + 0xE0 => 'Li ', 'Yi ', 'Ping ', 'Ji ', 'Ha ', 'She ', 'Yi ', 'Wang ', 'Mo ', 'Qiong ', 'Qie ', 'Gui ', 'Gong ', 'Zhi ', 'Man ', 'Ebi ', + 0xF0 => 'Zhi ', 'Jia ', 'Rao ', 'Si ', 'Qi ', 'Xing ', 'Lie ', 'Qiu ', 'Shao ', 'Yong ', 'Jia ', 'Shui ', 'Che ', 'Bai ', 'E ', 'Han ', +); diff --git a/sources/resources/transliteration-data/x87.php b/sources/resources/transliteration-data/x87.php new file mode 100644 index 0000000..93d40b3 --- /dev/null +++ b/sources/resources/transliteration-data/x87.php @@ -0,0 +1,20 @@ + 'Shu ', 'Xuan ', 'Feng ', 'Shen ', 'Zhen ', 'Fu ', 'Xian ', 'Zhe ', 'Wu ', 'Fu ', 'Li ', 'Lang ', 'Bi ', 'Chu ', 'Yuan ', 'You ', + 0x10 => 'Jie ', 'Dan ', 'Yan ', 'Ting ', 'Dian ', 'Shui ', 'Hui ', 'Gua ', 'Zhi ', 'Song ', 'Fei ', 'Ju ', 'Mi ', 'Qi ', 'Qi ', 'Yu ', + 0x20 => 'Jun ', 'Zha ', 'Meng ', 'Qiang ', 'Si ', 'Xi ', 'Lun ', 'Li ', 'Die ', 'Tiao ', 'Tao ', 'Kun ', 'Gan ', 'Han ', 'Yu ', 'Bang ', + 0x30 => 'Fei ', 'Pi ', 'Wei ', 'Dun ', 'Yi ', 'Yuan ', 'Su ', 'Quan ', 'Qian ', 'Rui ', 'Ni ', 'Qing ', 'Wei ', 'Liang ', 'Guo ', 'Wan ', + 0x40 => 'Dong ', 'E ', 'Ban ', 'Di ', 'Wang ', 'Can ', 'Yang ', 'Ying ', 'Guo ', 'Chan ', NULL, 'La ', 'Ke ', 'Ji ', 'He ', 'Ting ', + 0x50 => 'Mai ', 'Xu ', 'Mian ', 'Yu ', 'Jie ', 'Shi ', 'Xuan ', 'Huang ', 'Yan ', 'Bian ', 'Rou ', 'Wei ', 'Fu ', 'Yuan ', 'Mei ', 'Wei ', + 0x60 => 'Fu ', 'Ruan ', 'Xie ', 'You ', 'Qiu ', 'Mao ', 'Xia ', 'Ying ', 'Shi ', 'Chong ', 'Tang ', 'Zhu ', 'Zong ', 'Ti ', 'Fu ', 'Yuan ', + 0x70 => 'Hui ', 'Meng ', 'La ', 'Du ', 'Hu ', 'Qiu ', 'Die ', 'Li ', 'Gua ', 'Yun ', 'Ju ', 'Nan ', 'Lou ', 'Qun ', 'Rong ', 'Ying ', + 0x80 => 'Jiang ', NULL, 'Lang ', 'Pang ', 'Si ', 'Xi ', 'Ci ', 'Xi ', 'Yuan ', 'Weng ', 'Lian ', 'Sou ', 'Ban ', 'Rong ', 'Rong ', 'Ji ', + 0x90 => 'Wu ', 'Qiu ', 'Han ', 'Qin ', 'Yi ', 'Bi ', 'Hua ', 'Tang ', 'Yi ', 'Du ', 'Nai ', 'He ', 'Hu ', 'Hui ', 'Ma ', 'Ming ', + 0xA0 => 'Yi ', 'Wen ', 'Ying ', 'Teng ', 'Yu ', 'Cang ', 'So ', 'Ebi ', 'Man ', NULL, 'Shang ', 'Zhe ', 'Cao ', 'Chi ', 'Di ', 'Ao ', + 0xB0 => 'Lu ', 'Wei ', 'Zhi ', 'Tang ', 'Chen ', 'Piao ', 'Qu ', 'Pi ', 'Yu ', 'Jian ', 'Luo ', 'Lou ', 'Qin ', 'Zhong ', 'Yin ', 'Jiang ', + 0xC0 => 'Shuai ', 'Wen ', 'Jiao ', 'Wan ', 'Zhi ', 'Zhe ', 'Ma ', 'Ma ', 'Guo ', 'Liu ', 'Mao ', 'Xi ', 'Cong ', 'Li ', 'Man ', 'Xiao ', + 0xD0 => 'Kamakiri ', 'Zhang ', 'Mang ', 'Xiang ', 'Mo ', 'Zui ', 'Si ', 'Qiu ', 'Te ', 'Zhi ', 'Peng ', 'Peng ', 'Jiao ', 'Qu ', 'Bie ', 'Liao ', + 0xE0 => 'Pan ', 'Gui ', 'Xi ', 'Ji ', 'Zhuan ', 'Huang ', 'Fei ', 'Lao ', 'Jue ', 'Jue ', 'Hui ', 'Yin ', 'Chan ', 'Jiao ', 'Shan ', 'Rao ', + 0xF0 => 'Xiao ', 'Mou ', 'Chong ', 'Xun ', 'Si ', NULL, 'Cheng ', 'Dang ', 'Li ', 'Xie ', 'Shan ', 'Yi ', 'Jing ', 'Da ', 'Chan ', 'Qi ', +); diff --git a/sources/resources/transliteration-data/x88.php b/sources/resources/transliteration-data/x88.php new file mode 100644 index 0000000..7dc8324 --- /dev/null +++ b/sources/resources/transliteration-data/x88.php @@ -0,0 +1,20 @@ + 'Ci ', 'Xiang ', 'She ', 'Luo ', 'Qin ', 'Ying ', 'Chai ', 'Li ', 'Ze ', 'Xuan ', 'Lian ', 'Zhu ', 'Ze ', 'Xie ', 'Mang ', 'Xie ', + 0x10 => 'Qi ', 'Rong ', 'Jian ', 'Meng ', 'Hao ', 'Ruan ', 'Huo ', 'Zhuo ', 'Jie ', 'Bin ', 'He ', 'Mie ', 'Fan ', 'Lei ', 'Jie ', 'La ', + 0x20 => 'Mi ', 'Li ', 'Chun ', 'Li ', 'Qiu ', 'Nie ', 'Lu ', 'Du ', 'Xiao ', 'Zhu ', 'Long ', 'Li ', 'Long ', 'Feng ', 'Ye ', 'Beng ', + 0x30 => 'Shang ', 'Gu ', 'Juan ', 'Ying ', NULL, 'Xi ', 'Can ', 'Qu ', 'Quan ', 'Du ', 'Can ', 'Man ', 'Jue ', 'Jie ', 'Zhu ', 'Zha ', + 0x40 => 'Xie ', 'Huang ', 'Niu ', 'Pei ', 'Nu ', 'Xin ', 'Zhong ', 'Mo ', 'Er ', 'Ke ', 'Mie ', 'Xi ', 'Xing ', 'Yan ', 'Kan ', 'Yuan ', + 0x50 => NULL, 'Ling ', 'Xuan ', 'Shu ', 'Xian ', 'Tong ', 'Long ', 'Jie ', 'Xian ', 'Ya ', 'Hu ', 'Wei ', 'Dao ', 'Chong ', 'Wei ', 'Dao ', + 0x60 => 'Zhun ', 'Heng ', 'Qu ', 'Yi ', 'Yi ', 'Bu ', 'Gan ', 'Yu ', 'Biao ', 'Cha ', 'Yi ', 'Shan ', 'Chen ', 'Fu ', 'Gun ', 'Fen ', + 0x70 => 'Shuai ', 'Jie ', 'Na ', 'Zhong ', 'Dan ', 'Ri ', 'Zhong ', 'Zhong ', 'Xie ', 'Qi ', 'Xie ', 'Ran ', 'Zhi ', 'Ren ', 'Qin ', 'Jin ', + 0x80 => 'Jun ', 'Yuan ', 'Mei ', 'Chai ', 'Ao ', 'Niao ', 'Hui ', 'Ran ', 'Jia ', 'Tuo ', 'Ling ', 'Dai ', 'Bao ', 'Pao ', 'Yao ', 'Zuo ', + 0x90 => 'Bi ', 'Shao ', 'Tan ', 'Ju ', 'He ', 'Shu ', 'Xiu ', 'Zhen ', 'Yi ', 'Pa ', 'Bo ', 'Di ', 'Wa ', 'Fu ', 'Gun ', 'Zhi ', + 0xA0 => 'Zhi ', 'Ran ', 'Pan ', 'Yi ', 'Mao ', 'Tuo ', 'Na ', 'Kou ', 'Xian ', 'Chan ', 'Qu ', 'Bei ', 'Gun ', 'Xi ', 'Ne ', 'Bo ', + 0xB0 => 'Horo ', 'Fu ', 'Yi ', 'Chi ', 'Ku ', 'Ren ', 'Jiang ', 'Jia ', 'Cun ', 'Mo ', 'Jie ', 'Er ', 'Luo ', 'Ru ', 'Zhu ', 'Gui ', + 0xC0 => 'Yin ', 'Cai ', 'Lie ', 'Kamishimo ', 'Yuki ', 'Zhuang ', 'Dang ', NULL, 'Kun ', 'Ken ', 'Niao ', 'Shu ', 'Jia ', 'Kun ', 'Cheng ', 'Li ', + 0xD0 => 'Juan ', 'Shen ', 'Pou ', 'Ge ', 'Yi ', 'Yu ', 'Zhen ', 'Liu ', 'Qiu ', 'Qun ', 'Ji ', 'Yi ', 'Bu ', 'Zhuang ', 'Shui ', 'Sha ', + 0xE0 => 'Qun ', 'Li ', 'Lian ', 'Lian ', 'Ku ', 'Jian ', 'Fou ', 'Chan ', 'Bi ', 'Gun ', 'Tao ', 'Yuan ', 'Ling ', 'Chi ', 'Chang ', 'Chou ', + 0xF0 => 'Duo ', 'Biao ', 'Liang ', 'Chang ', 'Pei ', 'Pei ', 'Fei ', 'Yuan ', 'Luo ', 'Guo ', 'Yan ', 'Du ', 'Xi ', 'Zhi ', 'Ju ', 'Qi ', +); diff --git a/sources/resources/transliteration-data/x89.php b/sources/resources/transliteration-data/x89.php new file mode 100644 index 0000000..4fd4653 --- /dev/null +++ b/sources/resources/transliteration-data/x89.php @@ -0,0 +1,20 @@ + 'Ji ', 'Zhi ', 'Gua ', 'Ken ', 'Che ', 'Ti ', 'Ti ', 'Fu ', 'Chong ', 'Xie ', 'Bian ', 'Die ', 'Kun ', 'Duan ', 'Xiu ', 'Xiu ', + 0x10 => 'He ', 'Yuan ', 'Bao ', 'Bao ', 'Fu ', 'Yu ', 'Tuan ', 'Yan ', 'Hui ', 'Bei ', 'Chu ', 'Lu ', 'Ena ', 'Hitoe ', 'Yun ', 'Da ', + 0x20 => 'Gou ', 'Da ', 'Huai ', 'Rong ', 'Yuan ', 'Ru ', 'Nai ', 'Jiong ', 'Suo ', 'Ban ', 'Tun ', 'Chi ', 'Sang ', 'Niao ', 'Ying ', 'Jie ', + 0x30 => 'Qian ', 'Huai ', 'Ku ', 'Lian ', 'Bao ', 'Li ', 'Zhe ', 'Shi ', 'Lu ', 'Yi ', 'Die ', 'Xie ', 'Xian ', 'Wei ', 'Biao ', 'Cao ', + 0x40 => 'Ji ', 'Jiang ', 'Sen ', 'Bao ', 'Xiang ', 'Chihaya ', 'Pu ', 'Jian ', 'Zhuan ', 'Jian ', 'Zui ', 'Ji ', 'Dan ', 'Za ', 'Fan ', 'Bo ', + 0x50 => 'Xiang ', 'Xin ', 'Bie ', 'Rao ', 'Man ', 'Lan ', 'Ao ', 'Duo ', 'Gui ', 'Cao ', 'Sui ', 'Nong ', 'Chan ', 'Lian ', 'Bi ', 'Jin ', + 0x60 => 'Dang ', 'Shu ', 'Tan ', 'Bi ', 'Lan ', 'Pu ', 'Ru ', 'Zhi ', NULL, 'Shu ', 'Wa ', 'Shi ', 'Bai ', 'Xie ', 'Bo ', 'Chen ', + 0x70 => 'Lai ', 'Long ', 'Xi ', 'Xian ', 'Lan ', 'Zhe ', 'Dai ', 'Tasuki ', 'Zan ', 'Shi ', 'Jian ', 'Pan ', 'Yi ', 'Ran ', 'Ya ', 'Xi ', + 0x80 => 'Xi ', 'Yao ', 'Feng ', 'Tan ', NULL, 'Biao ', 'Fu ', 'Ba ', 'He ', 'Ji ', 'Ji ', 'Jian ', 'Guan ', 'Bian ', 'Yan ', 'Gui ', + 0x90 => 'Jue ', 'Pian ', 'Mao ', 'Mi ', 'Mi ', 'Mie ', 'Shi ', 'Si ', 'Zhan ', 'Luo ', 'Jue ', 'Mi ', 'Tiao ', 'Lian ', 'Yao ', 'Zhi ', + 0xA0 => 'Jun ', 'Xi ', 'Shan ', 'Wei ', 'Xi ', 'Tian ', 'Yu ', 'Lan ', 'E ', 'Du ', 'Qin ', 'Pang ', 'Ji ', 'Ming ', 'Ying ', 'Gou ', + 0xB0 => 'Qu ', 'Zhan ', 'Jin ', 'Guan ', 'Deng ', 'Jian ', 'Luo ', 'Qu ', 'Jian ', 'Wei ', 'Jue ', 'Qu ', 'Luo ', 'Lan ', 'Shen ', 'Di ', + 0xC0 => 'Guan ', 'Jian ', 'Guan ', 'Yan ', 'Gui ', 'Mi ', 'Shi ', 'Zhan ', 'Lan ', 'Jue ', 'Ji ', 'Xi ', 'Di ', 'Tian ', 'Yu ', 'Gou ', + 0xD0 => 'Jin ', 'Qu ', 'Jiao ', 'Jiu ', 'Jin ', 'Cu ', 'Jue ', 'Zhi ', 'Chao ', 'Ji ', 'Gu ', 'Dan ', 'Zui ', 'Di ', 'Shang ', 'Hua ', + 0xE0 => 'Quan ', 'Ge ', 'Chi ', 'Jie ', 'Gui ', 'Gong ', 'Hong ', 'Jie ', 'Hun ', 'Qiu ', 'Xing ', 'Su ', 'Ni ', 'Ji ', 'Lu ', 'Zhi ', + 0xF0 => 'Zha ', 'Bi ', 'Xing ', 'Hu ', 'Shang ', 'Gong ', 'Zhi ', 'Xue ', 'Chu ', 'Xi ', 'Yi ', 'Lu ', 'Jue ', 'Xi ', 'Yan ', 'Xi ', +); diff --git a/sources/resources/transliteration-data/x8a.php b/sources/resources/transliteration-data/x8a.php new file mode 100644 index 0000000..8984762 --- /dev/null +++ b/sources/resources/transliteration-data/x8a.php @@ -0,0 +1,20 @@ + 'Yan ', 'Yan ', 'Ding ', 'Fu ', 'Qiu ', 'Qiu ', 'Jiao ', 'Hong ', 'Ji ', 'Fan ', 'Xun ', 'Diao ', 'Hong ', 'Cha ', 'Tao ', 'Xu ', + 0x10 => 'Jie ', 'Yi ', 'Ren ', 'Xun ', 'Yin ', 'Shan ', 'Qi ', 'Tuo ', 'Ji ', 'Xun ', 'Yin ', 'E ', 'Fen ', 'Ya ', 'Yao ', 'Song ', + 0x20 => 'Shen ', 'Yin ', 'Xin ', 'Jue ', 'Xiao ', 'Ne ', 'Chen ', 'You ', 'Zhi ', 'Xiong ', 'Fang ', 'Xin ', 'Chao ', 'She ', 'Xian ', 'Sha ', + 0x30 => 'Tun ', 'Xu ', 'Yi ', 'Yi ', 'Su ', 'Chi ', 'He ', 'Shen ', 'He ', 'Xu ', 'Zhen ', 'Zhu ', 'Zheng ', 'Gou ', 'Zi ', 'Zi ', + 0x40 => 'Zhan ', 'Gu ', 'Fu ', 'Quan ', 'Die ', 'Ling ', 'Di ', 'Yang ', 'Li ', 'Nao ', 'Pan ', 'Zhou ', 'Gan ', 'Yi ', 'Ju ', 'Ao ', + 0x50 => 'Zha ', 'Tuo ', 'Yi ', 'Qu ', 'Zhao ', 'Ping ', 'Bi ', 'Xiong ', 'Qu ', 'Ba ', 'Da ', 'Zu ', 'Tao ', 'Zhu ', 'Ci ', 'Zhe ', + 0x60 => 'Yong ', 'Xu ', 'Xun ', 'Yi ', 'Huang ', 'He ', 'Shi ', 'Cha ', 'Jiao ', 'Shi ', 'Hen ', 'Cha ', 'Gou ', 'Gui ', 'Quan ', 'Hui ', + 0x70 => 'Jie ', 'Hua ', 'Gai ', 'Xiang ', 'Wei ', 'Shen ', 'Chou ', 'Tong ', 'Mi ', 'Zhan ', 'Ming ', 'E ', 'Hui ', 'Yan ', 'Xiong ', 'Gua ', + 0x80 => 'Er ', 'Beng ', 'Tiao ', 'Chi ', 'Lei ', 'Zhu ', 'Kuang ', 'Kua ', 'Wu ', 'Yu ', 'Teng ', 'Ji ', 'Zhi ', 'Ren ', 'Su ', 'Lang ', + 0x90 => 'E ', 'Kuang ', 'E ', 'Shi ', 'Ting ', 'Dan ', 'Bo ', 'Chan ', 'You ', 'Heng ', 'Qiao ', 'Qin ', 'Shua ', 'An ', 'Yu ', 'Xiao ', + 0xA0 => 'Cheng ', 'Jie ', 'Xian ', 'Wu ', 'Wu ', 'Gao ', 'Song ', 'Pu ', 'Hui ', 'Jing ', 'Shuo ', 'Zhen ', 'Shuo ', 'Du ', 'Yasashi ', 'Chang ', + 0xB0 => 'Shui ', 'Jie ', 'Ke ', 'Qu ', 'Cong ', 'Xiao ', 'Sui ', 'Wang ', 'Xuan ', 'Fei ', 'Chi ', 'Ta ', 'Yi ', 'Na ', 'Yin ', 'Diao ', + 0xC0 => 'Pi ', 'Chuo ', 'Chan ', 'Chen ', 'Zhun ', 'Ji ', 'Qi ', 'Tan ', 'Zhui ', 'Wei ', 'Ju ', 'Qing ', 'Jian ', 'Zheng ', 'Ze ', 'Zou ', + 0xD0 => 'Qian ', 'Zhuo ', 'Liang ', 'Jian ', 'Zhu ', 'Hao ', 'Lun ', 'Shen ', 'Biao ', 'Huai ', 'Pian ', 'Yu ', 'Die ', 'Xu ', 'Pian ', 'Shi ', + 0xE0 => 'Xuan ', 'Shi ', 'Hun ', 'Hua ', 'E ', 'Zhong ', 'Di ', 'Xie ', 'Fu ', 'Pu ', 'Ting ', 'Jian ', 'Qi ', 'Yu ', 'Zi ', 'Chuan ', + 0xF0 => 'Xi ', 'Hui ', 'Yin ', 'An ', 'Xian ', 'Nan ', 'Chen ', 'Feng ', 'Zhu ', 'Yang ', 'Yan ', 'Heng ', 'Xuan ', 'Ge ', 'Nuo ', 'Qi ', +); diff --git a/sources/resources/transliteration-data/x8b.php b/sources/resources/transliteration-data/x8b.php new file mode 100644 index 0000000..3179227 --- /dev/null +++ b/sources/resources/transliteration-data/x8b.php @@ -0,0 +1,20 @@ + 'Mou ', 'Ye ', 'Wei ', NULL, 'Teng ', 'Zou ', 'Shan ', 'Jian ', 'Bo ', 'Ku ', 'Huang ', 'Huo ', 'Ge ', 'Ying ', 'Mi ', 'Xiao ', + 0x10 => 'Mi ', 'Xi ', 'Qiang ', 'Chen ', 'Nue ', 'Ti ', 'Su ', 'Bang ', 'Chi ', 'Qian ', 'Shi ', 'Jiang ', 'Yuan ', 'Xie ', 'Xue ', 'Tao ', + 0x20 => 'Yao ', 'Yao ', NULL, 'Yu ', 'Biao ', 'Cong ', 'Qing ', 'Li ', 'Mo ', 'Mo ', 'Shang ', 'Zhe ', 'Miu ', 'Jian ', 'Ze ', 'Jie ', + 0x30 => 'Lian ', 'Lou ', 'Can ', 'Ou ', 'Guan ', 'Xi ', 'Zhuo ', 'Ao ', 'Ao ', 'Jin ', 'Zhe ', 'Yi ', 'Hu ', 'Jiang ', 'Man ', 'Chao ', + 0x40 => 'Han ', 'Hua ', 'Chan ', 'Xu ', 'Zeng ', 'Se ', 'Xi ', 'She ', 'Dui ', 'Zheng ', 'Nao ', 'Lan ', 'E ', 'Ying ', 'Jue ', 'Ji ', + 0x50 => 'Zun ', 'Jiao ', 'Bo ', 'Hui ', 'Zhuan ', 'Mu ', 'Zen ', 'Zha ', 'Shi ', 'Qiao ', 'Tan ', 'Zen ', 'Pu ', 'Sheng ', 'Xuan ', 'Zao ', + 0x60 => 'Tan ', 'Dang ', 'Sui ', 'Qian ', 'Ji ', 'Jiao ', 'Jing ', 'Lian ', 'Nou ', 'Yi ', 'Ai ', 'Zhan ', 'Pi ', 'Hui ', 'Hua ', 'Yi ', + 0x70 => 'Yi ', 'Shan ', 'Rang ', 'Nou ', 'Qian ', 'Zhui ', 'Ta ', 'Hu ', 'Zhou ', 'Hao ', 'Ye ', 'Ying ', 'Jian ', 'Yu ', 'Jian ', 'Hui ', + 0x80 => 'Du ', 'Zhe ', 'Xuan ', 'Zan ', 'Lei ', 'Shen ', 'Wei ', 'Chan ', 'Li ', 'Yi ', 'Bian ', 'Zhe ', 'Yan ', 'E ', 'Chou ', 'Wei ', + 0x90 => 'Chou ', 'Yao ', 'Chan ', 'Rang ', 'Yin ', 'Lan ', 'Chen ', 'Huo ', 'Zhe ', 'Huan ', 'Zan ', 'Yi ', 'Dang ', 'Zhan ', 'Yan ', 'Du ', + 0xA0 => 'Yan ', 'Ji ', 'Ding ', 'Fu ', 'Ren ', 'Ji ', 'Jie ', 'Hong ', 'Tao ', 'Rang ', 'Shan ', 'Qi ', 'Tuo ', 'Xun ', 'Yi ', 'Xun ', + 0xB0 => 'Ji ', 'Ren ', 'Jiang ', 'Hui ', 'Ou ', 'Ju ', 'Ya ', 'Ne ', 'Xu ', 'E ', 'Lun ', 'Xiong ', 'Song ', 'Feng ', 'She ', 'Fang ', + 0xC0 => 'Jue ', 'Zheng ', 'Gu ', 'He ', 'Ping ', 'Zu ', 'Shi ', 'Xiong ', 'Zha ', 'Su ', 'Zhen ', 'Di ', 'Zou ', 'Ci ', 'Qu ', 'Zhao ', + 0xD0 => 'Bi ', 'Yi ', 'Yi ', 'Kuang ', 'Lei ', 'Shi ', 'Gua ', 'Shi ', 'Jie ', 'Hui ', 'Cheng ', 'Zhu ', 'Shen ', 'Hua ', 'Dan ', 'Gou ', + 0xE0 => 'Quan ', 'Gui ', 'Xun ', 'Yi ', 'Zheng ', 'Gai ', 'Xiang ', 'Cha ', 'Hun ', 'Xu ', 'Zhou ', 'Jie ', 'Wu ', 'Yu ', 'Qiao ', 'Wu ', + 0xF0 => 'Gao ', 'You ', 'Hui ', 'Kuang ', 'Shuo ', 'Song ', 'Ai ', 'Qing ', 'Zhu ', 'Zou ', 'Nuo ', 'Du ', 'Zhuo ', 'Fei ', 'Ke ', 'Wei ', +); diff --git a/sources/resources/transliteration-data/x8c.php b/sources/resources/transliteration-data/x8c.php new file mode 100644 index 0000000..7dc5d6a --- /dev/null +++ b/sources/resources/transliteration-data/x8c.php @@ -0,0 +1,20 @@ + 'Yu ', 'Shui ', 'Shen ', 'Diao ', 'Chan ', 'Liang ', 'Zhun ', 'Sui ', 'Tan ', 'Shen ', 'Yi ', 'Mou ', 'Chen ', 'Die ', 'Huang ', 'Jian ', + 0x10 => 'Xie ', 'Nue ', 'Ye ', 'Wei ', 'E ', 'Yu ', 'Xuan ', 'Chan ', 'Zi ', 'An ', 'Yan ', 'Di ', 'Mi ', 'Pian ', 'Xu ', 'Mo ', + 0x20 => 'Dang ', 'Su ', 'Xie ', 'Yao ', 'Bang ', 'Shi ', 'Qian ', 'Mi ', 'Jin ', 'Man ', 'Zhe ', 'Jian ', 'Miu ', 'Tan ', 'Zen ', 'Qiao ', + 0x30 => 'Lan ', 'Pu ', 'Jue ', 'Yan ', 'Qian ', 'Zhan ', 'Chen ', 'Gu ', 'Qian ', 'Hong ', 'Xia ', 'Jue ', 'Hong ', 'Han ', 'Hong ', 'Xi ', + 0x40 => 'Xi ', 'Huo ', 'Liao ', 'Han ', 'Du ', 'Long ', 'Dou ', 'Jiang ', 'Qi ', 'Shi ', 'Li ', 'Deng ', 'Wan ', 'Bi ', 'Shu ', 'Xian ', + 0x50 => 'Feng ', 'Zhi ', 'Zhi ', 'Yan ', 'Yan ', 'Shi ', 'Chu ', 'Hui ', 'Tun ', 'Yi ', 'Tun ', 'Yi ', 'Jian ', 'Ba ', 'Hou ', 'E ', + 0x60 => 'Cu ', 'Xiang ', 'Huan ', 'Jian ', 'Ken ', 'Gai ', 'Qu ', 'Fu ', 'Xi ', 'Bin ', 'Hao ', 'Yu ', 'Zhu ', 'Jia ', NULL, 'Xi ', + 0x70 => 'Bo ', 'Wen ', 'Huan ', 'Bin ', 'Di ', 'Zong ', 'Fen ', 'Yi ', 'Zhi ', 'Bao ', 'Chai ', 'Han ', 'Pi ', 'Na ', 'Pi ', 'Gou ', + 0x80 => 'Na ', 'You ', 'Diao ', 'Mo ', 'Si ', 'Xiu ', 'Huan ', 'Kun ', 'He ', 'He ', 'Mo ', 'Han ', 'Mao ', 'Li ', 'Ni ', 'Bi ', + 0x90 => 'Yu ', 'Jia ', 'Tuan ', 'Mao ', 'Pi ', 'Xi ', 'E ', 'Ju ', 'Mo ', 'Chu ', 'Tan ', 'Huan ', 'Jue ', 'Bei ', 'Zhen ', 'Yuan ', + 0xA0 => 'Fu ', 'Cai ', 'Gong ', 'Te ', 'Yi ', 'Hang ', 'Wan ', 'Pin ', 'Huo ', 'Fan ', 'Tan ', 'Guan ', 'Ze ', 'Zhi ', 'Er ', 'Zhu ', + 0xB0 => 'Shi ', 'Bi ', 'Zi ', 'Er ', 'Gui ', 'Pian ', 'Bian ', 'Mai ', 'Dai ', 'Sheng ', 'Kuang ', 'Fei ', 'Tie ', 'Yi ', 'Chi ', 'Mao ', + 0xC0 => 'He ', 'Bi ', 'Lu ', 'Ren ', 'Hui ', 'Gai ', 'Pian ', 'Zi ', 'Jia ', 'Xu ', 'Zei ', 'Jiao ', 'Gai ', 'Zang ', 'Jian ', 'Ying ', + 0xD0 => 'Xun ', 'Zhen ', 'She ', 'Bin ', 'Bin ', 'Qiu ', 'She ', 'Chuan ', 'Zang ', 'Zhou ', 'Lai ', 'Zan ', 'Si ', 'Chen ', 'Shang ', 'Tian ', + 0xE0 => 'Pei ', 'Geng ', 'Xian ', 'Mai ', 'Jian ', 'Sui ', 'Fu ', 'Tan ', 'Cong ', 'Cong ', 'Zhi ', 'Ji ', 'Zhang ', 'Du ', 'Jin ', 'Xiong ', + 0xF0 => 'Shun ', 'Yun ', 'Bao ', 'Zai ', 'Lai ', 'Feng ', 'Cang ', 'Ji ', 'Sheng ', 'Ai ', 'Zhuan ', 'Fu ', 'Gou ', 'Sai ', 'Ze ', 'Liao ', +); diff --git a/sources/resources/transliteration-data/x8d.php b/sources/resources/transliteration-data/x8d.php new file mode 100644 index 0000000..d5c7d4c --- /dev/null +++ b/sources/resources/transliteration-data/x8d.php @@ -0,0 +1,20 @@ + 'Wei ', 'Bai ', 'Chen ', 'Zhuan ', 'Zhi ', 'Zhui ', 'Biao ', 'Yun ', 'Zeng ', 'Tan ', 'Zan ', 'Yan ', NULL, 'Shan ', 'Wan ', 'Ying ', + 0x10 => 'Jin ', 'Gan ', 'Xian ', 'Zang ', 'Bi ', 'Du ', 'Shu ', 'Yan ', NULL, 'Xuan ', 'Long ', 'Gan ', 'Zang ', 'Bei ', 'Zhen ', 'Fu ', + 0x20 => 'Yuan ', 'Gong ', 'Cai ', 'Ze ', 'Xian ', 'Bai ', 'Zhang ', 'Huo ', 'Zhi ', 'Fan ', 'Tan ', 'Pin ', 'Bian ', 'Gou ', 'Zhu ', 'Guan ', + 0x30 => 'Er ', 'Jian ', 'Bi ', 'Shi ', 'Tie ', 'Gui ', 'Kuang ', 'Dai ', 'Mao ', 'Fei ', 'He ', 'Yi ', 'Zei ', 'Zhi ', 'Jia ', 'Hui ', + 0x40 => 'Zi ', 'Ren ', 'Lu ', 'Zang ', 'Zi ', 'Gai ', 'Jin ', 'Qiu ', 'Zhen ', 'Lai ', 'She ', 'Fu ', 'Du ', 'Ji ', 'Shu ', 'Shang ', + 0x50 => 'Si ', 'Bi ', 'Zhou ', 'Geng ', 'Pei ', 'Tan ', 'Lai ', 'Feng ', 'Zhui ', 'Fu ', 'Zhuan ', 'Sai ', 'Ze ', 'Yan ', 'Zan ', 'Yun ', + 0x60 => 'Zeng ', 'Shan ', 'Ying ', 'Gan ', 'Chi ', 'Xi ', 'She ', 'Nan ', 'Xiong ', 'Xi ', 'Cheng ', 'He ', 'Cheng ', 'Zhe ', 'Xia ', 'Tang ', + 0x70 => 'Zou ', 'Zou ', 'Li ', 'Jiu ', 'Fu ', 'Zhao ', 'Gan ', 'Qi ', 'Shan ', 'Qiong ', 'Qin ', 'Xian ', 'Ci ', 'Jue ', 'Qin ', 'Chi ', + 0x80 => 'Ci ', 'Chen ', 'Chen ', 'Die ', 'Ju ', 'Chao ', 'Di ', 'Se ', 'Zhan ', 'Zhu ', 'Yue ', 'Qu ', 'Jie ', 'Chi ', 'Chu ', 'Gua ', + 0x90 => 'Xue ', 'Ci ', 'Tiao ', 'Duo ', 'Lie ', 'Gan ', 'Suo ', 'Cu ', 'Xi ', 'Zhao ', 'Su ', 'Yin ', 'Ju ', 'Jian ', 'Que ', 'Tang ', + 0xA0 => 'Chuo ', 'Cui ', 'Lu ', 'Qu ', 'Dang ', 'Qiu ', 'Zi ', 'Ti ', 'Qu ', 'Chi ', 'Huang ', 'Qiao ', 'Qiao ', 'Yao ', 'Zao ', 'Ti ', + 0xB0 => NULL, 'Zan ', 'Zan ', 'Zu ', 'Pa ', 'Bao ', 'Ku ', 'Ke ', 'Dun ', 'Jue ', 'Fu ', 'Chen ', 'Jian ', 'Fang ', 'Zhi ', 'Sa ', + 0xC0 => 'Yue ', 'Pa ', 'Qi ', 'Yue ', 'Qiang ', 'Tuo ', 'Tai ', 'Yi ', 'Nian ', 'Ling ', 'Mei ', 'Ba ', 'Die ', 'Ku ', 'Tuo ', 'Jia ', + 0xD0 => 'Ci ', 'Pao ', 'Qia ', 'Zhu ', 'Ju ', 'Die ', 'Zhi ', 'Fu ', 'Pan ', 'Ju ', 'Shan ', 'Bo ', 'Ni ', 'Ju ', 'Li ', 'Gen ', + 0xE0 => 'Yi ', 'Ji ', 'Dai ', 'Xian ', 'Jiao ', 'Duo ', 'Zhu ', 'Zhuan ', 'Kua ', 'Zhuai ', 'Gui ', 'Qiong ', 'Kui ', 'Xiang ', 'Chi ', 'Lu ', + 0xF0 => 'Beng ', 'Zhi ', 'Jia ', 'Tiao ', 'Cai ', 'Jian ', 'Ta ', 'Qiao ', 'Bi ', 'Xian ', 'Duo ', 'Ji ', 'Ju ', 'Ji ', 'Shu ', 'Tu ', +); diff --git a/sources/resources/transliteration-data/x8e.php b/sources/resources/transliteration-data/x8e.php new file mode 100644 index 0000000..737ac28 --- /dev/null +++ b/sources/resources/transliteration-data/x8e.php @@ -0,0 +1,20 @@ + 'Chu ', 'Jing ', 'Nie ', 'Xiao ', 'Bo ', 'Chi ', 'Qun ', 'Mou ', 'Shu ', 'Lang ', 'Yong ', 'Jiao ', 'Chou ', 'Qiao ', NULL, 'Ta ', + 0x10 => 'Jian ', 'Qi ', 'Wo ', 'Wei ', 'Zhuo ', 'Jie ', 'Ji ', 'Nie ', 'Ju ', 'Ju ', 'Lun ', 'Lu ', 'Leng ', 'Huai ', 'Ju ', 'Chi ', + 0x20 => 'Wan ', 'Quan ', 'Ti ', 'Bo ', 'Zu ', 'Qie ', 'Ji ', 'Cu ', 'Zong ', 'Cai ', 'Zong ', 'Peng ', 'Zhi ', 'Zheng ', 'Dian ', 'Zhi ', + 0x30 => 'Yu ', 'Duo ', 'Dun ', 'Chun ', 'Yong ', 'Zhong ', 'Di ', 'Zhe ', 'Chen ', 'Chuai ', 'Jian ', 'Gua ', 'Tang ', 'Ju ', 'Fu ', 'Zu ', + 0x40 => 'Die ', 'Pian ', 'Rou ', 'Nuo ', 'Ti ', 'Cha ', 'Tui ', 'Jian ', 'Dao ', 'Cuo ', 'Xi ', 'Ta ', 'Qiang ', 'Zhan ', 'Dian ', 'Ti ', + 0x50 => 'Ji ', 'Nie ', 'Man ', 'Liu ', 'Zhan ', 'Bi ', 'Chong ', 'Lu ', 'Liao ', 'Cu ', 'Tang ', 'Dai ', 'Suo ', 'Xi ', 'Kui ', 'Ji ', + 0x60 => 'Zhi ', 'Qiang ', 'Di ', 'Man ', 'Zong ', 'Lian ', 'Beng ', 'Zao ', 'Nian ', 'Bie ', 'Tui ', 'Ju ', 'Deng ', 'Ceng ', 'Xian ', 'Fan ', + 0x70 => 'Chu ', 'Zhong ', 'Dun ', 'Bo ', 'Cu ', 'Zu ', 'Jue ', 'Jue ', 'Lin ', 'Ta ', 'Qiao ', 'Qiao ', 'Pu ', 'Liao ', 'Dun ', 'Cuan ', + 0x80 => 'Kuang ', 'Zao ', 'Ta ', 'Bi ', 'Bi ', 'Zhu ', 'Ju ', 'Chu ', 'Qiao ', 'Dun ', 'Chou ', 'Ji ', 'Wu ', 'Yue ', 'Nian ', 'Lin ', + 0x90 => 'Lie ', 'Zhi ', 'Li ', 'Zhi ', 'Chan ', 'Chu ', 'Duan ', 'Wei ', 'Long ', 'Lin ', 'Xian ', 'Wei ', 'Zuan ', 'Lan ', 'Xie ', 'Rang ', + 0xA0 => 'Xie ', 'Nie ', 'Ta ', 'Qu ', 'Jie ', 'Cuan ', 'Zuan ', 'Xi ', 'Kui ', 'Jue ', 'Lin ', 'Shen ', 'Gong ', 'Dan ', 'Segare ', 'Qu ', + 0xB0 => 'Ti ', 'Duo ', 'Duo ', 'Gong ', 'Lang ', 'Nerau ', 'Luo ', 'Ai ', 'Ji ', 'Ju ', 'Tang ', 'Utsuke ', NULL, 'Yan ', 'Shitsuke ', 'Kang ', + 0xC0 => 'Qu ', 'Lou ', 'Lao ', 'Tuo ', 'Zhi ', 'Yagate ', 'Ti ', 'Dao ', 'Yagate ', 'Yu ', 'Che ', 'Ya ', 'Gui ', 'Jun ', 'Wei ', 'Yue ', + 0xD0 => 'Xin ', 'Di ', 'Xuan ', 'Fan ', 'Ren ', 'Shan ', 'Qiang ', 'Shu ', 'Tun ', 'Chen ', 'Dai ', 'E ', 'Na ', 'Qi ', 'Mao ', 'Ruan ', + 0xE0 => 'Ren ', 'Fan ', 'Zhuan ', 'Hong ', 'Hu ', 'Qu ', 'Huang ', 'Di ', 'Ling ', 'Dai ', 'Ao ', 'Zhen ', 'Fan ', 'Kuang ', 'Ang ', 'Peng ', + 0xF0 => 'Bei ', 'Gu ', 'Ku ', 'Pao ', 'Zhu ', 'Rong ', 'E ', 'Ba ', 'Zhou ', 'Zhi ', 'Yao ', 'Ke ', 'Yi ', 'Qing ', 'Shi ', 'Ping ', +); diff --git a/sources/resources/transliteration-data/x8f.php b/sources/resources/transliteration-data/x8f.php new file mode 100644 index 0000000..61c3b38 --- /dev/null +++ b/sources/resources/transliteration-data/x8f.php @@ -0,0 +1,20 @@ + 'Er ', 'Qiong ', 'Ju ', 'Jiao ', 'Guang ', 'Lu ', 'Kai ', 'Quan ', 'Zhou ', 'Zai ', 'Zhi ', 'She ', 'Liang ', 'Yu ', 'Shao ', 'You ', + 0x10 => 'Huan ', 'Yun ', 'Zhe ', 'Wan ', 'Fu ', 'Qing ', 'Zhou ', 'Ni ', 'Ling ', 'Zhe ', 'Zhan ', 'Liang ', 'Zi ', 'Hui ', 'Wang ', 'Chuo ', + 0x20 => 'Guo ', 'Kan ', 'Yi ', 'Peng ', 'Qian ', 'Gun ', 'Nian ', 'Pian ', 'Guan ', 'Bei ', 'Lun ', 'Pai ', 'Liang ', 'Ruan ', 'Rou ', 'Ji ', + 0x30 => 'Yang ', 'Xian ', 'Chuan ', 'Cou ', 'Qun ', 'Ge ', 'You ', 'Hong ', 'Shu ', 'Fu ', 'Zi ', 'Fu ', 'Wen ', 'Ben ', 'Zhan ', 'Yu ', + 0x40 => 'Wen ', 'Tao ', 'Gu ', 'Zhen ', 'Xia ', 'Yuan ', 'Lu ', 'Jiu ', 'Chao ', 'Zhuan ', 'Wei ', 'Hun ', 'Sori ', 'Che ', 'Jiao ', 'Zhan ', + 0x50 => 'Pu ', 'Lao ', 'Fen ', 'Fan ', 'Lin ', 'Ge ', 'Se ', 'Kan ', 'Huan ', 'Yi ', 'Ji ', 'Dui ', 'Er ', 'Yu ', 'Xian ', 'Hong ', + 0x60 => 'Lei ', 'Pei ', 'Li ', 'Li ', 'Lu ', 'Lin ', 'Che ', 'Ya ', 'Gui ', 'Xuan ', 'Di ', 'Ren ', 'Zhuan ', 'E ', 'Lun ', 'Ruan ', + 0x70 => 'Hong ', 'Ku ', 'Ke ', 'Lu ', 'Zhou ', 'Zhi ', 'Yi ', 'Hu ', 'Zhen ', 'Li ', 'Yao ', 'Qing ', 'Shi ', 'Zai ', 'Zhi ', 'Jiao ', + 0x80 => 'Zhou ', 'Quan ', 'Lu ', 'Jiao ', 'Zhe ', 'Fu ', 'Liang ', 'Nian ', 'Bei ', 'Hui ', 'Gun ', 'Wang ', 'Liang ', 'Chuo ', 'Zi ', 'Cou ', + 0x90 => 'Fu ', 'Ji ', 'Wen ', 'Shu ', 'Pei ', 'Yuan ', 'Xia ', 'Zhan ', 'Lu ', 'Che ', 'Lin ', 'Xin ', 'Gu ', 'Ci ', 'Ci ', 'Pi ', + 0xA0 => 'Zui ', 'Bian ', 'La ', 'La ', 'Ci ', 'Xue ', 'Ban ', 'Bian ', 'Bian ', 'Bian ', NULL, 'Bian ', 'Ban ', 'Ci ', 'Bian ', 'Bian ', + 0xB0 => 'Chen ', 'Ru ', 'Nong ', 'Nong ', 'Zhen ', 'Chuo ', 'Chuo ', 'Suberu ', 'Reng ', 'Bian ', 'Bian ', 'Sip ', 'Ip ', 'Liao ', 'Da ', 'Chan ', + 0xC0 => 'Gan ', 'Qian ', 'Yu ', 'Yu ', 'Qi ', 'Xun ', 'Yi ', 'Guo ', 'Mai ', 'Qi ', 'Za ', 'Wang ', 'Jia ', 'Zhun ', 'Ying ', 'Ti ', + 0xD0 => 'Yun ', 'Jin ', 'Hang ', 'Ya ', 'Fan ', 'Wu ', 'Da ', 'E ', 'Huan ', 'Zhe ', 'Totemo ', 'Jin ', 'Yuan ', 'Wei ', 'Lian ', 'Chi ', + 0xE0 => 'Che ', 'Ni ', 'Tiao ', 'Zhi ', 'Yi ', 'Jiong ', 'Jia ', 'Chen ', 'Dai ', 'Er ', 'Di ', 'Po ', 'Wang ', 'Die ', 'Ze ', 'Tao ', + 0xF0 => 'Shu ', 'Tuo ', 'Kep ', 'Jing ', 'Hui ', 'Tong ', 'You ', 'Mi ', 'Beng ', 'Ji ', 'Nai ', 'Yi ', 'Jie ', 'Zhui ', 'Lie ', 'Xun ', +); diff --git a/sources/resources/transliteration-data/x90.php b/sources/resources/transliteration-data/x90.php new file mode 100644 index 0000000..f19ec32 --- /dev/null +++ b/sources/resources/transliteration-data/x90.php @@ -0,0 +1,20 @@ + 'Tui ', 'Song ', 'Gua ', 'Tao ', 'Pang ', 'Hou ', 'Ni ', 'Dun ', 'Jiong ', 'Xuan ', 'Xun ', 'Bu ', 'You ', 'Xiao ', 'Qiu ', 'Tou ', + 0x10 => 'Zhu ', 'Qiu ', 'Di ', 'Di ', 'Tu ', 'Jing ', 'Ti ', 'Dou ', 'Yi ', 'Zhe ', 'Tong ', 'Guang ', 'Wu ', 'Shi ', 'Cheng ', 'Su ', + 0x20 => 'Zao ', 'Qun ', 'Feng ', 'Lian ', 'Suo ', 'Hui ', 'Li ', 'Sako ', 'Lai ', 'Ben ', 'Cuo ', 'Jue ', 'Beng ', 'Huan ', 'Dai ', 'Lu ', + 0x30 => 'You ', 'Zhou ', 'Jin ', 'Yu ', 'Chuo ', 'Kui ', 'Wei ', 'Ti ', 'Yi ', 'Da ', 'Yuan ', 'Luo ', 'Bi ', 'Nuo ', 'Yu ', 'Dang ', + 0x40 => 'Sui ', 'Dun ', 'Sui ', 'Yan ', 'Chuan ', 'Chi ', 'Ti ', 'Yu ', 'Shi ', 'Zhen ', 'You ', 'Yun ', 'E ', 'Bian ', 'Guo ', 'E ', + 0x50 => 'Xia ', 'Huang ', 'Qiu ', 'Dao ', 'Da ', 'Wei ', 'Appare ', 'Yi ', 'Gou ', 'Yao ', 'Chu ', 'Liu ', 'Xun ', 'Ta ', 'Di ', 'Chi ', + 0x60 => 'Yuan ', 'Su ', 'Ta ', 'Qian ', NULL, 'Yao ', 'Guan ', 'Zhang ', 'Ao ', 'Shi ', 'Ce ', 'Chi ', 'Su ', 'Zao ', 'Zhe ', 'Dun ', + 0x70 => 'Di ', 'Lou ', 'Chi ', 'Cuo ', 'Lin ', 'Zun ', 'Rao ', 'Qian ', 'Xuan ', 'Yu ', 'Yi ', 'Wu ', 'Liao ', 'Ju ', 'Shi ', 'Bi ', + 0x80 => 'Yao ', 'Mai ', 'Xie ', 'Sui ', 'Huan ', 'Zhan ', 'Teng ', 'Er ', 'Miao ', 'Bian ', 'Bian ', 'La ', 'Li ', 'Yuan ', 'Yao ', 'Luo ', + 0x90 => 'Li ', 'Yi ', 'Ting ', 'Deng ', 'Qi ', 'Yong ', 'Shan ', 'Han ', 'Yu ', 'Mang ', 'Ru ', 'Qiong ', NULL, 'Kuang ', 'Fu ', 'Kang ', + 0xA0 => 'Bin ', 'Fang ', 'Xing ', 'Na ', 'Xin ', 'Shen ', 'Bang ', 'Yuan ', 'Cun ', 'Huo ', 'Xie ', 'Bang ', 'Wu ', 'Ju ', 'You ', 'Han ', + 0xB0 => 'Tai ', 'Qiu ', 'Bi ', 'Pei ', 'Bing ', 'Shao ', 'Bei ', 'Wa ', 'Di ', 'Zou ', 'Ye ', 'Lin ', 'Kuang ', 'Gui ', 'Zhu ', 'Shi ', + 0xC0 => 'Ku ', 'Yu ', 'Gai ', 'Ge ', 'Xi ', 'Zhi ', 'Ji ', 'Xun ', 'Hou ', 'Xing ', 'Jiao ', 'Xi ', 'Gui ', 'Nuo ', 'Lang ', 'Jia ', + 0xD0 => 'Kuai ', 'Zheng ', 'Otoko ', 'Yun ', 'Yan ', 'Cheng ', 'Dou ', 'Chi ', 'Lu ', 'Fu ', 'Wu ', 'Fu ', 'Gao ', 'Hao ', 'Lang ', 'Jia ', + 0xE0 => 'Geng ', 'Jun ', 'Ying ', 'Bo ', 'Xi ', 'Bei ', 'Li ', 'Yun ', 'Bu ', 'Xiao ', 'Qi ', 'Pi ', 'Qing ', 'Guo ', 'Zhou ', 'Tan ', + 0xF0 => 'Zou ', 'Ping ', 'Lai ', 'Ni ', 'Chen ', 'You ', 'Bu ', 'Xiang ', 'Dan ', 'Ju ', 'Yong ', 'Qiao ', 'Yi ', 'Du ', 'Yan ', 'Mei ', +); diff --git a/sources/resources/transliteration-data/x91.php b/sources/resources/transliteration-data/x91.php new file mode 100644 index 0000000..ebf3974 --- /dev/null +++ b/sources/resources/transliteration-data/x91.php @@ -0,0 +1,20 @@ + 'Ruo ', 'Bei ', 'E ', 'Yu ', 'Juan ', 'Yu ', 'Yun ', 'Hou ', 'Kui ', 'Xiang ', 'Xiang ', 'Sou ', 'Tang ', 'Ming ', 'Xi ', 'Ru ', + 0x10 => 'Chu ', 'Zi ', 'Zou ', 'Ju ', 'Wu ', 'Xiang ', 'Yun ', 'Hao ', 'Yong ', 'Bi ', 'Mo ', 'Chao ', 'Fu ', 'Liao ', 'Yin ', 'Zhuan ', + 0x20 => 'Hu ', 'Qiao ', 'Yan ', 'Zhang ', 'Fan ', 'Qiao ', 'Xu ', 'Deng ', 'Bi ', 'Xin ', 'Bi ', 'Ceng ', 'Wei ', 'Zheng ', 'Mao ', 'Shan ', + 0x30 => 'Lin ', 'Po ', 'Dan ', 'Meng ', 'Ye ', 'Cao ', 'Kuai ', 'Feng ', 'Meng ', 'Zou ', 'Kuang ', 'Lian ', 'Zan ', 'Chan ', 'You ', 'Qi ', + 0x40 => 'Yan ', 'Chan ', 'Zan ', 'Ling ', 'Huan ', 'Xi ', 'Feng ', 'Zan ', 'Li ', 'You ', 'Ding ', 'Qiu ', 'Zhuo ', 'Pei ', 'Zhou ', 'Yi ', + 0x50 => 'Hang ', 'Yu ', 'Jiu ', 'Yan ', 'Zui ', 'Mao ', 'Dan ', 'Xu ', 'Tou ', 'Zhen ', 'Fen ', 'Sakenomoto ', NULL, 'Yun ', 'Tai ', 'Tian ', + 0x60 => 'Qia ', 'Tuo ', 'Zuo ', 'Han ', 'Gu ', 'Su ', 'Po ', 'Chou ', 'Zai ', 'Ming ', 'Luo ', 'Chuo ', 'Chou ', 'You ', 'Tong ', 'Zhi ', + 0x70 => 'Xian ', 'Jiang ', 'Cheng ', 'Yin ', 'Tu ', 'Xiao ', 'Mei ', 'Ku ', 'Suan ', 'Lei ', 'Pu ', 'Zui ', 'Hai ', 'Yan ', 'Xi ', 'Niang ', + 0x80 => 'Wei ', 'Lu ', 'Lan ', 'Yan ', 'Tao ', 'Pei ', 'Zhan ', 'Chun ', 'Tan ', 'Zui ', 'Chuo ', 'Cu ', 'Kun ', 'Ti ', 'Mian ', 'Du ', + 0x90 => 'Hu ', 'Xu ', 'Xing ', 'Tan ', 'Jiu ', 'Chun ', 'Yun ', 'Po ', 'Ke ', 'Sou ', 'Mi ', 'Quan ', 'Chou ', 'Cuo ', 'Yun ', 'Yong ', + 0xA0 => 'Ang ', 'Zha ', 'Hai ', 'Tang ', 'Jiang ', 'Piao ', 'Shan ', 'Yu ', 'Li ', 'Zao ', 'Lao ', 'Yi ', 'Jiang ', 'Pu ', 'Jiao ', 'Xi ', + 0xB0 => 'Tan ', 'Po ', 'Nong ', 'Yi ', 'Li ', 'Ju ', 'Jiao ', 'Yi ', 'Niang ', 'Ru ', 'Xun ', 'Chou ', 'Yan ', 'Ling ', 'Mi ', 'Mi ', + 0xC0 => 'Niang ', 'Xin ', 'Jiao ', 'Xi ', 'Mi ', 'Yan ', 'Bian ', 'Cai ', 'Shi ', 'You ', 'Shi ', 'Shi ', 'Li ', 'Chong ', 'Ye ', 'Liang ', + 0xD0 => 'Li ', 'Jin ', 'Jin ', 'Qiu ', 'Yi ', 'Diao ', 'Dao ', 'Zhao ', 'Ding ', 'Po ', 'Qiu ', 'He ', 'Fu ', 'Zhen ', 'Zhi ', 'Ba ', + 0xE0 => 'Luan ', 'Fu ', 'Nai ', 'Diao ', 'Shan ', 'Qiao ', 'Kou ', 'Chuan ', 'Zi ', 'Fan ', 'Yu ', 'Hua ', 'Han ', 'Gong ', 'Qi ', 'Mang ', + 0xF0 => 'Ri ', 'Di ', 'Si ', 'Xi ', 'Yi ', 'Chai ', 'Shi ', 'Tu ', 'Xi ', 'Nu ', 'Qian ', 'Ishiyumi ', 'Jian ', 'Pi ', 'Ye ', 'Yin ', +); diff --git a/sources/resources/transliteration-data/x92.php b/sources/resources/transliteration-data/x92.php new file mode 100644 index 0000000..873709d --- /dev/null +++ b/sources/resources/transliteration-data/x92.php @@ -0,0 +1,20 @@ + 'Ba ', 'Fang ', 'Chen ', 'Xing ', 'Tou ', 'Yue ', 'Yan ', 'Fu ', 'Pi ', 'Na ', 'Xin ', 'E ', 'Jue ', 'Dun ', 'Gou ', 'Yin ', + 0x10 => 'Qian ', 'Ban ', 'Ji ', 'Ren ', 'Chao ', 'Niu ', 'Fen ', 'Yun ', 'Ji ', 'Qin ', 'Pi ', 'Guo ', 'Hong ', 'Yin ', 'Jun ', 'Shi ', + 0x20 => 'Yi ', 'Zhong ', 'Nie ', 'Gai ', 'Ri ', 'Huo ', 'Tai ', 'Kang ', 'Habaki ', 'Irori ', 'Ngaak ', NULL, 'Duo ', 'Zi ', 'Ni ', 'Tu ', + 0x30 => 'Shi ', 'Min ', 'Gu ', 'E ', 'Ling ', 'Bing ', 'Yi ', 'Gu ', 'Ba ', 'Pi ', 'Yu ', 'Si ', 'Zuo ', 'Bu ', 'You ', 'Dian ', + 0x40 => 'Jia ', 'Zhen ', 'Shi ', 'Shi ', 'Tie ', 'Ju ', 'Zhan ', 'Shi ', 'She ', 'Xuan ', 'Zhao ', 'Bao ', 'He ', 'Bi ', 'Sheng ', 'Chu ', + 0x50 => 'Shi ', 'Bo ', 'Zhu ', 'Chi ', 'Za ', 'Po ', 'Tong ', 'Qian ', 'Fu ', 'Zhai ', 'Liu ', 'Qian ', 'Fu ', 'Li ', 'Yue ', 'Pi ', + 0x60 => 'Yang ', 'Ban ', 'Bo ', 'Jie ', 'Gou ', 'Shu ', 'Zheng ', 'Mu ', 'Ni ', 'Nie ', 'Di ', 'Jia ', 'Mu ', 'Dan ', 'Shen ', 'Yi ', + 0x70 => 'Si ', 'Kuang ', 'Ka ', 'Bei ', 'Jian ', 'Tong ', 'Xing ', 'Hong ', 'Jiao ', 'Chi ', 'Er ', 'Ge ', 'Bing ', 'Shi ', 'Mou ', 'Jia ', + 0x80 => 'Yin ', 'Jun ', 'Zhou ', 'Chong ', 'Shang ', 'Tong ', 'Mo ', 'Lei ', 'Ji ', 'Yu ', 'Xu ', 'Ren ', 'Zun ', 'Zhi ', 'Qiong ', 'Shan ', + 0x90 => 'Chi ', 'Xian ', 'Xing ', 'Quan ', 'Pi ', 'Tie ', 'Zhu ', 'Hou ', 'Ming ', 'Kua ', 'Yao ', 'Xian ', 'Xian ', 'Xiu ', 'Jun ', 'Cha ', + 0xA0 => 'Lao ', 'Ji ', 'Pi ', 'Ru ', 'Mi ', 'Yi ', 'Yin ', 'Guang ', 'An ', 'Diou ', 'You ', 'Se ', 'Kao ', 'Qian ', 'Luan ', 'Kasugai ', + 0xB0 => 'Ai ', 'Diao ', 'Han ', 'Rui ', 'Shi ', 'Keng ', 'Qiu ', 'Xiao ', 'Zhe ', 'Xiu ', 'Zang ', 'Ti ', 'Cuo ', 'Gua ', 'Gong ', 'Zhong ', + 0xC0 => 'Dou ', 'Lu ', 'Mei ', 'Lang ', 'Wan ', 'Xin ', 'Yun ', 'Bei ', 'Wu ', 'Su ', 'Yu ', 'Chan ', 'Ting ', 'Bo ', 'Han ', 'Jia ', + 0xD0 => 'Hong ', 'Cuan ', 'Feng ', 'Chan ', 'Wan ', 'Zhi ', 'Si ', 'Xuan ', 'Wu ', 'Wu ', 'Tiao ', 'Gong ', 'Zhuo ', 'Lue ', 'Xing ', 'Qian ', + 0xE0 => 'Shen ', 'Han ', 'Lue ', 'Xie ', 'Chu ', 'Zheng ', 'Ju ', 'Xian ', 'Tie ', 'Mang ', 'Pu ', 'Li ', 'Pan ', 'Rui ', 'Cheng ', 'Gao ', + 0xF0 => 'Li ', 'Te ', 'Pyeng ', 'Zhu ', NULL, 'Tu ', 'Liu ', 'Zui ', 'Ju ', 'Chang ', 'Yuan ', 'Jian ', 'Gang ', 'Diao ', 'Tao ', 'Chang ', +); diff --git a/sources/resources/transliteration-data/x93.php b/sources/resources/transliteration-data/x93.php new file mode 100644 index 0000000..e9291a9 --- /dev/null +++ b/sources/resources/transliteration-data/x93.php @@ -0,0 +1,20 @@ + 'Lun ', 'Kua ', 'Ling ', 'Bei ', 'Lu ', 'Li ', 'Qiang ', 'Pou ', 'Juan ', 'Min ', 'Zui ', 'Peng ', 'An ', 'Pi ', 'Xian ', 'Ya ', + 0x10 => 'Zhui ', 'Lei ', 'A ', 'Kong ', 'Ta ', 'Kun ', 'Du ', 'Wei ', 'Chui ', 'Zi ', 'Zheng ', 'Ben ', 'Nie ', 'Cong ', 'Qun ', 'Tan ', + 0x20 => 'Ding ', 'Qi ', 'Qian ', 'Zhuo ', 'Qi ', 'Yu ', 'Jin ', 'Guan ', 'Mao ', 'Chang ', 'Tian ', 'Xi ', 'Lian ', 'Tao ', 'Gu ', 'Cuo ', + 0x30 => 'Shu ', 'Zhen ', 'Lu ', 'Meng ', 'Lu ', 'Hua ', 'Biao ', 'Ga ', 'Lai ', 'Ken ', 'Kazari ', 'Bu ', 'Nai ', 'Wan ', 'Zan ', NULL, + 0x40 => 'De ', 'Xian ', NULL, 'Huo ', 'Liang ', NULL, 'Men ', 'Kai ', 'Ying ', 'Di ', 'Lian ', 'Guo ', 'Xian ', 'Du ', 'Tu ', 'Wei ', + 0x50 => 'Cong ', 'Fu ', 'Rou ', 'Ji ', 'E ', 'Rou ', 'Chen ', 'Ti ', 'Zha ', 'Hong ', 'Yang ', 'Duan ', 'Xia ', 'Yu ', 'Keng ', 'Xing ', + 0x60 => 'Huang ', 'Wei ', 'Fu ', 'Zhao ', 'Cha ', 'Qie ', 'She ', 'Hong ', 'Kui ', 'Tian ', 'Mou ', 'Qiao ', 'Qiao ', 'Hou ', 'Tou ', 'Cong ', + 0x70 => 'Huan ', 'Ye ', 'Min ', 'Jian ', 'Duan ', 'Jian ', 'Song ', 'Kui ', 'Hu ', 'Xuan ', 'Duo ', 'Jie ', 'Zhen ', 'Bian ', 'Zhong ', 'Zi ', + 0x80 => 'Xiu ', 'Ye ', 'Mei ', 'Pai ', 'Ai ', 'Jie ', NULL, 'Mei ', 'Chuo ', 'Ta ', 'Bang ', 'Xia ', 'Lian ', 'Suo ', 'Xi ', 'Liu ', + 0x90 => 'Zu ', 'Ye ', 'Nou ', 'Weng ', 'Rong ', 'Tang ', 'Suo ', 'Qiang ', 'Ge ', 'Shuo ', 'Chui ', 'Bo ', 'Pan ', 'Sa ', 'Bi ', 'Sang ', + 0xA0 => 'Gang ', 'Zi ', 'Wu ', 'Ying ', 'Huang ', 'Tiao ', 'Liu ', 'Kai ', 'Sun ', 'Sha ', 'Sou ', 'Wan ', 'Hao ', 'Zhen ', 'Zhen ', 'Luo ', + 0xB0 => 'Yi ', 'Yuan ', 'Tang ', 'Nie ', 'Xi ', 'Jia ', 'Ge ', 'Ma ', 'Juan ', 'Kasugai ', 'Habaki ', 'Suo ', NULL, NULL, NULL, 'Na ', + 0xC0 => 'Lu ', 'Suo ', 'Ou ', 'Zu ', 'Tuan ', 'Xiu ', 'Guan ', 'Xuan ', 'Lian ', 'Shou ', 'Ao ', 'Man ', 'Mo ', 'Luo ', 'Bi ', 'Wei ', + 0xD0 => 'Liu ', 'Di ', 'Qiao ', 'Cong ', 'Yi ', 'Lu ', 'Ao ', 'Keng ', 'Qiang ', 'Cui ', 'Qi ', 'Chang ', 'Tang ', 'Man ', 'Yong ', 'Chan ', + 0xE0 => 'Feng ', 'Jing ', 'Biao ', 'Shu ', 'Lou ', 'Xiu ', 'Cong ', 'Long ', 'Zan ', 'Jian ', 'Cao ', 'Li ', 'Xia ', 'Xi ', 'Kang ', NULL, + 0xF0 => 'Beng ', NULL, NULL, 'Zheng ', 'Lu ', 'Hua ', 'Ji ', 'Pu ', 'Hui ', 'Qiang ', 'Po ', 'Lin ', 'Suo ', 'Xiu ', 'San ', 'Cheng ', +); diff --git a/sources/resources/transliteration-data/x94.php b/sources/resources/transliteration-data/x94.php new file mode 100644 index 0000000..41d4c63 --- /dev/null +++ b/sources/resources/transliteration-data/x94.php @@ -0,0 +1,20 @@ + 'Kui ', 'Si ', 'Liu ', 'Nao ', 'Heng ', 'Pie ', 'Sui ', 'Fan ', 'Qiao ', 'Quan ', 'Yang ', 'Tang ', 'Xiang ', 'Jue ', 'Jiao ', 'Zun ', + 0x10 => 'Liao ', 'Jie ', 'Lao ', 'Dui ', 'Tan ', 'Zan ', 'Ji ', 'Jian ', 'Zhong ', 'Deng ', 'Ya ', 'Ying ', 'Dui ', 'Jue ', 'Nou ', 'Ti ', + 0x20 => 'Pu ', 'Tie ', NULL, NULL, 'Ding ', 'Shan ', 'Kai ', 'Jian ', 'Fei ', 'Sui ', 'Lu ', 'Juan ', 'Hui ', 'Yu ', 'Lian ', 'Zhuo ', + 0x30 => 'Qiao ', 'Qian ', 'Zhuo ', 'Lei ', 'Bi ', 'Tie ', 'Huan ', 'Ye ', 'Duo ', 'Guo ', 'Dang ', 'Ju ', 'Fen ', 'Da ', 'Bei ', 'Yi ', + 0x40 => 'Ai ', 'Zong ', 'Xun ', 'Diao ', 'Zhu ', 'Heng ', 'Zhui ', 'Ji ', 'Nie ', 'Ta ', 'Huo ', 'Qing ', 'Bin ', 'Ying ', 'Kui ', 'Ning ', + 0x50 => 'Xu ', 'Jian ', 'Jian ', 'Yari ', 'Cha ', 'Zhi ', 'Mie ', 'Li ', 'Lei ', 'Ji ', 'Zuan ', 'Kuang ', 'Shang ', 'Peng ', 'La ', 'Du ', + 0x60 => 'Shuo ', 'Chuo ', 'Lu ', 'Biao ', 'Bao ', 'Lu ', NULL, NULL, 'Long ', 'E ', 'Lu ', 'Xin ', 'Jian ', 'Lan ', 'Bo ', 'Jian ', + 0x70 => 'Yao ', 'Chan ', 'Xiang ', 'Jian ', 'Xi ', 'Guan ', 'Cang ', 'Nie ', 'Lei ', 'Cuan ', 'Qu ', 'Pan ', 'Luo ', 'Zuan ', 'Luan ', 'Zao ', + 0x80 => 'Nie ', 'Jue ', 'Tang ', 'Shu ', 'Lan ', 'Jin ', 'Qiu ', 'Yi ', 'Zhen ', 'Ding ', 'Zhao ', 'Po ', 'Diao ', 'Tu ', 'Qian ', 'Chuan ', + 0x90 => 'Shan ', 'Ji ', 'Fan ', 'Diao ', 'Men ', 'Nu ', 'Xi ', 'Chai ', 'Xing ', 'Gai ', 'Bu ', 'Tai ', 'Ju ', 'Dun ', 'Chao ', 'Zhong ', + 0xA0 => 'Na ', 'Bei ', 'Gang ', 'Ban ', 'Qian ', 'Yao ', 'Qin ', 'Jun ', 'Wu ', 'Gou ', 'Kang ', 'Fang ', 'Huo ', 'Tou ', 'Niu ', 'Ba ', + 0xB0 => 'Yu ', 'Qian ', 'Zheng ', 'Qian ', 'Gu ', 'Bo ', 'E ', 'Po ', 'Bu ', 'Ba ', 'Yue ', 'Zuan ', 'Mu ', 'Dan ', 'Jia ', 'Dian ', + 0xC0 => 'You ', 'Tie ', 'Bo ', 'Ling ', 'Shuo ', 'Qian ', 'Liu ', 'Bao ', 'Shi ', 'Xuan ', 'She ', 'Bi ', 'Ni ', 'Pi ', 'Duo ', 'Xing ', + 0xD0 => 'Kao ', 'Lao ', 'Er ', 'Mang ', 'Ya ', 'You ', 'Cheng ', 'Jia ', 'Ye ', 'Nao ', 'Zhi ', 'Dang ', 'Tong ', 'Lu ', 'Diao ', 'Yin ', + 0xE0 => 'Kai ', 'Zha ', 'Zhu ', 'Xian ', 'Ting ', 'Diu ', 'Xian ', 'Hua ', 'Quan ', 'Sha ', 'Jia ', 'Yao ', 'Ge ', 'Ming ', 'Zheng ', 'Se ', + 0xF0 => 'Jiao ', 'Yi ', 'Chan ', 'Chong ', 'Tang ', 'An ', 'Yin ', 'Ru ', 'Zhu ', 'Lao ', 'Pu ', 'Wu ', 'Lai ', 'Te ', 'Lian ', 'Keng ', +); diff --git a/sources/resources/transliteration-data/x95.php b/sources/resources/transliteration-data/x95.php new file mode 100644 index 0000000..d05d5ea --- /dev/null +++ b/sources/resources/transliteration-data/x95.php @@ -0,0 +1,20 @@ + 'Xiao ', 'Suo ', 'Li ', 'Zheng ', 'Chu ', 'Guo ', 'Gao ', 'Tie ', 'Xiu ', 'Cuo ', 'Lue ', 'Feng ', 'Xin ', 'Liu ', 'Kai ', 'Jian ', + 0x10 => 'Rui ', 'Ti ', 'Lang ', 'Qian ', 'Ju ', 'A ', 'Qiang ', 'Duo ', 'Tian ', 'Cuo ', 'Mao ', 'Ben ', 'Qi ', 'De ', 'Kua ', 'Kun ', + 0x20 => 'Chang ', 'Xi ', 'Gu ', 'Luo ', 'Chui ', 'Zhui ', 'Jin ', 'Zhi ', 'Xian ', 'Juan ', 'Huo ', 'Pou ', 'Tan ', 'Ding ', 'Jian ', 'Ju ', + 0x30 => 'Meng ', 'Zi ', 'Qie ', 'Ying ', 'Kai ', 'Qiang ', 'Song ', 'E ', 'Cha ', 'Qiao ', 'Zhong ', 'Duan ', 'Sou ', 'Huang ', 'Huan ', 'Ai ', + 0x40 => 'Du ', 'Mei ', 'Lou ', 'Zi ', 'Fei ', 'Mei ', 'Mo ', 'Zhen ', 'Bo ', 'Ge ', 'Nie ', 'Tang ', 'Juan ', 'Nie ', 'Na ', 'Liu ', + 0x50 => 'Hao ', 'Bang ', 'Yi ', 'Jia ', 'Bin ', 'Rong ', 'Biao ', 'Tang ', 'Man ', 'Luo ', 'Beng ', 'Yong ', 'Jing ', 'Di ', 'Zu ', 'Xuan ', + 0x60 => 'Liu ', 'Tan ', 'Jue ', 'Liao ', 'Pu ', 'Lu ', 'Dui ', 'Lan ', 'Pu ', 'Cuan ', 'Qiang ', 'Deng ', 'Huo ', 'Lei ', 'Huan ', 'Zhuo ', + 0x70 => 'Lian ', 'Yi ', 'Cha ', 'Biao ', 'La ', 'Chan ', 'Xiang ', 'Chang ', 'Chang ', 'Jiu ', 'Ao ', 'Die ', 'Qu ', 'Liao ', 'Mi ', 'Chang ', + 0x80 => 'Men ', 'Ma ', 'Shuan ', 'Shan ', 'Huo ', 'Men ', 'Yan ', 'Bi ', 'Han ', 'Bi ', 'San ', 'Kai ', 'Kang ', 'Beng ', 'Hong ', 'Run ', + 0x90 => 'San ', 'Xian ', 'Xian ', 'Jian ', 'Min ', 'Xia ', 'Yuru ', 'Dou ', 'Zha ', 'Nao ', 'Jian ', 'Peng ', 'Xia ', 'Ling ', 'Bian ', 'Bi ', + 0xA0 => 'Run ', 'He ', 'Guan ', 'Ge ', 'Ge ', 'Fa ', 'Chu ', 'Hong ', 'Gui ', 'Min ', 'Se ', 'Kun ', 'Lang ', 'Lu ', 'Ting ', 'Sha ', + 0xB0 => 'Ju ', 'Yue ', 'Yue ', 'Chan ', 'Qu ', 'Lin ', 'Chang ', 'Shai ', 'Kun ', 'Yan ', 'Min ', 'Yan ', 'E ', 'Hun ', 'Yu ', 'Wen ', + 0xC0 => 'Xiang ', 'Bao ', 'Xiang ', 'Qu ', 'Yao ', 'Wen ', 'Ban ', 'An ', 'Wei ', 'Yin ', 'Kuo ', 'Que ', 'Lan ', 'Du ', NULL, 'Phwung ', + 0xD0 => 'Tian ', 'Nie ', 'Ta ', 'Kai ', 'He ', 'Que ', 'Chuang ', 'Guan ', 'Dou ', 'Qi ', 'Kui ', 'Tang ', 'Guan ', 'Piao ', 'Kan ', 'Xi ', + 0xE0 => 'Hui ', 'Chan ', 'Pi ', 'Dang ', 'Huan ', 'Ta ', 'Wen ', NULL, 'Men ', 'Shuan ', 'Shan ', 'Yan ', 'Han ', 'Bi ', 'Wen ', 'Chuang ', + 0xF0 => 'Run ', 'Wei ', 'Xian ', 'Hong ', 'Jian ', 'Min ', 'Kang ', 'Men ', 'Zha ', 'Nao ', 'Gui ', 'Wen ', 'Ta ', 'Min ', 'Lu ', 'Kai ', +); diff --git a/sources/resources/transliteration-data/x96.php b/sources/resources/transliteration-data/x96.php new file mode 100644 index 0000000..c0926b1 --- /dev/null +++ b/sources/resources/transliteration-data/x96.php @@ -0,0 +1,20 @@ + 'Fa ', 'Ge ', 'He ', 'Kun ', 'Jiu ', 'Yue ', 'Lang ', 'Du ', 'Yu ', 'Yan ', 'Chang ', 'Xi ', 'Wen ', 'Hun ', 'Yan ', 'E ', + 0x10 => 'Chan ', 'Lan ', 'Qu ', 'Hui ', 'Kuo ', 'Que ', 'Ge ', 'Tian ', 'Ta ', 'Que ', 'Kan ', 'Huan ', 'Fu ', 'Fu ', 'Le ', 'Dui ', + 0x20 => 'Xin ', 'Qian ', 'Wu ', 'Yi ', 'Tuo ', 'Yin ', 'Yang ', 'Dou ', 'E ', 'Sheng ', 'Ban ', 'Pei ', 'Keng ', 'Yun ', 'Ruan ', 'Zhi ', + 0x30 => 'Pi ', 'Jing ', 'Fang ', 'Yang ', 'Yin ', 'Zhen ', 'Jie ', 'Cheng ', 'E ', 'Qu ', 'Di ', 'Zu ', 'Zuo ', 'Dian ', 'Ling ', 'A ', + 0x40 => 'Tuo ', 'Tuo ', 'Po ', 'Bing ', 'Fu ', 'Ji ', 'Lu ', 'Long ', 'Chen ', 'Xing ', 'Duo ', 'Lou ', 'Mo ', 'Jiang ', 'Shu ', 'Duo ', + 0x50 => 'Xian ', 'Er ', 'Gui ', 'Yu ', 'Gai ', 'Shan ', 'Xun ', 'Qiao ', 'Xing ', 'Chun ', 'Fu ', 'Bi ', 'Xia ', 'Shan ', 'Sheng ', 'Zhi ', + 0x60 => 'Pu ', 'Dou ', 'Yuan ', 'Zhen ', 'Chu ', 'Xian ', 'Tou ', 'Nie ', 'Yun ', 'Xian ', 'Pei ', 'Pei ', 'Zou ', 'Yi ', 'Dui ', 'Lun ', + 0x70 => 'Yin ', 'Ju ', 'Chui ', 'Chen ', 'Pi ', 'Ling ', 'Tao ', 'Xian ', 'Lu ', 'Sheng ', 'Xian ', 'Yin ', 'Zhu ', 'Yang ', 'Reng ', 'Shan ', + 0x80 => 'Chong ', 'Yan ', 'Yin ', 'Yu ', 'Ti ', 'Yu ', 'Long ', 'Wei ', 'Wei ', 'Nie ', 'Dui ', 'Sui ', 'An ', 'Huang ', 'Jie ', 'Sui ', + 0x90 => 'Yin ', 'Gai ', 'Yan ', 'Hui ', 'Ge ', 'Yun ', 'Wu ', 'Wei ', 'Ai ', 'Xi ', 'Tang ', 'Ji ', 'Zhang ', 'Dao ', 'Ao ', 'Xi ', + 0xA0 => 'Yin ', NULL, 'Rao ', 'Lin ', 'Tui ', 'Deng ', 'Pi ', 'Sui ', 'Sui ', 'Yu ', 'Xian ', 'Fen ', 'Ni ', 'Er ', 'Ji ', 'Dao ', + 0xB0 => 'Xi ', 'Yin ', 'E ', 'Hui ', 'Long ', 'Xi ', 'Li ', 'Li ', 'Li ', 'Zhui ', 'He ', 'Zhi ', 'Zhun ', 'Jun ', 'Nan ', 'Yi ', + 0xC0 => 'Que ', 'Yan ', 'Qian ', 'Ya ', 'Xiong ', 'Ya ', 'Ji ', 'Gu ', 'Huan ', 'Zhi ', 'Gou ', 'Jun ', 'Ci ', 'Yong ', 'Ju ', 'Chu ', + 0xD0 => 'Hu ', 'Za ', 'Luo ', 'Yu ', 'Chou ', 'Diao ', 'Sui ', 'Han ', 'Huo ', 'Shuang ', 'Guan ', 'Chu ', 'Za ', 'Yong ', 'Ji ', 'Xi ', + 0xE0 => 'Chou ', 'Liu ', 'Li ', 'Nan ', 'Xue ', 'Za ', 'Ji ', 'Ji ', 'Yu ', 'Yu ', 'Xue ', 'Na ', 'Fou ', 'Se ', 'Mu ', 'Wen ', + 0xF0 => 'Fen ', 'Pang ', 'Yun ', 'Li ', 'Li ', 'Ang ', 'Ling ', 'Lei ', 'An ', 'Bao ', 'Meng ', 'Dian ', 'Dang ', 'Xing ', 'Wu ', 'Zhao ', +); diff --git a/sources/resources/transliteration-data/x97.php b/sources/resources/transliteration-data/x97.php new file mode 100644 index 0000000..b9a38a1 --- /dev/null +++ b/sources/resources/transliteration-data/x97.php @@ -0,0 +1,20 @@ + 'Xu ', 'Ji ', 'Mu ', 'Chen ', 'Xiao ', 'Zha ', 'Ting ', 'Zhen ', 'Pei ', 'Mei ', 'Ling ', 'Qi ', 'Chou ', 'Huo ', 'Sha ', 'Fei ', + 0x10 => 'Weng ', 'Zhan ', 'Yin ', 'Ni ', 'Chou ', 'Tun ', 'Lin ', NULL, 'Dong ', 'Ying ', 'Wu ', 'Ling ', 'Shuang ', 'Ling ', 'Xia ', 'Hong ', + 0x20 => 'Yin ', 'Mo ', 'Mai ', 'Yun ', 'Liu ', 'Meng ', 'Bin ', 'Wu ', 'Wei ', 'Huo ', 'Yin ', 'Xi ', 'Yi ', 'Ai ', 'Dan ', 'Deng ', + 0x30 => 'Xian ', 'Yu ', 'Lu ', 'Long ', 'Dai ', 'Ji ', 'Pang ', 'Yang ', 'Ba ', 'Pi ', 'Wei ', NULL, 'Xi ', 'Ji ', 'Mai ', 'Meng ', + 0x40 => 'Meng ', 'Lei ', 'Li ', 'Huo ', 'Ai ', 'Fei ', 'Dai ', 'Long ', 'Ling ', 'Ai ', 'Feng ', 'Li ', 'Bao ', NULL, 'He ', 'He ', + 0x50 => 'Bing ', 'Qing ', 'Qing ', 'Jing ', 'Tian ', 'Zhen ', 'Jing ', 'Cheng ', 'Qing ', 'Jing ', 'Jing ', 'Dian ', 'Jing ', 'Tian ', 'Fei ', 'Fei ', + 0x60 => 'Kao ', 'Mi ', 'Mian ', 'Mian ', 'Pao ', 'Ye ', 'Tian ', 'Hui ', 'Ye ', 'Ge ', 'Ding ', 'Cha ', 'Jian ', 'Ren ', 'Di ', 'Du ', + 0x70 => 'Wu ', 'Ren ', 'Qin ', 'Jin ', 'Xue ', 'Niu ', 'Ba ', 'Yin ', 'Sa ', 'Na ', 'Mo ', 'Zu ', 'Da ', 'Ban ', 'Yi ', 'Yao ', + 0x80 => 'Tao ', 'Tuo ', 'Jia ', 'Hong ', 'Pao ', 'Yang ', 'Tomo ', 'Yin ', 'Jia ', 'Tao ', 'Ji ', 'Xie ', 'An ', 'An ', 'Hen ', 'Gong ', + 0x90 => 'Kohaze ', 'Da ', 'Qiao ', 'Ting ', 'Wan ', 'Ying ', 'Sui ', 'Tiao ', 'Qiao ', 'Xuan ', 'Kong ', 'Beng ', 'Ta ', 'Zhang ', 'Bing ', 'Kuo ', + 0xA0 => 'Ju ', 'La ', 'Xie ', 'Rou ', 'Bang ', 'Yi ', 'Qiu ', 'Qiu ', 'He ', 'Xiao ', 'Mu ', 'Ju ', 'Jian ', 'Bian ', 'Di ', 'Jian ', + 0xB0 => 'On ', 'Tao ', 'Gou ', 'Ta ', 'Bei ', 'Xie ', 'Pan ', 'Ge ', 'Bi ', 'Kuo ', 'Tang ', 'Lou ', 'Gui ', 'Qiao ', 'Xue ', 'Ji ', + 0xC0 => 'Jian ', 'Jiang ', 'Chan ', 'Da ', 'Huo ', 'Xian ', 'Qian ', 'Du ', 'Wa ', 'Jian ', 'Lan ', 'Wei ', 'Ren ', 'Fu ', 'Mei ', 'Juan ', + 0xD0 => 'Ge ', 'Wei ', 'Qiao ', 'Han ', 'Chang ', NULL, 'Rou ', 'Xun ', 'She ', 'Wei ', 'Ge ', 'Bei ', 'Tao ', 'Gou ', 'Yun ', NULL, + 0xE0 => 'Bi ', 'Wei ', 'Hui ', 'Du ', 'Wa ', 'Du ', 'Wei ', 'Ren ', 'Fu ', 'Han ', 'Wei ', 'Yun ', 'Tao ', 'Jiu ', 'Jiu ', 'Xian ', + 0xF0 => 'Xie ', 'Xian ', 'Ji ', 'Yin ', 'Za ', 'Yun ', 'Shao ', 'Le ', 'Peng ', 'Heng ', 'Ying ', 'Yun ', 'Peng ', 'Yin ', 'Yin ', 'Xiang ', +); diff --git a/sources/resources/transliteration-data/x98.php b/sources/resources/transliteration-data/x98.php new file mode 100644 index 0000000..e859244 --- /dev/null +++ b/sources/resources/transliteration-data/x98.php @@ -0,0 +1,20 @@ + 'Hu ', 'Ye ', 'Ding ', 'Qing ', 'Pan ', 'Xiang ', 'Shun ', 'Han ', 'Xu ', 'Yi ', 'Xu ', 'Gu ', 'Song ', 'Kui ', 'Qi ', 'Hang ', + 0x10 => 'Yu ', 'Wan ', 'Ban ', 'Dun ', 'Di ', 'Dan ', 'Pan ', 'Po ', 'Ling ', 'Ce ', 'Jing ', 'Lei ', 'He ', 'Qiao ', 'E ', 'E ', + 0x20 => 'Wei ', 'Jie ', 'Gua ', 'Shen ', 'Yi ', 'Shen ', 'Hai ', 'Dui ', 'Pian ', 'Ping ', 'Lei ', 'Fu ', 'Jia ', 'Tou ', 'Hui ', 'Kui ', + 0x30 => 'Jia ', 'Le ', 'Tian ', 'Cheng ', 'Ying ', 'Jun ', 'Hu ', 'Han ', 'Jing ', 'Tui ', 'Tui ', 'Pin ', 'Lai ', 'Tui ', 'Zi ', 'Zi ', + 0x40 => 'Chui ', 'Ding ', 'Lai ', 'Yan ', 'Han ', 'Jian ', 'Ke ', 'Cui ', 'Jiong ', 'Qin ', 'Yi ', 'Sai ', 'Ti ', 'E ', 'E ', 'Yan ', + 0x50 => 'Hun ', 'Kan ', 'Yong ', 'Zhuan ', 'Yan ', 'Xian ', 'Xin ', 'Yi ', 'Yuan ', 'Sang ', 'Dian ', 'Dian ', 'Jiang ', 'Ku ', 'Lei ', 'Liao ', + 0x60 => 'Piao ', 'Yi ', 'Man ', 'Qi ', 'Rao ', 'Hao ', 'Qiao ', 'Gu ', 'Xun ', 'Qian ', 'Hui ', 'Zhan ', 'Ru ', 'Hong ', 'Bin ', 'Xian ', + 0x70 => 'Pin ', 'Lu ', 'Lan ', 'Nie ', 'Quan ', 'Ye ', 'Ding ', 'Qing ', 'Han ', 'Xiang ', 'Shun ', 'Xu ', 'Xu ', 'Wan ', 'Gu ', 'Dun ', + 0x80 => 'Qi ', 'Ban ', 'Song ', 'Hang ', 'Yu ', 'Lu ', 'Ling ', 'Po ', 'Jing ', 'Jie ', 'Jia ', 'Tian ', 'Han ', 'Ying ', 'Jiong ', 'Hai ', + 0x90 => 'Yi ', 'Pin ', 'Hui ', 'Tui ', 'Han ', 'Ying ', 'Ying ', 'Ke ', 'Ti ', 'Yong ', 'E ', 'Zhuan ', 'Yan ', 'E ', 'Nie ', 'Man ', + 0xA0 => 'Dian ', 'Sang ', 'Hao ', 'Lei ', 'Zhan ', 'Ru ', 'Pin ', 'Quan ', 'Feng ', 'Biao ', 'Oroshi ', 'Fu ', 'Xia ', 'Zhan ', 'Biao ', 'Sa ', + 0xB0 => 'Ba ', 'Tai ', 'Lie ', 'Gua ', 'Xuan ', 'Shao ', 'Ju ', 'Bi ', 'Si ', 'Wei ', 'Yang ', 'Yao ', 'Sou ', 'Kai ', 'Sao ', 'Fan ', + 0xC0 => 'Liu ', 'Xi ', 'Liao ', 'Piao ', 'Piao ', 'Liu ', 'Biao ', 'Biao ', 'Biao ', 'Liao ', NULL, 'Se ', 'Feng ', 'Biao ', 'Feng ', 'Yang ', + 0xD0 => 'Zhan ', 'Biao ', 'Sa ', 'Ju ', 'Si ', 'Sou ', 'Yao ', 'Liu ', 'Piao ', 'Biao ', 'Biao ', 'Fei ', 'Fan ', 'Fei ', 'Fei ', 'Shi ', + 0xE0 => 'Shi ', 'Can ', 'Ji ', 'Ding ', 'Si ', 'Tuo ', 'Zhan ', 'Sun ', 'Xiang ', 'Tun ', 'Ren ', 'Yu ', 'Juan ', 'Chi ', 'Yin ', 'Fan ', + 0xF0 => 'Fan ', 'Sun ', 'Yin ', 'Zhu ', 'Yi ', 'Zhai ', 'Bi ', 'Jie ', 'Tao ', 'Liu ', 'Ci ', 'Tie ', 'Si ', 'Bao ', 'Shi ', 'Duo ', +); diff --git a/sources/resources/transliteration-data/x99.php b/sources/resources/transliteration-data/x99.php new file mode 100644 index 0000000..f854635 --- /dev/null +++ b/sources/resources/transliteration-data/x99.php @@ -0,0 +1,20 @@ + 'Hai ', 'Ren ', 'Tian ', 'Jiao ', 'Jia ', 'Bing ', 'Yao ', 'Tong ', 'Ci ', 'Xiang ', 'Yang ', 'Yang ', 'Er ', 'Yan ', 'Le ', 'Yi ', + 0x10 => 'Can ', 'Bo ', 'Nei ', 'E ', 'Bu ', 'Jun ', 'Dou ', 'Su ', 'Yu ', 'Shi ', 'Yao ', 'Hun ', 'Guo ', 'Shi ', 'Jian ', 'Zhui ', + 0x20 => 'Bing ', 'Xian ', 'Bu ', 'Ye ', 'Tan ', 'Fei ', 'Zhang ', 'Wei ', 'Guan ', 'E ', 'Nuan ', 'Hun ', 'Hu ', 'Huang ', 'Tie ', 'Hui ', + 0x30 => 'Jian ', 'Hou ', 'He ', 'Xing ', 'Fen ', 'Wei ', 'Gu ', 'Cha ', 'Song ', 'Tang ', 'Bo ', 'Gao ', 'Xi ', 'Kui ', 'Liu ', 'Sou ', + 0x40 => 'Tao ', 'Ye ', 'Yun ', 'Mo ', 'Tang ', 'Man ', 'Bi ', 'Yu ', 'Xiu ', 'Jin ', 'San ', 'Kui ', 'Zhuan ', 'Shan ', 'Chi ', 'Dan ', + 0x50 => 'Yi ', 'Ji ', 'Rao ', 'Cheng ', 'Yong ', 'Tao ', 'Hui ', 'Xiang ', 'Zhan ', 'Fen ', 'Hai ', 'Meng ', 'Yan ', 'Mo ', 'Chan ', 'Xiang ', + 0x60 => 'Luo ', 'Zuan ', 'Nang ', 'Shi ', 'Ding ', 'Ji ', 'Tuo ', 'Xing ', 'Tun ', 'Xi ', 'Ren ', 'Yu ', 'Chi ', 'Fan ', 'Yin ', 'Jian ', + 0x70 => 'Shi ', 'Bao ', 'Si ', 'Duo ', 'Yi ', 'Er ', 'Rao ', 'Xiang ', 'Jia ', 'Le ', 'Jiao ', 'Yi ', 'Bing ', 'Bo ', 'Dou ', 'E ', + 0x80 => 'Yu ', 'Nei ', 'Jun ', 'Guo ', 'Hun ', 'Xian ', 'Guan ', 'Cha ', 'Kui ', 'Gu ', 'Sou ', 'Chan ', 'Ye ', 'Mo ', 'Bo ', 'Liu ', + 0x90 => 'Xiu ', 'Jin ', 'Man ', 'San ', 'Zhuan ', 'Nang ', 'Shou ', 'Kui ', 'Guo ', 'Xiang ', 'Fen ', 'Ba ', 'Ni ', 'Bi ', 'Bo ', 'Tu ', + 0xA0 => 'Han ', 'Fei ', 'Jian ', 'An ', 'Ai ', 'Fu ', 'Xian ', 'Wen ', 'Xin ', 'Fen ', 'Bin ', 'Xing ', 'Ma ', 'Yu ', 'Feng ', 'Han ', + 0xB0 => 'Di ', 'Tuo ', 'Tuo ', 'Chi ', 'Xun ', 'Zhu ', 'Zhi ', 'Pei ', 'Xin ', 'Ri ', 'Sa ', 'Yin ', 'Wen ', 'Zhi ', 'Dan ', 'Lu ', + 0xC0 => 'You ', 'Bo ', 'Bao ', 'Kuai ', 'Tuo ', 'Yi ', 'Qu ', NULL, 'Qu ', 'Jiong ', 'Bo ', 'Zhao ', 'Yuan ', 'Peng ', 'Zhou ', 'Ju ', + 0xD0 => 'Zhu ', 'Nu ', 'Ju ', 'Pi ', 'Zang ', 'Jia ', 'Ling ', 'Zhen ', 'Tai ', 'Fu ', 'Yang ', 'Shi ', 'Bi ', 'Tuo ', 'Tuo ', 'Si ', + 0xE0 => 'Liu ', 'Ma ', 'Pian ', 'Tao ', 'Zhi ', 'Rong ', 'Teng ', 'Dong ', 'Xun ', 'Quan ', 'Shen ', 'Jiong ', 'Er ', 'Hai ', 'Bo ', 'Zhu ', + 0xF0 => 'Yin ', 'Luo ', 'Shuu ', 'Dan ', 'Xie ', 'Liu ', 'Ju ', 'Song ', 'Qin ', 'Mang ', 'Liang ', 'Han ', 'Tu ', 'Xuan ', 'Tui ', 'Jun ', +); diff --git a/sources/resources/transliteration-data/x9a.php b/sources/resources/transliteration-data/x9a.php new file mode 100644 index 0000000..62a8956 --- /dev/null +++ b/sources/resources/transliteration-data/x9a.php @@ -0,0 +1,20 @@ + 'E ', 'Cheng ', 'Xin ', 'Ai ', 'Lu ', 'Zhui ', 'Zhou ', 'She ', 'Pian ', 'Kun ', 'Tao ', 'Lai ', 'Zong ', 'Ke ', 'Qi ', 'Qi ', + 0x10 => 'Yan ', 'Fei ', 'Sao ', 'Yan ', 'Jie ', 'Yao ', 'Wu ', 'Pian ', 'Cong ', 'Pian ', 'Qian ', 'Fei ', 'Huang ', 'Jian ', 'Huo ', 'Yu ', + 0x20 => 'Ti ', 'Quan ', 'Xia ', 'Zong ', 'Kui ', 'Rou ', 'Si ', 'Gua ', 'Tuo ', 'Kui ', 'Sou ', 'Qian ', 'Cheng ', 'Zhi ', 'Liu ', 'Pang ', + 0x30 => 'Teng ', 'Xi ', 'Cao ', 'Du ', 'Yan ', 'Yuan ', 'Zou ', 'Sao ', 'Shan ', 'Li ', 'Zhi ', 'Shuang ', 'Lu ', 'Xi ', 'Luo ', 'Zhang ', + 0x40 => 'Mo ', 'Ao ', 'Can ', 'Piao ', 'Cong ', 'Qu ', 'Bi ', 'Zhi ', 'Yu ', 'Xu ', 'Hua ', 'Bo ', 'Su ', 'Xiao ', 'Lin ', 'Chan ', + 0x50 => 'Dun ', 'Liu ', 'Tuo ', 'Zeng ', 'Tan ', 'Jiao ', 'Tie ', 'Yan ', 'Luo ', 'Zhan ', 'Jing ', 'Yi ', 'Ye ', 'Tuo ', 'Bin ', 'Zou ', + 0x60 => 'Yan ', 'Peng ', 'Lu ', 'Teng ', 'Xiang ', 'Ji ', 'Shuang ', 'Ju ', 'Xi ', 'Huan ', 'Li ', 'Biao ', 'Ma ', 'Yu ', 'Tuo ', 'Xun ', + 0x70 => 'Chi ', 'Qu ', 'Ri ', 'Bo ', 'Lu ', 'Zang ', 'Shi ', 'Si ', 'Fu ', 'Ju ', 'Zou ', 'Zhu ', 'Tuo ', 'Nu ', 'Jia ', 'Yi ', + 0x80 => 'Tai ', 'Xiao ', 'Ma ', 'Yin ', 'Jiao ', 'Hua ', 'Luo ', 'Hai ', 'Pian ', 'Biao ', 'Li ', 'Cheng ', 'Yan ', 'Xin ', 'Qin ', 'Jun ', + 0x90 => 'Qi ', 'Qi ', 'Ke ', 'Zhui ', 'Zong ', 'Su ', 'Can ', 'Pian ', 'Zhi ', 'Kui ', 'Sao ', 'Wu ', 'Ao ', 'Liu ', 'Qian ', 'Shan ', + 0xA0 => 'Piao ', 'Luo ', 'Cong ', 'Chan ', 'Zou ', 'Ji ', 'Shuang ', 'Xiang ', 'Gu ', 'Wei ', 'Wei ', 'Wei ', 'Yu ', 'Gan ', 'Yi ', 'Ang ', + 0xB0 => 'Tou ', 'Xie ', 'Bao ', 'Bi ', 'Chi ', 'Ti ', 'Di ', 'Ku ', 'Hai ', 'Qiao ', 'Gou ', 'Kua ', 'Ge ', 'Tui ', 'Geng ', 'Pian ', + 0xC0 => 'Bi ', 'Ke ', 'Ka ', 'Yu ', 'Sui ', 'Lou ', 'Bo ', 'Xiao ', 'Pang ', 'Bo ', 'Ci ', 'Kuan ', 'Bin ', 'Mo ', 'Liao ', 'Lou ', + 0xD0 => 'Nao ', 'Du ', 'Zang ', 'Sui ', 'Ti ', 'Bin ', 'Kuan ', 'Lu ', 'Gao ', 'Gao ', 'Qiao ', 'Kao ', 'Qiao ', 'Lao ', 'Zao ', 'Biao ', + 0xE0 => 'Kun ', 'Kun ', 'Ti ', 'Fang ', 'Xiu ', 'Ran ', 'Mao ', 'Dan ', 'Kun ', 'Bin ', 'Fa ', 'Tiao ', 'Peng ', 'Zi ', 'Fa ', 'Ran ', + 0xF0 => 'Ti ', 'Pao ', 'Pi ', 'Mao ', 'Fu ', 'Er ', 'Rong ', 'Qu ', 'Gong ', 'Xiu ', 'Gua ', 'Ji ', 'Peng ', 'Zhua ', 'Shao ', 'Sha ', +); diff --git a/sources/resources/transliteration-data/x9b.php b/sources/resources/transliteration-data/x9b.php new file mode 100644 index 0000000..512afc5 --- /dev/null +++ b/sources/resources/transliteration-data/x9b.php @@ -0,0 +1,20 @@ + 'Ti ', 'Li ', 'Bin ', 'Zong ', 'Ti ', 'Peng ', 'Song ', 'Zheng ', 'Quan ', 'Zong ', 'Shun ', 'Jian ', 'Duo ', 'Hu ', 'La ', 'Jiu ', + 0x10 => 'Qi ', 'Lian ', 'Zhen ', 'Bin ', 'Peng ', 'Mo ', 'San ', 'Man ', 'Man ', 'Seng ', 'Xu ', 'Lie ', 'Qian ', 'Qian ', 'Nong ', 'Huan ', + 0x20 => 'Kuai ', 'Ning ', 'Bin ', 'Lie ', 'Rang ', 'Dou ', 'Dou ', 'Nao ', 'Hong ', 'Xi ', 'Dou ', 'Han ', 'Dou ', 'Dou ', 'Jiu ', 'Chang ', + 0x30 => 'Yu ', 'Yu ', 'Li ', 'Juan ', 'Fu ', 'Qian ', 'Gui ', 'Zong ', 'Liu ', 'Gui ', 'Shang ', 'Yu ', 'Gui ', 'Mei ', 'Ji ', 'Qi ', + 0x40 => 'Jie ', 'Kui ', 'Hun ', 'Ba ', 'Po ', 'Mei ', 'Xu ', 'Yan ', 'Xiao ', 'Liang ', 'Yu ', 'Tui ', 'Qi ', 'Wang ', 'Liang ', 'Wei ', + 0x50 => 'Jian ', 'Chi ', 'Piao ', 'Bi ', 'Mo ', 'Ji ', 'Xu ', 'Chou ', 'Yan ', 'Zhan ', 'Yu ', 'Dao ', 'Ren ', 'Ji ', 'Eri ', 'Gong ', + 0x60 => 'Tuo ', 'Diao ', 'Ji ', 'Xu ', 'E ', 'E ', 'Sha ', 'Hang ', 'Tun ', 'Mo ', 'Jie ', 'Shen ', 'Fan ', 'Yuan ', 'Bi ', 'Lu ', + 0x70 => 'Wen ', 'Hu ', 'Lu ', 'Za ', 'Fang ', 'Fen ', 'Na ', 'You ', 'Namazu ', 'Todo ', 'He ', 'Xia ', 'Qu ', 'Han ', 'Pi ', 'Ling ', + 0x80 => 'Tuo ', 'Bo ', 'Qiu ', 'Ping ', 'Fu ', 'Bi ', 'Ji ', 'Wei ', 'Ju ', 'Diao ', 'Bo ', 'You ', 'Gun ', 'Pi ', 'Nian ', 'Xing ', + 0x90 => 'Tai ', 'Bao ', 'Fu ', 'Zha ', 'Ju ', 'Gu ', 'Kajika ', 'Tong ', NULL, 'Ta ', 'Jie ', 'Shu ', 'Hou ', 'Xiang ', 'Er ', 'An ', + 0xA0 => 'Wei ', 'Tiao ', 'Zhu ', 'Yin ', 'Lie ', 'Luo ', 'Tong ', 'Yi ', 'Qi ', 'Bing ', 'Wei ', 'Jiao ', 'Bu ', 'Gui ', 'Xian ', 'Ge ', + 0xB0 => 'Hui ', 'Bora ', 'Mate ', 'Kao ', 'Gori ', 'Duo ', 'Jun ', 'Ti ', 'Man ', 'Xiao ', 'Za ', 'Sha ', 'Qin ', 'Yu ', 'Nei ', 'Zhe ', + 0xC0 => 'Gun ', 'Geng ', 'Su ', 'Wu ', 'Qiu ', 'Ting ', 'Fu ', 'Wan ', 'You ', 'Li ', 'Sha ', 'Sha ', 'Gao ', 'Meng ', 'Ugui ', 'Asari ', + 0xD0 => 'Subashiri ', 'Kazunoko ', 'Yong ', 'Ni ', 'Zi ', 'Qi ', 'Qing ', 'Xiang ', 'Nei ', 'Chun ', 'Ji ', 'Diao ', 'Qie ', 'Gu ', 'Zhou ', 'Dong ', + 0xE0 => 'Lai ', 'Fei ', 'Ni ', 'Yi ', 'Kun ', 'Lu ', 'Jiu ', 'Chang ', 'Jing ', 'Lun ', 'Ling ', 'Zou ', 'Li ', 'Meng ', 'Zong ', 'Zhi ', + 0xF0 => 'Nian ', 'Shachi ', 'Dojou ', 'Sukesou ', 'Shi ', 'Shen ', 'Hun ', 'Shi ', 'Hou ', 'Xing ', 'Zhu ', 'La ', 'Zong ', 'Ji ', 'Bian ', 'Bian ', +); diff --git a/sources/resources/transliteration-data/x9c.php b/sources/resources/transliteration-data/x9c.php new file mode 100644 index 0000000..8bf1a03 --- /dev/null +++ b/sources/resources/transliteration-data/x9c.php @@ -0,0 +1,20 @@ + 'Huan ', 'Quan ', 'Ze ', 'Wei ', 'Wei ', 'Yu ', 'Qun ', 'Rou ', 'Die ', 'Huang ', 'Lian ', 'Yan ', 'Qiu ', 'Qiu ', 'Jian ', 'Bi ', + 0x10 => 'E ', 'Yang ', 'Fu ', 'Sai ', 'Jian ', 'Xia ', 'Tuo ', 'Hu ', 'Muroaji ', 'Ruo ', 'Haraka ', 'Wen ', 'Jian ', 'Hao ', 'Wu ', 'Fang ', + 0x20 => 'Sao ', 'Liu ', 'Ma ', 'Shi ', 'Shi ', 'Yin ', 'Z ', 'Teng ', 'Ta ', 'Yao ', 'Ge ', 'Rong ', 'Qian ', 'Qi ', 'Wen ', 'Ruo ', + 0x30 => 'Hatahata ', 'Lian ', 'Ao ', 'Le ', 'Hui ', 'Min ', 'Ji ', 'Tiao ', 'Qu ', 'Jian ', 'Sao ', 'Man ', 'Xi ', 'Qiu ', 'Biao ', 'Ji ', + 0x40 => 'Ji ', 'Zhu ', 'Jiang ', 'Qiu ', 'Zhuan ', 'Yong ', 'Zhang ', 'Kang ', 'Xue ', 'Bie ', 'Jue ', 'Qu ', 'Xiang ', 'Bo ', 'Jiao ', 'Xun ', + 0x50 => 'Su ', 'Huang ', 'Zun ', 'Shan ', 'Shan ', 'Fan ', 'Jue ', 'Lin ', 'Xun ', 'Miao ', 'Xi ', 'Eso ', 'Kyou ', 'Fen ', 'Guan ', 'Hou ', + 0x60 => 'Kuai ', 'Zei ', 'Sao ', 'Zhan ', 'Gan ', 'Gui ', 'Sheng ', 'Li ', 'Chang ', 'Hatahata ', 'Shiira ', 'Mutsu ', 'Ru ', 'Ji ', 'Xu ', 'Huo ', + 0x70 => 'Shiira ', 'Li ', 'Lie ', 'Li ', 'Mie ', 'Zhen ', 'Xiang ', 'E ', 'Lu ', 'Guan ', 'Li ', 'Xian ', 'Yu ', 'Dao ', 'Ji ', 'You ', + 0x80 => 'Tun ', 'Lu ', 'Fang ', 'Ba ', 'He ', 'Bo ', 'Ping ', 'Nian ', 'Lu ', 'You ', 'Zha ', 'Fu ', 'Bo ', 'Bao ', 'Hou ', 'Pi ', + 0x90 => 'Tai ', 'Gui ', 'Jie ', 'Kao ', 'Wei ', 'Er ', 'Tong ', 'Ze ', 'Hou ', 'Kuai ', 'Ji ', 'Jiao ', 'Xian ', 'Za ', 'Xiang ', 'Xun ', + 0xA0 => 'Geng ', 'Li ', 'Lian ', 'Jian ', 'Li ', 'Shi ', 'Tiao ', 'Gun ', 'Sha ', 'Wan ', 'Jun ', 'Ji ', 'Yong ', 'Qing ', 'Ling ', 'Qi ', + 0xB0 => 'Zou ', 'Fei ', 'Kun ', 'Chang ', 'Gu ', 'Ni ', 'Nian ', 'Diao ', 'Jing ', 'Shen ', 'Shi ', 'Zi ', 'Fen ', 'Die ', 'Bi ', 'Chang ', + 0xC0 => 'Shi ', 'Wen ', 'Wei ', 'Sai ', 'E ', 'Qiu ', 'Fu ', 'Huang ', 'Quan ', 'Jiang ', 'Bian ', 'Sao ', 'Ao ', 'Qi ', 'Ta ', 'Yin ', + 0xD0 => 'Yao ', 'Fang ', 'Jian ', 'Le ', 'Biao ', 'Xue ', 'Bie ', 'Man ', 'Min ', 'Yong ', 'Wei ', 'Xi ', 'Jue ', 'Shan ', 'Lin ', 'Zun ', + 0xE0 => 'Huo ', 'Gan ', 'Li ', 'Zhan ', 'Guan ', 'Niao ', 'Yi ', 'Fu ', 'Li ', 'Jiu ', 'Bu ', 'Yan ', 'Fu ', 'Diao ', 'Ji ', 'Feng ', + 0xF0 => 'Nio ', 'Gan ', 'Shi ', 'Feng ', 'Ming ', 'Bao ', 'Yuan ', 'Zhi ', 'Hu ', 'Qin ', 'Fu ', 'Fen ', 'Wen ', 'Jian ', 'Shi ', 'Yu ', +); diff --git a/sources/resources/transliteration-data/x9d.php b/sources/resources/transliteration-data/x9d.php new file mode 100644 index 0000000..9640e37 --- /dev/null +++ b/sources/resources/transliteration-data/x9d.php @@ -0,0 +1,20 @@ + 'Fou ', 'Yiao ', 'Jue ', 'Jue ', 'Pi ', 'Huan ', 'Zhen ', 'Bao ', 'Yan ', 'Ya ', 'Zheng ', 'Fang ', 'Feng ', 'Wen ', 'Ou ', 'Te ', + 0x10 => 'Jia ', 'Nu ', 'Ling ', 'Mie ', 'Fu ', 'Tuo ', 'Wen ', 'Li ', 'Bian ', 'Zhi ', 'Ge ', 'Yuan ', 'Zi ', 'Qu ', 'Xiao ', 'Zhi ', + 0x20 => 'Dan ', 'Ju ', 'You ', 'Gu ', 'Zhong ', 'Yu ', 'Yang ', 'Rong ', 'Ya ', 'Tie ', 'Yu ', 'Shigi ', 'Ying ', 'Zhui ', 'Wu ', 'Er ', + 0x30 => 'Gua ', 'Ai ', 'Zhi ', 'Yan ', 'Heng ', 'Jiao ', 'Ji ', 'Lie ', 'Zhu ', 'Ren ', 'Yi ', 'Hong ', 'Luo ', 'Ru ', 'Mou ', 'Ge ', + 0x40 => 'Ren ', 'Jiao ', 'Xiu ', 'Zhou ', 'Zhi ', 'Luo ', 'Chidori ', 'Toki ', 'Ten ', 'Luan ', 'Jia ', 'Ji ', 'Yu ', 'Huan ', 'Tuo ', 'Bu ', + 0x50 => 'Wu ', 'Juan ', 'Yu ', 'Bo ', 'Xun ', 'Xun ', 'Bi ', 'Xi ', 'Jun ', 'Ju ', 'Tu ', 'Jing ', 'Ti ', 'E ', 'E ', 'Kuang ', + 0x60 => 'Hu ', 'Wu ', 'Shen ', 'Lai ', 'Ikaruga ', 'Kakesu ', 'Lu ', 'Ping ', 'Shu ', 'Fu ', 'An ', 'Zhao ', 'Peng ', 'Qin ', 'Qian ', 'Bei ', + 0x70 => 'Diao ', 'Lu ', 'Que ', 'Jian ', 'Ju ', 'Tu ', 'Ya ', 'Yuan ', 'Qi ', 'Li ', 'Ye ', 'Zhui ', 'Kong ', 'Zhui ', 'Kun ', 'Sheng ', + 0x80 => 'Qi ', 'Jing ', 'Yi ', 'Yi ', 'Jing ', 'Zi ', 'Lai ', 'Dong ', 'Qi ', 'Chun ', 'Geng ', 'Ju ', 'Qu ', 'Isuka ', 'Kikuitadaki ', 'Ji ', + 0x90 => 'Shu ', NULL, 'Chi ', 'Miao ', 'Rou ', 'An ', 'Qiu ', 'Ti ', 'Hu ', 'Ti ', 'E ', 'Jie ', 'Mao ', 'Fu ', 'Chun ', 'Tu ', + 0xA0 => 'Yan ', 'He ', 'Yuan ', 'Pian ', 'Yun ', 'Mei ', 'Hu ', 'Ying ', 'Dun ', 'Mu ', 'Ju ', 'Tsugumi ', 'Cang ', 'Fang ', 'Gu ', 'Ying ', + 0xB0 => 'Yuan ', 'Xuan ', 'Weng ', 'Shi ', 'He ', 'Chu ', 'Tang ', 'Xia ', 'Ruo ', 'Liu ', 'Ji ', 'Gu ', 'Jian ', 'Zhun ', 'Han ', 'Zi ', + 0xC0 => 'Zi ', 'Ni ', 'Yao ', 'Yan ', 'Ji ', 'Li ', 'Tian ', 'Kou ', 'Ti ', 'Ti ', 'Ni ', 'Tu ', 'Ma ', 'Jiao ', 'Gao ', 'Tian ', + 0xD0 => 'Chen ', 'Li ', 'Zhuan ', 'Zhe ', 'Ao ', 'Yao ', 'Yi ', 'Ou ', 'Chi ', 'Zhi ', 'Liao ', 'Rong ', 'Lou ', 'Bi ', 'Shuang ', 'Zhuo ', + 0xE0 => 'Yu ', 'Wu ', 'Jue ', 'Yin ', 'Quan ', 'Si ', 'Jiao ', 'Yi ', 'Hua ', 'Bi ', 'Ying ', 'Su ', 'Huang ', 'Fan ', 'Jiao ', 'Liao ', + 0xF0 => 'Yan ', 'Kao ', 'Jiu ', 'Xian ', 'Xian ', 'Tu ', 'Mai ', 'Zun ', 'Yu ', 'Ying ', 'Lu ', 'Tuan ', 'Xian ', 'Xue ', 'Yi ', 'Pi ', +); diff --git a/sources/resources/transliteration-data/x9e.php b/sources/resources/transliteration-data/x9e.php new file mode 100644 index 0000000..e088a2f --- /dev/null +++ b/sources/resources/transliteration-data/x9e.php @@ -0,0 +1,20 @@ + 'Shu ', 'Luo ', 'Qi ', 'Yi ', 'Ji ', 'Zhe ', 'Yu ', 'Zhan ', 'Ye ', 'Yang ', 'Pi ', 'Ning ', 'Huo ', 'Mi ', 'Ying ', 'Meng ', + 0x10 => 'Di ', 'Yue ', 'Yu ', 'Lei ', 'Bao ', 'Lu ', 'He ', 'Long ', 'Shuang ', 'Yue ', 'Ying ', 'Guan ', 'Qu ', 'Li ', 'Luan ', 'Niao ', + 0x20 => 'Jiu ', 'Ji ', 'Yuan ', 'Ming ', 'Shi ', 'Ou ', 'Ya ', 'Cang ', 'Bao ', 'Zhen ', 'Gu ', 'Dong ', 'Lu ', 'Ya ', 'Xiao ', 'Yang ', + 0x30 => 'Ling ', 'Zhi ', 'Qu ', 'Yuan ', 'Xue ', 'Tuo ', 'Si ', 'Zhi ', 'Er ', 'Gua ', 'Xiu ', 'Heng ', 'Zhou ', 'Ge ', 'Luan ', 'Hong ', + 0x40 => 'Wu ', 'Bo ', 'Li ', 'Juan ', 'Hu ', 'E ', 'Yu ', 'Xian ', 'Ti ', 'Wu ', 'Que ', 'Miao ', 'An ', 'Kun ', 'Bei ', 'Peng ', + 0x50 => 'Qian ', 'Chun ', 'Geng ', 'Yuan ', 'Su ', 'Hu ', 'He ', 'E ', 'Gu ', 'Qiu ', 'Zi ', 'Mei ', 'Mu ', 'Ni ', 'Yao ', 'Weng ', + 0x60 => 'Liu ', 'Ji ', 'Ni ', 'Jian ', 'He ', 'Yi ', 'Ying ', 'Zhe ', 'Liao ', 'Liao ', 'Jiao ', 'Jiu ', 'Yu ', 'Lu ', 'Xuan ', 'Zhan ', + 0x70 => 'Ying ', 'Huo ', 'Meng ', 'Guan ', 'Shuang ', 'Lu ', 'Jin ', 'Ling ', 'Jian ', 'Xian ', 'Cuo ', 'Jian ', 'Jian ', 'Yan ', 'Cuo ', 'Lu ', + 0x80 => 'You ', 'Cu ', 'Ji ', 'Biao ', 'Cu ', 'Biao ', 'Zhu ', 'Jun ', 'Zhu ', 'Jian ', 'Mi ', 'Mi ', 'Wu ', 'Liu ', 'Chen ', 'Jun ', + 0x90 => 'Lin ', 'Ni ', 'Qi ', 'Lu ', 'Jiu ', 'Jun ', 'Jing ', 'Li ', 'Xiang ', 'Yan ', 'Jia ', 'Mi ', 'Li ', 'She ', 'Zhang ', 'Lin ', + 0xA0 => 'Jing ', 'Ji ', 'Ling ', 'Yan ', 'Cu ', 'Mai ', 'Mai ', 'Ge ', 'Chao ', 'Fu ', 'Mian ', 'Mian ', 'Fu ', 'Pao ', 'Qu ', 'Qu ', + 0xB0 => 'Mou ', 'Fu ', 'Xian ', 'Lai ', 'Qu ', 'Mian ', NULL, 'Feng ', 'Fu ', 'Qu ', 'Mian ', 'Ma ', 'Mo ', 'Mo ', 'Hui ', 'Ma ', + 0xC0 => 'Zou ', 'Nen ', 'Fen ', 'Huang ', 'Huang ', 'Jin ', 'Guang ', 'Tian ', 'Tou ', 'Heng ', 'Xi ', 'Kuang ', 'Heng ', 'Shu ', 'Li ', 'Nian ', + 0xD0 => 'Chi ', 'Hei ', 'Hei ', 'Yi ', 'Qian ', 'Dan ', 'Xi ', 'Tuan ', 'Mo ', 'Mo ', 'Qian ', 'Dai ', 'Chu ', 'You ', 'Dian ', 'Yi ', + 0xE0 => 'Xia ', 'Yan ', 'Qu ', 'Mei ', 'Yan ', 'Jing ', 'Yu ', 'Li ', 'Dang ', 'Du ', 'Can ', 'Yin ', 'An ', 'Yan ', 'Tan ', 'An ', + 0xF0 => 'Zhen ', 'Dai ', 'Can ', 'Yi ', 'Mei ', 'Dan ', 'Yan ', 'Du ', 'Lu ', 'Zhi ', 'Fen ', 'Fu ', 'Fu ', 'Min ', 'Min ', 'Yuan ', +); diff --git a/sources/resources/transliteration-data/x9f.php b/sources/resources/transliteration-data/x9f.php new file mode 100644 index 0000000..433d31d --- /dev/null +++ b/sources/resources/transliteration-data/x9f.php @@ -0,0 +1,20 @@ + 'Cu ', 'Qu ', 'Chao ', 'Wa ', 'Zhu ', 'Zhi ', 'Mang ', 'Ao ', 'Bie ', 'Tuo ', 'Bi ', 'Yuan ', 'Chao ', 'Tuo ', 'Ding ', 'Mi ', + 0x10 => 'Nai ', 'Ding ', 'Zi ', 'Gu ', 'Gu ', 'Dong ', 'Fen ', 'Tao ', 'Yuan ', 'Pi ', 'Chang ', 'Gao ', 'Qi ', 'Yuan ', 'Tang ', 'Teng ', + 0x20 => 'Shu ', 'Shu ', 'Fen ', 'Fei ', 'Wen ', 'Ba ', 'Diao ', 'Tuo ', 'Tong ', 'Qu ', 'Sheng ', 'Shi ', 'You ', 'Shi ', 'Ting ', 'Wu ', + 0x30 => 'Nian ', 'Jing ', 'Hun ', 'Ju ', 'Yan ', 'Tu ', 'Ti ', 'Xi ', 'Xian ', 'Yan ', 'Lei ', 'Bi ', 'Yao ', 'Qiu ', 'Han ', 'Wu ', + 0x40 => 'Wu ', 'Hou ', 'Xi ', 'Ge ', 'Zha ', 'Xiu ', 'Weng ', 'Zha ', 'Nong ', 'Nang ', 'Qi ', 'Zhai ', 'Ji ', 'Zi ', 'Ji ', 'Ji ', + 0x50 => 'Qi ', 'Ji ', 'Chi ', 'Chen ', 'Chen ', 'He ', 'Ya ', 'Ken ', 'Xie ', 'Pao ', 'Cuo ', 'Shi ', 'Zi ', 'Chi ', 'Nian ', 'Ju ', + 0x60 => 'Tiao ', 'Ling ', 'Ling ', 'Chu ', 'Quan ', 'Xie ', 'Ken ', 'Nie ', 'Jiu ', 'Yao ', 'Chuo ', 'Kun ', 'Yu ', 'Chu ', 'Yi ', 'Ni ', + 0x70 => 'Cuo ', 'Zou ', 'Qu ', 'Nen ', 'Xian ', 'Ou ', 'E ', 'Wo ', 'Yi ', 'Chuo ', 'Zou ', 'Dian ', 'Chu ', 'Jin ', 'Ya ', 'Chi ', + 0x80 => 'Chen ', 'He ', 'Ken ', 'Ju ', 'Ling ', 'Pao ', 'Tiao ', 'Zi ', 'Ken ', 'Yu ', 'Chuo ', 'Qu ', 'Wo ', 'Long ', 'Pang ', 'Gong ', + 0x90 => 'Pang ', 'Yan ', 'Long ', 'Long ', 'Gong ', 'Kan ', 'Ta ', 'Ling ', 'Ta ', 'Long ', 'Gong ', 'Kan ', 'Gui ', 'Qiu ', 'Bie ', 'Gui ', + 0xA0 => 'Yue ', 'Chui ', 'He ', 'Jue ', 'Xie ', 'Yu ', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xB0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/xa0.php b/sources/resources/transliteration-data/xa0.php new file mode 100644 index 0000000..829699d --- /dev/null +++ b/sources/resources/transliteration-data/xa0.php @@ -0,0 +1,20 @@ + 'it', 'ix', 'i', 'ip', 'iet', 'iex', 'ie', 'iep', 'at', 'ax', 'a', 'ap', 'uox', 'uo', 'uop', 'ot', + 0x10 => 'ox', 'o', 'op', 'ex', 'e', 'wu', 'bit', 'bix', 'bi', 'bip', 'biet', 'biex', 'bie', 'biep', 'bat', 'bax', + 0x20 => 'ba', 'bap', 'buox', 'buo', 'buop', 'bot', 'box', 'bo', 'bop', 'bex', 'be', 'bep', 'but', 'bux', 'bu', 'bup', + 0x30 => 'burx', 'bur', 'byt', 'byx', 'by', 'byp', 'byrx', 'byr', 'pit', 'pix', 'pi', 'pip', 'piex', 'pie', 'piep', 'pat', + 0x40 => 'pax', 'pa', 'pap', 'puox', 'puo', 'puop', 'pot', 'pox', 'po', 'pop', 'put', 'pux', 'pu', 'pup', 'purx', 'pur', + 0x50 => 'pyt', 'pyx', 'py', 'pyp', 'pyrx', 'pyr', 'bbit', 'bbix', 'bbi', 'bbip', 'bbiet', 'bbiex', 'bbie', 'bbiep', 'bbat', 'bbax', + 0x60 => 'bba', 'bbap', 'bbuox', 'bbuo', 'bbuop', 'bbot', 'bbox', 'bbo', 'bbop', 'bbex', 'bbe', 'bbep', 'bbut', 'bbux', 'bbu', 'bbup', + 0x70 => 'bburx', 'bbur', 'bbyt', 'bbyx', 'bby', 'bbyp', 'nbit', 'nbix', 'nbi', 'nbip', 'nbiex', 'nbie', 'nbiep', 'nbat', 'nbax', 'nba', + 0x80 => 'nbap', 'nbot', 'nbox', 'nbo', 'nbop', 'nbut', 'nbux', 'nbu', 'nbup', 'nburx', 'nbur', 'nbyt', 'nbyx', 'nby', 'nbyp', 'nbyrx', + 0x90 => 'nbyr', 'hmit', 'hmix', 'hmi', 'hmip', 'hmiex', 'hmie', 'hmiep', 'hmat', 'hmax', 'hma', 'hmap', 'hmuox', 'hmuo', 'hmuop', 'hmot', + 0xA0 => 'hmox', 'hmo', 'hmop', 'hmut', 'hmux', 'hmu', 'hmup', 'hmurx', 'hmur', 'hmyx', 'hmy', 'hmyp', 'hmyrx', 'hmyr', 'mit', 'mix', + 0xB0 => 'mi', 'mip', 'miex', 'mie', 'miep', 'mat', 'max', 'ma', 'map', 'muot', 'muox', 'muo', 'muop', 'mot', 'mox', 'mo', + 0xC0 => 'mop', 'mex', 'me', 'mut', 'mux', 'mu', 'mup', 'murx', 'mur', 'myt', 'myx', 'my', 'myp', 'fit', 'fix', 'fi', + 0xD0 => 'fip', 'fat', 'fax', 'fa', 'fap', 'fox', 'fo', 'fop', 'fut', 'fux', 'fu', 'fup', 'furx', 'fur', 'fyt', 'fyx', + 0xE0 => 'fy', 'fyp', 'vit', 'vix', 'vi', 'vip', 'viet', 'viex', 'vie', 'viep', 'vat', 'vax', 'va', 'vap', 'vot', 'vox', + 0xF0 => 'vo', 'vop', 'vex', 'vep', 'vut', 'vux', 'vu', 'vup', 'vurx', 'vur', 'vyt', 'vyx', 'vy', 'vyp', 'vyrx', 'vyr', +); diff --git a/sources/resources/transliteration-data/xa1.php b/sources/resources/transliteration-data/xa1.php new file mode 100644 index 0000000..90970f7 --- /dev/null +++ b/sources/resources/transliteration-data/xa1.php @@ -0,0 +1,20 @@ + 'dit', 'dix', 'di', 'dip', 'diex', 'die', 'diep', 'dat', 'dax', 'da', 'dap', 'duox', 'duo', 'dot', 'dox', 'do', + 0x10 => 'dop', 'dex', 'de', 'dep', 'dut', 'dux', 'du', 'dup', 'durx', 'dur', 'tit', 'tix', 'ti', 'tip', 'tiex', 'tie', + 0x20 => 'tiep', 'tat', 'tax', 'ta', 'tap', 'tuot', 'tuox', 'tuo', 'tuop', 'tot', 'tox', 'to', 'top', 'tex', 'te', 'tep', + 0x30 => 'tut', 'tux', 'tu', 'tup', 'turx', 'tur', 'ddit', 'ddix', 'ddi', 'ddip', 'ddiex', 'ddie', 'ddiep', 'ddat', 'ddax', 'dda', + 0x40 => 'ddap', 'dduox', 'dduo', 'dduop', 'ddot', 'ddox', 'ddo', 'ddop', 'ddex', 'dde', 'ddep', 'ddut', 'ddux', 'ddu', 'ddup', 'ddurx', + 0x50 => 'ddur', 'ndit', 'ndix', 'ndi', 'ndip', 'ndiex', 'ndie', 'ndat', 'ndax', 'nda', 'ndap', 'ndot', 'ndox', 'ndo', 'ndop', 'ndex', + 0x60 => 'nde', 'ndep', 'ndut', 'ndux', 'ndu', 'ndup', 'ndurx', 'ndur', 'hnit', 'hnix', 'hni', 'hnip', 'hniet', 'hniex', 'hnie', 'hniep', + 0x70 => 'hnat', 'hnax', 'hna', 'hnap', 'hnuox', 'hnuo', 'hnot', 'hnox', 'hnop', 'hnex', 'hne', 'hnep', 'hnut', 'nit', 'nix', 'ni', + 0x80 => 'nip', 'niex', 'nie', 'niep', 'nax', 'na', 'nap', 'nuox', 'nuo', 'nuop', 'not', 'nox', 'no', 'nop', 'nex', 'ne', + 0x90 => 'nep', 'nut', 'nux', 'nu', 'nup', 'nurx', 'nur', 'hlit', 'hlix', 'hli', 'hlip', 'hliex', 'hlie', 'hliep', 'hlat', 'hlax', + 0xA0 => 'hla', 'hlap', 'hluox', 'hluo', 'hluop', 'hlox', 'hlo', 'hlop', 'hlex', 'hle', 'hlep', 'hlut', 'hlux', 'hlu', 'hlup', 'hlurx', + 0xB0 => 'hlur', 'hlyt', 'hlyx', 'hly', 'hlyp', 'hlyrx', 'hlyr', 'lit', 'lix', 'li', 'lip', 'liet', 'liex', 'lie', 'liep', 'lat', + 0xC0 => 'lax', 'la', 'lap', 'luot', 'luox', 'luo', 'luop', 'lot', 'lox', 'lo', 'lop', 'lex', 'le', 'lep', 'lut', 'lux', + 0xD0 => 'lu', 'lup', 'lurx', 'lur', 'lyt', 'lyx', 'ly', 'lyp', 'lyrx', 'lyr', 'git', 'gix', 'gi', 'gip', 'giet', 'giex', + 0xE0 => 'gie', 'giep', 'gat', 'gax', 'ga', 'gap', 'guot', 'guox', 'guo', 'guop', 'got', 'gox', 'go', 'gop', 'get', 'gex', + 0xF0 => 'ge', 'gep', 'gut', 'gux', 'gu', 'gup', 'gurx', 'gur', 'kit', 'kix', 'ki', 'kip', 'kiex', 'kie', 'kiep', 'kat', +); diff --git a/sources/resources/transliteration-data/xa2.php b/sources/resources/transliteration-data/xa2.php new file mode 100644 index 0000000..e0fde12 --- /dev/null +++ b/sources/resources/transliteration-data/xa2.php @@ -0,0 +1,20 @@ + 'kax', 'ka', 'kap', 'kuox', 'kuo', 'kuop', 'kot', 'kox', 'ko', 'kop', 'ket', 'kex', 'ke', 'kep', 'kut', 'kux', + 0x10 => 'ku', 'kup', 'kurx', 'kur', 'ggit', 'ggix', 'ggi', 'ggiex', 'ggie', 'ggiep', 'ggat', 'ggax', 'gga', 'ggap', 'gguot', 'gguox', + 0x20 => 'gguo', 'gguop', 'ggot', 'ggox', 'ggo', 'ggop', 'gget', 'ggex', 'gge', 'ggep', 'ggut', 'ggux', 'ggu', 'ggup', 'ggurx', 'ggur', + 0x30 => 'mgiex', 'mgie', 'mgat', 'mgax', 'mga', 'mgap', 'mguox', 'mguo', 'mguop', 'mgot', 'mgox', 'mgo', 'mgop', 'mgex', 'mge', 'mgep', + 0x40 => 'mgut', 'mgux', 'mgu', 'mgup', 'mgurx', 'mgur', 'hxit', 'hxix', 'hxi', 'hxip', 'hxiet', 'hxiex', 'hxie', 'hxiep', 'hxat', 'hxax', + 0x50 => 'hxa', 'hxap', 'hxuot', 'hxuox', 'hxuo', 'hxuop', 'hxot', 'hxox', 'hxo', 'hxop', 'hxex', 'hxe', 'hxep', 'ngiex', 'ngie', 'ngiep', + 0x60 => 'ngat', 'ngax', 'nga', 'ngap', 'nguot', 'nguox', 'nguo', 'ngot', 'ngox', 'ngo', 'ngop', 'ngex', 'nge', 'ngep', 'hit', 'hiex', + 0x70 => 'hie', 'hat', 'hax', 'ha', 'hap', 'huot', 'huox', 'huo', 'huop', 'hot', 'hox', 'ho', 'hop', 'hex', 'he', 'hep', + 0x80 => 'wat', 'wax', 'wa', 'wap', 'wuox', 'wuo', 'wuop', 'wox', 'wo', 'wop', 'wex', 'we', 'wep', 'zit', 'zix', 'zi', + 0x90 => 'zip', 'ziex', 'zie', 'ziep', 'zat', 'zax', 'za', 'zap', 'zuox', 'zuo', 'zuop', 'zot', 'zox', 'zo', 'zop', 'zex', + 0xA0 => 'ze', 'zep', 'zut', 'zux', 'zu', 'zup', 'zurx', 'zur', 'zyt', 'zyx', 'zy', 'zyp', 'zyrx', 'zyr', 'cit', 'cix', + 0xB0 => 'ci', 'cip', 'ciet', 'ciex', 'cie', 'ciep', 'cat', 'cax', 'ca', 'cap', 'cuox', 'cuo', 'cuop', 'cot', 'cox', 'co', + 0xC0 => 'cop', 'cex', 'ce', 'cep', 'cut', 'cux', 'cu', 'cup', 'curx', 'cur', 'cyt', 'cyx', 'cy', 'cyp', 'cyrx', 'cyr', + 0xD0 => 'zzit', 'zzix', 'zzi', 'zzip', 'zziet', 'zziex', 'zzie', 'zziep', 'zzat', 'zzax', 'zza', 'zzap', 'zzox', 'zzo', 'zzop', 'zzex', + 0xE0 => 'zze', 'zzep', 'zzux', 'zzu', 'zzup', 'zzurx', 'zzur', 'zzyt', 'zzyx', 'zzy', 'zzyp', 'zzyrx', 'zzyr', 'nzit', 'nzix', 'nzi', + 0xF0 => 'nzip', 'nziex', 'nzie', 'nziep', 'nzat', 'nzax', 'nza', 'nzap', 'nzuox', 'nzuo', 'nzox', 'nzop', 'nzex', 'nze', 'nzux', 'nzu', +); diff --git a/sources/resources/transliteration-data/xa3.php b/sources/resources/transliteration-data/xa3.php new file mode 100644 index 0000000..3c0b915 --- /dev/null +++ b/sources/resources/transliteration-data/xa3.php @@ -0,0 +1,20 @@ + 'nzup', 'nzurx', 'nzur', 'nzyt', 'nzyx', 'nzy', 'nzyp', 'nzyrx', 'nzyr', 'sit', 'six', 'si', 'sip', 'siex', 'sie', 'siep', + 0x10 => 'sat', 'sax', 'sa', 'sap', 'suox', 'suo', 'suop', 'sot', 'sox', 'so', 'sop', 'sex', 'se', 'sep', 'sut', 'sux', + 0x20 => 'su', 'sup', 'surx', 'sur', 'syt', 'syx', 'sy', 'syp', 'syrx', 'syr', 'ssit', 'ssix', 'ssi', 'ssip', 'ssiex', 'ssie', + 0x30 => 'ssiep', 'ssat', 'ssax', 'ssa', 'ssap', 'ssot', 'ssox', 'sso', 'ssop', 'ssex', 'sse', 'ssep', 'ssut', 'ssux', 'ssu', 'ssup', + 0x40 => 'ssyt', 'ssyx', 'ssy', 'ssyp', 'ssyrx', 'ssyr', 'zhat', 'zhax', 'zha', 'zhap', 'zhuox', 'zhuo', 'zhuop', 'zhot', 'zhox', 'zho', + 0x50 => 'zhop', 'zhet', 'zhex', 'zhe', 'zhep', 'zhut', 'zhux', 'zhu', 'zhup', 'zhurx', 'zhur', 'zhyt', 'zhyx', 'zhy', 'zhyp', 'zhyrx', + 0x60 => 'zhyr', 'chat', 'chax', 'cha', 'chap', 'chuot', 'chuox', 'chuo', 'chuop', 'chot', 'chox', 'cho', 'chop', 'chet', 'chex', 'che', + 0x70 => 'chep', 'chux', 'chu', 'chup', 'churx', 'chur', 'chyt', 'chyx', 'chy', 'chyp', 'chyrx', 'chyr', 'rrax', 'rra', 'rruox', 'rruo', + 0x80 => 'rrot', 'rrox', 'rro', 'rrop', 'rret', 'rrex', 'rre', 'rrep', 'rrut', 'rrux', 'rru', 'rrup', 'rrurx', 'rrur', 'rryt', 'rryx', + 0x90 => 'rry', 'rryp', 'rryrx', 'rryr', 'nrat', 'nrax', 'nra', 'nrap', 'nrox', 'nro', 'nrop', 'nret', 'nrex', 'nre', 'nrep', 'nrut', + 0xA0 => 'nrux', 'nru', 'nrup', 'nrurx', 'nrur', 'nryt', 'nryx', 'nry', 'nryp', 'nryrx', 'nryr', 'shat', 'shax', 'sha', 'shap', 'shuox', + 0xB0 => 'shuo', 'shuop', 'shot', 'shox', 'sho', 'shop', 'shet', 'shex', 'she', 'shep', 'shut', 'shux', 'shu', 'shup', 'shurx', 'shur', + 0xC0 => 'shyt', 'shyx', 'shy', 'shyp', 'shyrx', 'shyr', 'rat', 'rax', 'ra', 'rap', 'ruox', 'ruo', 'ruop', 'rot', 'rox', 'ro', + 0xD0 => 'rop', 'rex', 're', 'rep', 'rut', 'rux', 'ru', 'rup', 'rurx', 'rur', 'ryt', 'ryx', 'ry', 'ryp', 'ryrx', 'ryr', + 0xE0 => 'jit', 'jix', 'ji', 'jip', 'jiet', 'jiex', 'jie', 'jiep', 'juot', 'juox', 'juo', 'juop', 'jot', 'jox', 'jo', 'jop', + 0xF0 => 'jut', 'jux', 'ju', 'jup', 'jurx', 'jur', 'jyt', 'jyx', 'jy', 'jyp', 'jyrx', 'jyr', 'qit', 'qix', 'qi', 'qip', +); diff --git a/sources/resources/transliteration-data/xa4.php b/sources/resources/transliteration-data/xa4.php new file mode 100644 index 0000000..6159a64 --- /dev/null +++ b/sources/resources/transliteration-data/xa4.php @@ -0,0 +1,20 @@ + 'qiet', 'qiex', 'qie', 'qiep', 'quot', 'quox', 'quo', 'quop', 'qot', 'qox', 'qo', 'qop', 'qut', 'qux', 'qu', 'qup', + 0x10 => 'qurx', 'qur', 'qyt', 'qyx', 'qy', 'qyp', 'qyrx', 'qyr', 'jjit', 'jjix', 'jji', 'jjip', 'jjiet', 'jjiex', 'jjie', 'jjiep', + 0x20 => 'jjuox', 'jjuo', 'jjuop', 'jjot', 'jjox', 'jjo', 'jjop', 'jjut', 'jjux', 'jju', 'jjup', 'jjurx', 'jjur', 'jjyt', 'jjyx', 'jjy', + 0x30 => 'jjyp', 'njit', 'njix', 'nji', 'njip', 'njiet', 'njiex', 'njie', 'njiep', 'njuox', 'njuo', 'njot', 'njox', 'njo', 'njop', 'njux', + 0x40 => 'nju', 'njup', 'njurx', 'njur', 'njyt', 'njyx', 'njy', 'njyp', 'njyrx', 'njyr', 'nyit', 'nyix', 'nyi', 'nyip', 'nyiet', 'nyiex', + 0x50 => 'nyie', 'nyiep', 'nyuox', 'nyuo', 'nyuop', 'nyot', 'nyox', 'nyo', 'nyop', 'nyut', 'nyux', 'nyu', 'nyup', 'xit', 'xix', 'xi', + 0x60 => 'xip', 'xiet', 'xiex', 'xie', 'xiep', 'xuox', 'xuo', 'xot', 'xox', 'xo', 'xop', 'xyt', 'xyx', 'xy', 'xyp', 'xyrx', + 0x70 => 'xyr', 'yit', 'yix', 'yi', 'yip', 'yiet', 'yiex', 'yie', 'yiep', 'yuot', 'yuox', 'yuo', 'yuop', 'yot', 'yox', 'yo', + 0x80 => 'yop', 'yut', 'yux', 'yu', 'yup', 'yurx', 'yur', 'yyt', 'yyx', 'yy', 'yyp', 'yyrx', 'yyr', NULL, NULL, NULL, + 0x90 => 'Qot', 'Li', 'Kit', 'Nyip', 'Cyp', 'Ssi', 'Ggop', 'Gep', 'Mi', 'Hxit', 'Lyr', 'Bbut', 'Mop', 'Yo', 'Put', 'Hxuo', + 0xA0 => 'Tat', 'Ga', NULL, NULL, 'Ddur', 'Bur', 'Gguo', 'Nyop', 'Tu', 'Op', 'Jjut', 'Zot', 'Pyt', 'Hmo', 'Yit', 'Vur', + 0xB0 => 'Shy', 'Vep', 'Za', 'Jo', NULL, 'Jjy', 'Got', 'Jjie', 'Wo', 'Du', 'Shur', 'Lie', 'Cy', 'Cuop', 'Cip', 'Hxop', + 0xC0 => 'Shat', NULL, 'Shop', 'Che', 'Zziet', NULL, 'Ke', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/xac.php b/sources/resources/transliteration-data/xac.php new file mode 100644 index 0000000..7b51566 --- /dev/null +++ b/sources/resources/transliteration-data/xac.php @@ -0,0 +1,20 @@ + 'ga', 'gag', 'gagg', 'gags', 'gan', 'ganj', 'ganh', 'gad', 'gal', 'galg', 'galm', 'galb', 'gals', 'galt', 'galp', 'galh', + 0x10 => 'gam', 'gab', 'gabs', 'gas', 'gass', 'gang', 'gaj', 'gac', 'gak', 'gat', 'gap', 'gah', 'gae', 'gaeg', 'gaegg', 'gaegs', + 0x20 => 'gaen', 'gaenj', 'gaenh', 'gaed', 'gael', 'gaelg', 'gaelm', 'gaelb', 'gaels', 'gaelt', 'gaelp', 'gaelh', 'gaem', 'gaeb', 'gaebs', 'gaes', + 0x30 => 'gaess', 'gaeng', 'gaej', 'gaec', 'gaek', 'gaet', 'gaep', 'gaeh', 'gya', 'gyag', 'gyagg', 'gyags', 'gyan', 'gyanj', 'gyanh', 'gyad', + 0x40 => 'gyal', 'gyalg', 'gyalm', 'gyalb', 'gyals', 'gyalt', 'gyalp', 'gyalh', 'gyam', 'gyab', 'gyabs', 'gyas', 'gyass', 'gyang', 'gyaj', 'gyac', + 0x50 => 'gyak', 'gyat', 'gyap', 'gyah', 'gyae', 'gyaeg', 'gyaegg', 'gyaegs', 'gyaen', 'gyaenj', 'gyaenh', 'gyaed', 'gyael', 'gyaelg', 'gyaelm', 'gyaelb', + 0x60 => 'gyaels', 'gyaelt', 'gyaelp', 'gyaelh', 'gyaem', 'gyaeb', 'gyaebs', 'gyaes', 'gyaess', 'gyaeng', 'gyaej', 'gyaec', 'gyaek', 'gyaet', 'gyaep', 'gyaeh', + 0x70 => 'geo', 'geog', 'geogg', 'geogs', 'geon', 'geonj', 'geonh', 'geod', 'geol', 'geolg', 'geolm', 'geolb', 'geols', 'geolt', 'geolp', 'geolh', + 0x80 => 'geom', 'geob', 'geobs', 'geos', 'geoss', 'geong', 'geoj', 'geoc', 'geok', 'geot', 'geop', 'geoh', 'ge', 'geg', 'gegg', 'gegs', + 0x90 => 'gen', 'genj', 'genh', 'ged', 'gel', 'gelg', 'gelm', 'gelb', 'gels', 'gelt', 'gelp', 'gelh', 'gem', 'geb', 'gebs', 'ges', + 0xA0 => 'gess', 'geng', 'gej', 'gec', 'gek', 'get', 'gep', 'geh', 'gyeo', 'gyeog', 'gyeogg', 'gyeogs', 'gyeon', 'gyeonj', 'gyeonh', 'gyeod', + 0xB0 => 'gyeol', 'gyeolg', 'gyeolm', 'gyeolb', 'gyeols', 'gyeolt', 'gyeolp', 'gyeolh', 'gyeom', 'gyeob', 'gyeobs', 'gyeos', 'gyeoss', 'gyeong', 'gyeoj', 'gyeoc', + 0xC0 => 'gyeok', 'gyeot', 'gyeop', 'gyeoh', 'gye', 'gyeg', 'gyegg', 'gyegs', 'gyen', 'gyenj', 'gyenh', 'gyed', 'gyel', 'gyelg', 'gyelm', 'gyelb', + 0xD0 => 'gyels', 'gyelt', 'gyelp', 'gyelh', 'gyem', 'gyeb', 'gyebs', 'gyes', 'gyess', 'gyeng', 'gyej', 'gyec', 'gyek', 'gyet', 'gyep', 'gyeh', + 0xE0 => 'go', 'gog', 'gogg', 'gogs', 'gon', 'gonj', 'gonh', 'god', 'gol', 'golg', 'golm', 'golb', 'gols', 'golt', 'golp', 'golh', + 0xF0 => 'gom', 'gob', 'gobs', 'gos', 'goss', 'gong', 'goj', 'goc', 'gok', 'got', 'gop', 'goh', 'gwa', 'gwag', 'gwagg', 'gwags', +); diff --git a/sources/resources/transliteration-data/xad.php b/sources/resources/transliteration-data/xad.php new file mode 100644 index 0000000..a69dd68 --- /dev/null +++ b/sources/resources/transliteration-data/xad.php @@ -0,0 +1,20 @@ + 'gwan', 'gwanj', 'gwanh', 'gwad', 'gwal', 'gwalg', 'gwalm', 'gwalb', 'gwals', 'gwalt', 'gwalp', 'gwalh', 'gwam', 'gwab', 'gwabs', 'gwas', + 0x10 => 'gwass', 'gwang', 'gwaj', 'gwac', 'gwak', 'gwat', 'gwap', 'gwah', 'gwae', 'gwaeg', 'gwaegg', 'gwaegs', 'gwaen', 'gwaenj', 'gwaenh', 'gwaed', + 0x20 => 'gwael', 'gwaelg', 'gwaelm', 'gwaelb', 'gwaels', 'gwaelt', 'gwaelp', 'gwaelh', 'gwaem', 'gwaeb', 'gwaebs', 'gwaes', 'gwaess', 'gwaeng', 'gwaej', 'gwaec', + 0x30 => 'gwaek', 'gwaet', 'gwaep', 'gwaeh', 'goe', 'goeg', 'goegg', 'goegs', 'goen', 'goenj', 'goenh', 'goed', 'goel', 'goelg', 'goelm', 'goelb', + 0x40 => 'goels', 'goelt', 'goelp', 'goelh', 'goem', 'goeb', 'goebs', 'goes', 'goess', 'goeng', 'goej', 'goec', 'goek', 'goet', 'goep', 'goeh', + 0x50 => 'gyo', 'gyog', 'gyogg', 'gyogs', 'gyon', 'gyonj', 'gyonh', 'gyod', 'gyol', 'gyolg', 'gyolm', 'gyolb', 'gyols', 'gyolt', 'gyolp', 'gyolh', + 0x60 => 'gyom', 'gyob', 'gyobs', 'gyos', 'gyoss', 'gyong', 'gyoj', 'gyoc', 'gyok', 'gyot', 'gyop', 'gyoh', 'gu', 'gug', 'gugg', 'gugs', + 0x70 => 'gun', 'gunj', 'gunh', 'gud', 'gul', 'gulg', 'gulm', 'gulb', 'guls', 'gult', 'gulp', 'gulh', 'gum', 'gub', 'gubs', 'gus', + 0x80 => 'guss', 'gung', 'guj', 'guc', 'guk', 'gut', 'gup', 'guh', 'gweo', 'gweog', 'gweogg', 'gweogs', 'gweon', 'gweonj', 'gweonh', 'gweod', + 0x90 => 'gweol', 'gweolg', 'gweolm', 'gweolb', 'gweols', 'gweolt', 'gweolp', 'gweolh', 'gweom', 'gweob', 'gweobs', 'gweos', 'gweoss', 'gweong', 'gweoj', 'gweoc', + 0xA0 => 'gweok', 'gweot', 'gweop', 'gweoh', 'gwe', 'gweg', 'gwegg', 'gwegs', 'gwen', 'gwenj', 'gwenh', 'gwed', 'gwel', 'gwelg', 'gwelm', 'gwelb', + 0xB0 => 'gwels', 'gwelt', 'gwelp', 'gwelh', 'gwem', 'gweb', 'gwebs', 'gwes', 'gwess', 'gweng', 'gwej', 'gwec', 'gwek', 'gwet', 'gwep', 'gweh', + 0xC0 => 'gwi', 'gwig', 'gwigg', 'gwigs', 'gwin', 'gwinj', 'gwinh', 'gwid', 'gwil', 'gwilg', 'gwilm', 'gwilb', 'gwils', 'gwilt', 'gwilp', 'gwilh', + 0xD0 => 'gwim', 'gwib', 'gwibs', 'gwis', 'gwiss', 'gwing', 'gwij', 'gwic', 'gwik', 'gwit', 'gwip', 'gwih', 'gyu', 'gyug', 'gyugg', 'gyugs', + 0xE0 => 'gyun', 'gyunj', 'gyunh', 'gyud', 'gyul', 'gyulg', 'gyulm', 'gyulb', 'gyuls', 'gyult', 'gyulp', 'gyulh', 'gyum', 'gyub', 'gyubs', 'gyus', + 0xF0 => 'gyuss', 'gyung', 'gyuj', 'gyuc', 'gyuk', 'gyut', 'gyup', 'gyuh', 'geu', 'geug', 'geugg', 'geugs', 'geun', 'geunj', 'geunh', 'geud', +); diff --git a/sources/resources/transliteration-data/xae.php b/sources/resources/transliteration-data/xae.php new file mode 100644 index 0000000..fe8c4f5 --- /dev/null +++ b/sources/resources/transliteration-data/xae.php @@ -0,0 +1,20 @@ + 'geul', 'geulg', 'geulm', 'geulb', 'geuls', 'geult', 'geulp', 'geulh', 'geum', 'geub', 'geubs', 'geus', 'geuss', 'geung', 'geuj', 'geuc', + 0x10 => 'geuk', 'geut', 'geup', 'geuh', 'gyi', 'gyig', 'gyigg', 'gyigs', 'gyin', 'gyinj', 'gyinh', 'gyid', 'gyil', 'gyilg', 'gyilm', 'gyilb', + 0x20 => 'gyils', 'gyilt', 'gyilp', 'gyilh', 'gyim', 'gyib', 'gyibs', 'gyis', 'gyiss', 'gying', 'gyij', 'gyic', 'gyik', 'gyit', 'gyip', 'gyih', + 0x30 => 'gi', 'gig', 'gigg', 'gigs', 'gin', 'ginj', 'ginh', 'gid', 'gil', 'gilg', 'gilm', 'gilb', 'gils', 'gilt', 'gilp', 'gilh', + 0x40 => 'gim', 'gib', 'gibs', 'gis', 'giss', 'ging', 'gij', 'gic', 'gik', 'git', 'gip', 'gih', 'gga', 'ggag', 'ggagg', 'ggags', + 0x50 => 'ggan', 'gganj', 'gganh', 'ggad', 'ggal', 'ggalg', 'ggalm', 'ggalb', 'ggals', 'ggalt', 'ggalp', 'ggalh', 'ggam', 'ggab', 'ggabs', 'ggas', + 0x60 => 'ggass', 'ggang', 'ggaj', 'ggac', 'ggak', 'ggat', 'ggap', 'ggah', 'ggae', 'ggaeg', 'ggaegg', 'ggaegs', 'ggaen', 'ggaenj', 'ggaenh', 'ggaed', + 0x70 => 'ggael', 'ggaelg', 'ggaelm', 'ggaelb', 'ggaels', 'ggaelt', 'ggaelp', 'ggaelh', 'ggaem', 'ggaeb', 'ggaebs', 'ggaes', 'ggaess', 'ggaeng', 'ggaej', 'ggaec', + 0x80 => 'ggaek', 'ggaet', 'ggaep', 'ggaeh', 'ggya', 'ggyag', 'ggyagg', 'ggyags', 'ggyan', 'ggyanj', 'ggyanh', 'ggyad', 'ggyal', 'ggyalg', 'ggyalm', 'ggyalb', + 0x90 => 'ggyals', 'ggyalt', 'ggyalp', 'ggyalh', 'ggyam', 'ggyab', 'ggyabs', 'ggyas', 'ggyass', 'ggyang', 'ggyaj', 'ggyac', 'ggyak', 'ggyat', 'ggyap', 'ggyah', + 0xA0 => 'ggyae', 'ggyaeg', 'ggyaegg', 'ggyaegs', 'ggyaen', 'ggyaenj', 'ggyaenh', 'ggyaed', 'ggyael', 'ggyaelg', 'ggyaelm', 'ggyaelb', 'ggyaels', 'ggyaelt', 'ggyaelp', 'ggyaelh', + 0xB0 => 'ggyaem', 'ggyaeb', 'ggyaebs', 'ggyaes', 'ggyaess', 'ggyaeng', 'ggyaej', 'ggyaec', 'ggyaek', 'ggyaet', 'ggyaep', 'ggyaeh', 'ggeo', 'ggeog', 'ggeogg', 'ggeogs', + 0xC0 => 'ggeon', 'ggeonj', 'ggeonh', 'ggeod', 'ggeol', 'ggeolg', 'ggeolm', 'ggeolb', 'ggeols', 'ggeolt', 'ggeolp', 'ggeolh', 'ggeom', 'ggeob', 'ggeobs', 'ggeos', + 0xD0 => 'ggeoss', 'ggeong', 'ggeoj', 'ggeoc', 'ggeok', 'ggeot', 'ggeop', 'ggeoh', 'gge', 'ggeg', 'ggegg', 'ggegs', 'ggen', 'ggenj', 'ggenh', 'gged', + 0xE0 => 'ggel', 'ggelg', 'ggelm', 'ggelb', 'ggels', 'ggelt', 'ggelp', 'ggelh', 'ggem', 'ggeb', 'ggebs', 'gges', 'ggess', 'ggeng', 'ggej', 'ggec', + 0xF0 => 'ggek', 'gget', 'ggep', 'ggeh', 'ggyeo', 'ggyeog', 'ggyeogg', 'ggyeogs', 'ggyeon', 'ggyeonj', 'ggyeonh', 'ggyeod', 'ggyeol', 'ggyeolg', 'ggyeolm', 'ggyeolb', +); diff --git a/sources/resources/transliteration-data/xaf.php b/sources/resources/transliteration-data/xaf.php new file mode 100644 index 0000000..d04fd47 --- /dev/null +++ b/sources/resources/transliteration-data/xaf.php @@ -0,0 +1,20 @@ + 'ggyeols', 'ggyeolt', 'ggyeolp', 'ggyeolh', 'ggyeom', 'ggyeob', 'ggyeobs', 'ggyeos', 'ggyeoss', 'ggyeong', 'ggyeoj', 'ggyeoc', 'ggyeok', 'ggyeot', 'ggyeop', 'ggyeoh', + 0x10 => 'ggye', 'ggyeg', 'ggyegg', 'ggyegs', 'ggyen', 'ggyenj', 'ggyenh', 'ggyed', 'ggyel', 'ggyelg', 'ggyelm', 'ggyelb', 'ggyels', 'ggyelt', 'ggyelp', 'ggyelh', + 0x20 => 'ggyem', 'ggyeb', 'ggyebs', 'ggyes', 'ggyess', 'ggyeng', 'ggyej', 'ggyec', 'ggyek', 'ggyet', 'ggyep', 'ggyeh', 'ggo', 'ggog', 'ggogg', 'ggogs', + 0x30 => 'ggon', 'ggonj', 'ggonh', 'ggod', 'ggol', 'ggolg', 'ggolm', 'ggolb', 'ggols', 'ggolt', 'ggolp', 'ggolh', 'ggom', 'ggob', 'ggobs', 'ggos', + 0x40 => 'ggoss', 'ggong', 'ggoj', 'ggoc', 'ggok', 'ggot', 'ggop', 'ggoh', 'ggwa', 'ggwag', 'ggwagg', 'ggwags', 'ggwan', 'ggwanj', 'ggwanh', 'ggwad', + 0x50 => 'ggwal', 'ggwalg', 'ggwalm', 'ggwalb', 'ggwals', 'ggwalt', 'ggwalp', 'ggwalh', 'ggwam', 'ggwab', 'ggwabs', 'ggwas', 'ggwass', 'ggwang', 'ggwaj', 'ggwac', + 0x60 => 'ggwak', 'ggwat', 'ggwap', 'ggwah', 'ggwae', 'ggwaeg', 'ggwaegg', 'ggwaegs', 'ggwaen', 'ggwaenj', 'ggwaenh', 'ggwaed', 'ggwael', 'ggwaelg', 'ggwaelm', 'ggwaelb', + 0x70 => 'ggwaels', 'ggwaelt', 'ggwaelp', 'ggwaelh', 'ggwaem', 'ggwaeb', 'ggwaebs', 'ggwaes', 'ggwaess', 'ggwaeng', 'ggwaej', 'ggwaec', 'ggwaek', 'ggwaet', 'ggwaep', 'ggwaeh', + 0x80 => 'ggoe', 'ggoeg', 'ggoegg', 'ggoegs', 'ggoen', 'ggoenj', 'ggoenh', 'ggoed', 'ggoel', 'ggoelg', 'ggoelm', 'ggoelb', 'ggoels', 'ggoelt', 'ggoelp', 'ggoelh', + 0x90 => 'ggoem', 'ggoeb', 'ggoebs', 'ggoes', 'ggoess', 'ggoeng', 'ggoej', 'ggoec', 'ggoek', 'ggoet', 'ggoep', 'ggoeh', 'ggyo', 'ggyog', 'ggyogg', 'ggyogs', + 0xA0 => 'ggyon', 'ggyonj', 'ggyonh', 'ggyod', 'ggyol', 'ggyolg', 'ggyolm', 'ggyolb', 'ggyols', 'ggyolt', 'ggyolp', 'ggyolh', 'ggyom', 'ggyob', 'ggyobs', 'ggyos', + 0xB0 => 'ggyoss', 'ggyong', 'ggyoj', 'ggyoc', 'ggyok', 'ggyot', 'ggyop', 'ggyoh', 'ggu', 'ggug', 'ggugg', 'ggugs', 'ggun', 'ggunj', 'ggunh', 'ggud', + 0xC0 => 'ggul', 'ggulg', 'ggulm', 'ggulb', 'gguls', 'ggult', 'ggulp', 'ggulh', 'ggum', 'ggub', 'ggubs', 'ggus', 'gguss', 'ggung', 'gguj', 'gguc', + 0xD0 => 'gguk', 'ggut', 'ggup', 'gguh', 'ggweo', 'ggweog', 'ggweogg', 'ggweogs', 'ggweon', 'ggweonj', 'ggweonh', 'ggweod', 'ggweol', 'ggweolg', 'ggweolm', 'ggweolb', + 0xE0 => 'ggweols', 'ggweolt', 'ggweolp', 'ggweolh', 'ggweom', 'ggweob', 'ggweobs', 'ggweos', 'ggweoss', 'ggweong', 'ggweoj', 'ggweoc', 'ggweok', 'ggweot', 'ggweop', 'ggweoh', + 0xF0 => 'ggwe', 'ggweg', 'ggwegg', 'ggwegs', 'ggwen', 'ggwenj', 'ggwenh', 'ggwed', 'ggwel', 'ggwelg', 'ggwelm', 'ggwelb', 'ggwels', 'ggwelt', 'ggwelp', 'ggwelh', +); diff --git a/sources/resources/transliteration-data/xb0.php b/sources/resources/transliteration-data/xb0.php new file mode 100644 index 0000000..21f0cd6 --- /dev/null +++ b/sources/resources/transliteration-data/xb0.php @@ -0,0 +1,20 @@ + 'ggwem', 'ggweb', 'ggwebs', 'ggwes', 'ggwess', 'ggweng', 'ggwej', 'ggwec', 'ggwek', 'ggwet', 'ggwep', 'ggweh', 'ggwi', 'ggwig', 'ggwigg', 'ggwigs', + 0x10 => 'ggwin', 'ggwinj', 'ggwinh', 'ggwid', 'ggwil', 'ggwilg', 'ggwilm', 'ggwilb', 'ggwils', 'ggwilt', 'ggwilp', 'ggwilh', 'ggwim', 'ggwib', 'ggwibs', 'ggwis', + 0x20 => 'ggwiss', 'ggwing', 'ggwij', 'ggwic', 'ggwik', 'ggwit', 'ggwip', 'ggwih', 'ggyu', 'ggyug', 'ggyugg', 'ggyugs', 'ggyun', 'ggyunj', 'ggyunh', 'ggyud', + 0x30 => 'ggyul', 'ggyulg', 'ggyulm', 'ggyulb', 'ggyuls', 'ggyult', 'ggyulp', 'ggyulh', 'ggyum', 'ggyub', 'ggyubs', 'ggyus', 'ggyuss', 'ggyung', 'ggyuj', 'ggyuc', + 0x40 => 'ggyuk', 'ggyut', 'ggyup', 'ggyuh', 'ggeu', 'ggeug', 'ggeugg', 'ggeugs', 'ggeun', 'ggeunj', 'ggeunh', 'ggeud', 'ggeul', 'ggeulg', 'ggeulm', 'ggeulb', + 0x50 => 'ggeuls', 'ggeult', 'ggeulp', 'ggeulh', 'ggeum', 'ggeub', 'ggeubs', 'ggeus', 'ggeuss', 'ggeung', 'ggeuj', 'ggeuc', 'ggeuk', 'ggeut', 'ggeup', 'ggeuh', + 0x60 => 'ggyi', 'ggyig', 'ggyigg', 'ggyigs', 'ggyin', 'ggyinj', 'ggyinh', 'ggyid', 'ggyil', 'ggyilg', 'ggyilm', 'ggyilb', 'ggyils', 'ggyilt', 'ggyilp', 'ggyilh', + 0x70 => 'ggyim', 'ggyib', 'ggyibs', 'ggyis', 'ggyiss', 'ggying', 'ggyij', 'ggyic', 'ggyik', 'ggyit', 'ggyip', 'ggyih', 'ggi', 'ggig', 'ggigg', 'ggigs', + 0x80 => 'ggin', 'gginj', 'gginh', 'ggid', 'ggil', 'ggilg', 'ggilm', 'ggilb', 'ggils', 'ggilt', 'ggilp', 'ggilh', 'ggim', 'ggib', 'ggibs', 'ggis', + 0x90 => 'ggiss', 'gging', 'ggij', 'ggic', 'ggik', 'ggit', 'ggip', 'ggih', 'na', 'nag', 'nagg', 'nags', 'nan', 'nanj', 'nanh', 'nad', + 0xA0 => 'nal', 'nalg', 'nalm', 'nalb', 'nals', 'nalt', 'nalp', 'nalh', 'nam', 'nab', 'nabs', 'nas', 'nass', 'nang', 'naj', 'nac', + 0xB0 => 'nak', 'nat', 'nap', 'nah', 'nae', 'naeg', 'naegg', 'naegs', 'naen', 'naenj', 'naenh', 'naed', 'nael', 'naelg', 'naelm', 'naelb', + 0xC0 => 'naels', 'naelt', 'naelp', 'naelh', 'naem', 'naeb', 'naebs', 'naes', 'naess', 'naeng', 'naej', 'naec', 'naek', 'naet', 'naep', 'naeh', + 0xD0 => 'nya', 'nyag', 'nyagg', 'nyags', 'nyan', 'nyanj', 'nyanh', 'nyad', 'nyal', 'nyalg', 'nyalm', 'nyalb', 'nyals', 'nyalt', 'nyalp', 'nyalh', + 0xE0 => 'nyam', 'nyab', 'nyabs', 'nyas', 'nyass', 'nyang', 'nyaj', 'nyac', 'nyak', 'nyat', 'nyap', 'nyah', 'nyae', 'nyaeg', 'nyaegg', 'nyaegs', + 0xF0 => 'nyaen', 'nyaenj', 'nyaenh', 'nyaed', 'nyael', 'nyaelg', 'nyaelm', 'nyaelb', 'nyaels', 'nyaelt', 'nyaelp', 'nyaelh', 'nyaem', 'nyaeb', 'nyaebs', 'nyaes', +); diff --git a/sources/resources/transliteration-data/xb1.php b/sources/resources/transliteration-data/xb1.php new file mode 100644 index 0000000..9c93517 --- /dev/null +++ b/sources/resources/transliteration-data/xb1.php @@ -0,0 +1,20 @@ + 'nyaess', 'nyaeng', 'nyaej', 'nyaec', 'nyaek', 'nyaet', 'nyaep', 'nyaeh', 'neo', 'neog', 'neogg', 'neogs', 'neon', 'neonj', 'neonh', 'neod', + 0x10 => 'neol', 'neolg', 'neolm', 'neolb', 'neols', 'neolt', 'neolp', 'neolh', 'neom', 'neob', 'neobs', 'neos', 'neoss', 'neong', 'neoj', 'neoc', + 0x20 => 'neok', 'neot', 'neop', 'neoh', 'ne', 'neg', 'negg', 'negs', 'nen', 'nenj', 'nenh', 'ned', 'nel', 'nelg', 'nelm', 'nelb', + 0x30 => 'nels', 'nelt', 'nelp', 'nelh', 'nem', 'neb', 'nebs', 'nes', 'ness', 'neng', 'nej', 'nec', 'nek', 'net', 'nep', 'neh', + 0x40 => 'nyeo', 'nyeog', 'nyeogg', 'nyeogs', 'nyeon', 'nyeonj', 'nyeonh', 'nyeod', 'nyeol', 'nyeolg', 'nyeolm', 'nyeolb', 'nyeols', 'nyeolt', 'nyeolp', 'nyeolh', + 0x50 => 'nyeom', 'nyeob', 'nyeobs', 'nyeos', 'nyeoss', 'nyeong', 'nyeoj', 'nyeoc', 'nyeok', 'nyeot', 'nyeop', 'nyeoh', 'nye', 'nyeg', 'nyegg', 'nyegs', + 0x60 => 'nyen', 'nyenj', 'nyenh', 'nyed', 'nyel', 'nyelg', 'nyelm', 'nyelb', 'nyels', 'nyelt', 'nyelp', 'nyelh', 'nyem', 'nyeb', 'nyebs', 'nyes', + 0x70 => 'nyess', 'nyeng', 'nyej', 'nyec', 'nyek', 'nyet', 'nyep', 'nyeh', 'no', 'nog', 'nogg', 'nogs', 'non', 'nonj', 'nonh', 'nod', + 0x80 => 'nol', 'nolg', 'nolm', 'nolb', 'nols', 'nolt', 'nolp', 'nolh', 'nom', 'nob', 'nobs', 'nos', 'noss', 'nong', 'noj', 'noc', + 0x90 => 'nok', 'not', 'nop', 'noh', 'nwa', 'nwag', 'nwagg', 'nwags', 'nwan', 'nwanj', 'nwanh', 'nwad', 'nwal', 'nwalg', 'nwalm', 'nwalb', + 0xA0 => 'nwals', 'nwalt', 'nwalp', 'nwalh', 'nwam', 'nwab', 'nwabs', 'nwas', 'nwass', 'nwang', 'nwaj', 'nwac', 'nwak', 'nwat', 'nwap', 'nwah', + 0xB0 => 'nwae', 'nwaeg', 'nwaegg', 'nwaegs', 'nwaen', 'nwaenj', 'nwaenh', 'nwaed', 'nwael', 'nwaelg', 'nwaelm', 'nwaelb', 'nwaels', 'nwaelt', 'nwaelp', 'nwaelh', + 0xC0 => 'nwaem', 'nwaeb', 'nwaebs', 'nwaes', 'nwaess', 'nwaeng', 'nwaej', 'nwaec', 'nwaek', 'nwaet', 'nwaep', 'nwaeh', 'noe', 'noeg', 'noegg', 'noegs', + 0xD0 => 'noen', 'noenj', 'noenh', 'noed', 'noel', 'noelg', 'noelm', 'noelb', 'noels', 'noelt', 'noelp', 'noelh', 'noem', 'noeb', 'noebs', 'noes', + 0xE0 => 'noess', 'noeng', 'noej', 'noec', 'noek', 'noet', 'noep', 'noeh', 'nyo', 'nyog', 'nyogg', 'nyogs', 'nyon', 'nyonj', 'nyonh', 'nyod', + 0xF0 => 'nyol', 'nyolg', 'nyolm', 'nyolb', 'nyols', 'nyolt', 'nyolp', 'nyolh', 'nyom', 'nyob', 'nyobs', 'nyos', 'nyoss', 'nyong', 'nyoj', 'nyoc', +); diff --git a/sources/resources/transliteration-data/xb2.php b/sources/resources/transliteration-data/xb2.php new file mode 100644 index 0000000..2a8630d --- /dev/null +++ b/sources/resources/transliteration-data/xb2.php @@ -0,0 +1,20 @@ + 'nyok', 'nyot', 'nyop', 'nyoh', 'nu', 'nug', 'nugg', 'nugs', 'nun', 'nunj', 'nunh', 'nud', 'nul', 'nulg', 'nulm', 'nulb', + 0x10 => 'nuls', 'nult', 'nulp', 'nulh', 'num', 'nub', 'nubs', 'nus', 'nuss', 'nung', 'nuj', 'nuc', 'nuk', 'nut', 'nup', 'nuh', + 0x20 => 'nweo', 'nweog', 'nweogg', 'nweogs', 'nweon', 'nweonj', 'nweonh', 'nweod', 'nweol', 'nweolg', 'nweolm', 'nweolb', 'nweols', 'nweolt', 'nweolp', 'nweolh', + 0x30 => 'nweom', 'nweob', 'nweobs', 'nweos', 'nweoss', 'nweong', 'nweoj', 'nweoc', 'nweok', 'nweot', 'nweop', 'nweoh', 'nwe', 'nweg', 'nwegg', 'nwegs', + 0x40 => 'nwen', 'nwenj', 'nwenh', 'nwed', 'nwel', 'nwelg', 'nwelm', 'nwelb', 'nwels', 'nwelt', 'nwelp', 'nwelh', 'nwem', 'nweb', 'nwebs', 'nwes', + 0x50 => 'nwess', 'nweng', 'nwej', 'nwec', 'nwek', 'nwet', 'nwep', 'nweh', 'nwi', 'nwig', 'nwigg', 'nwigs', 'nwin', 'nwinj', 'nwinh', 'nwid', + 0x60 => 'nwil', 'nwilg', 'nwilm', 'nwilb', 'nwils', 'nwilt', 'nwilp', 'nwilh', 'nwim', 'nwib', 'nwibs', 'nwis', 'nwiss', 'nwing', 'nwij', 'nwic', + 0x70 => 'nwik', 'nwit', 'nwip', 'nwih', 'nyu', 'nyug', 'nyugg', 'nyugs', 'nyun', 'nyunj', 'nyunh', 'nyud', 'nyul', 'nyulg', 'nyulm', 'nyulb', + 0x80 => 'nyuls', 'nyult', 'nyulp', 'nyulh', 'nyum', 'nyub', 'nyubs', 'nyus', 'nyuss', 'nyung', 'nyuj', 'nyuc', 'nyuk', 'nyut', 'nyup', 'nyuh', + 0x90 => 'neu', 'neug', 'neugg', 'neugs', 'neun', 'neunj', 'neunh', 'neud', 'neul', 'neulg', 'neulm', 'neulb', 'neuls', 'neult', 'neulp', 'neulh', + 0xA0 => 'neum', 'neub', 'neubs', 'neus', 'neuss', 'neung', 'neuj', 'neuc', 'neuk', 'neut', 'neup', 'neuh', 'nyi', 'nyig', 'nyigg', 'nyigs', + 0xB0 => 'nyin', 'nyinj', 'nyinh', 'nyid', 'nyil', 'nyilg', 'nyilm', 'nyilb', 'nyils', 'nyilt', 'nyilp', 'nyilh', 'nyim', 'nyib', 'nyibs', 'nyis', + 0xC0 => 'nyiss', 'nying', 'nyij', 'nyic', 'nyik', 'nyit', 'nyip', 'nyih', 'ni', 'nig', 'nigg', 'nigs', 'nin', 'ninj', 'ninh', 'nid', + 0xD0 => 'nil', 'nilg', 'nilm', 'nilb', 'nils', 'nilt', 'nilp', 'nilh', 'nim', 'nib', 'nibs', 'nis', 'niss', 'ning', 'nij', 'nic', + 0xE0 => 'nik', 'nit', 'nip', 'nih', 'da', 'dag', 'dagg', 'dags', 'dan', 'danj', 'danh', 'dad', 'dal', 'dalg', 'dalm', 'dalb', + 0xF0 => 'dals', 'dalt', 'dalp', 'dalh', 'dam', 'dab', 'dabs', 'das', 'dass', 'dang', 'daj', 'dac', 'dak', 'dat', 'dap', 'dah', +); diff --git a/sources/resources/transliteration-data/xb3.php b/sources/resources/transliteration-data/xb3.php new file mode 100644 index 0000000..01ccdcc --- /dev/null +++ b/sources/resources/transliteration-data/xb3.php @@ -0,0 +1,20 @@ + 'dae', 'daeg', 'daegg', 'daegs', 'daen', 'daenj', 'daenh', 'daed', 'dael', 'daelg', 'daelm', 'daelb', 'daels', 'daelt', 'daelp', 'daelh', + 0x10 => 'daem', 'daeb', 'daebs', 'daes', 'daess', 'daeng', 'daej', 'daec', 'daek', 'daet', 'daep', 'daeh', 'dya', 'dyag', 'dyagg', 'dyags', + 0x20 => 'dyan', 'dyanj', 'dyanh', 'dyad', 'dyal', 'dyalg', 'dyalm', 'dyalb', 'dyals', 'dyalt', 'dyalp', 'dyalh', 'dyam', 'dyab', 'dyabs', 'dyas', + 0x30 => 'dyass', 'dyang', 'dyaj', 'dyac', 'dyak', 'dyat', 'dyap', 'dyah', 'dyae', 'dyaeg', 'dyaegg', 'dyaegs', 'dyaen', 'dyaenj', 'dyaenh', 'dyaed', + 0x40 => 'dyael', 'dyaelg', 'dyaelm', 'dyaelb', 'dyaels', 'dyaelt', 'dyaelp', 'dyaelh', 'dyaem', 'dyaeb', 'dyaebs', 'dyaes', 'dyaess', 'dyaeng', 'dyaej', 'dyaec', + 0x50 => 'dyaek', 'dyaet', 'dyaep', 'dyaeh', 'deo', 'deog', 'deogg', 'deogs', 'deon', 'deonj', 'deonh', 'deod', 'deol', 'deolg', 'deolm', 'deolb', + 0x60 => 'deols', 'deolt', 'deolp', 'deolh', 'deom', 'deob', 'deobs', 'deos', 'deoss', 'deong', 'deoj', 'deoc', 'deok', 'deot', 'deop', 'deoh', + 0x70 => 'de', 'deg', 'degg', 'degs', 'den', 'denj', 'denh', 'ded', 'del', 'delg', 'delm', 'delb', 'dels', 'delt', 'delp', 'delh', + 0x80 => 'dem', 'deb', 'debs', 'des', 'dess', 'deng', 'dej', 'dec', 'dek', 'det', 'dep', 'deh', 'dyeo', 'dyeog', 'dyeogg', 'dyeogs', + 0x90 => 'dyeon', 'dyeonj', 'dyeonh', 'dyeod', 'dyeol', 'dyeolg', 'dyeolm', 'dyeolb', 'dyeols', 'dyeolt', 'dyeolp', 'dyeolh', 'dyeom', 'dyeob', 'dyeobs', 'dyeos', + 0xA0 => 'dyeoss', 'dyeong', 'dyeoj', 'dyeoc', 'dyeok', 'dyeot', 'dyeop', 'dyeoh', 'dye', 'dyeg', 'dyegg', 'dyegs', 'dyen', 'dyenj', 'dyenh', 'dyed', + 0xB0 => 'dyel', 'dyelg', 'dyelm', 'dyelb', 'dyels', 'dyelt', 'dyelp', 'dyelh', 'dyem', 'dyeb', 'dyebs', 'dyes', 'dyess', 'dyeng', 'dyej', 'dyec', + 0xC0 => 'dyek', 'dyet', 'dyep', 'dyeh', 'do', 'dog', 'dogg', 'dogs', 'don', 'donj', 'donh', 'dod', 'dol', 'dolg', 'dolm', 'dolb', + 0xD0 => 'dols', 'dolt', 'dolp', 'dolh', 'dom', 'dob', 'dobs', 'dos', 'doss', 'dong', 'doj', 'doc', 'dok', 'dot', 'dop', 'doh', + 0xE0 => 'dwa', 'dwag', 'dwagg', 'dwags', 'dwan', 'dwanj', 'dwanh', 'dwad', 'dwal', 'dwalg', 'dwalm', 'dwalb', 'dwals', 'dwalt', 'dwalp', 'dwalh', + 0xF0 => 'dwam', 'dwab', 'dwabs', 'dwas', 'dwass', 'dwang', 'dwaj', 'dwac', 'dwak', 'dwat', 'dwap', 'dwah', 'dwae', 'dwaeg', 'dwaegg', 'dwaegs', +); diff --git a/sources/resources/transliteration-data/xb4.php b/sources/resources/transliteration-data/xb4.php new file mode 100644 index 0000000..91d5681 --- /dev/null +++ b/sources/resources/transliteration-data/xb4.php @@ -0,0 +1,20 @@ + 'dwaen', 'dwaenj', 'dwaenh', 'dwaed', 'dwael', 'dwaelg', 'dwaelm', 'dwaelb', 'dwaels', 'dwaelt', 'dwaelp', 'dwaelh', 'dwaem', 'dwaeb', 'dwaebs', 'dwaes', + 0x10 => 'dwaess', 'dwaeng', 'dwaej', 'dwaec', 'dwaek', 'dwaet', 'dwaep', 'dwaeh', 'doe', 'doeg', 'doegg', 'doegs', 'doen', 'doenj', 'doenh', 'doed', + 0x20 => 'doel', 'doelg', 'doelm', 'doelb', 'doels', 'doelt', 'doelp', 'doelh', 'doem', 'doeb', 'doebs', 'does', 'doess', 'doeng', 'doej', 'doec', + 0x30 => 'doek', 'doet', 'doep', 'doeh', 'dyo', 'dyog', 'dyogg', 'dyogs', 'dyon', 'dyonj', 'dyonh', 'dyod', 'dyol', 'dyolg', 'dyolm', 'dyolb', + 0x40 => 'dyols', 'dyolt', 'dyolp', 'dyolh', 'dyom', 'dyob', 'dyobs', 'dyos', 'dyoss', 'dyong', 'dyoj', 'dyoc', 'dyok', 'dyot', 'dyop', 'dyoh', + 0x50 => 'du', 'dug', 'dugg', 'dugs', 'dun', 'dunj', 'dunh', 'dud', 'dul', 'dulg', 'dulm', 'dulb', 'duls', 'dult', 'dulp', 'dulh', + 0x60 => 'dum', 'dub', 'dubs', 'dus', 'duss', 'dung', 'duj', 'duc', 'duk', 'dut', 'dup', 'duh', 'dweo', 'dweog', 'dweogg', 'dweogs', + 0x70 => 'dweon', 'dweonj', 'dweonh', 'dweod', 'dweol', 'dweolg', 'dweolm', 'dweolb', 'dweols', 'dweolt', 'dweolp', 'dweolh', 'dweom', 'dweob', 'dweobs', 'dweos', + 0x80 => 'dweoss', 'dweong', 'dweoj', 'dweoc', 'dweok', 'dweot', 'dweop', 'dweoh', 'dwe', 'dweg', 'dwegg', 'dwegs', 'dwen', 'dwenj', 'dwenh', 'dwed', + 0x90 => 'dwel', 'dwelg', 'dwelm', 'dwelb', 'dwels', 'dwelt', 'dwelp', 'dwelh', 'dwem', 'dweb', 'dwebs', 'dwes', 'dwess', 'dweng', 'dwej', 'dwec', + 0xA0 => 'dwek', 'dwet', 'dwep', 'dweh', 'dwi', 'dwig', 'dwigg', 'dwigs', 'dwin', 'dwinj', 'dwinh', 'dwid', 'dwil', 'dwilg', 'dwilm', 'dwilb', + 0xB0 => 'dwils', 'dwilt', 'dwilp', 'dwilh', 'dwim', 'dwib', 'dwibs', 'dwis', 'dwiss', 'dwing', 'dwij', 'dwic', 'dwik', 'dwit', 'dwip', 'dwih', + 0xC0 => 'dyu', 'dyug', 'dyugg', 'dyugs', 'dyun', 'dyunj', 'dyunh', 'dyud', 'dyul', 'dyulg', 'dyulm', 'dyulb', 'dyuls', 'dyult', 'dyulp', 'dyulh', + 0xD0 => 'dyum', 'dyub', 'dyubs', 'dyus', 'dyuss', 'dyung', 'dyuj', 'dyuc', 'dyuk', 'dyut', 'dyup', 'dyuh', 'deu', 'deug', 'deugg', 'deugs', + 0xE0 => 'deun', 'deunj', 'deunh', 'deud', 'deul', 'deulg', 'deulm', 'deulb', 'deuls', 'deult', 'deulp', 'deulh', 'deum', 'deub', 'deubs', 'deus', + 0xF0 => 'deuss', 'deung', 'deuj', 'deuc', 'deuk', 'deut', 'deup', 'deuh', 'dyi', 'dyig', 'dyigg', 'dyigs', 'dyin', 'dyinj', 'dyinh', 'dyid', +); diff --git a/sources/resources/transliteration-data/xb5.php b/sources/resources/transliteration-data/xb5.php new file mode 100644 index 0000000..8176247 --- /dev/null +++ b/sources/resources/transliteration-data/xb5.php @@ -0,0 +1,20 @@ + 'dyil', 'dyilg', 'dyilm', 'dyilb', 'dyils', 'dyilt', 'dyilp', 'dyilh', 'dyim', 'dyib', 'dyibs', 'dyis', 'dyiss', 'dying', 'dyij', 'dyic', + 0x10 => 'dyik', 'dyit', 'dyip', 'dyih', 'di', 'dig', 'digg', 'digs', 'din', 'dinj', 'dinh', 'did', 'dil', 'dilg', 'dilm', 'dilb', + 0x20 => 'dils', 'dilt', 'dilp', 'dilh', 'dim', 'dib', 'dibs', 'dis', 'diss', 'ding', 'dij', 'dic', 'dik', 'dit', 'dip', 'dih', + 0x30 => 'dda', 'ddag', 'ddagg', 'ddags', 'ddan', 'ddanj', 'ddanh', 'ddad', 'ddal', 'ddalg', 'ddalm', 'ddalb', 'ddals', 'ddalt', 'ddalp', 'ddalh', + 0x40 => 'ddam', 'ddab', 'ddabs', 'ddas', 'ddass', 'ddang', 'ddaj', 'ddac', 'ddak', 'ddat', 'ddap', 'ddah', 'ddae', 'ddaeg', 'ddaegg', 'ddaegs', + 0x50 => 'ddaen', 'ddaenj', 'ddaenh', 'ddaed', 'ddael', 'ddaelg', 'ddaelm', 'ddaelb', 'ddaels', 'ddaelt', 'ddaelp', 'ddaelh', 'ddaem', 'ddaeb', 'ddaebs', 'ddaes', + 0x60 => 'ddaess', 'ddaeng', 'ddaej', 'ddaec', 'ddaek', 'ddaet', 'ddaep', 'ddaeh', 'ddya', 'ddyag', 'ddyagg', 'ddyags', 'ddyan', 'ddyanj', 'ddyanh', 'ddyad', + 0x70 => 'ddyal', 'ddyalg', 'ddyalm', 'ddyalb', 'ddyals', 'ddyalt', 'ddyalp', 'ddyalh', 'ddyam', 'ddyab', 'ddyabs', 'ddyas', 'ddyass', 'ddyang', 'ddyaj', 'ddyac', + 0x80 => 'ddyak', 'ddyat', 'ddyap', 'ddyah', 'ddyae', 'ddyaeg', 'ddyaegg', 'ddyaegs', 'ddyaen', 'ddyaenj', 'ddyaenh', 'ddyaed', 'ddyael', 'ddyaelg', 'ddyaelm', 'ddyaelb', + 0x90 => 'ddyaels', 'ddyaelt', 'ddyaelp', 'ddyaelh', 'ddyaem', 'ddyaeb', 'ddyaebs', 'ddyaes', 'ddyaess', 'ddyaeng', 'ddyaej', 'ddyaec', 'ddyaek', 'ddyaet', 'ddyaep', 'ddyaeh', + 0xA0 => 'ddeo', 'ddeog', 'ddeogg', 'ddeogs', 'ddeon', 'ddeonj', 'ddeonh', 'ddeod', 'ddeol', 'ddeolg', 'ddeolm', 'ddeolb', 'ddeols', 'ddeolt', 'ddeolp', 'ddeolh', + 0xB0 => 'ddeom', 'ddeob', 'ddeobs', 'ddeos', 'ddeoss', 'ddeong', 'ddeoj', 'ddeoc', 'ddeok', 'ddeot', 'ddeop', 'ddeoh', 'dde', 'ddeg', 'ddegg', 'ddegs', + 0xC0 => 'dden', 'ddenj', 'ddenh', 'dded', 'ddel', 'ddelg', 'ddelm', 'ddelb', 'ddels', 'ddelt', 'ddelp', 'ddelh', 'ddem', 'ddeb', 'ddebs', 'ddes', + 0xD0 => 'ddess', 'ddeng', 'ddej', 'ddec', 'ddek', 'ddet', 'ddep', 'ddeh', 'ddyeo', 'ddyeog', 'ddyeogg', 'ddyeogs', 'ddyeon', 'ddyeonj', 'ddyeonh', 'ddyeod', + 0xE0 => 'ddyeol', 'ddyeolg', 'ddyeolm', 'ddyeolb', 'ddyeols', 'ddyeolt', 'ddyeolp', 'ddyeolh', 'ddyeom', 'ddyeob', 'ddyeobs', 'ddyeos', 'ddyeoss', 'ddyeong', 'ddyeoj', 'ddyeoc', + 0xF0 => 'ddyeok', 'ddyeot', 'ddyeop', 'ddyeoh', 'ddye', 'ddyeg', 'ddyegg', 'ddyegs', 'ddyen', 'ddyenj', 'ddyenh', 'ddyed', 'ddyel', 'ddyelg', 'ddyelm', 'ddyelb', +); diff --git a/sources/resources/transliteration-data/xb6.php b/sources/resources/transliteration-data/xb6.php new file mode 100644 index 0000000..e91834a --- /dev/null +++ b/sources/resources/transliteration-data/xb6.php @@ -0,0 +1,20 @@ + 'ddyels', 'ddyelt', 'ddyelp', 'ddyelh', 'ddyem', 'ddyeb', 'ddyebs', 'ddyes', 'ddyess', 'ddyeng', 'ddyej', 'ddyec', 'ddyek', 'ddyet', 'ddyep', 'ddyeh', + 0x10 => 'ddo', 'ddog', 'ddogg', 'ddogs', 'ddon', 'ddonj', 'ddonh', 'ddod', 'ddol', 'ddolg', 'ddolm', 'ddolb', 'ddols', 'ddolt', 'ddolp', 'ddolh', + 0x20 => 'ddom', 'ddob', 'ddobs', 'ddos', 'ddoss', 'ddong', 'ddoj', 'ddoc', 'ddok', 'ddot', 'ddop', 'ddoh', 'ddwa', 'ddwag', 'ddwagg', 'ddwags', + 0x30 => 'ddwan', 'ddwanj', 'ddwanh', 'ddwad', 'ddwal', 'ddwalg', 'ddwalm', 'ddwalb', 'ddwals', 'ddwalt', 'ddwalp', 'ddwalh', 'ddwam', 'ddwab', 'ddwabs', 'ddwas', + 0x40 => 'ddwass', 'ddwang', 'ddwaj', 'ddwac', 'ddwak', 'ddwat', 'ddwap', 'ddwah', 'ddwae', 'ddwaeg', 'ddwaegg', 'ddwaegs', 'ddwaen', 'ddwaenj', 'ddwaenh', 'ddwaed', + 0x50 => 'ddwael', 'ddwaelg', 'ddwaelm', 'ddwaelb', 'ddwaels', 'ddwaelt', 'ddwaelp', 'ddwaelh', 'ddwaem', 'ddwaeb', 'ddwaebs', 'ddwaes', 'ddwaess', 'ddwaeng', 'ddwaej', 'ddwaec', + 0x60 => 'ddwaek', 'ddwaet', 'ddwaep', 'ddwaeh', 'ddoe', 'ddoeg', 'ddoegg', 'ddoegs', 'ddoen', 'ddoenj', 'ddoenh', 'ddoed', 'ddoel', 'ddoelg', 'ddoelm', 'ddoelb', + 0x70 => 'ddoels', 'ddoelt', 'ddoelp', 'ddoelh', 'ddoem', 'ddoeb', 'ddoebs', 'ddoes', 'ddoess', 'ddoeng', 'ddoej', 'ddoec', 'ddoek', 'ddoet', 'ddoep', 'ddoeh', + 0x80 => 'ddyo', 'ddyog', 'ddyogg', 'ddyogs', 'ddyon', 'ddyonj', 'ddyonh', 'ddyod', 'ddyol', 'ddyolg', 'ddyolm', 'ddyolb', 'ddyols', 'ddyolt', 'ddyolp', 'ddyolh', + 0x90 => 'ddyom', 'ddyob', 'ddyobs', 'ddyos', 'ddyoss', 'ddyong', 'ddyoj', 'ddyoc', 'ddyok', 'ddyot', 'ddyop', 'ddyoh', 'ddu', 'ddug', 'ddugg', 'ddugs', + 0xA0 => 'ddun', 'ddunj', 'ddunh', 'ddud', 'ddul', 'ddulg', 'ddulm', 'ddulb', 'dduls', 'ddult', 'ddulp', 'ddulh', 'ddum', 'ddub', 'ddubs', 'ddus', + 0xB0 => 'dduss', 'ddung', 'dduj', 'dduc', 'dduk', 'ddut', 'ddup', 'dduh', 'ddweo', 'ddweog', 'ddweogg', 'ddweogs', 'ddweon', 'ddweonj', 'ddweonh', 'ddweod', + 0xC0 => 'ddweol', 'ddweolg', 'ddweolm', 'ddweolb', 'ddweols', 'ddweolt', 'ddweolp', 'ddweolh', 'ddweom', 'ddweob', 'ddweobs', 'ddweos', 'ddweoss', 'ddweong', 'ddweoj', 'ddweoc', + 0xD0 => 'ddweok', 'ddweot', 'ddweop', 'ddweoh', 'ddwe', 'ddweg', 'ddwegg', 'ddwegs', 'ddwen', 'ddwenj', 'ddwenh', 'ddwed', 'ddwel', 'ddwelg', 'ddwelm', 'ddwelb', + 0xE0 => 'ddwels', 'ddwelt', 'ddwelp', 'ddwelh', 'ddwem', 'ddweb', 'ddwebs', 'ddwes', 'ddwess', 'ddweng', 'ddwej', 'ddwec', 'ddwek', 'ddwet', 'ddwep', 'ddweh', + 0xF0 => 'ddwi', 'ddwig', 'ddwigg', 'ddwigs', 'ddwin', 'ddwinj', 'ddwinh', 'ddwid', 'ddwil', 'ddwilg', 'ddwilm', 'ddwilb', 'ddwils', 'ddwilt', 'ddwilp', 'ddwilh', +); diff --git a/sources/resources/transliteration-data/xb7.php b/sources/resources/transliteration-data/xb7.php new file mode 100644 index 0000000..fc68f8b --- /dev/null +++ b/sources/resources/transliteration-data/xb7.php @@ -0,0 +1,20 @@ + 'ddwim', 'ddwib', 'ddwibs', 'ddwis', 'ddwiss', 'ddwing', 'ddwij', 'ddwic', 'ddwik', 'ddwit', 'ddwip', 'ddwih', 'ddyu', 'ddyug', 'ddyugg', 'ddyugs', + 0x10 => 'ddyun', 'ddyunj', 'ddyunh', 'ddyud', 'ddyul', 'ddyulg', 'ddyulm', 'ddyulb', 'ddyuls', 'ddyult', 'ddyulp', 'ddyulh', 'ddyum', 'ddyub', 'ddyubs', 'ddyus', + 0x20 => 'ddyuss', 'ddyung', 'ddyuj', 'ddyuc', 'ddyuk', 'ddyut', 'ddyup', 'ddyuh', 'ddeu', 'ddeug', 'ddeugg', 'ddeugs', 'ddeun', 'ddeunj', 'ddeunh', 'ddeud', + 0x30 => 'ddeul', 'ddeulg', 'ddeulm', 'ddeulb', 'ddeuls', 'ddeult', 'ddeulp', 'ddeulh', 'ddeum', 'ddeub', 'ddeubs', 'ddeus', 'ddeuss', 'ddeung', 'ddeuj', 'ddeuc', + 0x40 => 'ddeuk', 'ddeut', 'ddeup', 'ddeuh', 'ddyi', 'ddyig', 'ddyigg', 'ddyigs', 'ddyin', 'ddyinj', 'ddyinh', 'ddyid', 'ddyil', 'ddyilg', 'ddyilm', 'ddyilb', + 0x50 => 'ddyils', 'ddyilt', 'ddyilp', 'ddyilh', 'ddyim', 'ddyib', 'ddyibs', 'ddyis', 'ddyiss', 'ddying', 'ddyij', 'ddyic', 'ddyik', 'ddyit', 'ddyip', 'ddyih', + 0x60 => 'ddi', 'ddig', 'ddigg', 'ddigs', 'ddin', 'ddinj', 'ddinh', 'ddid', 'ddil', 'ddilg', 'ddilm', 'ddilb', 'ddils', 'ddilt', 'ddilp', 'ddilh', + 0x70 => 'ddim', 'ddib', 'ddibs', 'ddis', 'ddiss', 'dding', 'ddij', 'ddic', 'ddik', 'ddit', 'ddip', 'ddih', 'ra', 'rag', 'ragg', 'rags', + 0x80 => 'ran', 'ranj', 'ranh', 'rad', 'ral', 'ralg', 'ralm', 'ralb', 'rals', 'ralt', 'ralp', 'ralh', 'ram', 'rab', 'rabs', 'ras', + 0x90 => 'rass', 'rang', 'raj', 'rac', 'rak', 'rat', 'rap', 'rah', 'rae', 'raeg', 'raegg', 'raegs', 'raen', 'raenj', 'raenh', 'raed', + 0xA0 => 'rael', 'raelg', 'raelm', 'raelb', 'raels', 'raelt', 'raelp', 'raelh', 'raem', 'raeb', 'raebs', 'raes', 'raess', 'raeng', 'raej', 'raec', + 0xB0 => 'raek', 'raet', 'raep', 'raeh', 'rya', 'ryag', 'ryagg', 'ryags', 'ryan', 'ryanj', 'ryanh', 'ryad', 'ryal', 'ryalg', 'ryalm', 'ryalb', + 0xC0 => 'ryals', 'ryalt', 'ryalp', 'ryalh', 'ryam', 'ryab', 'ryabs', 'ryas', 'ryass', 'ryang', 'ryaj', 'ryac', 'ryak', 'ryat', 'ryap', 'ryah', + 0xD0 => 'ryae', 'ryaeg', 'ryaegg', 'ryaegs', 'ryaen', 'ryaenj', 'ryaenh', 'ryaed', 'ryael', 'ryaelg', 'ryaelm', 'ryaelb', 'ryaels', 'ryaelt', 'ryaelp', 'ryaelh', + 0xE0 => 'ryaem', 'ryaeb', 'ryaebs', 'ryaes', 'ryaess', 'ryaeng', 'ryaej', 'ryaec', 'ryaek', 'ryaet', 'ryaep', 'ryaeh', 'reo', 'reog', 'reogg', 'reogs', + 0xF0 => 'reon', 'reonj', 'reonh', 'reod', 'reol', 'reolg', 'reolm', 'reolb', 'reols', 'reolt', 'reolp', 'reolh', 'reom', 'reob', 'reobs', 'reos', +); diff --git a/sources/resources/transliteration-data/xb8.php b/sources/resources/transliteration-data/xb8.php new file mode 100644 index 0000000..ddc48a8 --- /dev/null +++ b/sources/resources/transliteration-data/xb8.php @@ -0,0 +1,20 @@ + 'reoss', 'reong', 'reoj', 'reoc', 'reok', 'reot', 'reop', 'reoh', 're', 'reg', 'regg', 'regs', 'ren', 'renj', 'renh', 'red', + 0x10 => 'rel', 'relg', 'relm', 'relb', 'rels', 'relt', 'relp', 'relh', 'rem', 'reb', 'rebs', 'res', 'ress', 'reng', 'rej', 'rec', + 0x20 => 'rek', 'ret', 'rep', 'reh', 'ryeo', 'ryeog', 'ryeogg', 'ryeogs', 'ryeon', 'ryeonj', 'ryeonh', 'ryeod', 'ryeol', 'ryeolg', 'ryeolm', 'ryeolb', + 0x30 => 'ryeols', 'ryeolt', 'ryeolp', 'ryeolh', 'ryeom', 'ryeob', 'ryeobs', 'ryeos', 'ryeoss', 'ryeong', 'ryeoj', 'ryeoc', 'ryeok', 'ryeot', 'ryeop', 'ryeoh', + 0x40 => 'rye', 'ryeg', 'ryegg', 'ryegs', 'ryen', 'ryenj', 'ryenh', 'ryed', 'ryel', 'ryelg', 'ryelm', 'ryelb', 'ryels', 'ryelt', 'ryelp', 'ryelh', + 0x50 => 'ryem', 'ryeb', 'ryebs', 'ryes', 'ryess', 'ryeng', 'ryej', 'ryec', 'ryek', 'ryet', 'ryep', 'ryeh', 'ro', 'rog', 'rogg', 'rogs', + 0x60 => 'ron', 'ronj', 'ronh', 'rod', 'rol', 'rolg', 'rolm', 'rolb', 'rols', 'rolt', 'rolp', 'rolh', 'rom', 'rob', 'robs', 'ros', + 0x70 => 'ross', 'rong', 'roj', 'roc', 'rok', 'rot', 'rop', 'roh', 'rwa', 'rwag', 'rwagg', 'rwags', 'rwan', 'rwanj', 'rwanh', 'rwad', + 0x80 => 'rwal', 'rwalg', 'rwalm', 'rwalb', 'rwals', 'rwalt', 'rwalp', 'rwalh', 'rwam', 'rwab', 'rwabs', 'rwas', 'rwass', 'rwang', 'rwaj', 'rwac', + 0x90 => 'rwak', 'rwat', 'rwap', 'rwah', 'rwae', 'rwaeg', 'rwaegg', 'rwaegs', 'rwaen', 'rwaenj', 'rwaenh', 'rwaed', 'rwael', 'rwaelg', 'rwaelm', 'rwaelb', + 0xA0 => 'rwaels', 'rwaelt', 'rwaelp', 'rwaelh', 'rwaem', 'rwaeb', 'rwaebs', 'rwaes', 'rwaess', 'rwaeng', 'rwaej', 'rwaec', 'rwaek', 'rwaet', 'rwaep', 'rwaeh', + 0xB0 => 'roe', 'roeg', 'roegg', 'roegs', 'roen', 'roenj', 'roenh', 'roed', 'roel', 'roelg', 'roelm', 'roelb', 'roels', 'roelt', 'roelp', 'roelh', + 0xC0 => 'roem', 'roeb', 'roebs', 'roes', 'roess', 'roeng', 'roej', 'roec', 'roek', 'roet', 'roep', 'roeh', 'ryo', 'ryog', 'ryogg', 'ryogs', + 0xD0 => 'ryon', 'ryonj', 'ryonh', 'ryod', 'ryol', 'ryolg', 'ryolm', 'ryolb', 'ryols', 'ryolt', 'ryolp', 'ryolh', 'ryom', 'ryob', 'ryobs', 'ryos', + 0xE0 => 'ryoss', 'ryong', 'ryoj', 'ryoc', 'ryok', 'ryot', 'ryop', 'ryoh', 'ru', 'rug', 'rugg', 'rugs', 'run', 'runj', 'runh', 'rud', + 0xF0 => 'rul', 'rulg', 'rulm', 'rulb', 'ruls', 'rult', 'rulp', 'rulh', 'rum', 'rub', 'rubs', 'rus', 'russ', 'rung', 'ruj', 'ruc', +); diff --git a/sources/resources/transliteration-data/xb9.php b/sources/resources/transliteration-data/xb9.php new file mode 100644 index 0000000..f2b7227 --- /dev/null +++ b/sources/resources/transliteration-data/xb9.php @@ -0,0 +1,20 @@ + 'ruk', 'rut', 'rup', 'ruh', 'rweo', 'rweog', 'rweogg', 'rweogs', 'rweon', 'rweonj', 'rweonh', 'rweod', 'rweol', 'rweolg', 'rweolm', 'rweolb', + 0x10 => 'rweols', 'rweolt', 'rweolp', 'rweolh', 'rweom', 'rweob', 'rweobs', 'rweos', 'rweoss', 'rweong', 'rweoj', 'rweoc', 'rweok', 'rweot', 'rweop', 'rweoh', + 0x20 => 'rwe', 'rweg', 'rwegg', 'rwegs', 'rwen', 'rwenj', 'rwenh', 'rwed', 'rwel', 'rwelg', 'rwelm', 'rwelb', 'rwels', 'rwelt', 'rwelp', 'rwelh', + 0x30 => 'rwem', 'rweb', 'rwebs', 'rwes', 'rwess', 'rweng', 'rwej', 'rwec', 'rwek', 'rwet', 'rwep', 'rweh', 'rwi', 'rwig', 'rwigg', 'rwigs', + 0x40 => 'rwin', 'rwinj', 'rwinh', 'rwid', 'rwil', 'rwilg', 'rwilm', 'rwilb', 'rwils', 'rwilt', 'rwilp', 'rwilh', 'rwim', 'rwib', 'rwibs', 'rwis', + 0x50 => 'rwiss', 'rwing', 'rwij', 'rwic', 'rwik', 'rwit', 'rwip', 'rwih', 'ryu', 'ryug', 'ryugg', 'ryugs', 'ryun', 'ryunj', 'ryunh', 'ryud', + 0x60 => 'ryul', 'ryulg', 'ryulm', 'ryulb', 'ryuls', 'ryult', 'ryulp', 'ryulh', 'ryum', 'ryub', 'ryubs', 'ryus', 'ryuss', 'ryung', 'ryuj', 'ryuc', + 0x70 => 'ryuk', 'ryut', 'ryup', 'ryuh', 'reu', 'reug', 'reugg', 'reugs', 'reun', 'reunj', 'reunh', 'reud', 'reul', 'reulg', 'reulm', 'reulb', + 0x80 => 'reuls', 'reult', 'reulp', 'reulh', 'reum', 'reub', 'reubs', 'reus', 'reuss', 'reung', 'reuj', 'reuc', 'reuk', 'reut', 'reup', 'reuh', + 0x90 => 'ryi', 'ryig', 'ryigg', 'ryigs', 'ryin', 'ryinj', 'ryinh', 'ryid', 'ryil', 'ryilg', 'ryilm', 'ryilb', 'ryils', 'ryilt', 'ryilp', 'ryilh', + 0xA0 => 'ryim', 'ryib', 'ryibs', 'ryis', 'ryiss', 'rying', 'ryij', 'ryic', 'ryik', 'ryit', 'ryip', 'ryih', 'ri', 'rig', 'rigg', 'rigs', + 0xB0 => 'rin', 'rinj', 'rinh', 'rid', 'ril', 'rilg', 'rilm', 'rilb', 'rils', 'rilt', 'rilp', 'rilh', 'rim', 'rib', 'ribs', 'ris', + 0xC0 => 'riss', 'ring', 'rij', 'ric', 'rik', 'rit', 'rip', 'rih', 'ma', 'mag', 'magg', 'mags', 'man', 'manj', 'manh', 'mad', + 0xD0 => 'mal', 'malg', 'malm', 'malb', 'mals', 'malt', 'malp', 'malh', 'mam', 'mab', 'mabs', 'mas', 'mass', 'mang', 'maj', 'mac', + 0xE0 => 'mak', 'mat', 'map', 'mah', 'mae', 'maeg', 'maegg', 'maegs', 'maen', 'maenj', 'maenh', 'maed', 'mael', 'maelg', 'maelm', 'maelb', + 0xF0 => 'maels', 'maelt', 'maelp', 'maelh', 'maem', 'maeb', 'maebs', 'maes', 'maess', 'maeng', 'maej', 'maec', 'maek', 'maet', 'maep', 'maeh', +); diff --git a/sources/resources/transliteration-data/xba.php b/sources/resources/transliteration-data/xba.php new file mode 100644 index 0000000..bd370f4 --- /dev/null +++ b/sources/resources/transliteration-data/xba.php @@ -0,0 +1,20 @@ + 'mya', 'myag', 'myagg', 'myags', 'myan', 'myanj', 'myanh', 'myad', 'myal', 'myalg', 'myalm', 'myalb', 'myals', 'myalt', 'myalp', 'myalh', + 0x10 => 'myam', 'myab', 'myabs', 'myas', 'myass', 'myang', 'myaj', 'myac', 'myak', 'myat', 'myap', 'myah', 'myae', 'myaeg', 'myaegg', 'myaegs', + 0x20 => 'myaen', 'myaenj', 'myaenh', 'myaed', 'myael', 'myaelg', 'myaelm', 'myaelb', 'myaels', 'myaelt', 'myaelp', 'myaelh', 'myaem', 'myaeb', 'myaebs', 'myaes', + 0x30 => 'myaess', 'myaeng', 'myaej', 'myaec', 'myaek', 'myaet', 'myaep', 'myaeh', 'meo', 'meog', 'meogg', 'meogs', 'meon', 'meonj', 'meonh', 'meod', + 0x40 => 'meol', 'meolg', 'meolm', 'meolb', 'meols', 'meolt', 'meolp', 'meolh', 'meom', 'meob', 'meobs', 'meos', 'meoss', 'meong', 'meoj', 'meoc', + 0x50 => 'meok', 'meot', 'meop', 'meoh', 'me', 'meg', 'megg', 'megs', 'men', 'menj', 'menh', 'med', 'mel', 'melg', 'melm', 'melb', + 0x60 => 'mels', 'melt', 'melp', 'melh', 'mem', 'meb', 'mebs', 'mes', 'mess', 'meng', 'mej', 'mec', 'mek', 'met', 'mep', 'meh', + 0x70 => 'myeo', 'myeog', 'myeogg', 'myeogs', 'myeon', 'myeonj', 'myeonh', 'myeod', 'myeol', 'myeolg', 'myeolm', 'myeolb', 'myeols', 'myeolt', 'myeolp', 'myeolh', + 0x80 => 'myeom', 'myeob', 'myeobs', 'myeos', 'myeoss', 'myeong', 'myeoj', 'myeoc', 'myeok', 'myeot', 'myeop', 'myeoh', 'mye', 'myeg', 'myegg', 'myegs', + 0x90 => 'myen', 'myenj', 'myenh', 'myed', 'myel', 'myelg', 'myelm', 'myelb', 'myels', 'myelt', 'myelp', 'myelh', 'myem', 'myeb', 'myebs', 'myes', + 0xA0 => 'myess', 'myeng', 'myej', 'myec', 'myek', 'myet', 'myep', 'myeh', 'mo', 'mog', 'mogg', 'mogs', 'mon', 'monj', 'monh', 'mod', + 0xB0 => 'mol', 'molg', 'molm', 'molb', 'mols', 'molt', 'molp', 'molh', 'mom', 'mob', 'mobs', 'mos', 'moss', 'mong', 'moj', 'moc', + 0xC0 => 'mok', 'mot', 'mop', 'moh', 'mwa', 'mwag', 'mwagg', 'mwags', 'mwan', 'mwanj', 'mwanh', 'mwad', 'mwal', 'mwalg', 'mwalm', 'mwalb', + 0xD0 => 'mwals', 'mwalt', 'mwalp', 'mwalh', 'mwam', 'mwab', 'mwabs', 'mwas', 'mwass', 'mwang', 'mwaj', 'mwac', 'mwak', 'mwat', 'mwap', 'mwah', + 0xE0 => 'mwae', 'mwaeg', 'mwaegg', 'mwaegs', 'mwaen', 'mwaenj', 'mwaenh', 'mwaed', 'mwael', 'mwaelg', 'mwaelm', 'mwaelb', 'mwaels', 'mwaelt', 'mwaelp', 'mwaelh', + 0xF0 => 'mwaem', 'mwaeb', 'mwaebs', 'mwaes', 'mwaess', 'mwaeng', 'mwaej', 'mwaec', 'mwaek', 'mwaet', 'mwaep', 'mwaeh', 'moe', 'moeg', 'moegg', 'moegs', +); diff --git a/sources/resources/transliteration-data/xbb.php b/sources/resources/transliteration-data/xbb.php new file mode 100644 index 0000000..ec0c2b2 --- /dev/null +++ b/sources/resources/transliteration-data/xbb.php @@ -0,0 +1,20 @@ + 'moen', 'moenj', 'moenh', 'moed', 'moel', 'moelg', 'moelm', 'moelb', 'moels', 'moelt', 'moelp', 'moelh', 'moem', 'moeb', 'moebs', 'moes', + 0x10 => 'moess', 'moeng', 'moej', 'moec', 'moek', 'moet', 'moep', 'moeh', 'myo', 'myog', 'myogg', 'myogs', 'myon', 'myonj', 'myonh', 'myod', + 0x20 => 'myol', 'myolg', 'myolm', 'myolb', 'myols', 'myolt', 'myolp', 'myolh', 'myom', 'myob', 'myobs', 'myos', 'myoss', 'myong', 'myoj', 'myoc', + 0x30 => 'myok', 'myot', 'myop', 'myoh', 'mu', 'mug', 'mugg', 'mugs', 'mun', 'munj', 'munh', 'mud', 'mul', 'mulg', 'mulm', 'mulb', + 0x40 => 'muls', 'mult', 'mulp', 'mulh', 'mum', 'mub', 'mubs', 'mus', 'muss', 'mung', 'muj', 'muc', 'muk', 'mut', 'mup', 'muh', + 0x50 => 'mweo', 'mweog', 'mweogg', 'mweogs', 'mweon', 'mweonj', 'mweonh', 'mweod', 'mweol', 'mweolg', 'mweolm', 'mweolb', 'mweols', 'mweolt', 'mweolp', 'mweolh', + 0x60 => 'mweom', 'mweob', 'mweobs', 'mweos', 'mweoss', 'mweong', 'mweoj', 'mweoc', 'mweok', 'mweot', 'mweop', 'mweoh', 'mwe', 'mweg', 'mwegg', 'mwegs', + 0x70 => 'mwen', 'mwenj', 'mwenh', 'mwed', 'mwel', 'mwelg', 'mwelm', 'mwelb', 'mwels', 'mwelt', 'mwelp', 'mwelh', 'mwem', 'mweb', 'mwebs', 'mwes', + 0x80 => 'mwess', 'mweng', 'mwej', 'mwec', 'mwek', 'mwet', 'mwep', 'mweh', 'mwi', 'mwig', 'mwigg', 'mwigs', 'mwin', 'mwinj', 'mwinh', 'mwid', + 0x90 => 'mwil', 'mwilg', 'mwilm', 'mwilb', 'mwils', 'mwilt', 'mwilp', 'mwilh', 'mwim', 'mwib', 'mwibs', 'mwis', 'mwiss', 'mwing', 'mwij', 'mwic', + 0xA0 => 'mwik', 'mwit', 'mwip', 'mwih', 'myu', 'myug', 'myugg', 'myugs', 'myun', 'myunj', 'myunh', 'myud', 'myul', 'myulg', 'myulm', 'myulb', + 0xB0 => 'myuls', 'myult', 'myulp', 'myulh', 'myum', 'myub', 'myubs', 'myus', 'myuss', 'myung', 'myuj', 'myuc', 'myuk', 'myut', 'myup', 'myuh', + 0xC0 => 'meu', 'meug', 'meugg', 'meugs', 'meun', 'meunj', 'meunh', 'meud', 'meul', 'meulg', 'meulm', 'meulb', 'meuls', 'meult', 'meulp', 'meulh', + 0xD0 => 'meum', 'meub', 'meubs', 'meus', 'meuss', 'meung', 'meuj', 'meuc', 'meuk', 'meut', 'meup', 'meuh', 'myi', 'myig', 'myigg', 'myigs', + 0xE0 => 'myin', 'myinj', 'myinh', 'myid', 'myil', 'myilg', 'myilm', 'myilb', 'myils', 'myilt', 'myilp', 'myilh', 'myim', 'myib', 'myibs', 'myis', + 0xF0 => 'myiss', 'mying', 'myij', 'myic', 'myik', 'myit', 'myip', 'myih', 'mi', 'mig', 'migg', 'migs', 'min', 'minj', 'minh', 'mid', +); diff --git a/sources/resources/transliteration-data/xbc.php b/sources/resources/transliteration-data/xbc.php new file mode 100644 index 0000000..0395855 --- /dev/null +++ b/sources/resources/transliteration-data/xbc.php @@ -0,0 +1,20 @@ + 'mil', 'milg', 'milm', 'milb', 'mils', 'milt', 'milp', 'milh', 'mim', 'mib', 'mibs', 'mis', 'miss', 'ming', 'mij', 'mic', + 0x10 => 'mik', 'mit', 'mip', 'mih', 'ba', 'bag', 'bagg', 'bags', 'ban', 'banj', 'banh', 'bad', 'bal', 'balg', 'balm', 'balb', + 0x20 => 'bals', 'balt', 'balp', 'balh', 'bam', 'bab', 'babs', 'bas', 'bass', 'bang', 'baj', 'bac', 'bak', 'bat', 'bap', 'bah', + 0x30 => 'bae', 'baeg', 'baegg', 'baegs', 'baen', 'baenj', 'baenh', 'baed', 'bael', 'baelg', 'baelm', 'baelb', 'baels', 'baelt', 'baelp', 'baelh', + 0x40 => 'baem', 'baeb', 'baebs', 'baes', 'baess', 'baeng', 'baej', 'baec', 'baek', 'baet', 'baep', 'baeh', 'bya', 'byag', 'byagg', 'byags', + 0x50 => 'byan', 'byanj', 'byanh', 'byad', 'byal', 'byalg', 'byalm', 'byalb', 'byals', 'byalt', 'byalp', 'byalh', 'byam', 'byab', 'byabs', 'byas', + 0x60 => 'byass', 'byang', 'byaj', 'byac', 'byak', 'byat', 'byap', 'byah', 'byae', 'byaeg', 'byaegg', 'byaegs', 'byaen', 'byaenj', 'byaenh', 'byaed', + 0x70 => 'byael', 'byaelg', 'byaelm', 'byaelb', 'byaels', 'byaelt', 'byaelp', 'byaelh', 'byaem', 'byaeb', 'byaebs', 'byaes', 'byaess', 'byaeng', 'byaej', 'byaec', + 0x80 => 'byaek', 'byaet', 'byaep', 'byaeh', 'beo', 'beog', 'beogg', 'beogs', 'beon', 'beonj', 'beonh', 'beod', 'beol', 'beolg', 'beolm', 'beolb', + 0x90 => 'beols', 'beolt', 'beolp', 'beolh', 'beom', 'beob', 'beobs', 'beos', 'beoss', 'beong', 'beoj', 'beoc', 'beok', 'beot', 'beop', 'beoh', + 0xA0 => 'be', 'beg', 'begg', 'begs', 'ben', 'benj', 'benh', 'bed', 'bel', 'belg', 'belm', 'belb', 'bels', 'belt', 'belp', 'belh', + 0xB0 => 'bem', 'beb', 'bebs', 'bes', 'bess', 'beng', 'bej', 'bec', 'bek', 'bet', 'bep', 'beh', 'byeo', 'byeog', 'byeogg', 'byeogs', + 0xC0 => 'byeon', 'byeonj', 'byeonh', 'byeod', 'byeol', 'byeolg', 'byeolm', 'byeolb', 'byeols', 'byeolt', 'byeolp', 'byeolh', 'byeom', 'byeob', 'byeobs', 'byeos', + 0xD0 => 'byeoss', 'byeong', 'byeoj', 'byeoc', 'byeok', 'byeot', 'byeop', 'byeoh', 'bye', 'byeg', 'byegg', 'byegs', 'byen', 'byenj', 'byenh', 'byed', + 0xE0 => 'byel', 'byelg', 'byelm', 'byelb', 'byels', 'byelt', 'byelp', 'byelh', 'byem', 'byeb', 'byebs', 'byes', 'byess', 'byeng', 'byej', 'byec', + 0xF0 => 'byek', 'byet', 'byep', 'byeh', 'bo', 'bog', 'bogg', 'bogs', 'bon', 'bonj', 'bonh', 'bod', 'bol', 'bolg', 'bolm', 'bolb', +); diff --git a/sources/resources/transliteration-data/xbd.php b/sources/resources/transliteration-data/xbd.php new file mode 100644 index 0000000..cb82b4d --- /dev/null +++ b/sources/resources/transliteration-data/xbd.php @@ -0,0 +1,20 @@ + 'bols', 'bolt', 'bolp', 'bolh', 'bom', 'bob', 'bobs', 'bos', 'boss', 'bong', 'boj', 'boc', 'bok', 'bot', 'bop', 'boh', + 0x10 => 'bwa', 'bwag', 'bwagg', 'bwags', 'bwan', 'bwanj', 'bwanh', 'bwad', 'bwal', 'bwalg', 'bwalm', 'bwalb', 'bwals', 'bwalt', 'bwalp', 'bwalh', + 0x20 => 'bwam', 'bwab', 'bwabs', 'bwas', 'bwass', 'bwang', 'bwaj', 'bwac', 'bwak', 'bwat', 'bwap', 'bwah', 'bwae', 'bwaeg', 'bwaegg', 'bwaegs', + 0x30 => 'bwaen', 'bwaenj', 'bwaenh', 'bwaed', 'bwael', 'bwaelg', 'bwaelm', 'bwaelb', 'bwaels', 'bwaelt', 'bwaelp', 'bwaelh', 'bwaem', 'bwaeb', 'bwaebs', 'bwaes', + 0x40 => 'bwaess', 'bwaeng', 'bwaej', 'bwaec', 'bwaek', 'bwaet', 'bwaep', 'bwaeh', 'boe', 'boeg', 'boegg', 'boegs', 'boen', 'boenj', 'boenh', 'boed', + 0x50 => 'boel', 'boelg', 'boelm', 'boelb', 'boels', 'boelt', 'boelp', 'boelh', 'boem', 'boeb', 'boebs', 'boes', 'boess', 'boeng', 'boej', 'boec', + 0x60 => 'boek', 'boet', 'boep', 'boeh', 'byo', 'byog', 'byogg', 'byogs', 'byon', 'byonj', 'byonh', 'byod', 'byol', 'byolg', 'byolm', 'byolb', + 0x70 => 'byols', 'byolt', 'byolp', 'byolh', 'byom', 'byob', 'byobs', 'byos', 'byoss', 'byong', 'byoj', 'byoc', 'byok', 'byot', 'byop', 'byoh', + 0x80 => 'bu', 'bug', 'bugg', 'bugs', 'bun', 'bunj', 'bunh', 'bud', 'bul', 'bulg', 'bulm', 'bulb', 'buls', 'bult', 'bulp', 'bulh', + 0x90 => 'bum', 'bub', 'bubs', 'bus', 'buss', 'bung', 'buj', 'buc', 'buk', 'but', 'bup', 'buh', 'bweo', 'bweog', 'bweogg', 'bweogs', + 0xA0 => 'bweon', 'bweonj', 'bweonh', 'bweod', 'bweol', 'bweolg', 'bweolm', 'bweolb', 'bweols', 'bweolt', 'bweolp', 'bweolh', 'bweom', 'bweob', 'bweobs', 'bweos', + 0xB0 => 'bweoss', 'bweong', 'bweoj', 'bweoc', 'bweok', 'bweot', 'bweop', 'bweoh', 'bwe', 'bweg', 'bwegg', 'bwegs', 'bwen', 'bwenj', 'bwenh', 'bwed', + 0xC0 => 'bwel', 'bwelg', 'bwelm', 'bwelb', 'bwels', 'bwelt', 'bwelp', 'bwelh', 'bwem', 'bweb', 'bwebs', 'bwes', 'bwess', 'bweng', 'bwej', 'bwec', + 0xD0 => 'bwek', 'bwet', 'bwep', 'bweh', 'bwi', 'bwig', 'bwigg', 'bwigs', 'bwin', 'bwinj', 'bwinh', 'bwid', 'bwil', 'bwilg', 'bwilm', 'bwilb', + 0xE0 => 'bwils', 'bwilt', 'bwilp', 'bwilh', 'bwim', 'bwib', 'bwibs', 'bwis', 'bwiss', 'bwing', 'bwij', 'bwic', 'bwik', 'bwit', 'bwip', 'bwih', + 0xF0 => 'byu', 'byug', 'byugg', 'byugs', 'byun', 'byunj', 'byunh', 'byud', 'byul', 'byulg', 'byulm', 'byulb', 'byuls', 'byult', 'byulp', 'byulh', +); diff --git a/sources/resources/transliteration-data/xbe.php b/sources/resources/transliteration-data/xbe.php new file mode 100644 index 0000000..b027df9 --- /dev/null +++ b/sources/resources/transliteration-data/xbe.php @@ -0,0 +1,20 @@ + 'byum', 'byub', 'byubs', 'byus', 'byuss', 'byung', 'byuj', 'byuc', 'byuk', 'byut', 'byup', 'byuh', 'beu', 'beug', 'beugg', 'beugs', + 0x10 => 'beun', 'beunj', 'beunh', 'beud', 'beul', 'beulg', 'beulm', 'beulb', 'beuls', 'beult', 'beulp', 'beulh', 'beum', 'beub', 'beubs', 'beus', + 0x20 => 'beuss', 'beung', 'beuj', 'beuc', 'beuk', 'beut', 'beup', 'beuh', 'byi', 'byig', 'byigg', 'byigs', 'byin', 'byinj', 'byinh', 'byid', + 0x30 => 'byil', 'byilg', 'byilm', 'byilb', 'byils', 'byilt', 'byilp', 'byilh', 'byim', 'byib', 'byibs', 'byis', 'byiss', 'bying', 'byij', 'byic', + 0x40 => 'byik', 'byit', 'byip', 'byih', 'bi', 'big', 'bigg', 'bigs', 'bin', 'binj', 'binh', 'bid', 'bil', 'bilg', 'bilm', 'bilb', + 0x50 => 'bils', 'bilt', 'bilp', 'bilh', 'bim', 'bib', 'bibs', 'bis', 'biss', 'bing', 'bij', 'bic', 'bik', 'bit', 'bip', 'bih', + 0x60 => 'bba', 'bbag', 'bbagg', 'bbags', 'bban', 'bbanj', 'bbanh', 'bbad', 'bbal', 'bbalg', 'bbalm', 'bbalb', 'bbals', 'bbalt', 'bbalp', 'bbalh', + 0x70 => 'bbam', 'bbab', 'bbabs', 'bbas', 'bbass', 'bbang', 'bbaj', 'bbac', 'bbak', 'bbat', 'bbap', 'bbah', 'bbae', 'bbaeg', 'bbaegg', 'bbaegs', + 0x80 => 'bbaen', 'bbaenj', 'bbaenh', 'bbaed', 'bbael', 'bbaelg', 'bbaelm', 'bbaelb', 'bbaels', 'bbaelt', 'bbaelp', 'bbaelh', 'bbaem', 'bbaeb', 'bbaebs', 'bbaes', + 0x90 => 'bbaess', 'bbaeng', 'bbaej', 'bbaec', 'bbaek', 'bbaet', 'bbaep', 'bbaeh', 'bbya', 'bbyag', 'bbyagg', 'bbyags', 'bbyan', 'bbyanj', 'bbyanh', 'bbyad', + 0xA0 => 'bbyal', 'bbyalg', 'bbyalm', 'bbyalb', 'bbyals', 'bbyalt', 'bbyalp', 'bbyalh', 'bbyam', 'bbyab', 'bbyabs', 'bbyas', 'bbyass', 'bbyang', 'bbyaj', 'bbyac', + 0xB0 => 'bbyak', 'bbyat', 'bbyap', 'bbyah', 'bbyae', 'bbyaeg', 'bbyaegg', 'bbyaegs', 'bbyaen', 'bbyaenj', 'bbyaenh', 'bbyaed', 'bbyael', 'bbyaelg', 'bbyaelm', 'bbyaelb', + 0xC0 => 'bbyaels', 'bbyaelt', 'bbyaelp', 'bbyaelh', 'bbyaem', 'bbyaeb', 'bbyaebs', 'bbyaes', 'bbyaess', 'bbyaeng', 'bbyaej', 'bbyaec', 'bbyaek', 'bbyaet', 'bbyaep', 'bbyaeh', + 0xD0 => 'bbeo', 'bbeog', 'bbeogg', 'bbeogs', 'bbeon', 'bbeonj', 'bbeonh', 'bbeod', 'bbeol', 'bbeolg', 'bbeolm', 'bbeolb', 'bbeols', 'bbeolt', 'bbeolp', 'bbeolh', + 0xE0 => 'bbeom', 'bbeob', 'bbeobs', 'bbeos', 'bbeoss', 'bbeong', 'bbeoj', 'bbeoc', 'bbeok', 'bbeot', 'bbeop', 'bbeoh', 'bbe', 'bbeg', 'bbegg', 'bbegs', + 0xF0 => 'bben', 'bbenj', 'bbenh', 'bbed', 'bbel', 'bbelg', 'bbelm', 'bbelb', 'bbels', 'bbelt', 'bbelp', 'bbelh', 'bbem', 'bbeb', 'bbebs', 'bbes', +); diff --git a/sources/resources/transliteration-data/xbf.php b/sources/resources/transliteration-data/xbf.php new file mode 100644 index 0000000..4510f56 --- /dev/null +++ b/sources/resources/transliteration-data/xbf.php @@ -0,0 +1,20 @@ + 'bbess', 'bbeng', 'bbej', 'bbec', 'bbek', 'bbet', 'bbep', 'bbeh', 'bbyeo', 'bbyeog', 'bbyeogg', 'bbyeogs', 'bbyeon', 'bbyeonj', 'bbyeonh', 'bbyeod', + 0x10 => 'bbyeol', 'bbyeolg', 'bbyeolm', 'bbyeolb', 'bbyeols', 'bbyeolt', 'bbyeolp', 'bbyeolh', 'bbyeom', 'bbyeob', 'bbyeobs', 'bbyeos', 'bbyeoss', 'bbyeong', 'bbyeoj', 'bbyeoc', + 0x20 => 'bbyeok', 'bbyeot', 'bbyeop', 'bbyeoh', 'bbye', 'bbyeg', 'bbyegg', 'bbyegs', 'bbyen', 'bbyenj', 'bbyenh', 'bbyed', 'bbyel', 'bbyelg', 'bbyelm', 'bbyelb', + 0x30 => 'bbyels', 'bbyelt', 'bbyelp', 'bbyelh', 'bbyem', 'bbyeb', 'bbyebs', 'bbyes', 'bbyess', 'bbyeng', 'bbyej', 'bbyec', 'bbyek', 'bbyet', 'bbyep', 'bbyeh', + 0x40 => 'bbo', 'bbog', 'bbogg', 'bbogs', 'bbon', 'bbonj', 'bbonh', 'bbod', 'bbol', 'bbolg', 'bbolm', 'bbolb', 'bbols', 'bbolt', 'bbolp', 'bbolh', + 0x50 => 'bbom', 'bbob', 'bbobs', 'bbos', 'bboss', 'bbong', 'bboj', 'bboc', 'bbok', 'bbot', 'bbop', 'bboh', 'bbwa', 'bbwag', 'bbwagg', 'bbwags', + 0x60 => 'bbwan', 'bbwanj', 'bbwanh', 'bbwad', 'bbwal', 'bbwalg', 'bbwalm', 'bbwalb', 'bbwals', 'bbwalt', 'bbwalp', 'bbwalh', 'bbwam', 'bbwab', 'bbwabs', 'bbwas', + 0x70 => 'bbwass', 'bbwang', 'bbwaj', 'bbwac', 'bbwak', 'bbwat', 'bbwap', 'bbwah', 'bbwae', 'bbwaeg', 'bbwaegg', 'bbwaegs', 'bbwaen', 'bbwaenj', 'bbwaenh', 'bbwaed', + 0x80 => 'bbwael', 'bbwaelg', 'bbwaelm', 'bbwaelb', 'bbwaels', 'bbwaelt', 'bbwaelp', 'bbwaelh', 'bbwaem', 'bbwaeb', 'bbwaebs', 'bbwaes', 'bbwaess', 'bbwaeng', 'bbwaej', 'bbwaec', + 0x90 => 'bbwaek', 'bbwaet', 'bbwaep', 'bbwaeh', 'bboe', 'bboeg', 'bboegg', 'bboegs', 'bboen', 'bboenj', 'bboenh', 'bboed', 'bboel', 'bboelg', 'bboelm', 'bboelb', + 0xA0 => 'bboels', 'bboelt', 'bboelp', 'bboelh', 'bboem', 'bboeb', 'bboebs', 'bboes', 'bboess', 'bboeng', 'bboej', 'bboec', 'bboek', 'bboet', 'bboep', 'bboeh', + 0xB0 => 'bbyo', 'bbyog', 'bbyogg', 'bbyogs', 'bbyon', 'bbyonj', 'bbyonh', 'bbyod', 'bbyol', 'bbyolg', 'bbyolm', 'bbyolb', 'bbyols', 'bbyolt', 'bbyolp', 'bbyolh', + 0xC0 => 'bbyom', 'bbyob', 'bbyobs', 'bbyos', 'bbyoss', 'bbyong', 'bbyoj', 'bbyoc', 'bbyok', 'bbyot', 'bbyop', 'bbyoh', 'bbu', 'bbug', 'bbugg', 'bbugs', + 0xD0 => 'bbun', 'bbunj', 'bbunh', 'bbud', 'bbul', 'bbulg', 'bbulm', 'bbulb', 'bbuls', 'bbult', 'bbulp', 'bbulh', 'bbum', 'bbub', 'bbubs', 'bbus', + 0xE0 => 'bbuss', 'bbung', 'bbuj', 'bbuc', 'bbuk', 'bbut', 'bbup', 'bbuh', 'bbweo', 'bbweog', 'bbweogg', 'bbweogs', 'bbweon', 'bbweonj', 'bbweonh', 'bbweod', + 0xF0 => 'bbweol', 'bbweolg', 'bbweolm', 'bbweolb', 'bbweols', 'bbweolt', 'bbweolp', 'bbweolh', 'bbweom', 'bbweob', 'bbweobs', 'bbweos', 'bbweoss', 'bbweong', 'bbweoj', 'bbweoc', +); diff --git a/sources/resources/transliteration-data/xc0.php b/sources/resources/transliteration-data/xc0.php new file mode 100644 index 0000000..39d1081 --- /dev/null +++ b/sources/resources/transliteration-data/xc0.php @@ -0,0 +1,20 @@ + 'bbweok', 'bbweot', 'bbweop', 'bbweoh', 'bbwe', 'bbweg', 'bbwegg', 'bbwegs', 'bbwen', 'bbwenj', 'bbwenh', 'bbwed', 'bbwel', 'bbwelg', 'bbwelm', 'bbwelb', + 0x10 => 'bbwels', 'bbwelt', 'bbwelp', 'bbwelh', 'bbwem', 'bbweb', 'bbwebs', 'bbwes', 'bbwess', 'bbweng', 'bbwej', 'bbwec', 'bbwek', 'bbwet', 'bbwep', 'bbweh', + 0x20 => 'bbwi', 'bbwig', 'bbwigg', 'bbwigs', 'bbwin', 'bbwinj', 'bbwinh', 'bbwid', 'bbwil', 'bbwilg', 'bbwilm', 'bbwilb', 'bbwils', 'bbwilt', 'bbwilp', 'bbwilh', + 0x30 => 'bbwim', 'bbwib', 'bbwibs', 'bbwis', 'bbwiss', 'bbwing', 'bbwij', 'bbwic', 'bbwik', 'bbwit', 'bbwip', 'bbwih', 'bbyu', 'bbyug', 'bbyugg', 'bbyugs', + 0x40 => 'bbyun', 'bbyunj', 'bbyunh', 'bbyud', 'bbyul', 'bbyulg', 'bbyulm', 'bbyulb', 'bbyuls', 'bbyult', 'bbyulp', 'bbyulh', 'bbyum', 'bbyub', 'bbyubs', 'bbyus', + 0x50 => 'bbyuss', 'bbyung', 'bbyuj', 'bbyuc', 'bbyuk', 'bbyut', 'bbyup', 'bbyuh', 'bbeu', 'bbeug', 'bbeugg', 'bbeugs', 'bbeun', 'bbeunj', 'bbeunh', 'bbeud', + 0x60 => 'bbeul', 'bbeulg', 'bbeulm', 'bbeulb', 'bbeuls', 'bbeult', 'bbeulp', 'bbeulh', 'bbeum', 'bbeub', 'bbeubs', 'bbeus', 'bbeuss', 'bbeung', 'bbeuj', 'bbeuc', + 0x70 => 'bbeuk', 'bbeut', 'bbeup', 'bbeuh', 'bbyi', 'bbyig', 'bbyigg', 'bbyigs', 'bbyin', 'bbyinj', 'bbyinh', 'bbyid', 'bbyil', 'bbyilg', 'bbyilm', 'bbyilb', + 0x80 => 'bbyils', 'bbyilt', 'bbyilp', 'bbyilh', 'bbyim', 'bbyib', 'bbyibs', 'bbyis', 'bbyiss', 'bbying', 'bbyij', 'bbyic', 'bbyik', 'bbyit', 'bbyip', 'bbyih', + 0x90 => 'bbi', 'bbig', 'bbigg', 'bbigs', 'bbin', 'bbinj', 'bbinh', 'bbid', 'bbil', 'bbilg', 'bbilm', 'bbilb', 'bbils', 'bbilt', 'bbilp', 'bbilh', + 0xA0 => 'bbim', 'bbib', 'bbibs', 'bbis', 'bbiss', 'bbing', 'bbij', 'bbic', 'bbik', 'bbit', 'bbip', 'bbih', 'sa', 'sag', 'sagg', 'sags', + 0xB0 => 'san', 'sanj', 'sanh', 'sad', 'sal', 'salg', 'salm', 'salb', 'sals', 'salt', 'salp', 'salh', 'sam', 'sab', 'sabs', 'sas', + 0xC0 => 'sass', 'sang', 'saj', 'sac', 'sak', 'sat', 'sap', 'sah', 'sae', 'saeg', 'saegg', 'saegs', 'saen', 'saenj', 'saenh', 'saed', + 0xD0 => 'sael', 'saelg', 'saelm', 'saelb', 'saels', 'saelt', 'saelp', 'saelh', 'saem', 'saeb', 'saebs', 'saes', 'saess', 'saeng', 'saej', 'saec', + 0xE0 => 'saek', 'saet', 'saep', 'saeh', 'sya', 'syag', 'syagg', 'syags', 'syan', 'syanj', 'syanh', 'syad', 'syal', 'syalg', 'syalm', 'syalb', + 0xF0 => 'syals', 'syalt', 'syalp', 'syalh', 'syam', 'syab', 'syabs', 'syas', 'syass', 'syang', 'syaj', 'syac', 'syak', 'syat', 'syap', 'syah', +); diff --git a/sources/resources/transliteration-data/xc1.php b/sources/resources/transliteration-data/xc1.php new file mode 100644 index 0000000..be536c3 --- /dev/null +++ b/sources/resources/transliteration-data/xc1.php @@ -0,0 +1,20 @@ + 'syae', 'syaeg', 'syaegg', 'syaegs', 'syaen', 'syaenj', 'syaenh', 'syaed', 'syael', 'syaelg', 'syaelm', 'syaelb', 'syaels', 'syaelt', 'syaelp', 'syaelh', + 0x10 => 'syaem', 'syaeb', 'syaebs', 'syaes', 'syaess', 'syaeng', 'syaej', 'syaec', 'syaek', 'syaet', 'syaep', 'syaeh', 'seo', 'seog', 'seogg', 'seogs', + 0x20 => 'seon', 'seonj', 'seonh', 'seod', 'seol', 'seolg', 'seolm', 'seolb', 'seols', 'seolt', 'seolp', 'seolh', 'seom', 'seob', 'seobs', 'seos', + 0x30 => 'seoss', 'seong', 'seoj', 'seoc', 'seok', 'seot', 'seop', 'seoh', 'se', 'seg', 'segg', 'segs', 'sen', 'senj', 'senh', 'sed', + 0x40 => 'sel', 'selg', 'selm', 'selb', 'sels', 'selt', 'selp', 'selh', 'sem', 'seb', 'sebs', 'ses', 'sess', 'seng', 'sej', 'sec', + 0x50 => 'sek', 'set', 'sep', 'seh', 'syeo', 'syeog', 'syeogg', 'syeogs', 'syeon', 'syeonj', 'syeonh', 'syeod', 'syeol', 'syeolg', 'syeolm', 'syeolb', + 0x60 => 'syeols', 'syeolt', 'syeolp', 'syeolh', 'syeom', 'syeob', 'syeobs', 'syeos', 'syeoss', 'syeong', 'syeoj', 'syeoc', 'syeok', 'syeot', 'syeop', 'syeoh', + 0x70 => 'sye', 'syeg', 'syegg', 'syegs', 'syen', 'syenj', 'syenh', 'syed', 'syel', 'syelg', 'syelm', 'syelb', 'syels', 'syelt', 'syelp', 'syelh', + 0x80 => 'syem', 'syeb', 'syebs', 'syes', 'syess', 'syeng', 'syej', 'syec', 'syek', 'syet', 'syep', 'syeh', 'so', 'sog', 'sogg', 'sogs', + 0x90 => 'son', 'sonj', 'sonh', 'sod', 'sol', 'solg', 'solm', 'solb', 'sols', 'solt', 'solp', 'solh', 'som', 'sob', 'sobs', 'sos', + 0xA0 => 'soss', 'song', 'soj', 'soc', 'sok', 'sot', 'sop', 'soh', 'swa', 'swag', 'swagg', 'swags', 'swan', 'swanj', 'swanh', 'swad', + 0xB0 => 'swal', 'swalg', 'swalm', 'swalb', 'swals', 'swalt', 'swalp', 'swalh', 'swam', 'swab', 'swabs', 'swas', 'swass', 'swang', 'swaj', 'swac', + 0xC0 => 'swak', 'swat', 'swap', 'swah', 'swae', 'swaeg', 'swaegg', 'swaegs', 'swaen', 'swaenj', 'swaenh', 'swaed', 'swael', 'swaelg', 'swaelm', 'swaelb', + 0xD0 => 'swaels', 'swaelt', 'swaelp', 'swaelh', 'swaem', 'swaeb', 'swaebs', 'swaes', 'swaess', 'swaeng', 'swaej', 'swaec', 'swaek', 'swaet', 'swaep', 'swaeh', + 0xE0 => 'soe', 'soeg', 'soegg', 'soegs', 'soen', 'soenj', 'soenh', 'soed', 'soel', 'soelg', 'soelm', 'soelb', 'soels', 'soelt', 'soelp', 'soelh', + 0xF0 => 'soem', 'soeb', 'soebs', 'soes', 'soess', 'soeng', 'soej', 'soec', 'soek', 'soet', 'soep', 'soeh', 'syo', 'syog', 'syogg', 'syogs', +); diff --git a/sources/resources/transliteration-data/xc2.php b/sources/resources/transliteration-data/xc2.php new file mode 100644 index 0000000..708a40c --- /dev/null +++ b/sources/resources/transliteration-data/xc2.php @@ -0,0 +1,20 @@ + 'syon', 'syonj', 'syonh', 'syod', 'syol', 'syolg', 'syolm', 'syolb', 'syols', 'syolt', 'syolp', 'syolh', 'syom', 'syob', 'syobs', 'syos', + 0x10 => 'syoss', 'syong', 'syoj', 'syoc', 'syok', 'syot', 'syop', 'syoh', 'su', 'sug', 'sugg', 'sugs', 'sun', 'sunj', 'sunh', 'sud', + 0x20 => 'sul', 'sulg', 'sulm', 'sulb', 'suls', 'sult', 'sulp', 'sulh', 'sum', 'sub', 'subs', 'sus', 'suss', 'sung', 'suj', 'suc', + 0x30 => 'suk', 'sut', 'sup', 'suh', 'sweo', 'sweog', 'sweogg', 'sweogs', 'sweon', 'sweonj', 'sweonh', 'sweod', 'sweol', 'sweolg', 'sweolm', 'sweolb', + 0x40 => 'sweols', 'sweolt', 'sweolp', 'sweolh', 'sweom', 'sweob', 'sweobs', 'sweos', 'sweoss', 'sweong', 'sweoj', 'sweoc', 'sweok', 'sweot', 'sweop', 'sweoh', + 0x50 => 'swe', 'sweg', 'swegg', 'swegs', 'swen', 'swenj', 'swenh', 'swed', 'swel', 'swelg', 'swelm', 'swelb', 'swels', 'swelt', 'swelp', 'swelh', + 0x60 => 'swem', 'sweb', 'swebs', 'swes', 'swess', 'sweng', 'swej', 'swec', 'swek', 'swet', 'swep', 'sweh', 'swi', 'swig', 'swigg', 'swigs', + 0x70 => 'swin', 'swinj', 'swinh', 'swid', 'swil', 'swilg', 'swilm', 'swilb', 'swils', 'swilt', 'swilp', 'swilh', 'swim', 'swib', 'swibs', 'swis', + 0x80 => 'swiss', 'swing', 'swij', 'swic', 'swik', 'swit', 'swip', 'swih', 'syu', 'syug', 'syugg', 'syugs', 'syun', 'syunj', 'syunh', 'syud', + 0x90 => 'syul', 'syulg', 'syulm', 'syulb', 'syuls', 'syult', 'syulp', 'syulh', 'syum', 'syub', 'syubs', 'syus', 'syuss', 'syung', 'syuj', 'syuc', + 0xA0 => 'syuk', 'syut', 'syup', 'syuh', 'seu', 'seug', 'seugg', 'seugs', 'seun', 'seunj', 'seunh', 'seud', 'seul', 'seulg', 'seulm', 'seulb', + 0xB0 => 'seuls', 'seult', 'seulp', 'seulh', 'seum', 'seub', 'seubs', 'seus', 'seuss', 'seung', 'seuj', 'seuc', 'seuk', 'seut', 'seup', 'seuh', + 0xC0 => 'syi', 'syig', 'syigg', 'syigs', 'syin', 'syinj', 'syinh', 'syid', 'syil', 'syilg', 'syilm', 'syilb', 'syils', 'syilt', 'syilp', 'syilh', + 0xD0 => 'syim', 'syib', 'syibs', 'syis', 'syiss', 'sying', 'syij', 'syic', 'syik', 'syit', 'syip', 'syih', 'si', 'sig', 'sigg', 'sigs', + 0xE0 => 'sin', 'sinj', 'sinh', 'sid', 'sil', 'silg', 'silm', 'silb', 'sils', 'silt', 'silp', 'silh', 'sim', 'sib', 'sibs', 'sis', + 0xF0 => 'siss', 'sing', 'sij', 'sic', 'sik', 'sit', 'sip', 'sih', 'ssa', 'ssag', 'ssagg', 'ssags', 'ssan', 'ssanj', 'ssanh', 'ssad', +); diff --git a/sources/resources/transliteration-data/xc3.php b/sources/resources/transliteration-data/xc3.php new file mode 100644 index 0000000..94f4d85 --- /dev/null +++ b/sources/resources/transliteration-data/xc3.php @@ -0,0 +1,20 @@ + 'ssal', 'ssalg', 'ssalm', 'ssalb', 'ssals', 'ssalt', 'ssalp', 'ssalh', 'ssam', 'ssab', 'ssabs', 'ssas', 'ssass', 'ssang', 'ssaj', 'ssac', + 0x10 => 'ssak', 'ssat', 'ssap', 'ssah', 'ssae', 'ssaeg', 'ssaegg', 'ssaegs', 'ssaen', 'ssaenj', 'ssaenh', 'ssaed', 'ssael', 'ssaelg', 'ssaelm', 'ssaelb', + 0x20 => 'ssaels', 'ssaelt', 'ssaelp', 'ssaelh', 'ssaem', 'ssaeb', 'ssaebs', 'ssaes', 'ssaess', 'ssaeng', 'ssaej', 'ssaec', 'ssaek', 'ssaet', 'ssaep', 'ssaeh', + 0x30 => 'ssya', 'ssyag', 'ssyagg', 'ssyags', 'ssyan', 'ssyanj', 'ssyanh', 'ssyad', 'ssyal', 'ssyalg', 'ssyalm', 'ssyalb', 'ssyals', 'ssyalt', 'ssyalp', 'ssyalh', + 0x40 => 'ssyam', 'ssyab', 'ssyabs', 'ssyas', 'ssyass', 'ssyang', 'ssyaj', 'ssyac', 'ssyak', 'ssyat', 'ssyap', 'ssyah', 'ssyae', 'ssyaeg', 'ssyaegg', 'ssyaegs', + 0x50 => 'ssyaen', 'ssyaenj', 'ssyaenh', 'ssyaed', 'ssyael', 'ssyaelg', 'ssyaelm', 'ssyaelb', 'ssyaels', 'ssyaelt', 'ssyaelp', 'ssyaelh', 'ssyaem', 'ssyaeb', 'ssyaebs', 'ssyaes', + 0x60 => 'ssyaess', 'ssyaeng', 'ssyaej', 'ssyaec', 'ssyaek', 'ssyaet', 'ssyaep', 'ssyaeh', 'sseo', 'sseog', 'sseogg', 'sseogs', 'sseon', 'sseonj', 'sseonh', 'sseod', + 0x70 => 'sseol', 'sseolg', 'sseolm', 'sseolb', 'sseols', 'sseolt', 'sseolp', 'sseolh', 'sseom', 'sseob', 'sseobs', 'sseos', 'sseoss', 'sseong', 'sseoj', 'sseoc', + 0x80 => 'sseok', 'sseot', 'sseop', 'sseoh', 'sse', 'sseg', 'ssegg', 'ssegs', 'ssen', 'ssenj', 'ssenh', 'ssed', 'ssel', 'sselg', 'sselm', 'sselb', + 0x90 => 'ssels', 'sselt', 'sselp', 'sselh', 'ssem', 'sseb', 'ssebs', 'sses', 'ssess', 'sseng', 'ssej', 'ssec', 'ssek', 'sset', 'ssep', 'sseh', + 0xA0 => 'ssyeo', 'ssyeog', 'ssyeogg', 'ssyeogs', 'ssyeon', 'ssyeonj', 'ssyeonh', 'ssyeod', 'ssyeol', 'ssyeolg', 'ssyeolm', 'ssyeolb', 'ssyeols', 'ssyeolt', 'ssyeolp', 'ssyeolh', + 0xB0 => 'ssyeom', 'ssyeob', 'ssyeobs', 'ssyeos', 'ssyeoss', 'ssyeong', 'ssyeoj', 'ssyeoc', 'ssyeok', 'ssyeot', 'ssyeop', 'ssyeoh', 'ssye', 'ssyeg', 'ssyegg', 'ssyegs', + 0xC0 => 'ssyen', 'ssyenj', 'ssyenh', 'ssyed', 'ssyel', 'ssyelg', 'ssyelm', 'ssyelb', 'ssyels', 'ssyelt', 'ssyelp', 'ssyelh', 'ssyem', 'ssyeb', 'ssyebs', 'ssyes', + 0xD0 => 'ssyess', 'ssyeng', 'ssyej', 'ssyec', 'ssyek', 'ssyet', 'ssyep', 'ssyeh', 'sso', 'ssog', 'ssogg', 'ssogs', 'sson', 'ssonj', 'ssonh', 'ssod', + 0xE0 => 'ssol', 'ssolg', 'ssolm', 'ssolb', 'ssols', 'ssolt', 'ssolp', 'ssolh', 'ssom', 'ssob', 'ssobs', 'ssos', 'ssoss', 'ssong', 'ssoj', 'ssoc', + 0xF0 => 'ssok', 'ssot', 'ssop', 'ssoh', 'sswa', 'sswag', 'sswagg', 'sswags', 'sswan', 'sswanj', 'sswanh', 'sswad', 'sswal', 'sswalg', 'sswalm', 'sswalb', +); diff --git a/sources/resources/transliteration-data/xc4.php b/sources/resources/transliteration-data/xc4.php new file mode 100644 index 0000000..680af70 --- /dev/null +++ b/sources/resources/transliteration-data/xc4.php @@ -0,0 +1,20 @@ + 'sswals', 'sswalt', 'sswalp', 'sswalh', 'sswam', 'sswab', 'sswabs', 'sswas', 'sswass', 'sswang', 'sswaj', 'sswac', 'sswak', 'sswat', 'sswap', 'sswah', + 0x10 => 'sswae', 'sswaeg', 'sswaegg', 'sswaegs', 'sswaen', 'sswaenj', 'sswaenh', 'sswaed', 'sswael', 'sswaelg', 'sswaelm', 'sswaelb', 'sswaels', 'sswaelt', 'sswaelp', 'sswaelh', + 0x20 => 'sswaem', 'sswaeb', 'sswaebs', 'sswaes', 'sswaess', 'sswaeng', 'sswaej', 'sswaec', 'sswaek', 'sswaet', 'sswaep', 'sswaeh', 'ssoe', 'ssoeg', 'ssoegg', 'ssoegs', + 0x30 => 'ssoen', 'ssoenj', 'ssoenh', 'ssoed', 'ssoel', 'ssoelg', 'ssoelm', 'ssoelb', 'ssoels', 'ssoelt', 'ssoelp', 'ssoelh', 'ssoem', 'ssoeb', 'ssoebs', 'ssoes', + 0x40 => 'ssoess', 'ssoeng', 'ssoej', 'ssoec', 'ssoek', 'ssoet', 'ssoep', 'ssoeh', 'ssyo', 'ssyog', 'ssyogg', 'ssyogs', 'ssyon', 'ssyonj', 'ssyonh', 'ssyod', + 0x50 => 'ssyol', 'ssyolg', 'ssyolm', 'ssyolb', 'ssyols', 'ssyolt', 'ssyolp', 'ssyolh', 'ssyom', 'ssyob', 'ssyobs', 'ssyos', 'ssyoss', 'ssyong', 'ssyoj', 'ssyoc', + 0x60 => 'ssyok', 'ssyot', 'ssyop', 'ssyoh', 'ssu', 'ssug', 'ssugg', 'ssugs', 'ssun', 'ssunj', 'ssunh', 'ssud', 'ssul', 'ssulg', 'ssulm', 'ssulb', + 0x70 => 'ssuls', 'ssult', 'ssulp', 'ssulh', 'ssum', 'ssub', 'ssubs', 'ssus', 'ssuss', 'ssung', 'ssuj', 'ssuc', 'ssuk', 'ssut', 'ssup', 'ssuh', + 0x80 => 'ssweo', 'ssweog', 'ssweogg', 'ssweogs', 'ssweon', 'ssweonj', 'ssweonh', 'ssweod', 'ssweol', 'ssweolg', 'ssweolm', 'ssweolb', 'ssweols', 'ssweolt', 'ssweolp', 'ssweolh', + 0x90 => 'ssweom', 'ssweob', 'ssweobs', 'ssweos', 'ssweoss', 'ssweong', 'ssweoj', 'ssweoc', 'ssweok', 'ssweot', 'ssweop', 'ssweoh', 'sswe', 'ssweg', 'sswegg', 'sswegs', + 0xA0 => 'sswen', 'sswenj', 'sswenh', 'sswed', 'sswel', 'sswelg', 'sswelm', 'sswelb', 'sswels', 'sswelt', 'sswelp', 'sswelh', 'sswem', 'ssweb', 'sswebs', 'sswes', + 0xB0 => 'sswess', 'ssweng', 'sswej', 'sswec', 'sswek', 'sswet', 'sswep', 'ssweh', 'sswi', 'sswig', 'sswigg', 'sswigs', 'sswin', 'sswinj', 'sswinh', 'sswid', + 0xC0 => 'sswil', 'sswilg', 'sswilm', 'sswilb', 'sswils', 'sswilt', 'sswilp', 'sswilh', 'sswim', 'sswib', 'sswibs', 'sswis', 'sswiss', 'sswing', 'sswij', 'sswic', + 0xD0 => 'sswik', 'sswit', 'sswip', 'sswih', 'ssyu', 'ssyug', 'ssyugg', 'ssyugs', 'ssyun', 'ssyunj', 'ssyunh', 'ssyud', 'ssyul', 'ssyulg', 'ssyulm', 'ssyulb', + 0xE0 => 'ssyuls', 'ssyult', 'ssyulp', 'ssyulh', 'ssyum', 'ssyub', 'ssyubs', 'ssyus', 'ssyuss', 'ssyung', 'ssyuj', 'ssyuc', 'ssyuk', 'ssyut', 'ssyup', 'ssyuh', + 0xF0 => 'sseu', 'sseug', 'sseugg', 'sseugs', 'sseun', 'sseunj', 'sseunh', 'sseud', 'sseul', 'sseulg', 'sseulm', 'sseulb', 'sseuls', 'sseult', 'sseulp', 'sseulh', +); diff --git a/sources/resources/transliteration-data/xc5.php b/sources/resources/transliteration-data/xc5.php new file mode 100644 index 0000000..5a1cbee --- /dev/null +++ b/sources/resources/transliteration-data/xc5.php @@ -0,0 +1,20 @@ + 'sseum', 'sseub', 'sseubs', 'sseus', 'sseuss', 'sseung', 'sseuj', 'sseuc', 'sseuk', 'sseut', 'sseup', 'sseuh', 'ssyi', 'ssyig', 'ssyigg', 'ssyigs', + 0x10 => 'ssyin', 'ssyinj', 'ssyinh', 'ssyid', 'ssyil', 'ssyilg', 'ssyilm', 'ssyilb', 'ssyils', 'ssyilt', 'ssyilp', 'ssyilh', 'ssyim', 'ssyib', 'ssyibs', 'ssyis', + 0x20 => 'ssyiss', 'ssying', 'ssyij', 'ssyic', 'ssyik', 'ssyit', 'ssyip', 'ssyih', 'ssi', 'ssig', 'ssigg', 'ssigs', 'ssin', 'ssinj', 'ssinh', 'ssid', + 0x30 => 'ssil', 'ssilg', 'ssilm', 'ssilb', 'ssils', 'ssilt', 'ssilp', 'ssilh', 'ssim', 'ssib', 'ssibs', 'ssis', 'ssiss', 'ssing', 'ssij', 'ssic', + 0x40 => 'ssik', 'ssit', 'ssip', 'ssih', 'a', 'ag', 'agg', 'ags', 'an', 'anj', 'anh', 'ad', 'al', 'alg', 'alm', 'alb', + 0x50 => 'als', 'alt', 'alp', 'alh', 'am', 'ab', 'abs', 'as', 'ass', 'ang', 'aj', 'ac', 'ak', 'at', 'ap', 'ah', + 0x60 => 'ae', 'aeg', 'aegg', 'aegs', 'aen', 'aenj', 'aenh', 'aed', 'ael', 'aelg', 'aelm', 'aelb', 'aels', 'aelt', 'aelp', 'aelh', + 0x70 => 'aem', 'aeb', 'aebs', 'aes', 'aess', 'aeng', 'aej', 'aec', 'aek', 'aet', 'aep', 'aeh', 'ya', 'yag', 'yagg', 'yags', + 0x80 => 'yan', 'yanj', 'yanh', 'yad', 'yal', 'yalg', 'yalm', 'yalb', 'yals', 'yalt', 'yalp', 'yalh', 'yam', 'yab', 'yabs', 'yas', + 0x90 => 'yass', 'yang', 'yaj', 'yac', 'yak', 'yat', 'yap', 'yah', 'yae', 'yaeg', 'yaegg', 'yaegs', 'yaen', 'yaenj', 'yaenh', 'yaed', + 0xA0 => 'yael', 'yaelg', 'yaelm', 'yaelb', 'yaels', 'yaelt', 'yaelp', 'yaelh', 'yaem', 'yaeb', 'yaebs', 'yaes', 'yaess', 'yaeng', 'yaej', 'yaec', + 0xB0 => 'yaek', 'yaet', 'yaep', 'yaeh', 'eo', 'eog', 'eogg', 'eogs', 'eon', 'eonj', 'eonh', 'eod', 'eol', 'eolg', 'eolm', 'eolb', + 0xC0 => 'eols', 'eolt', 'eolp', 'eolh', 'eom', 'eob', 'eobs', 'eos', 'eoss', 'eong', 'eoj', 'eoc', 'eok', 'eot', 'eop', 'eoh', + 0xD0 => 'e', 'eg', 'egg', 'egs', 'en', 'enj', 'enh', 'ed', 'el', 'elg', 'elm', 'elb', 'els', 'elt', 'elp', 'elh', + 0xE0 => 'em', 'eb', 'ebs', 'es', 'ess', 'eng', 'ej', 'ec', 'ek', 'et', 'ep', 'eh', 'yeo', 'yeog', 'yeogg', 'yeogs', + 0xF0 => 'yeon', 'yeonj', 'yeonh', 'yeod', 'yeol', 'yeolg', 'yeolm', 'yeolb', 'yeols', 'yeolt', 'yeolp', 'yeolh', 'yeom', 'yeob', 'yeobs', 'yeos', +); diff --git a/sources/resources/transliteration-data/xc6.php b/sources/resources/transliteration-data/xc6.php new file mode 100644 index 0000000..cfee895 --- /dev/null +++ b/sources/resources/transliteration-data/xc6.php @@ -0,0 +1,20 @@ + 'yeoss', 'yeong', 'yeoj', 'yeoc', 'yeok', 'yeot', 'yeop', 'yeoh', 'ye', 'yeg', 'yegg', 'yegs', 'yen', 'yenj', 'yenh', 'yed', + 0x10 => 'yel', 'yelg', 'yelm', 'yelb', 'yels', 'yelt', 'yelp', 'yelh', 'yem', 'yeb', 'yebs', 'yes', 'yess', 'yeng', 'yej', 'yec', + 0x20 => 'yek', 'yet', 'yep', 'yeh', 'o', 'og', 'ogg', 'ogs', 'on', 'onj', 'onh', 'od', 'ol', 'olg', 'olm', 'olb', + 0x30 => 'ols', 'olt', 'olp', 'olh', 'om', 'ob', 'obs', 'os', 'oss', 'ong', 'oj', 'oc', 'ok', 'ot', 'op', 'oh', + 0x40 => 'wa', 'wag', 'wagg', 'wags', 'wan', 'wanj', 'wanh', 'wad', 'wal', 'walg', 'walm', 'walb', 'wals', 'walt', 'walp', 'walh', + 0x50 => 'wam', 'wab', 'wabs', 'was', 'wass', 'wang', 'waj', 'wac', 'wak', 'wat', 'wap', 'wah', 'wae', 'waeg', 'waegg', 'waegs', + 0x60 => 'waen', 'waenj', 'waenh', 'waed', 'wael', 'waelg', 'waelm', 'waelb', 'waels', 'waelt', 'waelp', 'waelh', 'waem', 'waeb', 'waebs', 'waes', + 0x70 => 'waess', 'waeng', 'waej', 'waec', 'waek', 'waet', 'waep', 'waeh', 'oe', 'oeg', 'oegg', 'oegs', 'oen', 'oenj', 'oenh', 'oed', + 0x80 => 'oel', 'oelg', 'oelm', 'oelb', 'oels', 'oelt', 'oelp', 'oelh', 'oem', 'oeb', 'oebs', 'oes', 'oess', 'oeng', 'oej', 'oec', + 0x90 => 'oek', 'oet', 'oep', 'oeh', 'yo', 'yog', 'yogg', 'yogs', 'yon', 'yonj', 'yonh', 'yod', 'yol', 'yolg', 'yolm', 'yolb', + 0xA0 => 'yols', 'yolt', 'yolp', 'yolh', 'yom', 'yob', 'yobs', 'yos', 'yoss', 'yong', 'yoj', 'yoc', 'yok', 'yot', 'yop', 'yoh', + 0xB0 => 'u', 'ug', 'ugg', 'ugs', 'un', 'unj', 'unh', 'ud', 'ul', 'ulg', 'ulm', 'ulb', 'uls', 'ult', 'ulp', 'ulh', + 0xC0 => 'um', 'ub', 'ubs', 'us', 'uss', 'ung', 'uj', 'uc', 'uk', 'ut', 'up', 'uh', 'weo', 'weog', 'weogg', 'weogs', + 0xD0 => 'weon', 'weonj', 'weonh', 'weod', 'weol', 'weolg', 'weolm', 'weolb', 'weols', 'weolt', 'weolp', 'weolh', 'weom', 'weob', 'weobs', 'weos', + 0xE0 => 'weoss', 'weong', 'weoj', 'weoc', 'weok', 'weot', 'weop', 'weoh', 'we', 'weg', 'wegg', 'wegs', 'wen', 'wenj', 'wenh', 'wed', + 0xF0 => 'wel', 'welg', 'welm', 'welb', 'wels', 'welt', 'welp', 'welh', 'wem', 'web', 'webs', 'wes', 'wess', 'weng', 'wej', 'wec', +); diff --git a/sources/resources/transliteration-data/xc7.php b/sources/resources/transliteration-data/xc7.php new file mode 100644 index 0000000..9c428dd --- /dev/null +++ b/sources/resources/transliteration-data/xc7.php @@ -0,0 +1,20 @@ + 'wek', 'wet', 'wep', 'weh', 'wi', 'wig', 'wigg', 'wigs', 'win', 'winj', 'winh', 'wid', 'wil', 'wilg', 'wilm', 'wilb', + 0x10 => 'wils', 'wilt', 'wilp', 'wilh', 'wim', 'wib', 'wibs', 'wis', 'wiss', 'wing', 'wij', 'wic', 'wik', 'wit', 'wip', 'wih', + 0x20 => 'yu', 'yug', 'yugg', 'yugs', 'yun', 'yunj', 'yunh', 'yud', 'yul', 'yulg', 'yulm', 'yulb', 'yuls', 'yult', 'yulp', 'yulh', + 0x30 => 'yum', 'yub', 'yubs', 'yus', 'yuss', 'yung', 'yuj', 'yuc', 'yuk', 'yut', 'yup', 'yuh', 'eu', 'eug', 'eugg', 'eugs', + 0x40 => 'eun', 'eunj', 'eunh', 'eud', 'eul', 'eulg', 'eulm', 'eulb', 'euls', 'eult', 'eulp', 'eulh', 'eum', 'eub', 'eubs', 'eus', + 0x50 => 'euss', 'eung', 'euj', 'euc', 'euk', 'eut', 'eup', 'euh', 'yi', 'yig', 'yigg', 'yigs', 'yin', 'yinj', 'yinh', 'yid', + 0x60 => 'yil', 'yilg', 'yilm', 'yilb', 'yils', 'yilt', 'yilp', 'yilh', 'yim', 'yib', 'yibs', 'yis', 'yiss', 'ying', 'yij', 'yic', + 0x70 => 'yik', 'yit', 'yip', 'yih', 'i', 'ig', 'igg', 'igs', 'in', 'inj', 'inh', 'id', 'il', 'ilg', 'ilm', 'ilb', + 0x80 => 'ils', 'ilt', 'ilp', 'ilh', 'im', 'ib', 'ibs', 'is', 'iss', 'ing', 'ij', 'ic', 'ik', 'it', 'ip', 'ih', + 0x90 => 'ja', 'jag', 'jagg', 'jags', 'jan', 'janj', 'janh', 'jad', 'jal', 'jalg', 'jalm', 'jalb', 'jals', 'jalt', 'jalp', 'jalh', + 0xA0 => 'jam', 'jab', 'jabs', 'jas', 'jass', 'jang', 'jaj', 'jac', 'jak', 'jat', 'jap', 'jah', 'jae', 'jaeg', 'jaegg', 'jaegs', + 0xB0 => 'jaen', 'jaenj', 'jaenh', 'jaed', 'jael', 'jaelg', 'jaelm', 'jaelb', 'jaels', 'jaelt', 'jaelp', 'jaelh', 'jaem', 'jaeb', 'jaebs', 'jaes', + 0xC0 => 'jaess', 'jaeng', 'jaej', 'jaec', 'jaek', 'jaet', 'jaep', 'jaeh', 'jya', 'jyag', 'jyagg', 'jyags', 'jyan', 'jyanj', 'jyanh', 'jyad', + 0xD0 => 'jyal', 'jyalg', 'jyalm', 'jyalb', 'jyals', 'jyalt', 'jyalp', 'jyalh', 'jyam', 'jyab', 'jyabs', 'jyas', 'jyass', 'jyang', 'jyaj', 'jyac', + 0xE0 => 'jyak', 'jyat', 'jyap', 'jyah', 'jyae', 'jyaeg', 'jyaegg', 'jyaegs', 'jyaen', 'jyaenj', 'jyaenh', 'jyaed', 'jyael', 'jyaelg', 'jyaelm', 'jyaelb', + 0xF0 => 'jyaels', 'jyaelt', 'jyaelp', 'jyaelh', 'jyaem', 'jyaeb', 'jyaebs', 'jyaes', 'jyaess', 'jyaeng', 'jyaej', 'jyaec', 'jyaek', 'jyaet', 'jyaep', 'jyaeh', +); diff --git a/sources/resources/transliteration-data/xc8.php b/sources/resources/transliteration-data/xc8.php new file mode 100644 index 0000000..7239b28 --- /dev/null +++ b/sources/resources/transliteration-data/xc8.php @@ -0,0 +1,20 @@ + 'jeo', 'jeog', 'jeogg', 'jeogs', 'jeon', 'jeonj', 'jeonh', 'jeod', 'jeol', 'jeolg', 'jeolm', 'jeolb', 'jeols', 'jeolt', 'jeolp', 'jeolh', + 0x10 => 'jeom', 'jeob', 'jeobs', 'jeos', 'jeoss', 'jeong', 'jeoj', 'jeoc', 'jeok', 'jeot', 'jeop', 'jeoh', 'je', 'jeg', 'jegg', 'jegs', + 0x20 => 'jen', 'jenj', 'jenh', 'jed', 'jel', 'jelg', 'jelm', 'jelb', 'jels', 'jelt', 'jelp', 'jelh', 'jem', 'jeb', 'jebs', 'jes', + 0x30 => 'jess', 'jeng', 'jej', 'jec', 'jek', 'jet', 'jep', 'jeh', 'jyeo', 'jyeog', 'jyeogg', 'jyeogs', 'jyeon', 'jyeonj', 'jyeonh', 'jyeod', + 0x40 => 'jyeol', 'jyeolg', 'jyeolm', 'jyeolb', 'jyeols', 'jyeolt', 'jyeolp', 'jyeolh', 'jyeom', 'jyeob', 'jyeobs', 'jyeos', 'jyeoss', 'jyeong', 'jyeoj', 'jyeoc', + 0x50 => 'jyeok', 'jyeot', 'jyeop', 'jyeoh', 'jye', 'jyeg', 'jyegg', 'jyegs', 'jyen', 'jyenj', 'jyenh', 'jyed', 'jyel', 'jyelg', 'jyelm', 'jyelb', + 0x60 => 'jyels', 'jyelt', 'jyelp', 'jyelh', 'jyem', 'jyeb', 'jyebs', 'jyes', 'jyess', 'jyeng', 'jyej', 'jyec', 'jyek', 'jyet', 'jyep', 'jyeh', + 0x70 => 'jo', 'jog', 'jogg', 'jogs', 'jon', 'jonj', 'jonh', 'jod', 'jol', 'jolg', 'jolm', 'jolb', 'jols', 'jolt', 'jolp', 'jolh', + 0x80 => 'jom', 'job', 'jobs', 'jos', 'joss', 'jong', 'joj', 'joc', 'jok', 'jot', 'jop', 'joh', 'jwa', 'jwag', 'jwagg', 'jwags', + 0x90 => 'jwan', 'jwanj', 'jwanh', 'jwad', 'jwal', 'jwalg', 'jwalm', 'jwalb', 'jwals', 'jwalt', 'jwalp', 'jwalh', 'jwam', 'jwab', 'jwabs', 'jwas', + 0xA0 => 'jwass', 'jwang', 'jwaj', 'jwac', 'jwak', 'jwat', 'jwap', 'jwah', 'jwae', 'jwaeg', 'jwaegg', 'jwaegs', 'jwaen', 'jwaenj', 'jwaenh', 'jwaed', + 0xB0 => 'jwael', 'jwaelg', 'jwaelm', 'jwaelb', 'jwaels', 'jwaelt', 'jwaelp', 'jwaelh', 'jwaem', 'jwaeb', 'jwaebs', 'jwaes', 'jwaess', 'jwaeng', 'jwaej', 'jwaec', + 0xC0 => 'jwaek', 'jwaet', 'jwaep', 'jwaeh', 'joe', 'joeg', 'joegg', 'joegs', 'joen', 'joenj', 'joenh', 'joed', 'joel', 'joelg', 'joelm', 'joelb', + 0xD0 => 'joels', 'joelt', 'joelp', 'joelh', 'joem', 'joeb', 'joebs', 'joes', 'joess', 'joeng', 'joej', 'joec', 'joek', 'joet', 'joep', 'joeh', + 0xE0 => 'jyo', 'jyog', 'jyogg', 'jyogs', 'jyon', 'jyonj', 'jyonh', 'jyod', 'jyol', 'jyolg', 'jyolm', 'jyolb', 'jyols', 'jyolt', 'jyolp', 'jyolh', + 0xF0 => 'jyom', 'jyob', 'jyobs', 'jyos', 'jyoss', 'jyong', 'jyoj', 'jyoc', 'jyok', 'jyot', 'jyop', 'jyoh', 'ju', 'jug', 'jugg', 'jugs', +); diff --git a/sources/resources/transliteration-data/xc9.php b/sources/resources/transliteration-data/xc9.php new file mode 100644 index 0000000..5580e6e --- /dev/null +++ b/sources/resources/transliteration-data/xc9.php @@ -0,0 +1,20 @@ + 'jun', 'junj', 'junh', 'jud', 'jul', 'julg', 'julm', 'julb', 'juls', 'jult', 'julp', 'julh', 'jum', 'jub', 'jubs', 'jus', + 0x10 => 'juss', 'jung', 'juj', 'juc', 'juk', 'jut', 'jup', 'juh', 'jweo', 'jweog', 'jweogg', 'jweogs', 'jweon', 'jweonj', 'jweonh', 'jweod', + 0x20 => 'jweol', 'jweolg', 'jweolm', 'jweolb', 'jweols', 'jweolt', 'jweolp', 'jweolh', 'jweom', 'jweob', 'jweobs', 'jweos', 'jweoss', 'jweong', 'jweoj', 'jweoc', + 0x30 => 'jweok', 'jweot', 'jweop', 'jweoh', 'jwe', 'jweg', 'jwegg', 'jwegs', 'jwen', 'jwenj', 'jwenh', 'jwed', 'jwel', 'jwelg', 'jwelm', 'jwelb', + 0x40 => 'jwels', 'jwelt', 'jwelp', 'jwelh', 'jwem', 'jweb', 'jwebs', 'jwes', 'jwess', 'jweng', 'jwej', 'jwec', 'jwek', 'jwet', 'jwep', 'jweh', + 0x50 => 'jwi', 'jwig', 'jwigg', 'jwigs', 'jwin', 'jwinj', 'jwinh', 'jwid', 'jwil', 'jwilg', 'jwilm', 'jwilb', 'jwils', 'jwilt', 'jwilp', 'jwilh', + 0x60 => 'jwim', 'jwib', 'jwibs', 'jwis', 'jwiss', 'jwing', 'jwij', 'jwic', 'jwik', 'jwit', 'jwip', 'jwih', 'jyu', 'jyug', 'jyugg', 'jyugs', + 0x70 => 'jyun', 'jyunj', 'jyunh', 'jyud', 'jyul', 'jyulg', 'jyulm', 'jyulb', 'jyuls', 'jyult', 'jyulp', 'jyulh', 'jyum', 'jyub', 'jyubs', 'jyus', + 0x80 => 'jyuss', 'jyung', 'jyuj', 'jyuc', 'jyuk', 'jyut', 'jyup', 'jyuh', 'jeu', 'jeug', 'jeugg', 'jeugs', 'jeun', 'jeunj', 'jeunh', 'jeud', + 0x90 => 'jeul', 'jeulg', 'jeulm', 'jeulb', 'jeuls', 'jeult', 'jeulp', 'jeulh', 'jeum', 'jeub', 'jeubs', 'jeus', 'jeuss', 'jeung', 'jeuj', 'jeuc', + 0xA0 => 'jeuk', 'jeut', 'jeup', 'jeuh', 'jyi', 'jyig', 'jyigg', 'jyigs', 'jyin', 'jyinj', 'jyinh', 'jyid', 'jyil', 'jyilg', 'jyilm', 'jyilb', + 0xB0 => 'jyils', 'jyilt', 'jyilp', 'jyilh', 'jyim', 'jyib', 'jyibs', 'jyis', 'jyiss', 'jying', 'jyij', 'jyic', 'jyik', 'jyit', 'jyip', 'jyih', + 0xC0 => 'ji', 'jig', 'jigg', 'jigs', 'jin', 'jinj', 'jinh', 'jid', 'jil', 'jilg', 'jilm', 'jilb', 'jils', 'jilt', 'jilp', 'jilh', + 0xD0 => 'jim', 'jib', 'jibs', 'jis', 'jiss', 'jing', 'jij', 'jic', 'jik', 'jit', 'jip', 'jih', 'jja', 'jjag', 'jjagg', 'jjags', + 0xE0 => 'jjan', 'jjanj', 'jjanh', 'jjad', 'jjal', 'jjalg', 'jjalm', 'jjalb', 'jjals', 'jjalt', 'jjalp', 'jjalh', 'jjam', 'jjab', 'jjabs', 'jjas', + 0xF0 => 'jjass', 'jjang', 'jjaj', 'jjac', 'jjak', 'jjat', 'jjap', 'jjah', 'jjae', 'jjaeg', 'jjaegg', 'jjaegs', 'jjaen', 'jjaenj', 'jjaenh', 'jjaed', +); diff --git a/sources/resources/transliteration-data/xca.php b/sources/resources/transliteration-data/xca.php new file mode 100644 index 0000000..450d3c1 --- /dev/null +++ b/sources/resources/transliteration-data/xca.php @@ -0,0 +1,20 @@ + 'jjael', 'jjaelg', 'jjaelm', 'jjaelb', 'jjaels', 'jjaelt', 'jjaelp', 'jjaelh', 'jjaem', 'jjaeb', 'jjaebs', 'jjaes', 'jjaess', 'jjaeng', 'jjaej', 'jjaec', + 0x10 => 'jjaek', 'jjaet', 'jjaep', 'jjaeh', 'jjya', 'jjyag', 'jjyagg', 'jjyags', 'jjyan', 'jjyanj', 'jjyanh', 'jjyad', 'jjyal', 'jjyalg', 'jjyalm', 'jjyalb', + 0x20 => 'jjyals', 'jjyalt', 'jjyalp', 'jjyalh', 'jjyam', 'jjyab', 'jjyabs', 'jjyas', 'jjyass', 'jjyang', 'jjyaj', 'jjyac', 'jjyak', 'jjyat', 'jjyap', 'jjyah', + 0x30 => 'jjyae', 'jjyaeg', 'jjyaegg', 'jjyaegs', 'jjyaen', 'jjyaenj', 'jjyaenh', 'jjyaed', 'jjyael', 'jjyaelg', 'jjyaelm', 'jjyaelb', 'jjyaels', 'jjyaelt', 'jjyaelp', 'jjyaelh', + 0x40 => 'jjyaem', 'jjyaeb', 'jjyaebs', 'jjyaes', 'jjyaess', 'jjyaeng', 'jjyaej', 'jjyaec', 'jjyaek', 'jjyaet', 'jjyaep', 'jjyaeh', 'jjeo', 'jjeog', 'jjeogg', 'jjeogs', + 0x50 => 'jjeon', 'jjeonj', 'jjeonh', 'jjeod', 'jjeol', 'jjeolg', 'jjeolm', 'jjeolb', 'jjeols', 'jjeolt', 'jjeolp', 'jjeolh', 'jjeom', 'jjeob', 'jjeobs', 'jjeos', + 0x60 => 'jjeoss', 'jjeong', 'jjeoj', 'jjeoc', 'jjeok', 'jjeot', 'jjeop', 'jjeoh', 'jje', 'jjeg', 'jjegg', 'jjegs', 'jjen', 'jjenj', 'jjenh', 'jjed', + 0x70 => 'jjel', 'jjelg', 'jjelm', 'jjelb', 'jjels', 'jjelt', 'jjelp', 'jjelh', 'jjem', 'jjeb', 'jjebs', 'jjes', 'jjess', 'jjeng', 'jjej', 'jjec', + 0x80 => 'jjek', 'jjet', 'jjep', 'jjeh', 'jjyeo', 'jjyeog', 'jjyeogg', 'jjyeogs', 'jjyeon', 'jjyeonj', 'jjyeonh', 'jjyeod', 'jjyeol', 'jjyeolg', 'jjyeolm', 'jjyeolb', + 0x90 => 'jjyeols', 'jjyeolt', 'jjyeolp', 'jjyeolh', 'jjyeom', 'jjyeob', 'jjyeobs', 'jjyeos', 'jjyeoss', 'jjyeong', 'jjyeoj', 'jjyeoc', 'jjyeok', 'jjyeot', 'jjyeop', 'jjyeoh', + 0xA0 => 'jjye', 'jjyeg', 'jjyegg', 'jjyegs', 'jjyen', 'jjyenj', 'jjyenh', 'jjyed', 'jjyel', 'jjyelg', 'jjyelm', 'jjyelb', 'jjyels', 'jjyelt', 'jjyelp', 'jjyelh', + 0xB0 => 'jjyem', 'jjyeb', 'jjyebs', 'jjyes', 'jjyess', 'jjyeng', 'jjyej', 'jjyec', 'jjyek', 'jjyet', 'jjyep', 'jjyeh', 'jjo', 'jjog', 'jjogg', 'jjogs', + 0xC0 => 'jjon', 'jjonj', 'jjonh', 'jjod', 'jjol', 'jjolg', 'jjolm', 'jjolb', 'jjols', 'jjolt', 'jjolp', 'jjolh', 'jjom', 'jjob', 'jjobs', 'jjos', + 0xD0 => 'jjoss', 'jjong', 'jjoj', 'jjoc', 'jjok', 'jjot', 'jjop', 'jjoh', 'jjwa', 'jjwag', 'jjwagg', 'jjwags', 'jjwan', 'jjwanj', 'jjwanh', 'jjwad', + 0xE0 => 'jjwal', 'jjwalg', 'jjwalm', 'jjwalb', 'jjwals', 'jjwalt', 'jjwalp', 'jjwalh', 'jjwam', 'jjwab', 'jjwabs', 'jjwas', 'jjwass', 'jjwang', 'jjwaj', 'jjwac', + 0xF0 => 'jjwak', 'jjwat', 'jjwap', 'jjwah', 'jjwae', 'jjwaeg', 'jjwaegg', 'jjwaegs', 'jjwaen', 'jjwaenj', 'jjwaenh', 'jjwaed', 'jjwael', 'jjwaelg', 'jjwaelm', 'jjwaelb', +); diff --git a/sources/resources/transliteration-data/xcb.php b/sources/resources/transliteration-data/xcb.php new file mode 100644 index 0000000..61f7616 --- /dev/null +++ b/sources/resources/transliteration-data/xcb.php @@ -0,0 +1,20 @@ + 'jjwaels', 'jjwaelt', 'jjwaelp', 'jjwaelh', 'jjwaem', 'jjwaeb', 'jjwaebs', 'jjwaes', 'jjwaess', 'jjwaeng', 'jjwaej', 'jjwaec', 'jjwaek', 'jjwaet', 'jjwaep', 'jjwaeh', + 0x10 => 'jjoe', 'jjoeg', 'jjoegg', 'jjoegs', 'jjoen', 'jjoenj', 'jjoenh', 'jjoed', 'jjoel', 'jjoelg', 'jjoelm', 'jjoelb', 'jjoels', 'jjoelt', 'jjoelp', 'jjoelh', + 0x20 => 'jjoem', 'jjoeb', 'jjoebs', 'jjoes', 'jjoess', 'jjoeng', 'jjoej', 'jjoec', 'jjoek', 'jjoet', 'jjoep', 'jjoeh', 'jjyo', 'jjyog', 'jjyogg', 'jjyogs', + 0x30 => 'jjyon', 'jjyonj', 'jjyonh', 'jjyod', 'jjyol', 'jjyolg', 'jjyolm', 'jjyolb', 'jjyols', 'jjyolt', 'jjyolp', 'jjyolh', 'jjyom', 'jjyob', 'jjyobs', 'jjyos', + 0x40 => 'jjyoss', 'jjyong', 'jjyoj', 'jjyoc', 'jjyok', 'jjyot', 'jjyop', 'jjyoh', 'jju', 'jjug', 'jjugg', 'jjugs', 'jjun', 'jjunj', 'jjunh', 'jjud', + 0x50 => 'jjul', 'jjulg', 'jjulm', 'jjulb', 'jjuls', 'jjult', 'jjulp', 'jjulh', 'jjum', 'jjub', 'jjubs', 'jjus', 'jjuss', 'jjung', 'jjuj', 'jjuc', + 0x60 => 'jjuk', 'jjut', 'jjup', 'jjuh', 'jjweo', 'jjweog', 'jjweogg', 'jjweogs', 'jjweon', 'jjweonj', 'jjweonh', 'jjweod', 'jjweol', 'jjweolg', 'jjweolm', 'jjweolb', + 0x70 => 'jjweols', 'jjweolt', 'jjweolp', 'jjweolh', 'jjweom', 'jjweob', 'jjweobs', 'jjweos', 'jjweoss', 'jjweong', 'jjweoj', 'jjweoc', 'jjweok', 'jjweot', 'jjweop', 'jjweoh', + 0x80 => 'jjwe', 'jjweg', 'jjwegg', 'jjwegs', 'jjwen', 'jjwenj', 'jjwenh', 'jjwed', 'jjwel', 'jjwelg', 'jjwelm', 'jjwelb', 'jjwels', 'jjwelt', 'jjwelp', 'jjwelh', + 0x90 => 'jjwem', 'jjweb', 'jjwebs', 'jjwes', 'jjwess', 'jjweng', 'jjwej', 'jjwec', 'jjwek', 'jjwet', 'jjwep', 'jjweh', 'jjwi', 'jjwig', 'jjwigg', 'jjwigs', + 0xA0 => 'jjwin', 'jjwinj', 'jjwinh', 'jjwid', 'jjwil', 'jjwilg', 'jjwilm', 'jjwilb', 'jjwils', 'jjwilt', 'jjwilp', 'jjwilh', 'jjwim', 'jjwib', 'jjwibs', 'jjwis', + 0xB0 => 'jjwiss', 'jjwing', 'jjwij', 'jjwic', 'jjwik', 'jjwit', 'jjwip', 'jjwih', 'jjyu', 'jjyug', 'jjyugg', 'jjyugs', 'jjyun', 'jjyunj', 'jjyunh', 'jjyud', + 0xC0 => 'jjyul', 'jjyulg', 'jjyulm', 'jjyulb', 'jjyuls', 'jjyult', 'jjyulp', 'jjyulh', 'jjyum', 'jjyub', 'jjyubs', 'jjyus', 'jjyuss', 'jjyung', 'jjyuj', 'jjyuc', + 0xD0 => 'jjyuk', 'jjyut', 'jjyup', 'jjyuh', 'jjeu', 'jjeug', 'jjeugg', 'jjeugs', 'jjeun', 'jjeunj', 'jjeunh', 'jjeud', 'jjeul', 'jjeulg', 'jjeulm', 'jjeulb', + 0xE0 => 'jjeuls', 'jjeult', 'jjeulp', 'jjeulh', 'jjeum', 'jjeub', 'jjeubs', 'jjeus', 'jjeuss', 'jjeung', 'jjeuj', 'jjeuc', 'jjeuk', 'jjeut', 'jjeup', 'jjeuh', + 0xF0 => 'jjyi', 'jjyig', 'jjyigg', 'jjyigs', 'jjyin', 'jjyinj', 'jjyinh', 'jjyid', 'jjyil', 'jjyilg', 'jjyilm', 'jjyilb', 'jjyils', 'jjyilt', 'jjyilp', 'jjyilh', +); diff --git a/sources/resources/transliteration-data/xcc.php b/sources/resources/transliteration-data/xcc.php new file mode 100644 index 0000000..2caa1e1 --- /dev/null +++ b/sources/resources/transliteration-data/xcc.php @@ -0,0 +1,20 @@ + 'jjyim', 'jjyib', 'jjyibs', 'jjyis', 'jjyiss', 'jjying', 'jjyij', 'jjyic', 'jjyik', 'jjyit', 'jjyip', 'jjyih', 'jji', 'jjig', 'jjigg', 'jjigs', + 0x10 => 'jjin', 'jjinj', 'jjinh', 'jjid', 'jjil', 'jjilg', 'jjilm', 'jjilb', 'jjils', 'jjilt', 'jjilp', 'jjilh', 'jjim', 'jjib', 'jjibs', 'jjis', + 0x20 => 'jjiss', 'jjing', 'jjij', 'jjic', 'jjik', 'jjit', 'jjip', 'jjih', 'ca', 'cag', 'cagg', 'cags', 'can', 'canj', 'canh', 'cad', + 0x30 => 'cal', 'calg', 'calm', 'calb', 'cals', 'calt', 'calp', 'calh', 'cam', 'cab', 'cabs', 'cas', 'cass', 'cang', 'caj', 'cac', + 0x40 => 'cak', 'cat', 'cap', 'cah', 'cae', 'caeg', 'caegg', 'caegs', 'caen', 'caenj', 'caenh', 'caed', 'cael', 'caelg', 'caelm', 'caelb', + 0x50 => 'caels', 'caelt', 'caelp', 'caelh', 'caem', 'caeb', 'caebs', 'caes', 'caess', 'caeng', 'caej', 'caec', 'caek', 'caet', 'caep', 'caeh', + 0x60 => 'cya', 'cyag', 'cyagg', 'cyags', 'cyan', 'cyanj', 'cyanh', 'cyad', 'cyal', 'cyalg', 'cyalm', 'cyalb', 'cyals', 'cyalt', 'cyalp', 'cyalh', + 0x70 => 'cyam', 'cyab', 'cyabs', 'cyas', 'cyass', 'cyang', 'cyaj', 'cyac', 'cyak', 'cyat', 'cyap', 'cyah', 'cyae', 'cyaeg', 'cyaegg', 'cyaegs', + 0x80 => 'cyaen', 'cyaenj', 'cyaenh', 'cyaed', 'cyael', 'cyaelg', 'cyaelm', 'cyaelb', 'cyaels', 'cyaelt', 'cyaelp', 'cyaelh', 'cyaem', 'cyaeb', 'cyaebs', 'cyaes', + 0x90 => 'cyaess', 'cyaeng', 'cyaej', 'cyaec', 'cyaek', 'cyaet', 'cyaep', 'cyaeh', 'ceo', 'ceog', 'ceogg', 'ceogs', 'ceon', 'ceonj', 'ceonh', 'ceod', + 0xA0 => 'ceol', 'ceolg', 'ceolm', 'ceolb', 'ceols', 'ceolt', 'ceolp', 'ceolh', 'ceom', 'ceob', 'ceobs', 'ceos', 'ceoss', 'ceong', 'ceoj', 'ceoc', + 0xB0 => 'ceok', 'ceot', 'ceop', 'ceoh', 'ce', 'ceg', 'cegg', 'cegs', 'cen', 'cenj', 'cenh', 'ced', 'cel', 'celg', 'celm', 'celb', + 0xC0 => 'cels', 'celt', 'celp', 'celh', 'cem', 'ceb', 'cebs', 'ces', 'cess', 'ceng', 'cej', 'cec', 'cek', 'cet', 'cep', 'ceh', + 0xD0 => 'cyeo', 'cyeog', 'cyeogg', 'cyeogs', 'cyeon', 'cyeonj', 'cyeonh', 'cyeod', 'cyeol', 'cyeolg', 'cyeolm', 'cyeolb', 'cyeols', 'cyeolt', 'cyeolp', 'cyeolh', + 0xE0 => 'cyeom', 'cyeob', 'cyeobs', 'cyeos', 'cyeoss', 'cyeong', 'cyeoj', 'cyeoc', 'cyeok', 'cyeot', 'cyeop', 'cyeoh', 'cye', 'cyeg', 'cyegg', 'cyegs', + 0xF0 => 'cyen', 'cyenj', 'cyenh', 'cyed', 'cyel', 'cyelg', 'cyelm', 'cyelb', 'cyels', 'cyelt', 'cyelp', 'cyelh', 'cyem', 'cyeb', 'cyebs', 'cyes', +); diff --git a/sources/resources/transliteration-data/xcd.php b/sources/resources/transliteration-data/xcd.php new file mode 100644 index 0000000..c556f6e --- /dev/null +++ b/sources/resources/transliteration-data/xcd.php @@ -0,0 +1,20 @@ + 'cyess', 'cyeng', 'cyej', 'cyec', 'cyek', 'cyet', 'cyep', 'cyeh', 'co', 'cog', 'cogg', 'cogs', 'con', 'conj', 'conh', 'cod', + 0x10 => 'col', 'colg', 'colm', 'colb', 'cols', 'colt', 'colp', 'colh', 'com', 'cob', 'cobs', 'cos', 'coss', 'cong', 'coj', 'coc', + 0x20 => 'cok', 'cot', 'cop', 'coh', 'cwa', 'cwag', 'cwagg', 'cwags', 'cwan', 'cwanj', 'cwanh', 'cwad', 'cwal', 'cwalg', 'cwalm', 'cwalb', + 0x30 => 'cwals', 'cwalt', 'cwalp', 'cwalh', 'cwam', 'cwab', 'cwabs', 'cwas', 'cwass', 'cwang', 'cwaj', 'cwac', 'cwak', 'cwat', 'cwap', 'cwah', + 0x40 => 'cwae', 'cwaeg', 'cwaegg', 'cwaegs', 'cwaen', 'cwaenj', 'cwaenh', 'cwaed', 'cwael', 'cwaelg', 'cwaelm', 'cwaelb', 'cwaels', 'cwaelt', 'cwaelp', 'cwaelh', + 0x50 => 'cwaem', 'cwaeb', 'cwaebs', 'cwaes', 'cwaess', 'cwaeng', 'cwaej', 'cwaec', 'cwaek', 'cwaet', 'cwaep', 'cwaeh', 'coe', 'coeg', 'coegg', 'coegs', + 0x60 => 'coen', 'coenj', 'coenh', 'coed', 'coel', 'coelg', 'coelm', 'coelb', 'coels', 'coelt', 'coelp', 'coelh', 'coem', 'coeb', 'coebs', 'coes', + 0x70 => 'coess', 'coeng', 'coej', 'coec', 'coek', 'coet', 'coep', 'coeh', 'cyo', 'cyog', 'cyogg', 'cyogs', 'cyon', 'cyonj', 'cyonh', 'cyod', + 0x80 => 'cyol', 'cyolg', 'cyolm', 'cyolb', 'cyols', 'cyolt', 'cyolp', 'cyolh', 'cyom', 'cyob', 'cyobs', 'cyos', 'cyoss', 'cyong', 'cyoj', 'cyoc', + 0x90 => 'cyok', 'cyot', 'cyop', 'cyoh', 'cu', 'cug', 'cugg', 'cugs', 'cun', 'cunj', 'cunh', 'cud', 'cul', 'culg', 'culm', 'culb', + 0xA0 => 'culs', 'cult', 'culp', 'culh', 'cum', 'cub', 'cubs', 'cus', 'cuss', 'cung', 'cuj', 'cuc', 'cuk', 'cut', 'cup', 'cuh', + 0xB0 => 'cweo', 'cweog', 'cweogg', 'cweogs', 'cweon', 'cweonj', 'cweonh', 'cweod', 'cweol', 'cweolg', 'cweolm', 'cweolb', 'cweols', 'cweolt', 'cweolp', 'cweolh', + 0xC0 => 'cweom', 'cweob', 'cweobs', 'cweos', 'cweoss', 'cweong', 'cweoj', 'cweoc', 'cweok', 'cweot', 'cweop', 'cweoh', 'cwe', 'cweg', 'cwegg', 'cwegs', + 0xD0 => 'cwen', 'cwenj', 'cwenh', 'cwed', 'cwel', 'cwelg', 'cwelm', 'cwelb', 'cwels', 'cwelt', 'cwelp', 'cwelh', 'cwem', 'cweb', 'cwebs', 'cwes', + 0xE0 => 'cwess', 'cweng', 'cwej', 'cwec', 'cwek', 'cwet', 'cwep', 'cweh', 'cwi', 'cwig', 'cwigg', 'cwigs', 'cwin', 'cwinj', 'cwinh', 'cwid', + 0xF0 => 'cwil', 'cwilg', 'cwilm', 'cwilb', 'cwils', 'cwilt', 'cwilp', 'cwilh', 'cwim', 'cwib', 'cwibs', 'cwis', 'cwiss', 'cwing', 'cwij', 'cwic', +); diff --git a/sources/resources/transliteration-data/xce.php b/sources/resources/transliteration-data/xce.php new file mode 100644 index 0000000..924428e --- /dev/null +++ b/sources/resources/transliteration-data/xce.php @@ -0,0 +1,20 @@ + 'cwik', 'cwit', 'cwip', 'cwih', 'cyu', 'cyug', 'cyugg', 'cyugs', 'cyun', 'cyunj', 'cyunh', 'cyud', 'cyul', 'cyulg', 'cyulm', 'cyulb', + 0x10 => 'cyuls', 'cyult', 'cyulp', 'cyulh', 'cyum', 'cyub', 'cyubs', 'cyus', 'cyuss', 'cyung', 'cyuj', 'cyuc', 'cyuk', 'cyut', 'cyup', 'cyuh', + 0x20 => 'ceu', 'ceug', 'ceugg', 'ceugs', 'ceun', 'ceunj', 'ceunh', 'ceud', 'ceul', 'ceulg', 'ceulm', 'ceulb', 'ceuls', 'ceult', 'ceulp', 'ceulh', + 0x30 => 'ceum', 'ceub', 'ceubs', 'ceus', 'ceuss', 'ceung', 'ceuj', 'ceuc', 'ceuk', 'ceut', 'ceup', 'ceuh', 'cyi', 'cyig', 'cyigg', 'cyigs', + 0x40 => 'cyin', 'cyinj', 'cyinh', 'cyid', 'cyil', 'cyilg', 'cyilm', 'cyilb', 'cyils', 'cyilt', 'cyilp', 'cyilh', 'cyim', 'cyib', 'cyibs', 'cyis', + 0x50 => 'cyiss', 'cying', 'cyij', 'cyic', 'cyik', 'cyit', 'cyip', 'cyih', 'ci', 'cig', 'cigg', 'cigs', 'cin', 'cinj', 'cinh', 'cid', + 0x60 => 'cil', 'cilg', 'cilm', 'cilb', 'cils', 'cilt', 'cilp', 'cilh', 'cim', 'cib', 'cibs', 'cis', 'ciss', 'cing', 'cij', 'cic', + 0x70 => 'cik', 'cit', 'cip', 'cih', 'ka', 'kag', 'kagg', 'kags', 'kan', 'kanj', 'kanh', 'kad', 'kal', 'kalg', 'kalm', 'kalb', + 0x80 => 'kals', 'kalt', 'kalp', 'kalh', 'kam', 'kab', 'kabs', 'kas', 'kass', 'kang', 'kaj', 'kac', 'kak', 'kat', 'kap', 'kah', + 0x90 => 'kae', 'kaeg', 'kaegg', 'kaegs', 'kaen', 'kaenj', 'kaenh', 'kaed', 'kael', 'kaelg', 'kaelm', 'kaelb', 'kaels', 'kaelt', 'kaelp', 'kaelh', + 0xA0 => 'kaem', 'kaeb', 'kaebs', 'kaes', 'kaess', 'kaeng', 'kaej', 'kaec', 'kaek', 'kaet', 'kaep', 'kaeh', 'kya', 'kyag', 'kyagg', 'kyags', + 0xB0 => 'kyan', 'kyanj', 'kyanh', 'kyad', 'kyal', 'kyalg', 'kyalm', 'kyalb', 'kyals', 'kyalt', 'kyalp', 'kyalh', 'kyam', 'kyab', 'kyabs', 'kyas', + 0xC0 => 'kyass', 'kyang', 'kyaj', 'kyac', 'kyak', 'kyat', 'kyap', 'kyah', 'kyae', 'kyaeg', 'kyaegg', 'kyaegs', 'kyaen', 'kyaenj', 'kyaenh', 'kyaed', + 0xD0 => 'kyael', 'kyaelg', 'kyaelm', 'kyaelb', 'kyaels', 'kyaelt', 'kyaelp', 'kyaelh', 'kyaem', 'kyaeb', 'kyaebs', 'kyaes', 'kyaess', 'kyaeng', 'kyaej', 'kyaec', + 0xE0 => 'kyaek', 'kyaet', 'kyaep', 'kyaeh', 'keo', 'keog', 'keogg', 'keogs', 'keon', 'keonj', 'keonh', 'keod', 'keol', 'keolg', 'keolm', 'keolb', + 0xF0 => 'keols', 'keolt', 'keolp', 'keolh', 'keom', 'keob', 'keobs', 'keos', 'keoss', 'keong', 'keoj', 'keoc', 'keok', 'keot', 'keop', 'keoh', +); diff --git a/sources/resources/transliteration-data/xcf.php b/sources/resources/transliteration-data/xcf.php new file mode 100644 index 0000000..7d31bf6 --- /dev/null +++ b/sources/resources/transliteration-data/xcf.php @@ -0,0 +1,20 @@ + 'ke', 'keg', 'kegg', 'kegs', 'ken', 'kenj', 'kenh', 'ked', 'kel', 'kelg', 'kelm', 'kelb', 'kels', 'kelt', 'kelp', 'kelh', + 0x10 => 'kem', 'keb', 'kebs', 'kes', 'kess', 'keng', 'kej', 'kec', 'kek', 'ket', 'kep', 'keh', 'kyeo', 'kyeog', 'kyeogg', 'kyeogs', + 0x20 => 'kyeon', 'kyeonj', 'kyeonh', 'kyeod', 'kyeol', 'kyeolg', 'kyeolm', 'kyeolb', 'kyeols', 'kyeolt', 'kyeolp', 'kyeolh', 'kyeom', 'kyeob', 'kyeobs', 'kyeos', + 0x30 => 'kyeoss', 'kyeong', 'kyeoj', 'kyeoc', 'kyeok', 'kyeot', 'kyeop', 'kyeoh', 'kye', 'kyeg', 'kyegg', 'kyegs', 'kyen', 'kyenj', 'kyenh', 'kyed', + 0x40 => 'kyel', 'kyelg', 'kyelm', 'kyelb', 'kyels', 'kyelt', 'kyelp', 'kyelh', 'kyem', 'kyeb', 'kyebs', 'kyes', 'kyess', 'kyeng', 'kyej', 'kyec', + 0x50 => 'kyek', 'kyet', 'kyep', 'kyeh', 'ko', 'kog', 'kogg', 'kogs', 'kon', 'konj', 'konh', 'kod', 'kol', 'kolg', 'kolm', 'kolb', + 0x60 => 'kols', 'kolt', 'kolp', 'kolh', 'kom', 'kob', 'kobs', 'kos', 'koss', 'kong', 'koj', 'koc', 'kok', 'kot', 'kop', 'koh', + 0x70 => 'kwa', 'kwag', 'kwagg', 'kwags', 'kwan', 'kwanj', 'kwanh', 'kwad', 'kwal', 'kwalg', 'kwalm', 'kwalb', 'kwals', 'kwalt', 'kwalp', 'kwalh', + 0x80 => 'kwam', 'kwab', 'kwabs', 'kwas', 'kwass', 'kwang', 'kwaj', 'kwac', 'kwak', 'kwat', 'kwap', 'kwah', 'kwae', 'kwaeg', 'kwaegg', 'kwaegs', + 0x90 => 'kwaen', 'kwaenj', 'kwaenh', 'kwaed', 'kwael', 'kwaelg', 'kwaelm', 'kwaelb', 'kwaels', 'kwaelt', 'kwaelp', 'kwaelh', 'kwaem', 'kwaeb', 'kwaebs', 'kwaes', + 0xA0 => 'kwaess', 'kwaeng', 'kwaej', 'kwaec', 'kwaek', 'kwaet', 'kwaep', 'kwaeh', 'koe', 'koeg', 'koegg', 'koegs', 'koen', 'koenj', 'koenh', 'koed', + 0xB0 => 'koel', 'koelg', 'koelm', 'koelb', 'koels', 'koelt', 'koelp', 'koelh', 'koem', 'koeb', 'koebs', 'koes', 'koess', 'koeng', 'koej', 'koec', + 0xC0 => 'koek', 'koet', 'koep', 'koeh', 'kyo', 'kyog', 'kyogg', 'kyogs', 'kyon', 'kyonj', 'kyonh', 'kyod', 'kyol', 'kyolg', 'kyolm', 'kyolb', + 0xD0 => 'kyols', 'kyolt', 'kyolp', 'kyolh', 'kyom', 'kyob', 'kyobs', 'kyos', 'kyoss', 'kyong', 'kyoj', 'kyoc', 'kyok', 'kyot', 'kyop', 'kyoh', + 0xE0 => 'ku', 'kug', 'kugg', 'kugs', 'kun', 'kunj', 'kunh', 'kud', 'kul', 'kulg', 'kulm', 'kulb', 'kuls', 'kult', 'kulp', 'kulh', + 0xF0 => 'kum', 'kub', 'kubs', 'kus', 'kuss', 'kung', 'kuj', 'kuc', 'kuk', 'kut', 'kup', 'kuh', 'kweo', 'kweog', 'kweogg', 'kweogs', +); diff --git a/sources/resources/transliteration-data/xd0.php b/sources/resources/transliteration-data/xd0.php new file mode 100644 index 0000000..0bda9da --- /dev/null +++ b/sources/resources/transliteration-data/xd0.php @@ -0,0 +1,20 @@ + 'kweon', 'kweonj', 'kweonh', 'kweod', 'kweol', 'kweolg', 'kweolm', 'kweolb', 'kweols', 'kweolt', 'kweolp', 'kweolh', 'kweom', 'kweob', 'kweobs', 'kweos', + 0x10 => 'kweoss', 'kweong', 'kweoj', 'kweoc', 'kweok', 'kweot', 'kweop', 'kweoh', 'kwe', 'kweg', 'kwegg', 'kwegs', 'kwen', 'kwenj', 'kwenh', 'kwed', + 0x20 => 'kwel', 'kwelg', 'kwelm', 'kwelb', 'kwels', 'kwelt', 'kwelp', 'kwelh', 'kwem', 'kweb', 'kwebs', 'kwes', 'kwess', 'kweng', 'kwej', 'kwec', + 0x30 => 'kwek', 'kwet', 'kwep', 'kweh', 'kwi', 'kwig', 'kwigg', 'kwigs', 'kwin', 'kwinj', 'kwinh', 'kwid', 'kwil', 'kwilg', 'kwilm', 'kwilb', + 0x40 => 'kwils', 'kwilt', 'kwilp', 'kwilh', 'kwim', 'kwib', 'kwibs', 'kwis', 'kwiss', 'kwing', 'kwij', 'kwic', 'kwik', 'kwit', 'kwip', 'kwih', + 0x50 => 'kyu', 'kyug', 'kyugg', 'kyugs', 'kyun', 'kyunj', 'kyunh', 'kyud', 'kyul', 'kyulg', 'kyulm', 'kyulb', 'kyuls', 'kyult', 'kyulp', 'kyulh', + 0x60 => 'kyum', 'kyub', 'kyubs', 'kyus', 'kyuss', 'kyung', 'kyuj', 'kyuc', 'kyuk', 'kyut', 'kyup', 'kyuh', 'keu', 'keug', 'keugg', 'keugs', + 0x70 => 'keun', 'keunj', 'keunh', 'keud', 'keul', 'keulg', 'keulm', 'keulb', 'keuls', 'keult', 'keulp', 'keulh', 'keum', 'keub', 'keubs', 'keus', + 0x80 => 'keuss', 'keung', 'keuj', 'keuc', 'keuk', 'keut', 'keup', 'keuh', 'kyi', 'kyig', 'kyigg', 'kyigs', 'kyin', 'kyinj', 'kyinh', 'kyid', + 0x90 => 'kyil', 'kyilg', 'kyilm', 'kyilb', 'kyils', 'kyilt', 'kyilp', 'kyilh', 'kyim', 'kyib', 'kyibs', 'kyis', 'kyiss', 'kying', 'kyij', 'kyic', + 0xA0 => 'kyik', 'kyit', 'kyip', 'kyih', 'ki', 'kig', 'kigg', 'kigs', 'kin', 'kinj', 'kinh', 'kid', 'kil', 'kilg', 'kilm', 'kilb', + 0xB0 => 'kils', 'kilt', 'kilp', 'kilh', 'kim', 'kib', 'kibs', 'kis', 'kiss', 'king', 'kij', 'kic', 'kik', 'kit', 'kip', 'kih', + 0xC0 => 'ta', 'tag', 'tagg', 'tags', 'tan', 'tanj', 'tanh', 'tad', 'tal', 'talg', 'talm', 'talb', 'tals', 'talt', 'talp', 'talh', + 0xD0 => 'tam', 'tab', 'tabs', 'tas', 'tass', 'tang', 'taj', 'tac', 'tak', 'tat', 'tap', 'tah', 'tae', 'taeg', 'taegg', 'taegs', + 0xE0 => 'taen', 'taenj', 'taenh', 'taed', 'tael', 'taelg', 'taelm', 'taelb', 'taels', 'taelt', 'taelp', 'taelh', 'taem', 'taeb', 'taebs', 'taes', + 0xF0 => 'taess', 'taeng', 'taej', 'taec', 'taek', 'taet', 'taep', 'taeh', 'tya', 'tyag', 'tyagg', 'tyags', 'tyan', 'tyanj', 'tyanh', 'tyad', +); diff --git a/sources/resources/transliteration-data/xd1.php b/sources/resources/transliteration-data/xd1.php new file mode 100644 index 0000000..4c89510 --- /dev/null +++ b/sources/resources/transliteration-data/xd1.php @@ -0,0 +1,20 @@ + 'tyal', 'tyalg', 'tyalm', 'tyalb', 'tyals', 'tyalt', 'tyalp', 'tyalh', 'tyam', 'tyab', 'tyabs', 'tyas', 'tyass', 'tyang', 'tyaj', 'tyac', + 0x10 => 'tyak', 'tyat', 'tyap', 'tyah', 'tyae', 'tyaeg', 'tyaegg', 'tyaegs', 'tyaen', 'tyaenj', 'tyaenh', 'tyaed', 'tyael', 'tyaelg', 'tyaelm', 'tyaelb', + 0x20 => 'tyaels', 'tyaelt', 'tyaelp', 'tyaelh', 'tyaem', 'tyaeb', 'tyaebs', 'tyaes', 'tyaess', 'tyaeng', 'tyaej', 'tyaec', 'tyaek', 'tyaet', 'tyaep', 'tyaeh', + 0x30 => 'teo', 'teog', 'teogg', 'teogs', 'teon', 'teonj', 'teonh', 'teod', 'teol', 'teolg', 'teolm', 'teolb', 'teols', 'teolt', 'teolp', 'teolh', + 0x40 => 'teom', 'teob', 'teobs', 'teos', 'teoss', 'teong', 'teoj', 'teoc', 'teok', 'teot', 'teop', 'teoh', 'te', 'teg', 'tegg', 'tegs', + 0x50 => 'ten', 'tenj', 'tenh', 'ted', 'tel', 'telg', 'telm', 'telb', 'tels', 'telt', 'telp', 'telh', 'tem', 'teb', 'tebs', 'tes', + 0x60 => 'tess', 'teng', 'tej', 'tec', 'tek', 'tet', 'tep', 'teh', 'tyeo', 'tyeog', 'tyeogg', 'tyeogs', 'tyeon', 'tyeonj', 'tyeonh', 'tyeod', + 0x70 => 'tyeol', 'tyeolg', 'tyeolm', 'tyeolb', 'tyeols', 'tyeolt', 'tyeolp', 'tyeolh', 'tyeom', 'tyeob', 'tyeobs', 'tyeos', 'tyeoss', 'tyeong', 'tyeoj', 'tyeoc', + 0x80 => 'tyeok', 'tyeot', 'tyeop', 'tyeoh', 'tye', 'tyeg', 'tyegg', 'tyegs', 'tyen', 'tyenj', 'tyenh', 'tyed', 'tyel', 'tyelg', 'tyelm', 'tyelb', + 0x90 => 'tyels', 'tyelt', 'tyelp', 'tyelh', 'tyem', 'tyeb', 'tyebs', 'tyes', 'tyess', 'tyeng', 'tyej', 'tyec', 'tyek', 'tyet', 'tyep', 'tyeh', + 0xA0 => 'to', 'tog', 'togg', 'togs', 'ton', 'tonj', 'tonh', 'tod', 'tol', 'tolg', 'tolm', 'tolb', 'tols', 'tolt', 'tolp', 'tolh', + 0xB0 => 'tom', 'tob', 'tobs', 'tos', 'toss', 'tong', 'toj', 'toc', 'tok', 'tot', 'top', 'toh', 'twa', 'twag', 'twagg', 'twags', + 0xC0 => 'twan', 'twanj', 'twanh', 'twad', 'twal', 'twalg', 'twalm', 'twalb', 'twals', 'twalt', 'twalp', 'twalh', 'twam', 'twab', 'twabs', 'twas', + 0xD0 => 'twass', 'twang', 'twaj', 'twac', 'twak', 'twat', 'twap', 'twah', 'twae', 'twaeg', 'twaegg', 'twaegs', 'twaen', 'twaenj', 'twaenh', 'twaed', + 0xE0 => 'twael', 'twaelg', 'twaelm', 'twaelb', 'twaels', 'twaelt', 'twaelp', 'twaelh', 'twaem', 'twaeb', 'twaebs', 'twaes', 'twaess', 'twaeng', 'twaej', 'twaec', + 0xF0 => 'twaek', 'twaet', 'twaep', 'twaeh', 'toe', 'toeg', 'toegg', 'toegs', 'toen', 'toenj', 'toenh', 'toed', 'toel', 'toelg', 'toelm', 'toelb', +); diff --git a/sources/resources/transliteration-data/xd2.php b/sources/resources/transliteration-data/xd2.php new file mode 100644 index 0000000..689282a --- /dev/null +++ b/sources/resources/transliteration-data/xd2.php @@ -0,0 +1,20 @@ + 'toels', 'toelt', 'toelp', 'toelh', 'toem', 'toeb', 'toebs', 'toes', 'toess', 'toeng', 'toej', 'toec', 'toek', 'toet', 'toep', 'toeh', + 0x10 => 'tyo', 'tyog', 'tyogg', 'tyogs', 'tyon', 'tyonj', 'tyonh', 'tyod', 'tyol', 'tyolg', 'tyolm', 'tyolb', 'tyols', 'tyolt', 'tyolp', 'tyolh', + 0x20 => 'tyom', 'tyob', 'tyobs', 'tyos', 'tyoss', 'tyong', 'tyoj', 'tyoc', 'tyok', 'tyot', 'tyop', 'tyoh', 'tu', 'tug', 'tugg', 'tugs', + 0x30 => 'tun', 'tunj', 'tunh', 'tud', 'tul', 'tulg', 'tulm', 'tulb', 'tuls', 'tult', 'tulp', 'tulh', 'tum', 'tub', 'tubs', 'tus', + 0x40 => 'tuss', 'tung', 'tuj', 'tuc', 'tuk', 'tut', 'tup', 'tuh', 'tweo', 'tweog', 'tweogg', 'tweogs', 'tweon', 'tweonj', 'tweonh', 'tweod', + 0x50 => 'tweol', 'tweolg', 'tweolm', 'tweolb', 'tweols', 'tweolt', 'tweolp', 'tweolh', 'tweom', 'tweob', 'tweobs', 'tweos', 'tweoss', 'tweong', 'tweoj', 'tweoc', + 0x60 => 'tweok', 'tweot', 'tweop', 'tweoh', 'twe', 'tweg', 'twegg', 'twegs', 'twen', 'twenj', 'twenh', 'twed', 'twel', 'twelg', 'twelm', 'twelb', + 0x70 => 'twels', 'twelt', 'twelp', 'twelh', 'twem', 'tweb', 'twebs', 'twes', 'twess', 'tweng', 'twej', 'twec', 'twek', 'twet', 'twep', 'tweh', + 0x80 => 'twi', 'twig', 'twigg', 'twigs', 'twin', 'twinj', 'twinh', 'twid', 'twil', 'twilg', 'twilm', 'twilb', 'twils', 'twilt', 'twilp', 'twilh', + 0x90 => 'twim', 'twib', 'twibs', 'twis', 'twiss', 'twing', 'twij', 'twic', 'twik', 'twit', 'twip', 'twih', 'tyu', 'tyug', 'tyugg', 'tyugs', + 0xA0 => 'tyun', 'tyunj', 'tyunh', 'tyud', 'tyul', 'tyulg', 'tyulm', 'tyulb', 'tyuls', 'tyult', 'tyulp', 'tyulh', 'tyum', 'tyub', 'tyubs', 'tyus', + 0xB0 => 'tyuss', 'tyung', 'tyuj', 'tyuc', 'tyuk', 'tyut', 'tyup', 'tyuh', 'teu', 'teug', 'teugg', 'teugs', 'teun', 'teunj', 'teunh', 'teud', + 0xC0 => 'teul', 'teulg', 'teulm', 'teulb', 'teuls', 'teult', 'teulp', 'teulh', 'teum', 'teub', 'teubs', 'teus', 'teuss', 'teung', 'teuj', 'teuc', + 0xD0 => 'teuk', 'teut', 'teup', 'teuh', 'tyi', 'tyig', 'tyigg', 'tyigs', 'tyin', 'tyinj', 'tyinh', 'tyid', 'tyil', 'tyilg', 'tyilm', 'tyilb', + 0xE0 => 'tyils', 'tyilt', 'tyilp', 'tyilh', 'tyim', 'tyib', 'tyibs', 'tyis', 'tyiss', 'tying', 'tyij', 'tyic', 'tyik', 'tyit', 'tyip', 'tyih', + 0xF0 => 'ti', 'tig', 'tigg', 'tigs', 'tin', 'tinj', 'tinh', 'tid', 'til', 'tilg', 'tilm', 'tilb', 'tils', 'tilt', 'tilp', 'tilh', +); diff --git a/sources/resources/transliteration-data/xd3.php b/sources/resources/transliteration-data/xd3.php new file mode 100644 index 0000000..bfc3895 --- /dev/null +++ b/sources/resources/transliteration-data/xd3.php @@ -0,0 +1,20 @@ + 'tim', 'tib', 'tibs', 'tis', 'tiss', 'ting', 'tij', 'tic', 'tik', 'tit', 'tip', 'tih', 'pa', 'pag', 'pagg', 'pags', + 0x10 => 'pan', 'panj', 'panh', 'pad', 'pal', 'palg', 'palm', 'palb', 'pals', 'palt', 'palp', 'palh', 'pam', 'pab', 'pabs', 'pas', + 0x20 => 'pass', 'pang', 'paj', 'pac', 'pak', 'pat', 'pap', 'pah', 'pae', 'paeg', 'paegg', 'paegs', 'paen', 'paenj', 'paenh', 'paed', + 0x30 => 'pael', 'paelg', 'paelm', 'paelb', 'paels', 'paelt', 'paelp', 'paelh', 'paem', 'paeb', 'paebs', 'paes', 'paess', 'paeng', 'paej', 'paec', + 0x40 => 'paek', 'paet', 'paep', 'paeh', 'pya', 'pyag', 'pyagg', 'pyags', 'pyan', 'pyanj', 'pyanh', 'pyad', 'pyal', 'pyalg', 'pyalm', 'pyalb', + 0x50 => 'pyals', 'pyalt', 'pyalp', 'pyalh', 'pyam', 'pyab', 'pyabs', 'pyas', 'pyass', 'pyang', 'pyaj', 'pyac', 'pyak', 'pyat', 'pyap', 'pyah', + 0x60 => 'pyae', 'pyaeg', 'pyaegg', 'pyaegs', 'pyaen', 'pyaenj', 'pyaenh', 'pyaed', 'pyael', 'pyaelg', 'pyaelm', 'pyaelb', 'pyaels', 'pyaelt', 'pyaelp', 'pyaelh', + 0x70 => 'pyaem', 'pyaeb', 'pyaebs', 'pyaes', 'pyaess', 'pyaeng', 'pyaej', 'pyaec', 'pyaek', 'pyaet', 'pyaep', 'pyaeh', 'peo', 'peog', 'peogg', 'peogs', + 0x80 => 'peon', 'peonj', 'peonh', 'peod', 'peol', 'peolg', 'peolm', 'peolb', 'peols', 'peolt', 'peolp', 'peolh', 'peom', 'peob', 'peobs', 'peos', + 0x90 => 'peoss', 'peong', 'peoj', 'peoc', 'peok', 'peot', 'peop', 'peoh', 'pe', 'peg', 'pegg', 'pegs', 'pen', 'penj', 'penh', 'ped', + 0xA0 => 'pel', 'pelg', 'pelm', 'pelb', 'pels', 'pelt', 'pelp', 'pelh', 'pem', 'peb', 'pebs', 'pes', 'pess', 'peng', 'pej', 'pec', + 0xB0 => 'pek', 'pet', 'pep', 'peh', 'pyeo', 'pyeog', 'pyeogg', 'pyeogs', 'pyeon', 'pyeonj', 'pyeonh', 'pyeod', 'pyeol', 'pyeolg', 'pyeolm', 'pyeolb', + 0xC0 => 'pyeols', 'pyeolt', 'pyeolp', 'pyeolh', 'pyeom', 'pyeob', 'pyeobs', 'pyeos', 'pyeoss', 'pyeong', 'pyeoj', 'pyeoc', 'pyeok', 'pyeot', 'pyeop', 'pyeoh', + 0xD0 => 'pye', 'pyeg', 'pyegg', 'pyegs', 'pyen', 'pyenj', 'pyenh', 'pyed', 'pyel', 'pyelg', 'pyelm', 'pyelb', 'pyels', 'pyelt', 'pyelp', 'pyelh', + 0xE0 => 'pyem', 'pyeb', 'pyebs', 'pyes', 'pyess', 'pyeng', 'pyej', 'pyec', 'pyek', 'pyet', 'pyep', 'pyeh', 'po', 'pog', 'pogg', 'pogs', + 0xF0 => 'pon', 'ponj', 'ponh', 'pod', 'pol', 'polg', 'polm', 'polb', 'pols', 'polt', 'polp', 'polh', 'pom', 'pob', 'pobs', 'pos', +); diff --git a/sources/resources/transliteration-data/xd4.php b/sources/resources/transliteration-data/xd4.php new file mode 100644 index 0000000..07db051 --- /dev/null +++ b/sources/resources/transliteration-data/xd4.php @@ -0,0 +1,20 @@ + 'poss', 'pong', 'poj', 'poc', 'pok', 'pot', 'pop', 'poh', 'pwa', 'pwag', 'pwagg', 'pwags', 'pwan', 'pwanj', 'pwanh', 'pwad', + 0x10 => 'pwal', 'pwalg', 'pwalm', 'pwalb', 'pwals', 'pwalt', 'pwalp', 'pwalh', 'pwam', 'pwab', 'pwabs', 'pwas', 'pwass', 'pwang', 'pwaj', 'pwac', + 0x20 => 'pwak', 'pwat', 'pwap', 'pwah', 'pwae', 'pwaeg', 'pwaegg', 'pwaegs', 'pwaen', 'pwaenj', 'pwaenh', 'pwaed', 'pwael', 'pwaelg', 'pwaelm', 'pwaelb', + 0x30 => 'pwaels', 'pwaelt', 'pwaelp', 'pwaelh', 'pwaem', 'pwaeb', 'pwaebs', 'pwaes', 'pwaess', 'pwaeng', 'pwaej', 'pwaec', 'pwaek', 'pwaet', 'pwaep', 'pwaeh', + 0x40 => 'poe', 'poeg', 'poegg', 'poegs', 'poen', 'poenj', 'poenh', 'poed', 'poel', 'poelg', 'poelm', 'poelb', 'poels', 'poelt', 'poelp', 'poelh', + 0x50 => 'poem', 'poeb', 'poebs', 'poes', 'poess', 'poeng', 'poej', 'poec', 'poek', 'poet', 'poep', 'poeh', 'pyo', 'pyog', 'pyogg', 'pyogs', + 0x60 => 'pyon', 'pyonj', 'pyonh', 'pyod', 'pyol', 'pyolg', 'pyolm', 'pyolb', 'pyols', 'pyolt', 'pyolp', 'pyolh', 'pyom', 'pyob', 'pyobs', 'pyos', + 0x70 => 'pyoss', 'pyong', 'pyoj', 'pyoc', 'pyok', 'pyot', 'pyop', 'pyoh', 'pu', 'pug', 'pugg', 'pugs', 'pun', 'punj', 'punh', 'pud', + 0x80 => 'pul', 'pulg', 'pulm', 'pulb', 'puls', 'pult', 'pulp', 'pulh', 'pum', 'pub', 'pubs', 'pus', 'puss', 'pung', 'puj', 'puc', + 0x90 => 'puk', 'put', 'pup', 'puh', 'pweo', 'pweog', 'pweogg', 'pweogs', 'pweon', 'pweonj', 'pweonh', 'pweod', 'pweol', 'pweolg', 'pweolm', 'pweolb', + 0xA0 => 'pweols', 'pweolt', 'pweolp', 'pweolh', 'pweom', 'pweob', 'pweobs', 'pweos', 'pweoss', 'pweong', 'pweoj', 'pweoc', 'pweok', 'pweot', 'pweop', 'pweoh', + 0xB0 => 'pwe', 'pweg', 'pwegg', 'pwegs', 'pwen', 'pwenj', 'pwenh', 'pwed', 'pwel', 'pwelg', 'pwelm', 'pwelb', 'pwels', 'pwelt', 'pwelp', 'pwelh', + 0xC0 => 'pwem', 'pweb', 'pwebs', 'pwes', 'pwess', 'pweng', 'pwej', 'pwec', 'pwek', 'pwet', 'pwep', 'pweh', 'pwi', 'pwig', 'pwigg', 'pwigs', + 0xD0 => 'pwin', 'pwinj', 'pwinh', 'pwid', 'pwil', 'pwilg', 'pwilm', 'pwilb', 'pwils', 'pwilt', 'pwilp', 'pwilh', 'pwim', 'pwib', 'pwibs', 'pwis', + 0xE0 => 'pwiss', 'pwing', 'pwij', 'pwic', 'pwik', 'pwit', 'pwip', 'pwih', 'pyu', 'pyug', 'pyugg', 'pyugs', 'pyun', 'pyunj', 'pyunh', 'pyud', + 0xF0 => 'pyul', 'pyulg', 'pyulm', 'pyulb', 'pyuls', 'pyult', 'pyulp', 'pyulh', 'pyum', 'pyub', 'pyubs', 'pyus', 'pyuss', 'pyung', 'pyuj', 'pyuc', +); diff --git a/sources/resources/transliteration-data/xd5.php b/sources/resources/transliteration-data/xd5.php new file mode 100644 index 0000000..a3da26b --- /dev/null +++ b/sources/resources/transliteration-data/xd5.php @@ -0,0 +1,20 @@ + 'pyuk', 'pyut', 'pyup', 'pyuh', 'peu', 'peug', 'peugg', 'peugs', 'peun', 'peunj', 'peunh', 'peud', 'peul', 'peulg', 'peulm', 'peulb', + 0x10 => 'peuls', 'peult', 'peulp', 'peulh', 'peum', 'peub', 'peubs', 'peus', 'peuss', 'peung', 'peuj', 'peuc', 'peuk', 'peut', 'peup', 'peuh', + 0x20 => 'pyi', 'pyig', 'pyigg', 'pyigs', 'pyin', 'pyinj', 'pyinh', 'pyid', 'pyil', 'pyilg', 'pyilm', 'pyilb', 'pyils', 'pyilt', 'pyilp', 'pyilh', + 0x30 => 'pyim', 'pyib', 'pyibs', 'pyis', 'pyiss', 'pying', 'pyij', 'pyic', 'pyik', 'pyit', 'pyip', 'pyih', 'pi', 'pig', 'pigg', 'pigs', + 0x40 => 'pin', 'pinj', 'pinh', 'pid', 'pil', 'pilg', 'pilm', 'pilb', 'pils', 'pilt', 'pilp', 'pilh', 'pim', 'pib', 'pibs', 'pis', + 0x50 => 'piss', 'ping', 'pij', 'pic', 'pik', 'pit', 'pip', 'pih', 'ha', 'hag', 'hagg', 'hags', 'han', 'hanj', 'hanh', 'had', + 0x60 => 'hal', 'halg', 'halm', 'halb', 'hals', 'halt', 'halp', 'halh', 'ham', 'hab', 'habs', 'has', 'hass', 'hang', 'haj', 'hac', + 0x70 => 'hak', 'hat', 'hap', 'hah', 'hae', 'haeg', 'haegg', 'haegs', 'haen', 'haenj', 'haenh', 'haed', 'hael', 'haelg', 'haelm', 'haelb', + 0x80 => 'haels', 'haelt', 'haelp', 'haelh', 'haem', 'haeb', 'haebs', 'haes', 'haess', 'haeng', 'haej', 'haec', 'haek', 'haet', 'haep', 'haeh', + 0x90 => 'hya', 'hyag', 'hyagg', 'hyags', 'hyan', 'hyanj', 'hyanh', 'hyad', 'hyal', 'hyalg', 'hyalm', 'hyalb', 'hyals', 'hyalt', 'hyalp', 'hyalh', + 0xA0 => 'hyam', 'hyab', 'hyabs', 'hyas', 'hyass', 'hyang', 'hyaj', 'hyac', 'hyak', 'hyat', 'hyap', 'hyah', 'hyae', 'hyaeg', 'hyaegg', 'hyaegs', + 0xB0 => 'hyaen', 'hyaenj', 'hyaenh', 'hyaed', 'hyael', 'hyaelg', 'hyaelm', 'hyaelb', 'hyaels', 'hyaelt', 'hyaelp', 'hyaelh', 'hyaem', 'hyaeb', 'hyaebs', 'hyaes', + 0xC0 => 'hyaess', 'hyaeng', 'hyaej', 'hyaec', 'hyaek', 'hyaet', 'hyaep', 'hyaeh', 'heo', 'heog', 'heogg', 'heogs', 'heon', 'heonj', 'heonh', 'heod', + 0xD0 => 'heol', 'heolg', 'heolm', 'heolb', 'heols', 'heolt', 'heolp', 'heolh', 'heom', 'heob', 'heobs', 'heos', 'heoss', 'heong', 'heoj', 'heoc', + 0xE0 => 'heok', 'heot', 'heop', 'heoh', 'he', 'heg', 'hegg', 'hegs', 'hen', 'henj', 'henh', 'hed', 'hel', 'helg', 'helm', 'helb', + 0xF0 => 'hels', 'helt', 'help', 'helh', 'hem', 'heb', 'hebs', 'hes', 'hess', 'heng', 'hej', 'hec', 'hek', 'het', 'hep', 'heh', +); diff --git a/sources/resources/transliteration-data/xd6.php b/sources/resources/transliteration-data/xd6.php new file mode 100644 index 0000000..a18193b --- /dev/null +++ b/sources/resources/transliteration-data/xd6.php @@ -0,0 +1,20 @@ + 'hyeo', 'hyeog', 'hyeogg', 'hyeogs', 'hyeon', 'hyeonj', 'hyeonh', 'hyeod', 'hyeol', 'hyeolg', 'hyeolm', 'hyeolb', 'hyeols', 'hyeolt', 'hyeolp', 'hyeolh', + 0x10 => 'hyeom', 'hyeob', 'hyeobs', 'hyeos', 'hyeoss', 'hyeong', 'hyeoj', 'hyeoc', 'hyeok', 'hyeot', 'hyeop', 'hyeoh', 'hye', 'hyeg', 'hyegg', 'hyegs', + 0x20 => 'hyen', 'hyenj', 'hyenh', 'hyed', 'hyel', 'hyelg', 'hyelm', 'hyelb', 'hyels', 'hyelt', 'hyelp', 'hyelh', 'hyem', 'hyeb', 'hyebs', 'hyes', + 0x30 => 'hyess', 'hyeng', 'hyej', 'hyec', 'hyek', 'hyet', 'hyep', 'hyeh', 'ho', 'hog', 'hogg', 'hogs', 'hon', 'honj', 'honh', 'hod', + 0x40 => 'hol', 'holg', 'holm', 'holb', 'hols', 'holt', 'holp', 'holh', 'hom', 'hob', 'hobs', 'hos', 'hoss', 'hong', 'hoj', 'hoc', + 0x50 => 'hok', 'hot', 'hop', 'hoh', 'hwa', 'hwag', 'hwagg', 'hwags', 'hwan', 'hwanj', 'hwanh', 'hwad', 'hwal', 'hwalg', 'hwalm', 'hwalb', + 0x60 => 'hwals', 'hwalt', 'hwalp', 'hwalh', 'hwam', 'hwab', 'hwabs', 'hwas', 'hwass', 'hwang', 'hwaj', 'hwac', 'hwak', 'hwat', 'hwap', 'hwah', + 0x70 => 'hwae', 'hwaeg', 'hwaegg', 'hwaegs', 'hwaen', 'hwaenj', 'hwaenh', 'hwaed', 'hwael', 'hwaelg', 'hwaelm', 'hwaelb', 'hwaels', 'hwaelt', 'hwaelp', 'hwaelh', + 0x80 => 'hwaem', 'hwaeb', 'hwaebs', 'hwaes', 'hwaess', 'hwaeng', 'hwaej', 'hwaec', 'hwaek', 'hwaet', 'hwaep', 'hwaeh', 'hoe', 'hoeg', 'hoegg', 'hoegs', + 0x90 => 'hoen', 'hoenj', 'hoenh', 'hoed', 'hoel', 'hoelg', 'hoelm', 'hoelb', 'hoels', 'hoelt', 'hoelp', 'hoelh', 'hoem', 'hoeb', 'hoebs', 'hoes', + 0xA0 => 'hoess', 'hoeng', 'hoej', 'hoec', 'hoek', 'hoet', 'hoep', 'hoeh', 'hyo', 'hyog', 'hyogg', 'hyogs', 'hyon', 'hyonj', 'hyonh', 'hyod', + 0xB0 => 'hyol', 'hyolg', 'hyolm', 'hyolb', 'hyols', 'hyolt', 'hyolp', 'hyolh', 'hyom', 'hyob', 'hyobs', 'hyos', 'hyoss', 'hyong', 'hyoj', 'hyoc', + 0xC0 => 'hyok', 'hyot', 'hyop', 'hyoh', 'hu', 'hug', 'hugg', 'hugs', 'hun', 'hunj', 'hunh', 'hud', 'hul', 'hulg', 'hulm', 'hulb', + 0xD0 => 'huls', 'hult', 'hulp', 'hulh', 'hum', 'hub', 'hubs', 'hus', 'huss', 'hung', 'huj', 'huc', 'huk', 'hut', 'hup', 'huh', + 0xE0 => 'hweo', 'hweog', 'hweogg', 'hweogs', 'hweon', 'hweonj', 'hweonh', 'hweod', 'hweol', 'hweolg', 'hweolm', 'hweolb', 'hweols', 'hweolt', 'hweolp', 'hweolh', + 0xF0 => 'hweom', 'hweob', 'hweobs', 'hweos', 'hweoss', 'hweong', 'hweoj', 'hweoc', 'hweok', 'hweot', 'hweop', 'hweoh', 'hwe', 'hweg', 'hwegg', 'hwegs', +); diff --git a/sources/resources/transliteration-data/xd7.php b/sources/resources/transliteration-data/xd7.php new file mode 100644 index 0000000..dba80cd --- /dev/null +++ b/sources/resources/transliteration-data/xd7.php @@ -0,0 +1,20 @@ + 'hwen', 'hwenj', 'hwenh', 'hwed', 'hwel', 'hwelg', 'hwelm', 'hwelb', 'hwels', 'hwelt', 'hwelp', 'hwelh', 'hwem', 'hweb', 'hwebs', 'hwes', + 0x10 => 'hwess', 'hweng', 'hwej', 'hwec', 'hwek', 'hwet', 'hwep', 'hweh', 'hwi', 'hwig', 'hwigg', 'hwigs', 'hwin', 'hwinj', 'hwinh', 'hwid', + 0x20 => 'hwil', 'hwilg', 'hwilm', 'hwilb', 'hwils', 'hwilt', 'hwilp', 'hwilh', 'hwim', 'hwib', 'hwibs', 'hwis', 'hwiss', 'hwing', 'hwij', 'hwic', + 0x30 => 'hwik', 'hwit', 'hwip', 'hwih', 'hyu', 'hyug', 'hyugg', 'hyugs', 'hyun', 'hyunj', 'hyunh', 'hyud', 'hyul', 'hyulg', 'hyulm', 'hyulb', + 0x40 => 'hyuls', 'hyult', 'hyulp', 'hyulh', 'hyum', 'hyub', 'hyubs', 'hyus', 'hyuss', 'hyung', 'hyuj', 'hyuc', 'hyuk', 'hyut', 'hyup', 'hyuh', + 0x50 => 'heu', 'heug', 'heugg', 'heugs', 'heun', 'heunj', 'heunh', 'heud', 'heul', 'heulg', 'heulm', 'heulb', 'heuls', 'heult', 'heulp', 'heulh', + 0x60 => 'heum', 'heub', 'heubs', 'heus', 'heuss', 'heung', 'heuj', 'heuc', 'heuk', 'heut', 'heup', 'heuh', 'hyi', 'hyig', 'hyigg', 'hyigs', + 0x70 => 'hyin', 'hyinj', 'hyinh', 'hyid', 'hyil', 'hyilg', 'hyilm', 'hyilb', 'hyils', 'hyilt', 'hyilp', 'hyilh', 'hyim', 'hyib', 'hyibs', 'hyis', + 0x80 => 'hyiss', 'hying', 'hyij', 'hyic', 'hyik', 'hyit', 'hyip', 'hyih', 'hi', 'hig', 'higg', 'higs', 'hin', 'hinj', 'hinh', 'hid', + 0x90 => 'hil', 'hilg', 'hilm', 'hilb', 'hils', 'hilt', 'hilp', 'hilh', 'him', 'hib', 'hibs', 'his', 'hiss', 'hing', 'hij', 'hic', + 0xA0 => 'hik', 'hit', 'hip', 'hih', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xB0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/xf9.php b/sources/resources/transliteration-data/xf9.php new file mode 100644 index 0000000..0e2c38d --- /dev/null +++ b/sources/resources/transliteration-data/xf9.php @@ -0,0 +1,20 @@ + 'Kay ', 'Kayng ', 'Ke ', 'Ko ', 'Kol ', 'Koc ', 'Kwi ', 'Kwi ', 'Kyun ', 'Kul ', 'Kum ', 'Na ', 'Na ', 'Na ', 'La ', 'Na ', + 0x10 => 'Na ', 'Na ', 'Na ', 'Na ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nak ', 'Nan ', 'Nan ', 'Nan ', 'Nan ', 'Nan ', + 0x20 => 'Nan ', 'Nam ', 'Nam ', 'Nam ', 'Nam ', 'Nap ', 'Nap ', 'Nap ', 'Nang ', 'Nang ', 'Nang ', 'Nang ', 'Nang ', 'Nay ', 'Nayng ', 'No ', + 0x30 => 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'No ', 'Nok ', 'Nok ', 'Nok ', 'Nok ', 'Nok ', + 0x40 => 'Nok ', 'Non ', 'Nong ', 'Nong ', 'Nong ', 'Nong ', 'Noy ', 'Noy ', 'Noy ', 'Noy ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', 'Nwu ', + 0x50 => 'Nwu ', 'Nwu ', 'Nuk ', 'Nuk ', 'Num ', 'Nung ', 'Nung ', 'Nung ', 'Nung ', 'Nung ', 'Twu ', 'La ', 'Lak ', 'Lak ', 'Lan ', 'Lyeng ', + 0x60 => 'Lo ', 'Lyul ', 'Li ', 'Pey ', 'Pen ', 'Pyen ', 'Pwu ', 'Pwul ', 'Pi ', 'Sak ', 'Sak ', 'Sam ', 'Sayk ', 'Sayng ', 'Sep ', 'Sey ', + 0x70 => 'Sway ', 'Sin ', 'Sim ', 'Sip ', 'Ya ', 'Yak ', 'Yak ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Yang ', 'Ye ', + 0x80 => 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Ye ', 'Yek ', 'Yek ', 'Yek ', 'Yek ', 'Yen ', 'Yen ', + 0x90 => 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yen ', 'Yel ', 'Yel ', 'Yel ', 'Yel ', + 0xA0 => 'Yel ', 'Yel ', 'Yem ', 'Yem ', 'Yem ', 'Yem ', 'Yem ', 'Yep ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', + 0xB0 => 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yeng ', 'Yey ', 'Yey ', 'Yey ', 'Yey ', 'O ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yo ', + 0xC0 => 'Yo ', 'Yo ', 'Yo ', 'Yo ', 'Yong ', 'Wun ', 'Wen ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', 'Yu ', + 0xD0 => 'Yu ', 'Yuk ', 'Yuk ', 'Yuk ', 'Yun ', 'Yun ', 'Yun ', 'Yun ', 'Yul ', 'Yul ', 'Yul ', 'Yul ', 'Yung ', 'I ', 'I ', 'I ', + 0xE0 => 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'I ', 'Ik ', 'Ik ', 'In ', 'In ', 'In ', + 0xF0 => 'In ', 'In ', 'In ', 'In ', 'Im ', 'Im ', 'Im ', 'Ip ', 'Ip ', 'Ip ', 'Cang ', 'Cek ', 'Ci ', 'Cip ', 'Cha ', 'Chek ', +); diff --git a/sources/resources/transliteration-data/xfa.php b/sources/resources/transliteration-data/xfa.php new file mode 100644 index 0000000..5fff2c7 --- /dev/null +++ b/sources/resources/transliteration-data/xfa.php @@ -0,0 +1,20 @@ + 'Chey ', 'Thak ', 'Thak ', 'Thang ', 'Thayk ', 'Thong ', 'Pho ', 'Phok ', 'Hang ', 'Hang ', 'Hyen ', 'Hwak ', 'Wu ', 'Huo ', NULL, NULL, + 0x10 => 'Zhong ', NULL, 'Qing ', NULL, NULL, 'Xi ', 'Zhu ', 'Yi ', 'Li ', 'Shen ', 'Xiang ', 'Fu ', 'Jing ', 'Jing ', 'Yu ', NULL, + 0x20 => 'Hagi ', NULL, 'Zhu ', NULL, NULL, 'Yi ', 'Du ', NULL, NULL, NULL, 'Fan ', 'Si ', 'Guan ', NULL, NULL, NULL, + 0x30 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x40 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x50 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x60 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x70 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x80 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x90 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xA0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xB0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/xfb.php b/sources/resources/transliteration-data/xfb.php new file mode 100644 index 0000000..b7b8093 --- /dev/null +++ b/sources/resources/transliteration-data/xfb.php @@ -0,0 +1,20 @@ + 'ff', 'fi', 'fl', 'ffi', 'ffl', 'st', 'st', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x10 => NULL, NULL, NULL, 'mn', 'me', 'mi', 'vn', 'mkh', NULL, NULL, NULL, NULL, NULL, 'yi', '', 'ay', + 0x20 => '`', '', 'd', 'h', 'k', 'l', 'm', 'm', 't', '+', 'sh', 's', 'sh', 's', 'a', 'a', + 0x30 => '', 'b', 'g', 'd', 'h', 'v', 'z', NULL, 't', 'y', 'k', 'k', 'l', NULL, 'l', NULL, + 0x40 => 'n', 'n', NULL, 'p', 'p', NULL, 'ts', 'ts', 'r', 'sh', 't', 'vo', 'b', 'k', 'p', 'l', + 0x50 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x60 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x70 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x80 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x90 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xA0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xB0 => '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xC0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xE0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xF0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', +); diff --git a/sources/resources/transliteration-data/xfc.php b/sources/resources/transliteration-data/xfc.php new file mode 100644 index 0000000..b471d17 --- /dev/null +++ b/sources/resources/transliteration-data/xfc.php @@ -0,0 +1,20 @@ + '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x10 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x20 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x30 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x40 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x50 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x60 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x70 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x80 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x90 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xA0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xB0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xC0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xD0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xE0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xF0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', +); diff --git a/sources/resources/transliteration-data/xfd.php b/sources/resources/transliteration-data/xfd.php new file mode 100644 index 0000000..d51a908 --- /dev/null +++ b/sources/resources/transliteration-data/xfd.php @@ -0,0 +1,20 @@ + '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x10 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x20 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x30 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x40 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x50 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x60 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x70 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x80 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x90 => NULL, NULL, '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xA0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xB0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xC0 => '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xD0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xE0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0xF0 => '', '', '', '', '', '', '', '', '', '', '', '', NULL, NULL, NULL, NULL, +); diff --git a/sources/resources/transliteration-data/xfe.php b/sources/resources/transliteration-data/xfe.php new file mode 100644 index 0000000..cdf17bd --- /dev/null +++ b/sources/resources/transliteration-data/xfe.php @@ -0,0 +1,20 @@ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x10 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x20 => '', '', '', '~', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0x30 => '..', '--', '-', '_', '_', '(', ') ', '{', '} ', '[', '] ', '[(', ')] ', '<<', '>> ', '<', + 0x40 => '> ', '[', '] ', '{', '}', NULL, NULL, NULL, NULL, '', '', '', '', '', '', '', + 0x50 => ',', ',', '.', '', ';', ':', '?', '!', '-', '(', ')', '{', '}', '{', '}', '#', + 0x60 => '&', '*', '+', '-', '<', '>', '=', '', '\\', '$', '%', '@', NULL, NULL, NULL, NULL, + 0x70 => '', '', '', NULL, '', NULL, '', '', '', '', '', '', '', '', '', '', + 0x80 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0x90 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xA0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xB0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xC0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xD0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xE0 => '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', + 0xF0 => '', '', '', '', '', '', '', '', '', '', '', '', '', NULL, NULL, '', +); diff --git a/sources/resources/transliteration-data/xff.php b/sources/resources/transliteration-data/xff.php new file mode 100644 index 0000000..45ecd5e --- /dev/null +++ b/sources/resources/transliteration-data/xff.php @@ -0,0 +1,20 @@ + NULL, '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', + 0x10 => '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', + 0x20 => '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 0x30 => 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + 0x40 => '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 0x50 => 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', NULL, + 0x60 => NULL, '.', '[', ']', ',', '*', 'wo', 'a', 'i', 'u', 'e', 'o', 'ya', 'yu', 'yo', 'tu', + 0x70 => '+', 'a', 'i', 'u', 'e', 'o', 'ka', 'ki', 'ku', 'ke', 'ko', 'sa', 'si', 'su', 'se', 'so', + 0x80 => 'ta', 'ti', 'tu', 'te', 'to', 'na', 'ni', 'nu', 'ne', 'no', 'ha', 'hi', 'hu', 'he', 'ho', 'ma', + 0x90 => 'mi', 'mu', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'ri', 'ru', 're', 'ro', 'wa', 'n', ':', ';', + 0xA0 => '', 'g', 'gg', 'gs', 'n', 'nj', 'nh', 'd', 'dd', 'r', 'lg', 'lm', 'lb', 'ls', 'lt', 'lp', + 0xB0 => 'rh', 'm', 'b', 'bb', 'bs', 's', 'ss', '', 'j', 'jj', 'c', 'k', 't', 'p', 'h', NULL, + 0xC0 => NULL, NULL, 'a', 'ae', 'ya', 'yae', 'eo', 'e', NULL, NULL, 'yeo', 'ye', 'o', 'wa', 'wae', 'oe', + 0xD0 => NULL, NULL, 'yo', 'u', 'weo', 'we', 'wi', 'yu', NULL, NULL, 'eu', 'yi', 'i', NULL, NULL, NULL, + 0xE0 => '/C', 'PS', '!', '-', '|', 'Y=', 'W=', NULL, '|', '-', '|', '-', '|', '#', 'O', NULL, + 0xF0 => NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '{', '|', '}', '', '', '', '', +); diff --git a/sources/sendtomail.php b/sources/sendtomail.php new file mode 100644 index 0000000..240fc84 --- /dev/null +++ b/sources/sendtomail.php @@ -0,0 +1,89 @@ +getDataById ($idData); + +if (filesize ($data->getLocalPath ()) > 10 * 1024 * 1024) { + echo 'Attachment too big'; + exit; +} + +$mail = new PHPMailer; + +$mail->IsSMTP(); +$mail->Timeout = 30; // 30 seconds as some files can be big +$mail->Host = $config['cops_mail_configuration']["smtp.host"]; +if (!empty ($config['cops_mail_configuration']["smtp.secure"])) { + $mail->SMTPSecure = $config['cops_mail_configuration']["smtp.secure"]; + $mail->Port = 465; +} +$mail->SMTPAuth = !empty ($config['cops_mail_configuration']["smtp.username"]); +if (!empty ($config['cops_mail_configuration']["smtp.username"])) $mail->Username = $config['cops_mail_configuration']["smtp.username"]; +if (!empty ($config['cops_mail_configuration']["smtp.password"])) $mail->Password = $config['cops_mail_configuration']["smtp.password"]; +if (!empty ($config['cops_mail_configuration']["smtp.secure"])) $mail->SMTPSecure = $config['cops_mail_configuration']["smtp.secure"]; + +$mail->From = $config['cops_mail_configuration']["address.from"]; +$mail->FromName = $config['cops_title_default']; + +foreach (explode (";", $emailDest) as $emailAddress) { + if (empty ($emailAddress)) { continue; } + $mail->AddAddress($emailAddress); +} + +$mail->AddAttachment($data->getLocalPath ()); + +$mail->IsHTML(true); +$mail->CharSet = "UTF-8"; +$mail->Subject = 'Sent by COPS : ' . $data->getUpdatedFilename (); +$mail->Body = "

    " . $book->title . "

    " . $book->getAuthorsName () . "

    " . $book->getComment (); +$mail->AltBody = "Sent by COPS"; + +if (!$mail->Send()) { + echo localize ("mail.messagenotsent"); + echo 'Mailer Error: ' . $mail->ErrorInfo; + exit; +} + +echo localize ("mail.messagesent"); + diff --git a/sources/styles/cops-monocle.css b/sources/styles/cops-monocle.css new file mode 100644 index 0000000..d9592c9 --- /dev/null +++ b/sources/styles/cops-monocle.css @@ -0,0 +1,273 @@ +body { + margin: 0; + padding: 0; + background: #000; + -webkit-user-select: none; + -webkit-text-size-adjust: none; +} + +#components { + display: none; +} + +#reader, #readerBg { + position: absolute; + width: 100%; + height: 100%; +} + +#reader div pre { + white-space: normal; + font: normal 100% serif; +} + +/* from smallest and outermost to largest and innermost */ +.dummyPage { + position: absolute; + left: 0; + top: 20px; + bottom: 20px; + right: 15px; + background-color: #FCF6F0; + -webkit-box-shadow: 2px 2px 4px #754; + -moz-box-shadow: 2px 2px 4px #754; + box-shadow: 2px 2px 4px #754; + -webkit-border-top-left-radius: 26px 6px; + -webkit-border-bottom-left-radius: 26px 6px; + -moz-border-top-left-radius: 26px 6px; + -moz-border-bottom-left-radius: 26px 6px; + border-top-left-radius: 26px 6px; + border-bottom-left-radius: 26px 6px; +} +.dummyPage + .dummyPage { + top: 16px; + bottom: 16px; + right: 16px; + -webkit-box-shadow: 1px 0 2px #A99; + -moz-box-shadow: 1px 0 2px #A99; + box-shadow: 1px 0 2px #A99; +} +.dummyPage + .dummyPage + .dummyPage { + top: 13px; + bottom: 13px; + right: 18px; + background-color: #FFF9F4; +} +.dummyPage + .dummyPage + .dummyPage + .dummyPage { + top: 10px; + bottom: 10px; + right: 21px; +} +.dummyPage + .dummyPage + .dummyPage + .dummyPage + .dummyPage { + top: 8px; + bottom: 8px; + right: 25px; +} +.jacket { + position: absolute; + top: 1px; + bottom: 1px; + right: 3px; + left: 65%; + -webkit-box-shadow: -3px 0 3px #311; + -moz-box-shadow: -3px 0 3px #311; + box-shadow: -3px 0 3px #311; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -moz-border-top-right-radius: 3px; + -moz-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + background-color: #F7F7F7; + background: -webkit-linear-gradient(0deg, #DDD, #FFF); + background: -moz-linear-gradient(0deg , #DDD, #FFF); + background: linear-gradient(90deg, #DDD, #FFF); +} +.board { + position: absolute; + top: 1px; + bottom: 1px; + width: 90%; + background-color: #974; + border: 1px solid #852; +} + +.runner { + color: #542; + text-transform: uppercase; + font-size: 82%; +} + +.pageNumber, .bookTitle, .chapterTitle { + padding: 3% 2%; +} + +.bookTitle, .chapterTitle { + position: absolute; + top: 1%; + left: 6%; + cursor: pointer; + padding: 0; +} + +.chapterTitle { + top: auto; + bottom: 1%; + right: 20%; +} + +.pageNumber { + position: absolute; + bottom: 1%; + right: 8%; + padding-right: 0; +} + +#readerBg { + background-color: #000; +} + +#toc ul.root { + position: absolute; + top: 50px; + left: 8%; + max-height: 75%; + max-width: 80%; + background: #E0D3C0; + -webkit-box-shadow: 1px 2px 2px #652; + -moz-box-shadow: 1px 2px 2px #652; + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + overflow-y: auto; + color: #432; + font: 11pt Georgia, serif; + text-shadow: 1px 1px #EEE6D0; + border: 1px solid #EED; + z-index: 9; +} + +.tocArrow { + position: absolute; + top: 40px; + left: 16%; + width: 20px; + height: 20px; + -webkit-transform: rotateZ(45deg); + background: #E0D3C0; + z-index: 8; +} + +#toc li { + list-style: none; + line-height: 220%; + padding-left: 1em; + padding-right: 2em; + border-bottom: 2px groove #FFF6E9; + cursor: pointer; +} + +#toc li span { + display: block; +} + +#toc ul li:last-child { + border-bottom: none; +} + +#toc ul { + margin: 0; + padding: 0; +} +#toc ul.root { + border-top: none; +} + + + +/* Overrides to core elements */ + +div.monelem_container { + background: none; + width: auto; +} + +div.monelem_page { + top: 6px; + bottom: 6px; + right: 4px; + border-color: #CBA; + outline: none; + -webkit-box-shadow: 1px 0 1px #CBA; + -moz-box-shadow: 1px 0 1px #CBA; + box-shadow: 1px 0 2px #CBA; + -webkit-border-top-left-radius: 26px 4px; + -webkit-border-bottom-left-radius: 26px 4px; + -moz-border-top-left-radius: 26px 4px; + -moz-border-bottom-left-radius: 26px 4px; + border-top-left-radius: 26px 4px; + border-bottom-left-radius: 26px 4px; + background-color: #FFFFFE; + background-image: -webkit-linear-gradient(0deg, #EDEAE8 0px, #FFFFFE 24px); + background-image: -moz-linear-gradient(0deg, #EDEAE8 0px, #FFFFFE 24px); + background-image: linear-gradient(90deg, #EDEAE8 0px, #FFFFFE 24px); +} + +div.monelem_sheaf { + left: 6%; + right: 8%; + top: 8%; + bottom: 8%; +} + + +/* Overriding magnifier button display */ + +div.monelem_controls_magnifier_button { + color: #632; + padding: 2%; + top: 1%; + right: 6%; +} + + +/* Overriding table of contents display */ + +div.monelem_controls_contents_container { + background: #E0D3C0; + border: 1px solid #EED; + font: 11pt Georgia, serif; + color: #432; + text-shadow: 1px 1px #FFF6E0; +} + +div.monelem_controls_contents_chapter { + border-bottom: 2px groove #FFF6E9; +} + +li.monelem_controls_contents_chapter_active { + text-shadow: -1px -1px #876; + background: #BA9; +} + + +/* Overriding the scrubber display */ +div.monelem_controls_scrubber_container { + left: 5.5%; + right: 9%; + bottom: 2%; + background: #FFFEFC; +} + +div.monelem_controls_scrubber_track { + border-color: #432; +} + +div.monelem_controls_scrubber_needle { + border-color: #432; + background: #E0D3C0; +} + +div.monelem_controls_scrubber_trail { + background: #E0D3C0; +} diff --git a/sources/styles/cops-monocle.js b/sources/styles/cops-monocle.js new file mode 100644 index 0000000..20af0f9 --- /dev/null +++ b/sources/styles/cops-monocle.js @@ -0,0 +1,184 @@ +/** global: Monocle */ +Monocle.DEBUG = true; + +(function () { + + /** global: Monocle */ + Monocle.Styles.container.right = "24px"; + + // Initialize the reader element. + /** global: Monocle */ + Monocle.Events.listen( + window, + 'load', + function () { + var readerOptions = {}; + + /* PLACE SAVER */ + var bkTitle = bookData.getMetaData('title'); + var placeSaver = new Monocle.Controls.PlaceSaver(bkTitle); + readerOptions.place = placeSaver.savedPlace(); + readerOptions.panels = Monocle.Panels.Marginal; + readerOptions.stylesheet = "body { " + + "color: #210;" + + "font-family: Palatino, Georgia, serif;" + + "}"; + + /* Initialize the reader */ + window.reader = Monocle.Reader( + 'reader', + bookData, + readerOptions, + function(reader) { + reader.addControl(placeSaver, 'invisible'); + + /* SPINNER */ + /** global: Monocle */ + var spinner = Monocle.Controls.Spinner(reader); + reader.addControl(spinner, 'page', { hidden: true }); + spinner.listenForUsualDelays('reader'); + + /* Because the 'reader' element changes size on window resize, + * we should notify it of this event. */ + /** global: Monocle */ + Monocle.Events.listen( + window, + 'resize', + function () { window.reader.resized() } + ); + + /** global: Monocle */ + Monocle.Events.listen(window.top.document, 'keyup', function(evt) { + var eventCharCode = evt.charCode || evt.keyCode; + var dir = null; + var flipper = reader.Flipper; + if (eventCharCode == 33 || eventCharCode == 37) { // Page down or Left arrow + dir = -1; + } else if (eventCharCode == 34 || eventCharCode == 39 ) { // Page down or Right arrow + dir = 1; + } + if (dir) { + reader.moveTo({ direction: dir }); + evt.preventDefault(); + } + }); + + /* MAGNIFIER CONTROL */ + /** global: Monocle */ + var magnifier = new Monocle.Controls.Magnifier(reader); + reader.addControl(magnifier, 'page'); + + /* BOOK TITLE RUNNING HEAD */ + var bookTitle = {} + /** global: Monocle */ + bookTitle.contentsMenu = Monocle.Controls.Contents(reader); + reader.addControl(bookTitle.contentsMenu, 'popover', { hidden: true }); + bookTitle.createControlElements = function () { + var cntr = document.createElement('div'); + cntr.className = "bookTitle"; + var runner = document.createElement('div'); + runner.className = "runner"; + runner.innerHTML = reader.getBook().getMetaData('title'); + cntr.appendChild(runner); + + /** global: Monocle */ + Monocle.Events.listenForContact( + cntr, + { + start: function (evt) { + if (evt.preventDefault) { + evt.stopPropagation(); + evt.preventDefault(); + } else { + evt.returnValue = false; + } + reader.showControl(bookTitle.contentsMenu); + } + } + ); + + return cntr; + } + reader.addControl(bookTitle, 'page'); + + + /* CHAPTER TITLE RUNNING HEAD */ + var chapterTitle = { + runners: [], + createControlElements: function (page) { + var cntr = document.createElement('div'); + cntr.className = "chapterTitle"; + var runner = document.createElement('div'); + runner.className = "runner"; + cntr.appendChild(runner); + this.runners.push(runner); + this.update(page); + return cntr; + }, + update: function (page) { + var place = reader.getPlace(page); + if (place) { + this.runners[page.m.pageIndex].innerHTML = place.chapterTitle(); + } + } + } + reader.addControl(chapterTitle, 'page'); + reader.listen( + 'monocle:pagechange', + function (evt) { chapterTitle.update(evt.m.page); } + ); + + + /* PAGE NUMBER RUNNING HEAD */ + var pageNumber = { + runners: [], + createControlElements: function (page) { + var cntr = document.createElement('div'); + cntr.className = "pageNumber"; + var runner = document.createElement('div'); + runner.className = "runner"; + cntr.appendChild(runner); + this.runners.push(runner); + this.update(page, page.m.place.pageNumber()); + return cntr; + }, + update: function (page, pageNumber) { + if (pageNumber) { + this.runners[page.m.pageIndex].innerHTML = pageNumber; + } + } + } + reader.addControl(pageNumber, 'page'); + reader.listen( + 'monocle:pagechange', + function (evt) { + pageNumber.update(evt.m.page, evt.m.pageNumber); + } + ); + + /* Scrubber */ + /** global: Monocle */ + var scrubber = new Monocle.Controls.Scrubber(reader); + reader.addControl(scrubber, 'popover', { hidden: true }); + var showFn = function (evt) { + evt.stopPropagation(); + reader.showControl(scrubber); + scrubber.updateNeedles(); + } + for (var i = 0; i < chapterTitle.runners.length; ++i) { + /** global: Monocle */ + Monocle.Events.listenForContact( + chapterTitle.runners[i].parentNode, + { start: showFn } + ); + /** global: Monocle */ + Monocle.Events.listenForContact( + pageNumber.runners[i].parentNode, + { start: showFn } + ); + } + } + ); + } + ); +})(); diff --git a/sources/templates/bootstrap/bookdetail.html b/sources/templates/bootstrap/bookdetail.html new file mode 100644 index 0000000..d445e23 --- /dev/null +++ b/sources/templates/bootstrap/bookdetail.html @@ -0,0 +1,74 @@ +
    + +
    +

    + {{=htmlspecialchars (it.title)}} +

    +

    {{=it.c.i18n.authorsTitle}}: + {{~it.book.authors:author:i}} + {{? i > 0}}, {{?}}{{=htmlspecialchars (author.name)}} + {{~}} +

    + {{? it.book.tagsName != ""}} +

    {{=it.c.i18n.tagsTitle}}: + {{~it.book.tags:tag:i}} + {{? i > 0}}, {{?}}{{=htmlspecialchars (tag.name)}} + {{~}} +

    + {{?}} + {{? it.book.seriesName != ""}} +

    {{=it.c.i18n.seriesTitle}} : {{=htmlspecialchars (it.book.seriesCompleteName)}}

    + {{?}} +
    +
    +
    + {{~it.book.datas:data:i}} + {{=data.format}} + {{? data.mail == 1}} + + + {{?}} + {{? data.readerUrl != ""}} + + + {{?}} + {{~}} +
    +
    +
    + +
    +
    + {{? it.book.publisherName != ""}} +

    +

    {{=it.c.i18n.publisherName}}:

    {{=htmlspecialchars (it.book.publisherName)}} +

    + {{?}} + {{? it.book.pubDate != ""}} +

    +

    {{=it.c.i18n.pubdateTitle}}:

    {{=it.book.pubDate}} +

    + {{?}} + {{? it.book.languagesName != ""}} +

    +

    {{=it.c.i18n.languagesTitle}}:

    {{=it.book.languagesName}} +

    + {{?}} + {{~it.book.customcolumns_preview :column:column_index}} +

    +

    {{=column.customColumnType.columnTitle}}:

    {{=column.htmlvalue}} +

    + {{~}} + {{? it.book.content != ""}} +
    +

    {{=it.c.i18n.contentTitle}}

    +
    {{=it.book.content}}
    + {{?}} +
    +
    diff --git a/sources/templates/bootstrap/file.html b/sources/templates/bootstrap/file.html new file mode 100644 index 0000000..f5fd68e --- /dev/null +++ b/sources/templates/bootstrap/file.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + {{=it.title}} + + + + +{{? it.server_side_rendering == 0}} + + + + + +{{?}} + + + + + + + + + + + + + + + + +{{? it.server_side_rendering == 0}} + +{{?}} + diff --git a/sources/templates/bootstrap/footer.html b/sources/templates/bootstrap/footer.html new file mode 100644 index 0000000..e69de29 diff --git a/sources/templates/bootstrap/header.html b/sources/templates/bootstrap/header.html new file mode 100644 index 0000000..31348e8 --- /dev/null +++ b/sources/templates/bootstrap/header.html @@ -0,0 +1,29 @@ + diff --git a/sources/templates/bootstrap/main.html b/sources/templates/bootstrap/main.html new file mode 100644 index 0000000..686f0f0 --- /dev/null +++ b/sources/templates/bootstrap/main.html @@ -0,0 +1,67 @@ +
    +{{? it.page == 13 || it.page == 16}} + {{? it.page == 13}} + {{#def.bookdetail}} + {{??}} + {{= it.fullhtml}} + {{?}} +{{??}} +
    +
      +
    +
    +
    +{{~it.entries:entry:i}} + {{? it.containsBook == 0}} +
    +
    + +
    + {{=entry.number}} +
    +
    +
    + {{??}} +
    +
    + +
    +
    + {{? entry.book.hasCover == 1}} + + {{=it.c.i18n.coverAlt}} + + {{?}} +
    +
    {{=htmlspecialchars (entry.book.authorsName)}}
    + {{? entry.book.tagsName != ""}}
    {{=htmlspecialchars (entry.book.tagsName)}}
    {{?}} + {{? entry.book.seriesName != ""}}
    {{=htmlspecialchars (entry.book.seriesName)}} ({{=entry.book.seriesIndex}})
    {{?}} + {{~entry.book.customcolumns_list :column:column_index}} +
    {{=column.customColumnType.columnTitle}} : {{=column.htmlvalue}}
    + {{~}} +
    + {{~entry.book.preferedData:data:j}} + {{=data.name}} + {{~}} +
    +
    +
    +
    + {{?}} +{{~}} +
    +{{?}} +{{? it.isPaginated == 1}} + +{{?}} +
    diff --git a/sources/templates/bootstrap/page.html b/sources/templates/bootstrap/page.html new file mode 100644 index 0000000..88139c8 --- /dev/null +++ b/sources/templates/bootstrap/page.html @@ -0,0 +1,3 @@ +{{#def.header}} +{{#def.main}} +{{#def.footer}} diff --git a/sources/templates/bootstrap/scripts/cops.js b/sources/templates/bootstrap/scripts/cops.js new file mode 100644 index 0000000..3383895 --- /dev/null +++ b/sources/templates/bootstrap/scripts/cops.js @@ -0,0 +1,4 @@ +function postRefresh() +{ + $('[data-toggle="tooltip"]').tooltip(); +} \ No newline at end of file diff --git a/sources/templates/bootstrap/styles/style-base.css b/sources/templates/bootstrap/styles/style-base.css new file mode 100644 index 0000000..4823668 --- /dev/null +++ b/sources/templates/bootstrap/styles/style-base.css @@ -0,0 +1,3 @@ +.panel-body { padding: 5px; } + +.bottomright {position:absolute; bottom:0; margin-bottom:25px; right: 20px;} \ No newline at end of file diff --git a/sources/templates/bootstrap/styles/style-default.css b/sources/templates/bootstrap/styles/style-default.css new file mode 100644 index 0000000..4823668 --- /dev/null +++ b/sources/templates/bootstrap/styles/style-default.css @@ -0,0 +1,3 @@ +.panel-body { padding: 5px; } + +.bottomright {position:absolute; bottom:0; margin-bottom:25px; right: 20px;} \ No newline at end of file diff --git a/sources/templates/bootstrap/suggestion.html b/sources/templates/bootstrap/suggestion.html new file mode 100644 index 0000000..1107dad --- /dev/null +++ b/sources/templates/bootstrap/suggestion.html @@ -0,0 +1 @@ +

    {{=it.title}}

    \ No newline at end of file diff --git a/sources/templates/default/bookdetail.html b/sources/templates/default/bookdetail.html new file mode 100644 index 0000000..84b32fb --- /dev/null +++ b/sources/templates/default/bookdetail.html @@ -0,0 +1,66 @@ +
    + + {{? it.book.hasCover == 1}} + + {{=it.c.i18n.coverAlt}} + + {{?}} + +

    + {{~it.book.datas:data:i}} + {{=data.format}} + {{? data.mail == 1}} + + {{?}} + {{? data.readerUrl != ""}} + + {{?}} +
    + {{~}} +

    +

    {{=htmlspecialchars (it.title)}}

    +

    +

    {{=it.c.i18n.authorsTitle}}:

    + {{~it.book.authors:author:i}} + {{? i > 0}}, {{?}}{{=htmlspecialchars (author.name)}} + {{~}} +

    + {{? it.book.tagsName != ""}} +

    +

    {{=it.c.i18n.tagsTitle}}:

    + {{~it.book.tags:tag:i}} + {{? i > 0}}, {{?}}{{=htmlspecialchars (tag.name)}} + {{~}} +

    + {{?}} + {{? it.book.seriesName != ""}} +

    +

    {{=it.c.i18n.seriesTitle}} :

    {{=htmlspecialchars (it.book.seriesCompleteName)}} +

    + {{?}} + {{? it.book.publisherName != ""}} +

    +

    {{=it.c.i18n.publisherName}}:

    {{=htmlspecialchars (it.book.publisherName)}} +

    + {{?}} + {{? it.book.pubDate != ""}} +

    +

    {{=it.c.i18n.pubdateTitle}}:

    {{=it.book.pubDate}} +

    + {{?}} + {{? it.book.languagesName != ""}} +

    +

    {{=it.c.i18n.languagesTitle}}:

    {{=it.book.languagesName}} +

    + {{?}} + {{~it.book.customcolumns_preview :column:column_index}} +

    +

    {{=column.customColumnType.columnTitle}}:

    {{=column.htmlvalue}} +

    + {{~}} + {{? it.book.content != ""}} +
    +

    {{=it.c.i18n.contentTitle}}

    +
    {{=it.book.content}}
    + {{?}} +
    diff --git a/sources/templates/default/file.html b/sources/templates/default/file.html new file mode 100644 index 0000000..efe440d --- /dev/null +++ b/sources/templates/default/file.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + {{=it.title}} + + + + +{{? it.server_side_rendering == 0}} + + + + + +{{?}} + + + + + + + + {{=it.customHeader}} + +{{? it.server_side_rendering == 0}} + +{{?}} + diff --git a/sources/templates/default/footer.html b/sources/templates/default/footer.html new file mode 100644 index 0000000..93ede6f --- /dev/null +++ b/sources/templates/default/footer.html @@ -0,0 +1,15 @@ +
    +
    +
    +
    +
    +
    +
    + {{? it.isPaginated == 1}} +
    + {{? it.prevLink != ""}}
    {{?}} +

    {{=it.currentPage}} / {{=it.maxPage}}

    + {{? it.nextLink != ""}}
    {{?}} +
    + {{?}} +
    \ No newline at end of file diff --git a/sources/templates/default/header.html b/sources/templates/default/header.html new file mode 100644 index 0000000..20be577 --- /dev/null +++ b/sources/templates/default/header.html @@ -0,0 +1,50 @@ +
    + +
    +
    + {{? it.c.config.server_side_rendering == 0}} +
    + {{?}} +
    +

    {{=it.title}}

    +
    +
    +
    +
    +
    + + {{? it.databaseId != ""}} + + {{?}} + +
    + +
    +
    + {{? it.c.config.server_side_rendering == 0}} + +
    +
      +
    +
    + {{?}} +
    +
    diff --git a/sources/templates/default/main.html b/sources/templates/default/main.html new file mode 100644 index 0000000..c6ed55c --- /dev/null +++ b/sources/templates/default/main.html @@ -0,0 +1,50 @@ +
    +{{? it.page == 13 || it.page == 16}} + {{? it.page == 13}} + {{#def.bookdetail}} + {{??}} + {{= it.fullhtml}} + {{?}} +{{??}} +{{~it.entries:entry:i}} + {{? it.containsBook == 0}} + + {{??}} +
    + + {{? entry.book.hasCover == 1}} + + {{=it.c.i18n.coverAlt}} + + {{?}} + +

    + {{~entry.book.preferedData:data:j}} + {{=data.name}}
    + {{~}} +

    + +
    +

    {{=htmlspecialchars (entry.title)}} + {{? entry.book.pubDate != ""}}({{=entry.book.pubDate}}){{?}} + {{? entry.book.rating != ""}}{{=entry.book.rating}}{{?}} +

    +

    {{=it.c.i18n.authorsTitle}} :

    {{=htmlspecialchars (entry.book.authorsName)}}
    + {{? entry.book.tagsName != ""}}

    {{=it.c.i18n.tagsTitle}} :

    {{=htmlspecialchars (entry.book.tagsName)}}
    {{?}} + {{? entry.book.seriesName != ""}}

    {{=it.c.i18n.seriesTitle}} :

    {{=htmlspecialchars (entry.book.seriesName)}} ({{=entry.book.seriesIndex}})
    {{?}} + {{~entry.book.customcolumns_list :column:column_index}} +

    {{=column.customColumnType.columnTitle}} :

    {{=column.htmlvalue}}
    + {{~}} +
    +
    + {{?}} +{{~}} +{{?}} +
    diff --git a/sources/templates/default/page.html b/sources/templates/default/page.html new file mode 100644 index 0000000..20f1e0a --- /dev/null +++ b/sources/templates/default/page.html @@ -0,0 +1,5 @@ +
    +{{#def.header}} +{{#def.main}} +{{#def.footer}} +
    \ No newline at end of file diff --git a/sources/templates/default/styles/FontAwesome.otf b/sources/templates/default/styles/FontAwesome.otf new file mode 100644 index 0000000..7012545 Binary files /dev/null and b/sources/templates/default/styles/FontAwesome.otf differ diff --git a/sources/templates/default/styles/font-awesome.css b/sources/templates/default/styles/font-awesome.css new file mode 100644 index 0000000..77d011a --- /dev/null +++ b/sources/templates/default/styles/font-awesome.css @@ -0,0 +1,1479 @@ +/*! + * Font Awesome 3.2.1 + * the iconic font designed for Bootstrap + * ------------------------------------------------------------------------------ + * The full suite of pictographic icons, examples, and documentation can be + * found at http://fontawesome.io. Stay up to date on Twitter at + * http://twitter.com/fontawesome. + * + * License + * ------------------------------------------------------------------------------ + * - The Font Awesome font is licensed under SIL OFL 1.1 - + * http://scripts.sil.org/OFL + * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License - + * http://opensource.org/licenses/mit-license.html + * - Font Awesome documentation licensed under CC BY 3.0 - + * http://creativecommons.org/licenses/by/3.0/ + * - Attribution is no longer required in Font Awesome 3.0, but much appreciated: + * "Font Awesome by Dave Gandy - http://fontawesome.io" + * + * Author - Dave Gandy + * ------------------------------------------------------------------------------ + * Email: dave@fontawesome.io + * Twitter: http://twitter.com/byscuits + * Work: Lead Product Designer @ Kyruus - http://kyruus.com + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('fontawesome-webfont.eot?v=3.2.1'); + src: url('fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'), url('fontawesome-webfont.woff?v=3.2.1') format('woff'), url('fontawesome-webfont.ttf?v=3.2.1') format('truetype'), url('fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg'); + font-weight: normal; + font-style: normal; +} +/* FONT AWESOME CORE + * -------------------------- */ +[class^="icon-"], +[class*=" icon-"] { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + text-decoration: inherit; + -webkit-font-smoothing: antialiased; + *margin-right: .3em; +} +[class^="icon-"]:before, +[class*=" icon-"]:before { + text-decoration: inherit; + display: inline-block; + speak: none; +} +/* makes the font 33% larger relative to the icon container */ +.icon-large:before { + vertical-align: -10%; + font-size: 1.3333333333333333em; +} +/* makes sure icons active on rollover in links */ +a [class^="icon-"], +a [class*=" icon-"] { + display: inline; +} +/* increased font size for icon-large */ +[class^="icon-"].icon-fixed-width, +[class*=" icon-"].icon-fixed-width { + display: inline-block; + width: 1.1428571428571428em; + text-align: right; + padding-right: 0.2857142857142857em; +} +[class^="icon-"].icon-fixed-width.icon-large, +[class*=" icon-"].icon-fixed-width.icon-large { + width: 1.4285714285714286em; +} +.icons-ul { + margin-left: 2.142857142857143em; + list-style-type: none; +} +.icons-ul > li { + position: relative; +} +.icons-ul .icon-li { + position: absolute; + left: -2.142857142857143em; + width: 2.142857142857143em; + text-align: center; + line-height: inherit; +} +[class^="icon-"].hide, +[class*=" icon-"].hide { + display: none; +} +.icon-muted { + color: #eeeeee; +} +.icon-light { + color: #ffffff; +} +.icon-dark { + color: #333333; +} +.icon-border { + border: solid 1px #eeeeee; + padding: .2em .25em .15em; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.icon-2x { + font-size: 2em; +} +.icon-2x.icon-border { + border-width: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.icon-3x { + font-size: 3em; +} +.icon-3x.icon-border { + border-width: 3px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.icon-4x { + font-size: 4em; +} +.icon-4x.icon-border { + border-width: 4px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.icon-5x { + font-size: 5em; +} +.icon-5x.icon-border { + border-width: 5px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + border-radius: 7px; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +[class^="icon-"].pull-left, +[class*=" icon-"].pull-left { + margin-right: .3em; +} +[class^="icon-"].pull-right, +[class*=" icon-"].pull-right { + margin-left: .3em; +} +/* BOOTSTRAP SPECIFIC CLASSES + * -------------------------- */ +/* Bootstrap 2.0 sprites.less reset */ +[class^="icon-"], +[class*=" icon-"] { + display: inline; + width: auto; + height: auto; + line-height: normal; + vertical-align: baseline; + background-image: none; + background-position: 0% 0%; + background-repeat: repeat; + margin-top: 0; +} +/* more sprites.less reset */ +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"] { + background-image: none; +} +/* keeps Bootstrap styles with and without icons the same */ +.btn [class^="icon-"].icon-large, +.nav [class^="icon-"].icon-large, +.btn [class*=" icon-"].icon-large, +.nav [class*=" icon-"].icon-large { + line-height: .9em; +} +.btn [class^="icon-"].icon-spin, +.nav [class^="icon-"].icon-spin, +.btn [class*=" icon-"].icon-spin, +.nav [class*=" icon-"].icon-spin { + display: inline-block; +} +.nav-tabs [class^="icon-"], +.nav-pills [class^="icon-"], +.nav-tabs [class*=" icon-"], +.nav-pills [class*=" icon-"], +.nav-tabs [class^="icon-"].icon-large, +.nav-pills [class^="icon-"].icon-large, +.nav-tabs [class*=" icon-"].icon-large, +.nav-pills [class*=" icon-"].icon-large { + line-height: .9em; +} +.btn [class^="icon-"].pull-left.icon-2x, +.btn [class*=" icon-"].pull-left.icon-2x, +.btn [class^="icon-"].pull-right.icon-2x, +.btn [class*=" icon-"].pull-right.icon-2x { + margin-top: .18em; +} +.btn [class^="icon-"].icon-spin.icon-large, +.btn [class*=" icon-"].icon-spin.icon-large { + line-height: .8em; +} +.btn.btn-small [class^="icon-"].pull-left.icon-2x, +.btn.btn-small [class*=" icon-"].pull-left.icon-2x, +.btn.btn-small [class^="icon-"].pull-right.icon-2x, +.btn.btn-small [class*=" icon-"].pull-right.icon-2x { + margin-top: .25em; +} +.btn.btn-large [class^="icon-"], +.btn.btn-large [class*=" icon-"] { + margin-top: 0; +} +.btn.btn-large [class^="icon-"].pull-left.icon-2x, +.btn.btn-large [class*=" icon-"].pull-left.icon-2x, +.btn.btn-large [class^="icon-"].pull-right.icon-2x, +.btn.btn-large [class*=" icon-"].pull-right.icon-2x { + margin-top: .05em; +} +.btn.btn-large [class^="icon-"].pull-left.icon-2x, +.btn.btn-large [class*=" icon-"].pull-left.icon-2x { + margin-right: .2em; +} +.btn.btn-large [class^="icon-"].pull-right.icon-2x, +.btn.btn-large [class*=" icon-"].pull-right.icon-2x { + margin-left: .2em; +} +/* Fixes alignment in nav lists */ +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + line-height: inherit; +} +/* EXTRAS + * -------------------------- */ +/* Stacked and layered icon */ +.icon-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: -35%; +} +.icon-stack [class^="icon-"], +.icon-stack [class*=" icon-"] { + display: block; + text-align: center; + position: absolute; + width: 100%; + height: 100%; + font-size: 1em; + line-height: inherit; + *line-height: 2em; +} +.icon-stack .icon-stack-base { + font-size: 2em; + *line-height: 1em; +} +/* Animated rotating icon */ +.icon-spin { + display: inline-block; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + -webkit-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +/* Prevent stack and spinners from being taken inline when inside a link */ +a .icon-stack, +a .icon-spin { + display: inline-block; + text-decoration: none; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +/* Icon rotations and mirroring */ +.icon-rotate-90:before { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); +} +.icon-rotate-180:before { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); +} +.icon-rotate-270:before { + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); +} +.icon-flip-horizontal:before { + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.icon-flip-vertical:before { + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +/* ensure rotation occurs inside anchor tags */ +a .icon-rotate-90:before, +a .icon-rotate-180:before, +a .icon-rotate-270:before, +a .icon-flip-horizontal:before, +a .icon-flip-vertical:before { + display: inline-block; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.icon-glass:before { + content: "\f000"; +} +.icon-music:before { + content: "\f001"; +} +.icon-search:before { + content: "\f002"; +} +.icon-envelope-alt:before { + content: "\f003"; +} +.icon-heart:before { + content: "\f004"; +} +.icon-star:before { + content: "\f005"; +} +.icon-star-empty:before { + content: "\f006"; +} +.icon-user:before { + content: "\f007"; +} +.icon-film:before { + content: "\f008"; +} +.icon-th-large:before { + content: "\f009"; +} +.icon-th:before { + content: "\f00a"; +} +.icon-th-list:before { + content: "\f00b"; +} +.icon-ok:before { + content: "\f00c"; +} +.icon-remove:before { + content: "\f00d"; +} +.icon-zoom-in:before { + content: "\f00e"; +} +.icon-zoom-out:before { + content: "\f010"; +} +.icon-power-off:before, +.icon-off:before { + content: "\f011"; +} +.icon-signal:before { + content: "\f012"; +} +.icon-gear:before, +.icon-cog:before { + content: "\f013"; +} +.icon-trash:before { + content: "\f014"; +} +.icon-home:before { + content: "\f015"; +} +.icon-file-alt:before { + content: "\f016"; +} +.icon-time:before { + content: "\f017"; +} +.icon-road:before { + content: "\f018"; +} +.icon-download-alt:before { + content: "\f019"; +} +.icon-download:before { + content: "\f01a"; +} +.icon-upload:before { + content: "\f01b"; +} +.icon-inbox:before { + content: "\f01c"; +} +.icon-play-circle:before { + content: "\f01d"; +} +.icon-rotate-right:before, +.icon-repeat:before { + content: "\f01e"; +} +.icon-refresh:before { + content: "\f021"; +} +.icon-list-alt:before { + content: "\f022"; +} +.icon-lock:before { + content: "\f023"; +} +.icon-flag:before { + content: "\f024"; +} +.icon-headphones:before { + content: "\f025"; +} +.icon-volume-off:before { + content: "\f026"; +} +.icon-volume-down:before { + content: "\f027"; +} +.icon-volume-up:before { + content: "\f028"; +} +.icon-qrcode:before { + content: "\f029"; +} +.icon-barcode:before { + content: "\f02a"; +} +.icon-tag:before { + content: "\f02b"; +} +.icon-tags:before { + content: "\f02c"; +} +.icon-book:before { + content: "\f02d"; +} +.icon-bookmark:before { + content: "\f02e"; +} +.icon-print:before { + content: "\f02f"; +} +.icon-camera:before { + content: "\f030"; +} +.icon-font:before { + content: "\f031"; +} +.icon-bold:before { + content: "\f032"; +} +.icon-italic:before { + content: "\f033"; +} +.icon-text-height:before { + content: "\f034"; +} +.icon-text-width:before { + content: "\f035"; +} +.icon-align-left:before { + content: "\f036"; +} +.icon-align-center:before { + content: "\f037"; +} +.icon-align-right:before { + content: "\f038"; +} +.icon-align-justify:before { + content: "\f039"; +} +.icon-list:before { + content: "\f03a"; +} +.icon-indent-left:before { + content: "\f03b"; +} +.icon-indent-right:before { + content: "\f03c"; +} +.icon-facetime-video:before { + content: "\f03d"; +} +.icon-picture:before { + content: "\f03e"; +} +.icon-pencil:before { + content: "\f040"; +} +.icon-map-marker:before { + content: "\f041"; +} +.icon-adjust:before { + content: "\f042"; +} +.icon-tint:before { + content: "\f043"; +} +.icon-edit:before { + content: "\f044"; +} +.icon-share:before { + content: "\f045"; +} +.icon-check:before { + content: "\f046"; +} +.icon-move:before { + content: "\f047"; +} +.icon-step-backward:before { + content: "\f048"; +} +.icon-fast-backward:before { + content: "\f049"; +} +.icon-backward:before { + content: "\f04a"; +} +.icon-play:before { + content: "\f04b"; +} +.icon-pause:before { + content: "\f04c"; +} +.icon-stop:before { + content: "\f04d"; +} +.icon-forward:before { + content: "\f04e"; +} +.icon-fast-forward:before { + content: "\f050"; +} +.icon-step-forward:before { + content: "\f051"; +} +.icon-eject:before { + content: "\f052"; +} +.icon-chevron-left:before { + content: "\f053"; +} +.icon-chevron-right:before { + content: "\f054"; +} +.icon-plus-sign:before { + content: "\f055"; +} +.icon-minus-sign:before { + content: "\f056"; +} +.icon-remove-sign:before { + content: "\f057"; +} +.icon-ok-sign:before { + content: "\f058"; +} +.icon-question-sign:before { + content: "\f059"; +} +.icon-info-sign:before { + content: "\f05a"; +} +.icon-screenshot:before { + content: "\f05b"; +} +.icon-remove-circle:before { + content: "\f05c"; +} +.icon-ok-circle:before { + content: "\f05d"; +} +.icon-ban-circle:before { + content: "\f05e"; +} +.icon-arrow-left:before { + content: "\f060"; +} +.icon-arrow-right:before { + content: "\f061"; +} +.icon-arrow-up:before { + content: "\f062"; +} +.icon-arrow-down:before { + content: "\f063"; +} +.icon-mail-forward:before, +.icon-share-alt:before { + content: "\f064"; +} +.icon-resize-full:before { + content: "\f065"; +} +.icon-resize-small:before { + content: "\f066"; +} +.icon-plus:before { + content: "\f067"; +} +.icon-minus:before { + content: "\f068"; +} +.icon-asterisk:before { + content: "\f069"; +} +.icon-exclamation-sign:before { + content: "\f06a"; +} +.icon-gift:before { + content: "\f06b"; +} +.icon-leaf:before { + content: "\f06c"; +} +.icon-fire:before { + content: "\f06d"; +} +.icon-eye-open:before { + content: "\f06e"; +} +.icon-eye-close:before { + content: "\f070"; +} +.icon-warning-sign:before { + content: "\f071"; +} +.icon-plane:before { + content: "\f072"; +} +.icon-calendar:before { + content: "\f073"; +} +.icon-random:before { + content: "\f074"; +} +.icon-comment:before { + content: "\f075"; +} +.icon-magnet:before { + content: "\f076"; +} +.icon-chevron-up:before { + content: "\f077"; +} +.icon-chevron-down:before { + content: "\f078"; +} +.icon-retweet:before { + content: "\f079"; +} +.icon-shopping-cart:before { + content: "\f07a"; +} +.icon-folder-close:before { + content: "\f07b"; +} +.icon-folder-open:before { + content: "\f07c"; +} +.icon-resize-vertical:before { + content: "\f07d"; +} +.icon-resize-horizontal:before { + content: "\f07e"; +} +.icon-bar-chart:before { + content: "\f080"; +} +.icon-twitter-sign:before { + content: "\f081"; +} +.icon-facebook-sign:before { + content: "\f082"; +} +.icon-camera-retro:before { + content: "\f083"; +} +.icon-key:before { + content: "\f084"; +} +.icon-gears:before, +.icon-cogs:before { + content: "\f085"; +} +.icon-comments:before { + content: "\f086"; +} +.icon-thumbs-up-alt:before { + content: "\f087"; +} +.icon-thumbs-down-alt:before { + content: "\f088"; +} +.icon-star-half:before { + content: "\f089"; +} +.icon-heart-empty:before { + content: "\f08a"; +} +.icon-signout:before { + content: "\f08b"; +} +.icon-linkedin-sign:before { + content: "\f08c"; +} +.icon-pushpin:before { + content: "\f08d"; +} +.icon-external-link:before { + content: "\f08e"; +} +.icon-signin:before { + content: "\f090"; +} +.icon-trophy:before { + content: "\f091"; +} +.icon-github-sign:before { + content: "\f092"; +} +.icon-upload-alt:before { + content: "\f093"; +} +.icon-lemon:before { + content: "\f094"; +} +.icon-phone:before { + content: "\f095"; +} +.icon-unchecked:before, +.icon-check-empty:before { + content: "\f096"; +} +.icon-bookmark-empty:before { + content: "\f097"; +} +.icon-phone-sign:before { + content: "\f098"; +} +.icon-twitter:before { + content: "\f099"; +} +.icon-facebook:before { + content: "\f09a"; +} +.icon-github:before { + content: "\f09b"; +} +.icon-unlock:before { + content: "\f09c"; +} +.icon-credit-card:before { + content: "\f09d"; +} +.icon-rss:before { + content: "\f09e"; +} +.icon-hdd:before { + content: "\f0a0"; +} +.icon-bullhorn:before { + content: "\f0a1"; +} +.icon-bell:before { + content: "\f0a2"; +} +.icon-certificate:before { + content: "\f0a3"; +} +.icon-hand-right:before { + content: "\f0a4"; +} +.icon-hand-left:before { + content: "\f0a5"; +} +.icon-hand-up:before { + content: "\f0a6"; +} +.icon-hand-down:before { + content: "\f0a7"; +} +.icon-circle-arrow-left:before { + content: "\f0a8"; +} +.icon-circle-arrow-right:before { + content: "\f0a9"; +} +.icon-circle-arrow-up:before { + content: "\f0aa"; +} +.icon-circle-arrow-down:before { + content: "\f0ab"; +} +.icon-globe:before { + content: "\f0ac"; +} +.icon-wrench:before { + content: "\f0ad"; +} +.icon-tasks:before { + content: "\f0ae"; +} +.icon-filter:before { + content: "\f0b0"; +} +.icon-briefcase:before { + content: "\f0b1"; +} +.icon-fullscreen:before { + content: "\f0b2"; +} +.icon-group:before { + content: "\f0c0"; +} +.icon-link:before { + content: "\f0c1"; +} +.icon-cloud:before { + content: "\f0c2"; +} +.icon-beaker:before { + content: "\f0c3"; +} +.icon-cut:before { + content: "\f0c4"; +} +.icon-copy:before { + content: "\f0c5"; +} +.icon-paperclip:before, +.icon-paper-clip:before { + content: "\f0c6"; +} +.icon-save:before { + content: "\f0c7"; +} +.icon-sign-blank:before { + content: "\f0c8"; +} +.icon-reorder:before { + content: "\f0c9"; +} +.icon-list-ul:before { + content: "\f0ca"; +} +.icon-list-ol:before { + content: "\f0cb"; +} +.icon-strikethrough:before { + content: "\f0cc"; +} +.icon-underline:before { + content: "\f0cd"; +} +.icon-table:before { + content: "\f0ce"; +} +.icon-magic:before { + content: "\f0d0"; +} +.icon-truck:before { + content: "\f0d1"; +} +.icon-pinterest:before { + content: "\f0d2"; +} +.icon-pinterest-sign:before { + content: "\f0d3"; +} +.icon-google-plus-sign:before { + content: "\f0d4"; +} +.icon-google-plus:before { + content: "\f0d5"; +} +.icon-money:before { + content: "\f0d6"; +} +.icon-caret-down:before { + content: "\f0d7"; +} +.icon-caret-up:before { + content: "\f0d8"; +} +.icon-caret-left:before { + content: "\f0d9"; +} +.icon-caret-right:before { + content: "\f0da"; +} +.icon-columns:before { + content: "\f0db"; +} +.icon-sort:before { + content: "\f0dc"; +} +.icon-sort-down:before { + content: "\f0dd"; +} +.icon-sort-up:before { + content: "\f0de"; +} +.icon-envelope:before { + content: "\f0e0"; +} +.icon-linkedin:before { + content: "\f0e1"; +} +.icon-rotate-left:before, +.icon-undo:before { + content: "\f0e2"; +} +.icon-legal:before { + content: "\f0e3"; +} +.icon-dashboard:before { + content: "\f0e4"; +} +.icon-comment-alt:before { + content: "\f0e5"; +} +.icon-comments-alt:before { + content: "\f0e6"; +} +.icon-bolt:before { + content: "\f0e7"; +} +.icon-sitemap:before { + content: "\f0e8"; +} +.icon-umbrella:before { + content: "\f0e9"; +} +.icon-paste:before { + content: "\f0ea"; +} +.icon-lightbulb:before { + content: "\f0eb"; +} +.icon-exchange:before { + content: "\f0ec"; +} +.icon-cloud-download:before { + content: "\f0ed"; +} +.icon-cloud-upload:before { + content: "\f0ee"; +} +.icon-user-md:before { + content: "\f0f0"; +} +.icon-stethoscope:before { + content: "\f0f1"; +} +.icon-suitcase:before { + content: "\f0f2"; +} +.icon-bell-alt:before { + content: "\f0f3"; +} +.icon-coffee:before { + content: "\f0f4"; +} +.icon-food:before { + content: "\f0f5"; +} +.icon-file-text-alt:before { + content: "\f0f6"; +} +.icon-building:before { + content: "\f0f7"; +} +.icon-hospital:before { + content: "\f0f8"; +} +.icon-ambulance:before { + content: "\f0f9"; +} +.icon-medkit:before { + content: "\f0fa"; +} +.icon-fighter-jet:before { + content: "\f0fb"; +} +.icon-beer:before { + content: "\f0fc"; +} +.icon-h-sign:before { + content: "\f0fd"; +} +.icon-plus-sign-alt:before { + content: "\f0fe"; +} +.icon-double-angle-left:before { + content: "\f100"; +} +.icon-double-angle-right:before { + content: "\f101"; +} +.icon-double-angle-up:before { + content: "\f102"; +} +.icon-double-angle-down:before { + content: "\f103"; +} +.icon-angle-left:before { + content: "\f104"; +} +.icon-angle-right:before { + content: "\f105"; +} +.icon-angle-up:before { + content: "\f106"; +} +.icon-angle-down:before { + content: "\f107"; +} +.icon-desktop:before { + content: "\f108"; +} +.icon-laptop:before { + content: "\f109"; +} +.icon-tablet:before { + content: "\f10a"; +} +.icon-mobile-phone:before { + content: "\f10b"; +} +.icon-circle-blank:before { + content: "\f10c"; +} +.icon-quote-left:before { + content: "\f10d"; +} +.icon-quote-right:before { + content: "\f10e"; +} +.icon-spinner:before { + content: "\f110"; +} +.icon-circle:before { + content: "\f111"; +} +.icon-mail-reply:before, +.icon-reply:before { + content: "\f112"; +} +.icon-github-alt:before { + content: "\f113"; +} +.icon-folder-close-alt:before { + content: "\f114"; +} +.icon-folder-open-alt:before { + content: "\f115"; +} +.icon-expand-alt:before { + content: "\f116"; +} +.icon-collapse-alt:before { + content: "\f117"; +} +.icon-smile:before { + content: "\f118"; +} +.icon-frown:before { + content: "\f119"; +} +.icon-meh:before { + content: "\f11a"; +} +.icon-gamepad:before { + content: "\f11b"; +} +.icon-keyboard:before { + content: "\f11c"; +} +.icon-flag-alt:before { + content: "\f11d"; +} +.icon-flag-checkered:before { + content: "\f11e"; +} +.icon-terminal:before { + content: "\f120"; +} +.icon-code:before { + content: "\f121"; +} +.icon-reply-all:before { + content: "\f122"; +} +.icon-mail-reply-all:before { + content: "\f122"; +} +.icon-star-half-full:before, +.icon-star-half-empty:before { + content: "\f123"; +} +.icon-location-arrow:before { + content: "\f124"; +} +.icon-crop:before { + content: "\f125"; +} +.icon-code-fork:before { + content: "\f126"; +} +.icon-unlink:before { + content: "\f127"; +} +.icon-question:before { + content: "\f128"; +} +.icon-info:before { + content: "\f129"; +} +.icon-exclamation:before { + content: "\f12a"; +} +.icon-superscript:before { + content: "\f12b"; +} +.icon-subscript:before { + content: "\f12c"; +} +.icon-eraser:before { + content: "\f12d"; +} +.icon-puzzle-piece:before { + content: "\f12e"; +} +.icon-microphone:before { + content: "\f130"; +} +.icon-microphone-off:before { + content: "\f131"; +} +.icon-shield:before { + content: "\f132"; +} +.icon-calendar-empty:before { + content: "\f133"; +} +.icon-fire-extinguisher:before { + content: "\f134"; +} +.icon-rocket:before { + content: "\f135"; +} +.icon-maxcdn:before { + content: "\f136"; +} +.icon-chevron-sign-left:before { + content: "\f137"; +} +.icon-chevron-sign-right:before { + content: "\f138"; +} +.icon-chevron-sign-up:before { + content: "\f139"; +} +.icon-chevron-sign-down:before { + content: "\f13a"; +} +.icon-html5:before { + content: "\f13b"; +} +.icon-css3:before { + content: "\f13c"; +} +.icon-anchor:before { + content: "\f13d"; +} +.icon-unlock-alt:before { + content: "\f13e"; +} +.icon-bullseye:before { + content: "\f140"; +} +.icon-ellipsis-horizontal:before { + content: "\f141"; +} +.icon-ellipsis-vertical:before { + content: "\f142"; +} +.icon-rss-sign:before { + content: "\f143"; +} +.icon-play-sign:before { + content: "\f144"; +} +.icon-ticket:before { + content: "\f145"; +} +.icon-minus-sign-alt:before { + content: "\f146"; +} +.icon-check-minus:before { + content: "\f147"; +} +.icon-level-up:before { + content: "\f148"; +} +.icon-level-down:before { + content: "\f149"; +} +.icon-check-sign:before { + content: "\f14a"; +} +.icon-edit-sign:before { + content: "\f14b"; +} +.icon-external-link-sign:before { + content: "\f14c"; +} +.icon-share-sign:before { + content: "\f14d"; +} +.icon-compass:before { + content: "\f14e"; +} +.icon-collapse:before { + content: "\f150"; +} +.icon-collapse-top:before { + content: "\f151"; +} +.icon-expand:before { + content: "\f152"; +} +.icon-euro:before, +.icon-eur:before { + content: "\f153"; +} +.icon-gbp:before { + content: "\f154"; +} +.icon-dollar:before, +.icon-usd:before { + content: "\f155"; +} +.icon-rupee:before, +.icon-inr:before { + content: "\f156"; +} +.icon-yen:before, +.icon-jpy:before { + content: "\f157"; +} +.icon-renminbi:before, +.icon-cny:before { + content: "\f158"; +} +.icon-won:before, +.icon-krw:before { + content: "\f159"; +} +.icon-bitcoin:before, +.icon-btc:before { + content: "\f15a"; +} +.icon-file:before { + content: "\f15b"; +} +.icon-file-text:before { + content: "\f15c"; +} +.icon-sort-by-alphabet:before { + content: "\f15d"; +} +.icon-sort-by-alphabet-alt:before { + content: "\f15e"; +} +.icon-sort-by-attributes:before { + content: "\f160"; +} +.icon-sort-by-attributes-alt:before { + content: "\f161"; +} +.icon-sort-by-order:before { + content: "\f162"; +} +.icon-sort-by-order-alt:before { + content: "\f163"; +} +.icon-thumbs-up:before { + content: "\f164"; +} +.icon-thumbs-down:before { + content: "\f165"; +} +.icon-youtube-sign:before { + content: "\f166"; +} +.icon-youtube:before { + content: "\f167"; +} +.icon-xing:before { + content: "\f168"; +} +.icon-xing-sign:before { + content: "\f169"; +} +.icon-youtube-play:before { + content: "\f16a"; +} +.icon-dropbox:before { + content: "\f16b"; +} +.icon-stackexchange:before { + content: "\f16c"; +} +.icon-instagram:before { + content: "\f16d"; +} +.icon-flickr:before { + content: "\f16e"; +} +.icon-adn:before { + content: "\f170"; +} +.icon-bitbucket:before { + content: "\f171"; +} +.icon-bitbucket-sign:before { + content: "\f172"; +} +.icon-tumblr:before { + content: "\f173"; +} +.icon-tumblr-sign:before { + content: "\f174"; +} +.icon-long-arrow-down:before { + content: "\f175"; +} +.icon-long-arrow-up:before { + content: "\f176"; +} +.icon-long-arrow-left:before { + content: "\f177"; +} +.icon-long-arrow-right:before { + content: "\f178"; +} +.icon-apple:before { + content: "\f179"; +} +.icon-windows:before { + content: "\f17a"; +} +.icon-android:before { + content: "\f17b"; +} +.icon-linux:before { + content: "\f17c"; +} +.icon-dribbble:before { + content: "\f17d"; +} +.icon-skype:before { + content: "\f17e"; +} +.icon-foursquare:before { + content: "\f180"; +} +.icon-trello:before { + content: "\f181"; +} +.icon-female:before { + content: "\f182"; +} +.icon-male:before { + content: "\f183"; +} +.icon-gittip:before { + content: "\f184"; +} +.icon-sun:before { + content: "\f185"; +} +.icon-moon:before { + content: "\f186"; +} +.icon-archive:before { + content: "\f187"; +} +.icon-bug:before { + content: "\f188"; +} +.icon-vk:before { + content: "\f189"; +} +.icon-weibo:before { + content: "\f18a"; +} +.icon-renren:before { + content: "\f18b"; +} diff --git a/sources/templates/default/styles/fontawesome-webfont.eot b/sources/templates/default/styles/fontawesome-webfont.eot new file mode 100644 index 0000000..0662cb9 Binary files /dev/null and b/sources/templates/default/styles/fontawesome-webfont.eot differ diff --git a/sources/templates/default/styles/fontawesome-webfont.svg b/sources/templates/default/styles/fontawesome-webfont.svg new file mode 100644 index 0000000..2edb4ec --- /dev/null +++ b/sources/templates/default/styles/fontawesome-webfont.svg @@ -0,0 +1,399 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/sources/templates/default/styles/fontawesome-webfont.ttf b/sources/templates/default/styles/fontawesome-webfont.ttf new file mode 100644 index 0000000..d365924 Binary files /dev/null and b/sources/templates/default/styles/fontawesome-webfont.ttf differ diff --git a/sources/templates/default/styles/fontawesome-webfont.woff b/sources/templates/default/styles/fontawesome-webfont.woff new file mode 100644 index 0000000..b9bd17e Binary files /dev/null and b/sources/templates/default/styles/fontawesome-webfont.woff differ diff --git a/sources/templates/default/styles/style-base.css b/sources/templates/default/styles/style-base.css new file mode 100644 index 0000000..5395e92 --- /dev/null +++ b/sources/templates/default/styles/style-base.css @@ -0,0 +1,436 @@ +/* Global Box Sizing and Font-Smoothing */ +*, *:after, *:before { + box-sizing:border-box; + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + -webkit-font-smoothing:antialiased; + -moz-font-smoothing:antialiased; + -o-font-smoothing:antialiased; + font-smoothing:antialiased; +} + +html { font-size: 100%; -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; } + +body { + font-family: "Century Gothic", CenturyGothic, Geneva, AppleGothic, sans-serif; + line-height:18px; + color: #1c1c1c; /* Lighter on the eyes than #000 Black */ + margin: 0px; background: #cccccc; background-size: cover; +} + +img { + border: 0px; + max-width: 100%; + height: auto; + width: auto\9; /* ie8 */ +} + +/* ========================================================================== + Typography stuff goes here + ========================================================================== */ +h1,h2,h3,h4,h5,h6 { font-weight: bold; margin:0; padding:0;} +/*h1 see mediaqueries*/ +h2 {font-size: 1.2em;} +h3 {font-size: 1.1em;} +h4 {font-size: 1.0em; } +h5 {font-size: 0.83em;} +h6 {font-size: 0.75em;} + +a:hover, a:focus, a:active { outline: none; } +a { color: #000066; font-weight: 800; text-decoration: none;} +a:hover { color:#000; text-decoration: none; } +.frontpage a {display:block; } +.frontpage a:hover { width: 100%; background-color: #778899;} +.books:hover { width: 100%; background-color: #778899; } +.link a:hover { display:inline-block; width: 100%; background-color: #778899; /*Dirty IE Hack*/ zoom: 1; *display: inline;} + +.mfp-content .bookpopup { + position: relative; + background: #FFF; + padding: 20px; + width: auto; + max-width: 700px; + margin: 20px auto; + min-height: 198px; +} + +#email { +width: 300px; +} + +.filtered { +display: none; +} + +#filter { +clear:both; +} + +#filter ul { +margin: 0; +padding: 0; +list-style-type: none; +text-align: left; +text-transform:none; +} + +#filter ul li { +cursor: pointer; +} + +li { +display: inline-block; +padding: .2em 1em; +margin: 2px; +color: black; +background-color: white; +opacity: 0.5; +} + +.filter-include { + border-left:thick solid blue; + opacity: 1; +} + +.filter-include:after { + content: " \2713"; /* Tick mark */ +} + +.filter-exclude { + border-right:thick solid red; + opacity: 1; +} + +.filter-exclude:after { + content: " \2717"; /* Check mark */ +} + +img +{ +margin:0; +padding:0; +border:0; +} + +/* ============================================================================= + Main container stuff goes here and other globals + ========================================================================== */ +.container{ + background: #414141; border:1px solid #000; + max-width:800px;width:95%;margin:0 auto;position:relative; } + +/* ============================================================================= + Header stuff goes here + ========================================================================== */ +header { + clear:both; + color:white; + text-align:center; + text-transform:uppercase; + display:block; + min-height:70px; +} + +.hicon{ + display:inline-block; + color:lightgray; + text-align: center; + margin: 0 2px; +} + +.submit { + color: lightgray; + cursor: pointer; + background-color: transparent; + background-image: none; + border-color: transparent; + display: table-cell; +} + +.hicon64{ + font-size: 64px; + line-height: 64px; + width: 64px; + height: 64px; +} + +.hicon32{ + width: 32px; + height: 32px; +} + +.headleft { + float: left; +} + +.headcenter +{ +float:none; +margin:auto; +text-align:center; +height:70px; +display:table; +} + +header h1{ + display: table-cell; + vertical-align: middle; + text-align: center; + line-height: 100%; +} + +.headright { + float: right; + /*for ios compatibility*/ + cursor: pointer; +} + +/* ============================================================================= + Section and Article stuff goes here + ========================================================================== */ +section { +clear:both; +background-color: #fff; +} + +article { +border-bottom: 1px solid black; +max-width:800px; +} + +/*-------------frontpage article-------------*/ + +.frontpage h2 { + padding: 5px 0 0 5px; +} + +.frontpage h4 { + padding: 5px 0 5px 20px; + font-style: italic; +} + +/*-------------books article-------------*/ +.books { + clear: both; + min-height: 90px; + position: relative; +} + +.books .cover { + float:left; + margin: 4px 10px 4px 4px; + width: 60px; + height: 82px; + position: absolute; +} + +.books .fancydetail .fullclickpopup { + margin: 4px 0px 4px 75px; +} + +.bookpopup .cover { + float:left; + margin: 4px 10px 4px 4px; + width: 100px; + height: 150px; +} + +.cover img { + max-width:100%; + max-height:100%; + color: white; +} + +.download { + float: right; + line-height:40px; + text-align: right; + margin: 6px; +} + +.download a { + background: darkgray; + color: #EEE; + text-decoration : none; + font-weight: bold; + padding: 5px 10px 5px 10px; + text-align: center; +} + +.download img { + vertical-align:middle; +} + +.books h4{ + display: inline; + font-style: italic; +} + +/*-------------books popup article-------------*/ +.bookpopup h2{ + margin: 15px 15px; +} + +.bookpopup h3{ + display:inline; /*Dirty IE Hack*/ zoom: 1; *display: inline; +} + +.bookpopup h4{ + border-top: 1px solid black; +} + +.fullclickpopup{ + display: block; +} + +section .bookpopup{ + padding: 8px 8px; + min-height: 175px; +} + +/* ============================================================================= + Footer stuff goes here + ========================================================================== */ +footer +{ +clear:both; +color:white; +height:32px; +} + +.footleft +{ +float:left; +height:32px; +} + + +.footright +{ +float:right; +height:32px; +} + +.footcenter +{ +margin:auto; +text-align:center; +height:32px; +display:table; +font-weight: bold; +} + +.footcenter p, .footcenter a +{ +display: table-cell; +vertical-align: middle; +text-align: center; +line-height: 100%; +} + +/* ============================================================================= + Aside stuff goes here + ========================================================================== */ +#tool +{ +width:100%; +} + + +/*-------------Search Aside-------------*/ +#tool input[type=text], .twitter-typeahead +{ +vertical-align: middle; +width: 100%; +color: black; +background-color: white; +} + +.tt-hint, .tt-query { + width: 100%; + } + +.stop select +{ +vertical-align: middle; +margin: 4px; +color: black; +} + +#sort +{ +cursor:pointer; +} + +#searchForm { +display: table; +padding: 0 2px; +} + +.stop +{ +display: table-cell; +vertical-align: middle; +width: 100%; +} + +.tt-dropdown-menu { + width: 322px; + text-align: left; + margin-top: 6px; + color: #000066; + padding: 4px 0; + background-color: #fff; + border: 1px solid #ccc; +} + +.tt-header { + border-bottom: 1px solid #CCCCCC; + font-weight: bold; +} + +.tt-suggestion { + padding: 3px 20px; + line-height: 14px; +} + +.tt-suggestion.tt-cursor { + color: #1c1c1c; + background-color: #778899; +} + +.tt-suggestion p { + margin: 0; +} + +/* ============================================================================= + Mediaquerie stuff goes here + ========================================================================== */ +/* 100px and greater */ +@media only screen and (min-width: 100px) { +h1 {font-size: 1em;} +.container { width:100%; } +} + +/* 320px and greater */ +@media only screen and (min-width: 320px) { +h1 {font-size: 1.2em;} +} + +/* 480px and greater */ +@media only screen and (min-width: 480px) { +h1 {font-size: 1.5em;} +body { font-size: 1em;/*12px/16px */ + font-weight:450; /* Better supported than 'lighter' attribute */ + } +} + +/* 768px and greater */ +@media only screen and (min-width: 768px) { +h1 {font-size: 2em; line-height: 1em;} +body { margin: 5px; + font-size: 0.85em;/*12px/16px */ + font-weight:400; /* Better supported than 'lighter' attribute */ + } +} diff --git a/sources/templates/default/styles/style-default.css b/sources/templates/default/styles/style-default.css new file mode 100644 index 0000000..a297ea9 --- /dev/null +++ b/sources/templates/default/styles/style-default.css @@ -0,0 +1,58 @@ +@import url("style-base.css"); + + +/* ============================================================================= + Main container stuff goes here and other globals + ========================================================================== */ +.container { +border-radius:10px; +} + +/* ============================================================================= + Header stuff goes here + ========================================================================== */ +header { + box-shadow:inset 0px -5px 8px #000000; + border-radius: 10px 10px 0px 0px; +} + +.hicon{ + text-shadow: 2px 2px 2px black; +} + +.submit { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +header h1{ + display: table-cell; + vertical-align: middle; + text-align: center; + line-height: 100%; +} + +.download a { + border-radius: 6px; + box-shadow:0 0 10px #000; + background: radial-gradient(#666, black); +} + +footer +{ +box-shadow:inset 0px 5px 8px #000000; +border-radius: 0px 0px 10px 10px; +} + + +/* ============================================================================= + Mediaquerie stuff goes here + ========================================================================== */ +/* 768px and greater */ +@media only screen and (min-width: 768px) { +.container { box-shadow:0 0 20px #000; } +} \ No newline at end of file diff --git a/sources/templates/default/styles/style-eink.css b/sources/templates/default/styles/style-eink.css new file mode 100644 index 0000000..2cc0b53 --- /dev/null +++ b/sources/templates/default/styles/style-eink.css @@ -0,0 +1,63 @@ +@import url("style-base.css"); + +a { + color: black; + font-weight: bold; +} +.frontpage a:hover, .books:hover { background-color: white;} + +#filter ul { +font-variant: normal; +} + +li, .container { +background-color: white; +} + +header { + color: black; + text-transform: none; + border-bottom: 2px dashed gray; + font-variant: small-caps; + letter-spacing: 2px; +} + +#tool input[type=text], .twitter-typeahead +{ + font-variant: normal; +} + +.hicon, .footcenter, .submit, .fullclickpopup{ + color:black; +} + +.frontpage h2 { + text-align: center; + letter-spacing: 2px; + color: black; + font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif; +} + +.frontpage h4 { + padding: 5px 0; + text-align: center; + color: gray; + font-size: 13px; + text-decoration: overline; + } + +.download a { + background: black; + color: white; +} + + +.tt-dropdown-menu { + color: black; + background-color: white; + border: 1px solid #ccc; +} +.tt-suggestion.tt-is-under-cursor { + color: black; + background-color: white; +} \ No newline at end of file diff --git a/sources/templates/default/styles/style-iphone.css b/sources/templates/default/styles/style-iphone.css new file mode 100644 index 0000000..6e2f681 --- /dev/null +++ b/sources/templates/default/styles/style-iphone.css @@ -0,0 +1,116 @@ +@import url("style-base.css"); +/* ============================================================================= + Main container goes here and other globals + ========================================================================== */ + +.st, .sp, .sa, .se, .ss { + font: normal normal 400 14px Helvetica Neue Interface, Helvetica Neue, Helvetica; + color: #007aff; } + +.st { + font-weight: 600; } + +.frontpage a { + display: block; } + .frontpage a:hover { + width: 100%; + background-color: #e2e1e6; } + +.books:hover { + width: 100%; + background-color: #e2e1e6; } + +a { + color: #007aff; + font-weight: 600; } + a:hover { + color: black; } + +/*iphone - reduction des tailles de police et taille fixe en px*/ +body { + font: normal normal 300 12px Helvetica Neue Interface, Helvetica Neue, Helvetica; + color: black; } + +h2 { + font: normal normal 400 16px Helvetica Neue Interface, Helvetica Neue, Helvetica; + color: #007aff; } + +h3 { + font: normal normal 400 14px Helvetica Neue Interface, Helvetica Neue, Helvetica; + color: black; } + +h4 { + font: normal normal 400 14px Helvetica Neue Interface, Helvetica Neue, Helvetica; + color: black; } + +/*iphone - Suppression des arrondis +.container { +border-radius:10px; +} +*/ +/* ============================================================================= + Header stuff goes here + ========================================================================== */ +/* +header { +iphone - Suppression ombrage (bug avec formulaire recherche) + box-shadow:inset 0px -5px 8px #000000; +iphone - Suppression des arrondis + border-radius: 10px 10px 0px 0px; +}*/ +.hicon { + text-shadow: 2px 2px 2px black; } + +/*iphone - icone trop bas */ +#tool .hicon32 { + margin-top: -5px; } + +.submit { + border-radius: 0; + box-shadow: none; } + +header h1 { + vertical-align: middle; + text-align: center; + font: normal normal 500 24px Helvetica Neue Interface, Helvetica Neue, Helvetica; + color: #007aff; } + +.download a { + font: normal normal 400 16px Helvetica Neue Interface, Helvetica Neue, Helvetica; + color: #007aff; + box-shadow: 0 0 10px #c8c7cc; + color: #007aff; + border-color: #007aff; + border-radius: 5px; + border-style: solid; + border-width: 1px; + background: white; } + +/*iphone - bouton de donwload en haut dans book detail +(manque de place en mode paysage)*/ +.bookpopup .download { + float: none; + margin: -12px 30px -2px 4px; } + +/*iphone - modification des marges pour cover dans detail*/ +.bookpopup .cover { + margin: 27px 4px 4px 0px; } + +.mfp-content .bookpopup { + /*iphone - Taille minimum du detail du livre en popup + pour que la pochette ne depasse pas + (pas seulement pour iphone) */ + min-height: 210px; } + +footer { + box-shadow: inset 0px 5px 10px #000000; + /*iphone - Suppression des arrondis + border-radius: 0px 0px 10px 10px;*/ } + +/* ============================================================================= + Media query stuff goes here + ========================================================================== */ +/* 768px and greater */ +@media only screen and (min-width: 768px) { + .container { + box-shadow: 0 0 20px #000; } } diff --git a/sources/templates/default/styles/style-iphone7.css b/sources/templates/default/styles/style-iphone7.css new file mode 100644 index 0000000..85b18b9 --- /dev/null +++ b/sources/templates/default/styles/style-iphone7.css @@ -0,0 +1,116 @@ +@import url("style-base.css"); +/* ============================================================================= + Main container stuff goes here and other globals + ========================================================================== */ + +.st, .sp, .sa, .se, .ss { + font: -apple-system-body; + color: #007aff; } + +.st { + font-weight: 600; } + +.frontpage a { + display: block; } + .frontpage a:hover { + width: 100%; + background-color: #e2e1e6; } + +.books:hover { + width: 100%; + background-color: #e2e1e6; } + +a { + color: #007aff; + font-weight: 600; } + a:hover { + color: black; } + +/*iphone - reduction des tailles de police et taille fixe en px*/ +body { + font: -apple-system-body; + color: black; } + +h2 { + font: -apple-system-subheadline; + color: #007aff; } + +h3 { + font: -apple-system-subheadline; + color: black; } + +h4 { + font: -apple-system-subheadline; + color: black; } + +/*iphone - Suppression des arrondis +.container { +border-radius:10px; +} +*/ +/* ============================================================================= + Header stuff goes here + ========================================================================== */ +/* +header { +iphone - Suppression ombrage (bug avec formulaire recherche) + box-shadow:inset 0px -5px 8px #000000; +iphone - Suppression des arrondis + border-radius: 10px 10px 0px 0px; +}*/ +.hicon { + text-shadow: 2px 2px 2px black; } + +/*iphone - icone trop bas */ +#tool .hicon32 { + margin-top: -5px; } + +.submit { + border-radius: 0; + box-shadow: none; } + +header h1 { + vertical-align: middle; + text-align: center; + font: -apple-system-headline; + color: #007aff; } + +.download a { + font: -apple-system-subheadline; + color: #007aff; + box-shadow: 0 0 10px #c8c7cc; + color: #007aff; + border-color: #007aff; + border-radius: 5px; + border-style: solid; + border-width: 1px; + background: white; } + +/*iphone - bouton de donwload en haut dans book detail +(manque de place en mode paysage)*/ +.bookpopup .download { + float: none; + margin: -12px 30px -2px 4px; } + +/*iphone - modification des marges pour cover dans detail*/ +.bookpopup .cover { + margin: 27px 4px 4px 0px; } + +.mfp-content .bookpopup { + /*iphone - Taille minimum du detail du livre en popup + pour que la pochette ne depasse pas + (pas seulement pour iphone) */ + min-height: 210px; } + +footer { + box-shadow: inset 0px 5px 10px #000000; + /*iphone - Suppression des arrondis + border-radius: 0px 0px 10px 10px;*/ } + +/* ============================================================================= + Media query stuff goes here + ========================================================================== */ +/* 768px and greater */ +@media only screen and (min-width: 768px) { + .container { + box-shadow: 0 0 20px #000; } } diff --git a/sources/templates/default/suggestion.html b/sources/templates/default/suggestion.html new file mode 100644 index 0000000..1107dad --- /dev/null +++ b/sources/templates/default/suggestion.html @@ -0,0 +1 @@ +

    {{=it.title}}

    \ No newline at end of file diff --git a/sources/test/BaseWithCustomColumns/metadata.db b/sources/test/BaseWithCustomColumns/metadata.db new file mode 100644 index 0000000..ce359f9 Binary files /dev/null and b/sources/test/BaseWithCustomColumns/metadata.db differ diff --git a/sources/test/BaseWithOneBook/metadata.db b/sources/test/BaseWithOneBook/metadata.db new file mode 100644 index 0000000..a1f24b3 Binary files /dev/null and b/sources/test/BaseWithOneBook/metadata.db differ diff --git a/sources/test/BaseWithSomeBooks/Lewis Carroll/Alice's Adventures in Wonderland (17)/Alice's Adventures in Wonderland - Lewis Carroll.epub b/sources/test/BaseWithSomeBooks/Lewis Carroll/Alice's Adventures in Wonderland (17)/Alice's Adventures in Wonderland - Lewis Carroll.epub new file mode 100644 index 0000000..376ab50 Binary files /dev/null and b/sources/test/BaseWithSomeBooks/Lewis Carroll/Alice's Adventures in Wonderland (17)/Alice's Adventures in Wonderland - Lewis Carroll.epub differ diff --git a/sources/test/BaseWithSomeBooks/Lewis Carroll/Alice's Adventures in Wonderland (17)/cover.jpg b/sources/test/BaseWithSomeBooks/Lewis Carroll/Alice's Adventures in Wonderland (17)/cover.jpg new file mode 100644 index 0000000..da5d852 Binary files /dev/null and b/sources/test/BaseWithSomeBooks/Lewis Carroll/Alice's Adventures in Wonderland (17)/cover.jpg differ diff --git a/sources/test/BaseWithSomeBooks/Lewis Carroll/Alice's Adventures in Wonderland (17)/metadata.opf b/sources/test/BaseWithSomeBooks/Lewis Carroll/Alice's Adventures in Wonderland (17)/metadata.opf new file mode 100644 index 0000000..9d3085c --- /dev/null +++ b/sources/test/BaseWithSomeBooks/Lewis Carroll/Alice's Adventures in Wonderland (17)/metadata.opf @@ -0,0 +1,32 @@ + + + + 15 + cdcb34f1-d554-409b-8620-9a4a56c58c68 + Alice's Adventures in Wonderland + Lewis Carroll + calibre (1.3.0) [http://calibre-ebook.com] + 1897-01-13T23:00:00+00:00 + Alice's Adventures in Wonderland (1865) is a novel written by English author Charles Lutwidge Dodgson, better known under the pseudonym Lewis Carroll. It tells the story of a girl named Alice who falls down a rabbit-hole into a fantasy world populated by peculiar and anthropomorphic creatures. +The tale is filled with allusions to Dodgson's friends (and enemies), and to the lessons that British schoolchildren were expected to memorize. The tale plays with logic in ways that have made the story of lasting popularity with adults as well as children. It is considered to be one of the most characteristic examples of the genre of literary nonsense, and its narrative course and structure has been enormously influential, mainly in the fantasy genre. + Feedbooks + urn|uuid|bca234de-5f3c-11e1-837d-001cc0a62c0b + http|//www.feedbooks.com/book/22 + eng + Fantasy + Juvenile + Fiction + + + + + + + + + + + + + + diff --git a/sources/test/BaseWithSomeBooks/metadata.db b/sources/test/BaseWithSomeBooks/metadata.db new file mode 100644 index 0000000..cc86958 Binary files /dev/null and b/sources/test/BaseWithSomeBooks/metadata.db differ diff --git a/sources/test/EpubFsTest.php b/sources/test/EpubFsTest.php new file mode 100644 index 0000000..d4fcc64 --- /dev/null +++ b/sources/test/EpubFsTest.php @@ -0,0 +1,106 @@ + + */ + +require (dirname(__FILE__) . "/../epubfs.php"); +require (dirname(__FILE__) . "/config_test.php"); + + +class EpubFsTest extends PHPUnit_Framework_TestCase +{ + private static $book; + private static $add; + + + public static function setUpBeforeClass() + { + $idData = 20; + self::$add = "data=$idData&"; + $myBook = Book::getBookByDataId($idData); + + self::$book = new EPub ($myBook->getFilePath ("EPUB", $idData)); + self::$book->initSpineComponent (); + } + + public function testUrlImage () { + $data = getComponentContent (self::$book, "cover.xml", self::$add); + + $src = ""; + if (preg_match("/src\=\'(.*?)\'/", $data, $matches)) { + $src = $matches [1]; + } + $this->assertEquals ('epubfs.php?data=20&comp=images~SLASH~cover.png', $src); + + } + + public function testUrlHref () { + $data = getComponentContent (self::$book, "title.xml", self::$add); + + $src = ""; + if (preg_match("/src\=\'(.*?)\'/", $data, $matches)) { + $src = $matches [1]; + } + $this->assertEquals ('epubfs.php?data=20&comp=images~SLASH~logo~DASH~feedbooks~DASH~tiny.png', $src); + + $href = ""; + if (preg_match("/href\=\'(.*?)\'/", $data, $matches)) { + $href = $matches [1]; + } + $this->assertEquals ('epubfs.php?data=20&comp=css~SLASH~title.css', $href); + + } + + public function testImportCss () { + $data = getComponentContent (self::$book, "css~SLASH~title.css", self::$add); + + $import = ""; + if (preg_match("/import \'(.*?)\'/", $data, $matches)) { + $import = $matches [1]; + } + $this->assertEquals ('epubfs.php?data=20&comp=css~SLASH~page.css', $import); + } + + public function testUrlInCss () { + $data = getComponentContent (self::$book, "css~SLASH~main.css", self::$add); + + $src = ""; + if (preg_match("/url\s*\(\'(.*?)\'\)/", $data, $matches)) { + $src = $matches [1]; + } + $this->assertEquals ('epubfs.php?data=20&comp=fonts~SLASH~times.ttf', $src); + } + + public function testDirectLink () { + $data = getComponentContent (self::$book, "main10.xml", self::$add); + + $src = ""; + if (preg_match("/href\='(.*?)' title=\"Direct Link\"/", $data, $matches)) { + $src = $matches [1]; + } + $this->assertEquals ('epubfs.php?data=20&comp=main2.xml', $src); + } + + public function testDirectLinkWithAnchor () { + $data = getComponentContent (self::$book, "main10.xml", self::$add); + + $src = ""; + if (preg_match("/href\='(.*?)' title=\"Direct Link with anchor\"/", $data, $matches)) { + $src = $matches [1]; + } + $this->assertEquals ('epubfs.php?data=20&comp=main2.xml#anchor', $src); + } + + public function testAnchorOnly () { + $data = getComponentContent (self::$book, "main10.xml", self::$add); + + $src = ""; + if (preg_match("/href\='(.*?)' title=\"Link to anchor\"/", $data, $matches)) { + $src = $matches [1]; + } + $this->assertEquals ('#anchor', $src); + } +} \ No newline at end of file diff --git a/sources/test/OPDSTest.php b/sources/test/OPDSTest.php new file mode 100644 index 0000000..d6d85a3 --- /dev/null +++ b/sources/test/OPDSTest.php @@ -0,0 +1,253 @@ + + */ + +require_once (dirname(__FILE__) . "/config_test.php"); + +define ("OPDS_RELAX_NG", dirname(__FILE__) . "/opds-relax-ng/opds_catalog_1_1.rng"); +define ("OPENSEARCHDESCRIPTION_RELAX_NG", dirname(__FILE__) . "/opds-relax-ng/opensearchdescription.rng"); +define ("JING_JAR", dirname(__FILE__) . "/jing.jar"); +define ("OPDSVALIDATOR_JAR", dirname(__FILE__) . "/OPDSValidator.jar"); +define ("TEST_FEED", dirname(__FILE__) . "/text.atom"); + +class OpdsTest extends PHPUnit_Framework_TestCase +{ + public static function tearDownAfterClass() + { + if (!file_exists (TEST_FEED)) { + return; + } + unlink (TEST_FEED); + } + + function jingValidateSchema($feed, $relax = OPDS_RELAX_NG) { + $path = ""; + $res = system($path . 'java -jar "' . JING_JAR . '" "' . $relax . '" "' . $feed . '"'); + if ($res != '') { + echo 'RelaxNG validation error: '.$res; + return false; + } else + return true; + } + + function opdsValidator($feed) { + $oldcwd = getcwd(); // Save the old working directory + chdir("test"); + $path = ""; + $res = system($path . 'java -jar "' . OPDSVALIDATOR_JAR . '" "' . $feed . '"'); + chdir($oldcwd); + if ($res != '') { + echo 'OPDS validation error: '.$res; + return false; + } else + return true; + } + + function opdsCompleteValidation ($feed) { + return $this->jingValidateSchema($feed) && $this->opdsValidator($feed); + } + + public function testPageIndex () + { + global $config; + $page = Base::PAGE_INDEX; + $query = NULL; + $qid = NULL; + $n = "1"; + + $_SERVER['QUERY_STRING'] = ""; + $config['cops_subtitle_default'] = "My subtitle"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $OPDSRender = new OPDSRenderer (); + + file_put_contents (TEST_FEED, $OPDSRender->render ($currentPage)); + $this->AssertTrue ($this->opdsCompleteValidation (TEST_FEED)); + + $_SERVER ["HTTP_USER_AGENT"] = "XXX"; + $config['cops_generate_invalid_opds_stream'] = "1"; + + file_put_contents (TEST_FEED, $OPDSRender->render ($currentPage)); + $this->AssertFalse ($this->jingValidateSchema (TEST_FEED)); + $this->AssertFalse ($this->opdsValidator (TEST_FEED)); + + $_SERVER['QUERY_STRING'] = NULL; + } + + /** + * @dataProvider providerPage + */ + public function testMostPages ($page, $query) + { + $qid = NULL; + $n = "1"; + $_SERVER['QUERY_STRING'] = "?page={$page}"; + if (!empty ($query)) { + $_SERVER['QUERY_STRING'] .= "&query={$query}"; + } + $_SERVER['REQUEST_URI'] = "feed.php" . $_SERVER['QUERY_STRING']; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $OPDSRender = new OPDSRenderer (); + + file_put_contents (TEST_FEED, $OPDSRender->render ($currentPage)); + $this->AssertTrue ($this->opdsCompleteValidation (TEST_FEED)); + } + + public function providerPage () + { + return array ( + array (Base::PAGE_OPENSEARCH, "car"), + array (Base::PAGE_ALL_AUTHORS, NULL), + array (Base::PAGE_ALL_SERIES, NULL), + array (Base::PAGE_ALL_TAGS, NULL), + array (Base::PAGE_ALL_PUBLISHERS, NULL), + array (Base::PAGE_ALL_LANGUAGES, NULL), + array (Base::PAGE_ALL_RECENT_BOOKS, NULL), + array (Base::PAGE_ALL_BOOKS, NULL) + ); + } + + public function testPageIndexMultipleDatabase () + { + global $config; + $config['calibre_directory'] = array ("Some books" => dirname(__FILE__) . "/BaseWithSomeBooks/", + "One book" => dirname(__FILE__) . "/BaseWithOneBook/"); + $page = Base::PAGE_INDEX; + $query = NULL; + $qid = "1"; + $n = "1"; + $_SERVER['QUERY_STRING'] = ""; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $OPDSRender = new OPDSRenderer (); + + file_put_contents (TEST_FEED, $OPDSRender->render ($currentPage)); + $this->AssertTrue ($this->opdsCompleteValidation (TEST_FEED)); + } + + public function testOpenSearchDescription () + { + $_SERVER['QUERY_STRING'] = ""; + + $OPDSRender = new OPDSRenderer (); + + file_put_contents (TEST_FEED, $OPDSRender->getOpenSearch ()); + $this->AssertTrue ($this->jingValidateSchema (TEST_FEED, OPENSEARCHDESCRIPTION_RELAX_NG)); + + $_SERVER['QUERY_STRING'] = NULL; + } + + public function testPageAuthorMultipleDatabase () + { + global $config; + $config['calibre_directory'] = array ("Some books" => dirname(__FILE__) . "/BaseWithSomeBooks/", + "One book" => dirname(__FILE__) . "/BaseWithOneBook/"); + $page = Base::PAGE_AUTHOR_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + $_SERVER['QUERY_STRING'] = "page=" . Base::PAGE_AUTHOR_DETAIL . "&id=1"; + $_GET ["db"] = "0"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $OPDSRender = new OPDSRenderer (); + + file_put_contents (TEST_FEED, $OPDSRender->render ($currentPage)); + $this->AssertTrue ($this->opdsCompleteValidation (TEST_FEED)); + } + + public function testPageAuthorsDetail () + { + global $config; + $page = Base::PAGE_AUTHOR_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + $_SERVER['QUERY_STRING'] = "page=" . Base::PAGE_AUTHOR_DETAIL . "&id=1&n=1"; + + $config['cops_max_item_per_page'] = 2; + + // First page + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $OPDSRender = new OPDSRenderer (); + + file_put_contents (TEST_FEED, $OPDSRender->render ($currentPage)); + $this->AssertTrue ($this->opdsCompleteValidation (TEST_FEED)); + + // Second page + + $n = 2; + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $OPDSRender = new OPDSRenderer (); + + file_put_contents (TEST_FEED, $OPDSRender->render ($currentPage)); + $this->AssertTrue ($this->opdsCompleteValidation (TEST_FEED)); + + // No pagination + $config['cops_max_item_per_page'] = -1; + + } + + public function testPageAuthorsDetail_WithFacets () + { + global $config; + $page = Base::PAGE_AUTHOR_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + $_SERVER['QUERY_STRING'] = "page=" . Base::PAGE_AUTHOR_DETAIL . "&id=1&n=1"; + $_GET["tag"] = "Short Stories"; + + $config['cops_books_filter'] = array ("Only Short Stories" => "Short Stories", "No Short Stories" => "!Short Stories"); + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $OPDSRender = new OPDSRenderer (); + + file_put_contents (TEST_FEED, $OPDSRender->render ($currentPage)); + $this->AssertTrue ($this->opdsCompleteValidation (TEST_FEED)); + + $config['cops_books_filter'] = array (); + } + + public function testPageAuthorsDetail_WithoutAnyId () + { + global $config; + $page = Base::PAGE_AUTHOR_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + $_SERVER['QUERY_STRING'] = "page=" . Base::PAGE_AUTHOR_DETAIL . "&id=1&n=1"; + $_SERVER['REQUEST_URI'] = "index.php?XXXX"; + + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + $currentPage->idPage = NULL; + + $OPDSRender = new OPDSRenderer (); + + file_put_contents (TEST_FEED, $OPDSRender->render ($currentPage)); + $this->AssertTrue ($this->opdsCompleteValidation (TEST_FEED)); + + } +} \ No newline at end of file diff --git a/sources/test/OPDSValidator.jar b/sources/test/OPDSValidator.jar new file mode 100644 index 0000000..3fe7b33 Binary files /dev/null and b/sources/test/OPDSValidator.jar differ diff --git a/sources/test/Sauce.php b/sources/test/Sauce.php new file mode 100644 index 0000000..de35972 --- /dev/null +++ b/sources/test/Sauce.php @@ -0,0 +1,234 @@ + 'firefox', + 'desiredCapabilities' => array( + 'version' => '28', + 'platform' => 'Windows 8.1', + ) + ), + // run IE9 on Windows 7 on Sauce + array( + 'browserName' => 'internet explorer', + 'desiredCapabilities' => array( + 'version' => '9', + 'platform' => 'Windows 7', + ) + ), + // run IE10 on Windows 8 on Sauce + array( + 'browserName' => 'internet explorer', + 'desiredCapabilities' => array( + 'version' => '11', + 'platform' => 'Windows 8.1', + ) + ), + // run Safari 7 on Maverick on Sauce + array( + 'browserName' => 'safari', + 'desiredCapabilities' => array( + 'version' => '7', + 'platform' => 'OS X 10.9', + ) + ), + // run Mobile Safari on iOS + array( + 'browserName' => 'iphone', + 'desiredCapabilities' => array( + 'app' => 'safari', + 'device' => 'iPhone 6', + 'version' => '9.2', + 'platform' => 'OS X 10.10', + ) + ), + // run Mobile Browser on Android + array( + 'browserName' => 'Android', + 'desiredCapabilities' => array( + 'version' => '5.1', + 'platform' => 'Linux', + ) + ), + // run Chrome on Linux on Sauce + array( + 'browserName' => 'chrome', + 'desiredCapabilities' => array( + 'version' => '33', + 'platform' => 'Linux' + ) + ) + + + // run Chrome locally + //array( + //'browserName' => 'chrome', + //'local' => true, + //'sessionStrategy' => 'shared' + //) + ); + + public function setUp() + { + if (isset ($_SERVER["TRAVIS_JOB_NUMBER"])) { + $caps = $this->getDesiredCapabilities(); + $caps['build'] = getenv ("TRAVIS_JOB_NUMBER"); + $caps['tunnel-identifier'] = getenv ("TRAVIS_JOB_NUMBER"); + $caps['idle-timeout'] = "180"; + $this->setDesiredCapabilities($caps); + } + parent::setUp (); + } + + public function setUpPage() + { + if (isset ($_SERVER["TRAVIS_JOB_NUMBER"])) { + $this->url('http://127.0.0.1:8888/index.php'); + } else { + $this->url('http://cops-demo.slucas.fr/index.php'); + } + + $driver = $this; + $title_test = function($value) use ($driver) { + $text = $driver->byXPath('//h1')->text (); + return $text == $value; + }; + + $this->spinAssert("Home Title", $title_test, [ "COPS DEMO" ]); + } + + public function string_to_ascii($string) + { + $ascii = NULL; + + for ($i = 0; $i < strlen($string); $i++) + { + $ascii += ord($string[$i]); + } + + return mb_detect_encoding($string) . "X" . $ascii; + } + + // public function testTitle() + // { + // $driver = $this; + // $title_test = function($value) use ($driver) { + // $text = $driver->byXPath('//h1')->text (); + // return $text == $value; + // }; + + // $author = $this->byXPath ('//h2[contains(text(), "Authors")]'); + // $author->click (); + + // $this->spinAssert("Author Title", $title_test, [ "AUTHORS" ]); + // } + + // public function testCog() + // { + // $cog = $this->byId ("searchImage"); + + // $search = $this->byName ("query"); + // $this->assertFalse ($search->displayed ()); + + // $cog->click (); + + // $search = $this->byName ("query"); + // $this->assertTrue ($search->displayed ()); + // } + + public function testFilter() + { + $driver = $this; + $title_test = function($value) use ($driver) { + $text = $driver->byXPath('//h1')->text (); + return $text == $value; + }; + + $element_present = function ($using, $id) use ($driver) { + $elements = $driver->elements ($driver->using($using)->value($id)); + return count($elements) == 1; + }; + + // Click on the wrench to enable tag filtering + $this->spinWait ("", $element_present, [ "class name", 'icon-wrench']); + $this->byClassName ("icon-wrench")->click (); + + $this->spinWait ("", $element_present, [ "id", "html_tag_filter"]); + $this->byId ("html_tag_filter")->click (); + + // Go back to home screen + $this->byClassName ("icon-home")->click (); + + $this->spinAssert("Home Title", $title_test, [ "COPS DEMO" ]); + + // Go on the recent page + $author = $this->byXPath ('//h2[contains(text(), "Recent")]'); + $author->click (); + + $this->spinAssert("Recent book title", $title_test, [ "RECENT ADDITIONS" ]); + + // Click on the cog to show tag filters + $cog = $this->byId ("searchImage"); + $cog->click (); + sleep (1); + // Filter on War & Military + $filter = $this->byXPath ('//li[contains(text(), "War")]'); + $filter->click (); + sleep (1); + // Only one book + $filtered = $this->elements ($this->using('css selector')->value('*[class="books"]')); + $this->assertEquals (1, count($filtered)); + $filter->click (); + sleep (1); + // 13 book + $filtered = $this->elements ($this->using('css selector')->value('*[class="books"]')); + $this->assertEquals (14, count($filtered)); + } + + public function normalSearch ($src, $out) + { + $driver = $this; + $title_test = function($value) use ($driver) { + $text = $driver->byXPath('//h1')->text (); + return $text == $value; + }; + + // Click on the cog to show the search + $cog = $this->byId ("searchImage"); + $cog->click (); + //sleep (1); + + // Focus the input and type + $this->waitUntil(function () { + if ($this->byName ("query")) { + return true; + } + return null; + }, 1000); + $queryInput = $this->byName ("query"); + $queryInput->click (); + $queryInput->value ($src); + $queryInput->submit (); + + $this->spinAssert("Home Title", $title_test, [ "SEARCH RESULT FOR *" . $out . "*" ]); + } + + public function testSearchWithoutAccentuatedCharacters() + { + $this->normalSearch ("ali", "ALI"); + } + + public function testSearchWithAccentuatedCharacters() + { + if ($this->getBrowser() == "Android") { + $this->markTestIncomplete(); + return; + } + $this->normalSearch ("é", "É"); + } +} diff --git a/sources/test/baseTest.php b/sources/test/baseTest.php new file mode 100644 index 0000000..d924eec --- /dev/null +++ b/sources/test/baseTest.php @@ -0,0 +1,205 @@ + + */ + +require_once (dirname(__FILE__) . "/config_test.php"); +require_once (dirname(__FILE__) . "/../base.php"); + +class BaseTest extends PHPUnit_Framework_TestCase +{ + public function testAddURLParameter () + { + $this->assertEquals ("?db=0", addURLParameter ("?", "db", "0")); + $this->assertEquals ("?key=value&db=0", addURLParameter ("?key=value", "db", "0")); + $this->assertEquals ("?key=value&otherKey=&db=0", addURLParameter ("?key=value&otherKey", "db", "0")); + } + + /** + * FALSE is returned if the create_function failed (meaning there was a syntax error) + * @dataProvider providerTemplate + */ + public function testServerSideRender ($template) + { + $_COOKIE["template"] = $template; + $this->assertNull (serverSideRender (NULL)); + } + + /** + * The function for the head of the HTML catalog + * @dataProvider providerTemplate + */ + public function testGenerateHeader ($templateName) + { + $_SERVER["HTTP_USER_AGENT"] = "Firefox"; + global $config; + $headcontent = file_get_contents(dirname(__FILE__) . '/../templates/' . $templateName . '/file.html'); + $template = new doT (); + $tpl = $template->template ($headcontent, NULL); + $data = array("title" => $config['cops_title_default'], + "version" => VERSION, + "opds_url" => $config['cops_full_url'] . "feed.php", + "customHeader" => "", + "template" => $templateName, + "server_side_rendering" => useServerSideRendering (), + "current_css" => getCurrentCss (), + "favico" => $config['cops_icon'], + "getjson_url" => "getJSON.php?" . addURLParameter (getQueryString (), "complete", 1)); + + $head = $tpl ($data); + $this->assertContains ("", $head); + $this->assertContains ("", $head); + } + + public function providerTemplate () + { + return array ( + array ("bootstrap"), + array ("default") + ); + } + + public function testLocalize () + { + $this->assertEquals ("Authors", localize ("authors.title")); + + $this->assertEquals ("unknow.key", localize ("unknow.key")); + } + + public function testLocalizeFr () + { + $_SERVER['HTTP_ACCEPT_LANGUAGE'] = "fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3"; + $this->assertEquals ("Auteurs", localize ("authors.title", -1, true)); + + $_SERVER['HTTP_ACCEPT_LANGUAGE'] = "en"; + localize ("authors.title", -1, true); + } + + public function testLocalizeUnknown () + { + $_SERVER['HTTP_ACCEPT_LANGUAGE'] = "aa"; + $this->assertEquals ("Authors", localize ("authors.title", -1, true)); + + $_SERVER['HTTP_ACCEPT_LANGUAGE'] = "en"; + localize ("authors.title", -1, true); + } + + /** + * @dataProvider providerGetLangAndTranslationFile + */ + public function testGetLangAndTranslationFile ($acceptLanguage, $result) + { + $_SERVER['HTTP_ACCEPT_LANGUAGE'] = $acceptLanguage; + list ($lang, $lang_file) = GetLangAndTranslationFile (); + $this->assertEquals ($result, $lang); + + $_SERVER['HTTP_ACCEPT_LANGUAGE'] = "en"; + localize ("authors.title", -1, true); + } + + public function providerGetLangAndTranslationFile () + { + return array ( + array ("en", "en"), + array ("fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3", "fr"), + array ("fr-FR", "fr"), + array ("pt,en-us;q=0.7,en;q=0.3", "en"), + array ("pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3", "pt_BR"), + array ("pt-pt,pt;q=0.8,en;q=0.5,en-us;q=0.3", "pt_PT"), + array ("zl", "en"), + ); + } + + /** + * @dataProvider providerGetAcceptLanguages + */ + public function testGetAcceptLanguages ($acceptLanguage, $result) + { + $_SERVER['HTTP_ACCEPT_LANGUAGE'] = $acceptLanguage; + $langs = array_keys(GetAcceptLanguages ()); + $this->assertEquals ($result, $langs[0]); + + $_SERVER['HTTP_ACCEPT_LANGUAGE'] = "en"; + localize ("authors.title", -1, true); + } + + public function providerGetAcceptLanguages () + { + return array ( + array ("en", "en"), + array ("en-US", "en_US"), + array ("fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3", "fr"), // French locale with Firefox + array ("fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4", "fr_FR"), // French locale with Chrome + array ("fr-FR", "fr_FR"), // French locale with IE11 + array ("pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3", "pt_BR"), + array ("zl", "zl"), + ); + } + + public function testBaseFunction () { + global $config; + + $this->assertFalse (Base::isMultipleDatabaseEnabled ()); + $this->assertEquals (array ("" => dirname(__FILE__) . "/BaseWithSomeBooks/"), Base::getDbList ()); + + $config['calibre_directory'] = array ("Some books" => dirname(__FILE__) . "/BaseWithSomeBooks/", + "One book" => dirname(__FILE__) . "/BaseWithOneBook/"); + + $this->assertTrue (Base::isMultipleDatabaseEnabled ()); + $this->assertEquals ("Some books", Base::getDbName (0)); + $this->assertEquals ("One book", Base::getDbName (1)); + $this->assertEquals ($config['calibre_directory'], Base::getDbList ()); + } + + public function testCheckDatabaseAvailability_1 () { + $this->assertTrue (Base::checkDatabaseAvailability ()); + } + + public function testCheckDatabaseAvailability_2 () { + global $config; + + $config['calibre_directory'] = array ("Some books" => dirname(__FILE__) . "/BaseWithSomeBooks/", + "One book" => dirname(__FILE__) . "/BaseWithOneBook/"); + + $this->assertTrue (Base::checkDatabaseAvailability ()); + } + + /** + * @expectedException Exception + * @expectedExceptionMessage not found + */ + public function testCheckDatabaseAvailability_Exception1 () { + global $config; + + $config['calibre_directory'] = array ("Some books" => dirname(__FILE__) . "/BaseWithSomeBooks/", + "One book" => dirname(__FILE__) . "/OneBook/"); + + $this->assertTrue (Base::checkDatabaseAvailability ()); + } + + /** + * @expectedException Exception + * @expectedExceptionMessage not found + */ + public function testCheckDatabaseAvailability_Exception2 () { + global $config; + + $config['calibre_directory'] = array ("Some books" => dirname(__FILE__) . "/SomeBooks/", + "One book" => dirname(__FILE__) . "/BaseWithOneBook/"); + + $this->assertTrue (Base::checkDatabaseAvailability ()); + } + + /* + Test normalized utf8 string according to unicode.org output + more here : + http://unicode.org/cldr/utility/transform.jsp?a=Latin-ASCII&b=%C3%80%C3%81%C3%82%C3%83%C3%84%C3%85%C3%87%C3%88%C3%89%C3%8A%C3%8B%C3%8C%C3%8D%C3%8E%C3%8F%C5%92%C3%92%C3%93%C3%94%C3%95%C3%96%C3%99%C3%9A%C3%9B%C3%9C%C3%9D%C3%A0%C3%A1%C3%A2%C3%A3%C3%A4%C3%A5%C3%A7%C3%A8%C3%A9%C3%AA%C3%AB%C3%AC%C3%AD%C3%AE%C3%AF%C5%93%C3%B0%C3%B2%C3%B3%C3%B4%C3%B5%C3%B6%C3%B9%C3%BA%C3%BB%C3%BC%C3%BD%C3%BF%C3%B1 + */ + public function testNormalizeUtf8String () { + $this->assertEquals ("AAAAAACEEEEIIIIOEOOOOOUUUUYaaaaaaceeeeiiiioedooooouuuuyyn", + normalizeUtf8String ("ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏŒÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïœðòóôõöùúûüýÿñ")); + } +} \ No newline at end of file diff --git a/sources/test/bookTest.php b/sources/test/bookTest.php new file mode 100644 index 0000000..fba088b --- /dev/null +++ b/sources/test/bookTest.php @@ -0,0 +1,603 @@ + + */ + +require_once (dirname(__FILE__) . "/config_test.php"); + +/* +Publishers: +id:2 (2 books) Macmillan and Co. London: Lewis Caroll +id:3 (2 books) D. Appleton and Company Alexander Dumas +id:4 (1 book) Macmillan Publishers USA: Jack London +id:5 (1 book) Pierson's Magazine: H. G. Wells +id:6 (8 books) Strand Magazine: Arthur Conan Doyle +*/ + +define ("TEST_THUMBNAIL", dirname(__FILE__) . "/thumbnail.jpg"); +define ("COVER_WIDTH", 400); +define ("COVER_HEIGHT", 600); + +class BookTest extends PHPUnit_Framework_TestCase +{ + public static function setUpBeforeClass() + { + $book = Book::getBookById(2); + if (!is_dir ($book->path)) { + mkdir ($book->path, 0777, true); + } + $im = imagecreatetruecolor(COVER_WIDTH, COVER_HEIGHT); + $text_color = imagecolorallocate($im, 255, 0, 0); + imagestring($im, 1, 5, 5, 'Book cover', $text_color); + imagejpeg ($im, $book->path . "/cover.jpg", 80); + } + + public static function tearDownAfterClass() + { + $book = Book::getBookById(2); + if (!file_exists ($book->path . "/cover.jpg")) { + return; + } + unlink ($book->path . "/cover.jpg"); + rmdir ($book->path); + rmdir (dirname ($book->path)); + } + + public function testGetBookCount () + { + $this->assertEquals (15, Book::getBookCount ()); + } + + public function testGetCount () + { + $entryArray = Book::getCount (); + $this->assertEquals (2, count($entryArray)); + + $entryAllBooks = $entryArray [0]; + $this->assertEquals ("Alphabetical index of the 15 books", $entryAllBooks->content); + + $entryRecentBooks = $entryArray [1]; + $this->assertEquals ("50 most recent books", $entryRecentBooks->content); + + } + + public function testGetCountRecent () + { + global $config; + $config['cops_recentbooks_limit'] = 0; + $entryArray = Book::getCount (); + + $this->assertEquals (1, count($entryArray)); + + $config['cops_recentbooks_limit'] = 2; + $entryArray = Book::getCount (); + + $entryRecentBooks = $entryArray [1]; + $this->assertEquals ("2 most recent books", $entryRecentBooks->content); + + $config['cops_recentbooks_limit'] = 50; + } + + public function testGetBooksByAuthor () + { + // All book by Arthur Conan Doyle + global $config; + + $config['cops_max_item_per_page'] = 5; + list ($entryArray, $totalNumber) = Book::getBooksByAuthor (1, 1); + $this->assertEquals (5, count($entryArray)); + $this->assertEquals (8, $totalNumber); + + list ($entryArray, $totalNumber) = Book::getBooksByAuthor (1, 2); + $this->assertEquals (3, count($entryArray)); + $this->assertEquals (8, $totalNumber); + + $config['cops_max_item_per_page'] = -1; + list ($entryArray, $totalNumber) = Book::getBooksByAuthor (1, -1); + $this->assertEquals (8, count($entryArray)); + $this->assertEquals (-1, $totalNumber); + } + + public function testGetBooksBySeries () + { + // All book from the Sherlock Holmes series + list ($entryArray, $totalNumber) = Book::getBooksBySeries (1, -1); + $this->assertEquals (7, count($entryArray)); + $this->assertEquals (-1, $totalNumber); + } + + public function testGetBooksByPublisher () + { + // All books from Strand Magazine + list ($entryArray, $totalNumber) = Book::getBooksByPublisher (6, -1); + $this->assertEquals (8, count($entryArray)); + $this->assertEquals (-1, $totalNumber); + } + + public function testGetBooksByTag () + { + // All book with the Fiction tag + list ($entryArray, $totalNumber) = Book::getBooksByTag (1, -1); + $this->assertEquals (14, count($entryArray)); + $this->assertEquals (-1, $totalNumber); + } + + public function testGetBooksByLanguage () + { + // All english book (= all books) + list ($entryArray, $totalNumber) = Book::getBooksByLanguage (1, -1); + $this->assertEquals (14, count($entryArray)); + $this->assertEquals (-1, $totalNumber); + } + + public function testGetAllBooks () + { + // All books by first letter + $entryArray = Book::getAllBooks (); + $this->assertCount (9, $entryArray); + } + + public function testGetBooksByStartingLetter () + { + // All books by first letter + list ($entryArray, $totalNumber) = Book::getBooksByStartingLetter ("T", -1); + $this->assertEquals (-1, $totalNumber); + $this->assertCount (3, $entryArray); + } + + public function testGetBookByDataId () + { + $book = Book::getBookByDataId (17); + + $this->assertEquals ("Alice's Adventures in Wonderland", $book->getTitle ()); + } + + public function testGetAllRecentBooks () + { + // All recent books + global $config; + + $config['cops_recentbooks_limit'] = 2; + + $entryArray = Book::getAllRecentBooks (); + $this->assertCount (2, $entryArray); + + $config['cops_recentbooks_limit'] = 50; + + $entryArray = Book::getAllRecentBooks (); + $this->assertCount (15, $entryArray); + } + + /** + * @dataProvider providerPublicationDate + */ + public function testGetPubDate ($pubdate, $expectedYear) + { + $book = Book::getBookById(2); + $book->pubdate = $pubdate; + $this->assertEquals($expectedYear, $book->getPubDate()); + } + + public function providerPublicationDate() { + return array( + array('2010-10-05 22:00:00+00:00', '2010'), + array('1982-11-15 13:05:29.908657+00:00', '1982'), + array('1562-10-05 00:00:00+00:00', '1562'), + array('0100-12-31 23:00:00+00:00', ''), + array('', ''), + array(NULL, '') + ); + } + + public function testGetBookById () + { + // also check most of book's class methods + $book = Book::getBookById(2); + + $linkArray = $book->getLinkArray (); + $this->assertCount (5, $linkArray); + + $this->assertEquals ("The Return of Sherlock Holmes", $book->getTitle ()); + $this->assertEquals ("urn:uuid:87ddbdeb-1e27-4d06-b79b-4b2a3bfc6a5f", $book->getEntryId ()); + $this->assertEquals ("index.php?page=13&id=2", $book->getDetailUrl ()); + $this->assertEquals ("Arthur Conan Doyle", $book->getAuthorsName ()); + $this->assertEquals ("Fiction, Mystery & Detective, Short Stories", $book->getTagsName ()); + $this->assertEquals ('

    The Return of Sherlock Holmes is a collection of 13 Sherlock Holmes stories, originally published in 1903-1904, by Arthur Conan Doyle.
    The book was first published on March 7, 1905 by Georges Newnes, Ltd and in a Colonial edition by Longmans. 30,000 copies were made of the initial print run. The US edition by McClure, Phillips & Co. added another 28,000 to the run.
    This was the first Holmes collection since 1893, when Holmes had "died" in "The Adventure of the Final Problem". Having published The Hound of the Baskervilles in 1901–1902 (although setting it before Holmes\' death) Doyle came under intense pressure to revive his famous character.

    ', $book->getComment (false)); + $this->assertEquals ("English", $book->getLanguages ()); + $this->assertEquals ("Strand Magazine", $book->getPublisher()->name); + } + + public function testGetBookById_NotFound () + { + $book = Book::getBookById(666); + + $this->assertNull ($book); + } + + public function testGetRating_FiveStars () + { + $book = Book::getBookById(2); + + $this->assertEquals ("★★★★★", $book->getRating ()); + } + + public function testGetRating_FourStars () + { + $book = Book::getBookById(2); + $book->rating = 8; + + // 4 filled stars and one empty + $this->assertEquals ("★★★★☆", $book->getRating ()); + } + + public function testGetRating_NoStars_Zero () + { + $book = Book::getBookById(2); + $book->rating = 0; + + $this->assertEquals ("", $book->getRating ()); + } + + public function testGetRating_NoStars_Null () + { + $book = Book::getBookById(2); + $book->rating = NULL; + + $this->assertEquals ("", $book->getRating ()); + } + + public function testBookGetLinkArrayWithUrlRewriting () + { + global $config; + + $book = Book::getBookById(2); + $config['cops_use_url_rewriting'] = "1"; + + $linkArray = $book->getLinkArray (); + foreach ($linkArray as $link) { + if ($link->rel == Link::OPDS_ACQUISITION_TYPE && $link->title == "EPUB" ) { + $this->assertEquals ("download/1/The%20Return%20of%20Sherlock%20Holmes%20-%20Arthur%20Conan%20Doyle.epub", $link->href); + return; + } + } + $this->fail (); + } + + public function testBookGetLinkArrayWithoutUrlRewriting () + { + global $config; + + $book = Book::getBookById(2); + $config['cops_use_url_rewriting'] = "0"; + + $linkArray = $book->getLinkArray (); + foreach ($linkArray as $link) { + if ($link->rel == Link::OPDS_ACQUISITION_TYPE && $link->title == "EPUB" ) { + $this->assertEquals ("fetch.php?data=1&type=epub&id=2", $link->href); + return; + } + } + $this->fail (); + } + + public function testGetThumbnailNotNeeded () + { + $book = Book::getBookById(2); + + $this->assertFalse ($book->getThumbnail (NULL, NULL, NULL)); + + // Current cover is 400*600 + $this->assertFalse ($book->getThumbnail (COVER_WIDTH, NULL, NULL)); + $this->assertFalse ($book->getThumbnail (COVER_WIDTH + 1, NULL, NULL)); + $this->assertFalse ($book->getThumbnail (NULL, COVER_HEIGHT, NULL)); + $this->assertFalse ($book->getThumbnail (NULL, COVER_HEIGHT + 1, NULL)); + } + + /** + * @dataProvider providerThumbnail + */ + public function testGetThumbnailByWidth ($width, $height, $expectedWidth, $expectedHeight) + { + $book = Book::getBookById(2); + + $this->assertTrue ($book->getThumbnail ($width, $height, TEST_THUMBNAIL)); + + $size = GetImageSize(TEST_THUMBNAIL); + $this->assertEquals ($expectedWidth, $size [0]); + $this->assertEquals ($expectedHeight, $size [1]); + + unlink (TEST_THUMBNAIL); + } + + public function providerThumbnail () + { + return array ( + array (164, NULL, 164, 246), + array (NULL, 164, 109, 164) + ); + } + + public function testGetMostInterestingDataToSendToKindle_WithMOBI () + { + // Get Alice (available as MOBI, PDF, EPUB in that order) + $book = Book::getBookById(17); + $data = $book->GetMostInterestingDataToSendToKindle (); + $this->assertEquals ("MOBI", $data->format); + } + + public function testGetMostInterestingDataToSendToKindle_WithPdf () + { + // Get Alice (available as MOBI, PDF, EPUB in that order) + $book = Book::getBookById(17); + $book->GetMostInterestingDataToSendToKindle (); + array_shift ($book->datas); + $data = $book->GetMostInterestingDataToSendToKindle (); + $this->assertEquals ("PDF", $data->format); + } + + public function testGetMostInterestingDataToSendToKindle_WithEPUB () + { + // Get Alice (available as MOBI, PDF, EPUB in that order) + $book = Book::getBookById(17); + $book->GetMostInterestingDataToSendToKindle (); + array_shift ($book->datas); + array_shift ($book->datas); + $data = $book->GetMostInterestingDataToSendToKindle (); + $this->assertEquals ("EPUB", $data->format); + } + + public function testGetDataById () + { + global $config; + + // Get Alice MOBI=>17, PDF=>19, EPUB=>20 + $book = Book::getBookById(17); + $mobi = $book->getDataById (17); + $this->assertEquals ("MOBI", $mobi->format); + $epub = $book->getDataById (20); + $this->assertEquals ("EPUB", $epub->format); + $this->assertEquals ("Carroll, Lewis - Alice's Adventures in Wonderland.epub", $epub->getUpdatedFilenameEpub ()); + $this->assertEquals ("Carroll, Lewis - Alice's Adventures in Wonderland.kepub.epub", $epub->getUpdatedFilenameKepub ()); + $this->assertEquals (dirname(__FILE__) . "/BaseWithSomeBooks/Lewis Carroll/Alice's Adventures in Wonderland (17)/Alice's Adventures in Wonderland - Lewis Carroll.epub", $epub->getLocalPath ()); + + $config['cops_use_url_rewriting'] = "1"; + $config['cops_provide_kepub'] = "1"; + $_SERVER["HTTP_USER_AGENT"] = "Kobo"; + $this->assertEquals ("download/20/Carroll%2C%20Lewis%20-%20Alice%27s%20Adventures%20in%20Wonderland.kepub.epub", $epub->getHtmlLink ()); + $this->assertEquals ("download/17/Alice%27s%20Adventures%20in%20Wonderland%20-%20Lewis%20Carroll.mobi", $mobi->getHtmlLink ()); + $_SERVER["HTTP_USER_AGENT"] = "Firefox"; + $this->assertEquals ("download/20/Alice%27s%20Adventures%20in%20Wonderland%20-%20Lewis%20Carroll.epub", $epub->getHtmlLink ()); + $config['cops_use_url_rewriting'] = "0"; + $this->assertEquals ("fetch.php?data=20&type=epub&id=17", $epub->getHtmlLink ()); + } + + public function testGetFilePath_Cover () { + $book = Book::getBookById(17); + + $this->assertEquals ("Lewis Carroll/Alice's Adventures in Wonderland (17)/cover.jpg", $book->getFilePath ("jpg", NULL, true)); + } + + public function testGetFilePath_Epub () { + $book = Book::getBookById(17); + + $this->assertEquals ("Lewis Carroll/Alice's Adventures in Wonderland (17)/Alice's Adventures in Wonderland - Lewis Carroll.epub", $book->getFilePath ("epub", 20, true)); + } + + public function testGetFilePath_Mobi () { + $book = Book::getBookById(17); + + $this->assertEquals ("Lewis Carroll/Alice's Adventures in Wonderland (17)/Alice's Adventures in Wonderland - Lewis Carroll.mobi", $book->getFilePath ("mobi", 17, true)); + } + + public function testGetDataFormat_EPUB () { + $book = Book::getBookById(17); + + // Get Alice MOBI=>17, PDF=>19, EPUB=>20 + $data = $book->getDataFormat ("EPUB"); + $this->assertEquals (20, $data->id); + } + + public function testGetDataFormat_MOBI () { + $book = Book::getBookById(17); + + // Get Alice MOBI=>17, PDF=>19, EPUB=>20 + $data = $book->getDataFormat ("MOBI"); + $this->assertEquals (17, $data->id); + } + + public function testGetDataFormat_PDF () { + $book = Book::getBookById(17); + + // Get Alice MOBI=>17, PDF=>19, EPUB=>20 + $data = $book->getDataFormat ("PDF"); + $this->assertEquals (19, $data->id); + } + + public function testGetDataFormat_NonAvailable () { + $book = Book::getBookById(17); + + // Get Alice MOBI=>17, PDF=>19, EPUB=>20 + $this->assertFalse ($book->getDataFormat ("FB2")); + } + + public function testGetMimeType_EPUB () { + $book = Book::getBookById(17); + + // Get Alice MOBI=>17, PDF=>19, EPUB=>20 + $data = $book->getDataFormat ("EPUB"); + $this->assertEquals ("application/epub+zip", $data->getMimeType ()); + } + + public function testGetMimeType_MOBI () { + $book = Book::getBookById(17); + + // Get Alice MOBI=>17, PDF=>19, EPUB=>20 + $data = $book->getDataFormat ("MOBI"); + $this->assertEquals ("application/x-mobipocket-ebook", $data->getMimeType ()); + } + + public function testGetMimeType_PDF () { + $book = Book::getBookById(17); + + // Get Alice MOBI=>17, PDF=>19, EPUB=>20 + $data = $book->getDataFormat ("PDF"); + $this->assertEquals ("application/pdf", $data->getMimeType ()); + } + + public function testGetMimeType_Finfo () { + $book = Book::getBookById(17); + + // Get Alice MOBI=>17, PDF=>19, EPUB=>20 + $data = $book->getDataFormat ("PDF"); + $this->assertEquals ("application/pdf", $data->getMimeType ()); + + // Alter a data to make a test for finfo_file if enabled + $data->extension = "ico"; + $data->format = "ICO"; + $data->name = "favicon"; + $data->book->path = realpath (dirname(__FILE__) . "/../"); + if (function_exists('finfo_open') === true) { + $this->assertEquals ("image/x-icon", $data->getMimeType ()); + } else { + $this->assertEquals ("application/octet-stream", $data->getMimeType ()); + } + } + + public function testTypeaheadSearch_Tag () + { + $_GET["page"] = Base::PAGE_OPENSEARCH_QUERY; + $_GET["query"] = "fic"; + $_GET["search"] = "1"; + + $array = JSONRenderer::getJson (); + + $this->assertCount (3, $array); + $this->assertEquals ("2 tags", $array[0]["title"]); + $this->assertEquals ("Fiction", $array[1]["title"]); + $this->assertEquals ("Science Fiction", $array[2]["title"]); + + $_GET["query"] = NULL; + $_GET["search"] = NULL; + } + + public function testTypeaheadSearch_BookAndAuthor () + { + $_GET["page"] = Base::PAGE_OPENSEARCH_QUERY; + $_GET["query"] = "car"; + $_GET["search"] = "1"; + + $array = JSONRenderer::getJson (); + + $this->assertCount (4, $array); + $this->assertEquals ("1 book", $array[0]["title"]); + $this->assertEquals ("A Study in Scarlet", $array[1]["title"]); + $this->assertEquals ("1 author", $array[2]["title"]); + $this->assertEquals ("Carroll, Lewis", $array[3]["title"]); + + $_GET["query"] = NULL; + $_GET["search"] = NULL; + } + + public function testTypeaheadSearch_AuthorAndSeries () + { + $_GET["page"] = Base::PAGE_OPENSEARCH_QUERY; + $_GET["query"] = "art"; + $_GET["search"] = "1"; + + $array = JSONRenderer::getJson (); + + $this->assertCount (5, $array); + $this->assertEquals ("1 author", $array[0]["title"]); + $this->assertEquals ("Doyle, Arthur Conan", $array[1]["title"]); + $this->assertEquals ("2 series", $array[2]["title"]); + $this->assertEquals ("D'Artagnan Romances", $array[3]["title"]); + + $_GET["query"] = NULL; + $_GET["search"] = NULL; + } + + public function testTypeaheadSearch_Publisher () + { + $_GET["page"] = Base::PAGE_OPENSEARCH_QUERY; + $_GET["query"] = "Macmillan"; + $_GET["search"] = "1"; + + $array = JSONRenderer::getJson (); + + $this->assertCount (3, $array); + $this->assertEquals ("2 publishers", $array[0]["title"]); + $this->assertEquals ("Macmillan and Co. London", $array[1]["title"]); + $this->assertEquals ("Macmillan Publishers USA", $array[2]["title"]); + + $_GET["query"] = NULL; + $_GET["search"] = NULL; + } + + public function testTypeaheadSearchWithIgnored_SingleCategory () + { + global $config; + $_GET["page"] = Base::PAGE_OPENSEARCH_QUERY; + $_GET["query"] = "car"; + $_GET["search"] = "1"; + + $config ['cops_ignored_categories'] = array ("author"); + $array = JSONRenderer::getJson (); + + $this->assertCount (2, $array); + $this->assertEquals ("1 book", $array[0]["title"]); + $this->assertEquals ("A Study in Scarlet", $array[1]["title"]); + + $_GET["query"] = NULL; + $_GET["search"] = NULL; + } + + public function testTypeaheadSearchWithIgnored_MultipleCategory () + { + global $config; + $_GET["page"] = Base::PAGE_OPENSEARCH_QUERY; + $_GET["query"] = "art"; + $_GET["search"] = "1"; + + $config ['cops_ignored_categories'] = array ("series"); + $array = JSONRenderer::getJson (); + + $this->assertCount (2, $array); + $this->assertEquals ("1 author", $array[0]["title"]); + $this->assertEquals ("Doyle, Arthur Conan", $array[1]["title"]); + + $_GET["query"] = NULL; + $_GET["search"] = NULL; + } + + public function testTypeaheadSearchMultiDatabase () + { + global $config; + $_GET["page"] = Base::PAGE_OPENSEARCH_QUERY; + $_GET["query"] = "art"; + $_GET["search"] = "1"; + $_GET["multi"] = "1"; + + $config['calibre_directory'] = array ("Some books" => dirname(__FILE__) . "/BaseWithSomeBooks/", + "One book" => dirname(__FILE__) . "/BaseWithOneBook/"); + + $array = JSONRenderer::getJson (); + + $this->assertCount (5, $array); + $this->assertEquals ("Some books", $array[0]["title"]); + $this->assertEquals ("1 author", $array[1]["title"]); + $this->assertEquals ("2 series", $array[2]["title"]); + $this->assertEquals ("One book", $array[3]["title"]); + $this->assertEquals ("1 book", $array[4]["title"]); + + $_GET["query"] = NULL; + $_GET["search"] = NULL; + } + + public function tearDown () { + Base::clearDb (); + } + +} \ No newline at end of file diff --git a/sources/test/config_local.php.sauce b/sources/test/config_local.php.sauce new file mode 100644 index 0000000..7e3c310 --- /dev/null +++ b/sources/test/config_local.php.sauce @@ -0,0 +1,17 @@ + "smtp.free.fr", + "smtp.username" => "", + "smtp.password" => "", + "smtp.secure" => "", + "address.from" => "cops@slucas.fr" + ); diff --git a/sources/test/coverage-checker.php b/sources/test/coverage-checker.php new file mode 100644 index 0000000..485ed12 --- /dev/null +++ b/sources/test/coverage-checker.php @@ -0,0 +1,43 @@ + +* +* @author Marco Pivetta +* @see http://ocramius.github.io/blog/automated-code-coverage-check-for-github-pull-requests-with-travis/ +*/ + +$inputFile = $argv[1]; +$percentage = min(100, max(0, (int) $argv[2])); + +if (!file_exists($inputFile)) { + echo 'Invalid input file provided'; + exit (0); +} + +if (!$percentage) { + throw new InvalidArgumentException('An integer checked percentage must be given as second parameter'); +} + +$xml = new SimpleXMLElement(file_get_contents($inputFile)); +$metrics = $xml->xpath('//metrics'); +$totalElements = 0; +$checkedElements = 0; + +foreach ($metrics as $metric) { + $totalElements += (int) $metric['elements']; + $checkedElements += (int) $metric['coveredelements']; +} + +$coverage = ($checkedElements / $totalElements) * 100; + +if ($coverage < $percentage) { + echo 'Code coverage is ' . $coverage . '%, which is below the accepted ' . $percentage . '%' . PHP_EOL; + exit(1); +} + +echo 'Code coverage is ' . $coverage . '% - OK!' . PHP_EOL; diff --git a/sources/test/customColumnsTest.php b/sources/test/customColumnsTest.php new file mode 100644 index 0000000..c972578 --- /dev/null +++ b/sources/test/customColumnsTest.php @@ -0,0 +1,1102 @@ + + */ + +require_once(dirname(__FILE__) . "/config_test.php"); + +class CustomColumnTest extends PHPUnit_Framework_TestCase +{ + public function testColumnType01() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_01"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(8); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_01")); + + $this->assertEquals(8, $coltype->customId); + $this->assertEquals("custom_01", $coltype->columnTitle); + $this->assertEquals("text", $coltype->datatype); + $this->assertEquals("CustomColumnTypeText", get_class($coltype)); + + $this->assertCount(3, $coltype->getAllCustomValues()); + $this->assertEquals("?page=14&custom=8", $coltype->getUriAllCustoms()); + $this->assertEquals("cops:custom:8", $coltype->getAllCustomsId()); + $this->assertEquals("custom_01", $coltype->getTitle()); + $this->assertEquals("Custom column example 01 (text)", $coltype->getDatabaseDescription()); + $this->assertEquals("Custom column example 01 (text)", $coltype->getDescription()); + $this->assertEquals(true, $coltype->isSearchable()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType01b() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_01b"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(16); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_01b")); + + $this->assertEquals(16, $coltype->customId); + $this->assertEquals("custom_01b", $coltype->columnTitle); + $this->assertEquals("text", $coltype->datatype); + $this->assertEquals("CustomColumnTypeText", get_class($coltype)); + + $this->assertCount(3, $coltype->getAllCustomValues()); + $this->assertEquals("?page=14&custom=16", $coltype->getUriAllCustoms()); + $this->assertEquals("cops:custom:16", $coltype->getAllCustomsId()); + $this->assertEquals("custom_01b", $coltype->getTitle()); + $this->assertEquals(NULL, $coltype->getDatabaseDescription()); + $this->assertEquals("Custom column 'custom_01b'", $coltype->getDescription()); + $this->assertEquals(true, $coltype->isSearchable()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType02() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_02"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(6); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_02")); + + $this->assertEquals(6, $coltype->customId); + $this->assertEquals("custom_02", $coltype->columnTitle); + $this->assertEquals("text", $coltype->datatype); + $this->assertEquals("CustomColumnTypeText", get_class($coltype)); + + $this->assertCount(3, $coltype->getAllCustomValues()); + $this->assertEquals("?page=14&custom=6", $coltype->getUriAllCustoms()); + $this->assertEquals("cops:custom:6", $coltype->getAllCustomsId()); + $this->assertEquals("custom_02", $coltype->getTitle()); + $this->assertEquals("Custom column example 02 (csv)", $coltype->getDatabaseDescription()); + $this->assertEquals("Custom column example 02 (csv)", $coltype->getDescription()); + $this->assertEquals(true, $coltype->isSearchable()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType03() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_03"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(7); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_03")); + + $this->assertEquals(7, $coltype->customId); + $this->assertEquals("custom_03", $coltype->columnTitle); + $this->assertEquals("comments", $coltype->datatype); + $this->assertEquals("CustomColumnTypeComment", get_class($coltype)); + + $this->assertEquals("?page=14&custom=7", $coltype->getUriAllCustoms()); + $this->assertEquals("cops:custom:7", $coltype->getAllCustomsId()); + $this->assertEquals("custom_03", $coltype->getTitle()); + $this->assertEquals("Custom column example 03 (long_text)", $coltype->getDatabaseDescription()); + $this->assertEquals("Custom column example 03 (long_text)", $coltype->getDescription()); + $this->assertEquals(false, $coltype->isSearchable()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType04() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_04"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(4); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_04")); + + $this->assertEquals(4, $coltype->customId); + $this->assertEquals("custom_04", $coltype->columnTitle); + $this->assertEquals("series", $coltype->datatype); + $this->assertEquals("CustomColumnTypeSeries", get_class($coltype)); + + $this->assertCount(3, $coltype->getAllCustomValues()); + $this->assertEquals("?page=14&custom=4", $coltype->getUriAllCustoms()); + $this->assertEquals("cops:custom:4", $coltype->getAllCustomsId()); + $this->assertEquals("custom_04", $coltype->getTitle()); + $this->assertEquals("Custom column example 04 (series_text)", $coltype->getDatabaseDescription()); + $this->assertEquals("Alphabetical index of the 3 series", $coltype->getDescription()); + $this->assertEquals(true, $coltype->isSearchable()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType05() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_05"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(5); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_05")); + + $this->assertEquals(5, $coltype->customId); + $this->assertEquals("custom_05", $coltype->columnTitle); + $this->assertEquals("enumeration", $coltype->datatype); + $this->assertEquals("CustomColumnTypeEnumeration", get_class($coltype)); + + $this->assertCount(4, $coltype->getAllCustomValues()); + $this->assertEquals("?page=14&custom=5", $coltype->getUriAllCustoms()); + $this->assertEquals("cops:custom:5", $coltype->getAllCustomsId()); + $this->assertEquals("custom_05", $coltype->getTitle()); + $this->assertEquals("Custom column example 05 (enum)", $coltype->getDatabaseDescription()); + $this->assertEquals("Alphabetical index of the 4 values", $coltype->getDescription()); + $this->assertEquals(true, $coltype->isSearchable()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType06() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_06"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(12); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_06")); + + $this->assertEquals(12, $coltype->customId); + $this->assertEquals("custom_06", $coltype->columnTitle); + $this->assertEquals("datetime", $coltype->datatype); + $this->assertEquals("CustomColumnTypeDate", get_class($coltype)); + + $this->assertCount(5, $coltype->getAllCustomValues()); + $this->assertEquals("?page=14&custom=12", $coltype->getUriAllCustoms()); + $this->assertEquals("cops:custom:12", $coltype->getAllCustomsId()); + $this->assertEquals("custom_06", $coltype->getTitle()); + $this->assertEquals("Custom column example 06 (date)", $coltype->getDatabaseDescription()); + $this->assertEquals("Custom column example 06 (date)", $coltype->getDescription()); + $this->assertEquals(true, $coltype->isSearchable()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType07() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_07"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(14); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_07")); + + $this->assertEquals(14, $coltype->customId); + $this->assertEquals("custom_07", $coltype->columnTitle); + $this->assertEquals("float", $coltype->datatype); + $this->assertEquals("CustomColumnTypeFloat", get_class($coltype)); + + $this->assertCount(6, $coltype->getAllCustomValues()); + $this->assertEquals("?page=14&custom=14", $coltype->getUriAllCustoms()); + $this->assertEquals("cops:custom:14", $coltype->getAllCustomsId()); + $this->assertEquals("custom_07", $coltype->getTitle()); + $this->assertEquals("Custom column example 07 (float)", $coltype->getDatabaseDescription()); + $this->assertEquals("Custom column example 07 (float)", $coltype->getDescription()); + $this->assertEquals(true, $coltype->isSearchable()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType08() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_08"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(10); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_08")); + + $this->assertEquals(10, $coltype->customId); + $this->assertEquals("custom_08", $coltype->columnTitle); + $this->assertEquals("int", $coltype->datatype); + $this->assertEquals("CustomColumnTypeInteger", get_class($coltype)); + + $this->assertCount(4, $coltype->getAllCustomValues()); + $this->assertEquals("?page=14&custom=10", $coltype->getUriAllCustoms()); + $this->assertEquals("cops:custom:10", $coltype->getAllCustomsId()); + $this->assertEquals("custom_08", $coltype->getTitle()); + $this->assertEquals("Custom column example 08 (int)", $coltype->getDatabaseDescription()); + $this->assertEquals("Custom column example 08 (int)", $coltype->getDescription()); + $this->assertEquals(true, $coltype->isSearchable()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType09() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_09"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(9); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_09")); + + $this->assertEquals(9, $coltype->customId); + $this->assertEquals("custom_09", $coltype->columnTitle); + $this->assertEquals("rating", $coltype->datatype); + $this->assertEquals("CustomColumnTypeRating", get_class($coltype)); + + $this->assertCount(6, $coltype->getAllCustomValues()); + $this->assertEquals("?page=14&custom=9", $coltype->getUriAllCustoms()); + $this->assertEquals("cops:custom:9", $coltype->getAllCustomsId()); + $this->assertEquals("custom_09", $coltype->getTitle()); + $this->assertEquals("Custom column example 09 (rating)", $coltype->getDatabaseDescription()); + $this->assertEquals("Index of ratings", $coltype->getDescription()); + $this->assertEquals(true, $coltype->isSearchable()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType10() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_10"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(11); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_10")); + + $this->assertEquals(11, $coltype->customId); + $this->assertEquals("custom_10", $coltype->columnTitle); + $this->assertEquals("bool", $coltype->datatype); + $this->assertEquals("CustomColumnTypeBool", get_class($coltype)); + + $this->assertCount(3, $coltype->getAllCustomValues()); + $this->assertEquals("?page=14&custom=11", $coltype->getUriAllCustoms()); + $this->assertEquals("cops:custom:11", $coltype->getAllCustomsId()); + $this->assertEquals("custom_10", $coltype->getTitle()); + $this->assertEquals("Custom column example 10 (bool)", $coltype->getDatabaseDescription()); + $this->assertEquals("Index of a boolean value", $coltype->getDescription()); + $this->assertEquals(true, $coltype->isSearchable()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType11() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_11"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(15); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_11")); + + $this->assertEquals(NULL, $coltype); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testColumnType12() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_12"); + Base::clearDb(); + + $coltype = CustomColumnType::createByCustomID(13); + + $this->assertEquals($coltype, CustomColumnType::createByLookup("custom_12")); + + $this->assertEquals(NULL, $coltype); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testInvalidColumn1() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_12"); + Base::clearDb(); + + $catch = false; + try { + CustomColumnType::createByCustomID(999); + } catch (Exception $e) { + $catch = true; + } + + $this->assertTrue($catch); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testInvalidColumn2() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_12"); + Base::clearDb(); + + $coltype = CustomColumnType::createByLookup("__ERR__"); + + $this->assertEquals(NULL, $coltype); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testIndexTypeAll() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_01", "custom_02", "custom_03", "custom_04", "custom_05", "custom_06", "custom_07", "custom_08", "custom_09", "custom_10"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_INDEX, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + $this->assertCount(15, $currentPage->entryArray); // Authors, Series, Publishers, Languages, custom, All, Recent + $this->assertEquals("custom_01", $currentPage->entryArray[ 4]->title); + $this->assertEquals("custom_02", $currentPage->entryArray[ 5]->title); + $this->assertEquals("custom_04", $currentPage->entryArray[ 6]->title); + $this->assertEquals("custom_05", $currentPage->entryArray[ 7]->title); + $this->assertEquals("custom_06", $currentPage->entryArray[ 8]->title); + $this->assertEquals("custom_07", $currentPage->entryArray[ 9]->title); + $this->assertEquals("custom_08", $currentPage->entryArray[10]->title); + $this->assertEquals("custom_09", $currentPage->entryArray[11]->title); + $this->assertEquals("custom_10", $currentPage->entryArray[12]->title); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testIndexType01() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_01"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_INDEX, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + $this->assertCount(7, $currentPage->entryArray); // Authors, Series, Publishers, Languages, custom, All, Recent + $this->assertEquals("custom_01", $currentPage->entryArray[4]->title); + $this->assertEquals("cops:custom:8", $currentPage->entryArray[4]->id); + $this->assertEquals("Custom column example 01 (text)", $currentPage->entryArray[4]->content); + $this->assertEquals(3, $currentPage->entryArray[4]->numberOfElement); + $this->assertEquals("text", $currentPage->entryArray[4]->contentType); + $this->assertEquals($currentPage->entryArray[4], CustomColumnType::createByCustomID(8)->getCount()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testIndexType02() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_02"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_INDEX, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + $this->assertCount(7, $currentPage->entryArray); // Authors, Series, Publishers, Languages, custom, All, Recent + $this->assertEquals("custom_02", $currentPage->entryArray[4]->title); + $this->assertEquals("cops:custom:6", $currentPage->entryArray[4]->id); + $this->assertEquals("Custom column example 02 (csv)", $currentPage->entryArray[4]->content); + $this->assertEquals(3, $currentPage->entryArray[4]->numberOfElement); + $this->assertEquals("text", $currentPage->entryArray[4]->contentType); + $this->assertEquals($currentPage->entryArray[4], CustomColumnType::createByCustomID(6)->getCount()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testIndexType03() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_03"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_INDEX, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + $this->assertCount(6, $currentPage->entryArray); // Authors, Series, Publishers, Languages, All, Recent + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testIndexType04() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_04"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_INDEX, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + $this->assertCount(7, $currentPage->entryArray); // Authors, Series, Publishers, Languages, custom, All, Recent + $this->assertEquals("custom_04", $currentPage->entryArray[4]->title); + $this->assertEquals("cops:custom:4", $currentPage->entryArray[4]->id); + $this->assertEquals("Alphabetical index of the 3 series", $currentPage->entryArray[4]->content); + $this->assertEquals(3, $currentPage->entryArray[4]->numberOfElement); + $this->assertEquals("series", $currentPage->entryArray[4]->contentType); + $this->assertEquals($currentPage->entryArray[4], CustomColumnType::createByCustomID(4)->getCount()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testIndexType05() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_05"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_INDEX, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + $this->assertCount(7, $currentPage->entryArray); // Authors, Series, Publishers, Languages, custom, All, Recent + $this->assertEquals("custom_05", $currentPage->entryArray[4]->title); + $this->assertEquals("cops:custom:5", $currentPage->entryArray[4]->id); + $this->assertEquals("Alphabetical index of the 4 values", $currentPage->entryArray[4]->content); + $this->assertEquals(4, $currentPage->entryArray[4]->numberOfElement); + $this->assertEquals("enumeration", $currentPage->entryArray[4]->contentType); + $this->assertEquals($currentPage->entryArray[4], CustomColumnType::createByCustomID(5)->getCount()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testIndexType06() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_06"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_INDEX, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + $this->assertCount(7, $currentPage->entryArray); // Authors, Series, Publishers, Languages, custom, All, Recent + $this->assertEquals("custom_06", $currentPage->entryArray[4]->title); + $this->assertEquals("cops:custom:12", $currentPage->entryArray[4]->id); + $this->assertEquals("Custom column example 06 (date)", $currentPage->entryArray[4]->content); + $this->assertEquals(5, $currentPage->entryArray[4]->numberOfElement); + $this->assertEquals("datetime", $currentPage->entryArray[4]->contentType); + $this->assertEquals($currentPage->entryArray[4], CustomColumnType::createByCustomID(12)->getCount()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testIndexType07() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_07"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_INDEX, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + $this->assertCount(7, $currentPage->entryArray); // Authors, Series, Publishers, Languages, custom, All, Recent + $this->assertEquals("custom_07", $currentPage->entryArray[4]->title); + $this->assertEquals("cops:custom:14", $currentPage->entryArray[4]->id); + $this->assertEquals("Custom column example 07 (float)", $currentPage->entryArray[4]->content); + $this->assertEquals(6, $currentPage->entryArray[4]->numberOfElement); + $this->assertEquals("float", $currentPage->entryArray[4]->contentType); + $this->assertEquals($currentPage->entryArray[4], CustomColumnType::createByCustomID(14)->getCount()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testIndexType08() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_08"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_INDEX, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + $this->assertCount(7, $currentPage->entryArray); // Authors, Series, Publishers, Languages, custom, All, Recent + $this->assertEquals("custom_08", $currentPage->entryArray[4]->title); + $this->assertEquals("cops:custom:10", $currentPage->entryArray[4]->id); + $this->assertEquals("Custom column example 08 (int)", $currentPage->entryArray[4]->content); + $this->assertEquals(4, $currentPage->entryArray[4]->numberOfElement); + $this->assertEquals("int", $currentPage->entryArray[4]->contentType); + $this->assertEquals($currentPage->entryArray[4], CustomColumnType::createByCustomID(10)->getCount()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testIndexType09() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_09"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_INDEX, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + $this->assertCount(7, $currentPage->entryArray); // Authors, Series, Publishers, Languages, custom, All, Recent + $this->assertEquals("custom_09", $currentPage->entryArray[4]->title); + $this->assertEquals("cops:custom:9", $currentPage->entryArray[4]->id); + $this->assertEquals("Index of ratings", $currentPage->entryArray[4]->content); + $this->assertEquals(6, $currentPage->entryArray[4]->numberOfElement); + $this->assertEquals("rating", $currentPage->entryArray[4]->contentType); + $this->assertEquals($currentPage->entryArray[4], CustomColumnType::createByCustomID(9)->getCount()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testIndexType10() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $config['cops_calibre_custom_column'] = array("custom_10"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_INDEX, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + $this->assertCount(7, $currentPage->entryArray); // Authors, Series, Publishers, Languages, custom, All, Recent + $this->assertEquals("custom_10", $currentPage->entryArray[4]->title); + $this->assertEquals("cops:custom:11", $currentPage->entryArray[4]->id); + $this->assertEquals("Index of a boolean value", $currentPage->entryArray[4]->content); + $this->assertEquals(3, $currentPage->entryArray[4]->numberOfElement); + $this->assertEquals("bool", $currentPage->entryArray[4]->contentType); + $this->assertEquals($currentPage->entryArray[4], CustomColumnType::createByCustomID(11)->getCount()); + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + $config['cops_calibre_custom_column'] = array(); + Base::clearDb(); + } + + public function testAllCustomsType01() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "8"; + Base::clearDb(); + $currentPage = Page::getPage(Base::PAGE_ALL_CUSTOMS, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + + $this->assertEquals("custom_01", $currentPage->title); + $this->assertCount(3, $currentPage->entryArray); + $this->assertEquals("cops:custom:8:3", $currentPage->entryArray[0]->id); + $this->assertEquals("cops:custom:8:1", $currentPage->entryArray[1]->id); + $this->assertEquals("cops:custom:8:2", $currentPage->entryArray[2]->id); + + + $_GET["custom"] = NULL; + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testAllCustomsType02() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "6"; + Base::clearDb(); + $currentPage = Page::getPage(Base::PAGE_ALL_CUSTOMS, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + + $this->assertEquals("custom_02", $currentPage->title); + $this->assertCount(3, $currentPage->entryArray); + $this->assertEquals("cops:custom:6:1", $currentPage->entryArray[0]->id); + $this->assertEquals("cops:custom:6:2", $currentPage->entryArray[1]->id); + $this->assertEquals("cops:custom:6:3", $currentPage->entryArray[2]->id); + + + $_GET["custom"] = NULL; + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testAllCustomsType04() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "4"; + Base::clearDb(); + $currentPage = Page::getPage(Base::PAGE_ALL_CUSTOMS, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + + $this->assertEquals("custom_04", $currentPage->title); + $this->assertCount(3, $currentPage->entryArray); + $this->assertEquals("cops:custom:4:4", $currentPage->entryArray[0]->id); + $this->assertEquals("cops:custom:4:5", $currentPage->entryArray[1]->id); + $this->assertEquals("cops:custom:4:6", $currentPage->entryArray[2]->id); + + + $_GET["custom"] = NULL; + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testAllCustomsType05() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "5"; + Base::clearDb(); + $currentPage = Page::getPage(Base::PAGE_ALL_CUSTOMS, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + + $this->assertEquals("custom_05", $currentPage->title); + $this->assertCount(4, $currentPage->entryArray); + $this->assertEquals("cops:custom:5:3", $currentPage->entryArray[0]->id); + $this->assertEquals("cops:custom:5:4", $currentPage->entryArray[1]->id); + $this->assertEquals("cops:custom:5:5", $currentPage->entryArray[2]->id); + $this->assertEquals("cops:custom:5:6", $currentPage->entryArray[3]->id); + + + $_GET["custom"] = NULL; + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testAllCustomsType06() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "12"; + Base::clearDb(); + $currentPage = Page::getPage(Base::PAGE_ALL_CUSTOMS, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + + $this->assertEquals("custom_06", $currentPage->title); + $this->assertCount(5, $currentPage->entryArray); + $this->assertEquals("cops:custom:12:2000-01-01", $currentPage->entryArray[0]->id); + $this->assertEquals("cops:custom:12:2000-01-02", $currentPage->entryArray[1]->id); + $this->assertEquals("cops:custom:12:2000-01-03", $currentPage->entryArray[2]->id); + $this->assertEquals("cops:custom:12:2016-04-20", $currentPage->entryArray[3]->id); + $this->assertEquals("cops:custom:12:2016-04-24", $currentPage->entryArray[4]->id); + + + $_GET["custom"] = NULL; + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testAllCustomsType07() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "14"; + Base::clearDb(); + $currentPage = Page::getPage(Base::PAGE_ALL_CUSTOMS, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + + $this->assertEquals("custom_07", $currentPage->title); + $this->assertCount(6, $currentPage->entryArray); + $this->assertEquals("cops:custom:14:-99.0", $currentPage->entryArray[0]->id); + $this->assertEquals("cops:custom:14:0.0", $currentPage->entryArray[1]->id); + $this->assertEquals("cops:custom:14:0.1", $currentPage->entryArray[2]->id); + $this->assertEquals("cops:custom:14:0.2", $currentPage->entryArray[3]->id); + $this->assertEquals("cops:custom:14:11.0", $currentPage->entryArray[4]->id); + $this->assertEquals("cops:custom:14:100000.0", $currentPage->entryArray[5]->id); + + + $_GET["custom"] = NULL; + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testAllCustomsType08() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "10"; + Base::clearDb(); + $currentPage = Page::getPage(Base::PAGE_ALL_CUSTOMS, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + + $this->assertEquals("custom_08", $currentPage->title); + $this->assertCount(4, $currentPage->entryArray); + $this->assertEquals("cops:custom:10:-2", $currentPage->entryArray[0]->id); + $this->assertEquals("cops:custom:10:-1", $currentPage->entryArray[1]->id); + $this->assertEquals("cops:custom:10:1", $currentPage->entryArray[2]->id); + $this->assertEquals("cops:custom:10:2", $currentPage->entryArray[3]->id); + + + $_GET["custom"] = NULL; + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testAllCustomsType09() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "9"; + Base::clearDb(); + $currentPage = Page::getPage(Base::PAGE_ALL_CUSTOMS, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + + $this->assertEquals("custom_09", $currentPage->title); + $this->assertCount(6, $currentPage->entryArray); + $this->assertEquals("cops:custom:9:0", $currentPage->entryArray[0]->id); + $this->assertEquals("cops:custom:9:2", $currentPage->entryArray[1]->id); + $this->assertEquals("cops:custom:9:4", $currentPage->entryArray[2]->id); + $this->assertEquals("cops:custom:9:6", $currentPage->entryArray[3]->id); + $this->assertEquals("cops:custom:9:8", $currentPage->entryArray[4]->id); + $this->assertEquals("cops:custom:9:10", $currentPage->entryArray[5]->id); + + + $_GET["custom"] = NULL; + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testAllCustomsType10() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "11"; + Base::clearDb(); + $currentPage = Page::getPage(Base::PAGE_ALL_CUSTOMS, NULL, NULL, "1"); + $currentPage->InitializeContent(); + + + $this->assertEquals("custom_10", $currentPage->title); + $this->assertCount(3, $currentPage->entryArray); + $this->assertEquals("cops:custom:11:-1", $currentPage->entryArray[0]->id); + $this->assertEquals("cops:custom:11:0", $currentPage->entryArray[1]->id); + $this->assertEquals("cops:custom:11:1", $currentPage->entryArray[2]->id); + + + $_GET["custom"] = NULL; + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testDetailTypeAllEntryIDs() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "11"; + $config['cops_calibre_custom_column'] = array("custom_01", "custom_02", "custom_03", "custom_04", "custom_05", "custom_06", "custom_07", "custom_08", "custom_09", "custom_10", "custom_11"); + Base::clearDb(); + + $currentPage = Page::getPage(Base::PAGE_CUSTOM_DETAIL, "0", NULL, "1"); + $currentPage->InitializeContent(); + + /* @var EntryBook[] $entries */ + $entries = $currentPage->entryArray; + + $this->assertCount(6, $entries); + + $customcolumnValues = $entries[0]->book->getCustomColumnValues($config['cops_calibre_custom_column']); + + $this->assertCount(10, $customcolumnValues); + + $this->assertEquals("cops:custom:8:1", $customcolumnValues[0]->getEntryId()); + $this->assertEquals("cops:custom:6:3", $customcolumnValues[1]->getEntryId()); + $this->assertEquals("cops:custom:7:3", $customcolumnValues[2]->getEntryId()); + $this->assertEquals("cops:custom:4:4", $customcolumnValues[3]->getEntryId()); + $this->assertEquals("cops:custom:5:6", $customcolumnValues[4]->getEntryId()); + $this->assertEquals("cops:custom:12:2016-04-24", $customcolumnValues[5]->getEntryId()); + $this->assertEquals("cops:custom:14:11.0", $customcolumnValues[6]->getEntryId()); + $this->assertEquals("cops:custom:10:-2", $customcolumnValues[7]->getEntryId()); + $this->assertEquals("cops:custom:9:2", $customcolumnValues[8]->getEntryId()); + $this->assertEquals("cops:custom:11:0", $customcolumnValues[9]->getEntryId()); + + $_GET["custom"] = NULL; + $config['cops_calibre_custom_column'] = array(); + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testRenderCustomColumns() + { + global $config; + + $_SERVER["HTTP_USER_AGENT"] = "Firefox"; + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "11"; + $config['cops_calibre_custom_column'] = array("custom_01", "custom_02", "custom_03", "custom_04", "custom_05", "custom_06", "custom_07", "custom_08", "custom_09", "custom_10", "custom_11"); + $config['cops_calibre_custom_column_list'] = array("custom_01", "custom_02", "custom_03", "custom_04", "custom_05", "custom_06", "custom_07", "custom_08", "custom_09", "custom_10", "custom_11"); + $config['cops_calibre_custom_column_preview'] = array("custom_01", "custom_02", "custom_03", "custom_04", "custom_05", "custom_06", "custom_07", "custom_08", "custom_09", "custom_10", "custom_11"); + Base::clearDb(); + + + $book = Book::getBookById(223); + $json = JSONRenderer::getBookContentArray($book); + + /* @var CustomColumn[] $custom */ + $custom = $json["customcolumns_list"]; + + $this->assertEquals("custom_01", $custom[0]['customColumnType']['columnTitle']); + $this->assertEquals("text_2", $custom[0]['htmlvalue']); + + $this->assertEquals("custom_02", $custom[1]['customColumnType']['columnTitle']); + $this->assertEquals("a", $custom[1]['htmlvalue']); + + $this->assertEquals("custom_03", $custom[2]['customColumnType']['columnTitle']); + $this->assertEquals("
    Not Set
    ", $custom[2]['htmlvalue']); + + $this->assertEquals("custom_04", $custom[3]['customColumnType']['columnTitle']); + $this->assertEquals("", $custom[3]['htmlvalue']); + + $this->assertEquals("custom_05", $custom[4]['customColumnType']['columnTitle']); + $this->assertEquals("val05", $custom[4]['htmlvalue']); + + $this->assertEquals("custom_06", $custom[5]['customColumnType']['columnTitle']); + $this->assertEquals("Not Set", $custom[5]['htmlvalue']); + + $this->assertEquals("custom_07", $custom[6]['customColumnType']['columnTitle']); + $this->assertEquals("100000.0", $custom[6]['htmlvalue']); + + $this->assertEquals("custom_08", $custom[7]['customColumnType']['columnTitle']); + $this->assertEquals("Not Set", $custom[7]['htmlvalue']); + + $this->assertEquals("custom_09", $custom[8]['customColumnType']['columnTitle']); + $this->assertEquals("Not Set", $custom[8]['htmlvalue']); + + $this->assertEquals("custom_10", $custom[9]['customColumnType']['columnTitle']); + $this->assertEquals("No", $custom[9]['htmlvalue']); + + $_SERVER["HTTP_USER_AGENT"] = ""; + $_GET["custom"] = NULL; + $config['cops_calibre_custom_column'] = array(); + $config['cops_calibre_custom_column_list'] = array(); + $config['cops_calibre_custom_column_preview'] = array(); + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testQueries() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "11"; + $config['cops_calibre_custom_column'] = array("custom_01", "custom_02", "custom_03", "custom_04", "custom_05", "custom_06", "custom_07", "custom_08", "custom_09", "custom_10", "custom_11"); + Base::clearDb(); + + + list($query, $params) = CustomColumnType::createByLookup("custom_01")->getCustom("1")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_02")->getCustom("3")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_03")->getCustom("3")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_04")->getCustom("4")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_05")->getCustom("6")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_06")->getCustom("2016-04-24")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_07")->getCustom("11.0")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_08")->getCustom("-2")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_09")->getCustom("0")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_09")->getCustom("1")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_10")->getCustom("-1")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_10")->getCustom("0")->getQuery(); + Book::getEntryArray($query, $params, 1); + + list($query, $params) = CustomColumnType::createByLookup("custom_10")->getCustom("1")->getQuery(); + Book::getEntryArray($query, $params, 1); + + $_GET["custom"] = NULL; + $config['cops_calibre_custom_column'] = array(); + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } + + public function testGetURI() + { + global $config; + + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithCustomColumns/"; + $_GET["custom"] = "11"; + $config['cops_calibre_custom_column'] = array("custom_01", "custom_02", "custom_03", "custom_04", "custom_05", "custom_06", "custom_07", "custom_08", "custom_09", "custom_10", "custom_11"); + Base::clearDb(); + + + $custom = CustomColumnType::createByLookup("custom_01")->getCustom("1"); + $this->assertEquals($custom->customColumnType->getQuery("1"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_02")->getCustom("3"); + $this->assertEquals($custom->customColumnType->getQuery("3"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_03")->getCustom("3"); + $this->assertEquals($custom->customColumnType->getQuery("3"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_04")->getCustom("4"); + $this->assertEquals($custom->customColumnType->getQuery("4"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_05")->getCustom("6"); + $this->assertEquals($custom->customColumnType->getQuery("6"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_06")->getCustom("2016-04-24"); + $this->assertEquals($custom->customColumnType->getQuery("2016-04-24"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_07")->getCustom("11.0"); + $this->assertEquals($custom->customColumnType->getQuery("11.0"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_08")->getCustom("-2"); + $this->assertEquals($custom->customColumnType->getQuery("-2"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_09")->getCustom("0"); + $this->assertEquals($custom->customColumnType->getQuery("0"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_09")->getCustom("1"); + $this->assertEquals($custom->customColumnType->getQuery("1"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_10")->getCustom("-1"); + $this->assertEquals($custom->customColumnType->getQuery("-1"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_10")->getCustom("0"); + $this->assertEquals($custom->customColumnType->getQuery("0"), $custom->getQuery()); + + $custom = CustomColumnType::createByLookup("custom_10")->getCustom("1"); + $this->assertEquals($custom->customColumnType->getQuery("1"), $custom->getQuery()); + + $_GET["custom"] = NULL; + $config['cops_calibre_custom_column'] = array(); + $config['calibre_directory'] = dirname(__FILE__) . "/BaseWithSomeBooks/"; + Base::clearDb(); + } +} \ No newline at end of file diff --git a/sources/test/jing.jar b/sources/test/jing.jar new file mode 100644 index 0000000..fe01514 Binary files /dev/null and b/sources/test/jing.jar differ diff --git a/sources/test/jsonTest.php b/sources/test/jsonTest.php new file mode 100644 index 0000000..9e481eb --- /dev/null +++ b/sources/test/jsonTest.php @@ -0,0 +1,72 @@ + + */ + +require_once (dirname(__FILE__) . "/config_test.php"); + +class JsonTest extends PHPUnit_Framework_TestCase +{ + public function testCompleteArray () { + global $config; + + $_SERVER["HTTP_USER_AGENT"] = "Firefox"; + $test = array (); + $test = JSONRenderer::addCompleteArray ($test); + $this->assertArrayHasKey ("c", $test); + $this->assertArrayHasKey ("version", $test ["c"]); + $this->assertArrayHasKey ("i18n", $test ["c"]); + $this->assertArrayHasKey ("url", $test ["c"]); + $this->assertArrayHasKey ("config", $test ["c"]); + + $this->assertFalse ($test ["c"]["url"]["thumbnailUrl"] == $test ["c"]["url"]["coverUrl"]); + + // The thumbnails should be the same as the covers + $config['cops_thumbnail_handling'] = "1"; + $test = array (); + $test = JSONRenderer::addCompleteArray ($test); + + $this->assertTrue ($test ["c"]["url"]["thumbnailUrl"] == $test ["c"]["url"]["coverUrl"]); + + // The thumbnails should be the same as the covers + $config['cops_thumbnail_handling'] = "/images.png"; + $test = array (); + $test = JSONRenderer::addCompleteArray ($test); + + $this->assertEquals ("/images.png", $test ["c"]["url"]["thumbnailUrl"]); + } + + public function testGetBookContentArrayWithoutSeries () { + $book = Book::getBookById(17); + $test = JSONRenderer::getBookContentArray($book); + + $this->assertEquals ("", $test ["seriesName"]); + $this->assertEquals ("1.0", $test ["seriesIndex"]); + $this->assertEquals ("", $test ["seriesCompleteName"]); + $this->assertEquals ("", $test ["seriesurl"]); + } + + public function testGetBookContentArrayWithSeries () { + $book = Book::getBookById(2); + + $test = JSONRenderer::getBookContentArray($book); + + $this->assertEquals ("Sherlock Holmes", $test ["seriesName"]); + $this->assertEquals ("6.0", $test ["seriesIndex"]); + $this->assertEquals ("Book 6.0 in the Sherlock Holmes series", $test ["seriesCompleteName"]); + $this->assertStringEndsWith ("?page=7&id=1", $test ["seriesurl"]); + } + + public function testGetFullBookContentArray () { + $book = Book::getBookById(17); + + $test = JSONRenderer::getFullBookContentArray($book); + + $this->assertCount (1, $test ["authors"]); + $this->assertCount (3, $test ["tags"]); + $this->assertCount (3, $test ["datas"]); + } +} \ No newline at end of file diff --git a/sources/test/mailTest.php b/sources/test/mailTest.php new file mode 100644 index 0000000..9b395cc --- /dev/null +++ b/sources/test/mailTest.php @@ -0,0 +1,67 @@ + + */ + +require_once (dirname(__FILE__) . "/config_test.php"); +require_once (dirname(__FILE__) . "/../sendtomail.php"); + +class MailTest extends PHPUnit_Framework_TestCase +{ + public function testCheckConfigurationOk () { + global $config; + + $this->assertFalse(checkConfiguration ()); + } + + public function testCheckConfigurationNull () { + global $config; + $config['cops_mail_configuration'] = NULL; + + $this->assertStringStartsWith("NOK", checkConfiguration ()); + } + + public function testCheckConfigurationNotArray () { + global $config; + $config['cops_mail_configuration'] = "Test"; + + $this->assertStringStartsWith("NOK", checkConfiguration ()); + } + + public function testCheckConfigurationSmtpEmpty () { + global $config; + $config['cops_mail_configuration']["smtp.host"] = ""; + + $this->assertStringStartsWith("NOK", checkConfiguration ()); + } + + public function testCheckConfigurationEmailEmpty () { + global $config; + $config['cops_mail_configuration']["address.from"] = ""; + + $this->assertStringStartsWith("NOK", checkConfiguration ()); + } + + public function testCheckConfigurationEmailNotValid () { + global $config; + $config['cops_mail_configuration']["address.from"] = "a"; + + $this->markTestIncomplete(); + } + + public function testCheckRequest () { + $this->assertFalse (checkRequest (12, "a@a.com")); + } + + public function testCheckRequestNoData () { + $this->assertStringStartsWith ("No", checkRequest (NULL, "a@a.com")); + } + + public function testCheckRequestNoEmail () { + $this->assertStringStartsWith ("No", checkRequest (12, NULL)); + } + +} \ No newline at end of file diff --git a/sources/test/opds-relax-ng/atom.rng b/sources/test/opds-relax-ng/atom.rng new file mode 100644 index 0000000..f1407fc --- /dev/null +++ b/sources/test/opds-relax-ng/atom.rng @@ -0,0 +1,598 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + html + + + + + + + + + xhtml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An atom:feed must have an atom:author unless all of its atom:entry children have an atom:author. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + An atom:entry must have at least one atom:link element with a rel attribute of 'alternate' or an atom:content. + + + An atom:entry must have an atom:author if its feed does not. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + html + + + + + + + + + + + + + xhtml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + [^:]* + + + + + + .+/.+ + + + + + + [A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})* + + + + + + + + + + .+@.+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + xml:base + xml:lang + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/test/opds-relax-ng/opds_catalog_1_1.rng b/sources/test/opds-relax-ng/opds_catalog_1_1.rng new file mode 100644 index 0000000..e4ed2fb --- /dev/null +++ b/sources/test/opds-relax-ng/opds_catalog_1_1.rng @@ -0,0 +1,599 @@ + + + + + + + + http://opds-spec.org/acquisition/buy + http://opds-spec.org/acquisition/borrow + http://opds-spec.org/acquisition/subscribe + http://opds-spec.org/acquisition/sample + + + + + + + http://opds-spec.org/acquisition/borrow + http://opds-spec.org/acquisition/subscribe + http://opds-spec.org/acquisition/sample + + + + + + + + + + xml:base + xml:lang + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://opds-spec.org/facet + + + + + + + + true + + + + + + + http://opds-spec.org/acquisition/buy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .*[ <>{}|^`"\\\n\r\t].* + + + + + + + + + + + text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0 + + + + + + + AED + AFN + ALL + AMD + ANG + AOA + ARS + AUD + AWG + AZN + BAM + BBD + BDT + BGN + BHD + BIF + BMD + BND + BOB + BOV + BRL + BSD + BTN + BWP + BYR + BZD + CAD + CDF + CHE + CHF + CHW + CLF + CLP + CNY + COP + COU + CRC + CUC + CUP + CVE + CZK + DJF + DKK + DOP + DZD + EEK + EGP + ERN + ETB + EUR + FJD + FKP + GBP + GEL + GHS + GIP + GMD + GNF + GTQ + GYD + HKD + HNL + HRK + HTG + HUF + IDR + ILS + INR + IQD + IRR + ISK + JMD + JOD + JPY + KES + KGS + KHR + KMF + KPW + KRW + KWD + KYD + KZT + LAK + LBP + LKR + LRD + LSL + LTL + LVL + LYD + MAD + MDL + MGA + MKD + MMK + MNT + MOP + MRO + MUR + MVR + MWK + MXN + MXV + MYR + MZN + NAD + NGN + NIO + NOK + NPR + NZD + OMR + PAB + PEN + PGK + PHP + PKR + PLN + PYG + QAR + RON + RSD + RUB + RWF + SAR + SBD + SCR + SDG + SEK + SGD + SHP + SLL + SOS + SRD + STD + SVC + SYP + SZL + THB + TJS + TMT + TND + TOP + TRY + TTD + TWD + TZS + UAH + UGX + USD + USN + USS + UYI + UYU + UZS + VEF + VND + VUV + WST + XAF + XAG + XAU + XBA + XBB + XBC + XBD + XCD + XDR + XFU + XOF + XPD + XPF + XPT + XTS + XXX + YER + ZAR + ZMK + ZWL + 008 + 012 + 032 + 036 + 044 + 048 + 050 + 051 + 052 + 060 + 064 + 068 + 072 + 084 + 090 + 096 + 104 + 108 + 116 + 124 + 132 + 136 + 144 + 152 + 156 + 170 + 174 + 188 + 191 + 192 + 203 + 208 + 214 + 222 + 230 + 232 + 233 + 238 + 242 + 262 + 270 + 292 + 320 + 324 + 328 + 332 + 340 + 344 + 348 + 352 + 356 + 360 + 364 + 368 + 376 + 388 + 392 + 398 + 400 + 404 + 408 + 410 + 414 + 417 + 418 + 422 + 426 + 428 + 430 + 434 + 440 + 446 + 454 + 458 + 462 + 478 + 480 + 484 + 496 + 498 + 504 + 512 + 516 + 524 + 532 + 533 + 548 + 554 + 558 + 566 + 578 + 586 + 590 + 598 + 600 + 604 + 608 + 634 + 643 + 646 + 654 + 678 + 682 + 690 + 694 + 702 + 704 + 706 + 710 + 748 + 752 + 756 + 760 + 764 + 776 + 780 + 784 + 788 + 800 + 807 + 818 + 826 + 834 + 840 + 858 + 860 + 882 + 886 + 894 + 901 + 931 + 932 + 934 + 936 + 937 + 938 + 940 + 941 + 943 + 944 + 946 + 947 + 948 + 949 + 950 + 951 + 952 + 953 + 955 + 956 + 957 + 958 + 959 + 960 + 961 + 962 + 963 + 964 + 968 + 969 + 970 + 971 + 972 + 973 + 974 + 975 + 976 + 977 + 978 + 979 + 980 + 981 + 984 + 985 + 986 + 990 + 997 + 998 + 999 + + + diff --git a/sources/test/opds-relax-ng/opensearchdescription.rng b/sources/test/opds-relax-ng/opensearchdescription.rng new file mode 100644 index 0000000..7b71ada --- /dev/null +++ b/sources/test/opds-relax-ng/opensearchdescription.rng @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + + 1024 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + get + post + GET + POST + + + + + + + + get + post + GET + POST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 256 + + + + + + + + 48 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 256 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 64 + + + + + + + + 256 + + + + + + + + open + limited + private + closed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sources/test/pageMultidatabaseTest.php b/sources/test/pageMultidatabaseTest.php new file mode 100644 index 0000000..530b072 --- /dev/null +++ b/sources/test/pageMultidatabaseTest.php @@ -0,0 +1,77 @@ + + */ + +require_once (dirname(__FILE__) . "/config_test.php"); + +class PageMultiDatabaseTest extends PHPUnit_Framework_TestCase +{ + public function testPageIndex () + { + global $config; + $config['calibre_directory'] = array ("Some books" => dirname(__FILE__) . "/BaseWithSomeBooks/", + "One book" => dirname(__FILE__) . "/BaseWithOneBook/"); + $page = Base::PAGE_INDEX; + $query = NULL; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ($config['cops_title_default'], $currentPage->title); + $this->assertCount (2, $currentPage->entryArray); + $this->assertEquals ("Some books", $currentPage->entryArray [0]->title); + $this->assertEquals ("15 books", $currentPage->entryArray [0]->content); + $this->assertEquals (15, $currentPage->entryArray [0]->numberOfElement); + $this->assertEquals ("One book", $currentPage->entryArray [1]->title); + $this->assertEquals ("1 book", $currentPage->entryArray [1]->content); + $this->assertEquals (1, $currentPage->entryArray [1]->numberOfElement); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + /** + * @dataProvider providerSearch + */ + public function testPageSearchXXX ($maxItem) + { + global $config; + $config['calibre_directory'] = array ("Some books" => dirname(__FILE__) . "/BaseWithSomeBooks/", + "One book" => dirname(__FILE__) . "/BaseWithOneBook/"); + $page = Base::PAGE_OPENSEARCH_QUERY; + $query = "art"; + $qid = NULL; + $n = "1"; + + // Issue 124 + $config['cops_max_item_per_page'] = $maxItem; + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + + $this->assertEquals ("Search result for *art*", $currentPage->title); + $this->assertCount (2, $currentPage->entryArray); + $this->assertEquals ("Some books", $currentPage->entryArray [0]->title); + $this->assertEquals ("11 books", $currentPage->entryArray [0]->content); + $this->assertEquals ("One book", $currentPage->entryArray [1]->title); + $this->assertEquals ("1 book", $currentPage->entryArray [1]->content); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function providerSearch () + { + return array ( + array (2), + array (-1) + ); + } + + public static function tearDownAfterClass () { + Base::clearDb (); + } + +} diff --git a/sources/test/pageTest.php b/sources/test/pageTest.php new file mode 100644 index 0000000..dc631ff --- /dev/null +++ b/sources/test/pageTest.php @@ -0,0 +1,964 @@ + + */ + +require_once (dirname(__FILE__) . "/config_test.php"); + +class PageTest extends PHPUnit_Framework_TestCase +{ + public function testPageIndex () + { + global $config; + $page = Base::PAGE_INDEX; + $query = NULL; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ($config['cops_title_default'], $currentPage->title); + $this->assertCount (8, $currentPage->entryArray); + $this->assertEquals ("Authors", $currentPage->entryArray [0]->title); + $this->assertEquals ("Alphabetical index of the 6 authors", $currentPage->entryArray [0]->content); + $this->assertEquals (6, $currentPage->entryArray [0]->numberOfElement); + $this->assertEquals ("Series", $currentPage->entryArray [1]->title); + $this->assertEquals ("Alphabetical index of the 4 series", $currentPage->entryArray [1]->content); + $this->assertEquals (4, $currentPage->entryArray [1]->numberOfElement); + $this->assertEquals ("Publishers", $currentPage->entryArray [2]->title); + $this->assertEquals ("Alphabetical index of the 6 publishers", $currentPage->entryArray [2]->content); + $this->assertEquals (6, $currentPage->entryArray [2]->numberOfElement); + $this->assertEquals ("Tags", $currentPage->entryArray [3]->title); + $this->assertEquals ("Alphabetical index of the 11 tags", $currentPage->entryArray [3]->content); + $this->assertEquals (11, $currentPage->entryArray [3]->numberOfElement); + $this->assertEquals ("Ratings", $currentPage->entryArray [4]->title); + $this->assertEquals ("3 ratings", $currentPage->entryArray [4]->content); + $this->assertEquals (3, $currentPage->entryArray [4]->numberOfElement); + $this->assertEquals ("Languages", $currentPage->entryArray [5]->title); + $this->assertEquals ("Alphabetical index of the 2 languages", $currentPage->entryArray [5]->content); + $this->assertEquals (2, $currentPage->entryArray [5]->numberOfElement); + $this->assertEquals ("All books", $currentPage->entryArray [6]->title); + $this->assertEquals ("Alphabetical index of the 15 books", $currentPage->entryArray [6]->content); + $this->assertEquals (15, $currentPage->entryArray [6]->numberOfElement); + $this->assertEquals ("Recent additions", $currentPage->entryArray [7]->title); + $this->assertEquals ("50 most recent books", $currentPage->entryArray [7]->content); + $this->assertEquals (50, $currentPage->entryArray [7]->numberOfElement); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageIndexWithIgnored () + { + global $config; + $page = Base::PAGE_INDEX; + $query = NULL; + $qid = NULL; + $n = "1"; + + $config ['cops_ignored_categories'] = array ("author", "series", "tag", "publisher", "language"); + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ($config['cops_title_default'], $currentPage->title); + $this->assertCount (3, $currentPage->entryArray); + $this->assertEquals ("Ratings", $currentPage->entryArray [0]->title); + $this->assertEquals ("All books", $currentPage->entryArray [1]->title); + $this->assertEquals ("Alphabetical index of the 15 books", $currentPage->entryArray [1]->content); + $this->assertEquals ("Recent additions", $currentPage->entryArray [2]->title); + $this->assertEquals ("50 most recent books", $currentPage->entryArray [2]->content); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageIndexWithCustomColumn_Type1 () + { + global $config; + $page = Base::PAGE_INDEX; + $query = NULL; + $qid = NULL; + $n = "1"; + + $config['cops_calibre_custom_column'] = array ("type1"); + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertCount (9, $currentPage->entryArray); + $this->assertEquals ("Type1", $currentPage->entryArray [6]->title); + $this->assertEquals ("Custom column 'Type1'", $currentPage->entryArray [6]->content); + $this->assertEquals (2, $currentPage->entryArray [6]->numberOfElement); + + $config['cops_calibre_custom_column'] = array (); + } + + public function testPageIndexWithCustomColumn_Type2 () + { + global $config; + $page = Base::PAGE_INDEX; + $query = NULL; + $qid = NULL; + $n = "1"; + + $config['cops_calibre_custom_column'] = array ("type2"); + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertCount (9, $currentPage->entryArray); + $this->assertEquals ("Type2", $currentPage->entryArray [6]->title); + $this->assertEquals ("Custom column 'Type2'", $currentPage->entryArray [6]->content); + $this->assertEquals (3, $currentPage->entryArray [6]->numberOfElement); + + $config['cops_calibre_custom_column'] = array (); + } + + public function testPageIndexWithCustomColumn_Type4 () + { + global $config; + $page = Base::PAGE_INDEX; + $query = NULL; + $qid = NULL; + $n = "1"; + + $config['cops_calibre_custom_column'] = array ("type4"); + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertCount (9, $currentPage->entryArray); + $this->assertEquals ("Type4", $currentPage->entryArray [6]->title); + $this->assertEquals ("Alphabetical index of the 2 series", $currentPage->entryArray [6]->content); + $this->assertEquals (2, $currentPage->entryArray [6]->numberOfElement); + + $config['cops_calibre_custom_column'] = array (); + } + + public function testPageIndexWithCustomColumn_ManyTypes () + { + global $config; + $page = Base::PAGE_INDEX; + $query = NULL; + $qid = NULL; + $n = "1"; + + $config['cops_calibre_custom_column'] = array ("type1", "type2", "type4"); + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertCount (11, $currentPage->entryArray); + + $config['cops_calibre_custom_column'] = array (); + } + + public function testPageAllCustom_Type4 () + { + $page = Base::PAGE_ALL_CUSTOMS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $_GET ["custom"] = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Type4", $currentPage->title); + $this->assertCount (2, $currentPage->entryArray); + $this->assertEquals ("SeriesLike", $currentPage->entryArray [0]->title); + $this->assertEquals (2, $currentPage->entryArray [0]->numberOfElement); + $this->assertFalse ($currentPage->ContainsBook ()); + + $_GET ["custom"] = NULL; + } + + public function testPageAllCustom_Type2 () + { + $page = Base::PAGE_ALL_CUSTOMS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $_GET ["custom"] = "2"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Type2", $currentPage->title); + $this->assertCount (3, $currentPage->entryArray); + $this->assertEquals ("tag1", $currentPage->entryArray [0]->title); + $this->assertEquals (2, $currentPage->entryArray [0]->numberOfElement); + $this->assertFalse ($currentPage->ContainsBook ()); + + $_GET ["custom"] = NULL; + } + + public function testPageAllCustom_Type1 () + { + $page = Base::PAGE_ALL_CUSTOMS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $_GET ["custom"] = "3"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Type1", $currentPage->title); + $this->assertCount (2, $currentPage->entryArray); + $this->assertEquals ("other", $currentPage->entryArray [0]->title); + $this->assertEquals (1, $currentPage->entryArray [0]->numberOfElement); + $this->assertFalse ($currentPage->ContainsBook ()); + + $_GET ["custom"] = NULL; + } + + public function testPageCustomDetail_Type4 () + { + $page = Base::PAGE_CUSTOM_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + + $_GET ["custom"] = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("SeriesLike", $currentPage->title); + $this->assertCount (2, $currentPage->entryArray); + $this->assertEquals ("Alice's Adventures in Wonderland", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + + $_GET ["custom"] = NULL; + } + + public function testPageCustomDetail_Type2 () + { + $page = Base::PAGE_CUSTOM_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + + $_GET ["custom"] = "2"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("tag1", $currentPage->title); + $this->assertCount (2, $currentPage->entryArray); + $this->assertEquals ("Alice's Adventures in Wonderland", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + + $_GET ["custom"] = NULL; + } + + public function testPageCustomDetail_Type1 () + { + $page = Base::PAGE_CUSTOM_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + + $_GET ["custom"] = "3"; + $qid = "2"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("other", $currentPage->title); + $this->assertCount (1, $currentPage->entryArray); + $this->assertEquals ("A Study in Scarlet", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + + $_GET ["custom"] = NULL; + } + + public function testPageAllAuthors_WithFullName () + { + global $config; + $page = Base::PAGE_ALL_AUTHORS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $config['cops_author_split_first_letter'] = "0"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Authors", $currentPage->title); + $this->assertCount (6, $currentPage->entryArray); + $this->assertEquals ("Carroll, Lewis", $currentPage->entryArray [0]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + + $config['cops_author_split_first_letter'] = "1"; + } + + public function testPageAllAuthors_SplittedByFirstLetter () + { + global $config; + $page = Base::PAGE_ALL_AUTHORS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Authors", $currentPage->title); + $this->assertCount (5, $currentPage->entryArray); + $this->assertEquals ("C", $currentPage->entryArray [0]->title); + $this->assertEquals (1, $currentPage->entryArray [0]->numberOfElement); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageAuthorsFirstLetter () + { + $page = Base::PAGE_AUTHORS_FIRST_LETTER; + $query = NULL; + $qid = "C"; + $n = "1"; + + // Author Lewis Carroll + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("1 author starting with C", $currentPage->title); + $this->assertCount (1, $currentPage->entryArray); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageAuthorsDetail_FirstPage () + { + global $config; + $page = Base::PAGE_AUTHOR_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + $_SERVER['QUERY_STRING'] = "page=" . Base::PAGE_AUTHOR_DETAIL . "&id=1&n=1"; + + $config['cops_max_item_per_page'] = 2; + + // First page + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Arthur Conan Doyle", $currentPage->title); + $this->assertEquals (4, $currentPage->getMaxPage ()); + $this->assertCount (2, $currentPage->entryArray); + $this->assertTrue ($currentPage->ContainsBook ()); + $this->assertTrue ($currentPage->IsPaginated ()); + $this->assertNull ($currentPage->getPrevLink ()); + + $config['cops_max_item_per_page'] = -1; + } + + public function testPageAuthorsDetail_LastPage () + { + global $config; + $page = Base::PAGE_AUTHOR_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + $_SERVER['QUERY_STRING'] = "page=" . Base::PAGE_AUTHOR_DETAIL . "&id=1&n=1"; + + // Last page + $config['cops_max_item_per_page'] = 5; + $n = "2"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Arthur Conan Doyle", $currentPage->title); + $this->assertEquals (2, $currentPage->getMaxPage ()); + $this->assertCount (3, $currentPage->entryArray); + $this->assertTrue ($currentPage->ContainsBook ()); + $this->assertTrue ($currentPage->IsPaginated ()); + $this->assertNull ($currentPage->getNextLink ()); + + // No pagination + $config['cops_max_item_per_page'] = -1; + } + + public function testPageAuthorsDetail_NoPagination () + { + global $config; + $page = Base::PAGE_AUTHOR_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + $_SERVER['QUERY_STRING'] = "page=" . Base::PAGE_AUTHOR_DETAIL . "&id=1&n=1"; + + // No pagination + $config['cops_max_item_per_page'] = -1; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Arthur Conan Doyle", $currentPage->title); + $this->assertCount (8, $currentPage->entryArray); + $this->assertTrue ($currentPage->ContainsBook ()); + $this->assertFalse ($currentPage->IsPaginated ()); + } + + public function testPageAllBooks_WithFullName () + { + global $config; + $page = Base::PAGE_ALL_BOOKS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $config['cops_titles_split_first_letter'] = 0; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("All books", $currentPage->title); + $this->assertCount (15, $currentPage->entryArray); + $this->assertEquals ("The Adventures of Sherlock Holmes", $currentPage->entryArray [0]->title); + $this->assertEquals ("Alice's Adventures in Wonderland", $currentPage->entryArray [1]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + + $config['cops_titles_split_first_letter'] = 1; + } + + public function testPageAllBooks_SplittedByFirstLetter () + { + global $config; + $page = Base::PAGE_ALL_BOOKS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("All books", $currentPage->title); + $this->assertCount (9, $currentPage->entryArray); + $this->assertEquals ("A", $currentPage->entryArray [0]->title); + $this->assertEquals ("C", $currentPage->entryArray [1]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageAllBooksByLetter () + { + $page = Base::PAGE_ALL_BOOKS_LETTER; + $query = NULL; + $qid = "C"; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("3 books starting with C", $currentPage->title); + $this->assertCount (3, $currentPage->entryArray); + $this->assertEquals ("The Call of the Wild", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + } + + public function testPageAllSeries () + { + $page = Base::PAGE_ALL_SERIES; + $query = NULL; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Series", $currentPage->title); + $this->assertCount (4, $currentPage->entryArray); + $this->assertEquals ("D'Artagnan Romances", $currentPage->entryArray [0]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageSeriesDetail () + { + $page = Base::PAGE_SERIE_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Sherlock Holmes", $currentPage->title); + $this->assertCount (7, $currentPage->entryArray); + $this->assertEquals ("A Study in Scarlet", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + } + + public function testPageAllPublishers () + { + $page = Base::PAGE_ALL_PUBLISHERS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Publishers", $currentPage->title); + $this->assertCount (6, $currentPage->entryArray); + $this->assertEquals ("D. Appleton and Company", $currentPage->entryArray [0]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPagePublishersDetail () + { + $page = Base::PAGE_PUBLISHER_DETAIL; + $query = NULL; + $qid = "6"; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Strand Magazine", $currentPage->title); + $this->assertCount (8, $currentPage->entryArray); + $this->assertEquals ("The Return of Sherlock Holmes", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + } + + public function testPageAllTags () + { + $page = Base::PAGE_ALL_TAGS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Tags", $currentPage->title); + $this->assertCount (11, $currentPage->entryArray); + $this->assertEquals ("Action & Adventure", $currentPage->entryArray [0]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageTagDetail () + { + $page = Base::PAGE_TAG_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Fiction", $currentPage->title); + $this->assertCount (14, $currentPage->entryArray); + $this->assertEquals ("The Adventures of Sherlock Holmes", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + } + + public function testPageAllLanguages () + { + $page = Base::PAGE_ALL_LANGUAGES; + $query = NULL; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Languages", $currentPage->title); + $this->assertCount (2, $currentPage->entryArray); + $this->assertEquals ("English", $currentPage->entryArray [0]->title); + $this->assertEquals ("French", $currentPage->entryArray [1]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageLanguageDetail () + { + $page = Base::PAGE_LANGUAGE_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("English", $currentPage->title); + $this->assertCount (14, $currentPage->entryArray); + $this->assertEquals ("The Adventures of Sherlock Holmes", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + } + + public function testPageAllRatings () + { + $page = Base::PAGE_ALL_RATINGS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Ratings", $currentPage->title); + $this->assertCount (3, $currentPage->entryArray); + $this->assertEquals ("2 stars", $currentPage->entryArray [0]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageRatingDetail () + { + $page = Base::PAGE_RATING_DETAIL; + $query = NULL; + $qid = "1"; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("5 stars", $currentPage->title); + $this->assertCount (4, $currentPage->entryArray); + $this->assertEquals ("The Adventures of Sherlock Holmes", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + } + + public function testPageRecent () + { + $page = Base::PAGE_ALL_RECENT_BOOKS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Recent additions", $currentPage->title); + $this->assertCount (15, $currentPage->entryArray); + $this->assertEquals ("La curée", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + } + + public function testPageRecent_WithFacets_IncludedTag () + { + $page = Base::PAGE_ALL_RECENT_BOOKS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $_GET["tag"] = "Historical"; + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Recent additions", $currentPage->title); + $this->assertCount (2, $currentPage->entryArray); + $this->assertEquals ("Twenty Years After", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + + $_GET["tag"] = NULL; + } + + public function testPageRecent_WithFacets_ExcludedTag () + { + $page = Base::PAGE_ALL_RECENT_BOOKS; + $query = NULL; + $qid = NULL; + $n = "1"; + + $_GET["tag"] = "!Romance"; + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Recent additions", $currentPage->title); + $this->assertCount (13, $currentPage->entryArray); + $this->assertEquals ("La curée", $currentPage->entryArray [0]->title); + $this->assertTrue ($currentPage->ContainsBook ()); + + $_GET["tag"] = NULL; + } + + public function testPageBookDetail () + { + $page = Base::PAGE_BOOK_DETAIL; + $query = NULL; + $qid = "2"; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("The Return of Sherlock Holmes", $currentPage->title); + $this->assertCount (0, $currentPage->entryArray); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageSearch_WithOnlyBooksReturned () + { + global $config; + $page = Base::PAGE_OPENSEARCH_QUERY; + $query = "alice"; + $qid = NULL; + $n = "1"; + + // Only books returned + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *alice*", $currentPage->title); + $this->assertCount (1, $currentPage->entryArray); + $this->assertEquals ("Search result for *alice* in books", $currentPage->entryArray [0]->title); + $this->assertEquals ("2 books", $currentPage->entryArray [0]->content); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageSearch_WithAuthorsIgnored () + { + global $config; + $page = Base::PAGE_OPENSEARCH_QUERY; + // Match Lewis Caroll & Scarlet + $query = "car"; + $qid = NULL; + $n = "1"; + + $config ['cops_ignored_categories'] = array ("author"); + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *car*", $currentPage->title); + $this->assertCount (1, $currentPage->entryArray); + $this->assertEquals ("Search result for *car* in books", $currentPage->entryArray [0]->title); + $this->assertEquals ("1 book", $currentPage->entryArray [0]->content); + $this->assertFalse ($currentPage->ContainsBook ()); + + $config ['cops_ignored_categories'] = array (); + } + + public function testPageSearch_WithTwoCategories () + { + global $config; + $page = Base::PAGE_OPENSEARCH_QUERY; + // Match Lewis Caroll & Scarlet + $query = "car"; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *car*", $currentPage->title); + $this->assertCount (2, $currentPage->entryArray); + $this->assertEquals ("Search result for *car* in books", $currentPage->entryArray [0]->title); + $this->assertEquals ("1 book", $currentPage->entryArray [0]->content); + $this->assertEquals ("Search result for *car* in authors", $currentPage->entryArray [1]->title); + $this->assertEquals ("1 author", $currentPage->entryArray [1]->content); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + /** + * @dataProvider providerAccentuatedCharacters + */ + public function testPageSearch_WithAccentuatedCharacters ($query, $count, $content) + { + global $config; + $page = Base::PAGE_OPENSEARCH_QUERY; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *$query*", $currentPage->title); + $this->assertCount ($count, $currentPage->entryArray); + if ($count > 0) { + $this->assertEquals ($content, $currentPage->entryArray [0]->content); + } + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function providerAccentuatedCharacters () + { + return array ( + array ("curée", 1, "1 book"), + array ("Émile zola", 1, "1 author"), + array ("émile zola", 0, NULL), // With standard search upper does not work with diacritics + array ("Littérature", 1, "1 tag"), + array ("Eugène Fasquelle", 1, "1 publisher") + ); + } + + /** + * @dataProvider providerNormalizedSearch + */ + public function testPageSearch_WithNormalizedSearch_Book ($query, $count, $content) + { + global $config; + $page = Base::PAGE_OPENSEARCH_QUERY; + $qid = NULL; + $n = "1"; + $config ['cops_normalized_search'] = "1"; + Base::clearDb (); + if (!useNormAndUp ()) { + $this->markTestIncomplete(); + } + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *$query*", $currentPage->title); + $this->assertCount ($count, $currentPage->entryArray); + if ($count > 0) { + $this->assertEquals ($content, $currentPage->entryArray [0]->content); + } + $this->assertFalse ($currentPage->ContainsBook ()); + + $config ['cops_normalized_search'] = "0"; + Base::clearDb (); + } + + public function providerNormalizedSearch () + { + return array ( + array ("curee", 1, "1 book"), + array ("emile zola", 1, "1 author"), + array ("émile zola", 1, "1 author"), + array ("Litterature", 1, "1 tag"), + array ("Litterâture", 1, "1 tag"), + array ("Serie des Rougon", 1, "1 series"), + array ("Eugene Fasquelle", 1, "1 publisher") + ); + } + + public function testAuthorSearch_ByName () + { + global $config; + $page = Base::PAGE_OPENSEARCH_QUERY; + $query = "Lewis Carroll"; + $_GET ["scope"] = "author"; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *Lewis Carroll* in authors", $currentPage->title); + $this->assertCount (1, $currentPage->entryArray); + $this->assertEquals ("Carroll, Lewis", $currentPage->entryArray [0]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testAuthorSearch_BySort () + { + global $config; + $page = Base::PAGE_OPENSEARCH_QUERY; + $query = "Carroll, Lewis"; + $_GET ["scope"] = "author"; + $qid = NULL; + $n = "1"; + + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *Carroll, Lewis* in authors", $currentPage->title); + $this->assertCount (1, $currentPage->entryArray); + $this->assertEquals ("Carroll, Lewis", $currentPage->entryArray [0]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + } + + public function testPageSearchScopeAuthors () + { + $page = Base::PAGE_OPENSEARCH_QUERY; + $qid = NULL; + $n = "1"; + $_GET ["scope"] = "author"; + + // Match Lewis Carroll + $query = "car"; + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *car* in authors", $currentPage->title); + $this->assertCount (1, $currentPage->entryArray); + $this->assertEquals ("Carroll, Lewis", $currentPage->entryArray [0]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + + $_GET ["scope"] = NULL; + } + + public function testPageSearchScopeSeries () + { + $page = Base::PAGE_OPENSEARCH_QUERY; + $qid = NULL; + $n = "1"; + $_GET ["scope"] = "series"; + + // Match Holmes + $query = "hol"; + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *hol* in series", $currentPage->title); + $this->assertCount (1, $currentPage->entryArray); + $this->assertEquals ("Sherlock Holmes", $currentPage->entryArray [0]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + + $_GET ["scope"] = NULL; + } + + public function testPageSearchScopeBooks () + { + $page = Base::PAGE_OPENSEARCH_QUERY; + $qid = NULL; + $n = "1"; + $_GET ["scope"] = "book"; + + // Match Holmes + $query = "hol"; + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *hol* in books", $currentPage->title); + $this->assertCount (4, $currentPage->entryArray); + $this->assertTrue ($currentPage->ContainsBook ()); + + $_GET ["scope"] = NULL; + } + + public function testPageSearchScopePublishers () + { + $page = Base::PAGE_OPENSEARCH_QUERY; + $qid = NULL; + $n = "1"; + $_GET ["scope"] = "publisher"; + + // Match Holmes + $query = "millan"; + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *millan* in publishers", $currentPage->title); + $this->assertCount (2, $currentPage->entryArray); + $this->assertEquals ("Macmillan and Co. London", $currentPage->entryArray [0]->title); + $this->assertFalse ($currentPage->ContainsBook ()); + + $_GET ["scope"] = NULL; + } + + public function testPageSearchScopeTags () + { + $page = Base::PAGE_OPENSEARCH_QUERY; + $qid = NULL; + $n = "1"; + $_GET ["scope"] = "tag"; + + // Match Holmes + $query = "fic"; + $currentPage = Page::getPage ($page, $qid, $query, $n); + $currentPage->InitializeContent (); + + $this->assertEquals ("Search result for *fic* in tags", $currentPage->title); + $this->assertCount (2, $currentPage->entryArray); + $this->assertFalse ($currentPage->ContainsBook ()); + + $_GET ["scope"] = NULL; + } +} \ No newline at end of file diff --git a/sources/test/prepareSauceTest.sh b/sources/test/prepareSauceTest.sh new file mode 100644 index 0000000..eaf3360 --- /dev/null +++ b/sources/test/prepareSauceTest.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +PHP_VERSION=`php -v|grep --only-matching --perl-regexp "PHP 5\.\\d+"` +echo $PHP_VERSION + + +if [[ $PHP_VERSION != "PHP 5.6" ]] + then + echo "Bad PHP version" + exit +fi + +echo "Good PHP version" + +# Handle scrutinizer +wget https://scrutinizer-ci.com/ocular.phar +php ocular.phar code-coverage:upload --format=php-clover clover.xml + +if [[ -z $SAUCE_ACCESS_KEY ]] + then + echo "No Sauce Api Key (Pull request)" + exit +fi + +# Install dependencies +wget http://getcomposer.org/composer.phar +php composer.phar install + +echo 'opcache.enable=1' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini +echo 'opcache.enable_cli=1' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini + +# Handle Sauce +# curl https://gist.githubusercontent.com/seblucas/7692094/raw/e2a090e6ea639a0d700e6d02cee048fa2f6c8617/sauce_connect_setup.sh | bash +cp -v test/config_local.php.sauce config_local.php +php -S 127.0.0.1:8888 & +vendor/bin/phpunit --no-configuration test/Sauce.php + + diff --git a/sources/test/res/atom.rnc b/sources/test/res/atom.rnc new file mode 100644 index 0000000..15ce284 --- /dev/null +++ b/sources/test/res/atom.rnc @@ -0,0 +1,338 @@ +# -*- rnc -*- +# RELAX NG Compact Syntax Grammar for the +# Atom Format Specification Version 11 + +namespace atom = "http://www.w3.org/2005/Atom" +namespace xhtml = "http://www.w3.org/1999/xhtml" +namespace s = "http://www.ascc.net/xml/schematron" +namespace local = "" + +start = atomFeed | atomEntry + +# Common attributes + +atomCommonAttributes = + attribute xml:base { atomUri }?, + attribute xml:lang { atomLanguageTag }?, + undefinedAttribute* + +# Text Constructs + +atomPlainTextConstruct = + atomCommonAttributes, + attribute type { "text" | "html" }?, + text + +atomXHTMLTextConstruct = + atomCommonAttributes, + attribute type { "xhtml" }, + xhtmlDiv + +atomTextConstruct = atomPlainTextConstruct | atomXHTMLTextConstruct + +# Person Construct + +atomPersonConstruct = + atomCommonAttributes, + (element atom:name { text } + & element atom:uri { atomUri }? + & element atom:email { atomEmailAddress }? + & extensionElement*) + +# Date Construct + +atomDateConstruct = + atomCommonAttributes, + xsd:dateTime + +# atom:feed + +atomFeed = + [ + s:rule [ + context = "atom:feed" + s:assert [ + test = "atom:author or not(atom:entry[not(atom:author)])" + "An atom:feed must have an atom:author unless all " + ~ "of its atom:entry children have an atom:author." + ] + ] + ] + element atom:feed { + atomCommonAttributes, + (atomAuthor* + & atomCategory* + & atomContributor* + & atomGenerator? + & atomIcon? + & atomId + & atomLink* + & atomLogo? + & atomRights? + & atomSubtitle? + & atomTitle + & atomUpdated + & extensionElement*), + atomEntry* + } + +# atom:entry + +atomEntry = + [ + s:rule [ + context = "atom:entry" + s:assert [ + test = "atom:link[@rel='alternate'] " + ~ "or atom:link[not(@rel)] " + ~ "or atom:content" + "An atom:entry must have at least one atom:link element " + ~ "with a rel attribute of 'alternate' " + ~ "or an atom:content." + ] + ] + s:rule [ + context = "atom:entry" + s:assert [ + test = "atom:author or " + ~ "../atom:author or atom:source/atom:author" + "An atom:entry must have an atom:author " + ~ "if its feed does not." + ] + ] + ] + element atom:entry { + atomCommonAttributes, + (atomAuthor* + & atomCategory* + & atomContent? + & atomContributor* + & atomId + & atomLink* + & atomPublished? + & atomRights? + & atomSource? + & atomSummary? + & atomTitle + & atomUpdated + & extensionElement*) + } + +# atom:content + +atomInlineTextContent = + element atom:content { + atomCommonAttributes, + attribute type { "text" | "html" }?, + (text)* + } + +atomInlineXHTMLContent = + element atom:content { + atomCommonAttributes, + attribute type { "xhtml" }, + xhtmlDiv + } + +atomInlineOtherContent = + element atom:content { + atomCommonAttributes, + attribute type { atomMediaType }?, + (text|anyElement)* + } + +atomOutOfLineContent = + element atom:content { + atomCommonAttributes, + attribute type { atomMediaType }?, + attribute src { atomUri }, + empty + } + +atomContent = atomInlineTextContent +| atomInlineXHTMLContent +| atomInlineOtherContent +| atomOutOfLineContent + +# atom:author + +atomAuthor = element atom:author { atomPersonConstruct } + +# atom:category + +atomCategory = + element atom:category { + atomCommonAttributes, + attribute term { text }, + attribute scheme { atomUri }?, + attribute label { text }?, + undefinedContent + } + +# atom:contributor + +atomContributor = element atom:contributor { atomPersonConstruct } + +# atom:generator + +atomGenerator = element atom:generator { + atomCommonAttributes, + attribute uri { atomUri }?, + attribute version { text }?, + text +} + +# atom:icon + +atomIcon = element atom:icon { + atomCommonAttributes, + (atomUri) +} + +# atom:id + +atomId = element atom:id { + atomCommonAttributes, + (atomUri) +} + +# atom:logo + +atomLogo = element atom:logo { + atomCommonAttributes, + (atomUri) +} + +# atom:link + +atomLink = + element atom:link { + atomCommonAttributes, + attribute href { atomUri }, + attribute rel { atomNCName | atomUri }?, + attribute type { atomMediaType }?, + attribute hreflang { atomLanguageTag }?, + attribute title { text }?, + attribute length { text }?, + undefinedContent + } + +# atom:published + +atomPublished = element atom:published { atomDateConstruct } + +# atom:rights + +atomRights = element atom:rights { atomTextConstruct } + +# atom:source + +atomSource = + element atom:source { + atomCommonAttributes, + (atomAuthor* + & atomCategory* + & atomContributor* + & atomGenerator? + & atomIcon? + & atomId? + & atomLink* + & atomLogo? + & atomRights? + & atomSubtitle? + & atomTitle? + & atomUpdated? + & extensionElement*) + } + +# atom:subtitle + +atomSubtitle = element atom:subtitle { atomTextConstruct } + +# atom:summary + +atomSummary = element atom:summary { atomTextConstruct } + +# atom:title + +atomTitle = element atom:title { atomTextConstruct } + +# atom:updated + +atomUpdated = element atom:updated { atomDateConstruct } + +# Low-level simple types + +atomNCName = xsd:string { minLength = "1" pattern = "[^:]*" } + +# Whatever a media type is, it contains at least one slash +atomMediaType = xsd:string { pattern = ".+/.+" } + +# As defined in RFC 3066 +atomLanguageTag = xsd:string { + pattern = "[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*" +} + +# Unconstrained; it's not entirely clear how IRI fit into +# xsd:anyURI so let's not try to constrain it here +atomUri = text + +# Whatever an email address is, it contains at least one @ +atomEmailAddress = xsd:string { pattern = ".+@.+" } + +# Simple Extension + +simpleExtensionElement = + element * - atom:* { + text + } + +# Structured Extension + +structuredExtensionElement = + element * - atom:* { + (attribute * { text }+, + (text|anyElement)*) + | (attribute * { text }*, + (text?, anyElement+, (text|anyElement)*)) + } + +# Other Extensibility + +extensionElement = + simpleExtensionElement | structuredExtensionElement + +undefinedAttribute = + attribute * - (xml:base | xml:lang | local:*) { text } + +undefinedContent = (text|anyForeignElement)* + +anyElement = + element * { + (attribute * { text } + | text + | anyElement)* + } + +anyForeignElement = + element * - atom:* { + (attribute * { text } + | text + | anyElement)* + } + +# XHTML + +anyXHTML = element xhtml:* { + (attribute * { text } + | text + | anyXHTML)* +} + +xhtmlDiv = element xhtml:div { + (attribute * { text } + | text + | anyXHTML)* +} + +# EOF diff --git a/sources/test/res/opds_v1.0.rnc b/sources/test/res/opds_v1.0.rnc new file mode 100644 index 0000000..4c22e2b --- /dev/null +++ b/sources/test/res/opds_v1.0.rnc @@ -0,0 +1,131 @@ +# -*- rnc -*- +# RELAX NG Compact Syntax Grammar for OPDS Catalog Feed & Entry Documents +# Version 2010-08-18 +namespace atom = "http://www.w3.org/2005/Atom" +namespace opds = "http://opds-spec.org/2010/catalog" +namespace local = "" + +# The OPDS Catalog spec extends Atom (RFC4287), and the additions require some +# patterns not used in the Atom schema. The first is atomUriExceptOPDS, which +# is used to describe an atomLink whose rel value is an atomNCName (no-colon +# name) or any URI other than these from OPDS Catalogs. In these cases, no +# opds:price element should appear. +atomUriExceptOPDS = string - ( string "http://opds-spec.org/acquisition/buy" + | string "http://opds-spec.org/acquisition/borrow" + | string "http://opds-spec.org/acquisition/subscribe" + | string "http://opds-spec.org/acquisition/sample" ) + +# Next is OPDSUrisExceptBuy, which is used to describe an atomLink whose +# rel value is from OPDS Catalogs but is not ".../acquisition/buy". In such +# cases, an opds:price element is optional. +OPDSUrisExceptBuy = string "http://opds-spec.org/acquisition/borrow" + | string "http://opds-spec.org/acquisition/subscribe" + | string "http://opds-spec.org/acquisition/sample" + +# To simplify OPDS Catalog validation, we do not use Schematron to assert that +# any atom:link with a rel value of ".../acquisition/buy" must be accompanied +# by one or more opds:price elements. +# Instead we rely on Relax NG to describe one of three situations: +# - the rel value is ".../acquisition/buy" and at least one opds:price element +# is required +# - the rel value is ".../acquisition/borrow" or ".../acquisition/subscribe" or +# ".../acquisition/sample", in case opds:price elements may be +# included; or +# - the value of the rel attribute is any other URI or an Atom-defined no-colon +# name, and no opds:price element is permitted + +# Note that this OPDS Catalog schema includes atom.rnc, so that schema must be +# present for validation. +# +# Note also that atom.rnc defines atomUri as text and not as xsd:anyURI, and so +# wherever the Atom spec requires an IRI, the schema will not check the value +# against any URI pattern or logic. The OPDS Catalog schema overrides atom.rnc +# to provide a relatively accurate test. With the approval of XSD 1.1, the +# schema definition should change to xsd:anyURI to match what the spec text +# says. +include "atom.rnc" { + atomLink = + element atom:link { + atomCommonAttributes & + attribute href { atomUri } & + attribute type { atomMediaType }? & + attribute hreflang { atomLanguageTag }? & + attribute title { text }? & + attribute length { text }? & + ((attribute rel { "http://opds-spec.org/acquisition/buy" }, opdsPrice+ ) + | + (attribute rel { OPDSUrisExceptBuy }, opdsPrice*) + | + (attribute rel { atomNCName | ( atomUriExceptOPDS ) } ))? & + anyOPDSForeignElement* & + text + } + + # Here is where OPDS Catalogs use John Cowan's pragmatic evaluation of an + # IRI. This modifies xsd:anyURI in XSD 1.0 to exclude ASCII characters not + # valid in 1.1 or IRI's without being escaped. This matches the OPDS and Atom + # specs, but not the non-normative atom.rnc. + atomUri = xsd:anyURI - xsd:string {pattern = '.*[ <>{}|^`"\\\n\r\t].*'} + + # Here we override Atom to account for HTML abuse in the summary element, + # restricting it in OPDS Catalog to text: + atomSummary = + element atom:summary { + atomCommonAttributes, + attribute type { "text" }?, + text + } +} + + +anyOPDSForeignElement = + element * - ( atom:* | opds:* ) { + ( attribute * { text } + | text + | anyElement )* + } + +# An opds:price element should not contain a currency symbol; it is +# restricted to non-negative decimal numbers. +opdsPrice = + element opds:price { + atomCommonAttributes, + attribute currencycode { opdsPriceCurrencyCode }, + xsd:decimal { minInclusive="0.0" } + } + +# Instead of allowing every possible 3-letter or 3-digit combination as a +# currency code, here the permissible codes (as identified in ISO4217 as of +# 2010-08-25) are enumerated. In 2012 or so, that standard may add, remove or +# change some currency codes, thus requiring this schema to be updated. Note +# that codes for metals and funds are not included. +opdsPriceCurrencyCode = ( + "AED" | "AFN" | "ALL" | "AMD" | "ANG" | "AOA" | "ARS" | "AUD" | "AWG" | "AZN" | "BAM" | "BBD" | "BDT" | + "BGN" | "BHD" | "BIF" | "BMD" | "BND" | "BOB" | "BOV" | "BRL" | "BSD" | "BTN" | "BWP" | "BYR" | "BZD" | + "CAD" | "CDF" | "CHE" | "CHF" | "CHW" | "CLF" | "CLP" | "CNY" | "COP" | "COU" | "CRC" | "CUC" | "CUP" | + "CVE" | "CZK" | "DJF" | "DKK" | "DOP" | "DZD" | "EEK" | "EGP" | "ERN" | "ETB" | "EUR" | "FJD" | "FKP" | + "GBP" | "GEL" | "GHS" | "GIP" | "GMD" | "GNF" | "GTQ" | "GYD" | "HKD" | "HNL" | "HRK" | "HTG" | "HUF" | + "IDR" | "ILS" | "INR" | "IQD" | "IRR" | "ISK" | "JMD" | "JOD" | "JPY" | "KES" | "KGS" | "KHR" | "KMF" | + "KPW" | "KRW" | "KWD" | "KYD" | "KZT" | "LAK" | "LBP" | "LKR" | "LRD" | "LSL" | "LTL" | "LVL" | "LYD" | + "MAD" | "MDL" | "MGA" | "MKD" | "MMK" | "MNT" | "MOP" | "MRO" | "MUR" | "MVR" | "MWK" | "MXN" | "MXV" | + "MYR" | "MZN" | "NAD" | "NGN" | "NIO" | "NOK" | "NPR" | "NZD" | "OMR" | "PAB" | "PEN" | "PGK" | "PHP" | + "PKR" | "PLN" | "PYG" | "QAR" | "RON" | "RSD" | "RUB" | "RWF" | "SAR" | "SBD" | "SCR" | "SDG" | "SEK" | + "SGD" | "SHP" | "SLL" | "SOS" | "SRD" | "STD" | "SVC" | "SYP" | "SZL" | "THB" | "TJS" | "TMT" | "TND" | + "TOP" | "TRY" | "TTD" | "TWD" | "TZS" | "UAH" | "UGX" | "USD" | "USN" | "USS" | "UYI" | "UYU" | "UZS" | + "VEF" | "VND" | "VUV" | "WST" | "XAF" | "XAG" | "XAU" | "XBA" | "XBB" | "XBC" | "XBD" | "XCD" | "XDR" | + "XFU" | "XOF" | "XPD" | "XPF" | "XPT" | "XTS" | "XXX" | "YER" | "ZAR" | "ZMK" | "ZWL" | "008" | "012" | + "032" | "036" | "044" | "048" | "050" | "051" | "052" | "060" | "064" | "068" | "072" | "084" | "090" | + "096" | "104" | "108" | "116" | "124" | "132" | "136" | "144" | "152" | "156" | "170" | "174" | "188" | + "191" | "192" | "203" | "208" | "214" | "222" | "230" | "232" | "233" | "238" | "242" | "262" | "270" | + "292" | "320" | "324" | "328" | "332" | "340" | "344" | "348" | "352" | "356" | "360" | "364" | "368" | + "376" | "388" | "392" | "398" | "400" | "404" | "408" | "410" | "414" | "417" | "418" | "422" | "426" | + "428" | "430" | "434" | "440" | "446" | "454" | "458" | "462" | "478" | "480" | "484" | "496" | "498" | + "504" | "512" | "516" | "524" | "532" | "533" | "548" | "554" | "558" | "566" | "578" | "586" | "590" | + "598" | "600" | "604" | "608" | "634" | "643" | "646" | "654" | "678" | "682" | "690" | "694" | "702" | + "704" | "706" | "710" | "748" | "752" | "756" | "760" | "764" | "776" | "780" | "784" | "788" | "800" | + "807" | "818" | "826" | "834" | "840" | "858" | "860" | "882" | "886" | "894" | "901" | "931" | "932" | + "934" | "936" | "937" | "938" | "940" | "941" | "943" | "944" | "946" | "947" | "948" | "949" | "950" | + "951" | "952" | "953" | "955" | "956" | "957" | "958" | "959" | "960" | "961" | "962" | "963" | "964" | + "968" | "969" | "970" | "971" | "972" | "973" | "974" | "975" | "976" | "977" | "978" | "979" | "980" | + "981" | "984" | "985" | "986" | "990" | "997" | "998" | "999" +) diff --git a/sources/test/res/opds_v1.1.rnc b/sources/test/res/opds_v1.1.rnc new file mode 100644 index 0000000..9a0778f --- /dev/null +++ b/sources/test/res/opds_v1.1.rnc @@ -0,0 +1,151 @@ +# -*- rnc -*- +# RELAX NG Compact Syntax Grammar for OPDS Catalog Feed & Entry Documents +# Version 2010-08-18 +namespace atom = "http://www.w3.org/2005/Atom" +namespace opds = "http://opds-spec.org/2010/catalog" +namespace local = "" + +# The OPDS Catalog spec extends Atom (RFC4287), and the additions require some +# patterns not used in the Atom schema. The first is atomUriExceptOPDS, which +# is used to describe an atomLink whose rel value is an atomNCName (no-colon +# name) or any URI other than these from OPDS Catalogs. In these cases, no +# opds:price element should appear. +atomUriExceptOPDS = string - ( string "http://opds-spec.org/acquisition/buy" + | string "http://opds-spec.org/acquisition/borrow" + | string "http://opds-spec.org/acquisition/subscribe" + | string "http://opds-spec.org/acquisition/sample" ) + +# Next is OPDSUrisExceptBuy, which is used to describe an atomLink whose +# rel value is from OPDS Catalogs but is not ".../acquisition/buy". In such +# cases, an opds:price element is optional. +OPDSUrisExceptBuy = string "http://opds-spec.org/acquisition/borrow" + | string "http://opds-spec.org/acquisition/subscribe" + | string "http://opds-spec.org/acquisition/sample" + +# To simplify OPDS Catalog validation, we do not use Schematron to assert that +# any atom:link with a rel value of ".../acquisition/buy" must be accompanied +# by one or more opds:price elements. +# Instead we rely on Relax NG to describe one of three situations: +# - the rel value is ".../acquisition/buy" and at least one opds:price element +# is required +# - the rel value is ".../acquisition/borrow" or ".../acquisition/subscribe" or +# ".../acquisition/sample", in case opds:price elements may be +# included; or +# - the value of the rel attribute is any other URI or an Atom-defined no-colon +# name, and no opds:price element is permitted + +# Note that this OPDS Catalog schema includes atom.rnc, so that schema must be +# present for validation. +# +# Note also that atom.rnc defines atomUri as text and not as xsd:anyURI, and so +# wherever the Atom spec requires an IRI, the schema will not check the value +# against any URI pattern or logic. The OPDS Catalog schema overrides atom.rnc +# to provide a relatively accurate test. With the approval of XSD 1.1, the +# schema definition should change to xsd:anyURI to match what the spec text +# says. +include "atom.rnc" { + +undefinedAttribute = + attribute * - (xml:base | xml:lang | local:*| opds:* ) { text } + + atomLink = + element atom:link { + atomCommonAttributes , + attribute href { atomUri }, + attribute type { atomMediaType }? , + attribute hreflang { atomLanguageTag }? , + attribute title { text }? , + attribute length { text }? , + ((attribute rel { "http://opds-spec.org/facet" }, (attribute opds:facetGroup { text }? & attribute opds:activeFacet { "true" }? )) + | + (attribute rel { "http://opds-spec.org/acquisition/buy" }, opdsPrice+ ) + | + (attribute rel { OPDSUrisExceptBuy }, opdsPrice*) + | + (attribute rel { atomNCName | ( atomUriExceptOPDS ) } ))? , + (opdsIndirectAcquisition | + anyOPDSForeignElement | + text)* + } + + # Here is where OPDS Catalogs use John Cowan's pragmatic evaluation of an + # IRI. This modifies xsd:anyURI in XSD 1.0 to exclude ASCII characters not + # valid in 1.1 or IRI's without being escaped. This matches the OPDS and Atom + # specs, but not the non-normative atom.rnc. + atomUri = xsd:anyURI - xsd:string {pattern = '.*[ <>{}|^`"\\\n\r\t].*'} + + # Here we override Atom to account for HTML abuse in the summary element, + # restricting it in OPDS Catalog to text: + atomSummary = + element atom:summary { + atomCommonAttributes, + attribute type { "text" }?, + text + } +} + + +anyOPDSForeignElement = + element * - ( atom:* | opds:* ) { + ( attribute * { text } + | text + | anyElement )* + } + + +# An opds:indirectAcquisition should use strictly MIME media type for +#its type attribute +opdsIndirectAcquisition = + element opds:indirectAcquisition { + atomCommonAttributes, + attribute type { atomMediaType }, + ( anyOPDSForeignElement | + opdsIndirectAcquisition) * + } + + +# An opds:price element should not contain a currency symbol; it is +# restricted to non-negative decimal numbers. +opdsPrice = + element opds:price { + atomCommonAttributes, + attribute currencycode { opdsPriceCurrencyCode }, + xsd:decimal { minInclusive="0.0" } + } + + +# Instead of allowing every possible 3-letter or 3-digit combination as a +# currency code, here the permissible codes (as identified in ISO4217 as of +# 2010-08-25) are enumerated. In 2012 or so, that standard may add, remove or +# change some currency codes, thus requiring this schema to be updated. Note +# that codes for metals and funds are not included. +opdsPriceCurrencyCode = ( + "AED" | "AFN" | "ALL" | "AMD" | "ANG" | "AOA" | "ARS" | "AUD" | "AWG" | "AZN" | "BAM" | "BBD" | "BDT" | + "BGN" | "BHD" | "BIF" | "BMD" | "BND" | "BOB" | "BOV" | "BRL" | "BSD" | "BTN" | "BWP" | "BYR" | "BZD" | + "CAD" | "CDF" | "CHE" | "CHF" | "CHW" | "CLF" | "CLP" | "CNY" | "COP" | "COU" | "CRC" | "CUC" | "CUP" | + "CVE" | "CZK" | "DJF" | "DKK" | "DOP" | "DZD" | "EEK" | "EGP" | "ERN" | "ETB" | "EUR" | "FJD" | "FKP" | + "GBP" | "GEL" | "GHS" | "GIP" | "GMD" | "GNF" | "GTQ" | "GYD" | "HKD" | "HNL" | "HRK" | "HTG" | "HUF" | + "IDR" | "ILS" | "INR" | "IQD" | "IRR" | "ISK" | "JMD" | "JOD" | "JPY" | "KES" | "KGS" | "KHR" | "KMF" | + "KPW" | "KRW" | "KWD" | "KYD" | "KZT" | "LAK" | "LBP" | "LKR" | "LRD" | "LSL" | "LTL" | "LVL" | "LYD" | + "MAD" | "MDL" | "MGA" | "MKD" | "MMK" | "MNT" | "MOP" | "MRO" | "MUR" | "MVR" | "MWK" | "MXN" | "MXV" | + "MYR" | "MZN" | "NAD" | "NGN" | "NIO" | "NOK" | "NPR" | "NZD" | "OMR" | "PAB" | "PEN" | "PGK" | "PHP" | + "PKR" | "PLN" | "PYG" | "QAR" | "RON" | "RSD" | "RUB" | "RWF" | "SAR" | "SBD" | "SCR" | "SDG" | "SEK" | + "SGD" | "SHP" | "SLL" | "SOS" | "SRD" | "STD" | "SVC" | "SYP" | "SZL" | "THB" | "TJS" | "TMT" | "TND" | + "TOP" | "TRY" | "TTD" | "TWD" | "TZS" | "UAH" | "UGX" | "USD" | "USN" | "USS" | "UYI" | "UYU" | "UZS" | + "VEF" | "VND" | "VUV" | "WST" | "XAF" | "XAG" | "XAU" | "XBA" | "XBB" | "XBC" | "XBD" | "XCD" | "XDR" | + "XFU" | "XOF" | "XPD" | "XPF" | "XPT" | "XTS" | "XXX" | "YER" | "ZAR" | "ZMK" | "ZWL" | "008" | "012" | + "032" | "036" | "044" | "048" | "050" | "051" | "052" | "060" | "064" | "068" | "072" | "084" | "090" | + "096" | "104" | "108" | "116" | "124" | "132" | "136" | "144" | "152" | "156" | "170" | "174" | "188" | + "191" | "192" | "203" | "208" | "214" | "222" | "230" | "232" | "233" | "238" | "242" | "262" | "270" | + "292" | "320" | "324" | "328" | "332" | "340" | "344" | "348" | "352" | "356" | "360" | "364" | "368" | + "376" | "388" | "392" | "398" | "400" | "404" | "408" | "410" | "414" | "417" | "418" | "422" | "426" | + "428" | "430" | "434" | "440" | "446" | "454" | "458" | "462" | "478" | "480" | "484" | "496" | "498" | + "504" | "512" | "516" | "524" | "532" | "533" | "548" | "554" | "558" | "566" | "578" | "586" | "590" | + "598" | "600" | "604" | "608" | "634" | "643" | "646" | "654" | "678" | "682" | "690" | "694" | "702" | + "704" | "706" | "710" | "748" | "752" | "756" | "760" | "764" | "776" | "780" | "784" | "788" | "800" | + "807" | "818" | "826" | "834" | "840" | "858" | "860" | "882" | "886" | "894" | "901" | "931" | "932" | + "934" | "936" | "937" | "938" | "940" | "941" | "943" | "944" | "946" | "947" | "948" | "949" | "950" | + "951" | "952" | "953" | "955" | "956" | "957" | "958" | "959" | "960" | "961" | "962" | "963" | "964" | + "968" | "969" | "970" | "971" | "972" | "973" | "974" | "975" | "976" | "977" | "978" | "979" | "980" | + "981" | "984" | "985" | "986" | "990" | "997" | "998" | "999" +) \ No newline at end of file diff --git a/sources/tools/export_file.txt b/sources/tools/export_file.txt new file mode 100644 index 0000000..3f55901 --- /dev/null +++ b/sources/tools/export_file.txt @@ -0,0 +1,71 @@ +' Output a file +' If there is no translation then we output the line as a comment +' that starts with #EN# indicating that translation is required + + +Sub Export_File(sType, iCol As Integer) + + Dim oFile As Integer + Dim iRow As Integer + Dim iBlankLines As Integer + Dim sLangCode As String + Dim sOut As String + Dim sTemp As String + Dim bOut() As Byte + Dim shSheet As Worksheet: Set shSheet = Worksheets(sType) + + sFilename = sType & "_" & LCase$(shSheet.Cells(cLanguageCodeRow, iCol).Value) & ".json" + oFile = FreeFile() + sFullPath = Application.ActiveWorkbook.Path & "\" & sFilename + On Error Resume Next + Kill sFullPath + Open sFullPath For Output As #oFile + Close #oFile + On Error GoTo 0 + Open sFullPath For Binary Access Write As #oFile + ' Output comment on version as first line + sOut = "{" & vbCrLf + bOut = UnicodeToBytes(Worksheets(cConfiguration).Cells(cOutputFormatRow, cOutputFormatCol), sOut) + Put #oFile, , bOut + + iRow = cFirstDataRow + Do + sTemp = shSheet.Cells(iRow, cKeywordCol).Value + sOut = "// " & sTemp +' Print #oFile, sTemp; + If Len(sTemp) = 0 Then + iBlankLines = iBlankLines + 1 + Else + iBlankLines = 0 + If Not isComment(sTemp) And (Not (sTemp Like "config*") Or sTemp Like "config.Language*") And Not sTemp Like "gui*" And Not sTemp Like "error*" And Not sTemp Like "info*" And Not sTemp Like "stats*" Then + sOut = """" & sTemp & """" & ":" +' Print #oFile, "="; + sTemp = shSheet.Cells(iRow, iCol).Value + If Len(sTemp) > 0 Then + sOut = sOut & """" & sTemp & """," + sOut = sOut & vbCrLf + bOut = UnicodeToBytes(Worksheets(cConfiguration).Cells(cOutputFormatRow, cOutputFormatCol), sOut) + Put #oFile, , bOut +' Print #oFile, sTemp; + Else + ' If no language specific one supplied then + ' output English one as a comment starting with '#EN#' + ' (as long this is not the english column with empty value) + If iCol <> cEnglishLangCol Then + sOut = "// EN" & sOut + End If + sOut = sOut & shSheet.Cells(iRow, 3).Value +' Print #oFile, shSheet.Cells(iRow, 3).Value; + End If + End If + End If +' Print #oFile, "" ' Force new line + iRow = iRow + 1 + Loop Until (iBlankLines > 5) + + sOut = """fin"":""fin""" & vbCrLf & "}" & vbCrLf + bOut = UnicodeToBytes(Worksheets(cConfiguration).Cells(cOutputFormatRow, cOutputFormatCol), sOut) + Put #oFile, , bOut + + Close #oFile +End Sub diff --git a/sources/tools/updateLang.pl b/sources/tools/updateLang.pl new file mode 100644 index 0000000..6e7feaf --- /dev/null +++ b/sources/tools/updateLang.pl @@ -0,0 +1,118 @@ +#!/usr/bin/perl + +# Program : COPS localization string generator +# Version : 0.0.1 +# +# Author : Sébastien Lucas +# License : GPLv2 +# + +use strict; + +our @strings = (); +my %values; +my %allstrings; + +# Load php files looking for strings to localize + +opendir (my($dirhandle), "../") or die ("Directory not found\n"); +for (readdir ($dirhandle)) { + next if (-d $_ ); # skip directories + next if (/^[.]/); # skip dot-files + next if not (/(.+)[.]php$/); + + my $file = "../" . $_; + debug ("text file: " . $_ . "\n"); + my $content = loadFile ($file); + + while ($content =~ /localize\s*\("([\w\.]*?)"\)/igs) { + $allstrings{$1} = ""; + debug (" * $1 \n"); + } + + while ($content =~ /localize\s*\("([\w\.]*?)"\s*,/igs) { + $allstrings{$1 . ".none"} = ""; + $allstrings{$1 . ".one"} = ""; + $allstrings{$1 . ".many"} = ""; + debug (" *** $1 \n"); + } +} +closedir $dirhandle; + +@strings = sort (keys (%allstrings)); + +# Load existing json files with strings and values + +handleLanguageFile ("Localization_en.json"); + +opendir (my($dirhandle), "../lang") or die ("Directory not found\n"); +for (readdir ($dirhandle)) { + next if (-d $_ ); # skip directories + next if (/^[.]/); # skip dot-files + next if not (/(.+)[.]json$/); + next if (/en\.json$/); + + handleLanguageFile ($_); +} +closedir $dirhandle; + +sub handleLanguageFile { + my ($file) = @_; + (my $lang = $file) =~ s/Localization_(\w\w)\.json/$1/; + my $file = "../lang/" . $file; + my $total = 0; + my $translated = 0; + + debug ("language file: $file / $lang \n"); + + my $content = loadFile ($file); + + while ($content =~ /"\s*(.*?)"\:\s*"(.*?)",/igs) { + my $key = $1; + my $value = $2; + next if ($key =~ /^##TODO##/); + if ($lang eq "en" && $key =~ /^languages\.\w{3}$/) { + push (@strings, $key); + } + $values{$lang}{$key} = $value; + #debug (" * $1 \n"); + } + + open OUTPUT, ">$file"; + + print OUTPUT "{\n"; + foreach my $name (@strings) { + $total++ if ($name !~ /^languages\.\w{3}$/); + if (not exists ($values{$lang}{$name})) { + print OUTPUT " \"##TODO##$name\": \"$values{en}{$name}\",\n"; + } else { + $translated++ if ($name !~ /^languages\.\w{3}$/); + print OUTPUT " \"$name\": \"$values{$lang}{$name}\",\n"; + } + } + my $percentage = ($translated * 100) / $total; + debug (" $translated / $total ($percentage %) \n"); + print OUTPUT " \"DO_NOT_TRANSLATE\": \"end\"\n"; + print OUTPUT "}\n"; + + close OUTPUT; +} + +sub loadFile { + my ($file) = @_; + my $save = $/; + $/ = undef; + + open INPUT, "<$file"; + my $content = ; + close INPUT; + + $/ = $save; + + return $content; +} + +sub debug { + #uncomment next line for debug messages + print @_; +} \ No newline at end of file diff --git a/sources/transliteration.php b/sources/transliteration.php new file mode 100644 index 0000000..de5dfc5 --- /dev/null +++ b/sources/transliteration.php @@ -0,0 +1,212 @@ += "\x80" && $c < "\xc0") { + // Legal tail bytes are nice. + $sequence .= $c; + } + else { + if ($len == 0) { + // Premature end of string! Drop a replacement character into + // output to represent the invalid UTF-8 sequence. + $result .= $unknown; + break 2; + } + else { + // Illegal tail byte; abandon the sequence. + $result .= $unknown; + // Back up and reprocess this byte; it may itself be a legal + // ASCII or UTF-8 sequence head. + --$i; + ++$len; + continue 2; + } + } + } while (--$remaining); + + $n = ord($head); + if ($n <= 0xdf) { + $ord = ($n - 192) * 64 + (ord($sequence[1]) - 128); + } + elseif ($n <= 0xef) { + $ord = ($n - 224) * 4096 + (ord($sequence[1]) - 128) * 64 + (ord($sequence[2]) - 128); + } + elseif ($n <= 0xf7) { + $ord = ($n - 240) * 262144 + (ord($sequence[1]) - 128) * 4096 + (ord($sequence[2]) - 128) * 64 + (ord($sequence[3]) - 128); + } + elseif ($n <= 0xfb) { + $ord = ($n - 248) * 16777216 + (ord($sequence[1]) - 128) * 262144 + (ord($sequence[2]) - 128) * 4096 + (ord($sequence[3]) - 128) * 64 + (ord($sequence[4]) - 128); + } + elseif ($n <= 0xfd) { + $ord = ($n - 252) * 1073741824 + (ord($sequence[1]) - 128) * 16777216 + (ord($sequence[2]) - 128) * 262144 + (ord($sequence[3]) - 128) * 4096 + (ord($sequence[4]) - 128) * 64 + (ord($sequence[5]) - 128); + } else { + $ord = $n; + } + $result .= _transliteration_replace($ord, $unknown, $source_langcode); + $head = ''; + } elseif ($c < "\x80") { + // ASCII byte. + $result .= $c; + $head = ''; + } elseif ($c < "\xc0") { + // Illegal tail bytes. + if ($head == '') { + $result .= $unknown; + } + } else { + // Miscellaneous freaks. + $result .= $unknown; + $head = ''; + } + } + } + return $result; +} + +/** + * Replaces a Unicode character using the transliteration database. + * + * @param $ord + * An ordinal Unicode character code. + * @param $unknown + * Replacement string for characters that do not have a suitable ASCII + * equivalent. + * @param $langcode + * Optional ISO 639 language code that denotes the language of the input and + * is used to apply language-specific variations. Defaults to the current + * display language. + * @return + * ASCII replacement character. + */ +function _transliteration_replace($ord, $unknown = '?', $langcode = NULL) { + static $map = array(); + + //GL: set language later + /* + if (!isset($langcode)) { + global $language; + $langcode = $language->language; + } + */ + + $bank = $ord >> 8; + + if (!isset($map[$bank][$langcode])) { + $file = './resources/transliteration-data/' . sprintf('x%02x', $bank) . '.php'; + if (file_exists($file)) { + $base = array(); + $variant = array(); + include $file; + if ($langcode != 'en' && isset($variant[$langcode])) { + // Merge in language specific mappings. + $map[$bank][$langcode] = $variant[$langcode] + $base; + } + else { + $map[$bank][$langcode] = $base; + } + } + else { + $map[$bank][$langcode] = array(); + } + } + + $ord = $ord & 255; + + return isset($map[$bank][$langcode][$ord]) ? $map[$bank][$langcode][$ord] : $unknown; +} diff --git a/sources/util.js b/sources/util.js new file mode 100644 index 0000000..cce08f9 --- /dev/null +++ b/sources/util.js @@ -0,0 +1,511 @@ +// util.js +// copyright Sébastien Lucas +// https://github.com/seblucas/cops + +/*jshint curly: true, latedef: true, trailing: true, noarg: true, undef: true, browser: true, jquery: true, unused: true, devel: true, loopfunc: true */ +/*global LRUCache, doT, Bloodhound, postRefresh */ + +var templatePage, templateBookDetail, templateMain, templateSuggestion, currentData, before, filterList; + +if (typeof LRUCache != 'undefined') { + console.log('ERROR: LRUCache module not loaded!'); +} +var cache = new LRUCache(30); + +$.ajaxSetup({ + cache: false +}); + +var copsTypeahead = new Bloodhound({ + datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title'), + queryTokenizer: Bloodhound.tokenizers.whitespace, + limit: 30, + remote: { + url: 'getJSON.php?page=9&search=1&db=%DB&query=%QUERY', + replace: function (url, query) { + if (currentData.multipleDatabase === 1 && currentData.databaseId === "") { + return url.replace('%QUERY', query).replace('&db=%DB', ""); + } + return url.replace('%QUERY', query).replace('%DB', currentData.databaseId); + } + } +}); + +copsTypeahead.initialize(); + +var DEBUG = false; +var isPushStateEnabled = window.history && window.history.pushState && window.history.replaceState && + // pushState isn't reliable on iOS until 5. + !window.navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]|WebApps\/.+CFNetwork)/); + +function debug_log(text) { + if ( DEBUG ) { + console.log(text); + } +} + +/*exported updateCookie */ +function updateCookie (id) { + if ($(id).prop('pattern') && !$(id).val().match(new RegExp ($(id).prop('pattern')))) { + return; + } + var name = $(id).attr('id'); + var value = $(id).val (); + $.cookie(name, value, { expires: 365 }); +} + +/*exported updateCookieFromCheckbox */ +function updateCookieFromCheckbox (id) { + var name = $(id).attr('id'); + if ((/^style/).test (name)) { + name = "style"; + } + if ($(id).is(":checked")) + { + if ($(id).is(':radio')) { + $.cookie(name, $(id).val (), { expires: 365 }); + } else { + $.cookie(name, '1', { expires: 365 }); + } + } + else + { + $.cookie(name, '0', { expires: 365 }); + } +} + +/*exported updateCookieFromCheckboxGroup */ +function updateCookieFromCheckboxGroup (id) { + var name = $(id).attr('name'); + var idBase = name.replace (/\[\]/, ""); + var group = []; + $(':checkbox[name="' + name + '"]:checked').each (function () { + var id = $(this).attr("id"); + group.push (id.replace (idBase + "_", "")); + }); + $.cookie(idBase, group.join (), { expires: 365 }); +} + + +function elapsed () { + var elapsedTime = new Date () - before; + return "Elapsed : " + elapsedTime; +} + +function retourMail(data) { + $("#mailButton :first-child").removeClass ("icon-spinner icon-spin").addClass ("icon-envelope"); + alert (data); +} + +/*exported sendToMailAddress */ +function sendToMailAddress (component, dataid) { + var email = $.cookie ('email'); + if (!$.cookie ('email')) { + email = window.prompt (currentData.c.i18n.customizeEmail, ""); + if (email === null) + { + return; + } + $.cookie ('email', email, { expires: 365 }); + } + var url = 'sendtomail.php'; + if (currentData.databaseId) { + url = url + '?db=' + currentData.databaseId; + } + $("#mailButton :first-child").removeClass ("icon-envelope").addClass ("icon-spinner icon-spin"); + $.ajax ({'url': url, 'type': 'post', 'data': { 'data': dataid, 'email': email }, 'success': retourMail}); +} + +function str_format () { + var s = arguments[0]; + for (var i = 0; i < arguments.length - 1; i++) { + var reg = new RegExp("\\{" + i + "\\}", "gm"); + s = s.replace(reg, arguments[i + 1]); + } + return s; +} + +function isDefined(x) { + return (typeof x !== 'undefined'); +} + +function getCurrentOption (option) { + if (!$.cookie (option)) { + if (currentData && currentData.c && currentData.c.config && currentData.c.config [option]) { + return currentData.c.config [option]; + } + } + return $.cookie (option); +} + +/*exported htmlspecialchars */ +function htmlspecialchars(str) { + return String(str) + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/'/g, ''') + .replace(//g, '>'); +} + +/************************************************ + * All functions needed to filter the book list by tags + ************************************************ + */ + +function getTagList () { + var tagList = {}; + $(".se").each (function(){ + if ($(this).parents (".filtered").length > 0) { return; } + var taglist = $(this).text(); + + var tagarray = taglist.split (","); + for (var i in tagarray) { + if (!tagarray.hasOwnProperty(i)) { + continue; + } + var tag = tagarray [i].replace(/^\s+/g,'').replace(/\s+$/g,''); + tagList [tag] = 1; + } + }); + return tagList; +} + +function updateFilters () { + var tagList = getTagList (); + + // If there is already some filters then let's prepare to update the list + $("#filter ul li").each (function () { + var text = $(this).text (); + if (isDefined (tagList [text]) || $(this).attr ('class')) { + tagList [text] = 0; + } else { + tagList [text] = -1; + } + }); + + // Update the filter -1 to remove, 1 to add, 0 already there + for (var tag in tagList) { + if (!tagList.hasOwnProperty(tag)) { + continue; + } + var tagValue = tagList [tag]; + if (tagValue === -1) { + $("#filter ul li").filter (function () { return $.text([this]) === tag; }).remove(); + } + if (tagValue === 1) { + $("#filter ul").append ("
  • " + tag + "
  • "); + } + } + + $("#filter ul").append ("
  • _CLEAR_
  • "); + + // Sort the list alphabetically + $('#filter ul li').sortElements(function(a, b){ + return $(a).text() > $(b).text() ? 1 : -1; + }); +} + +function doFilter () { + $(".books").removeClass("filtered"); + if (jQuery.isEmptyObject(filterList)) { + updateFilters (); + return; + } + + $(".se").each (function(){ + var taglist = ", " + $(this).text() + ", "; + var toBeFiltered = false; + for (var filter in filterList) { + if (!filterList.hasOwnProperty(filter)) { + continue; + } + var onlyThisTag = filterList [filter]; + filter = ', ' + filter + ', '; + var myreg = new RegExp (filter); + if (myreg.test (taglist)) { + if (onlyThisTag === false) { + toBeFiltered = true; + } + } else { + if (onlyThisTag === true) { + toBeFiltered = true; + } + } + } + if (toBeFiltered) { $(this).parents (".books").addClass ("filtered"); } + }); + + // Handle the books with no tags + var atLeastOneTagSelected = false; + for (var filter in filterList) { + if (!filterList.hasOwnProperty(filter)) { + continue; + } + if (filterList[filter] === true) { + atLeastOneTagSelected = true; + } + } + if (atLeastOneTagSelected) { + $(".books").not (":has(span.se)").addClass ("filtered"); + } + + updateFilters (); +} + +function handleFilterEvents () { + $("#filter ul").on ("click", "li", function(){ + var filter = $(this).text (); + if (filter === "_CLEAR_") { + filterList = {}; + $("#filter ul li").removeClass ("filter-exclude"); + $("#filter ul li").removeClass ("filter-include"); + doFilter (); + return; + } + switch ($(this).attr("class")) { + case "filter-include" : + $(this).attr("class", "filter-exclude"); + filterList [filter] = false; + break; + case "filter-exclude" : + $(this).removeClass ("filter-exclude"); + delete filterList [filter]; + break; + default : + $(this).attr("class", "filter-include"); + filterList [filter] = true; + break; + } + doFilter (); + }); +} + +/************************************************ + * Functions to handle Ajax navigation + ************************************************ + */ + +var updatePage, navigateTo; + +updatePage = function (data) { + var result; + filterList = {}; + data.c = currentData.c; + if (false && $("section").length && currentData.isPaginated === 0 && data.isPaginated === 0) { + // Partial update (for now disabled) + debug_log ("Partial update"); + result = templateMain (data); + $("h1").html (data.title); + $("section").html (result); + } else { + // Full update + result = templatePage (data); + $("body").html (result); + } + document.title = data.title; + currentData = data; + setTimeout( function() { $("input[name=query]").focus(); }, 500 ); + + debug_log (elapsed ()); + + if ($.cookie('toolbar') === '1') { $("#tool").show (); } + if (currentData.containsBook === 1) { + $("#sortForm").show (); + if (getCurrentOption ("html_tag_filter") === "1") { + $("#filter ul").empty (); + updateFilters (); + handleFilterEvents (); + } + } else { + $("#sortForm").hide (); + } + + $('input[name=query]').typeahead( + { + hint: true, + minLength : 3 + }, + { + name: 'search', + displayKey: 'title', + templates: { + suggestion: templateSuggestion + }, + source: copsTypeahead.ttAdapter() + }); + + $('input[name=query]').bind('typeahead:selected', function(obj, datum) { + if (isPushStateEnabled) { + navigateTo (datum.navlink); + } else { + window.location = datum.navlink; + } + }); + + if(typeof postRefresh == 'function') + { postRefresh(); } +}; + +navigateTo = function (url) { + $("h1").append (" "); + before = new Date (); + var jsonurl = url.replace ("index", "getJSON"); + var cachedData = cache.get (jsonurl); + if (cachedData) { + window.history.pushState(jsonurl, "", url); + updatePage (cachedData); + } else { + $.getJSON(jsonurl, function(data) { + window.history.pushState(jsonurl, "", url); + cache.put (jsonurl, data); + updatePage (data); + }); + } +}; + +function link_Clicked (event) { + var currentLink = $(this); + if (!isPushStateEnabled || + currentData.page === "19") { + return; + } + event.preventDefault(); + var url = currentLink.attr('href'); + + if ($(".mfp-ready").length) + { + $.magnificPopup.close(); + } + + // The bookdetail / about should be displayed in a lightbox + if (getCurrentOption ("use_fancyapps") === "1" && + (currentLink.hasClass ("fancydetail") || currentLink.hasClass ("fancyabout"))) { + before = new Date (); + var jsonurl = url.replace ("index", "getJSON"); + $.getJSON(jsonurl, function(data) { + data.c = currentData.c; + var detail = ""; + if (data.page === "16") { + detail = data.fullhtml; + } else { + detail = templateBookDetail (data); + } + $.magnificPopup.open({ + items: { + src: detail, + type: 'inline' + } + }); + debug_log (elapsed ()); + }); + return; + } + navigateTo (url); +} + +function search_Submitted (event) { + if (!isPushStateEnabled || + currentData.page === "19") { + return; + } + event.preventDefault(); + var url = str_format ("index.php?page=9¤t={0}&query={1}&db={2}", currentData.page, encodeURIComponent ($("input[name=query]").val ()), currentData.databaseId); + navigateTo (url); +} + +/*exported handleLinks */ +function handleLinks () { + $("body").on ("click", "a[href^='index']", link_Clicked); + $("body").on ("submit", "#searchForm", search_Submitted); + $("body").on ("click", "#sort", function(){ + $('.books').sortElements(function(a, b){ + var test = 1; + if ($("#sortorder").val() === "desc") + { + test = -1; + } + return $(a).find ("." + $("#sortchoice").val()).text() > $(b).find ("." + $("#sortchoice").val()).text() ? test : -test; + }); + }); + + $("body").on ("click", ".headright", function(){ + if ($("#tool").is(":hidden")) { + $("#tool").slideDown("slow"); + $("input[name=query]").focus(); + $.cookie('toolbar', '1', { expires: 365 }); + } else { + $("#tool").slideUp(); + $.removeCookie('toolbar'); + } + }); + $("body").magnificPopup({ + delegate: '.fancycover', // child items selector, by clicking on it popup will open + type: 'image', + gallery:{enabled:true, preload: [0,2]}, + disableOn: function() { + if( getCurrentOption ("use_fancyapps") === "1" ) { + return true; + } + return false; + } + }); +} + +window.onpopstate = function(event) { + if (!isDefined (currentData)) { + return; + } + + before = new Date (); + var data = cache.get (event.state); + updatePage (data); +}; + +$(document).keydown(function(e){ + if (e.keyCode === 37 && $("#prevLink").length > 0) { + navigateTo ($("#prevLink").attr('href')); + } + if (e.keyCode === 39 && $("#nextLink").length > 0) { + navigateTo ($("#nextLink").attr('href')); + } +}); + +/*exported initiateAjax */ +function initiateAjax (url, theme) { + $.when($.get('templates/' + theme + '/header.html'), + $.get('templates/' + theme + '/footer.html'), + $.get('templates/' + theme + '/bookdetail.html'), + $.get('templates/' + theme + '/main.html'), + $.get('templates/' + theme + '/page.html'), + $.get('templates/' + theme + '/suggestion.html'), + $.getJSON(url)).done(function(header, footer, bookdetail, main, page, suggestion, data){ + templateBookDetail = doT.template (bookdetail [0]); + + var defMain = { + bookdetail: bookdetail [0] + }; + + templateMain = doT.template (main [0], undefined, defMain); + + var defPage = { + header: header [0], + footer: footer [0], + main : main [0], + bookdetail: bookdetail [0] + }; + + templatePage = doT.template (page [0], undefined, defPage); + + templateSuggestion = doT.template (suggestion [0]); + + currentData = data [0]; + + updatePage (data [0]); + cache.put (url, data [0]); + if (isPushStateEnabled) { + window.history.replaceState(url, "", window.location); + } + handleLinks (); + }); +} diff --git a/sources/web.config b/sources/web.config new file mode 100644 index 0000000..5d12fa3 --- /dev/null +++ b/sources/web.config @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file