├── .github └── workflows │ └── ci.yml ├── .gitignore ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── bench ├── Cargo.toml └── bench.rs ├── patterns ├── hyph-af.tex ├── hyph-be.tex ├── hyph-bg.tex ├── hyph-ca.tex ├── hyph-cs-sojka.tex ├── hyph-da.tex ├── hyph-de-1996.tex ├── hyph-el-monoton.tex ├── hyph-en-us.tex ├── hyph-es.tex ├── hyph-et.tex ├── hyph-fi.tex ├── hyph-fr.tex ├── hyph-hr.tex ├── hyph-hu.tex ├── hyph-is.tex ├── hyph-it.tex ├── hyph-ka.tex ├── hyph-kmr.tex ├── hyph-la.tex ├── hyph-lt.tex ├── hyph-mn.tex ├── hyph-nl.tex ├── hyph-no.tex ├── hyph-pl.tex ├── hyph-pt.tex ├── hyph-ru.tex ├── hyph-sh-cyrl.tex ├── hyph-sk.tex ├── hyph-sl.tex ├── hyph-sq.tex ├── hyph-sv.tex ├── hyph-tk.tex ├── hyph-tr.tex └── hyph-uk.tex ├── rustfmt.toml ├── src ├── lang.rs └── lib.rs ├── tests └── generate.rs └── tries ├── af.bin ├── be.bin ├── bg.bin ├── ca.bin ├── cs.bin ├── da.bin ├── de.bin ├── el.bin ├── en.bin ├── es.bin ├── et.bin ├── fi.bin ├── fr.bin ├── hr.bin ├── hu.bin ├── is.bin ├── it.bin ├── ka.bin ├── ku.bin ├── la.bin ├── lt.bin ├── mn.bin ├── nl.bin ├── no.bin ├── pl.bin ├── pt.bin ├── ru.bin ├── sk.bin ├── sl.bin ├── sq.bin ├── sr.bin ├── sv.bin ├── tk.bin ├── tr.bin └── uk.bin /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Continuous integration 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | ci: 6 | runs-on: ubuntu-latest 7 | steps: 8 | - uses: actions/checkout@v3 9 | - uses: dtolnay/rust-toolchain@stable 10 | - run: cargo build 11 | - run: cargo build --no-default-features 12 | - run: cargo test --lib --no-default-features --features english 13 | - run: cargo test --lib 14 | - run: cargo test --test generate 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | Cargo.lock 3 | .DS_Store 4 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hypher" 3 | version = "0.1.5" 4 | authors = ["Laurenz "] 5 | edition = "2021" 6 | description = "hypher separates words into syllables." 7 | repository = "https://github.com/typst/hypher" 8 | readme = "README.md" 9 | license = "MIT OR Apache-2.0" 10 | categories = ["text-processing", "internationalization", "no-std"] 11 | keywords = ["hyphenation", "syllables"] 12 | exclude = ["patterns/*"] 13 | 14 | [features] 15 | default = ["alloc", "full"] 16 | alloc = [] 17 | full = [ 18 | "afrikaans", 19 | "albanian", 20 | "belarusian", 21 | "bulgarian", 22 | "catalan", 23 | "croatian", 24 | "czech", 25 | "danish", 26 | "dutch", 27 | "english", 28 | "estonian", 29 | "finnish", 30 | "french", 31 | "georgian", 32 | "german", 33 | "greek", 34 | "hungarian", 35 | "icelandic", 36 | "italian", 37 | "kurmanji", 38 | "latin", 39 | "lithuanian", 40 | "mongolian", 41 | "norwegian", 42 | "polish", 43 | "portuguese", 44 | "russian", 45 | "serbian", 46 | "slovak", 47 | "slovenian", 48 | "spanish", 49 | "swedish", 50 | "turkish", 51 | "turkmen", 52 | "ukrainian", 53 | ] 54 | afrikaans = [] 55 | albanian = [] 56 | belarusian = [] 57 | bulgarian = [] 58 | catalan = [] 59 | croatian = [] 60 | czech = [] 61 | danish = [] 62 | dutch = [] 63 | english = [] 64 | estonian = [] 65 | finnish = [] 66 | french = [] 67 | georgian = [] 68 | german = [] 69 | greek = [] 70 | hungarian = [] 71 | icelandic = [] 72 | italian = [] 73 | kurmanji = [] 74 | latin = [] 75 | lithuanian = [] 76 | mongolian = [] 77 | norwegian = [] 78 | polish = [] 79 | portuguese = [] 80 | russian = [] 81 | serbian = [] 82 | slovak = [] 83 | slovenian = [] 84 | spanish = [] 85 | swedish = [] 86 | turkish = [] 87 | turkmen = [] 88 | ukrainian = [] 89 | 90 | [workspace] 91 | members = ["bench"] 92 | 93 | [profile.dev.build-override] 94 | opt-level = 1 95 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hypher 2 | [![Crates.io](https://img.shields.io/crates/v/hypher.svg)](https://crates.io/crates/hypher) 3 | [![Documentation](https://docs.rs/hypher/badge.svg)](https://docs.rs/hypher) 4 | 5 | _hypher_ separates words into syllables. 6 | 7 | ```toml 8 | [dependencies] 9 | hypher = "0.1" 10 | ``` 11 | 12 | ## Features 13 | - All-inclusive: Hyphenation patterns are embedded into the binary as 14 | efficiently encoded finite automata at build time. 15 | - Zero load time: Hyphenation automata operate directly over the embedded 16 | binary data with no up-front decoding. 17 | - No allocations unless when hyphenating very long words (> 41 bytes). You can 18 | disable the `alloc` feature, but then overly long words lead to a panic. 19 | - Support for many languages. 20 | - No unsafe code, no dependencies, no std. 21 | 22 | ## Example 23 | ```rust 24 | use hypher::{hyphenate, Lang}; 25 | 26 | let syllables = hyphenate("extensive", Lang::English); 27 | assert_eq!(syllables.join("-"), "ex-ten-sive"); 28 | ``` 29 | 30 | ## Languages 31 | By default, this crate supports hyphenating more than 30 languages. Embedding 32 | automata for all these languages will add ~1.1 MiB to your binary. 33 | Alternatively, you can disable support for all languages and manually choose 34 | which ones get added: 35 | 36 | ```toml 37 | [dependencies] 38 | hypher = { version = "0.1", default-features = false, features = ["english", "greek"] } 39 | ``` 40 | 41 | Each language added individually contributes: 42 | 43 | | Language | Space | 44 | |------------|---------| 45 | | Afrikaans | 60 KiB | 46 | | Albanian | 1.4 KiB | 47 | | Belarusian | 3.9 KiB | 48 | | Bulgarian | 13 KiB | 49 | | Catalan | 1.7 KiB | 50 | | Croatian | 2.0 KiB | 51 | | Czech | 40 KiB | 52 | | Danish | 5.7 KiB | 53 | | Dutch | 63 KiB | 54 | | English | 27 KiB | 55 | | Estonian | 19 KiB | 56 | | Finnish | 1.3 KiB | 57 | | French | 6.9 KiB | 58 | | Georgian | 11 KiB | 59 | | German | 201 KiB | 60 | | Greek | 2.0 KiB | 61 | | Hungarian | 346 KiB | 62 | | Icelandic | 21 KiB | 63 | | Italian | 1.6 KiB | 64 | | Kurmanji | 1.4 KiB | 65 | | Latin | 1003 B | 66 | | Lithuanian | 6.5 KiB | 67 | | Mongolian | 4.9 KiB | 68 | | Norwegian | 153 KiB | 69 | | Polish | 16 KiB | 70 | | Portuguese | 1.0 KiB | 71 | | Russian | 33 KiB | 72 | | Serbian | 13 KiB | 73 | | Slovak | 13 KiB | 74 | | Slovenian | 5.5 KiB | 75 | | Spanish | 14 KiB | 76 | | Swedish | 24 KiB | 77 | | Turkish | 526 B | 78 | | Turkmen | 1.4 KiB | 79 | | Ukrainian | 21 KiB | 80 | 81 | ## Benchmarks 82 | | Task | `hypher` | [`hyphenation`] | 83 | |------------------------------------|----------:|----------------:| 84 | | Hyphenating `extensive` (english) | **356ns** | 698ns | 85 | | Hyphenating `διαμερίσματα` (greek) | **503ns** | 1121ns | 86 | | Loading the english patterns | **0us** | 151us | 87 | | Loading the greek patterns | **0us** | 0.826us | 88 | 89 | Benchmarks were executed on ARM, Apple M1. 90 | 91 | ## License 92 | The code of this crate is dual-licensed under the MIT and Apache 2.0 licenses. 93 | 94 | The files in `patterns/` are subject to the individual licenses stated therein. 95 | The patterns are processed at build time and then embedded (i.e. statically 96 | linked) into your binary. However, _hypher_ includes only patterns that are 97 | available under permissive licenses. Patterns licenses include the LPPL, MPL, 98 | MIT, BSD-3. 99 | 100 | [`hyphenation`]: https://github.com/tapeinosyne/hyphenation 101 | -------------------------------------------------------------------------------- /bench/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "hypher-bench" 3 | version = "0.1.0" 4 | edition = "2021" 5 | publish = false 6 | 7 | [dev-dependencies] 8 | criterion = "0.3" 9 | hypher = { path = ".." } 10 | hyphenation = { version = "0.8", features = ["embed_all"] } 11 | 12 | [[bench]] 13 | name = "bench" 14 | path = "bench.rs" 15 | harness = false 16 | -------------------------------------------------------------------------------- /bench/bench.rs: -------------------------------------------------------------------------------- 1 | use criterion::{black_box, criterion_group, criterion_main, Criterion}; 2 | use hyphenation::{Hyphenator, Load}; 3 | 4 | fn criterion_benchmark(c: &mut Criterion) { 5 | let english = "extensive"; 6 | let greek = "διαμερίσματα"; 7 | 8 | bench(c, "hypher-english", || { 9 | drain(hypher::hyphenate(black_box(english), black_box(hypher::Lang::English))) 10 | }); 11 | 12 | bench(c, "hypher-greek", || { 13 | drain(hypher::hyphenate(black_box(greek), black_box(hypher::Lang::Greek))) 14 | }); 15 | 16 | let standard_english = 17 | hyphenation::Standard::from_embedded(hyphenation::Language::EnglishUS).unwrap(); 18 | 19 | let standard_greek = 20 | hyphenation::Standard::from_embedded(hyphenation::Language::GreekMono).unwrap(); 21 | 22 | bench(c, "hyphenation-english", || { 23 | drain(black_box(&standard_english).hyphenate(black_box(english)).breaks) 24 | }); 25 | 26 | bench(c, "hyphenation-greek", || { 27 | drain(black_box(&standard_greek).hyphenate(black_box(greek)).breaks) 28 | }); 29 | 30 | bench(c, "hyphenation-load-english", || { 31 | hyphenation::Standard::from_embedded(black_box(hyphenation::Language::EnglishUS)) 32 | }); 33 | 34 | bench(c, "hyphenation-load-greek", || { 35 | hyphenation::Standard::from_embedded(black_box(hyphenation::Language::GreekMono)) 36 | }); 37 | } 38 | 39 | fn bench(c: &mut Criterion, name: &str, f: impl FnMut() -> R + Copy) { 40 | c.bench_function(name, |b| b.iter(f)); 41 | } 42 | 43 | fn drain(iter: impl IntoIterator) { 44 | for _ in iter {} 45 | } 46 | 47 | criterion_group!(benches, criterion_benchmark); 48 | criterion_main!(benches); 49 | -------------------------------------------------------------------------------- /patterns/hyph-ca.tex: -------------------------------------------------------------------------------- 1 | % This is a modified version of `cahyph.tex' for use with Typst's hypher. The 2 | % `n` compatibility command has been removed and the ^^ notation has been 3 | % resolved. We also removed non-pattern exceptions. The original file has been 4 | % retrieved from 5 | % https://ftp.uni-bayreuth.de/packages/TeX/languages/hyphenation/cahyph.tex on 6 | % February 27, 2024. The modification has been made by Martin Haug on the same 7 | % day. 8 | % 9 | % Hyphenation patterns for Catalan. 10 | % This is version 1.11 11 | % Compiled by Gon\c{c}al Badenes and Francina Turon, 12 | % December 1991-January 1995. 13 | % 14 | % Copyright (C) 1991-2003 Gon\c{c}al Badenes 15 | % 16 | % ----------------------------------------------------------------- 17 | % IMPORTANT NOTICE: 18 | % 19 | % This program can be redistributed and/or modified under the terms 20 | % of the LaTeX Project Public License Distributed from CTAN 21 | % archives in directory macros/latex/base/lppl.txt; either 22 | % version 1 of the License, or any later version. 23 | % ----------------------------------------------------------------- 24 | % 25 | %%% ==================================================================== 26 | %%% @TeX-hyphen-file{ 27 | %%% author = "Gon\c{c}al Badenes", 28 | %%% version = "1.11", 29 | %%% date = "15 July 2003", 30 | %%% time = "15:08:12 CET", 31 | %%% filename = "cahyph.tex", 32 | %%% email = "g.badenes@ieee.org", 33 | %%% codetable = "ISO/ASCII", 34 | %%% keywords = "TeX, hyphen, catalan", 35 | %%% supported = "yes", 36 | %%% abstract = "Catalan hyphenation patterns", 37 | %%% docstring = "This file contains the hyphenation patterns 38 | %%% for the catalan language", 39 | %%% } 40 | %%% ==================================================================== 41 | % 42 | % NOTICE: Version 1.11 is identical to version 1.10 (issued on January 17, 43 | % 1995) except for the updated copyright notice above. 44 | % 45 | % The macros used were created for ghyph31.tex by Bernd Raichle (see the 46 | % German hyphenation pattern files for further details) 47 | % 48 | % This patterns have been created using standard, conservative 49 | % hyphenation rules for catalan. The results have refined running them 50 | % through patgen. In that way, the number of hits has been increased. 51 | % 52 | % These rules produce no wrong patterns (Results checked against the 53 | % ``Diccionari Ortogr\`afic i de Pron\'uncia'', Enciclop\`edia 54 | % Catalana. The percentage of valid hyphen misses is lower than 1% 55 | % 56 | % Some of the patterns below represent combinations that never 57 | % happen in Catalan. We have tried to keep them to a minimum. 58 | % 59 | % *** IMPORTANT *** 60 | % \lefthyphenmin and \righthyphenmin should be set to 2 and 2 61 | % respectively. If you set them below these values incorrect breaks 62 | % will happen (specially at the beginning of foreign words and words 63 | % which begin with some prefixes). 64 | % *** IMPORTANT *** 65 | % 66 | % Please report any problem you might have to the authors!!! 67 | % 68 | 69 | \patterns{% 70 | % Attach vowel groups to left consonant 71 | 1ba 1be 1bi 1bo 1bu 72 | 1ca 1ce 1ci 1co 1cu 73 | 1da 1de 1di 1do 3du 74 | 1fa 1fe 1fi 1fo 1fu 75 | 1ga 1ge 1gi 1go 1gu 76 | 1ha 1he 1hi 1ho 1hu 77 | 1ja 1je 1ji 1jo 1ju 78 | 1la 1le 1li 1lo 1lu 79 | 1ma 1me 1mi 1mo 1mu 80 | 1na 1ne 3ni 1no 1nu 81 | 1pa 3pe 3pi 3po 1pu 82 | 1qu 83 | 1ra 1re 1ri 1ro 1ru 84 | 1sa 1se 1si 1so 1su 85 | 1ta 1te 1ti 1to 1tu 86 | 1va 1ve 1vi 1vo 1vu 87 | 1xa 1xe 1xi 1xo 1xu 88 | 1za 1ze 1zi 1zo 1zu 89 | 1bé 1bí 1bó 1bú 1bà 1bè 1bò 90 | 1cé 1cí 1có 1cú 1cà 1cè 1cò 91 | 1ço 1ça 1çu 92 | 1çó 1çú 1çà 1çò 93 | 1dé 1dí 1dó 1dú 1dà 1dè 1dò 94 | 1fé 1fí 1fó 1fú 1fà 1fè 1fò 95 | 1gé 1gí 1gó 1gú 1gà 1gè 96 | 1gò 1gü 97 | 1hé 1hí 1hó 1hú 1hà 1hè 1hò 98 | 1jé 1jí 1jó 1jú 1jà 1jè 1jò 99 | 1lé 1lí 1ló 1lú 1là 1lè 1lò 100 | 1mé 1mí 1mó 1mú 1mà 1mè 1mò 101 | 1né 1ní 1nó 1nú 1nà 1nè 1nò 102 | 1pé 1pí 1pó 1pú 1pà 1pè 1pò 103 | 1qü 104 | 1ré 1rí 1ró 1rú 1rà 1rè 1rò 105 | 1sé 1sí 1só 1sú 1sà 1sè 1sò 106 | 1té 1tí 1tó 1tú 1tà 1tè 1tò 107 | 1vé 1ví 1vó 1vú 1và 1vè 1vò 108 | 1xé 1xí 1xó 1xú 1xà 1xè 1xò 109 | 1zé 1zí 1zó 1zú 1zà 1zè 1zò 110 | % 111 | % Build legal consonant groups, leave other consonants bound to 112 | % the previous group. This overrides part of the previous pattern 113 | % group. 114 | 3l2la 1l2le 1l2li 3l2lo 1l2lu 115 | 1b2la 1b2le 1b2li 1b2lo 1b2lu 116 | 1b2ra 1b2re 1b2ri 1b2ro 1b2ru 117 | 1c2la 1c2le 1c2li 1c2lo 1c2lu 118 | 1c2ra 1c2re 1c2ri 1c2ro 1c2ru 119 | 1d2ra 1d2re 1d2ri 1d2ro 1d2ru 120 | 1f2la 1f2le 1f2li 1f2lo 1f2lu 121 | 1f2ra 1f2re 1f2ri 1f2ro 1f2ru 122 | 1g2la 1g2le 1g2li 1g2lo 1g2lu 123 | 1g2ra 1g2re 1g2ri 1g2ro 1g2ru 124 | 1p2la 1p2le 1p2li 1p2lo 1p2lu 125 | 1p2ra 1p2re 1p2ri 1p2ro 1p2ru 126 | 1t2ra 1t2re 1t2ri 1t2ro 1t2ru 127 | 1n2ya 1n2ye 1n2yi 1n2yo 1n2yu 128 | 1l2lé 1l2lí 1l2ló 1l2lú 1l2là 129 | 1l2lè 1l2lò 130 | 1b2lé 1b2lí 1b2ló 1b2lú 1b2là 131 | 1b2lè 1b2lò 132 | 1b2ré 1b2rí 1b2ró 1b2rú 1b2rà 133 | 1b2rè 1b2rò 134 | 1c2lé 1c2lí 1c2ló 1c2lú 1c2là 135 | 1c2lè 1c2lò 136 | 1c2ré 1c2rí 1c2ró 1c2rú 1c2rà 137 | 1c2rè 1c2rò 138 | 1d2ré 1d2rí 1d2ró 1d2rú 1d2rà 139 | 1d2rè 1d2rò 140 | 1f2lé 1f2lí 1f2ló 1f2lú 1f2là 141 | 1f2lè 1f2lò 142 | 1f2ré 1f2rí 1f2ró 1f2rú 1f2rà 143 | 1f2rè 1f2rò 144 | 1g2lé 1g2lí 1g2ló 1g2lú 1g2là 145 | 1g2lè 1g2lò 146 | 1g2ré 1g2rí 1g2ró 1g2rú 1g2rà 147 | 1g2rè 1g2rò 148 | 1p2lé 1p2lí 1p2ló 1p2lú 1p2là 149 | 1p2lè 1p2lò 150 | 1p2ré 1p2rí 1p2ró 1p2rú 1p2rà 151 | 1p2rè 1p2rò 152 | 1t2ré 1t2rí 1t2ró 1t2rú 1t2rà 153 | 1t2rè 1t2rò 154 | 1n2yé 1n2yí 1n2yó 1n2yú 1n2yà 155 | 1n2yè 1n2yò 156 | % 157 | % Vowels are kept together by the defaults 158 | % We break here diphthongs and the like 159 | a1a a1e a1o 160 | e1a e1e e1o 161 | i1a i1e i1o 162 | o1a o1e o1o 163 | u1a u1e u1o 164 | a1é a1í a1ó a1ú a1à a1è 165 | a1ò a1ï a1ü 166 | e1é e1í e1ó e1ú e1à e1è 167 | e1ò e1ï e1ü 168 | i1é i1í i1ó i1ú i1à i1è 169 | i1ò i1ï i1ü 170 | o1é o1í o1ó o1ú o1à o1è 171 | o1ò o1ï o1ü 172 | u1é u1í u1ó u1ú u1à u1è 173 | u1ò u1ï u1ü 174 | é1a é1e é1o 175 | é1ï é1ü 176 | í1a í1e í1o 177 | í1ï í1ü 178 | ó1a ó1e ó1o 179 | ó1ï ó1ü 180 | ú1a ú1e ú1o 181 | ú1ï ú1ü 182 | à1a à1e à1o 183 | à1ï à1ü 184 | è1a è1e è1o 185 | è1ï è1ü 186 | ò1a ò1e ò1o 187 | ò1ï ò1ü 188 | ï1a ï1e ï1o ï1é ï1í 189 | ï1ó ï1ú ï1à 190 | ï1è ï1ò ï1i 191 | ü1a ü1e ü1o ü1é ü1í 192 | ü1ó ü1ú ü1à 193 | ü1è ü1ò 194 | % 195 | % We consider here i and u as semiconsonants 196 | a1i2a a1i2e a1i2o a1i2u 197 | a1u2a a1u2e a1u2i a1u2o a1u2u 198 | e1i2a e1i2e e1i2o e1i2u 199 | e1u2a e1u2e e1u2i e1u2o e1u2u 200 | i1i2a i1i2e i1i2o i1i2u 201 | i1u2a i1u2e i1u2i i1u2o i1u2u 202 | o1i2a o1i2e o1i2o o1i2u 203 | o1u2a o1u2e o1u2o o1u2i o1u2u 204 | u1i2a u1i2e u1i2o u1i2u 205 | u1u2a u1u2e u1u2i u1u2o u1u2u 206 | a1i2é a1i2í a1i2ó a1i2ú a1i2à 207 | a1i2è a1i2ò 208 | a1u2é a1u2í a1u2ó a1u2ú a1u2à 209 | a1u2è a1u2ò 210 | e1i2é e1i2í e1i2ó e1i2ú e1i2à 211 | e1i2è e1i2ò 212 | e1u2é e1u2í e1u2ó e1u2ú e1u2à 213 | e1u2è e1u2ò 214 | i1i2é i1i2í i1i2ó i1i2ú i1i2à 215 | i1i2è i1i2ò 216 | i1u2é i1u2í i1u2ó i1u2ú i1u2à 217 | i1u2è i1u2ò 218 | o1i2é o1i2í o1i2ó o1i2ú o1i2à 219 | o1i2è o1i2ò 220 | o1u2é o1u2í o1u2ó o1u2ú o1u2à 221 | o1u2è o1u2ò 222 | u1i2é u1i2í u1i2ó u1i2ú u1i2à 223 | u1i2è u1i2ò 224 | u1u2é u1u2í u1u2ó u1u2ú u1u2à 225 | u1u2è u1u2ò 226 | é1i2a é1i2e é1i2o é1i2u 227 | é1u2a é1u2e é1u2o é1u2i é1u2u 228 | í1i2a í1i2e í1i2o í1i2u 229 | í1u2a í1u2e í1u2o í1u2i í1u2u 230 | ó1i2a ó1i2e ó1i2o ó1i2u 231 | ó1u2a ó1u2e ó1u2o ó1u2i ó1u2u 232 | ú1i2a ú1i2e ú1i2o ú1i2u 233 | ú1u2a ú1u2e ú1u2o ú1u2i ú1u2u 234 | à1i2a à1i2e à1i2o à1i2u 235 | à1u2a à1u2e à1u2o à1u2i à1u2u 236 | è1i2a è1i2e è1i2o è1i2u 237 | è1u2a è1u2e è1u2o è1u2i è1u2u 238 | ò1i2a ò1i2e ò1i2o ò1i2u 239 | ò1u2a ò1u2e ò1u2o ò1u2i ò1u2u 240 | ï1i2a ï1i2e ï1i2o ï1i2é ï1i2í 241 | ï1i2ó 242 | ï1i2ú ï1i2à 243 | ï1i2è ï1i2ò ï1i2u 244 | ï1u2a ï1u2e ï1u2o ï1u2é ï1u2í 245 | ï1u2ó 246 | ï1u2ú ï1u2à 247 | ï1u2è ï1u2ò ï1u2i ï1u2u 248 | ü1i2a ü1i2e ü1i2o ü1i2é ü1i2í 249 | ü1i2ó 250 | ü1i2ú ü1i2à 251 | ü1i2è ü1i2ò ü1i2u 252 | ü1u2a ü1u2e ü1u2o ü1u2é ü1u2í 253 | ü1u2ó 254 | ü1u2ú ü1u2à 255 | ü1u2è ü1u2ò ü1u2i ü1u2u 256 | % 257 | % Semiconsonants at the beginning of word 258 | % .i2a .i2e .i2o .i2u .u2a .u2e .u2i .u2o 259 | .hi2a .hi2e .hi2o .hi2u .hu2a .hu2e .hu2i .hu2o 260 | % .i2é .i2í .i2ó .i2ú .i2à 261 | .i2è .i2ò 262 | % .u2é .u2í .u2ó .u2ú .u2à 263 | .u2è .u2ò 264 | .hi2é .hi2ó .hi2ú .hi2à .hi2è 265 | .hi2ò 266 | .hu2é .hu2í .hu2ó .hu2à .hu2è 267 | .hu2ò 268 | % 269 | % And now the crescent diphtongs 270 | gu2a gu2e gu2i gu2o qu2a qu2e qu2i qu2o 271 | gu2é gu2í gu2ó gu2à gu2è 272 | gu2ò 273 | qu2é qu2í qu2ó qu2à qu2è 274 | qu2ò 275 | gü2e gü2é gü2í gü2è gü2i 276 | qü2e qü2é qü2í qü2è qü2i 277 | % 278 | % We add here some exceptions to the rules for diaeresis 279 | a1isme. e1isme. i1isme. o1isme. u1isme. 280 | a1ista. e1ista. i1ista. o1ista. u1ista. 281 | a1um. e1um. i1um. o1um. u1um. 282 | % a1us. e1us. i1us. o1us. u1us. 283 | % 284 | % disallow hyphenation on possible prefixes 285 | .antihi2 .be2n .be2s .bi2s .ca2p .ce2l .cla2r .co2ll .co2n .co2r .de2s 286 | .di2s .en3a .hipe2r .hiperm2n .in3ac .in3ad .in3ap .in3es .in3o 287 | .inte2r .ma2l .mal1t2hus .pa2n .pe2r .pe3ri .pos2t .psa2l .rebe2s 288 | .re2d .su2b .sub3o .subde2s .supe2r .tran2s 289 | % .a2b .a2n .e2n .e2x .g2h .g2n .i2n .o2b .p2s 290 | % 291 | % Avoid hyphenation on some intra-word groups 292 | g2no p2si p2se p2neu 293 | g2nò p2sí 294 | % 295 | % Avoid wrong hyphenation on some foreign-origin words 296 | .ch2 .th2 297 | % .c2h2 .d2h2 .k2s2 .m2n2 .r2h2 .s2 .t2h2 .t2s2 .t2x2 .w2h2 298 | ein1s2tein ru1t2herford ni2etz1sc2he 299 | % 300 | % Add some good patterns found by patgen 301 | 3exp 3nef 3nei 3pr 3ser a3ne a3ri bi3se des3ag des3ar des3av des3enc 302 | e3ism e3le e3rio e3ris es3aco es3af es3ap es3arr es3as es3int 303 | ig3n in3ex n3si o3ro qui3e s3emp s3esp sub3a ui3et 304 | o3gnò 305 | } 306 | -------------------------------------------------------------------------------- /patterns/hyph-da.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for Danish 2 | % copyright: Copyright (C) 1994 Frank Jensen 3 | % notice: This file is part of the hyph-utf8 package. 4 | % See http://www.hyphenation.org/tex for more information. 5 | % language: 6 | % name: Danish 7 | % tag: da 8 | % version: 2011-01-11 9 | % authors: 10 | % - 11 | % name: Frank Jensen 12 | % contact: frank.jensen (at) hugin.com 13 | % licence: 14 | % - This file is available under any of these licences: 15 | % - 16 | % name: LPPL 17 | % version: 1.3 18 | % or_later: true 19 | % url: http://www.latex-project.org/lppl/lppl-1-3.html 20 | % - 21 | % name: MIT 22 | % url: https://opensource.org/licenses/MIT 23 | % text: > 24 | % Permission is hereby granted, free of charge, to any person 25 | % obtaining a copy of this software and associated documentation 26 | % files (the "Software"), to deal in the Software without 27 | % restriction, including without limitation the rights to use, 28 | % copy, modify, merge, publish, distribute, sublicense, and/or sell 29 | % copies of the Software, and to permit persons to whom the 30 | % Software is furnished to do so, subject to the following 31 | % conditions: 32 | % 33 | % The above copyright notice and this permission notice shall be 34 | % included in all copies or substantial portions of the Software. 35 | % 36 | % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 37 | % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 38 | % OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 39 | % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 40 | % HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 41 | % WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 42 | % FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 43 | % OTHER DEALINGS IN THE SOFTWARE. 44 | % hyphenmins: 45 | % typesetting: 46 | % left: 2 47 | % right: 2 48 | % changes: 49 | % - 2011-01-11 - remove support for OT1 encoding 50 | % texlive: 51 | % encoding: ec 52 | % babelname: danish 53 | % legacy_patterns: dkhyph.tex 54 | % message: Danish hyphenation patterns 55 | % description: Hyphenation patterns for Danish in T1/EC and UTF-8 encodings. 56 | % 57 | \patterns{ 58 | .ae3 59 | .an3k 60 | .an1s 61 | .be5la 62 | .be1t 63 | .bi4tr 64 | .der3i 65 | .diagno5 66 | .her3 67 | .hoved3 68 | .ne4t5 69 | .om1 70 | .ove4 71 | .po1 72 | .til3 73 | .yd5r 74 | ab5le 75 | 3abst 76 | a3c 77 | ade5la 78 | 5adg 79 | a1e 80 | 5afg 81 | 5a4f1l 82 | af3r 83 | af4ri 84 | 5afs 85 | a4gef 86 | a4gi 87 | ag5in 88 | ag5si 89 | 3agti 90 | a4gy 91 | a3h 92 | ais5t 93 | a3j 94 | a5ka 95 | a3ke 96 | a5kr 97 | aku5 98 | a3la 99 | a1le 100 | a1li 101 | al3k 102 | 4alkv 103 | a1lo 104 | al5si 105 | a3lu 106 | a1ly 107 | am4pa 108 | 3analy 109 | an4k5r 110 | a3nu 111 | 3anv 112 | a5o 113 | a5pe 114 | a3pi 115 | a5po 116 | a1ra 117 | ar5af 118 | 1arb 119 | a1re 120 | 5arg 121 | a1ri 122 | a3ro 123 | a3sa 124 | a3sc 125 | a1si 126 | a3sk 127 | a3so 128 | 3a3sp 129 | a3ste 130 | a3sti 131 | a1ta1 132 | a1te 133 | a1ti 134 | a4t5in 135 | a1to 136 | ato5v 137 | a5tr 138 | a1tu 139 | a5va 140 | a1ve 141 | a5z 142 | 1ba 143 | ba4ti 144 | 4bd 145 | 1be 146 | be1k 147 | be3ro 148 | be5ru 149 | be1s4 150 | be1tr 151 | 1bi 152 | bi5sk 153 | b1j 154 | 4b1n 155 | 1bo 156 | bo4gr 157 | bo3ra 158 | bo5re 159 | 1br4 160 | 4bs 161 | bs5k 162 | b3so 163 | b1st 164 | b5t 165 | 3bu 166 | bu4s5tr 167 | b5w 168 | 1by 169 | by5s 170 | 4c1c 171 | 1ce 172 | ce5ro 173 | 3ch 174 | 4ch. 175 | ci4o 176 | ck3 177 | 5cy 178 | 3da 179 | 4d3af 180 | d5anta 181 | da4s 182 | d1b 183 | d1d4 184 | 1de 185 | de5d 186 | 4de4lem 187 | der5eri 188 | de4rig 189 | de5sk 190 | d1f 191 | d1g 192 | d3h 193 | 1di 194 | di1e 195 | di5l 196 | d3j 197 | d1k 198 | d1l 199 | d1m 200 | 4d1n 201 | 3do 202 | 4dop 203 | d5ov 204 | d1p 205 | 4drett 206 | 5d4reve 207 | 3drif 208 | 3driv 209 | d5ros 210 | d5ru 211 | ds5an 212 | ds5in 213 | d1ski 214 | d4sm 215 | d4su 216 | dsu5l 217 | ds5vi 218 | d3ta 219 | d1te 220 | dt5o 221 | d5tr 222 | dt5u 223 | 1du 224 | dub5 225 | d1v 226 | 3dy 227 | e5ad 228 | e3af 229 | e5ag 230 | e3ak 231 | e1al 232 | ea4la 233 | e3an 234 | e5ap 235 | e3at 236 | e3bl 237 | ebs3 238 | e1ci 239 | ed5ar 240 | edde4 241 | eddel5 242 | e4do 243 | ed5ra 244 | ed3re 245 | ed3rin 246 | ed4str 247 | e3e 248 | 3eff 249 | e3fr 250 | 3eft 251 | e3gu 252 | e1h 253 | e3in 254 | ei5s 255 | e3je 256 | e4j5el 257 | e1ka 258 | e3ke 259 | e3kl 260 | 4e1ko 261 | e5kr 262 | ek5sa 263 | 3eksem 264 | 3eksp 265 | e3ku 266 | e1kv 267 | e5ky 268 | e3lad 269 | el3ak 270 | el3ar 271 | e1las 272 | e3le 273 | e4lek 274 | 3elem 275 | e1li 276 | 5elim 277 | e3lo 278 | el5sa 279 | e5lu 280 | e3ly 281 | e4mad 282 | em4p5le 283 | em1s 284 | en5ak 285 | e4nan 286 | 4enn 287 | e4no 288 | en3so 289 | e5nu 290 | e5ol 291 | e3op 292 | e1or 293 | e3ov 294 | epi3 295 | e1pr 296 | e3ra 297 | er3af 298 | e4rag 299 | e4rak 300 | e1re 301 | e4ref 302 | er5ege 303 | 5erhv 304 | e1ri 305 | e4rib 306 | er1k 307 | ero5d 308 | er5ov 309 | er3s 310 | er5tr 311 | e3rum 312 | er5un 313 | e5ry 314 | e1ta 315 | e1te 316 | etek4s 317 | e1ti 318 | e3tj 319 | e1to 320 | e3tr 321 | e3tu 322 | e1ty 323 | e3um 324 | e3un 325 | 3eur 326 | e1va 327 | e3ve 328 | e4v3erf 329 | e1vi 330 | e5x 331 | 1fa 332 | fa4ce 333 | fags3 334 | f1b 335 | f1d 336 | 1fe 337 | fej4 338 | fejl1 339 | f1f 340 | f1g 341 | f1h 342 | 1fi 343 | f1k 344 | 3fl 345 | 1fo 346 | for1en 347 | fo4ri 348 | f1p 349 | f1s4 350 | 4ft 351 | f3ta 352 | f1te 353 | f1ti 354 | f5to 355 | f5tvi 356 | 1fu 357 | f1v 358 | 3fy 359 | 1ga 360 | g3art 361 | g1b 362 | g1d 363 | 1ge 364 | 4g5enden 365 | ger3in 366 | ge3s 367 | g3f 368 | g1g 369 | g1h 370 | 1gi 371 | gi4b 372 | gi3st 373 | 5gj 374 | g3k 375 | g1l 376 | g1m 377 | 3go 378 | 4g5om 379 | g5ov 380 | g3p 381 | 1gr 382 | gs1a 383 | gsde4len 384 | g4se 385 | gsha4 386 | g5sla 387 | gs3or 388 | gs1p 389 | g5s4tide 390 | g4str 391 | gs1v 392 | g3ta 393 | g1te 394 | g1ti 395 | g5to 396 | g3tr 397 | gt4s 398 | g3ud 399 | gun5 400 | g3v 401 | 1gy 402 | g5yd 403 | 4ha. 404 | heds3 405 | he5s 406 | 4het 407 | hi4e 408 | hi4n5 409 | hi3s 410 | ho5ko 411 | ho5ve 412 | 4h3t 413 | hun4 414 | hund3 415 | hvo4 416 | i1a 417 | i3b 418 | i4ble 419 | i1c 420 | i3dr 421 | ids5k 422 | i1el 423 | i1en 424 | i3er 425 | i3et. 426 | if3r 427 | i3gu 428 | i3h 429 | i5i 430 | i5j 431 | i1ka 432 | i1ke 433 | ik1l 434 | i5ko 435 | ik3re 436 | ik5ri 437 | iks5t 438 | ik4tu 439 | i3ku 440 | ik3v 441 | i3lag 442 | il3eg 443 | il5ej 444 | il5el 445 | i3li 446 | i4l5id 447 | il3k 448 | i1lo 449 | il5u 450 | i3mu 451 | ind3t 452 | 5inf 453 | ings1 454 | in3s 455 | in4sv 456 | inter1 457 | i3nu 458 | i3od 459 | i3og 460 | i5ok 461 | i3ol 462 | ion4 463 | ions1 464 | i5o5r 465 | i3ot 466 | i5pi 467 | i3pli 468 | i5pr 469 | i3re 470 | i3ri 471 | ir5t 472 | i3sc 473 | i3si 474 | i4sm 475 | is3p 476 | i1ster 477 | i3sti 478 | i5sua 479 | i1ta 480 | i1te 481 | i1ti 482 | i3to 483 | i3tr 484 | it5re. 485 | i1tu 486 | i3ty 487 | i1u 488 | i1va 489 | i1ve 490 | i1vi 491 | j3ag 492 | jde4rer 493 | jds1 494 | jek4to 495 | 4j5en. 496 | j5k 497 | j3le 498 | j3li 499 | jlmeld5 500 | jlmel4di 501 | j3r 502 | jre5 503 | ju3s 504 | 5kap 505 | k5au 506 | 5kav 507 | k5b 508 | kel5s 509 | ke3sk 510 | ke5st 511 | ke4t5a 512 | k3h 513 | ki3e 514 | ki3st 515 | k1k 516 | k5lak 517 | k1le 518 | 3klu 519 | k4ny 520 | 5kod 521 | 1kon 522 | ko3ra 523 | 3kort 524 | ko3v 525 | 1kra 526 | 5kry 527 | ks3an 528 | k1si 529 | ks3k 530 | ks1p 531 | k3ste 532 | k5stu 533 | ks5v 534 | k1t 535 | k4tar 536 | k4terh 537 | kti4e 538 | kt5re 539 | kt5s 540 | 3kur 541 | 1kus 542 | 3kut 543 | k4vo 544 | k4vu 545 | 5lab 546 | lad3r 547 | 5lagd 548 | la4g3r 549 | 5lam 550 | 1lat 551 | l1b 552 | ldiagnos5 553 | l3dr 554 | ld3st 555 | 1le. 556 | 5led 557 | 4lele 558 | le4mo 559 | 3len 560 | 1ler 561 | 1les 562 | 4leu 563 | l1f 564 | lfin4 565 | lfind5 566 | l1go1 567 | l3h 568 | li4ga 569 | 4l5ins 570 | 4l3int 571 | li5o 572 | l3j 573 | l1ke 574 | l1ko 575 | l3ky 576 | l1l 577 | l5mu 578 | lo4du 579 | l3op 580 | 4l5or 581 | 3lov 582 | 4l3p 583 | l4ps 584 | l3r 585 | 4ls 586 | lses1 587 | ls5in 588 | l5sj 589 | l1ta 590 | l4taf 591 | l1te 592 | l4t5erf 593 | l3ti 594 | lt3o 595 | l3tr 596 | l3tu 597 | lu5l 598 | l3ve 599 | l3vi 600 | 1ma 601 | m1b 602 | m3d 603 | 1me 604 | 4m5ej 605 | m3f 606 | m1g 607 | m3h 608 | 1mi 609 | mi3k 610 | m5ing 611 | mi4o 612 | mi5sty 613 | m3k 614 | m1l 615 | m1m 616 | mmen5 617 | m1n 618 | 3mo 619 | mo4da 620 | 4mop 621 | 4m5ov 622 | m1pe 623 | m3pi 624 | m3pl 625 | m1po 626 | m3pr 627 | m1r 628 | mse5s 629 | ms5in 630 | m5sk 631 | ms3p 632 | m3ste 633 | ms5v 634 | m3ta 635 | m3te 636 | m3ti 637 | m3tr 638 | m1ud 639 | 1mul 640 | mu1li 641 | 3my 642 | 3na 643 | 4nak 644 | 1nal 645 | n1b 646 | n1c 647 | 4nd 648 | n3dr 649 | nd5si 650 | nd5sk 651 | nd5sp 652 | 1ne 653 | ne5a 654 | ne4da 655 | nemen4 656 | nement5e 657 | neo4 658 | n3erk 659 | n5erl 660 | ne5sl 661 | ne5st 662 | n1f 663 | n4go 664 | 4n1h 665 | 1ni 666 | 4nim 667 | ni5o 668 | ni3st 669 | n1ke 670 | n1ko 671 | n3kr 672 | n3ku 673 | n5kv 674 | 4n1l 675 | n1m 676 | n1n 677 | 1no 678 | n3ord 679 | n5p 680 | n3r 681 | 4ns 682 | n3si 683 | n1sku 684 | ns3po 685 | n1sta 686 | n5sti 687 | n1ta 688 | nta4le 689 | n1te 690 | n1ti 691 | ntiali4 692 | n3to 693 | n1tr 694 | nt4s5t 695 | nt4su 696 | n3tu 697 | n3ty 698 | 4n1v 699 | 3ny 700 | n3z 701 | o3a 702 | o4as 703 | ob3li 704 | o1c 705 | o4din 706 | od5ri 707 | od5s 708 | od5un 709 | o1e 710 | of5r 711 | o4gek 712 | o4gel 713 | o4g5o 714 | og5re 715 | og5sk 716 | o5h 717 | o5in 718 | oi6s5e 719 | o1j 720 | o3ka 721 | o1ke 722 | o3ku 723 | o3la 724 | o3le 725 | o1li 726 | o1lo 727 | o3lu 728 | o5ly 729 | 1omr 730 | on3k 731 | ook5 732 | o3or 733 | o5ov 734 | o3pi 735 | op3l 736 | op3r 737 | op3s 738 | 3opta 739 | 4or. 740 | or1an 741 | 3ordn 742 | ord5s 743 | o3re. 744 | o3reg 745 | o3rek 746 | o3rer 747 | o3re3s 748 | o3ret 749 | o3ri 750 | 3orient 751 | or5im 752 | o4r5in 753 | or3k 754 | or5o 755 | or3sl 756 | or3st 757 | o3si 758 | o3so 759 | o3t 760 | o1te 761 | o5un 762 | ov4s 763 | 3pa 764 | pa5gh 765 | p5anl 766 | p3d 767 | 4pec 768 | 3pen 769 | 1per 770 | pe1ra 771 | pe5s 772 | pe3u 773 | p3f 774 | 4p5h 775 | 1pla 776 | p4lan 777 | 4ple. 778 | 4pler 779 | 4ples 780 | p3m 781 | p3n 782 | 5pok 783 | 4po3re 784 | 3pot 785 | 4p5p4 786 | p4ro 787 | 1proc 788 | p3sk 789 | p5so 790 | ps4p 791 | p3st 792 | p1t 793 | 1pu 794 | pu5b 795 | p5ule 796 | p5v 797 | 5py3 798 | qu4 799 | 4raf 800 | ra5is 801 | 4rarb 802 | r1b 803 | r4d5ar 804 | r3dr 805 | rd4s3 806 | 4reks 807 | 1rel 808 | re5la 809 | r5enss 810 | 5rese 811 | re5spo 812 | 4ress 813 | re3st 814 | re5s4u 815 | 5rett 816 | r1f 817 | r1gu 818 | r1h 819 | ri1e 820 | ri5la 821 | 4rimo 822 | r4ing 823 | ringse4 824 | ringso4r 825 | 4rinp 826 | 4rint 827 | r3ka 828 | r1ke 829 | r1ki 830 | rk3so 831 | r3ku 832 | r1l 833 | rmo4 834 | r5mu 835 | r1n 836 | ro1b 837 | ro3p 838 | r3or 839 | r3p 840 | r1r 841 | rre5s 842 | rro4n5 843 | r1sa 844 | r1si 845 | r5skr 846 | r4sk5v 847 | rs4n 848 | r3sp 849 | r5stu 850 | r5su 851 | r3sv 852 | r5tal 853 | r1te 854 | r4teli 855 | r1ti 856 | r3to 857 | r4t5or 858 | rt5rat 859 | rt3re 860 | r5tri 861 | r5tro 862 | rt3s 863 | r5ty 864 | r3ud 865 | run4da 866 | 5rut 867 | r3va 868 | r1ve 869 | r3vi 870 | ry4s 871 | s3af 872 | 1sam 873 | sa4ma 874 | s3ap 875 | s1ar 876 | 1sat 877 | 4s1b 878 | s1d 879 | sdy4 880 | 1se 881 | s4ed 882 | 5s4er 883 | se4se 884 | s1f 885 | 4s1g4 886 | 4s3h 887 | si4bl 888 | 1sig 889 | s5int 890 | 5sis 891 | 5sit 892 | 5siu 893 | s5ju 894 | 4sk. 895 | 1skab 896 | 1ske 897 | s3kl 898 | sk5s4 899 | 5sky 900 | s1le 901 | s1li 902 | slo3 903 | 5slu 904 | s5ly 905 | s1m 906 | s4my 907 | 4snin 908 | s4nit 909 | so5k 910 | 5sol 911 | 5som. 912 | 3somm 913 | s5oms 914 | 5somt 915 | 3son 916 | 4s1op 917 | sp4 918 | 3spec 919 | 4sper 920 | 3s4pi 921 | s1pl 922 | 3sprog. 923 | s5r4 924 | s1s4 925 | 4st. 926 | 5s4tam 927 | 1stan 928 | st5as 929 | 3stat 930 | 1stav 931 | 1ste. 932 | 1sted 933 | 3stel 934 | 5stemo 935 | 1sten 936 | 5step 937 | 3ster. 938 | 3stes 939 | 5stet 940 | 5stj 941 | 3sto 942 | st5om 943 | 1str 944 | s1ud 945 | 3sul 946 | s3un 947 | 3sur 948 | s3ve 949 | 3s4y 950 | 1sy1s 951 | 5ta. 952 | 1tag 953 | tands3 954 | 4tanv 955 | 4tb 956 | tede4l 957 | teds5 958 | 3teg 959 | 5tekn 960 | teo1 961 | 5term 962 | te5ro 963 | 4t1f 964 | 6t3g 965 | t1h 966 | tialis5t 967 | 3tid 968 | ti4en 969 | ti3st 970 | 4t3k 971 | 4t1l 972 | tli4s5 973 | t1m 974 | t1n 975 | to5ra 976 | to1re 977 | to1ri 978 | tor4m 979 | 4t3p 980 | t4ra 981 | 4tres 982 | tro5v 983 | 1try 984 | 4ts 985 | t3si 986 | ts4pa 987 | ts5pr 988 | t3st 989 | ts5ul 990 | 4t1t 991 | t5uds 992 | 5tur 993 | t5ve 994 | 1typ 995 | u1a 996 | 5udl 997 | ud5r 998 | ud3s 999 | 3udv 1000 | u1e 1001 | ue4t5 1002 | uge4ri 1003 | ugs3 1004 | u5gu 1005 | u3i 1006 | u5kl 1007 | uk4ta 1008 | uk4tr 1009 | u1la 1010 | u1le 1011 | u5ly 1012 | u5pe 1013 | up5l 1014 | u5q 1015 | u3ra 1016 | u3re 1017 | u4r3eg 1018 | u1rer 1019 | u3ro 1020 | us5a 1021 | u3si 1022 | u5ska 1023 | u5so 1024 | us5v 1025 | u1te 1026 | u1ti 1027 | u1to 1028 | ut5r 1029 | ut5s4 1030 | 5u5v 1031 | va5d 1032 | 3varm 1033 | 1ved 1034 | ve4l5e 1035 | ve4reg 1036 | ve3s 1037 | 5vet 1038 | v5h 1039 | vi4l3in 1040 | 1vis 1041 | v5j 1042 | v5k 1043 | vl4 1044 | v3le 1045 | v5li 1046 | vls1 1047 | 1vo 1048 | 4v5om 1049 | v5p 1050 | v5re 1051 | v3st 1052 | v5su 1053 | v5t 1054 | 3vu 1055 | y3a 1056 | y5dr 1057 | y3e 1058 | y3ke 1059 | y5ki 1060 | yk3li 1061 | y3ko 1062 | yk4s5 1063 | y3kv 1064 | y5li 1065 | y5lo 1066 | y5mu 1067 | yns5 1068 | y5o 1069 | y1pe 1070 | y3pi 1071 | y3re 1072 | yr3ek 1073 | y3ri 1074 | y3si 1075 | y3ti 1076 | y5t3r 1077 | y5ve 1078 | zi5o 1079 | .så3 1080 | .ær5i 1081 | .øv3r 1082 | a3tø 1083 | a5væ 1084 | brød3 1085 | 5bæ 1086 | 5drøv 1087 | dstå4 1088 | 3dæ 1089 | 3dø 1090 | e3læ 1091 | e3lø 1092 | e3rø 1093 | er5øn 1094 | e5tæ 1095 | e5tø 1096 | e1væ 1097 | e3æ 1098 | e5å 1099 | 3fæ 1100 | 3fø 1101 | fø4r5en 1102 | giø4 1103 | g4sø 1104 | g5så 1105 | 3gæ 1106 | 3gø1 1107 | 3gå 1108 | i5tæ 1109 | i3ø 1110 | 3kø 1111 | 3kå 1112 | lingeniø4 1113 | l3væ 1114 | 5løs 1115 | m5tå 1116 | 1mæ 1117 | 3mø 1118 | 3må 1119 | n3kæ 1120 | n5tæ 1121 | 3næ 1122 | 4n5æb 1123 | 5nø 1124 | o5læ 1125 | or3ø 1126 | o5å 1127 | 5præ 1128 | 5pæd 1129 | på3 1130 | r5kæ 1131 | r5tæ 1132 | r5tø 1133 | r3væ 1134 | r5æl 1135 | 4røn 1136 | 5rør 1137 | 3råd 1138 | r5år 1139 | s4kå 1140 | 3slå 1141 | s4næ 1142 | 5stø 1143 | 1stå 1144 | 1sæ 1145 | 4s5æn 1146 | 1sø 1147 | s5øk 1148 | så4r5 1149 | ti4ø 1150 | 3træk. 1151 | t4sø 1152 | t5så 1153 | t3væ 1154 | u3læ 1155 | 3værd 1156 | 1værk 1157 | 5vå 1158 | y5væ 1159 | æb3l 1160 | æ3c 1161 | æ3e 1162 | æg5a 1163 | æ4gek 1164 | æ4g5r 1165 | ægs5 1166 | æ5i 1167 | æ5kv 1168 | ælle4 1169 | æn1dr 1170 | æ5o 1171 | æ1re 1172 | ær4g5r 1173 | æ3ri 1174 | ær4ma 1175 | ær4mo 1176 | ær5s 1177 | æ5si 1178 | æ3so 1179 | æ3ste 1180 | æ3ve 1181 | øde5 1182 | ø3e 1183 | ø1je 1184 | ø3ke 1185 | ø3le 1186 | øms5 1187 | øn3st 1188 | øn4t3 1189 | ø1re 1190 | ø3ri 1191 | ørne3 1192 | ør5o 1193 | ø1ve 1194 | å1d 1195 | å1e 1196 | å5h 1197 | å3l 1198 | å3re 1199 | års5t 1200 | å5sk 1201 | å3t 1202 | } 1203 | -------------------------------------------------------------------------------- /patterns/hyph-el-monoton.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for Modern Greek, monotonic 2 | % copyright: Copyright (C) 2008-2011 Dimitrios Filippou 3 | % notice: This file is part of the hyph-utf8 package. 4 | % See http://www.hyphenation.org/tex for more information. 5 | % language: 6 | % name: Modern Greek, monotonic spelling 7 | % tag: el-monoton 8 | % version: 5.0 9 | % authors: 10 | % - 11 | % name: Dimitrios Filippou 12 | % contact: dimitrios.filippou (at) riotinto.com 13 | % licence: 14 | % name: LPPL 15 | % url: https://latex-project.org/lppl/ 16 | % hyphenmins: 17 | % typesetting: 18 | % left: 1 19 | % right: 1 20 | % changes: 21 | % - Created: June 6, 2008 22 | % - Last modified: Sept. 12, 2011 23 | % texlive: 24 | % babelname: monogreek 25 | % use_old_patterns_comment: Old patterns work in a different way, one-to-one conversion from UTF-8 is not possible. 26 | % legacy_patterns: grmhyph5.tex 27 | % message: Hyphenation patterns for uni-accent (monotonic) Modern Greek 28 | % package: greek 29 | % ========================================== 30 | % This file was first created by mechanical translation from 31 | % GRMhyph5.tex via "elhyph-utf8 -m -c" (version 0.1 by Peter 32 | % Heslin -- p.j.heslin at durham dot ac dot uk). Some additions 33 | % were also made by hand. 34 | % 35 | % Created by Dimitrios Filippou with some ideas borrowed from 36 | % Yannis Haralambous, Kostis Dryllerakis and Claudio Beccari. 37 | % Mojca Miklavec adapted it for the "hyph-utf8" package. 38 | % 39 | % These hyphenation patterns are explained in "modern.pdf", which 40 | % can be found in the "elhyphen" or "hyphenation-greek" package. 41 | % 42 | % Documentation in English can be found in: D. Filippou, 43 | % "Hyphenation patterns for Ancient and Modern Greek," in 44 | % "TeX, XML, and Digital Typography" (A. Syropoulos et al., 45 | % eds.), Lecture Notes in Computer Science 3130, Springer-Verlag 46 | % Berlin-Heidelberg, 2004. ISBN 3-540-22801-2. 47 | % 48 | \patterns{% 49 | %%%% vowels 50 | %-- Vowel patterns (pre-combined) 51 | α1 ε1 η1 ι1 ο1 υ1 ω1 ϊ1 ϋ1 ά1 έ1 ή1 ί1 ό1 ύ1 ώ1 ΐ1 ΰ1 52 | %%%% double vowels (formerly called "diphthogs") and exceptions 53 | α2ι 54 | α2ί α2ί 55 | ά2ι ά2ι ά2ϊ ά2ϊ % 'a3i --- not to be separated: ne-r'aida 56 | α2υ 57 | α2ύ α2ύ 58 | ά3υ ά3υ 59 | ε2ι 60 | ε2ί ε2ί 61 | έ2ι έ2ι έ2ϊ έ2ϊ % 'e3i --- not to be separated: to rw-m'ei-ko (one way to pronounce it) 62 | ε2υ 63 | ε2ύ ε2ύ 64 | έ3υ έ3υ 65 | η2υ 66 | η2ύ η2ύ 67 | ή3υ ή3υ 68 | ο2ι 69 | ο2ί ο2ί 70 | ό2ι ό2ι ό2ϊ ό2ϊ % 'o3i --- not to be separated: to ko-r'oido 71 | ο2υ 72 | ο2ύ ο2ύ 73 | ό3υ ό3υ 74 | υ2ι 75 | υ2ί υ2ί 76 | ύ3ι ύ3ι 77 | %%%% diphthogs: two vowels pronounced together in *one* syllable 78 | %%%% (in some cases, the rules below will not allow the split up 79 | %%%% of syllables in words like: ka-ko-poi'oc, etc., but, better 80 | %%%% this than gross mistakes like: qw-ri-'o) 81 | α2η 82 | ά3η. ά3η. 83 | α2ϊ 84 | ά3ι. ά3ι. % ts'a-i 85 | α2ϋ % ka"u-m'oc 86 | ε2ϊ % ze"i-mpekikoc 87 | ε2ϋ % Ke"u-l'anh 88 | ο2ει % ap'oei-de 89 | ο2η % b'oh-ja! 90 | ό3η. ό3η. % ql'o-h al'o-h 91 | ο2ϊ 92 | ό3ι. ό3ι. % s'o-i 93 | %%%% 94 | ι2α 95 | ι2ά ι2ά 96 | ι2ε 97 | ι2έ ι2έ 98 | ι2ο 99 | ι2ό ι2ό 100 | ο3ϊ3ό ο3ϊ3ό % pro-"i-'on 101 | ι2ω 102 | ι2ώ ι2ώ 103 | .ι3 104 | .ί3 .ί3 105 | η2α 106 | η2ά η2ά 107 | η2ε 108 | η2έ η2έ 109 | η2ο 110 | η2ό η2ό 111 | η2ω 112 | η2ώ η2ώ 113 | .η3 114 | .ή3 .ή3 115 | υ2α 116 | υ2ά υ2ά 117 | υ2ο 118 | υ2ό υ2ό 119 | υ2ω 120 | υ2ώ υ2ώ 121 | .υ3 122 | .ύ3 .ύ3 123 | %%%% consonants at the end of words (including double consnants: 124 | %%%% gk, mp, nt, tz, ts). 125 | 4β. 126 | 4γ. 127 | 4γκ. 128 | 4δ. 129 | 4ζ. 130 | 4θ. 131 | 4κ. 132 | 4λ. 133 | 4μ. 134 | 4μπ. 135 | 4ν. 136 | 4ντ. 137 | 4ξ. 138 | 4π. 139 | 4ρ. 140 | 4σ. 4ϲ. 141 | 4ς. 142 | 4τ. 143 | 4τζ. 144 | 4τσ. 4τϲ. 145 | 4τς. 146 | 4φ. 147 | 4χ. 148 | 4ψ. 149 | %%%% right apostrophe and consonants with right apostrophe 150 | 4' 4ʼ 4᾿ 151 | 4β' 4βʼ 4β᾿ 152 | 4γ' 4γʼ 4γ᾿ 153 | 4δ' 4δʼ 4δ᾿ 154 | 4ζ' 4ζʼ 4ζ᾿ 155 | 4θ' 4θʼ 4θ᾿ 156 | 4κ' 4κʼ 4κ᾿ 157 | 4λ' 4λʼ 4λ᾿ 158 | 4μ' 4μʼ 4μ᾿ 159 | 4μπ' 4μπʼ 4μπ᾿ 160 | 4ν' 4νʼ 4ν᾿ 161 | 4ντ' 4ντ’ 4ντ᾿ 162 | 4ξ' 4ξʼ 4ξ᾿ 163 | 4π' 4πʼ 4π᾿ 164 | 4ρ' 4ρʼ 4ρ᾿ 165 | 4σ' 4σʼ 4σ᾿ 4ϲ' 4ϲʼ 4ϲ᾿ 166 | 4τ' 4τʼ 4τ᾿ 167 | 4τζ' 4τζʼ 4τζ᾿ 168 | 4τσ' 4τσʼ 4τσ᾽ 4τϲ' 4τϲʼ 4τϲ᾿ 169 | 4φ' 4φʼ 4φ᾿ 170 | 4χ' 4χʼ 4χ᾿ 171 | 4ψ' 4ψʼ 4ψ᾿ 172 | %%%% consonants at the beggining of words 173 | .β4 174 | .γ4 175 | .δ4 176 | .ζ4 177 | .θ4 178 | .κ4 179 | .λ4 180 | .μ4 181 | .ν4 182 | .ξ4 183 | .π4 184 | .ρ4 185 | .σ4 .ϲ4 186 | .τ4 187 | .φ4 188 | .χ4 189 | .ψ4 190 | %%%% separable double consonants 191 | 4β1β 192 | 4γ1γ 193 | 4δ1δ 194 | 4ζ1ζ 195 | 4θ1θ 196 | 4κ1κ 197 | 4λ1λ 198 | 4μ1μ 199 | 4ν1ν 200 | 4π1π 201 | 4ρ1ρ 202 | 4σ1σ 4ϲ1ϲ 203 | 4τ1τ 204 | 4φ1φ 205 | 4χ1χ 206 | 4ψ1ψ 207 | %%%% other breakable consonant combinations 208 | 4β1ζ 209 | 4β1θ 210 | 4β1κ 211 | 4β1μ 212 | 4β1ν 213 | 4β1ξ 214 | 4β1π 215 | 4β1σ 4β1ϲ 216 | 4β1τ 217 | 4β1φ 218 | 4β1χ 219 | 4β1ψ 220 | 4γ1β 221 | 4γ1ζ 222 | 4γ1θ 223 | 4γ1μ 224 | 4ρ5γ2μ % >'er-gma = 'ergo (arq.) 225 | 4γ1ξ 226 | 4γ1π 227 | 4γ1σ 4γ1ϲ 228 | 4γ1τ 229 | 4γ1φ 230 | 4γ1χ 231 | 4γ1ψ 232 | 4δ1β 233 | 4δ1γ 234 | 4δ1ζ 235 | 4δ1θ 236 | 4δ1κ 237 | 4δ1λ 238 | % "dm" --- not separable: dm~hsic = exhm'erwma (arq.) 239 | % "dn" --- not separable: dnofer'oc = zofer'oc, skotein'oc (arq.) 240 | % Dne'iperoc = potam'oc thc Rws'iac 241 | 4δ1ξ 242 | 4δ1π 243 | 4δ1σ 4δ1ϲ 244 | 4δ1τ 245 | 4δ1φ 246 | 4δ1χ 247 | 4δ1ψ 248 | 4ζ1β % "zb" and "zg" appear in the beggining of Greek words (e.g., in 249 | 4ζ1γ % Andriotes' Lexicon), but they're usually written as "sb" and "sg". 250 | 4ζ1δ 251 | 4ζ1θ 252 | 4ζ1κ 253 | 4ζ1λ 254 | 4ζ1μ 255 | τζ2μ % m'ana-tzment (m'a-na-tzment) 256 | 4ζ1ν 257 | 4ζ1ξ 258 | 4ζ1π 259 | 4ζ1ρ 260 | 4ζ1σ 4ζ1ϲ 261 | 4ζ1τ 262 | 4ζ1φ 263 | 4ζ1χ 264 | 4ζ1ψ 265 | 4θ1β 266 | 4θ1γ 267 | 4θ1δ 268 | 4θ1ζ 269 | 4θ1κ 270 | 4θ1μ 271 | 4ρ5θ2μ % por-jm'oc 272 | σθ2μ ϲθ2μ % i-sjm'oc 273 | 4θ1ξ 274 | 4θ1π 275 | 4θ1σ 4θ1ϲ 276 | 4θ1τ 277 | 4θ1φ 278 | 4θ1χ 279 | 4θ1ψ 280 | 4κ1β % "kb" may not be not separable: kb'anto kbantomhqanik'h 281 | 4κ1γ 282 | 4κ1δ 283 | 4κ1ζ 284 | 4κ1θ 285 | 4κ1μ 286 | 4λ5κ2μ % Al-km'hnh 287 | 4ρ5κ2μ % dar-km'a = draqm'h (arq.) 288 | 4κ1ξ 289 | 4κ1π 290 | 4κ1σ 4κ1ϲ 291 | 4κ1φ 292 | 4ν5κ2φ % Fran-kfo'urth 293 | 4κ1χ 294 | 4κ1ψ 295 | 4λ1β 296 | 4λ1γ 297 | 4λ1δ 298 | 4λ1ζ 299 | 4λ1θ 300 | 4λ1κ 301 | 4λ1μ 302 | 4λ1ν 303 | 4λ1ξ 304 | 4λ1π 305 | 4λ1ρ 306 | 4λ1σ 4λ1ϲ 307 | 4λ1τ 308 | 4λ1φ 309 | 4λ1χ 310 | 4λ1ψ 311 | 4μ1β 312 | 4μ1γ 313 | 4μ1δ 314 | 4μ1ζ 315 | 4μ1θ 316 | 4μ1κ 317 | 4μ1λ 318 | 4μ1ξ 319 | 4μ1ρ 320 | 4μ1σ 4μ1ϲ 321 | 4μ1τ 322 | 4μ1φ 323 | 4μ1χ 324 | 4μ1ψ 325 | 4ν1β 326 | 4ν1γ 327 | 4ν1δ 328 | 4ν1ζ 329 | 4ν1θ 330 | 4ν1κ 331 | 4ν1λ 332 | 4ν1μ 333 | 4ν1ξ 334 | 4ν1π 335 | 4ν1ρ 336 | 4ν1σ 4ν1ϲ 337 | 4ν1φ 338 | 4ν1χ 339 | 4ν1ψ 340 | 4ξ1β 341 | 4ξ1γ 342 | 4ξ1δ 343 | 4ξ1ζ 344 | 4ξ1θ 345 | 4ξ1κ 346 | 4ξ1λ 347 | 4ξ1μ 348 | 4ξ1ν 349 | 4ξ1π 350 | 4ξ1ρ 351 | 4ξ1σ 4ξ1ϲ 352 | 4ξ1τ 353 | 4γ5ξ2τ % el'eg-xte 354 | 4ρ5ξ2τ % up'ar-xte 355 | 4ξ1φ 356 | 4ξ1χ 357 | 4ξ1ψ 358 | 4π1β 359 | 4π1γ 360 | 4π1δ 361 | 4π1ζ 362 | 4π1θ 363 | 4π1κ 364 | 4π1μ 365 | 4π1ξ 366 | 4π1σ 4π1ϲ 367 | 4π1φ 368 | 4π1χ 369 | 4π1ψ 370 | 4ρ1β 371 | 4ρ1γ 372 | 4ρ1δ 373 | 4ρ1ζ 374 | 4ρ1θ 375 | 4ρ1κ 376 | 4ρ1λ 377 | 4ρ1μ 378 | 4ρ1ν 379 | 4ρ1ξ 380 | 4ρ1π 381 | 4ρ1σ 4ρ1ϲ 382 | 4ρ1τ 383 | 4ρ1φ 384 | 4ρ1χ 385 | 4ρ1ψ 386 | 4σ1δ 4ϲ1δ % "sd" may not be separable: sde'ugla = ze'ugla (arq.) 387 | 4σ1ζ 4ϲ1ζ 388 | 4σ1ν 4ϲ1ν % "sn" may not be separable: sn'iqi (= sb'erkoc) snompism'oc 389 | 4σ1ξ 4ϲ1ξ 390 | 4σ1ρ 4ϲ1ρ 391 | 4σ1ψ 4ϲ1ψ 392 | 4τ1β 393 | 4τ1γ 394 | 4τ1δ 395 | 4τ1θ 396 | 4τ1κ 397 | % "tl" --- not separable: tlhmws'unh = miz'eria (arq.) 398 | 4τ1ν 399 | 4τ1ξ 400 | 4τ1π 401 | 4τ1φ 402 | στ2φ ϲτ2φ % fa-stfount'adiko Be-stfal'ia (German'ia) 403 | 4τ1χ 404 | 4τ1ψ 405 | 4φ1β 406 | 4φ1γ 407 | 4φ1δ 408 | 4φ1ζ 409 | 4φ1κ % "fk" may not be separable: fki'anw, fkias'idi 410 | 4φ1μ 411 | 4φ1ν 412 | 4ρ5φ2ν % or-fn'oc = skotein'oc (arq.) 413 | 4φ1ξ 414 | 4φ1π 415 | 4φ1σ 4φ1ϲ 416 | 4φ1χ 417 | 4φ1ψ 418 | 4χ1β 419 | 4χ1γ 420 | 4χ1δ 421 | 4χ1ζ 422 | 4χ1κ 423 | 4χ1μ 424 | 4ρ5χ2μ % dar-qm'a = draqm'h (arq.) 425 | 4χ1ξ 426 | 4χ1π 427 | 4χ1σ 4χ1ϲ 428 | 4χ1φ 429 | 4χ1ψ 430 | 4ψ1β 431 | 4ψ1γ 432 | 4ψ1δ 433 | 4ψ1ζ 434 | 4ψ1θ 435 | 4ψ1κ 436 | 4ψ1λ 437 | 4ψ1μ 438 | 4ψ1ν 439 | 4ψ1ξ 440 | 4ψ1π 441 | 4ψ1ρ 442 | 4ψ1σ 4ψ1ϲ 443 | 4ψ1τ 444 | 4μ5ψ2τ % l'am-yte 445 | 4ψ1φ 446 | 4ψ1χ 447 | %%%% some separable nasal consonant combinations 448 | 4γ5κ2φ % Frag-kfo'urth 449 | 4γ1κτ % eleg-kt'hc 450 | 4μ1πτ % 'amem-ptoc 451 | 4ν1τζ % neran-tzi'a 452 | 4ν1τσ 4ν1τϲ % biolon-ts'elo 453 | %%%% 454 | %%%% some `weird' terminations in words of Greek and non-Greek origin 455 | %%%% 456 | 4βρ. % or-nt'ebr 457 | 4γλ. % (od'oc Kar'olou) Ogl (B'oloc) 458 | 4κλ. % pi-n'akl 459 | 4κτ. % takt 460 | 4γκς. 4γκϲ. % mpagkc (mp'annu) 461 | 4γκσ. 462 | 6κς. 6κϲ. % tankc 463 | 4κσ. 464 | 4λς. 4λϲ. % balc 465 | 4λσ. 466 | 4μπλ. % ntampl (pod'osfairo) 467 | 4μπν. % Impn (Sa"'int, arabik'o 'onoma) 468 | 4μπρ. % romp-nte-s'ampr 469 | 4μς. 4μϲ. % Tz'eimc 470 | 4μσ. 471 | 4νς. 4νϲ. % 'el-minc ('el-min-joc) tranc 472 | 4νσ. 473 | 4ρς. 4ρϲ. % (empr'oc) marc 474 | 4ρσ. 475 | 4σκ. 4ϲκ. % Noboros'isk (p'olh thc Rws'iac) 476 | 4στ. 4ϲτ. % karst trast 477 | 4τλ. % Si'atl (p'olh twn HPA) 478 | 4τρ. % maitr 479 | 4ντς. 4ντϲ. % (frou'it) pantc Frantc 480 | 4ντσ. 481 | 4φτ. % kriskr'aft 482 | 4χτ. % B'ermaqt (Germanik'oc Strat'oc) 483 | %%%% 484 | %%%% some `weird' double-consonant combinations that may occur in 485 | %%%% words of non-greek origin like "romp-nte-s'ampr" (= robe de 486 | %%%% chambre) 487 | %%%% 488 | 4γκ1μπ 489 | 4γκ1ντ 490 | 4γκ1τζ 491 | 4γκ1τσ 4γκ1τϲ 492 | 4μπ1ντ 493 | 4μπ1τζ 494 | 4μπ1τσ 4μπ1τϲ 495 | 4ντ1μπ 496 | 4τσ1γκ 4τϲ1γκ 497 | 4τσ1μπ 4τϲ1μπ 498 | 4τσ1ντ 4τϲ1ντ 499 | } 500 | 501 | -------------------------------------------------------------------------------- /patterns/hyph-fi.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for Finnish 2 | % copyright: Copyright (C) 1986, 1988, 1989 Kauko Saarinen 3 | % notice: This file is part of the hyph-utf8 package. 4 | % See http://www.hyphenation.org/tex for more information. 5 | % language: 6 | % name: Finnish 7 | % tag: fi 8 | % version: 2.2 9 | % authors: 10 | % - 11 | % name: Kauko Saarinen 12 | % affiliation: Computing Centre, University of Jyväskylä, Finland 13 | % licence: 14 | % - text: Patterns may be freely distributed 15 | % hyphenmins: 16 | % typesetting: 17 | % left: 2 18 | % right: 2 19 | % changes: 20 | % - First release 1986-01 by Kauko Saarinen, 21 | % - > 22 | % Completely rewritten 1988-01. The new patterns make 23 | % much less mistakes with foreign and compound words. 24 | % The article "Automatic Hyphenation of Finnish" 25 | % by Professor Fred Karlsson is also referred 26 | % - 1989-03-08 (vers. 2.2), some vowel triples by Fred Karlsson added. 27 | % - 1995-01-09: added \uccode and \lccode by Thomas Esser 28 | % texlive: 29 | % encoding: ec 30 | % babelname: finnish 31 | % legacy_patterns: fihyph.tex 32 | % message: Finnish hyphenation patterns 33 | % package: finnish 34 | % 35 | \patterns{ 36 | 1ba 37 | 1be 38 | 1bi 39 | 1bo 40 | 1bu 41 | 1by 42 | 1da 43 | 1de 44 | 1di 45 | 1do 46 | 1du 47 | 1dy 48 | 1dä 49 | 1dö 50 | 1fa 51 | 1fe 52 | 1fi 53 | 1fo 54 | 1fu 55 | 1fy 56 | 1ga 57 | 1ge 58 | 1gi 59 | 1go 60 | 1gu 61 | 1gy 62 | 1gä 63 | 1gö 64 | 1ha 65 | 1he 66 | 1hi 67 | 1ho 68 | 1hu 69 | 1hy 70 | 1hä 71 | 1hö 72 | 1ja 73 | 1je 74 | 1ji 75 | 1jo 76 | 1ju 77 | 1jy 78 | 1jä 79 | 1jö 80 | 1ka 81 | 1ke 82 | 1ki 83 | 1ko 84 | 1ku 85 | 1ky 86 | 1kä 87 | 1kö 88 | 1la 89 | 1le 90 | 1li 91 | 1lo 92 | 1lu 93 | 1ly 94 | 1lä 95 | 1lö 96 | 1ma 97 | 1me 98 | 1mi 99 | 1mo 100 | 1mu 101 | 1my 102 | 1mä 103 | 1mö 104 | 1na 105 | 1ne 106 | 1ni 107 | 1no 108 | 1nu 109 | 1ny 110 | 1nä 111 | 1nö 112 | 1pa 113 | 1pe 114 | 1pi 115 | 1po 116 | 1pu 117 | 1py 118 | 1pä 119 | 1pö 120 | 1ra 121 | 1re 122 | 1ri 123 | 1ro 124 | 1ru 125 | 1ry 126 | 1rä 127 | 1rö 128 | 1sa 129 | 1se 130 | 1si 131 | 1so 132 | 1su 133 | 1sy 134 | 1sä 135 | 1sö 136 | 1ta 137 | 1te 138 | 1ti 139 | 1to 140 | 1tu 141 | 1ty 142 | 1tä 143 | 1tö 144 | 1va 145 | 1ve 146 | 1vi 147 | 1vo 148 | 1vu 149 | 1vy 150 | 1vä 151 | 1vö 152 | % ------- Some common words borrowed from other languages ------- 153 | % ------- This part could be updated from time to time ------- 154 | % 155 | 1st2r % -stressi, -strategia etc. 156 | % 157 | % ------ Some special cases occuring with compound words only ---- 158 | % ------ There still remains well known problem as 'kaivos\-aukko' etc. 159 | %a1y (common in borrowed words) 160 | ä2y 161 | y1a2 162 | y1o2 163 | o1y 164 | ö2y 165 | u1y2 166 | y1u2 167 | ö3a2 168 | ö3o2 169 | ä3a2 170 | ä3o2 171 | ä1u2 172 | ö1u2 173 | a1ä % (a1ä2 ei mahdollinen!) 174 | a1ö 175 | o1ä 176 | o1ö 177 | u1ä2 178 | u1ö2 179 | ä2ä 180 | ö2ö 181 | ä2ö 182 | ö2ä 183 | % lyhyt/pitka -vokaalipareja, tavallisesti sanarajalla 184 | aa1i2 % maa-ikkuna 185 | aa1e2 186 | aa1o2 % maa-ottelu 187 | aa1u2 % uraa-uurtava 188 | ee1a2 % tee-astia 189 | ee1i2 % tee-istutus 190 | ee1u2 % varietee-uusinta 191 | ee1y2 192 | ii1a2 193 | ii1e2 194 | ii1o2 195 | uu1a2 196 | uu1e2 % puu-esine 197 | uu1o2 % puu-osa 198 | uu1i2 % puu-istutus 199 | e1aa 200 | i1aa 201 | o1aa 202 | u1aa 203 | u1ee 204 | a1uu % kala-uuni 205 | i1uu % ravi-uutiset 206 | e1uu % virhe-uutinen 207 | o1uu % radio-uutiset 208 | ää1i 209 | ää1e 210 | ää3y 211 | i1ää 212 | e1ää 213 | y1ää 214 | i1öö % yhti-öön etc. 215 | %i1eu % keski-eurooppalainen 216 | % vokaalikolmikkoja etc. yhdyssanojen rajoissa 217 | % -------- vowel triples by Fred Karlsson 218 | a1ei 219 | a1oi 220 | e1ai 221 | % e1oi % ambiguous for ex. video-ilme (8.3.89) 222 | i1au 223 | % u1oi % ambiguous (8.3.89) 224 | y1ei 225 | ai1a 226 | ai1e 227 | ai1o 228 | ai1u 229 | au1a 230 | au1e 231 | eu1a 232 | ie1a 233 | ie1o 234 | %ie1u % ambiguous 235 | ie1y 236 | io1a2 237 | io1e2 238 | iu1a 239 | iu1e 240 | iu1o 241 | oi1a 242 | oi1e 243 | oi1o 244 | oi1u 245 | o1ui % veto-uistin, himo-uimari etc. 246 | ou1e 247 | ou1o 248 | ue1a 249 | ui1e 250 | uo1a 251 | % uo1i % ambiguous 252 | uo1u 253 | % ---------------- End of vowel triples -------------------- 254 | e1ö2 255 | ö1e2 256 | .ä2 % don't hyphenate ä-lyllinen etc. 257 | % 258 | % The following patterns contain no general scientific rule. They 259 | % are selected more or less intuitively to solve problems 260 | % with common and frequently appearing compound words. 261 | % However, every pattern resolves more than only one 262 | % hyphenation problem. 263 | % 264 | u2s % estaa virheita yhdyssanojen yhteydessa 265 | yli1o2p % yli-opisto etc. 266 | ali1a2v % ali-avaruus etc. 267 | 1sp2li % kuutio-splini etc. 268 | alous1 269 | keus1 % oikeus-oppinut etc. 270 | rtaus1 271 | 2s1ohje % -sohjelma etc. 272 | 2s1a2sia % nais-asianainen etc. 273 | 1a2sian % neuvottelu-asian etc. 274 | 1a2siat % koti-asian (ei kotia-sian) 275 | 1a2sioi % talous-asioita etc. 276 | r2as l2as % tikku-rasia etc 277 | 2s1o2pisk % xs-opiskelija etc 278 | 2n1o2pet 279 | 2s1a2loi 280 | 2n1o2pist % kansan-opisto etc. 281 | 2s1o2pist 282 | 2s1o2sa % xxs-osakas etc. 283 | 2n1o2sa % asian-osainen etc. 284 | alkei2s1 285 | perus1 286 | 2s1i2dea. 2s1i2dean 287 | 2s1e2sity % xs-esitys etc 288 | 2n1e2dus % kansan-edustaja etc. 289 | 2s1ajatu % -ajatus etc. 290 | 2s1ase 291 | 2s1apu 292 | 2s1y2rit % yhteis-yritys etc. 293 | .ydi2n1 294 | .suu2r1a2 % suur-ajot etc. 295 | 2s1y2hti 296 | 2n1otto 2n1oton 297 | 2n1anto 2n1anno 298 | 2n1a2jan 2n1aika 299 | 2n1o2mai 300 | 2n1y2lit 301 | 2s1a2len 302 | 2n1a2len 303 | 1a2siaka2s1 304 | ulo2s1 % ulos-ajo 305 | 2n1a2jo % kiven-ajo 306 | 2s1a2jo 307 | % 308 | % *** The following rules may be used on user's responsibility *** 309 | % *** for example, may be needed with narrow columns *** 310 | % >>>>>>>>>>> a1e a1o e1o o1a u1a <<<<<<<<<<< 311 | % 312 | % ----- Some districting rules by Professor Fred Karlsson's ideas ------ 313 | % 314 | b2l 1b2lo bib3li 315 | b2r 1b2ri 1b2ro 1b2ru 316 | d2r 1d2ra 317 | f2l 1f2la 318 | f2r 1f2ra 1f2re 319 | g2l 1g2lo 320 | g2r 1g2ra 321 | k2l 322 | 1k2ra 1k2re 1k2ri 323 | 1k2v 1k2va 324 | p2l 325 | p2r 1p2ro 326 | c2l 327 | q2v 1q2vi 328 | sc2h ts2h 329 | ch2r 330 | } 331 | -------------------------------------------------------------------------------- /patterns/hyph-hr.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for Croatian 2 | % copyright: Copyright (C) 1994, 1996, 2011, 2015 Igor Marinović 3 | % notice: This file is part of the hyph-utf8 package. 4 | % See http://www.hyphenation.org/tex for more information. 5 | % language: 6 | % name: Croatian 7 | % tag: hr 8 | % authors: 9 | % - 10 | % name: Igor Marinović 11 | % contact: marinowski (at) gmail.com 12 | % licence: 13 | % - This file is available under any of these licences: 14 | % - 15 | % name: LPPL 16 | % version: 1 17 | % or_later: true 18 | % url: http://www.latex-project.org/lppl/lppl-1-0.html 19 | % - 20 | % text: > 21 | % Permission is hereby granted, free of charge, to any person obtaining 22 | % a copy of this file and any associated documentation 23 | % (the "Data Files") to deal in the Data Files 24 | % without restriction, including without limitation the rights to use, 25 | % copy, modify, merge, publish, distribute, and/or sell copies of 26 | % the Data Files, and to permit persons to whom the Data Files 27 | % are furnished to do so, provided that 28 | % (a) this copyright and permission notice appear with all copies 29 | % of the Data Files, 30 | % (b) this copyright and permission notice appear in associated 31 | % documentation, and 32 | % (c) there is clear notice in each modified Data File 33 | % as well as in the documentation associated with the Data File(s) 34 | % that the data has been modified. 35 | % 36 | % THE DATA FILES ARE PROVIDED "AS IS", WITHOUT WARRANTY OF 37 | % ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 38 | % WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 39 | % NONINFRINGEMENT OF THIRD PARTY RIGHTS. 40 | % IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS 41 | % NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL 42 | % DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 43 | % DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 44 | % TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 45 | % PERFORMANCE OF THE DATA FILES. 46 | % 47 | % Except as contained in this notice, the name of a copyright holder 48 | % shall not be used in advertising or otherwise to promote the sale, 49 | % use or other dealings in these Data Files without prior 50 | % written authorization of the copyright holder. 51 | % hyphenmins: 52 | % typesetting: 53 | % left: 2 54 | % right: 2 55 | % changes: 56 | % - Late 1994 first version 57 | % - Beginning of 1996 much more improved version (date of last change: 19.03.1996). 58 | % - In summer 2008 patterns incorporated into hyph-utf8 and renamed from hrhyph.tex to hyph-hr.tex. 59 | % - 06.06.2011 LPPL licence added. 60 | % texlive: 61 | % encoding: ec 62 | % babelname: croatian 63 | % legacy_patterns: hrhyph.tex 64 | % message: Croatian hyphenation patterns 65 | % description: Hyphenation patterns for Croatian in T1/EC and UTF-8 encodings. 66 | % 67 | \patterns{ 68 | a1a2 69 | a1e2 70 | a1i2 71 | a1o2 72 | a1u2 73 | e1a2 74 | e1e2 75 | e1i2 76 | e1o2 77 | e1u2 78 | i1a2 79 | i1e2 80 | i1i2 81 | i1o2 82 | i1u2 83 | o1a2 84 | o1e2 85 | o1i2 86 | o1o2 87 | o1u2 88 | u1a2 89 | u1e2 90 | u1i2 91 | u1o2 92 | u1u2 93 | a1ba 94 | a1be 95 | a1bi 96 | a1bo 97 | a1bu 98 | a1ca 99 | a1ce 100 | a1ci 101 | a1co 102 | a1cu 103 | a1ča 104 | a1če 105 | a1či 106 | a1čo 107 | a1ču 108 | a1ća 109 | a1će 110 | a1ći 111 | a1ćo 112 | a1ću 113 | a1da 114 | a1de 115 | a1di 116 | a1do 117 | a1du 118 | a1dža 119 | a1dže 120 | a1dži 121 | a1džo 122 | a1džu 123 | a1đa 124 | a1đe 125 | a1đi 126 | a1đo 127 | a1đu 128 | a1fa 129 | a1fe 130 | a1fi 131 | a1fo 132 | a1fu 133 | a1ga 134 | a1ge 135 | a1gi 136 | a1go 137 | a1gu 138 | a1ha 139 | a1he 140 | a1hi 141 | a1ho 142 | a1hu 143 | a1ja 144 | a1je 145 | a1ji 146 | a1jo 147 | a1ju 148 | a1ka 149 | a1ke 150 | a1ki 151 | a1ko 152 | a1ku 153 | a1la 154 | a1le 155 | a1li 156 | a1lo 157 | a1lu 158 | a1lja 159 | a1lje 160 | a1lji 161 | a1ljo 162 | a1lju 163 | a1ma 164 | a1me 165 | a1mi 166 | a1mo 167 | a1mu 168 | a1na 169 | a1ne 170 | a1ni 171 | a1no 172 | a1nu 173 | a1nja 174 | a1nje 175 | a1nji 176 | a1njo 177 | a1nju 178 | a1pa 179 | a1pe 180 | a1pi 181 | a1po 182 | a1pu 183 | a1ra 184 | a1re 185 | a1ri 186 | a1ro 187 | a1ru 188 | a1sa 189 | a1se 190 | a1si 191 | a1so 192 | a1su 193 | a1ša 194 | a1še 195 | a1ši 196 | a1šo 197 | a1šu 198 | a1ta 199 | a1te 200 | a1ti 201 | a1to 202 | a1tu 203 | a1va 204 | a1ve 205 | a1vi 206 | a1vo 207 | a1vu 208 | a1za 209 | a1ze 210 | a1zi 211 | a1zo 212 | a1zu 213 | a1ža 214 | a1že 215 | a1ži 216 | a1žo 217 | a1žu 218 | e1ba 219 | e1be 220 | e1bi 221 | e1bo 222 | e1bu 223 | e1ca 224 | e1ce 225 | e1ci 226 | e1co 227 | e1cu 228 | e1ča 229 | e1če 230 | e1či 231 | e1čo 232 | e1ču 233 | e1ća 234 | e1će 235 | e1ći 236 | e1ćo 237 | e1ću 238 | e1da 239 | e1de 240 | e1di 241 | e1do 242 | e1du 243 | e1dža 244 | e1dže 245 | e1dži 246 | e1džo 247 | e1džu 248 | e1đa 249 | e1đe 250 | e1đi 251 | e1đo 252 | e1đu 253 | e1fa 254 | e1fe 255 | e1fi 256 | e1fo 257 | e1fu 258 | e1ga 259 | e1ge 260 | e1gi 261 | e1go 262 | e1gu 263 | e1ha 264 | e1he 265 | e1hi 266 | e1ho 267 | e1hu 268 | e1ja 269 | e1je 270 | e1ji 271 | e1jo 272 | e1ju 273 | e1ka 274 | e1ke 275 | e1ki 276 | e1ko 277 | e1ku 278 | e1la 279 | e1le 280 | e1li 281 | e1lo 282 | e1lu 283 | e1lja 284 | e1lje 285 | e1lji 286 | e1ljo 287 | e1lju 288 | e1ma 289 | e1me 290 | e1mi 291 | e1mo 292 | e1mu 293 | e1na 294 | e1ne 295 | e1ni 296 | e1no 297 | e1nu 298 | e1nja 299 | e1nje 300 | e1nji 301 | e1njo 302 | e1nju 303 | e1pa 304 | e1pe 305 | e1pi 306 | e1po 307 | e1pu 308 | e1ra 309 | e1re 310 | e1ri 311 | e1ro 312 | e1ru 313 | e1sa 314 | e1se 315 | e1si 316 | e1so 317 | e1su 318 | e1ša 319 | e1še 320 | e1ši 321 | e1šo 322 | e1šu 323 | e1ta 324 | e1te 325 | e1ti 326 | e1to 327 | e1tu 328 | e1va 329 | e1ve 330 | e1vi 331 | e1vo 332 | e1vu 333 | e1za 334 | e1ze 335 | e1zi 336 | e1zo 337 | e1zu 338 | e1ža 339 | e1že 340 | e1ži 341 | e1žo 342 | e1žu 343 | i1ba 344 | i1be 345 | i1bi 346 | i1bo 347 | i1bu 348 | i1ca 349 | i1ce 350 | i1ci 351 | i1co 352 | i1cu 353 | i1ča 354 | i1če 355 | i1či 356 | i1čo 357 | i1ču 358 | i1ća 359 | i1će 360 | i1ći 361 | i1ćo 362 | i1ću 363 | i1da 364 | i1de 365 | i1di 366 | i1do 367 | i1du 368 | i1dža 369 | i1dže 370 | i1dži 371 | i1džo 372 | i1džu 373 | i1đa 374 | i1đe 375 | i1đi 376 | i1đo 377 | i1đu 378 | i1fa 379 | i1fe 380 | i1fi 381 | i1fo 382 | i1fu 383 | i1ga 384 | i1ge 385 | i1gi 386 | i1go 387 | i1gu 388 | i1ha 389 | i1he 390 | i1hi 391 | i1ho 392 | i1hu 393 | i1ja 394 | i1je 395 | i1ji 396 | i1jo 397 | i1ju 398 | i1ka 399 | i1ke 400 | i1ki 401 | i1ko 402 | i1ku 403 | i1la 404 | i1le 405 | i1li 406 | i1lo 407 | i1lu 408 | i1lja 409 | i1lje 410 | i1lji 411 | i1ljo 412 | i1lju 413 | i1ma 414 | i1me 415 | i1mi 416 | i1mo 417 | i1mu 418 | i1na 419 | i1ne 420 | i1ni 421 | i1no 422 | i1nu 423 | i1nja 424 | i1nje 425 | i1nji 426 | i1njo 427 | i1nju 428 | i1pa 429 | i1pe 430 | i1pi 431 | i1po 432 | i1pu 433 | i1ra 434 | i1re 435 | i1ri 436 | i1ro 437 | i1ru 438 | i1sa 439 | i1se 440 | i1si 441 | i1so 442 | i1su 443 | i1ša 444 | i1še 445 | i1ši 446 | i1šo 447 | i1šu 448 | i1ta 449 | i1te 450 | i1ti 451 | i1to 452 | i1tu 453 | i1va 454 | i1ve 455 | i1vi 456 | i1vo 457 | i1vu 458 | i1za 459 | i1ze 460 | i1zi 461 | i1zo 462 | i1zu 463 | i1ža 464 | i1že 465 | i1ži 466 | i1žo 467 | i1žu 468 | o1ba 469 | o1be 470 | o1bi 471 | o1bo 472 | o1bu 473 | o1ca 474 | o1ce 475 | o1ci 476 | o1co 477 | o1cu 478 | o1ča 479 | o1če 480 | o1či 481 | o1čo 482 | o1ču 483 | o1ća 484 | o1će 485 | o1ći 486 | o1ćo 487 | o1ću 488 | o1da 489 | o1de 490 | o1di 491 | o1do 492 | o1du 493 | o1dža 494 | o1dže 495 | o1dži 496 | o1džo 497 | o1džu 498 | o1đa 499 | o1đe 500 | o1đi 501 | o1đo 502 | o1đu 503 | o1fa 504 | o1fe 505 | o1fi 506 | o1fo 507 | o1fu 508 | o1ga 509 | o1ge 510 | o1gi 511 | o1go 512 | o1gu 513 | o1ha 514 | o1he 515 | o1hi 516 | o1ho 517 | o1hu 518 | o1ja 519 | o1je 520 | o1ji 521 | o1jo 522 | o1ju 523 | o1ka 524 | o1ke 525 | o1ki 526 | o1ko 527 | o1ku 528 | o1la 529 | o1le 530 | o1li 531 | o1lo 532 | o1lu 533 | o1lja 534 | o1lje 535 | o1lji 536 | o1ljo 537 | o1lju 538 | o1ma 539 | o1me 540 | o1mi 541 | o1mo 542 | o1mu 543 | o1na 544 | o1ne 545 | o1ni 546 | o1no 547 | o1nu 548 | o1nja 549 | o1nje 550 | o1nji 551 | o1njo 552 | o1nju 553 | o1pa 554 | o1pe 555 | o1pi 556 | o1po 557 | o1pu 558 | o1ra 559 | o1re 560 | o1ri 561 | o1ro 562 | o1ru 563 | o1sa 564 | o1se 565 | o1si 566 | o1so 567 | o1su 568 | o1ša 569 | o1še 570 | o1ši 571 | o1šo 572 | o1šu 573 | o1ta 574 | o1te 575 | o1ti 576 | o1to 577 | o1tu 578 | o1va 579 | o1ve 580 | o1vi 581 | o1vo 582 | o1vu 583 | o1za 584 | o1ze 585 | o1zi 586 | o1zo 587 | o1zu 588 | o1ža 589 | o1že 590 | o1ži 591 | o1žo 592 | o1žu 593 | u1ba 594 | u1be 595 | u1bi 596 | u1bo 597 | u1bu 598 | u1ca 599 | u1ce 600 | u1ci 601 | u1co 602 | u1cu 603 | u1ča 604 | u1če 605 | u1či 606 | u1čo 607 | u1ču 608 | u1ća 609 | u1će 610 | u1ći 611 | u1ćo 612 | u1ću 613 | u1da 614 | u1de 615 | u1di 616 | u1do 617 | u1du 618 | u1dža 619 | u1dže 620 | u1dži 621 | u1džo 622 | u1džu 623 | u1đa 624 | u1đe 625 | u1đi 626 | u1đo 627 | u1đu 628 | u1fa 629 | u1fe 630 | u1fi 631 | u1fo 632 | u1fu 633 | u1ga 634 | u1ge 635 | u1gi 636 | u1go 637 | u1gu 638 | u1ha 639 | u1he 640 | u1hi 641 | u1ho 642 | u1hu 643 | u1ja 644 | u1je 645 | u1ji 646 | u1jo 647 | u1ju 648 | u1ka 649 | u1ke 650 | u1ki 651 | u1ko 652 | u1ku 653 | u1la 654 | u1le 655 | u1li 656 | u1lo 657 | u1lu 658 | u1lja 659 | u1lje 660 | u1lji 661 | u1ljo 662 | u1lju 663 | u1ma 664 | u1me 665 | u1mi 666 | u1mo 667 | u1mu 668 | u1na 669 | u1ne 670 | u1ni 671 | u1no 672 | u1nu 673 | u1nja 674 | u1nje 675 | u1nji 676 | u1njo 677 | u1nju 678 | u1pa 679 | u1pe 680 | u1pi 681 | u1po 682 | u1pu 683 | u1ra 684 | u1re 685 | u1ri 686 | u1ro 687 | u1ru 688 | u1sa 689 | u1se 690 | u1si 691 | u1so 692 | u1su 693 | u1ša 694 | u1še 695 | u1ši 696 | u1šo 697 | u1šu 698 | u1ta 699 | u1te 700 | u1ti 701 | u1to 702 | u1tu 703 | u1va 704 | u1ve 705 | u1vi 706 | u1vo 707 | u1vu 708 | u1za 709 | u1ze 710 | u1zi 711 | u1zo 712 | u1zu 713 | u1ža 714 | u1že 715 | u1ži 716 | u1žo 717 | u1žu 718 | b1b 719 | b1c 720 | b1č 721 | b1ć 722 | b1d 723 | b1dž 724 | b1đ 725 | b1f 726 | b1g 727 | b1h 728 | 1bj 729 | 2bj. 730 | b1k 731 | 1bl 732 | 2bl. 733 | 2b1lj 734 | b1m 735 | b1n 736 | b1nj 737 | b1p 738 | 1br 739 | 2br. 740 | b1s 741 | b1š 742 | b1t 743 | 1bv 744 | 2bv. 745 | b1z 746 | b1ž 747 | c1b 748 | c1c 749 | c1č 750 | c1ć 751 | c1d 752 | c1dž 753 | c1đ 754 | c1f 755 | c1g 756 | c1h 757 | 1cj 758 | 2cj. 759 | c1k 760 | 1cl 761 | 2cl. 762 | 2c1lj 763 | c1m 764 | c1n 765 | c1nj 766 | c1p 767 | 1cr 768 | 2cr. 769 | c1s 770 | c1š 771 | c1t 772 | 1cv 773 | 2cv. 774 | c1z 775 | c1ž 776 | č1b 777 | č1c 778 | č1č 779 | č1ć 780 | č1d 781 | č1dž 782 | č1đ 783 | č1f 784 | č1g 785 | č1h 786 | 1čj 787 | 2čj. 788 | č1k 789 | 1čl 790 | 2čl. 791 | 2č1lj 792 | č1m 793 | č1n 794 | č1nj 795 | č1p 796 | 1čr 797 | 2čr. 798 | č1s 799 | č1š 800 | č1t 801 | 1čv 802 | 2čv. 803 | č1z 804 | č1ž 805 | ć1b 806 | ć1c 807 | ć1č 808 | ć1ć 809 | ć1d 810 | ć1dž 811 | ć1đ 812 | ć1f 813 | ć1g 814 | ć1h 815 | ć1j 816 | ć1k 817 | 1ćl 818 | 2ćl. 819 | 2ć1lj 820 | ć1m 821 | ć1n 822 | ć1nj 823 | ć1p 824 | 1ćr 825 | 2ćr. 826 | ć1s 827 | ć1š 828 | ć1t 829 | 1ćv 830 | 2ćv. 831 | ć1z 832 | ć1ž 833 | d1b 834 | d1c 835 | d1č 836 | d1ć 837 | d1d 838 | d2ž 839 | d1đ 840 | d1f 841 | 2d1g 842 | d1h 843 | 1dj 844 | 2dj. 845 | d1k 846 | 2d1l 847 | 2d1lj 848 | d1m 849 | d1n 850 | d1nj 851 | d1p 852 | 1dr 853 | 2dr. 854 | d1s 855 | d1š 856 | d1t 857 | 1dv 858 | 2dv. 859 | d1z 860 | dž1b 861 | dž1c 862 | dž1č 863 | dž1ć 864 | dž1d 865 | dž1dž 866 | dž1đ 867 | dž1f 868 | dž1g 869 | dž1h 870 | 1džj 871 | 2džj. 872 | dž1k 873 | 1džl 874 | 2džl. 875 | 2dž1lj 876 | dž1m 877 | dž1n 878 | dž1nj 879 | dž1p 880 | 1džr 881 | 2džr. 882 | dž1s 883 | dž1š 884 | dž1t 885 | 1džv 886 | 2džv. 887 | dž1z 888 | dž1ž 889 | đ1b 890 | đ1c 891 | đ1č 892 | đ1ć 893 | đ1d 894 | đ1dž 895 | đ1đ 896 | đ1f 897 | đ1g 898 | đ1h 899 | 1đj 900 | 2đj. 901 | đ1k 902 | 1đl 903 | 2đl. 904 | 2đ1lj 905 | đ1m 906 | đ1n 907 | đ1nj 908 | đ1p 909 | 1đr 910 | 2đr. 911 | đ1s 912 | đ1š 913 | đ1t 914 | 1đv 915 | 2đv. 916 | đ1z 917 | đ1ž 918 | f1b 919 | f1c 920 | f1č 921 | f1ć 922 | f1d 923 | f1dž 924 | f1đ 925 | f1f 926 | f1g 927 | f1h 928 | 1fj 929 | 2fj. 930 | f1k 931 | 1fl 932 | 2fl. 933 | 2f1lj 934 | f1m 935 | f1n 936 | f1nj 937 | f1p 938 | 1fr 939 | 2fr. 940 | f1s 941 | f1š 942 | f1t 943 | 1fv 944 | 2fv. 945 | f1z 946 | f1ž 947 | g1b 948 | g1c 949 | g1č 950 | g1ć 951 | g1d 952 | g1dž 953 | g1đ 954 | g1f 955 | g1g 956 | g1h 957 | 1gj 958 | 2gj. 959 | g1k 960 | 1gl 961 | 2gl. 962 | 2g1lj 963 | g1m 964 | g1n 965 | g1nj 966 | g1p 967 | 1gr 968 | 2gr. 969 | g1s 970 | g1š 971 | g1t 972 | 1gv 973 | 2gv. 974 | g1z 975 | g1ž 976 | h1b 977 | h1c 978 | h1č 979 | h1ć 980 | h1d 981 | h1dž 982 | h1đ 983 | h1f 984 | h1g 985 | h1h 986 | 1hj 987 | 2hj. 988 | h1k 989 | 1hl 990 | 2hl. 991 | 2h1lj 992 | h1m 993 | h1n 994 | h1nj 995 | h1p 996 | 1hr 997 | 2hr. 998 | h1s 999 | h1š 1000 | h1t 1001 | 1hv 1002 | 2hv. 1003 | h1z 1004 | h1ž 1005 | j1b 1006 | j1c 1007 | j1č 1008 | j1ć 1009 | j1d 1010 | j1dž 1011 | j1đ 1012 | j1f 1013 | j1g 1014 | j1h 1015 | j1j 1016 | j1k 1017 | j1l 1018 | 2j1lj 1019 | j1m 1020 | j1n 1021 | j1nj 1022 | j1p 1023 | j1r 1024 | j1s 1025 | j1š 1026 | j1t 1027 | j1v 1028 | j1z 1029 | j1ž 1030 | k1b 1031 | k1c 1032 | k1č 1033 | k1ć 1034 | k1d 1035 | k1dž 1036 | k1đ 1037 | k1f 1038 | k1g 1039 | k1h 1040 | 1kj 1041 | 2kj. 1042 | k1k 1043 | k1l 1044 | 1k2lj 1045 | 2klj. 1046 | k1m 1047 | k1n 1048 | k1nj 1049 | k1p 1050 | 1kr 1051 | 2kr. 1052 | k1s 1053 | k1š 1054 | k1t 1055 | k1v 1056 | k1z 1057 | k1ž 1058 | l1b 1059 | l1c 1060 | l1č 1061 | l1ć 1062 | l1d 1063 | l1dž 1064 | l1đ 1065 | l1f 1066 | l1g 1067 | l1h 1068 | l1k 1069 | l1l 1070 | 2l1lj 1071 | l1m 1072 | l1n 1073 | l1nj 1074 | l1p 1075 | l1r 1076 | l1s 1077 | l1š 1078 | l1t 1079 | l1v 1080 | l1z 1081 | l1ž 1082 | lj1b 1083 | lj1c 1084 | lj1č 1085 | lj1ć 1086 | lj1d 1087 | lj1dž 1088 | lj1đ 1089 | lj1f 1090 | lj1g 1091 | lj1h 1092 | lj1k 1093 | 1ljl 1094 | 2ljl. 1095 | lj1lj 1096 | lj1m 1097 | lj1n 1098 | lj1nj 1099 | lj1p 1100 | 1ljr 1101 | 2ljr. 1102 | lj1s 1103 | lj1š 1104 | lj1t 1105 | 1ljv 1106 | 2ljv. 1107 | lj1z 1108 | lj1ž 1109 | m1b 1110 | m1c 1111 | m1č 1112 | m1ć 1113 | m1d 1114 | m1dž 1115 | m1đ 1116 | m1f 1117 | m1g 1118 | m1h 1119 | 1mj 1120 | 2mj. 1121 | m1k 1122 | 1ml 1123 | 2ml. 1124 | 2m1lj 1125 | m1m 1126 | m1n 1127 | m1nj 1128 | m1p 1129 | 1mr 1130 | 2mr. 1131 | m1s 1132 | m1š 1133 | m1t 1134 | 1mv 1135 | 2mv. 1136 | m1z 1137 | m1ž 1138 | n1b 1139 | n1c 1140 | n1č 1141 | n1ć 1142 | n1d 1143 | n1dž 1144 | n1đ 1145 | n1f 1146 | n1g 1147 | n1h 1148 | 2nj. 1149 | n1k 1150 | 1nl 1151 | 2nl. 1152 | 2n1lj 1153 | n1m 1154 | n1n 1155 | n1nj 1156 | n1p 1157 | n1r 1158 | n1s 1159 | n1š 1160 | n1t 1161 | 1nv 1162 | 2nv. 1163 | n1z 1164 | n1ž 1165 | nj1b 1166 | nj1c 1167 | nj1č 1168 | nj1ć 1169 | nj1d 1170 | nj1dž 1171 | nj1đ 1172 | nj1f 1173 | nj1g 1174 | nj1h 1175 | 1njj 1176 | 2njj. 1177 | nj1k 1178 | 1njl 1179 | 2njl. 1180 | 2nj1lj 1181 | nj1m 1182 | nj1n 1183 | nj1nj 1184 | nj1p 1185 | 1njr 1186 | 2njr. 1187 | nj1s 1188 | nj1š 1189 | nj1t 1190 | 1njv 1191 | 2njv. 1192 | nj1z 1193 | nj1ž 1194 | p1b 1195 | p1c 1196 | p1č 1197 | p1ć 1198 | p1d 1199 | p1dž 1200 | p1đ 1201 | p1f 1202 | p1g 1203 | 2p1h 1204 | 1pj 1205 | 2pj. 1206 | p1k 1207 | 1pl 1208 | 2pl. 1209 | 2p1lj 1210 | p1m 1211 | p1n 1212 | p1nj 1213 | p1p 1214 | 1pr 1215 | 2pr. 1216 | p1s 1217 | p1š 1218 | p1t 1219 | 1pv 1220 | 2pv. 1221 | p1z 1222 | p1ž 1223 | r1b 1224 | r1c 1225 | r1č 1226 | r1ć 1227 | r1d 1228 | r1dž 1229 | r1đ 1230 | r1f 1231 | r1g 1232 | r1h 1233 | r1j 1234 | r1k 1235 | r1l 1236 | 2r1lj 1237 | r1m 1238 | r1n 1239 | r1nj 1240 | r1p 1241 | r1r 1242 | r1s 1243 | r1š 1244 | r1t 1245 | r1v 1246 | r1z 1247 | r1ž 1248 | 1sb 1249 | 2sb. 1250 | s1c 1251 | 1sč 1252 | 2sč. 1253 | 1sć 1254 | 2sć. 1255 | 1sd 1256 | 2sd. 1257 | 1sdž 1258 | 2sdž. 1259 | 1sđ 1260 | 2sđ. 1261 | 1sf 1262 | 2sf. 1263 | 1sg 1264 | 2sg. 1265 | 1sh 1266 | 2sh. 1267 | 1sj 1268 | 2sj. 1269 | 1sk 1270 | 2sk. 1271 | s1l 1272 | 1slj 1273 | 2slj. 1274 | 1sm 1275 | 2sm. 1276 | s1n 1277 | 2sn. 1278 | 1snj 1279 | 2snj. 1280 | s1p 1281 | 1sr 1282 | 2sr. 1283 | 1ss 1284 | 2ss. 1285 | 1sš 1286 | 2sš. 1287 | s1t 1288 | 2st. 1289 | 1sv 1290 | 2sv. 1291 | 1sz 1292 | 2sz. 1293 | 1sž 1294 | 2sž. 1295 | 1šb 1296 | 2šb. 1297 | š1c 1298 | š1č 1299 | š1ć 1300 | 1šd 1301 | 2šd. 1302 | 1šdž 1303 | 2šdž. 1304 | 1šđ 1305 | 2šđ. 1306 | 1šf 1307 | 2šf. 1308 | 1šg 1309 | 2šg. 1310 | 1šh 1311 | 2šh. 1312 | 1šj 1313 | 2šj. 1314 | 1šk 1315 | 2šk. 1316 | š1l 1317 | 2š1lj 1318 | 1šm 1319 | 2šm. 1320 | š1n 1321 | 2š1nj 1322 | 1šp 1323 | 2šp. 1324 | 1šr 1325 | 2šr. 1326 | 1šs 1327 | 2šs. 1328 | 1šš 1329 | 2šš. 1330 | 1št 1331 | 2št. 1332 | 1šv 1333 | 2šv. 1334 | 1šz 1335 | 2šz. 1336 | 1šž 1337 | 2šž. 1338 | t1b 1339 | t1c 1340 | t1č 1341 | t1ć 1342 | t1d 1343 | t1dž 1344 | t1đ 1345 | t1f 1346 | t1g 1347 | t1h 1348 | 1tj 1349 | 2tj. 1350 | t1k 1351 | 1tl 1352 | 2tl. 1353 | 2t1lj 1354 | t1m 1355 | t1n 1356 | t1nj 1357 | t1p 1358 | 1tr 1359 | 2tr. 1360 | t1s 1361 | t1š 1362 | t1t 1363 | 1tv 1364 | 2tv. 1365 | t1z 1366 | t1ž 1367 | v1b 1368 | v1c 1369 | v1č 1370 | v1ć 1371 | v1d 1372 | v1dž 1373 | v1đ 1374 | v1f 1375 | v1g 1376 | v1h 1377 | v1j 1378 | 1v2je 1379 | vj. 1380 | v1k 1381 | v1l 1382 | 2v1lj 1383 | v1m 1384 | v1n 1385 | v1nj 1386 | v1p 1387 | 1vr 1388 | v1s 1389 | v1š 1390 | v1t 1391 | v1v 1392 | v1z 1393 | v1ž 1394 | z1b 1395 | 1zc 1396 | 2zc. 1397 | 1zč 1398 | 2zč. 1399 | 1zć 1400 | 2zć. 1401 | z1d 1402 | 1zdž 1403 | 2zdž. 1404 | 1zđ 1405 | 2zđ. 1406 | 1zf 1407 | 2zf. 1408 | z1g 1409 | 1zh 1410 | 2zh. 1411 | 1zj 1412 | 2zj. 1413 | 1zk 1414 | 2zk. 1415 | z1l 1416 | 2z1lj 1417 | z1m 1418 | z1n 1419 | 1znj 1420 | 2znj. 1421 | 1zp 1422 | 2zp. 1423 | z1r 1424 | z1s 1425 | 1zš 1426 | 2zš. 1427 | 1zt 1428 | 2zt. 1429 | 1zv 1430 | 2zv. 1431 | 1zz 1432 | 2zz. 1433 | 1zž 1434 | 2zž. 1435 | ž1b 1436 | 2žb. 1437 | 1žc 1438 | 2žc. 1439 | 1žč 1440 | 2žč. 1441 | 1žć 1442 | 2žć. 1443 | 1žd 1444 | 2žd. 1445 | 1ždž 1446 | 2ždž. 1447 | 1žđ 1448 | 2žđ. 1449 | 1žf 1450 | 2žf. 1451 | 1žg 1452 | 2žg. 1453 | 1žh 1454 | 2žh. 1455 | ž1j 1456 | 1žk 1457 | 2žk. 1458 | 1žl 1459 | 2žl. 1460 | ž1lj 1461 | 1žm 1462 | 2žm. 1463 | ž1n 1464 | 2žn. 1465 | 2ž1nj 1466 | 1žp 1467 | 2žp. 1468 | 1žr 1469 | 2žr. 1470 | 1žs 1471 | 2žs. 1472 | 1žš 1473 | 2žš. 1474 | 1žt 1475 | 2žt. 1476 | 1žv 1477 | 2žv. 1478 | 1žz 1479 | 2žz. 1480 | 1žž 1481 | 2žž. 1482 | 2d1vj 1483 | 2d1vr 1484 | z1g2nj 1485 | ć1s2t 1486 | d1s2m 1487 | j1z2g 1488 | r2n1t 1489 | r2z1n 1490 | m2p1t 1491 | 2d1vl 1492 | r2t1c 1493 | r2n1c 1494 | r2č1k 1495 | 2s1hr 1496 | z1v2l 1497 | 2z1vr 1498 | r2k1n 1499 | r2c1n 1500 | r2h1nj 1501 | s2p1n 1502 | j1s2l 1503 | r2d1n 1504 | .zg2 1505 | r2dž1b 1506 | 2š1tv 1507 | r2t1s 1508 | n2t1s 1509 | 2s1kr 1510 | r2n1k 1511 | d1š2k 1512 | d1s2p 1513 | r2t1m 1514 | 1r2je 1515 | k2s1p 1516 | t1s2t 1517 | l2m1s 1518 | r2h1k 1519 | j1s2t 1520 | s1v2l 1521 | r2p1c 1522 | t1k2l 1523 | s1k2l 1524 | n2t1n 1525 | 2d1ja 1526 | 2rt. 1527 | z1r2j 1528 | d1s2t 1529 | n2k1c 1530 | r2t1k 1531 | r2g1n 1532 | r2h1t 1533 | .na2j1 1534 | .be2z1 1535 | .iz1 1536 | .is1 1537 | .ne2o3 1538 | r2t1n 1539 | r2v1n 1540 | r1s2t 1541 | n2s1t 1542 | l2f1t 1543 | } 1544 | -------------------------------------------------------------------------------- /patterns/hyph-it.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for Italian 2 | % copyright: Copyright (C) 2008-2011 Claudio Beccari 3 | % notice: This file is part of the hyph-utf8 package. 4 | % See http://www.hyphenation.org/tex for more information. 5 | % language: 6 | % name: Italian 7 | % tag: it 8 | % version: 4.9 2014/04/22 9 | % authors: 10 | % - 11 | % name: Claudio Beccari 12 | % contact: claudio.beccari (at) gmail.com 13 | % licence: 14 | % - This file is available under any of the following licences: 15 | % - 16 | % name: LPPL 17 | % version: 1.3 18 | % or_later: true 19 | % url: http://www.latex-project.org/lppl.txt 20 | % status: maintained 21 | % maintainer: Claudio Beccari, e-mail claudio dot beccari at gmail dot com 22 | % - 23 | % name: MIT 24 | % url: https://opensource.org/licenses/MIT 25 | % text: > 26 | % Permission is hereby granted, free of charge, to any person 27 | % obtaining a copy of this software and associated documentation 28 | % files (the "Software"), to deal in the Software without 29 | % restriction, including without limitation the rights to use, 30 | % copy, modify, merge, publish, distribute, sublicense, and/or sell 31 | % copies of the Software, and to permit persons to whom the 32 | % Software is furnished to do so, subject to the following 33 | % conditions: 34 | % 35 | % The above copyright notice and this permission notice shall be 36 | % included in all copies or substantial portions of the Software. 37 | % 38 | % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 39 | % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 40 | % OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 41 | % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 42 | % HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 43 | % WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 44 | % FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 45 | % OTHER DEALINGS IN THE SOFTWARE. 46 | % hyphenmins: 47 | % typesetting: 48 | % left: 2 49 | % right: 2 50 | % changes: 51 | % - 2014-04-22 - Add few patterns involving `h' 52 | % - 2011-08-16 - Change the licence from GNU LGPL into LPPL v1.3. 53 | % - 2010-05-24 - Fix for Italian patterns for proper hyphenation of -ich and Ljubljana. 54 | % - 2008-06-09 - Import of original ithyph.tex into hyph-utf8 package. 55 | % - 2008-03-08 - (last change in ithyph.tex) 56 | % texlive: 57 | % encoding: ascii 58 | % babelname: italian 59 | % legacy_patterns: ithyph.tex 60 | % message: Italian hyphenation patterns 61 | % description: |- 62 | % Hyphenation patterns for Italian in ASCII encoding. 63 | % Compliant with the Recommendation UNI 6461 on hyphenation 64 | % issued by the Italian Standards Institution 65 | % (Ente Nazionale di Unificazione UNI). 66 | % ========================================== 67 | % 68 | % These hyphenation patterns for the Italian language are supposed to comply 69 | % with the Recommendation UNI 6461 on hyphenation issued by the Italian 70 | % Standards Institution (Ente Nazionale di Unificazione UNI). No guarantee 71 | % or declaration of fitness to any particular purpose is given and any 72 | % liability is disclaimed. 73 | % 74 | \patterns{ 75 | .a3p2n % After the Garzanti dictionary: a-pnea, a-pnoi-co,... 76 | .anti1 77 | .anti3m2n 78 | .bio1 79 | .ca4p3s 80 | .circu2m1 81 | .contro1 82 | .di2s3cine 83 | .e2x1eu 84 | .fran2k3 85 | .free3 86 | .li3p2sa 87 | .narco1 88 | .opto1 89 | .orto3p2 90 | .para1 91 | .ph2l 92 | .ph2r 93 | .poli3p2 94 | .pre1 95 | .p2s 96 | .re1i2scr 97 | .sha2re3 98 | .tran2s3c 99 | .tran2s3d 100 | .tran2s3l 101 | .tran2s3n 102 | .tran2s3p 103 | .tran2s3r 104 | .tran2s3t 105 | .su2b3lu 106 | .su2b3r 107 | .wa2g3n 108 | .wel2t1 109 | 2'2 110 | a1ia 111 | a1ie 112 | a1io 113 | a1iu 114 | a1uo 115 | a1ya 116 | 2at. 117 | e1iu 118 | e2w 119 | o1ia 120 | o1ie 121 | o1io 122 | o1iu 123 | 1b 124 | 2bb 125 | 2bc 126 | 2bd 127 | 2bf 128 | 2bm 129 | 2bn 130 | 2bp 131 | 2bs 132 | 2bt 133 | 2bv 134 | b2l 135 | b2r 136 | 2b. 137 | 2b' 138 | 1c 139 | 2cb 140 | 2cc 141 | 2cd 142 | 2cf 143 | 2ck 144 | 2cm 145 | 2cn 146 | 2cq 147 | 2cs 148 | 2ct 149 | 2cz 150 | 2chh 151 | c2h 152 | 2ch. 153 | 2ch'. 154 | 2ch''. 155 | 2chb 156 | ch2r 157 | 2chn 158 | c2l 159 | c2r 160 | 2c. 161 | 2c' 162 | .c2 163 | 1d 164 | 2db 165 | 2dd 166 | 2dg 167 | 2dl 168 | 2dm 169 | 2dn 170 | 2dp 171 | d2r 172 | 2ds 173 | 2dt 174 | 2dv 175 | 2dw 176 | 2d. 177 | 2d' 178 | .d2 179 | 1f 180 | 2fb 181 | 2fg 182 | 2ff 183 | 2fn 184 | f2l 185 | f2r 186 | 2fs 187 | 2ft 188 | 2f. 189 | 2f' 190 | 1g 191 | 2gb 192 | 2gd 193 | 2gf 194 | 2gg 195 | g2h 196 | g2l 197 | 2gm 198 | g2n 199 | 2gp 200 | g2r 201 | 2gs 202 | 2gt 203 | 2gv 204 | 2gw 205 | 2gz 206 | 2gh2t 207 | 2g. 208 | 2g' 209 | .h2 210 | 1h 211 | 2hb 212 | 2hd 213 | 2hh 214 | hi3p2n 215 | h2l 216 | 2hm 217 | 2hn 218 | 2hr 219 | 2hv 220 | 2h. 221 | 2h' 222 | .j2 223 | 1j 224 | 2j. 225 | 2j' 226 | .k2 227 | 1k 228 | 2kg 229 | 2kf 230 | k2h 231 | 2kk 232 | k2l 233 | 2km 234 | k2r 235 | 2ks 236 | 2kt 237 | 2k. 238 | 2k' 239 | 1l 240 | 2lb 241 | 2lc 242 | 2ld 243 | 2l3f2 244 | 2lg 245 | l2h 246 | l2j 247 | 2lk 248 | 2ll 249 | 2lm 250 | 2ln 251 | 2lp 252 | 2lq 253 | 2lr 254 | 2ls 255 | 2lt 256 | 2lv 257 | 2lw 258 | 2lz 259 | 2l. 260 | 2l'. 261 | 2l'' 262 | 1m 263 | 2mb 264 | 2mc 265 | 2mf 266 | 2ml 267 | 2mm 268 | 2mn 269 | 2mp 270 | 2mq 271 | 2mr 272 | 2ms 273 | 2mt 274 | 2mv 275 | 2mw 276 | 2m. 277 | 2m' 278 | 1n 279 | 2nb 280 | 2nc 281 | 2nd 282 | 2nf 283 | 2ng 284 | 2nk 285 | 2nl 286 | 2nm 287 | 2nn 288 | 2np 289 | 2nq 290 | 2nr 291 | 2ns 292 | n2s3fer 293 | 2nt 294 | 2nv 295 | 2nz 296 | n2g3n 297 | 2nheit 298 | 2n. 299 | 2n' 300 | 1p 301 | 2pd 302 | p2h 303 | p2l 304 | 2pn 305 | 3p2ne 306 | 2pp 307 | p2r 308 | 2ps 309 | 3p2sic 310 | 2pt 311 | 2pz 312 | 2p. 313 | 2p' 314 | 1q 315 | 2qq 316 | 2q. 317 | 2q' 318 | 1r 319 | 2rb 320 | 2rc 321 | 2rd 322 | 2rf 323 | r2h 324 | 2rg 325 | 2rk 326 | 2rl 327 | 2rm 328 | 2rn 329 | 2rp 330 | 2rq 331 | 2rr 332 | 2rs 333 | 2rt 334 | r2t2s3 335 | 2rv 336 | 2rx 337 | 2rw 338 | 2rz 339 | 2r. 340 | 2r' 341 | 1s2 342 | 2shm 343 | 2sh. 344 | 2sh' 345 | 2s3s 346 | s4s3m 347 | 2s3p2n 348 | 2stb 349 | 2stc 350 | 2std 351 | 2stf 352 | 2stg 353 | 2stm 354 | 2stn 355 | 2stp 356 | 2sts 357 | 2stt 358 | 2stv 359 | 2sz 360 | 4s. 361 | 4s'. 362 | 4s'' 363 | .t2 364 | 1t 365 | 2tb 366 | 2tc 367 | 2td 368 | 2tf 369 | 2tg 370 | t2h 371 | 2th. 372 | t2l 373 | 2tm 374 | 2tn 375 | 2tp 376 | t2r 377 | t2s 378 | 3t2sch 379 | 2tt 380 | t2t3s 381 | 2tv 382 | 2tw 383 | t2z 384 | 2tzk 385 | tz2s 386 | 2t. 387 | 2t'. 388 | 2t'' 389 | 1v 390 | 2vc 391 | v2l 392 | v2r 393 | 2vv 394 | 2v. 395 | 2v'. 396 | 2v'' 397 | 1w 398 | w2h 399 | wa2r 400 | 2w1y 401 | 2w. 402 | 2w' 403 | 1x 404 | 2xb 405 | 2xc 406 | 2xf 407 | 2xh 408 | 2xm 409 | 2xp 410 | 2xt 411 | 2xw 412 | 2x. 413 | 2x' 414 | y1ou 415 | y1i 416 | 1z 417 | 2zb 418 | 2zd 419 | 2zl 420 | 2zn 421 | 2zp 422 | 2zt 423 | 2zs 424 | 2zv 425 | 2zz 426 | 2z. 427 | 2z'. 428 | 2z'' 429 | .z2 430 | } % Pattern end 431 | 432 | -------------------------------------------------------------------------------- /patterns/hyph-kmr.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for Kurmanji (Northern Kurdish) 2 | % – as spoken in Turkey and by the Kurdish diaspora in Europe 3 | % copyright: Copyright (C) 2009 Jörg Knappen, Medeni Shemdê 4 | % notice: This file is part of the hyph-utf8 package. 5 | % See http://www.hyphenation.org/tex for more information. 6 | % version: 1.0 7 | % language: 8 | % name: Kurmanji, Northern Kurdish 9 | % tag: kmr 10 | % authors: 11 | % - 12 | % name: Jörg Knappen 13 | % contact: jknappen (at) web.de 14 | % - 15 | % name: Medeni Shemdê 16 | % licence: 17 | % name: LPPL 18 | % version: 1.3 19 | % status: maintained 20 | % maintainer: Jörg Knappen 21 | % url: https://latex-project.org/lppl/lppl-1-3.html 22 | % hyphenmins: 23 | % typesetting: 24 | % left: 2 25 | % right: 2 26 | % changes: 27 | % - 2009-06-29 last_modified 28 | % texlive: 29 | % encoding: ec 30 | % babelname: kurmanji 31 | % legacy_patterns: kmrhyph.tex 32 | % message: Kurmanji hyphenation patterns 33 | % description: |- 34 | % Hyphenation patterns for Kurmanji (Northern Kurdish) as spoken in 35 | % Turkey and by the Kurdish diaspora in Europe, in T1/EC and UTF-8 36 | % encodings. 37 | % ========================================== 38 | % The patterns are generated by patgen from a word list of approx. 2500 39 | % hyphenated words provided by Medeni Shemdê 40 | % 41 | \patterns{ 42 | .ka6ra 43 | a1 44 | al4a 45 | 6amît. 46 | 4an 47 | ar5a6nî 48 | 3av 49 | 4avay 50 | 2ay 51 | 1b 52 | b4a 53 | 2bb 54 | 2bl 55 | 2br 56 | 2bs 57 | 2bx 58 | 1c 59 | 2cb 60 | 2c2k 61 | 2cl 62 | 1ç 63 | 2çk 64 | 1d 65 | da6vêji 66 | 2db 67 | dbû6na 68 | 2dd 69 | dda4 70 | 2dg 71 | 2dr 72 | 2dt 73 | d4yo 74 | 4dyû 75 | e1 76 | ea2 77 | e4dy 78 | ee2 79 | eê2 80 | e4fr 81 | el4a 82 | erdes6 83 | er6desta 84 | e4tr 85 | 2ez 86 | ê1 87 | ê2a 88 | êla4v 89 | 1f 90 | fl4 91 | f4lî 92 | 4flû 93 | f4ro 94 | 2fs 95 | 2fş 96 | 2ft 97 | 2fx 98 | 1g 99 | 2gb 100 | 2gh 101 | 2gk 102 | g2l 103 | 2gn 104 | 2gr 105 | 2gs 106 | 2gt 107 | 1h 108 | 2hb 109 | 2hd 110 | 2hk 111 | 2hm 112 | 2hn 113 | 2hr 114 | 2hs 115 | 2ht 116 | i1 117 | ii2 118 | il4a 119 | i4nêr 120 | ire4h 121 | i2s 122 | î1 123 | î2a 124 | 2îd 125 | îe4t 126 | î2j 127 | îl3 128 | î4pl 129 | îsti6ye 130 | 1j 131 | 6ja6va. 132 | 2jh 133 | 2jk 134 | 2jm 135 | 2jn 136 | 2jt 137 | 1k 138 | 2kb 139 | 2kç 140 | 2kk 141 | 2kl 142 | 2km 143 | 2kn 144 | 2kr 145 | 2ks 146 | 2kt 147 | 2kv 148 | 2kw 149 | 2kx 150 | 2ky 151 | 1l 152 | 6lamîtê 153 | 2lb 154 | 2lc 155 | 2lç 156 | 2ld 157 | l4e 158 | 2lf 159 | 2lg 160 | 2lh 161 | 2lk 162 | 2ll 163 | 2lm 164 | 2ln 165 | 2lp 166 | 2lq 167 | 2ls 168 | 2lt 169 | 2lv 170 | 2lw 171 | 2lx 172 | 2ly 173 | 2lz 174 | 1m 175 | ma4î 176 | 2mb 177 | 2md 178 | 2mf 179 | 4mîtê 180 | 2mm 181 | 2mp2 182 | 2mr 183 | 2ms 184 | 2mw 185 | 2my 186 | 2mz 187 | 1n 188 | n4a 189 | 2nb 190 | 2nc 191 | 2nç 192 | 2nd 193 | nê4re 194 | 2nf 195 | 2ng 196 | 2nh 197 | 2nk 198 | nki4 199 | 2nn 200 | 2np 201 | 2ns 202 | 2nş 203 | 2nt 204 | 2nv 205 | 2nx 206 | 2ny 207 | 2n2z 208 | 2o 209 | of2 210 | o2h 211 | o2s 212 | o2w 213 | 1p 214 | 2ps 215 | 2pt 216 | 1q 217 | 2qp 218 | 2qş 219 | 1r 220 | r4a 221 | raî4 222 | 2rb 223 | 2rc 224 | 2rç 225 | 2rd 226 | 2rf 227 | r4fi4 228 | 2rg 229 | 2rh 230 | 2rj 231 | 2rk 232 | 2rl 233 | 2rm 234 | 2rn 235 | 2rp 236 | 2rq 237 | 2rr 238 | 2rs 239 | 2rt 240 | 2rv 241 | 2rw 242 | 2rx 243 | 2ry 244 | 2rz 245 | 1s 246 | 3sa 247 | 2sb 248 | 3se 249 | 2sg 250 | 3sî 251 | 2sk 252 | 2sp 253 | 2sr 254 | 2ss 255 | 2st 256 | sta4v 257 | st4r 258 | 3su 259 | 3sû 260 | 2sy 261 | 1ş 262 | 4şa4v 263 | 2şb 264 | 2şd 265 | şê4l 266 | 2şg 267 | 2şh 268 | 2şk 269 | 2şm 270 | 2şn 271 | 2şp 272 | 2şt2 273 | 2şv 274 | 2şx 275 | 1t 276 | 4tav 277 | 2tg 278 | tge4 279 | 2tk 280 | 2tl 281 | 2tm 282 | 2tn 283 | tnî4 284 | 2tp 285 | t4ra 286 | t4rû 287 | 2t3s2 288 | 2tt 289 | 2tx 290 | 2ty 291 | u1 292 | ue2 293 | u2i 294 | u2k 295 | urandi6 296 | u2ş 297 | 1v 298 | 2vb 299 | 2vç 300 | 2vd 301 | 2vg 302 | 2vh 303 | 2vk 304 | 2vn 305 | 2vr 306 | 2vs 307 | 2vş 308 | 2vy 309 | 1w 310 | 2wc 311 | 2wd 312 | 2wh 313 | 2wk 314 | 2wl 315 | 2wn 316 | 2wr 317 | 2ws 318 | 2wş 319 | 2wt 320 | 1x 321 | x4a 322 | 2xç 323 | 2xl 324 | 2xn 325 | 2xt 326 | x4tr 327 | x2w 328 | 1y 329 | 2yb 330 | 2yd 331 | yda4 332 | 2yl 333 | 2yn 334 | 2yr 335 | 2ys 336 | 2yt 337 | 2yv 338 | 2yw 339 | 1z 340 | 2zb 341 | 2zd 342 | z3e4z 343 | 2zk 344 | 2zm 345 | 2zr 346 | 2zt 347 | 2zy 348 | 2zz 349 | } 350 | -------------------------------------------------------------------------------- /patterns/hyph-la.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for modern and medieval Latin 2 | % copyright: Copyright (C) 1999-2016 Claudio Beccari 3 | % notice: This file is part of the hyph-utf8 package. 4 | % See http://www.hyphenation.org/tex for more information. 5 | % language: 6 | % name: Latin 7 | % tag: la 8 | % version: 3.201 2016-08-28 9 | % authors: 10 | % - 11 | % name: Claudio Beccari 12 | % contact: claudio.beccari (at) gmail.com 13 | % licence: 14 | % - This file is available under any of the following licences: 15 | % - 16 | % name: MIT 17 | % url: https://opensource.org/licenses/MIT 18 | % text: > 19 | % Permission is hereby granted, free of charge, to any person 20 | % obtaining a copy of this software and associated documentation 21 | % files (the “Software”), to deal in the Software without 22 | % restriction, including without limitation the rights to use, 23 | % copy, modify, merge, publish, distribute, sublicense, and/or sell 24 | % copies of the Software, and to permit persons to whom the 25 | % Software is furnished to do so, subject to the following 26 | % conditions: 27 | % 28 | % The above copyright notice and this permission notice shall be 29 | % included in all copies or substantial portions of the Software. 30 | % 31 | % THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, 32 | % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 33 | % OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 34 | % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 35 | % HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 36 | % WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 37 | % FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 38 | % OTHER DEALINGS IN THE SOFTWARE. 39 | % - 40 | % name: LPPL 41 | % version: 1 42 | % or_later: true 43 | % url: https://latex-project.org/lppl/ 44 | % hyphenmins: 45 | % typesetting: 46 | % left: 2 47 | % right: 2 48 | % changes: 49 | % - 50 | % date: 1999 51 | % version: 1.0 52 | % author: Claudio Beccari 53 | % description: First public release 54 | % - 55 | % date: 2007-04-16 56 | % version: 3.1 57 | % author: Claudio Beccari 58 | % - 59 | % date: 2010-05-31 60 | % author: Claudio Beccari 61 | % description: Removal of OT1 support 62 | % - 63 | % date: 2010-06-01 64 | % version: 3.2 65 | % author: Claudio Beccari 66 | % description: Removal of pattern 2'2 67 | % - 68 | % date: 2014-06-04 69 | % version: 3.2a 70 | % - 71 | % date: 2016-08-28 72 | % version: 3.201 73 | % author: Claudio Beccari 74 | % description: updated header with MIT licence notice; 75 | % added few missing patterns 76 | % texlive: 77 | % encoding: ec 78 | % babelname: latin 79 | % legacy_patterns: lahyph.tex 80 | % message: Latin hyphenation patterns 81 | % package: latin 82 | % 83 | % ========================================== 84 | % Patterns for the latin language mainly in modern spelling 85 | % (u when u is needed and v when v is needed); medieval spelling 86 | % with the ligatures æ and œ and the (uncial) lowercase ‘v’ 87 | % written as a ‘u’ is also supported; apparently there is no conflict 88 | % between the patterns of modern Latin and those of medieval Latin. 89 | % 90 | % For more information please read the babel-latin documentation. 91 | % 92 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 93 | % 94 | % For documentation see: 95 | % C. Beccari, “Computer aided hyphenation for Italian and Modern 96 | % Latin”, TUG vol. 13, n. 1, pp. 23-33 (1992) 97 | % 98 | % see also 99 | % 100 | % C. Beccari, “Typesetting of ancient languages”, 101 | % TUG vol.15, n.1, pp. 9-16 (1994) 102 | % 103 | % In the former paper the code was described as being contained in file 104 | % ITALAT.TEX; this is substantially the same code, but the file has been 105 | % renamed and included in hyph-utf8. 106 | % 107 | % A corresponding file (ITHYPH.TEX) has been extracted in order to eliminate 108 | % the (few) patterns specific to Latin and leave those specific to Italian; 109 | % ITHYPH.TEX has been further extended with many new patterns in order to 110 | % cope with the many neologisms and technical terms with foreign roots. 111 | % 112 | % Should you find any word that gets hyphenated in a wrong way, please, AFTER 113 | % CHECKING ON A RELIABLE MODERN DICTIONARY, report to the author, preferably 114 | % by e-mail. Please do not report about wrong break points concerning 115 | % prefixes and/or suffixes; see at the bottom of this file. 116 | % 117 | % Compared with the previous versions, this file has been extended so as to 118 | % cope also with the medieval Latin spelling, where the letter ‘V’ played the 119 | % roles of both ‘U’ and ‘V’, as in the Roman times, save that the Romans used 120 | % only capitals. In the middle ages the availability of soft writing supports 121 | % and the necessity of copying books with a reasonable speed, several scripts 122 | % evolved in (practically) all of which there was a lower case alphabet 123 | % different from the upper case one, and where the lower case ‘v’ had the 124 | % rounded shape of our modern lower case ‘u’, and where the Latin diphthongs 125 | % ‘Æ’ and ‘Œ’, both in upper and lower case, where written as ligatures, 126 | % not to mention the habit of substituting them with their sound, that is a 127 | % simple ‘E'. 128 | % 129 | % According to Leon Battista Alberti, who in 1466 wrote a book on 130 | % cryptography where he thoroughly analyzed the hyphenation of the Latin 131 | % language of his (still medieval) times, the differences from the Tuscan 132 | % language (the Italian language, as it was named at his time) were very 133 | % limited, in particular for what concerns the handling of the ascending and 134 | % descending diphthongs; in Central and Northern Europe, and later on in 135 | % North America, the Scholars perceived the above diphthongs as made of two 136 | % distinct vowels; the hyphenation of medieval Latin, therefore, was quite 137 | % different in the northern countries compared to the southern ones, at least 138 | % for what concerns these diphthongs. If you need hyphenation patterns for 139 | % medieval Latin that suite you better according to the habits of Northern 140 | % Europe you should resort to the hyphenation patterns prepared by Yannis 141 | % Haralambous (TUGboat, vol.13 n.4 (1992)). 142 | % 143 | % 144 | % 145 | % PREFIXES AND SUFFIXES 146 | % 147 | % For what concerns prefixes and suffixes, the latter are generally separated 148 | % according to “natural” syllabification, while the former are generally 149 | % divided etimologically. In order to avoid an excessive number of patterns, 150 | % care has been paid to some prefixes, especially “ex”, “trans”, “circum”, 151 | % “prae”, but this set of patterns is NOT capable of separating the prefixes 152 | % in all circumstances. 153 | % 154 | % BABEL SHORTCUTS AND FACILITIES 155 | % 156 | % Read the documentation coming with the discription of the Latin language 157 | % interface of Babel in order to see the shortcuts and the facilities 158 | % introduced in order to facilitate the insertion of “compound word marks” 159 | % which are very useful for inserting etymological break points. 160 | % 161 | % Happy Latin and multilingual typesetting! 162 | % 163 | \patterns{% 164 | .a2b3l 165 | .anti1 .anti3m2n 166 | .circu2m1 167 | .co2n1iun 168 | .di2s3cine 169 | .e2x1 170 | .o2b3 % .o2b3l .o2b3r .o2b3s 171 | .para1i .para1u 172 | .su2b3lu .su2b3r 173 | 2s3que. 2s3dem. 174 | 3p2sic 175 | 3p2neu 176 | æ1 œ1 177 | a1ia a1ie a1io a1iu ae1a ae1o ae1u 178 | e1iu 179 | io1i 180 | o1ia o1ie o1io o1iu 181 | uo3u % quousque 182 | 1b 2bb 2bc 2bd b2l 2bm 2bn b2r 2bt 2bs 2b. 183 | 1c 2cc c2h2 c2l 2cm 2cn 2cq c2r 2cs 2ct 2cz 2c. 184 | 1d 2dd 2dg 2dm d2r 2ds 2dv 2d. 185 | 1f 2ff f2l 2fn f2r 2ft 2f. 186 | 1g 2gg 2gd 2gf g2l 2gm g2n g2r 2gs 2gv 2g. 187 | 1h 2hp 2ht 2h. 188 | 1j 189 | 1k 2kk k2h2 190 | 1l 2lb 2lc 2ld 2lf l3f2t 2lg 2lk 2ll 2lm 2ln 2lp 2lq 2lr 191 | 2ls 2lt 2lv 2l. 192 | 1m 2mm 2mb 2mp 2ml 2mn 2mq 2mr 2mv 2m. 193 | 1n 2nb 2nc 2nd 2nf 2ng 2nl 2nm 2nn 2np 2nq 2nr 2ns 194 | n2s3m n2s3f 2nt 2nv 2nx 2n. 195 | 1p p2h p2l 2pn 2pp p2r 2ps 2pt 2pz 2php 2pht 2p. 196 | 1qu2 197 | 1r 2rb 2rc 2rd 2rf 2rg r2h 2rl 2rm 2rn 2rp 2rq 2rr 2rs 2rt 198 | 2rv 2rz 2r. 199 | 1s2 2s3ph 2s3s 2stb 2stc 2std 2stf 2stg 2st3l 2stm 2stn 2stp 2stq 200 | 2sts 2stt 2stv 2s. 2st. 201 | 1t 2tb 2tc 2td 2tf 2tg t2h t2l t2r 2tm 2tn 2tp 2tq 2tt 202 | 2tv 2t. 203 | 1v v2l v2r 2vv 204 | 1x 2xt 2xx 2x. 205 | 1z 2z. 206 | % For medieval Latin 207 | a1ua a1ue a1ui a1uo a1uu 208 | e1ua e1ue e1ui e1uo e1uu 209 | i1ua i1ue i1ui i1uo i1uu 210 | o1ua o1ue o1ui o1uo o1uu 211 | u1ua u1ue u1ui u1uo u1uu 212 | % 213 | a2l1ua a2l1ue a2l1ui a2l1uo a2l1uu 214 | e2l1ua e2l1ue e2l1ui e2l1uo e2l1uu 215 | i2l1ua i2l1ue i2l1ui i2l1uo i2l1uu 216 | o2l1ua o2l1ue o2l1ui o2l1uo o2l1uu 217 | u2l1ua u2l1ue u2l1ui u2l1uo u2l1uu 218 | % 219 | a2m1ua a2m1ue a2m1ui a2m1uo a2m1uu 220 | e2m1ua e2m1ue e2m1ui e2m1uo e2m1uu 221 | i2m1ua i2m1ue i2m1ui i2m1uo i2m1uu 222 | o2m1ua o2m1ue o2m1ui o2m1uo o2m1uu 223 | u2m1ua u2m1ue u2m1ui u2m1uo u2m1uu 224 | % 225 | a2n1ua a2n1ue a2n1ui a2n1uo a2n1uu 226 | e2n1ua e2n1ue e2n1ui e2n1uo e2n1uu 227 | i2n1ua i2n1ue i2n1ui i2n1uo i2n1uu 228 | o2n1ua o2n1ue o2n1ui o2n1uo o2n1uu 229 | u2n1ua u2n1ue u2n1ui u2n1uo u2n1uu 230 | % 231 | a2r1ua a2r1ue a2r1ui a2r1uo a2r1uu 232 | e2r1ua e2r1ue e2r1ui e2r1uo e2r1uu 233 | i2r1ua i2r1ue i2r1ui i2r1uo i2r1uu 234 | o2r1ua o2r1ue o2r1ui o2r1uo o2r1uu 235 | u2r1ua u2r1ue u2r1ui u2r1uo u2r1uu 236 | % 237 | } 238 | -------------------------------------------------------------------------------- /patterns/hyph-mn.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for Mongolian, Cyrillic script 2 | % copyright: Copyright (C) 2007-2015 by Dorjgotov Batmunkh 3 | % notice: This file is part of the hyph-utf8 package. 4 | % See http://www.hyphenation.org/tex for more information. 5 | % language: 6 | % name: Mongolian, Cyrillic script 7 | % tag: mn-cyrl 8 | % version: v1.2 2008/03/23 9 | % authors: 10 | % - 11 | % name: Dorjgotov Batmunkh 12 | % affiliation: National University of Mongolia 13 | % contact: bataak (at) gmail.com 14 | % licence: 15 | % - This file is available under any of the following licenses: 16 | % - 17 | % name: LPPL 18 | % version: 1.3 19 | % or_later: true 20 | % url: http://www.latex-project.org/lppl/lppl-1-3.txt 21 | % - 22 | % name: MIT 23 | % url: https://opensource.org/licenses/MIT 24 | % text: > 25 | % Permission is hereby granted, free of charge, to any person obtaining a copy 26 | % of this software and associated documentation files (the "Software"), to deal 27 | % in the Software without restriction, including without limitation the rights 28 | % to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 29 | % copies of the Software, and to permit persons to whom the Software is 30 | % furnished to do so, subject to the following conditions: 31 | % 32 | % The above copyright notice and this permission notice shall be included in 33 | % all copies or substantial portions of the Software. 34 | % 35 | % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 36 | % IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 37 | % FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 38 | % AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 39 | % LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 40 | % OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 41 | % THE SOFTWARE. 42 | % hyphenmins: 43 | % typesetting: 44 | % left: 2 45 | % right: 2 46 | % changes: 47 | % - 2008/03/23 v1.2 48 | % - 2008/06/08 Patterns added to hyph-utf8 49 | % - 2015/12/05 Patterns released under the MIT license 50 | % texlive: 51 | % encoding: t2a 52 | % babelname: mongolian 53 | % legacy_patterns: mnhyphn.tex 54 | % message: (New) Mongolian hyphenation patterns 55 | % package: mongolian 56 | % ========================================== 57 | % Special thanks to: Jim Hefferon and Robin Fairbairns 58 | % 59 | % There are few basic rules in mongolian 60 | % 61 | % 1. If there is a consonant then it can use hyphen before it. 62 | % And if there're two consonants then it can use hyphen before second consonant. 63 | % Are there three consonants then it can put hyphen before third consonant, 64 | % also are there four consonants then it can use hyphen before fourth consonant. 65 | % 2. In the case of hardsign or softsign, it's possible to hyphen after these signs. 66 | % For instance, байгуулъ-я, үзүүль-е 67 | % 3. However one vowel can be belong to a syllable, it's not possible to use hyphen. 68 | % 69 | \patterns{ 70 | % for mongolian words: 71 | 1ба 72 | 1бе 73 | 1бё 74 | 1би 75 | 1бо 76 | 1бө 77 | 1бу 78 | 1бү 79 | 1бы 80 | 1бь2ю 81 | 1бэ 82 | 1бю 83 | 1бя 84 | 1ва 85 | 1ве 86 | 1вё 87 | 1ви 88 | 1во 89 | 1вө 90 | 1ву 91 | 1вү 92 | 1вы 93 | 1вь2ю 94 | 1вэ 95 | 1вю 96 | 1вя 97 | 1га 98 | 1ге 99 | 1гё 100 | 1ги 101 | 1го 102 | 1гө 103 | 1гу 104 | 1гү 105 | 1гы 106 | 1гь2ю 107 | 1гэ 108 | 1гю 109 | 1гя 110 | 1да 111 | 1де 112 | 1дё 113 | 1ди 114 | 1до 115 | 1дө 116 | 1ду 117 | 1дү 118 | 1ды 119 | 1дь2ю 120 | 1дэ 121 | 1дю 122 | 1дя 123 | 1жа 124 | 1же 125 | 1жё 126 | 1жи 127 | 1жо 128 | 1жө 129 | 1жу 130 | 1жү 131 | 1жэ 132 | 1жю 133 | 1жя 134 | 1за 135 | 1зе 136 | 1зё 137 | 1зи 138 | 1зо 139 | 1зө 140 | 1зу 141 | 1зү 142 | 1зы 143 | 1зь2ю 144 | 1зэ 145 | 1зю 146 | 1зя 147 | 1ка 148 | 1ке 149 | 1кё 150 | 1ки 151 | 1ко 152 | 1ку 153 | 1кү 154 | 1кэ 155 | 1кю 156 | 1кя 157 | 1ла 158 | 1ле 159 | 1лё 160 | 1ли 161 | 1ло 162 | 1лө 163 | 1лу 164 | 1лү 165 | 1лы 166 | 1лэ 167 | 1лю 168 | 1ля 169 | 1ма 170 | 1ме 171 | 1мё 172 | 1ми 173 | 1мо 174 | 1мө 175 | 1му 176 | 1мү 177 | 1мы 178 | 1мэ 179 | 1мю 180 | 1мя 181 | 1на 182 | 1не 183 | 1нё 184 | 1ни 185 | 1но 186 | 1нө 187 | 1ну 188 | 1нү 189 | 1ны 190 | 1нь2ю 191 | 1нэ 192 | 1ню 193 | 1ня 194 | 1па 195 | 1пе 196 | 1пё 197 | 1пи 198 | 1по 199 | 1пө 200 | 1пу 201 | 1пү 202 | 1пы 203 | 1пь2ю 204 | 1пэ 205 | 1пю 206 | 1пя 207 | 1ра 208 | 1ре 209 | 1рё 210 | 1ри 211 | 1ро 212 | 1рө 213 | 1ру 214 | 1рү 215 | 1ры 216 | 1рэ 217 | 1рю 218 | 1ря 219 | 1са 220 | 1се 221 | 1сё 222 | 1си 223 | 1со 224 | 1сө 225 | 1су 226 | 1сү 227 | 1сы 228 | 1сэ 229 | 1сю 230 | 1ся 231 | 1та 232 | 1те 233 | 1тё 234 | 1ти 235 | 1то 236 | 1тө 237 | 1ту 238 | 1тү 239 | 1ты 240 | 1ть2ю 241 | 1тэ 242 | 1тю 243 | 1тя 244 | 1фа 245 | 1фе 246 | 1фё 247 | 1фи 248 | 1фо 249 | 1фу 250 | 1фы 251 | 1фэ 252 | 1фю 253 | 1фя 254 | 1ха 255 | 1хе 256 | 1хё 257 | 1хи 258 | 1хо 259 | 1хө 260 | 1ху 261 | 1хү 262 | 1хы 263 | 1хэ 264 | 1хю 265 | 1хя 266 | 1ца 267 | 1це 268 | 1цё 269 | 1ци 270 | 1цо 271 | 1цө 272 | 1цу 273 | 1цү 274 | 1цы 275 | 1цэ 276 | 1цю 277 | 1ця 278 | 1ча 279 | 1че 280 | 1чё 281 | 1чи 282 | 1чо 283 | 1чө 284 | 1чу 285 | 1чү 286 | 1чэ 287 | 1чю 288 | 1чя 289 | 1ша 290 | 1ше 291 | 1шё 292 | 1ши 293 | 1шо 294 | 1шө 295 | 1шу 296 | 1шү 297 | 1шэ 298 | 1шю 299 | 1шя 300 | 1ща 301 | 1ще 302 | 1щи 303 | 1щу 304 | 2а1я 305 | 2аа 306 | 2б3ю4у 307 | 2б3ю4ү 308 | 2в3ю4у 309 | 2в3ю4ү 310 | 2г3ю4у 311 | 2г3ю4ү 312 | 2д3ю4у 313 | 2д3ю4ү 314 | 2ж3ю4у 315 | 2ж3ю4ү 316 | 2з3ю4у 317 | 2з3ю4ү 318 | 2и1е 319 | 2й1е 320 | 2й1ё 321 | 2й1ю 322 | 2й1я 323 | 2л3ю4у 324 | 2л3ю4ү 325 | 2м3ю4у 326 | 2м3ю4ү 327 | 2н3ю4у 328 | 2н3ю4ү 329 | 2о1е 330 | 2о1ё 331 | 2о1я 332 | 2оо 333 | 2ө1е 334 | 2өө 335 | 2п3ю4у 336 | 2п3ю4ү 337 | 2р3ю4у 338 | 2р3ю4ү 339 | 2с3ю4у 340 | 2с3ю4ү 341 | 2т3ю4у 342 | 2т3ю4ү 343 | 2у1я 344 | 2у3ю 345 | 2уу 346 | 2үү 347 | 2х3ю4у 348 | 2х3ю4ү 349 | 2ц3ю4у 350 | 2ц3ю4ү 351 | 2ч3ю4у 352 | 2ч3ю4ү 353 | 2ш3ю4у 354 | 2ш3ю4ү 355 | 2ъ3е 356 | 2ъ3ё 357 | 2ъ3ю 358 | 2ъ3я 359 | 2ь3е 360 | 2ь3ё 361 | 2ь3я 362 | 2э3е 363 | 2ээ 364 | 2ю3а 365 | 2ю3и 366 | 2ю3о 367 | % for russian words: 368 | .авто3а4г 369 | .авто3а4д 370 | .авто3а4к 371 | .авто3а4л 372 | .авто3а4н 373 | .авто3а4с 374 | .авто3б4л 375 | .авто3б4р 376 | .авто3в4в 377 | .авто3в4л 378 | .авто3г4р 379 | .авто3д4р 380 | .авто3и4м 381 | .авто3и4н 382 | .авто3и4о 383 | .авто3к4л 384 | .авто3к4р 385 | .авто3о4б 386 | .авто3о4к 387 | .авто3о4п 388 | .авто3о4т 389 | .авто3п4р 390 | .авто3с4к 391 | .авто3с4л 392 | .авто3с4м 393 | .авто3с4п 394 | .авто3с4т 395 | .авто3с4ц 396 | .авто3т4р 397 | .авто3ф4л 398 | .авто3ф4р 399 | .авто3х4р 400 | .авто3х4т 401 | .авто3ц4в 402 | .авто3э4к 403 | .авто3э4л 404 | .авто3э4м 405 | .авто3э4п 406 | .анти3а4в 407 | .анти3а4д 408 | .анти3а4л 409 | .анти3а4н 410 | .анти3а4п 411 | .анти3а4р 412 | .анти3а4с 413 | .анти3а4т 414 | .анти3а4у 415 | .анти3б4л 416 | .анти3г4л 417 | .анти3г4р 418 | .анти3д4р 419 | .анти3и4д 420 | .анти3и4з 421 | .анти3и4м 422 | .анти3и4н 423 | .анти3к4в 424 | .анти3к4л 425 | .анти3о4б 426 | .анти3о4з 427 | .анти3о4к 428 | .анти3п4л 429 | .анти3п4н 430 | .анти3п4р 431 | .анти3п4с 432 | .анти3с4в 433 | .анти3с4к 434 | .анти3с4т 435 | .анти3с4ц 436 | .анти3т4р 437 | .анти3у4з 438 | .анти3у4р 439 | .анти3у4т 440 | .анти3ф4л 441 | .анти3ф4р 442 | .анти3х4л 443 | .анти3х4р 444 | .анти3э4м 445 | .анти3э4н 446 | .анти3э4р 447 | .астро3б4л 448 | .астро3г4л 449 | .астро3г4р 450 | .астро3и4н 451 | .астро3о4р 452 | .астро3с4п 453 | .астро3ш4т 454 | .аэро3д4р 455 | .аэро3к4л 456 | .аэро3п4л 457 | .аэро3с4т 458 | .аэро3ф4л 459 | .би3а4к 460 | .би3а4л 461 | .би3а4ф 462 | .би3к4в 463 | .би3к4р 464 | .би3о4р 465 | .би3п4р 466 | .би3э4к 467 | .био3а4к 468 | .био3а4н 469 | .био3а4п 470 | .био3а4с 471 | .био3б4л 472 | .био3г4р 473 | .био3и4н 474 | .био3к4л 475 | .био3к4р 476 | .био3о4р 477 | .био3п4л 478 | .био3п4р 479 | .био3с4к 480 | .био3с4п 481 | .био3с4т 482 | .био3с4ф 483 | .био3х4р 484 | .био3э4к 485 | .био3э4л 486 | .био3э4н 487 | .био3э4т 488 | .бь4 489 | .въ4 490 | .вь4 491 | .газо3а4б 492 | .газо3а4д 493 | .газо3а4н 494 | .газо3а4п 495 | .гео3а4к 496 | .гео3б4л 497 | .гео3г4р 498 | .гео3и4з 499 | .гео3и4н 500 | .гео3к4р 501 | .гео3с4к 502 | .гео3с4т 503 | .гео3с4ф 504 | .гео3т4р 505 | .гео3ф4л 506 | .гео3х4р 507 | .гео3э4к 508 | .гео3э4л 509 | .гидро3а4б 510 | .гидро3а4в 511 | .гидро3а4г 512 | .гидро3а4д 513 | .гидро3а4к 514 | .гидро3а4л 515 | .гидро3а4м 516 | .гидро3а4р 517 | .гидро3а4э 518 | .гидро3г4р 519 | .гидро3и4з 520 | .гидро3и4н 521 | .гидро3и4о 522 | .гидро3к4л 523 | .гидро3к4р 524 | .гидро3о4к 525 | .гидро3п4л 526 | .гидро3п4н 527 | .гидро3с4т 528 | .гидро3с4ф 529 | .гидро3т4р 530 | .гидро3у4д 531 | .гидро3у4з 532 | .гидро3у4р 533 | .гидро3х4л 534 | .гидро3э4к 535 | .гидро3э4л 536 | .гидро3э4н 537 | .гипе2р3а4д 538 | .гипе2р3а4з 539 | .гипе2р3а4к 540 | .гипе2р3а4л 541 | .гипе2р3а4м 542 | .гипе2р3а4р 543 | .гипе2р3а4ц 544 | .гипе2р3а4э 545 | .гипе2р3е4а 546 | .гипе2р3е4м 547 | .гипе2р3е4р 548 | .гипе2р3е4с 549 | .гипе2р3и4з 550 | .гипе2р3и4м 551 | .гипе2р3и4н 552 | .гипе2р3о4в 553 | .гипе2р3о4к 554 | .гипе2р3о4с 555 | .гипер3б4р 556 | .гипер3г4л 557 | .гипер3г4р 558 | .гипер3к4в 559 | .гипер3к4р 560 | .гипер3м4н 561 | .гипер3п4л 562 | .гипер3п4н 563 | .гипер3п4р 564 | .гипер3с4п 565 | .гипер3с4р 566 | .гипер3с4с 567 | .гипер3с4т 568 | .гипер3т4р 569 | .гипер3у4р 570 | .гипер3ф4р 571 | .гипер3х4л 572 | .гипер3х4р 573 | .гипер3э4к 574 | .гипер3э4л 575 | .гипер3э4н 576 | .гипер3э4о 577 | .гипер3э4с 578 | .голо3б4л 579 | .голо3э4д 580 | .гомо3а4з 581 | .гомо3а4к 582 | .гомо3а4т 583 | .гомо3к4л 584 | .гомо3п4л 585 | .гомо3с4п 586 | .гомо3т4р 587 | .гомо3ф4т 588 | .гомо3э4н 589 | .гомо3э4п 590 | .гь4 591 | .ди1а3г4н 592 | .ди4ст5ри 593 | .ди4ст5ро 594 | .диа3д4р 595 | .диа3к4л 596 | .диа3к4р 597 | .диа3с4к 598 | .диа3с4п 599 | .диа3с4т 600 | .диа3т4р 601 | .диа3ф4р 602 | .диазо3т4р 603 | .диазо3э4т 604 | .диазо3э4ф 605 | .дина3т4р 606 | .дь4 607 | .евро3а4з 608 | .евро3а4т 609 | .евро3и4е 610 | .евро3к4р 611 | .евро3о4б 612 | .евро3с4п 613 | .евро3с4т 614 | .изо3а4в 615 | .изо3а4г 616 | .изо3а4д 617 | .изо3а4з 618 | .изо3а4к 619 | .изо3а4л 620 | .изо3а4м 621 | .изо3а4н 622 | .изо3б4р 623 | .изо3в4р 624 | .изо3г4л 625 | .изо3г4р 626 | .изо3д4р 627 | .изо3и4о 628 | .изо3й4о 629 | .изо3к4л 630 | .изо3к4р 631 | .изо3л4г 632 | .изо3л4ж 633 | .изо3о4к 634 | .изо3п4л 635 | .изо3п4р 636 | .изо3с4т 637 | .изо3т4к 638 | .изо3т4р 639 | .изо3х4р 640 | .изо3ш4л 641 | .изо3э4в 642 | .изо3э4д 643 | .изо3э4й 644 | .изо3э4л 645 | .изо3э4н 646 | .ин3а4кт 647 | .ин3а4п 648 | .ин3а4у 649 | .ин3б4р 650 | .ин3г4р 651 | .ин3к4л 652 | .ин3к4р 653 | .ин3с4тр 654 | .инте2р3а4к 655 | .интер3г4р 656 | .интер3к4в 657 | .интер3к4р 658 | .интер3п4р 659 | .интер3ф4л 660 | .кило3а4м 661 | .кило3г4р 662 | .кило3э4л 663 | .кино3а4к 664 | .кино3а4н 665 | .кино3а4п 666 | .кино3а4ф 667 | .кино3б4л 668 | .кино3д4р 669 | .кино3и4с 670 | .кино3к4л 671 | .кино3к4р 672 | .кино3о4п 673 | .кино3п4л 674 | .кино3п4р 675 | .кино3с4к 676 | .кино3с4ъ 677 | .кино3ф4л 678 | .кино3ф4р 679 | .кино3х4р 680 | .кино3э4к 681 | .ко3а4г 682 | .ко3а4д 683 | .ко3а4к 684 | .ко3и4н 685 | .ко3о4п 686 | .ко3о4р 687 | .ко3п4л 688 | .ко3э4ф 689 | .кь4 690 | .ль4 691 | .макро3а4н 692 | .макро3а4с 693 | .макро3б4л 694 | .макро3б4р 695 | .макро3г4л 696 | .макро3г4н 697 | .макро3г4р 698 | .макро3и4н 699 | .макро3и4с 700 | .макро3к4л 701 | .макро3к4р 702 | .макро3о4в 703 | .макро3о4п 704 | .макро3о4р 705 | .макро3п4л 706 | .макро3п4р 707 | .макро3с4к 708 | .макро3с4п 709 | .макро3с4т 710 | .макро3с4х 711 | .макро3т4р 712 | .макро3ф4л 713 | .макро3ф4т 714 | .макро3э4в 715 | .макро3э4к 716 | .макро3э4л 717 | .макро3э4н 718 | .макро3э4р 719 | .макро3э4с 720 | .мега3о4м 721 | .мега3п4р 722 | .мега3с4к 723 | .мега3с4п 724 | .мега3э4л 725 | .микро3а4в 726 | .микро3а4г 727 | .микро3а4д 728 | .микро3а4м 729 | .микро3а4н 730 | .микро3а4р 731 | .микро3а4с 732 | .микро3а4у 733 | .микро3а4э 734 | .микро3б4л 735 | .микро3б4р 736 | .микро3г4р 737 | .микро3д4в 738 | .микро3и4з 739 | .микро3и4н 740 | .микро3и4с 741 | .микро3й4о 742 | .микро3к4л 743 | .микро3к4н 744 | .микро3к4р 745 | .микро3о4б 746 | .микро3о4п 747 | .микро3о4р 748 | .микро3о4с 749 | .микро3п4л 750 | .микро3п4р 751 | .микро3с4к 752 | .микро3с4п 753 | .микро3с4т 754 | .микро3с4ф 755 | .микро3с4х 756 | .микро3т4р 757 | .микро3ф4л 758 | .микро3х4р 759 | .микро3э4в 760 | .микро3э4л 761 | .микро3э4м 762 | .микро3э4н 763 | .микро3э4р 764 | .милли3а4м 765 | .милли3г4р 766 | .милли3о4м 767 | .милли3э4к 768 | .моно3а4в 769 | .моно3а4з 770 | .моно3а4л 771 | .моно3а4м 772 | .моно3а4н 773 | .моно3а4р 774 | .моно3а4т 775 | .моно3а4ц 776 | .моно3б4л 777 | .моно3б4р 778 | .моно3г4л 779 | .моно3г4р 780 | .моно3и4з 781 | .моно3и4м 782 | .моно3и4н 783 | .моно3к4л 784 | .моно3к4р 785 | .моно3о4к 786 | .моно3о4л 787 | .моно3п4л 788 | .моно3п4р 789 | .моно3п4с 790 | .моно3с4п 791 | .моно3с4т 792 | .моно3т4р 793 | .моно3ф4т 794 | .моно3х4л 795 | .моно3х4р 796 | .моно3э4д 797 | .моно3э4н 798 | .моно3э4п 799 | .моно3э4т 800 | .моно3э4ф 801 | .мото3д4р 802 | .мото3к4р 803 | .мото3п4л 804 | .мото3п4р 805 | .мото3с4п 806 | .мото3ш4л 807 | .мь4 808 | .на3у 809 | .нано3а4д 810 | .нано3п4р 811 | .нео3а4д 812 | .нео3а4н 813 | .нео3а4р 814 | .нео3б4л 815 | .нео3г4л 816 | .нео3г4н 817 | .нео3г4р 818 | .нео3и4з 819 | .нео3и4м 820 | .нео3и4н 821 | .нео3к4л 822 | .нео3к4р 823 | .нео3п4л 824 | .нео3п4р 825 | .нео3х4р 826 | .нео3э4з 827 | .нео3э4н 828 | .нео3э4п 829 | .нео3э4с 830 | .нь4 831 | .орто3а4л 832 | .орто3а4м 833 | .орто3а4н 834 | .орто3а4р 835 | .орто3д4р 836 | .орто3и4з 837 | .орто3к4р 838 | .орто3п4л 839 | .орто3п4р 840 | .орто3п4с 841 | .орто3с4в 842 | .орто3с4к 843 | .орто3с4т 844 | .орто3т4р 845 | .орто3х4л 846 | .орто3х4р 847 | .орто3э4т 848 | .орто3э4ф 849 | .пара3а4к 850 | .пара3а4л 851 | .пара3а4м 852 | .пара3а4н 853 | .пара3а4п 854 | .пара3а4ц 855 | .пара3б4л 856 | .пара3г4н 857 | .пара3г4р 858 | .пара3к4л 859 | .пара3к4р 860 | .пара3о4к 861 | .пара3п4л 862 | .пара3п4с 863 | .пара3с4п 864 | .пара3с4ф 865 | .пара3с4ц 866 | .пара3т4р 867 | .пара3х4л 868 | .пара3х4р 869 | .пара3э4л 870 | .пара3э4т 871 | .паро3п4р 872 | .поли3а4в 873 | .поли3а4д 874 | .поли3а4з 875 | .поли3а4к 876 | .поли3а4л 877 | .поли3а4м 878 | .поли3а4н 879 | .поли3а4р 880 | .поли3а4ц 881 | .поли3б4р 882 | .поли3г4л 883 | .поли3г4р 884 | .поли3и4з 885 | .поли3и4м 886 | .поли3к4л 887 | .поли3к4р 888 | .поли3о4к 889 | .поли3о4л 890 | .поли3п4л 891 | .поли3п4н 892 | .поли3п4р 893 | .поли3с4п 894 | .поли3с4т 895 | .поли3у4р 896 | .поли3х4л 897 | .поли3х4р 898 | .поли3э4д 899 | .поли3э4к 900 | .поли3э4л 901 | .поли3э4н 902 | .поли3э4т 903 | .поли3э4ф 904 | .пре3э4к 905 | .пре3ю4д 906 | .про3а4г 907 | .про3а4к 908 | .про3а4м 909 | .про3а4н 910 | .про3а4у 911 | .про3г4р 912 | .про3и4г 913 | .про3и4з 914 | .про3и4л 915 | .про3и4н 916 | .про3к4л 917 | .про3с4п 918 | .про3х4р 919 | .про3э4к 920 | .про3э4м 921 | .про3э4н 922 | .про3э4р 923 | .про3э4с 924 | .прото3х4л 925 | .прото3х4р 926 | .прото3э4р 927 | .проф3г4р 928 | .пъ4 929 | .пь4 930 | .ре3а4б 931 | .ре3а4г 932 | .ре3а4д 933 | .ре3а4к 934 | .ре3а4с 935 | .ре3а4ф 936 | .ре3а4э 937 | .ре3г4р 938 | .ре3и4м 939 | .ре3и4н 940 | .ре3и4ф 941 | .ре3к4р 942 | .ре3п4р 943 | .ре3т4ра 944 | .ретро3а4к 945 | .ретро3а4у 946 | .ретро3г4р 947 | .ретро3о4т 948 | .ретро3ф4л 949 | .санти3г4р 950 | .стерео3а4д 951 | .стерео3а4к 952 | .стерео3б4л 953 | .стерео3г4р 954 | .стерео3и4з 955 | .стерео3с4к 956 | .стерео3с4п 957 | .стерео3т4р 958 | .стерео3э4л 959 | .стерео3э4н 960 | .стерео3э4ф 961 | .супер3а4г 962 | .супер3а4д 963 | .супер3а4к 964 | .супер3а4н 965 | .супер3а4р 966 | .супер3а4э 967 | .супер3г4р 968 | .супер3е4с 969 | .супер3и4з 970 | .супер3и4к 971 | .супер3и4м 972 | .супер3и4н 973 | .супер3к4л 974 | .супер3п4р 975 | .супер3с4к 976 | .супер3с4п 977 | .супер3с4т 978 | .супер3х4р 979 | .супер3э4в 980 | .супер3э4к 981 | .супер3э4ф 982 | .съ4 983 | .сь4 984 | .ть4 985 | .фь4 986 | .хризо3и4д 987 | .хризо3п4р 988 | .хризо3с4т 989 | .хь4 990 | .элек3тро 991 | .элек3тро3а4в 992 | .элек3тро3а4г 993 | .элек3тро3а4к 994 | .элек3тро3а4н 995 | .элек3тро3а4э 996 | .элек3тро3б4л 997 | .элек3тро3и4з 998 | .элек3тро3и4с 999 | .элек3тро3о4б 1000 | .элек3тро3о4в 1001 | .элек3тро3о4г 1002 | .элек3тро3о4д 1003 | .элек3тро3о4к 1004 | .элек3тро3о4п 1005 | .элек3тро3о4с 1006 | .элек3тро3о4т 1007 | .элек3тро3о4ф 1008 | .элек3тро3о4ч 1009 | .элек3тро3с4т 1010 | .элек3тро3т4р 1011 | .элек3тро3э4к 1012 | .элек3тро3э4н 1013 | .элек3тро3э4р 1014 | 3авто 1015 | 3актив 1016 | 3аппа 1017 | 3г4рад 1018 | 3г4рам 1019 | 3г4раф 1020 | 3им4пул 1021 | 3ин3ст4ру 1022 | 3ин3те4р 1023 | 3к4ва 1024 | 3к4лас 1025 | 3к4ри 1026 | 3оп3тик 1027 | 3п3роек 1028 | 3п4ро 1029 | 3с4коп 1030 | 3с4фе 1031 | 3с4хе 1032 | 3ск4ла 1033 | 3ск4ле 1034 | 3ск4ло 1035 | 3ск4ля 1036 | 3ск4ра 1037 | 3ск4ре 1038 | 3ск4ри 1039 | 3ск4ро 1040 | 3ск4ру 1041 | 3ск4ры 1042 | 3сп4ла 1043 | 3ст4ра 1044 | 3ст4ре 1045 | 3ст4ри 1046 | 3ст4ро 1047 | 3ст4рук 1048 | 3ф4рагм 1049 | 3х4лор 1050 | 3х4ром 1051 | 3ш2таб 1052 | 3ш2тат 1053 | 3э4к5ви 1054 | 3э4ко 1055 | 3э4лек4т 1056 | 3э4леме 1057 | 3э4нерг 1058 | 3э4нтро 1059 | 3эффе 1060 | } 1061 | -------------------------------------------------------------------------------- /patterns/hyph-pt.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for Portuguese 2 | % copyright: Copyright (C) 1987, 1994, 1996, 2015 Pedro J. de Rezende, 1996, 2015 J. Joao Dias Almeida, 2024 Leonardo Araujo and Aline Benevides 3 | % notice: This file is part of the hyph-utf8 package. 4 | % See http://www.hyphenation.org/tex for more information. 5 | % language: 6 | % name: Portuguese 7 | % tag: pt 8 | % version: 1.4 2024-07-13 9 | % authors: 10 | % - 11 | % name: Pedro J. de Rezende 12 | % contact: rezende (at) ic.unicamp.br 13 | % - 14 | % name: J. Joao Dias Almeida 15 | % contact: jj (at) di.uminho.pt 16 | % - 17 | % name: Leonardo Araujo 18 | % contact: leolca (at) gmail.com 19 | % - 20 | % name: Aline Benevides 21 | % contact: benevides.aline12 (at) gmail.com 22 | % licence: 23 | % name: BSD 3-clause licence 24 | % url: https://opensource.org/licenses/BSD-3-Clause 25 | % text: > 26 | % Redistribution and use in source and binary forms, with or without 27 | % modification, are permitted provided that the following conditions 28 | % are met: 29 | % * Redistributions of source code must retain the above copyright 30 | % notice, this list of conditions and the following disclaimer. 31 | % * Redistributions in binary form must reproduce the above copyright 32 | % notice, this list of conditions and the following disclaimer in the 33 | % documentation and/or other materials provided with the 34 | % distribution. 35 | % * Neither the name of the University of Campinas, of the University 36 | % of Minho nor the names of its contributors may be used to endorse 37 | % or promote products derived from this software without specific 38 | % prior written permission. 39 | % 40 | % THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 41 | % "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 42 | % LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 43 | % A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PEDRO J. DE 44 | % REZENDE OR J.JOAO DIAS ALMEIDA BE LIABLE FOR ANY DIRECT, INDIRECT, 45 | % INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 46 | % BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 47 | % OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 48 | % AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 | % LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY 50 | % WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 51 | % POSSIBILITY OF SUCH DAMAGE. 52 | % hyphenmins: 53 | % typesetting: 54 | % left: 2 55 | % right: 3 56 | % changes: 57 | % - Version 1.4 Release date: 13/07/2024 Leonardo Araujo and Aline Benevides 58 | % - Version 1.3 Release date: 12/08/2015 Pedro J. de Rezende and J. Joao Dias Almeida 59 | % - Version 1.2 Release date: 07/21/1996 Pedro J. de Rezende and J. Joao Dias Almeida 60 | % - Version 1.1 Release date: 04/12/1994 Pedro J. de Rezende 61 | % - Version 1.0 Release date: 02/13/1987 Pedro J. de Rezende 62 | % texlive: 63 | % synonyms: 64 | % - portuges 65 | % encoding: ec 66 | % babelname: portuguese 67 | % legacy_patterns: pthyph.tex 68 | % message: Portuguese hyphenation patterns 69 | % description: Hyphenation patterns for Portuguese in T1/EC and UTF-8 encodings. 70 | % 71 | \patterns{ 72 | 1b2l 73 | 1b2r 74 | 1ba 75 | 1be 76 | 1bi 77 | 1bo 78 | 1bu 79 | 1bá 80 | 1bâ 81 | 1bã 82 | 1bé 83 | 1bí 84 | 1bó 85 | 1bú 86 | 1bê 87 | 1bõ 88 | 1c2h 89 | 1c2l 90 | 1c2r 91 | 1ca 92 | 1ce 93 | 1ci 94 | 1co 95 | 1cu 96 | 1cá 97 | 1câ 98 | 1cã 99 | 1cé 100 | 1cí 101 | 1có 102 | 1cú 103 | 1cê 104 | 1cõ 105 | 1ça 106 | 1çe 107 | 1çi 108 | 1ço 109 | 1çu 110 | 1çá 111 | 1çâ 112 | 1çã 113 | 1çé 114 | 1çí 115 | 1çó 116 | 1çú 117 | 1çê 118 | 1çõ 119 | 1d2l 120 | 1d2r 121 | 1da 122 | 1de 123 | 1di 124 | 1do 125 | 1du 126 | 1dá 127 | 1dâ 128 | 1dã 129 | 1dé 130 | 1dí 131 | 1dó 132 | 1dú 133 | 1dê 134 | 1dõ 135 | 1f2l 136 | 1f2r 137 | 1fa 138 | 1fe 139 | 1fi 140 | 1fo 141 | 1fu 142 | 1fá 143 | 1fâ 144 | 1fã 145 | 1fé 146 | 1fí 147 | 1fó 148 | 1fú 149 | 1fê 150 | 1fõ 151 | 1g2l 152 | 1g2r 153 | 1ga 154 | 1ge 155 | 1gi 156 | 1go 157 | 1gu 158 | 1gu4a 159 | 1gu4e 160 | 1gu4i 161 | 1gu4o 162 | 1gá 163 | 1gâ 164 | 1gã 165 | 1gé 166 | 1gí 167 | 1gó 168 | 1gú 169 | 1gê 170 | 1gõ 171 | 1ja 172 | 1je 173 | 1ji 174 | 1jo 175 | 1ju 176 | 1já 177 | 1jâ 178 | 1jã 179 | 1jé 180 | 1jí 181 | 1jó 182 | 1jú 183 | 1jê 184 | 1jõ 185 | 1k2l 186 | 1k2r 187 | 1ka 188 | 1ke 189 | 1ki 190 | 1ko 191 | 1ku 192 | 1ká 193 | 1kâ 194 | 1kã 195 | 1ké 196 | 1kí 197 | 1kó 198 | 1kú 199 | 1kê 200 | 1kõ 201 | 1l2h 202 | 1la 203 | 1le 204 | 1li 205 | 1lo 206 | 1lu 207 | 1lá 208 | 1lâ 209 | 1lã 210 | 1lé 211 | 1lí 212 | 1ló 213 | 1lú 214 | 1lê 215 | 1lõ 216 | 1ma 217 | 1me 218 | 1mi 219 | 1mo 220 | 1mu 221 | 1má 222 | 1mâ 223 | 1mã 224 | 1mé 225 | 1mí 226 | 1mó 227 | 1mú 228 | 1mê 229 | 1mõ 230 | 1n2h 231 | 1na 232 | 1ne 233 | 1ni 234 | 1no 235 | 1nu 236 | 1ná 237 | 1nâ 238 | 1nã 239 | 1né 240 | 1ní 241 | 1nó 242 | 1nú 243 | 1nê 244 | 1nõ 245 | 1p2l 246 | 1p2r 247 | 1pa 248 | 1pe 249 | 1pi 250 | 1po 251 | 1pu 252 | 1pá 253 | 1pâ 254 | 1pã 255 | 1pé 256 | 1pí 257 | 1pó 258 | 1pú 259 | 1pê 260 | 1põ 261 | 1qu4a 262 | 1qu4e 263 | 1qu4i 264 | 1qu4o 265 | 1ra 266 | 1re 267 | 1ri 268 | 1ro 269 | 1ru 270 | 1rá 271 | 1râ 272 | 1rã 273 | 1ré 274 | 1rí 275 | 1ró 276 | 1rú 277 | 1rê 278 | 1rõ 279 | 1sa 280 | 1se 281 | 1si 282 | 1so 283 | 1su 284 | 1sá 285 | 1sâ 286 | 1sã 287 | 1sé 288 | 1sí 289 | 1só 290 | 1sú 291 | 1sê 292 | 1sõ 293 | 1t2l 294 | 1t2r 295 | 1ta 296 | 1te 297 | 1ti 298 | 1to 299 | 1tu 300 | 1tá 301 | 1tâ 302 | 1tã 303 | 1té 304 | 1tí 305 | 1tó 306 | 1tú 307 | 1tê 308 | 1tõ 309 | 1v2l 310 | 1v2r 311 | 1va 312 | 1ve 313 | 1vi 314 | 1vo 315 | 1vu 316 | 1vá 317 | 1vâ 318 | 1vã 319 | 1vé 320 | 1ví 321 | 1vó 322 | 1vú 323 | 1vê 324 | 1võ 325 | 1w2l 326 | 1w2r 327 | 1xa 328 | 1xe 329 | 1xi 330 | 1xo 331 | 1xu 332 | 1xá 333 | 1xâ 334 | 1xã 335 | 1xé 336 | 1xí 337 | 1xó 338 | 1xú 339 | 1xê 340 | 1xõ 341 | 1za 342 | 1ze 343 | 1zi 344 | 1zo 345 | 1zu 346 | 1zá 347 | 1zâ 348 | 1zã 349 | 1zé 350 | 1zí 351 | 1zó 352 | 1zú 353 | 1zê 354 | 1zõ 355 | a3a 356 | a3e 357 | a3o 358 | c3c 359 | e3a 360 | e3e 361 | e3o 362 | i3a 363 | i3e 364 | i3i 365 | i3o 366 | i3â 367 | i3ê 368 | i3ô 369 | o3a 370 | o3e 371 | o3o 372 | r3r 373 | s3s 374 | u3a 375 | u3e 376 | u3o 377 | u3u 378 | .p2si 379 | .p2sí 380 | .g2no 381 | .g2nó 382 | .g2nô 383 | t2c 384 | 1p2neu 385 | .t2m 386 | .p2t 387 | su2b3r 388 | su2b3l 389 | .su3b4li 390 | a1ir. 391 | u1ir. 392 | 1qu 393 | 1vô 394 | 1lô 395 | 1cô 396 | 1gô 397 | 1bô 398 | 1tô 399 | 1rô 400 | 1pô 401 | a1é 402 | a1í 403 | a1ó 404 | a1ú 405 | e1á 406 | e1â 407 | e1ã 408 | e1é 409 | e1ê 410 | e1í 411 | e1ó 412 | é1o 413 | e1ú 414 | i1á 415 | i1ã 416 | í1a 417 | i1é 418 | i1í 419 | i1ó 420 | í1o 421 | i1u 422 | i1ú 423 | o1á 424 | o1é 425 | o1í 426 | o1ó 427 | u1á 428 | u1ã 429 | u1â 430 | u1í 431 | ú1o 432 | 1qu2á 433 | 1qu2â 434 | 1qu2í 435 | 1gu2í 436 | a1ind 437 | a1i1nh 438 | e1imp 439 | e1inc 440 | e1inf 441 | e1ing 442 | e1ins 443 | e1int 444 | e1inv 445 | u1iz. 446 | a1iz. 447 | 4a. 448 | 4e. 449 | 4o. 450 | 1gu2á 451 | 1gu2ã 452 | 1qu2ã 453 | .m2n 454 | c2za 455 | .s2 456 | 1p2seu1d 457 | 1dô 458 | 1fô 459 | 1mô 460 | 1nô 461 | 1sô 462 | 1zô 463 | tu1i 464 | tu2it 465 | tu2id 466 | bu1i 467 | nu1i 468 | o1in 469 | u1in 470 | su1i 471 | í1e 472 | ju1i 473 | fu1i 474 | du1i 475 | do1im 476 | au1i 477 | u1i1ç 478 | u1ê 479 | 1gu2ê 480 | 1qu2ê 481 | 1çô 482 | u1é 483 | 1gu2é 484 | 1qu2é 485 | 1xô 486 | a1â 487 | a1ã 488 | a1ô 489 | e1ô 490 | .ne4o 491 | o1ã 492 | o1ê 493 | o1im 494 | o2i1na 495 | pro1i1b 496 | co2ima 497 | .t2 498 | 1- 499 | } 500 | \hyphenation{% Do NOT make any alterations to this list! --- PdR 501 | hard-ware 502 | soft-ware 503 | } 504 | -------------------------------------------------------------------------------- /patterns/hyph-sl.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for Slovenian 2 | % copyright: Copyright (C) 1990 Matjaž Vrečko 3 | % notice: This file is part of the hyph-utf8 package. 4 | % See http://www.hyphenation.org/tex for more information. 5 | % language: 6 | % name: Slovenian 7 | % tag: sl 8 | % version: 2.3 9 | % authors: 10 | % - 11 | % name: Matjaž Vrečko 12 | % affiliation: TeXCeX 13 | % contact: matjaz (at) mg-soft.si 14 | % licence: 15 | % - This file is available under any of these licences: 16 | % - 17 | % name: LPPL 18 | % version: 1 19 | % or_later: true 20 | % url: http://www.latex-project.org/lppl/lppl-1-0.html 21 | % - 22 | % name: MIT 23 | % url: https://opensource.org/licences/MIT 24 | % text: > 25 | % Permission is hereby granted, free of charge, to any person 26 | % obtaining a copy of this software and associated documentation 27 | % files (the "Software"), to deal in the Software without 28 | % restriction, including without limitation the rights to use, 29 | % copy, modify, merge, publish, distribute, sublicense, and/or sell 30 | % copies of the Software, and to permit persons to whom the 31 | % Software is furnished to do so, subject to the following 32 | % conditions: 33 | % 34 | % The above copyright notice and this permission notice shall be 35 | % included in all copies or substantial portions of the Software. 36 | % 37 | % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 38 | % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 39 | % OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 40 | % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 41 | % HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 42 | % WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 43 | % FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 44 | % OTHER DEALINGS IN THE SOFTWARE. 45 | % hyphenmins: 46 | % typesetting: 47 | % left: 2 48 | % right: 2 49 | % changes: 50 | % - 1990 First version of `hyphen.si' (Matjaž Vrečko, TeXCeX) 51 | % 52 | % - > 53 | % Some cosmetic changes done later on, but none of these apply any more; 54 | % the patterns are still the same as they were originally: 55 | % - 1994-05-17 Use of code page 852 in patterns (Leon Žlajpah) 56 | % - 1995-04-06 Release of `sihyph21.tex' 57 | % - 1995-06-20 > 58 | % Added \slovenehyphenmins 59 | % Release of `sihyph22.tex' 60 | % - 1997-15-04 > 61 | % Some changes concerning "c, "s, "z and ... 62 | % Release of `sihyph23.tex' 63 | % - 2007-01-20 > 64 | % `sihyph23.tex' renamed to `slhyph.tex' 65 | % (sl is the proper language code for Slovenian) 66 | % texlive: 67 | % synonyms: 68 | % - slovene 69 | % encoding: ec 70 | % babelname: slovenian 71 | % legacy_patterns: sihyph.tex 72 | % message: Slovenian hyphenation patterns 73 | % description: Hyphenation patterns for Slovenian in T1/EC and UTF-8 encodings. 74 | % 75 | \patterns{ 76 | .av5r 77 | .di6spo 78 | .ek3s 79 | .ek5v 80 | .is1 81 | .iz1 82 | .obi4d 83 | .ob5it 84 | .od1 85 | .po4d5n 86 | .po4v5s 87 | .pre6d7n 88 | .se4k5s 89 | .si4s 90 | .st4 91 | .voz5l 92 | .voz5n 93 | .zliz6 94 | a1a 95 | a1b 96 | ab5ba 97 | ab6rod 98 | a1c 99 | ac5ci 100 | a1č 101 | a1d 102 | ad2l 103 | a6dobl 104 | ad6rl. 105 | ad6rla 106 | ad6rob 107 | ad5ur 108 | a1e1 109 | a1f 110 | af5ga 111 | af1t 112 | a1g 113 | a1h 114 | a4hm 115 | ah5mi 116 | ah5mo 117 | a1i 118 | ai2n1 119 | a1j 120 | a4j5ek 121 | a4jf 122 | aj5fi 123 | aj5fo 124 | aj5ha 125 | aj5he 126 | aj5im 127 | aj6imo 128 | aj3os 129 | aj6stb 130 | a5ju. 131 | aj3uč 132 | aj3ug 133 | aj5žn 134 | a1k 135 | ak4s 136 | a4kst 137 | a1l 138 | a1m 139 | a4mz 140 | a1n 141 | an6dga 142 | an6dhi 143 | a4nm 144 | an5mi 145 | an5zi 146 | a1o 147 | ao2b1 148 | a1p 149 | a4ph 150 | a1ra 151 | ar6dwa 152 | a1re 153 | a1ri 154 | a1ro 155 | a1ru 156 | ar5xa 157 | ar5xo 158 | ar5xu 159 | a1s 160 | a4sš 161 | as5šč 162 | a1š 163 | a1t 164 | a4tf 165 | at4i 166 | a1u1 167 | a4uf 168 | a2uk 169 | a4ul 170 | a1v 171 | av5ši 172 | a4vž 173 | av5ža 174 | ay5to 175 | a1ze 176 | az5fo 177 | a4zig 178 | az3la 179 | az3le 180 | az4lil 181 | az4lit 182 | az4liv 183 | a4zob 184 | a4z3oč 185 | az5ora 186 | az5oro 187 | a4zra 188 | az4red 189 | az5vp 190 | a1ž 191 | až5mi 192 | ba6bba 193 | ban3č4 194 | ba4u 195 | 2b1c 196 | 2b1č 197 | 2b1d 198 | be1 199 | be4v 200 | b1h 201 | bi1 202 | b1ja 203 | b4ja. 204 | b5jel 205 | b3jem 206 | b5jet 207 | 2b1k 208 | b3lep 209 | b5leta 210 | b5lil 211 | b5lit 212 | b5liv 213 | b1m 214 | 4bmi 215 | 2b1n 216 | bo1 217 | bo6chm 218 | b5ord 219 | bo5vp 220 | b3rab 221 | b5ras 222 | b3raš 223 | b3rez 224 | bre4zg 225 | bre4zi 226 | bre4zr 227 | b5reže 228 | b3rob 229 | br6žda 230 | 2b1s 231 | 2b1š 232 | 2b1t 233 | bu5ki 234 | bu5ku 235 | bu5kv 236 | bu5ry 237 | 2b1v 238 | b1z 239 | b1ž 240 | 2cc 241 | 2ch. 242 | ch5ma 243 | 2ck 244 | c1ka 245 | ck1o2 246 | c5ko. 247 | ckov3 248 | ck1s 249 | ck5we 250 | 2c1n 251 | 2c1t 252 | 2č1b 253 | 2č1g 254 | či1 255 | 1čj 256 | 2č1k 257 | 1čl 258 | 4č3let 259 | č5mes 260 | 2č1n 261 | 4čop 262 | 2č1p 263 | 2č1s 264 | 4čup 265 | 2d1b 266 | 2d1c 267 | 2d1č 268 | 2d1d 269 | dd6voj 270 | d2e 271 | 6d5elem 272 | de4min 273 | de4mn 274 | de4z3i 275 | 2d1g 276 | 2d1h 277 | di5ck 278 | 4dind 279 | d4i5no 280 | dis1 281 | di4skr 282 | di6spr 283 | 2d1j 284 | 2d1k 285 | 5dlet 286 | d2li 287 | d5lit 288 | d5liv 289 | d1lo 290 | 2d3m 291 | 4d3nac 292 | 4d5nač 293 | 4d5nap 294 | 4d3nar 295 | 4dnas 296 | 4d5neb 297 | d5niv 298 | 4d5niz 299 | 4d5njač 300 | 4d3nož 301 | d2o 302 | 4dobč 303 | 4d5obd 304 | 2d3o2f 305 | do5rd 306 | do5vč 307 | do5v4z 308 | 2d1p 309 | d5raz 310 | d3rep 311 | dre6pn 312 | d4rev 313 | 2d1s 314 | 2d1š 315 | 2d1t 316 | dteks6 317 | d4ur 318 | du5ro 319 | du5um 320 | 2d1v 321 | 4d3vi 322 | 2d1z2 323 | e1a 324 | e1b 325 | eb4j 326 | eb6liz 327 | e1c 328 | e1č 329 | e4čd 330 | eč5de 331 | eč5di 332 | eč5do 333 | eč3le 334 | eč5op 335 | e4čt 336 | eč5ti 337 | eč5to 338 | eč5tr 339 | eč5up 340 | e2č1v 341 | eč6vrs 342 | e1d 343 | e4df 344 | ed5ig 345 | ed2l 346 | ed5ob 347 | ed6obe 348 | ed6obr 349 | e4dobs 350 | e4d3oč 351 | ed5vč 352 | ed5zb 353 | e1e 354 | e4ep 355 | e1f 356 | e4ff 357 | ef5fe 358 | ef5ta 359 | e1g 360 | e1h 361 | e1i 362 | ei6pzi 363 | ei2z 364 | eiz5e 365 | e1j 366 | e1k 367 | ek6mal 368 | ek6tre 369 | e1l 370 | e1m 371 | e1n 372 | e1o1 373 | eob4j 374 | eob4r 375 | eo4dl 376 | eo4z5n 377 | e1p 378 | ep5nik 379 | e1ra 380 | era6z5l 381 | era5z4r 382 | era5z4v 383 | e1re 384 | e4rf 385 | e1ri 386 | e1ro 387 | e4rr 388 | e1ru 389 | e1s 390 | es5da 391 | e5sta 392 | e5sti. 393 | e5stih 394 | e5stil 395 | e1š 396 | e4šp 397 | eš5po 398 | e1t 399 | 4eth 400 | e4tinš 401 | e1u1 402 | e1v 403 | eve6t5l 404 | ev5ha 405 | ev6pre 406 | ev6ste 407 | ev5stv 408 | 2ew 409 | ew6ind 410 | ew5le 411 | e4wt 412 | ew5to 413 | e4yw 414 | e1z 415 | ez5dj 416 | e3z4dr 417 | ez2g 418 | ez5gl 419 | e5zij 420 | ez6ijo 421 | ez5imn 422 | e5zis 423 | ez6ist 424 | ez5iz 425 | ez4l 426 | ez6lom 427 | ez6man 428 | ez4mo 429 | e4zob 430 | e4z5or 431 | ez4re 432 | e4zt 433 | e4z5u4m5 434 | e4zž 435 | e1ž 436 | 1fa 437 | fe1 438 | fe6ljt 439 | ff5ma 440 | fi6zlj 441 | 2f1n 442 | fo6uri 443 | fre4u 444 | 2f1s 445 | 2ft 446 | ft5ve 447 | fu1 448 | 2g1d 449 | ge6ige 450 | gel5č4 451 | ge6njč 452 | gi6tpr 453 | go1 454 | go5vz 455 | 2g1t 456 | gu1 457 | ha4u 458 | 2h1č 459 | he4i 460 | 2h1k 461 | 4hl. 462 | h4lo 463 | 2h1n 464 | h5ren 465 | 2h1š 466 | 2h1t 467 | 1hu 468 | hu6ffm 469 | i1a 470 | i1b 471 | i1c 472 | i4cs 473 | i1ča 474 | i1če 475 | i1či 476 | ič5ra 477 | i1ču 478 | ič5vr 479 | i1d 480 | 4idor 481 | i1e1 482 | i1f 483 | i1g 484 | 4igh 485 | i1h 486 | i1i 487 | ii2n1 488 | i1j 489 | i1k 490 | i4kč 491 | ik5ča 492 | i1l 493 | il5č4k 494 | 4ile 495 | 4ilo 496 | i1m 497 | i4mh 498 | im5hi 499 | i1n 500 | 1ind 501 | 2ine 502 | 3i4n3os 503 | 1inp 504 | 3inse 505 | 1inš 506 | 4inšk 507 | 3intr 508 | i1o1 509 | i1p 510 | i1r 511 | 4ire 512 | i1s 513 | is4a 514 | is6ert 515 | isis4 516 | i4skv 517 | 2iss 518 | i1š 519 | i1t 520 | it5pr 521 | i1u 522 | i1v 523 | iv5jo 524 | i1x 525 | i1z 526 | iz1l 527 | iz4la 528 | izli4z 529 | iz5me 530 | iz5mo 531 | iz6ode 532 | iz5po 533 | i2zr 534 | iz1u 535 | iz6ure 536 | i1ž 537 | j5akt 538 | 2j1b 539 | 2j1c 540 | 2j1č 541 | 2j1d 542 | je4ks4 543 | 2j1g 544 | 2jh 545 | j1hi 546 | 4jime 547 | 4j5int 548 | 2j1k 549 | 2j1l 550 | 2j1m 551 | 2j1n 552 | 4job 553 | 2j1od 554 | jod4l 555 | 2jos 556 | 4jož 557 | 2j1p 558 | 2j1r 559 | jra1 560 | jraz4 561 | 2j1s 562 | jsis6t 563 | 2j1š 564 | 2j1t 565 | ju1 566 | 2juč 567 | ju5dm 568 | 2jus 569 | ju2ž1 570 | 2j1v 571 | 2j1z 572 | jz6ves 573 | 2k1c 574 | 2k1d 575 | ke5ti 576 | ki1 577 | 2k1m 578 | 1kn 579 | ko1 580 | kok4 581 | ko5kd 582 | ko6vše 583 | koz6lo 584 | 1kre 585 | 2ks. 586 | k5sat 587 | ks1c 588 | ks1p 589 | ks4po 590 | ks1t 591 | 4kst. 592 | ks6taz 593 | ks5te 594 | 2k1t 595 | 3ktr 596 | 4ktra 597 | ku5ro 598 | k5vip 599 | la4ir 600 | la6vz. 601 | 2l1b 602 | 2l1c 603 | 2l1č 604 | 2l1d 605 | le1 606 | le4e 607 | le6ipz 608 | le5me 609 | 2l1f 610 | 2l1g 611 | lg5ča 612 | 2l1h 613 | l2i1 614 | li6dž. 615 | 1liz 616 | 4l5izd 617 | 2lj. 618 | 4ljc 619 | 2ljč 620 | 2ljk 621 | 2ljn 622 | 2ljs 623 | 2ljš 624 | lju5d6j 625 | 2l1k 626 | 2l1l 627 | 2l1m 628 | 2l1n 629 | lo1 630 | 1loč 631 | 2l1p 632 | 2l1s 633 | 2l1š 634 | 2l1t 635 | lu5ki 636 | lu5ku 637 | 2l1v 638 | 2l1z 639 | 2l1ž 640 | 2m1b 641 | 2m1c 642 | 2m1č 643 | 2m1d 644 | me4d5n 645 | me6dos 646 | me4dr 647 | 2m1f 648 | 4mind 649 | 4minp 650 | 4minš 651 | mi6th. 652 | 2m1k 653 | 2m1m 654 | m5niv 655 | mo6št. 656 | mo6vš. 657 | 2m1p 658 | 2m1s 659 | 2m1š 660 | 2m1t 661 | m5urn 662 | 2m1v 663 | my5hi 664 | 2m1ž 665 | na1 666 | 5načel 667 | na4d5nj 668 | nad5r 669 | na6dra 670 | na4dre 671 | na6dur 672 | 1naj 673 | na6jak 674 | na4j5en 675 | naj3o 676 | na6joč 677 | na4j3u 678 | 1nas 679 | na4v3z 680 | navze6 681 | 1naz 682 | naz6or 683 | 2n1b 684 | 2n1c 685 | 2nč 686 | n1ča 687 | n1če 688 | n1či 689 | n1ču 690 | 2n3d2 691 | nd5ga 692 | nd5hi 693 | n4dm 694 | ne1 695 | ne3d2 696 | 1neh 697 | ne3zm 698 | nez4v 699 | 2n1f 700 | 2n1g 701 | n4gh 702 | ng5ha 703 | n4gv 704 | ng5vi 705 | 2n1h 706 | 2nj. 707 | 2njc 708 | nje4v5s 709 | 2njk 710 | 2njs 711 | 2njš 712 | 4njv 713 | 2n1k 714 | 2n1l 715 | 2n1n 716 | no5rd 717 | n4ost 718 | 2n1p 719 | 2n1s 720 | nsis4 721 | 2n1š 722 | 2n1t 723 | nteks4 724 | n4tg 725 | nt5ga 726 | nt5ge 727 | n4tv 728 | nt5vi 729 | nu1 730 | 2n1v 731 | ny5qu 732 | 2n1z 733 | nz4i 734 | 2n1ž 735 | o1a 736 | o4as 737 | o1b 738 | ob5gl 739 | ob5ide 740 | ob5jo 741 | 5obla 742 | 5obro 743 | o4bz 744 | o1c 745 | oc5ke 746 | oc5ki 747 | o4cr 748 | o1č 749 | o1d 750 | od5dv 751 | od5nal 752 | o6drep 753 | od5zd 754 | o2d1ž 755 | o1e 756 | oele4 757 | o1f 758 | o1g 759 | 4ogl 760 | o1h 761 | o1i 762 | oiz2 763 | o1j 764 | o1k 765 | o4kb 766 | ok5ba 767 | ok5be 768 | o4kt 769 | o1l 770 | o6l5avt 771 | ol6gča 772 | o4lr 773 | ol5re 774 | o1m 775 | o1n 776 | o1o 777 | ood4l 778 | o2ol 779 | o4om 780 | o1p 781 | o4pm 782 | op5me 783 | 4opy 784 | o1ra 785 | or4deč 786 | o1re 787 | o1ri 788 | o1ro 789 | o1ru 790 | o1s 791 | 5oseb 792 | ose4m5 793 | o1š 794 | o1t 795 | o1u 796 | ou5ki 797 | ou5ku 798 | o1v 799 | ov5sem 800 | ov5šk 801 | o2v1z 802 | o5vza 803 | ov3zd 804 | o1y 805 | o1z 806 | oz4b 807 | ozd5j 808 | oz4g 809 | oz5lo 810 | oz6lož 811 | oz2n 812 | oz5nic 813 | oz5niš 814 | oz2o 815 | oz2r 816 | oz2v 817 | o1ž 818 | ož5mi 819 | 2p1c 820 | 2p3č2 821 | pč5ka 822 | pe1 823 | 1peč 824 | pe4kt 825 | pet3l 826 | pe4tle 827 | pe4v5s 828 | pev5t4 829 | 4phs 830 | ph5so 831 | pi5zo 832 | 2p1k 833 | 4ploz 834 | po1 835 | po6dfa 836 | po4d3l 837 | po4dna 838 | po4d5oč 839 | po6lob 840 | po6std 841 | prez4 842 | 2p1s 843 | 2p1š 844 | 2p1t 845 | pz6ig. 846 | qu2 847 | 3raču 848 | 2rae 849 | ra6jžn 850 | rav5z 851 | ra6vza 852 | ra4z5id 853 | 3razl 854 | ra4z5or 855 | 2r1b 856 | 2r1c 857 | 2r1č 858 | 2r1d 859 | re1 860 | 3real 861 | re6cht 862 | re5čv 863 | 5redč 864 | re6dig 865 | re6dnju 866 | re6iba 867 | re5jo 868 | re5km 869 | re6sda 870 | rev6sk 871 | re6znač 872 | re6zus 873 | re6zve 874 | r1f 875 | 2r1g 876 | 2r1h 877 | ri1 878 | r4in 879 | ri5n4o 880 | riz4g 881 | riz4l 882 | riz4n 883 | 2r1j 884 | 2r1k 885 | 2r1l 886 | 2r1m 887 | 2r1n 888 | ro1 889 | rob6id 890 | 3rodi 891 | ro5zo 892 | 2r1p 893 | r1r 894 | 2r1s 895 | 2r1š 896 | 2r1t 897 | r4th 898 | rt5ha 899 | ru5kl 900 | 2r1v 901 | r3v2j 902 | rv5jo 903 | ry5an 904 | 2r1z 905 | rz2l 906 | r1ž 907 | rž5da 908 | 2s1b 909 | 1sc 910 | 4sc. 911 | s2ci 912 | se4k5sa 913 | sek5si 914 | se5ma 915 | se5vp 916 | 2s1f 917 | si1 918 | s4id 919 | si6gn. 920 | sis1 921 | 2s1j 922 | 2sk. 923 | s2kn 924 | 4skre 925 | s4lav 926 | s4on 927 | soni5 928 | sonič4 929 | 1sp 930 | s4plod 931 | spod4l 932 | 2s1s 933 | 2st. 934 | 3ste 935 | s4ten 936 | 4stf 937 | s4tič 938 | 5stim 939 | s4tir 940 | 2stk 941 | 2stm 942 | 1str 943 | s4tra. 944 | su1 945 | su4bo 946 | sve5t 947 | š2č 948 | 2šč. 949 | 2ščk 950 | 2ščn 951 | še2s 952 | 2š1j 953 | ta5wi 954 | taz4 955 | 2t1b 956 | 2t1c 957 | tch5o 958 | 2t1d 959 | tek6st 960 | 5tema 961 | te5xa 962 | t1f 963 | 4tind 964 | 4tinos 965 | 4tinp 966 | 4tinse 967 | 4t3int 968 | 2t1k 969 | 6tletno 970 | 2t1m 971 | 4tnaj 972 | to6vž. 973 | trt5u 974 | tr6tur 975 | 2t1s 976 | 2t1t 977 | tu1 978 | 4tz. 979 | 2u1a 980 | u1b 981 | ub4j 982 | u4bp 983 | ub5po 984 | u1c 985 | u1č 986 | u1d 987 | ud6mi. 988 | u1e 989 | u1f 990 | u1g 991 | u1h 992 | u1i 993 | u1j 994 | u1ka 995 | u1ke 996 | u1ko 997 | u1l 998 | u1m 999 | u1n 1000 | u1p 1001 | up6čka 1002 | u1ra 1003 | u1re 1004 | 4urg 1005 | u1ri 1006 | u1s 1007 | 1usp 1008 | u1š 1009 | uše3s 1010 | u1t 1011 | u4th 1012 | uth5o 1013 | u1v 1014 | ux5em 1015 | u1z 1016 | u1ž 1017 | 2v1b 1018 | 2v1c 1019 | 2vč 1020 | v1ča 1021 | v1če 1022 | v4čer 1023 | v1či 1024 | 2v1d 1025 | ve4čl 1026 | ve4čm 1027 | ve4i 1028 | ve4tin 1029 | vetle6t 1030 | v1f 1031 | v1g 1032 | vi5dv 1033 | vid6va 1034 | 1viv 1035 | vi6žg. 1036 | 2v1j 1037 | 4vjo 1038 | 2v1k 1039 | 2v1m 1040 | 2v1n 1041 | vo5rd 1042 | voz5le 1043 | 2v1p 1044 | 3v2pa 1045 | v4pij 1046 | v4pil 1047 | v5skn 1048 | v5šek 1049 | 4všk 1050 | 2v1t 1051 | vt4k 1052 | vz2 1053 | v2za 1054 | 3v2zg 1055 | 2v3zk 1056 | 2vzo 1057 | v3zp 1058 | v2zu 1059 | 1wa 1060 | wo2 1061 | x1f 1062 | 1ye 1063 | 2y1f 1064 | y1j 1065 | y1l 1066 | y1w 1067 | 1z2a 1068 | z6ane. 1069 | za5uk 1070 | za3vp 1071 | za1z2 1072 | za5zd 1073 | 2z1b 1074 | 3zbir 1075 | z1c 1076 | 2z1č 1077 | 2z1d2 1078 | zd5ju 1079 | z3dv 1080 | z1g 1081 | z4gni 1082 | z5got 1083 | 2z1h 1084 | 1zi 1085 | z1ig 1086 | 2z1is 1087 | 4z5išč 1088 | 2z1j 1089 | 2z1k 1090 | z3ku 1091 | z5las 1092 | z1li 1093 | 3zlil 1094 | 5zlit 1095 | 5zliv 1096 | zliz5 1097 | 1zlj 1098 | 3zlog 1099 | z5lom 1100 | 3zlož 1101 | z1lu 1102 | 2z1m 1103 | 1zn 1104 | 1zo 1105 | z1ob 1106 | 2z1od 1107 | z1og 1108 | z2ol 1109 | z4om 1110 | 2z1p 1111 | 1z1r 1112 | 4zredč 1113 | 4zreš 1114 | 4zrez 1115 | 4zrež 1116 | 4zri 1117 | 4zru 1118 | 2z1s 1119 | z1š 1120 | z1t 1121 | 1zu 1122 | z4uj 1123 | 2z1up 1124 | 2z1uz 1125 | z1v2 1126 | z4ven 1127 | z3vn 1128 | 3z4voj 1129 | z4vok 1130 | 2z1z2 1131 | z1ž 1132 | 2ž1b 1133 | 2ž1c 1134 | 2ž1č 1135 | 2ž1j 1136 | 2ž1k 1137 | 4žmi 1138 | .č8 1139 | .š8 1140 | .ž8 1141 | 8ž. 1142 | 8š. 1143 | 8č. 1144 | } 1145 | -------------------------------------------------------------------------------- /patterns/hyph-sq.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for Albanian 2 | % notice: This file is part of the hyph-utf8 package. 3 | % See http://www.hyphenation.org/tex for more information. 4 | % 5 | % version: 2025-01-10 6 | % 7 | % changes: 8 | % - 2020-09-21: Initial version 9 | % - 2025-01-10: Removed duplicates 10 | % 11 | % authors: 12 | % - 13 | % name: Claudio Beccari 14 | % contact: claudio.beccari@gmail.com 15 | % - 16 | % name: Sabina Koliqi 17 | % contact: sabina.kolici@enaip.piemonte.it 18 | % - 19 | % name: Arthur Rosendahl 20 | % contact: arthur@rosendahl.io 21 | % 22 | % copyright: > 23 | % Copyright (C) 2020 Claudio Beccari, Sabina Koliqi 24 | % (C) 2025 Arthur Rosendahl 25 | % 26 | % licence: 27 | % name: MIT 28 | % url: http://opensource.org/licenses/mit-license.php 29 | % text: > 30 | % Permission is hereby granted, free of charge, to any person 31 | % obtaining a copy of this software and associated documentation 32 | % files (the “Software”), to deal in the Software without 33 | % restriction, including without limitation the rights to use, 34 | % copy, modify, merge, publish, distribute, sublicense, and/or 35 | % sell copies of the Software, and to permit persons to whom the 36 | % Software is furnished to do so, subject to the following 37 | % conditions: 38 | % 39 | % The above copyright notice and this permission notice shall be 40 | % included in all copies or substantial portions of the Software. 41 | % 42 | % THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, 43 | % EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 44 | % OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 45 | % NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 46 | % HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 47 | % WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 48 | % FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 49 | % OTHER DEALINGS IN THE SOFTWARE. 50 | % 51 | % language: 52 | % name: Albanian 53 | % tag: sq 54 | % 55 | % hyphenmins: 56 | % generation: 57 | % left: 1 58 | % right: 1 59 | % typesetting: 60 | % left: 2 61 | % right: 2 62 | % 63 | % texlive: 64 | % encoding: ec 65 | % babelname: albanian 66 | % message: Albanian hyphenation patterns 67 | % description: Hyphenation patterns for Albanian in UTF-8 and T1 encoding. 68 | % 69 | % ========================================================================= 70 | % 71 | \message{Albanian Hyphenation Patterns } 72 | \patterns{2'2 73 | .a1jo. a1a 74 | 1b .b2 2b. b2l 2bsh 75 | 1c .c2 2c. 2cj 2cn 2ct 76 | 1ç .ç2 2ç. 2çs ç2k 77 | 1d d2h .d2 2d. d2j 2dn d2r 2drr 2dt d2shm 78 | 2dh. 2dhj2dht 2dhsh 2dh2j 2dht dh2r 79 | e1a e3ll e1u 80 | ë1a 81 | 1f .f2 2f. f2l f2r 2fs 2ft 3f2sh 2f2t. 82 | 1g .g2 2g. g2j 2gj. 2gjv 2gl 2gm 2gr 2gt 83 | 1h .h2 2h. 2hd 2hj 2hm 2hn 2ht 2hrr 84 | i1a i1e i1u .i2k3i .i2k3j 85 | 1j2 .j2 2j. 2j3c2 2j3d 2j3m 2j3p 2j3r 2j3t 2j3v 2j3s 2jf. j4tp 2jt. j3sh2m 86 | 1k .k2 2k. k2j 2kl 2km 2kth. k2r 2kt 2ks 2ksh 87 | 1l .l2 2l. 2lb 2lç 2lf 2lj 2lm 2ln l3n2g 2ls 2lt 88 | l2l2 4ll. 2ll3s 4ll3z 89 | 2ll3k 4ll3gj 2ll3n 2ll3t 90 | 1m .m2 2m. m2b 91 | mb2j mb2l mb2r m2j 2m3n2d 2mt 2mr 2m3sh2 2m4sh. 2m1v 92 | 1n .n2 2n. .ng2r 2nc 2nd n2dm n2dv n2d3sh 2ng 2nk 2nsp 2nsh n3sh2m 2nt 2nv 2nx 2nz 93 | n2j 2njt 2nj. 2njv 94 | o1i 95 | 1p .p2 2p. p2j 2pn 2pt p2je. 2ps p2r pa2s3her .pe2r3af .pë2r3af 96 | 1q .q2 2q. 2qj 2qk 2qm 2qn 2qt q2v 97 | 1r .r2 2r. 2rt 2rb2 2r2b3r 2rc 2rç 2rd 2rc2rd 2rf 2rg 2rh .ri3n2d 2rk 2rl 2rm 2rn r2n3d2 2rp 2rq 2rs 2r3sh2m 2rdh r2dht 2r3dr 2rj 2rv 2rz 98 | r2r .rr2 2rr. 2rrj 2rrk 2rrm 2rrn 2rrt 2rrs 99 | 1s .s2 2s. 2sh. 2sb 2sc 2sd 2sf 2sg 2sj 2sk 2sm 2sn sn2k 2sp 2ssh 2st st2r 3s2je2ll sk2ll s2ve. 100 | s2h .sh4 2shm 3sh2mj 2shj .sh2j sh2k 2shk. sh2n shn4d sh2p .sh2q 4sh3k2r 2shq 2sh3nj 3sh4pj 3sh4pr 2shr 2shs 2sht .sh2t 3sh2te. 101 | 1t .t2 4t. 2tk t2j 2tm 2tn 2tp 2t3sh2m t2r 2tv 102 | t2h .th2 2th. 2thç 2ths 2thf 2thm 2tht 103 | u1ar. u1a u1e 104 | 1v .v2 2v. 2vr v2j 105 | 1x x2h .x2 2x. 106 | y1 107 | 1z .zb2r .z2 2z. 2zhd 2zm 2zn 2zj 2zs 2zt 2zv z3sh2m z2h .zh2 108 | } 109 | -------------------------------------------------------------------------------- /patterns/hyph-tr.tex: -------------------------------------------------------------------------------- 1 | % title: Hyphenation patterns for Turkish 2 | % copyright: Copyright (C) 1987 Pierre A. MacKay, 2008, 2011 TUG 3 | % notice: This file is part of the hyph-utf8 package. 4 | % See http://www.hyphenation.org/tex for more information. 5 | % language: 6 | % name: Turkish 7 | % tag: tr 8 | % authors: 9 | % - 10 | % name: Pierre A. MacKay 11 | % - 12 | % name: H. Turgut Uyar 13 | % contact: uyar (at) itu.edu.tr 14 | % - 15 | % name: S. Ekin Kocabas 16 | % contact: kocabas (at) stanford.edu 17 | % - 18 | % name: Mojca Miklavec 19 | % licence: 20 | % name: LPPL 21 | % version: 1 22 | % or_later: true 23 | % url: https://latex-project.org/lppl/lppl-1-0.html 24 | % hyphenmins: 25 | % typesetting: 26 | % left: 2 27 | % right: 2 28 | % changes: 29 | % - 2008-06-25/27/28 - create this file by adapting Ottoman rules for modern Turkish 30 | % - 2011-08-10 - add LPPL licence with permission of Pierre A. MacKay 31 | % texlive: 32 | % encoding: ec 33 | % babelname: turkish 34 | % legacy_patterns: tkhyph.tex 35 | % message: Turkish hyphenation patterns 36 | % description: |- 37 | % Hyphenation patterns for Turkish in T1/EC and UTF-8 encodings. 38 | % Auto-generated from a script included in the distribution. 39 | % The patterns for Turkish were first produced for the Ottoman Texts 40 | % Project in 1987 and were suitable for both Modern Turkish and Ottoman 41 | % Turkish in Latin script, however the required character set didn't fit 42 | % into EC encoding, so support for Ottoman Turkish had to be dropped to 43 | % keep compatibility with 8-bit engines. 44 | % ========================================== 45 | % This file is auto-generated from 46 | % source/generic/hyph-utf8/languages/tr/generate_patterns_tr.rb 47 | % that is part of hyph-utf8. 48 | % Please don't modify this file; modify the generating script instead. 49 | % 50 | % Credits: 51 | % - algorithm developed by P. A. MacKay for the Ottoman Texts Project in 1987 52 | % - rules adapted for modern Turkish by H. Turgut Uyar 53 | % - initiative to improve Turkish patterns by S. Ekin Kocabas 54 | % - script written by Mojca Miklavec in June 2008 55 | % 56 | % See also: 57 | % - http://mirror.ctan.org/language/turkish/hyphen/turk_hyf.c 58 | % - http://www.tug.org/TUGboat/Articles/tb09-1/tb20mackay.pdf 59 | % 60 | % Differences with Ottoman patterns: 61 | % - adapted for the use on modern TeX engines, using UTF-8 charactes 62 | % - only letters for Modern Turkish + âîû (the first one often needed, the other two don't hurt) 63 | % - (if needed, support for Ottoman Turkish might be provided separately under language code 'ota') 64 | % 65 | \patterns{ 66 | % prohibit hyphen before vowels, allow after 67 | 2a1 68 | 2â1 69 | 2e1 70 | 2ı1 71 | 2i1 72 | 2î1 73 | 2o1 74 | 2ö1 75 | 2u1 76 | 2ü1 77 | 2û1 78 | % allow hyphen either side of consonants 79 | 1b1 80 | 1c1 81 | 1ç1 82 | 1d1 83 | 1f1 84 | 1g1 85 | 1ğ1 86 | 1h1 87 | 1j1 88 | 1k1 89 | 1l1 90 | 1m1 91 | 1n1 92 | 1p1 93 | 1r1 94 | 1s1 95 | 1ş1 96 | 1t1 97 | 1v1 98 | 1y1 99 | 1z1 100 | % prevent e-cek at end of word 101 | 2e2cek. 102 | % prohibit hyphen before pair of consonants 103 | % many pairs generated here are impossible anyway 104 | 2bb 105 | 2bc 106 | 2bç 107 | 2bd 108 | 2bf 109 | 2bg 110 | 2bğ 111 | 2bh 112 | 2bj 113 | 2bk 114 | 2bl 115 | 2bm 116 | 2bn 117 | 2bp 118 | 2br 119 | 2bs 120 | 2bş 121 | 2bt 122 | 2bv 123 | 2by 124 | 2bz 125 | 2cb 126 | 2cc 127 | 2cç 128 | 2cd 129 | 2cf 130 | 2cg 131 | 2cğ 132 | 2ch 133 | 2cj 134 | 2ck 135 | 2cl 136 | 2cm 137 | 2cn 138 | 2cp 139 | 2cr 140 | 2cs 141 | 2cş 142 | 2ct 143 | 2cv 144 | 2cy 145 | 2cz 146 | 2çb 147 | 2çc 148 | 2çç 149 | 2çd 150 | 2çf 151 | 2çg 152 | 2çğ 153 | 2çh 154 | 2çj 155 | 2çk 156 | 2çl 157 | 2çm 158 | 2çn 159 | 2çp 160 | 2çr 161 | 2çs 162 | 2çş 163 | 2çt 164 | 2çv 165 | 2çy 166 | 2çz 167 | 2db 168 | 2dc 169 | 2dç 170 | 2dd 171 | 2df 172 | 2dg 173 | 2dğ 174 | 2dh 175 | 2dj 176 | 2dk 177 | 2dl 178 | 2dm 179 | 2dn 180 | 2dp 181 | 2dr 182 | 2ds 183 | 2dş 184 | 2dt 185 | 2dv 186 | 2dy 187 | 2dz 188 | 2fb 189 | 2fc 190 | 2fç 191 | 2fd 192 | 2ff 193 | 2fg 194 | 2fğ 195 | 2fh 196 | 2fj 197 | 2fk 198 | 2fl 199 | 2fm 200 | 2fn 201 | 2fp 202 | 2fr 203 | 2fs 204 | 2fş 205 | 2ft 206 | 2fv 207 | 2fy 208 | 2fz 209 | 2gb 210 | 2gc 211 | 2gç 212 | 2gd 213 | 2gf 214 | 2gg 215 | 2gğ 216 | 2gh 217 | 2gj 218 | 2gk 219 | 2gl 220 | 2gm 221 | 2gn 222 | 2gp 223 | 2gr 224 | 2gs 225 | 2gş 226 | 2gt 227 | 2gv 228 | 2gy 229 | 2gz 230 | 2ğb 231 | 2ğc 232 | 2ğç 233 | 2ğd 234 | 2ğf 235 | 2ğg 236 | 2ğğ 237 | 2ğh 238 | 2ğj 239 | 2ğk 240 | 2ğl 241 | 2ğm 242 | 2ğn 243 | 2ğp 244 | 2ğr 245 | 2ğs 246 | 2ğş 247 | 2ğt 248 | 2ğv 249 | 2ğy 250 | 2ğz 251 | 2hb 252 | 2hc 253 | 2hç 254 | 2hd 255 | 2hf 256 | 2hg 257 | 2hğ 258 | 2hh 259 | 2hj 260 | 2hk 261 | 2hl 262 | 2hm 263 | 2hn 264 | 2hp 265 | 2hr 266 | 2hs 267 | 2hş 268 | 2ht 269 | 2hv 270 | 2hy 271 | 2hz 272 | 2jb 273 | 2jc 274 | 2jç 275 | 2jd 276 | 2jf 277 | 2jg 278 | 2jğ 279 | 2jh 280 | 2jj 281 | 2jk 282 | 2jl 283 | 2jm 284 | 2jn 285 | 2jp 286 | 2jr 287 | 2js 288 | 2jş 289 | 2jt 290 | 2jv 291 | 2jy 292 | 2jz 293 | 2kb 294 | 2kc 295 | 2kç 296 | 2kd 297 | 2kf 298 | 2kg 299 | 2kğ 300 | 2kh 301 | 2kj 302 | 2kk 303 | 2kl 304 | 2km 305 | 2kn 306 | 2kp 307 | 2kr 308 | 2ks 309 | 2kş 310 | 2kt 311 | 2kv 312 | 2ky 313 | 2kz 314 | 2lb 315 | 2lc 316 | 2lç 317 | 2ld 318 | 2lf 319 | 2lg 320 | 2lğ 321 | 2lh 322 | 2lj 323 | 2lk 324 | 2ll 325 | 2lm 326 | 2ln 327 | 2lp 328 | 2lr 329 | 2ls 330 | 2lş 331 | 2lt 332 | 2lv 333 | 2ly 334 | 2lz 335 | 2mb 336 | 2mc 337 | 2mç 338 | 2md 339 | 2mf 340 | 2mg 341 | 2mğ 342 | 2mh 343 | 2mj 344 | 2mk 345 | 2ml 346 | 2mm 347 | 2mn 348 | 2mp 349 | 2mr 350 | 2ms 351 | 2mş 352 | 2mt 353 | 2mv 354 | 2my 355 | 2mz 356 | 2nb 357 | 2nc 358 | 2nç 359 | 2nd 360 | 2nf 361 | 2ng 362 | 2nğ 363 | 2nh 364 | 2nj 365 | 2nk 366 | 2nl 367 | 2nm 368 | 2nn 369 | 2np 370 | 2nr 371 | 2ns 372 | 2nş 373 | 2nt 374 | 2nv 375 | 2ny 376 | 2nz 377 | 2pb 378 | 2pc 379 | 2pç 380 | 2pd 381 | 2pf 382 | 2pg 383 | 2pğ 384 | 2ph 385 | 2pj 386 | 2pk 387 | 2pl 388 | 2pm 389 | 2pn 390 | 2pp 391 | 2pr 392 | 2ps 393 | 2pş 394 | 2pt 395 | 2pv 396 | 2py 397 | 2pz 398 | 2rb 399 | 2rc 400 | 2rç 401 | 2rd 402 | 2rf 403 | 2rg 404 | 2rğ 405 | 2rh 406 | 2rj 407 | 2rk 408 | 2rl 409 | 2rm 410 | 2rn 411 | 2rp 412 | 2rr 413 | 2rs 414 | 2rş 415 | 2rt 416 | 2rv 417 | 2ry 418 | 2rz 419 | 2sb 420 | 2sc 421 | 2sç 422 | 2sd 423 | 2sf 424 | 2sg 425 | 2sğ 426 | 2sh 427 | 2sj 428 | 2sk 429 | 2sl 430 | 2sm 431 | 2sn 432 | 2sp 433 | 2sr 434 | 2ss 435 | 2sş 436 | 2st 437 | 2sv 438 | 2sy 439 | 2sz 440 | 2şb 441 | 2şc 442 | 2şç 443 | 2şd 444 | 2şf 445 | 2şg 446 | 2şğ 447 | 2şh 448 | 2şj 449 | 2şk 450 | 2şl 451 | 2şm 452 | 2şn 453 | 2şp 454 | 2şr 455 | 2şs 456 | 2şş 457 | 2şt 458 | 2şv 459 | 2şy 460 | 2şz 461 | 2tb 462 | 2tc 463 | 2tç 464 | 2td 465 | 2tf 466 | 2tg 467 | 2tğ 468 | 2th 469 | 2tj 470 | 2tk 471 | 2tl 472 | 2tm 473 | 2tn 474 | 2tp 475 | 2tr 476 | 2ts 477 | 2tş 478 | 2tt 479 | 2tv 480 | 2ty 481 | 2tz 482 | 2vb 483 | 2vc 484 | 2vç 485 | 2vd 486 | 2vf 487 | 2vg 488 | 2vğ 489 | 2vh 490 | 2vj 491 | 2vk 492 | 2vl 493 | 2vm 494 | 2vn 495 | 2vp 496 | 2vr 497 | 2vs 498 | 2vş 499 | 2vt 500 | 2vv 501 | 2vy 502 | 2vz 503 | 2yb 504 | 2yc 505 | 2yç 506 | 2yd 507 | 2yf 508 | 2yg 509 | 2yğ 510 | 2yh 511 | 2yj 512 | 2yk 513 | 2yl 514 | 2ym 515 | 2yn 516 | 2yp 517 | 2yr 518 | 2ys 519 | 2yş 520 | 2yt 521 | 2yv 522 | 2yy 523 | 2yz 524 | 2zb 525 | 2zc 526 | 2zç 527 | 2zd 528 | 2zf 529 | 2zg 530 | 2zğ 531 | 2zh 532 | 2zj 533 | 2zk 534 | 2zl 535 | 2zm 536 | 2zn 537 | 2zp 538 | 2zr 539 | 2zs 540 | 2zş 541 | 2zt 542 | 2zv 543 | 2zy 544 | 2zz 545 | % allow hyphen between vowels, but not after second vowel of pair 546 | % several phonetically impossible pairs here 547 | a3a2 548 | a3â2 549 | a3e2 550 | a3ı2 551 | a3i2 552 | a3î2 553 | a3o2 554 | a3ö2 555 | a3u2 556 | a3ü2 557 | a3û2 558 | â3a2 559 | â3â2 560 | â3e2 561 | â3ı2 562 | â3i2 563 | â3î2 564 | â3o2 565 | â3ö2 566 | â3u2 567 | â3ü2 568 | â3û2 569 | e3a2 570 | e3â2 571 | e3e2 572 | e3ı2 573 | e3i2 574 | e3î2 575 | e3o2 576 | e3ö2 577 | e3u2 578 | e3ü2 579 | e3û2 580 | ı3a2 581 | ı3â2 582 | ı3e2 583 | ı3ı2 584 | ı3i2 585 | ı3î2 586 | ı3o2 587 | ı3ö2 588 | ı3u2 589 | ı3ü2 590 | ı3û2 591 | i3a2 592 | i3â2 593 | i3e2 594 | i3ı2 595 | i3i2 596 | i3î2 597 | i3o2 598 | i3ö2 599 | i3u2 600 | i3ü2 601 | i3û2 602 | î3a2 603 | î3â2 604 | î3e2 605 | î3ı2 606 | î3i2 607 | î3î2 608 | î3o2 609 | î3ö2 610 | î3u2 611 | î3ü2 612 | î3û2 613 | o3a2 614 | o3â2 615 | o3e2 616 | o3ı2 617 | o3i2 618 | o3î2 619 | o3o2 620 | o3ö2 621 | o3u2 622 | o3ü2 623 | o3û2 624 | ö3a2 625 | ö3â2 626 | ö3e2 627 | ö3ı2 628 | ö3i2 629 | ö3î2 630 | ö3o2 631 | ö3ö2 632 | ö3u2 633 | ö3ü2 634 | ö3û2 635 | u3a2 636 | u3â2 637 | u3e2 638 | u3ı2 639 | u3i2 640 | u3î2 641 | u3o2 642 | u3ö2 643 | u3u2 644 | u3ü2 645 | u3û2 646 | ü3a2 647 | ü3â2 648 | ü3e2 649 | ü3ı2 650 | ü3i2 651 | ü3î2 652 | ü3o2 653 | ü3ö2 654 | ü3u2 655 | ü3ü2 656 | ü3û2 657 | û3a2 658 | û3â2 659 | û3e2 660 | û3ı2 661 | û3i2 662 | û3î2 663 | û3o2 664 | û3ö2 665 | û3u2 666 | û3ü2 667 | û3û2 668 | % a couple of consonant-clusters 669 | tu4r4k 670 | m1t4rak 671 | } 672 | -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | use_small_heuristics = "Max" 2 | max_width = 90 3 | chain_width = 70 4 | struct_lit_width = 50 5 | use_field_init_shorthand = true 6 | merge_derives = false 7 | -------------------------------------------------------------------------------- /src/lang.rs: -------------------------------------------------------------------------------- 1 | // This file is generated by tests/generate.rs 2 | // Do not edit by hand! 3 | 4 | /// A language you can hyphenate in. 5 | /// 6 | /// Lists for each language also the ISO 639-1 two 7 | /// letter language code and the ISO 15924 four letter 8 | /// script code. 9 | #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] 10 | #[non_exhaustive] 11 | pub enum Lang { 12 | /// Hyphenation for _Afrikaans._ (Code: `af`, Script, `Latn`, Feature: `afrikaans`) 13 | #[cfg(feature = "afrikaans")] 14 | Afrikaans, 15 | /// Hyphenation for _Albanian._ (Code: `sq`, Script, `Latn`, Feature: `albanian`) 16 | #[cfg(feature = "albanian")] 17 | Albanian, 18 | /// Hyphenation for _Belarusian._ (Code: `be`, Script, `Cyrl`, Feature: `belarusian`) 19 | #[cfg(feature = "belarusian")] 20 | Belarusian, 21 | /// Hyphenation for _Bulgarian._ (Code: `bg`, Script, `Cyrl`, Feature: `bulgarian`) 22 | #[cfg(feature = "bulgarian")] 23 | Bulgarian, 24 | /// Hyphenation for _Catalan._ (Code: `ca`, Script, `Latn`, Feature: `catalan`) 25 | #[cfg(feature = "catalan")] 26 | Catalan, 27 | /// Hyphenation for _Croatian._ (Code: `hr`, Script, `Latn`, Feature: `croatian`) 28 | #[cfg(feature = "croatian")] 29 | Croatian, 30 | /// Hyphenation for _Czech._ (Code: `cs`, Script, `Latn`, Feature: `czech`) 31 | #[cfg(feature = "czech")] 32 | Czech, 33 | /// Hyphenation for _Danish._ (Code: `da`, Script, `Latn`, Feature: `danish`) 34 | #[cfg(feature = "danish")] 35 | Danish, 36 | /// Hyphenation for _Dutch._ (Code: `nl`, Script, `Latn`, Feature: `dutch`) 37 | #[cfg(feature = "dutch")] 38 | Dutch, 39 | /// Hyphenation for _English._ (Code: `en`, Script, `Latn`, Feature: `english`) 40 | #[cfg(feature = "english")] 41 | English, 42 | /// Hyphenation for _Estonian._ (Code: `et`, Script, `Latn`, Feature: `estonian`) 43 | #[cfg(feature = "estonian")] 44 | Estonian, 45 | /// Hyphenation for _Finnish._ (Code: `fi`, Script, `Latn`, Feature: `finnish`) 46 | #[cfg(feature = "finnish")] 47 | Finnish, 48 | /// Hyphenation for _French._ (Code: `fr`, Script, `Latn`, Feature: `french`) 49 | #[cfg(feature = "french")] 50 | French, 51 | /// Hyphenation for _Georgian._ (Code: `ka`, Script, `Geor`, Feature: `georgian`) 52 | #[cfg(feature = "georgian")] 53 | Georgian, 54 | /// Hyphenation for _German._ (Code: `de`, Script, `Latn`, Feature: `german`) 55 | #[cfg(feature = "german")] 56 | German, 57 | /// Hyphenation for _Greek._ (Code: `el`, Script, `Grek`, Feature: `greek`) 58 | #[cfg(feature = "greek")] 59 | Greek, 60 | /// Hyphenation for _Hungarian._ (Code: `hu`, Script, `Latn`, Feature: `hungarian`) 61 | #[cfg(feature = "hungarian")] 62 | Hungarian, 63 | /// Hyphenation for _Icelandic._ (Code: `is`, Script, `Latn`, Feature: `icelandic`) 64 | #[cfg(feature = "icelandic")] 65 | Icelandic, 66 | /// Hyphenation for _Italian._ (Code: `it`, Script, `Latn`, Feature: `italian`) 67 | #[cfg(feature = "italian")] 68 | Italian, 69 | /// Hyphenation for _Kurmanji._ (Code: `ku`, Script, `Latn`, Feature: `kurmanji`) 70 | #[cfg(feature = "kurmanji")] 71 | Kurmanji, 72 | /// Hyphenation for _Latin._ (Code: `la`, Script, `Latn`, Feature: `latin`) 73 | #[cfg(feature = "latin")] 74 | Latin, 75 | /// Hyphenation for _Lithuanian._ (Code: `lt`, Script, `Latn`, Feature: `lithuanian`) 76 | #[cfg(feature = "lithuanian")] 77 | Lithuanian, 78 | /// Hyphenation for _Mongolian._ (Code: `mn`, Script, `Cyrl`, Feature: `mongolian`) 79 | #[cfg(feature = "mongolian")] 80 | Mongolian, 81 | /// Hyphenation for _Norwegian._ (Code: `no`, Alias: `nb`, Alias: `nn`, Script, `Latn`, Feature: `norwegian`) 82 | #[cfg(feature = "norwegian")] 83 | Norwegian, 84 | /// Hyphenation for _Polish._ (Code: `pl`, Script, `Latn`, Feature: `polish`) 85 | #[cfg(feature = "polish")] 86 | Polish, 87 | /// Hyphenation for _Portuguese._ (Code: `pt`, Script, `Latn`, Feature: `portuguese`) 88 | #[cfg(feature = "portuguese")] 89 | Portuguese, 90 | /// Hyphenation for _Russian._ (Code: `ru`, Script, `Cyrl`, Feature: `russian`) 91 | #[cfg(feature = "russian")] 92 | Russian, 93 | /// Hyphenation for _Serbian._ (Code: `sr`, Script, `Cyrl`, Feature: `serbian`) 94 | #[cfg(feature = "serbian")] 95 | Serbian, 96 | /// Hyphenation for _Slovak._ (Code: `sk`, Script, `Latn`, Feature: `slovak`) 97 | #[cfg(feature = "slovak")] 98 | Slovak, 99 | /// Hyphenation for _Slovenian._ (Code: `sl`, Script, `Latn`, Feature: `slovenian`) 100 | #[cfg(feature = "slovenian")] 101 | Slovenian, 102 | /// Hyphenation for _Spanish._ (Code: `es`, Script, `Latn`, Feature: `spanish`) 103 | #[cfg(feature = "spanish")] 104 | Spanish, 105 | /// Hyphenation for _Swedish._ (Code: `sv`, Script, `Latn`, Feature: `swedish`) 106 | #[cfg(feature = "swedish")] 107 | Swedish, 108 | /// Hyphenation for _Turkish._ (Code: `tr`, Script, `Latn`, Feature: `turkish`) 109 | #[cfg(feature = "turkish")] 110 | Turkish, 111 | /// Hyphenation for _Turkmen._ (Code: `tk`, Script, `Latn`, Feature: `turkmen`) 112 | #[cfg(feature = "turkmen")] 113 | Turkmen, 114 | /// Hyphenation for _Ukrainian._ (Code: `uk`, Script, `Cyrl`, Feature: `ukrainian`) 115 | #[cfg(feature = "ukrainian")] 116 | Ukrainian, 117 | } 118 | 119 | impl Lang { 120 | /// Select a language using its ISO 639-1 code. 121 | pub fn from_iso(code: [u8; 2]) -> Option { 122 | match &code { 123 | #[cfg(feature = "afrikaans")] 124 | b"af" => Some(Self::Afrikaans), 125 | #[cfg(feature = "albanian")] 126 | b"sq" => Some(Self::Albanian), 127 | #[cfg(feature = "belarusian")] 128 | b"be" => Some(Self::Belarusian), 129 | #[cfg(feature = "bulgarian")] 130 | b"bg" => Some(Self::Bulgarian), 131 | #[cfg(feature = "catalan")] 132 | b"ca" => Some(Self::Catalan), 133 | #[cfg(feature = "croatian")] 134 | b"hr" => Some(Self::Croatian), 135 | #[cfg(feature = "czech")] 136 | b"cs" => Some(Self::Czech), 137 | #[cfg(feature = "danish")] 138 | b"da" => Some(Self::Danish), 139 | #[cfg(feature = "dutch")] 140 | b"nl" => Some(Self::Dutch), 141 | #[cfg(feature = "english")] 142 | b"en" => Some(Self::English), 143 | #[cfg(feature = "estonian")] 144 | b"et" => Some(Self::Estonian), 145 | #[cfg(feature = "finnish")] 146 | b"fi" => Some(Self::Finnish), 147 | #[cfg(feature = "french")] 148 | b"fr" => Some(Self::French), 149 | #[cfg(feature = "georgian")] 150 | b"ka" => Some(Self::Georgian), 151 | #[cfg(feature = "german")] 152 | b"de" => Some(Self::German), 153 | #[cfg(feature = "greek")] 154 | b"el" => Some(Self::Greek), 155 | #[cfg(feature = "hungarian")] 156 | b"hu" => Some(Self::Hungarian), 157 | #[cfg(feature = "icelandic")] 158 | b"is" => Some(Self::Icelandic), 159 | #[cfg(feature = "italian")] 160 | b"it" => Some(Self::Italian), 161 | #[cfg(feature = "kurmanji")] 162 | b"ku" => Some(Self::Kurmanji), 163 | #[cfg(feature = "latin")] 164 | b"la" => Some(Self::Latin), 165 | #[cfg(feature = "lithuanian")] 166 | b"lt" => Some(Self::Lithuanian), 167 | #[cfg(feature = "mongolian")] 168 | b"mn" => Some(Self::Mongolian), 169 | #[cfg(feature = "norwegian")] 170 | b"no" => Some(Self::Norwegian), 171 | #[cfg(feature = "norwegian")] 172 | b"nb" => Some(Self::Norwegian), 173 | #[cfg(feature = "norwegian")] 174 | b"nn" => Some(Self::Norwegian), 175 | #[cfg(feature = "polish")] 176 | b"pl" => Some(Self::Polish), 177 | #[cfg(feature = "portuguese")] 178 | b"pt" => Some(Self::Portuguese), 179 | #[cfg(feature = "russian")] 180 | b"ru" => Some(Self::Russian), 181 | #[cfg(feature = "serbian")] 182 | b"sr" => Some(Self::Serbian), 183 | #[cfg(feature = "slovak")] 184 | b"sk" => Some(Self::Slovak), 185 | #[cfg(feature = "slovenian")] 186 | b"sl" => Some(Self::Slovenian), 187 | #[cfg(feature = "spanish")] 188 | b"es" => Some(Self::Spanish), 189 | #[cfg(feature = "swedish")] 190 | b"sv" => Some(Self::Swedish), 191 | #[cfg(feature = "turkish")] 192 | b"tr" => Some(Self::Turkish), 193 | #[cfg(feature = "turkmen")] 194 | b"tk" => Some(Self::Turkmen), 195 | #[cfg(feature = "ukrainian")] 196 | b"uk" => Some(Self::Ukrainian), 197 | _ => None, 198 | } 199 | } 200 | 201 | /// The default number of chars to each side between 202 | /// which breaking is forbidden. 203 | /// 204 | /// This follows typographic conventions. 205 | pub fn bounds(self) -> (usize, usize) { 206 | match self { 207 | #[cfg(feature = "afrikaans")] 208 | Self::Afrikaans => (1, 2), 209 | #[cfg(feature = "albanian")] 210 | Self::Albanian => (2, 2), 211 | #[cfg(feature = "belarusian")] 212 | Self::Belarusian => (2, 2), 213 | #[cfg(feature = "bulgarian")] 214 | Self::Bulgarian => (2, 2), 215 | #[cfg(feature = "catalan")] 216 | Self::Catalan => (2, 2), 217 | #[cfg(feature = "croatian")] 218 | Self::Croatian => (2, 2), 219 | #[cfg(feature = "czech")] 220 | Self::Czech => (2, 2), 221 | #[cfg(feature = "danish")] 222 | Self::Danish => (2, 2), 223 | #[cfg(feature = "dutch")] 224 | Self::Dutch => (2, 2), 225 | #[cfg(feature = "english")] 226 | Self::English => (2, 3), 227 | #[cfg(feature = "estonian")] 228 | Self::Estonian => (2, 3), 229 | #[cfg(feature = "finnish")] 230 | Self::Finnish => (2, 2), 231 | #[cfg(feature = "french")] 232 | Self::French => (2, 2), 233 | #[cfg(feature = "georgian")] 234 | Self::Georgian => (1, 2), 235 | #[cfg(feature = "german")] 236 | Self::German => (2, 2), 237 | #[cfg(feature = "greek")] 238 | Self::Greek => (1, 1), 239 | #[cfg(feature = "hungarian")] 240 | Self::Hungarian => (2, 2), 241 | #[cfg(feature = "icelandic")] 242 | Self::Icelandic => (2, 2), 243 | #[cfg(feature = "italian")] 244 | Self::Italian => (2, 2), 245 | #[cfg(feature = "kurmanji")] 246 | Self::Kurmanji => (2, 2), 247 | #[cfg(feature = "latin")] 248 | Self::Latin => (2, 2), 249 | #[cfg(feature = "lithuanian")] 250 | Self::Lithuanian => (2, 2), 251 | #[cfg(feature = "mongolian")] 252 | Self::Mongolian => (2, 2), 253 | #[cfg(feature = "norwegian")] 254 | Self::Norwegian => (2, 2), 255 | #[cfg(feature = "polish")] 256 | Self::Polish => (2, 2), 257 | #[cfg(feature = "portuguese")] 258 | Self::Portuguese => (2, 3), 259 | #[cfg(feature = "russian")] 260 | Self::Russian => (2, 2), 261 | #[cfg(feature = "serbian")] 262 | Self::Serbian => (2, 2), 263 | #[cfg(feature = "slovak")] 264 | Self::Slovak => (2, 3), 265 | #[cfg(feature = "slovenian")] 266 | Self::Slovenian => (2, 2), 267 | #[cfg(feature = "spanish")] 268 | Self::Spanish => (2, 2), 269 | #[cfg(feature = "swedish")] 270 | Self::Swedish => (2, 2), 271 | #[cfg(feature = "turkish")] 272 | Self::Turkish => (2, 2), 273 | #[cfg(feature = "turkmen")] 274 | Self::Turkmen => (2, 2), 275 | #[cfg(feature = "ukrainian")] 276 | Self::Ukrainian => (2, 2), 277 | } 278 | } 279 | 280 | fn root(self) -> State<'static> { 281 | match self { 282 | #[cfg(feature = "afrikaans")] 283 | Self::Afrikaans => State::root(include_bytes!("../tries/af.bin")), 284 | #[cfg(feature = "albanian")] 285 | Self::Albanian => State::root(include_bytes!("../tries/sq.bin")), 286 | #[cfg(feature = "belarusian")] 287 | Self::Belarusian => State::root(include_bytes!("../tries/be.bin")), 288 | #[cfg(feature = "bulgarian")] 289 | Self::Bulgarian => State::root(include_bytes!("../tries/bg.bin")), 290 | #[cfg(feature = "catalan")] 291 | Self::Catalan => State::root(include_bytes!("../tries/ca.bin")), 292 | #[cfg(feature = "croatian")] 293 | Self::Croatian => State::root(include_bytes!("../tries/hr.bin")), 294 | #[cfg(feature = "czech")] 295 | Self::Czech => State::root(include_bytes!("../tries/cs.bin")), 296 | #[cfg(feature = "danish")] 297 | Self::Danish => State::root(include_bytes!("../tries/da.bin")), 298 | #[cfg(feature = "dutch")] 299 | Self::Dutch => State::root(include_bytes!("../tries/nl.bin")), 300 | #[cfg(feature = "english")] 301 | Self::English => State::root(include_bytes!("../tries/en.bin")), 302 | #[cfg(feature = "estonian")] 303 | Self::Estonian => State::root(include_bytes!("../tries/et.bin")), 304 | #[cfg(feature = "finnish")] 305 | Self::Finnish => State::root(include_bytes!("../tries/fi.bin")), 306 | #[cfg(feature = "french")] 307 | Self::French => State::root(include_bytes!("../tries/fr.bin")), 308 | #[cfg(feature = "georgian")] 309 | Self::Georgian => State::root(include_bytes!("../tries/ka.bin")), 310 | #[cfg(feature = "german")] 311 | Self::German => State::root(include_bytes!("../tries/de.bin")), 312 | #[cfg(feature = "greek")] 313 | Self::Greek => State::root(include_bytes!("../tries/el.bin")), 314 | #[cfg(feature = "hungarian")] 315 | Self::Hungarian => State::root(include_bytes!("../tries/hu.bin")), 316 | #[cfg(feature = "icelandic")] 317 | Self::Icelandic => State::root(include_bytes!("../tries/is.bin")), 318 | #[cfg(feature = "italian")] 319 | Self::Italian => State::root(include_bytes!("../tries/it.bin")), 320 | #[cfg(feature = "kurmanji")] 321 | Self::Kurmanji => State::root(include_bytes!("../tries/ku.bin")), 322 | #[cfg(feature = "latin")] 323 | Self::Latin => State::root(include_bytes!("../tries/la.bin")), 324 | #[cfg(feature = "lithuanian")] 325 | Self::Lithuanian => State::root(include_bytes!("../tries/lt.bin")), 326 | #[cfg(feature = "mongolian")] 327 | Self::Mongolian => State::root(include_bytes!("../tries/mn.bin")), 328 | #[cfg(feature = "norwegian")] 329 | Self::Norwegian => State::root(include_bytes!("../tries/no.bin")), 330 | #[cfg(feature = "polish")] 331 | Self::Polish => State::root(include_bytes!("../tries/pl.bin")), 332 | #[cfg(feature = "portuguese")] 333 | Self::Portuguese => State::root(include_bytes!("../tries/pt.bin")), 334 | #[cfg(feature = "russian")] 335 | Self::Russian => State::root(include_bytes!("../tries/ru.bin")), 336 | #[cfg(feature = "serbian")] 337 | Self::Serbian => State::root(include_bytes!("../tries/sr.bin")), 338 | #[cfg(feature = "slovak")] 339 | Self::Slovak => State::root(include_bytes!("../tries/sk.bin")), 340 | #[cfg(feature = "slovenian")] 341 | Self::Slovenian => State::root(include_bytes!("../tries/sl.bin")), 342 | #[cfg(feature = "spanish")] 343 | Self::Spanish => State::root(include_bytes!("../tries/es.bin")), 344 | #[cfg(feature = "swedish")] 345 | Self::Swedish => State::root(include_bytes!("../tries/sv.bin")), 346 | #[cfg(feature = "turkish")] 347 | Self::Turkish => State::root(include_bytes!("../tries/tr.bin")), 348 | #[cfg(feature = "turkmen")] 349 | Self::Turkmen => State::root(include_bytes!("../tries/tk.bin")), 350 | #[cfg(feature = "ukrainian")] 351 | Self::Ukrainian => State::root(include_bytes!("../tries/uk.bin")), 352 | } 353 | } 354 | } 355 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | /*! 2 | _hypher_ separates words into syllables. 3 | 4 | # Features 5 | - All-inclusive: Hyphenation patterns are embedded into the binary as 6 | efficiently encoded finite automata at build time. 7 | - Zero load time: Hyphenation automata operate directly over the embedded 8 | binary data with no up-front decoding. 9 | - No allocations unless when hyphenating very long words (> 45 bytes). You can 10 | disable the `alloc` feature, but then overly long words lead to a panic. 11 | - Support for many languages. 12 | - No unsafe code, no dependencies, no std. 13 | 14 | # Example 15 | */ 16 | #![cfg_attr( 17 | feature = "alloc", 18 | doc = r##" 19 | ```rust 20 | use hypher::{hyphenate, Lang}; 21 | 22 | let mut syllables = hyphenate("extensive", Lang::English); 23 | assert_eq!(syllables.join("-"), "ex-ten-sive"); 24 | ``` 25 | "## 26 | )] 27 | #![cfg_attr( 28 | not(feature = "alloc"), 29 | doc = r##" 30 | ```rust 31 | use hypher::{hyphenate, Lang}; 32 | 33 | let mut syllables = hyphenate("extensive", Lang::English); 34 | assert_eq!(syllables.next(), Some("ex")); 35 | assert_eq!(syllables.next(), Some("ten")); 36 | assert_eq!(syllables.next(), Some("sive")); 37 | assert_eq!(syllables.next(), None); 38 | ``` 39 | "## 40 | )] 41 | /*! 42 | # Languages 43 | By default, this crate supports hyphenating more than 30 languages. 44 | Embedding automata for all these languages will add ~1.1 MiB to your binary. 45 | Alternatively, you can disable support for all languages and manually choose 46 | which ones get added: 47 | 48 | ```toml 49 | [dependencies] 50 | hypher = { version = "0.1", default-features = false, features = ["english", "greek"] } 51 | ``` 52 | */ 53 | 54 | #![no_std] 55 | #![forbid(unsafe_code)] 56 | #![deny(missing_docs)] 57 | 58 | #[cfg(any(feature = "alloc", test))] 59 | extern crate alloc; 60 | 61 | use core::fmt::{self, Debug, Formatter}; 62 | use core::iter::FusedIterator; 63 | use core::num::NonZeroU8; 64 | 65 | // Include language data. 66 | include!("lang.rs"); 67 | 68 | /// Segment a word into syllables. 69 | /// 70 | /// Returns an iterator over the syllables. 71 | /// 72 | /// This uses the default [bounds](Lang::bounds) for the language. 73 | /// 74 | /// # Panics 75 | /// Panics if the word is more than [`MAX_INLINE_SIZE`] bytes long and the `alloc` 76 | /// feature is disabled. 77 | /// 78 | /// # Example 79 | /// ``` 80 | /// # use hypher::{hyphenate, Lang}; 81 | /// let mut syllables = hyphenate("extensive", Lang::English); 82 | /// assert_eq!(syllables.next(), Some("ex")); 83 | /// assert_eq!(syllables.next(), Some("ten")); 84 | /// assert_eq!(syllables.next(), Some("sive")); 85 | /// assert_eq!(syllables.next(), None); 86 | /// # assert_eq!(syllables.next(), None); 87 | /// ``` 88 | pub fn hyphenate(word: &str, lang: Lang) -> Syllables<'_> { 89 | let (left_min, right_min) = lang.bounds(); 90 | hyphenate_bounded(word, lang, left_min, right_min) 91 | } 92 | 93 | /// Segment a word into syllables, but forbid breaking between the given number 94 | /// of chars to each side. 95 | /// 96 | /// Returns an iterator over the syllables. 97 | /// 98 | /// # Panics 99 | /// Panics if the word is more than [`MAX_INLINE_SIZE`] bytes long and the `alloc` 100 | /// feature is disabled. 101 | /// 102 | /// # Example 103 | /// By setting the left bound to three, we forbid the possible break between 104 | /// `ex` and `ten`. 105 | /// ``` 106 | /// # use hypher::{hyphenate_bounded, Lang}; 107 | /// let mut syllables = hyphenate_bounded("extensive", Lang::English, 3, 1); 108 | /// assert_eq!(syllables.next(), Some("exten")); 109 | /// assert_eq!(syllables.next(), Some("sive")); 110 | /// assert_eq!(syllables.next(), None); 111 | /// ``` 112 | pub fn hyphenate_bounded( 113 | word: &str, 114 | lang: Lang, 115 | left_min: usize, 116 | right_min: usize, 117 | ) -> Syllables<'_> { 118 | // Initialize the trie state for the language. 119 | let root = lang.root(); 120 | 121 | // Lowercase and add dots before and after the word.. 122 | let dotted = lowercase_and_dot(word); 123 | let dotted = dotted.as_slice(); 124 | 125 | // Convert char bounds to byte bounds in the dotted word. 126 | let (min_idx, max_idx) = char_to_byte_bounds(word, left_min, right_min); 127 | 128 | // The levels between each two inner bytes of the word. 129 | let mut levels = Bytes::zeros(word.len().saturating_sub(1)); 130 | let levels_mut = levels.as_mut_slice(); 131 | 132 | // Start pattern matching at each character boundary. 133 | for start in 0..dotted.len() { 134 | if !is_char_boundary(dotted[start]) { 135 | continue; 136 | } 137 | 138 | let mut state = root; 139 | for &b in &dotted[start..] { 140 | if let Some(next) = state.transition(b) { 141 | state = next; 142 | for (offset, level) in state.levels() { 143 | let split = start + offset; 144 | 145 | // Example 146 | // 147 | // Dotted: . h e l l o . 148 | // Levels: 0 2 3 0 149 | if split >= min_idx && split <= max_idx { 150 | let slot = &mut levels_mut[split - 2]; 151 | *slot = (*slot).max(level); 152 | } 153 | } 154 | } else { 155 | break; 156 | } 157 | } 158 | } 159 | 160 | // Break into segments at odd levels. 161 | Syllables { word, cursor: 0, levels } 162 | } 163 | 164 | /// Lowercase a word and add dots before and after it. 165 | /// 166 | /// The dots enable patterns that match based on whether they are at the edges 167 | /// of the word. 168 | fn lowercase_and_dot(word: &str) -> Bytes { 169 | let mut dotted = Bytes::zeros(word.len() + 2); 170 | let dotted_mut = dotted.as_mut_slice(); 171 | dotted_mut[0] = b'.'; 172 | 173 | // Add the lowercased chars. 174 | let mut offset = 1; 175 | for mut c in word.chars() { 176 | let mut lower = c.to_lowercase(); 177 | if let (Some(l), None) = (lower.next(), lower.next()) { 178 | if l.len_utf8() == c.len_utf8() { 179 | c = l; 180 | } 181 | } 182 | offset += c.encode_utf8(&mut dotted_mut[offset..]).len(); 183 | } 184 | 185 | debug_assert_eq!(offset, word.len() + 1); 186 | dotted_mut[offset] = b'.'; 187 | dotted 188 | } 189 | 190 | /// Convert char bounds to byte bounds in the dotted word. 191 | fn char_to_byte_bounds(word: &str, left_min: usize, right_min: usize) -> (usize, usize) { 192 | // It makes no sense to split outside the word. 193 | let left_min = left_min.max(1); 194 | let right_min = right_min.max(1); 195 | 196 | // Convert from chars to byte indices in the dotted word. 197 | let min_idx = 1 + word.chars().take(left_min).map(char::len_utf8).sum::(); 198 | let max_idx = 1 + word.len() 199 | - word.chars().rev().take(right_min).map(char::len_utf8).sum::(); 200 | 201 | (min_idx, max_idx) 202 | } 203 | 204 | /// An iterator over the syllables of a word. 205 | /// 206 | /// This struct is created by [`hyphenate`] and [`hyphenate_bounded`]. 207 | #[derive(Debug, Clone)] 208 | pub struct Syllables<'a> { 209 | word: &'a str, 210 | cursor: usize, 211 | levels: Bytes, 212 | } 213 | 214 | impl Syllables<'_> { 215 | /// Join the syllables with a separator like a hyphen or soft hyphen. 216 | /// 217 | /// This is only available when the `alloc` feature is enabled. 218 | /// 219 | /// # Example 220 | /// Adding soft hyphens at every opportunity. 221 | /// ``` 222 | /// # use hypher::{hyphenate, Lang}; 223 | /// # let joined = 224 | /// hyphenate("wonderful", Lang::English).join("\u{ad}"); 225 | /// # assert_eq!(joined, "won\u{ad}der\u{ad}ful") 226 | /// ``` 227 | #[cfg(any(feature = "alloc", test))] 228 | pub fn join(mut self, sep: &str) -> alloc::string::String { 229 | let extra = self.splits() * sep.len(); 230 | let mut s = alloc::string::String::with_capacity(self.word.len() + extra); 231 | s.extend(self.next()); 232 | for syllable in self { 233 | s.push_str(sep); 234 | s.push_str(syllable); 235 | } 236 | s 237 | } 238 | 239 | /// The remaining number of splits in the word. 240 | fn splits(&self) -> usize { 241 | self.levels.as_slice().iter().filter(|&lvl| lvl % 2 == 1).count() 242 | } 243 | } 244 | 245 | impl<'a> Iterator for Syllables<'a> { 246 | type Item = &'a str; 247 | 248 | fn next(&mut self) -> Option { 249 | let found = self.levels.any(|lvl| lvl % 2 == 1); 250 | let start = self.cursor; 251 | let end = self.word.len() - self.levels.len() - found as usize; 252 | self.cursor = end; 253 | (start < end).then(|| &self.word[start..end]) 254 | } 255 | 256 | fn size_hint(&self) -> (usize, Option) { 257 | let len = if self.word.is_empty() { 0 } else { 1 + self.splits() }; 258 | (len, Some(len)) 259 | } 260 | } 261 | 262 | impl ExactSizeIterator for Syllables<'_> {} 263 | 264 | impl FusedIterator for Syllables<'_> {} 265 | 266 | /// The maximum size (in bytes) of words that may be hyphenated without 267 | /// allocating. 268 | pub const MAX_INLINE_SIZE: usize = 45; 269 | const INLINE_BUF_SIZE: usize = MAX_INLINE_SIZE + 2; // +2 for dots 270 | 271 | /// Storage for and iterator over bytes. 272 | #[derive(Clone)] 273 | enum Bytes { 274 | Array([u8; INLINE_BUF_SIZE], NonZeroU8), 275 | #[cfg(feature = "alloc")] 276 | Vec(alloc::vec::IntoIter), 277 | } 278 | 279 | impl Bytes { 280 | /// Create zero-initialized bytes. 281 | fn zeros(len: usize) -> Self { 282 | if len <= INLINE_BUF_SIZE { 283 | // MAX+1-MAX is still nonzero, we can unwrap 284 | let start = NonZeroU8::new(INLINE_BUF_SIZE as u8 + 1 - len as u8).unwrap(); 285 | Self::Array([0; INLINE_BUF_SIZE], start) 286 | } else { 287 | #[cfg(not(feature = "alloc"))] 288 | panic!( 289 | "hypher: maximum word length is {MAX_INLINE_SIZE} bytes when `alloc` is disabled" 290 | ); 291 | 292 | #[cfg(feature = "alloc")] 293 | Self::Vec(alloc::vec![0; len].into_iter()) 294 | } 295 | } 296 | 297 | /// Access the bytes as a slice. 298 | fn as_slice(&self) -> &[u8] { 299 | match self { 300 | Self::Array(arr, start) => &arr[start.get() as usize - 1..], 301 | #[cfg(feature = "alloc")] 302 | Self::Vec(iter) => iter.as_slice(), 303 | } 304 | } 305 | 306 | /// Access the bytes as a mutable slice. 307 | fn as_mut_slice(&mut self) -> &mut [u8] { 308 | match self { 309 | Self::Array(arr, start) => &mut arr[start.get() as usize - 1..], 310 | #[cfg(feature = "alloc")] 311 | Self::Vec(iter) => iter.as_mut_slice(), 312 | } 313 | } 314 | } 315 | 316 | impl Iterator for Bytes { 317 | type Item = u8; 318 | 319 | fn next(&mut self) -> Option { 320 | match self { 321 | Self::Array(arr, start) => { 322 | let index = start.get() as usize - 1; 323 | if index < INLINE_BUF_SIZE { 324 | *start = start.saturating_add(1); // Will never reach 255 anyways. 325 | Some(arr[index]) 326 | } else { 327 | None 328 | } 329 | } 330 | #[cfg(feature = "alloc")] 331 | Self::Vec(iter) => iter.next(), 332 | } 333 | } 334 | 335 | fn size_hint(&self) -> (usize, Option) { 336 | match self { 337 | Self::Array(..) => (self.as_slice().len(), Some(self.as_slice().len())), 338 | #[cfg(feature = "alloc")] 339 | Self::Vec(iter) => iter.size_hint(), 340 | } 341 | } 342 | } 343 | 344 | impl ExactSizeIterator for Bytes {} 345 | 346 | impl Debug for Bytes { 347 | fn fmt(&self, f: &mut Formatter) -> fmt::Result { 348 | self.as_slice().fmt(f) 349 | } 350 | } 351 | 352 | /// A state in a trie traversal. 353 | #[derive(Copy, Clone)] 354 | struct State<'a> { 355 | data: &'a [u8], 356 | addr: usize, 357 | stride: usize, 358 | levels: &'a [u8], 359 | trans: &'a [u8], 360 | targets: &'a [u8], 361 | } 362 | 363 | impl<'a> State<'a> { 364 | /// Create a new state at the root node. 365 | #[allow(unused)] 366 | fn root(data: &'a [u8]) -> Self { 367 | let bytes = data[..4].try_into().unwrap(); 368 | let addr = u32::from_be_bytes(bytes) as usize; 369 | Self::at(data, addr) 370 | } 371 | 372 | /// Create a new state at the given node address. 373 | fn at(data: &'a [u8], addr: usize) -> Self { 374 | let node = &data[addr..]; 375 | let mut pos = 0; 376 | 377 | // Decode whether the state has levels and the transition count. 378 | let has_levels = node[pos] >> 7 != 0; 379 | let stride = usize::from((node[pos] >> 5) & 3); 380 | let mut count = usize::from(node[pos] & 31); 381 | pos += 1; 382 | 383 | // Possibly decode high transition count. 384 | if count == 31 { 385 | count = usize::from(node[pos]); 386 | pos += 1; 387 | } 388 | 389 | // Decode the levels. 390 | let mut levels: &[u8] = &[]; 391 | if has_levels { 392 | let offset_hi = usize::from(node[pos]) << 4; 393 | let offset_lo = usize::from(node[pos + 1]) >> 4; 394 | let offset = offset_hi | offset_lo; 395 | let len = usize::from(node[pos + 1] & 15); 396 | levels = &data[offset..offset + len]; 397 | pos += 2; 398 | } 399 | 400 | // Decode the transitions. 401 | let trans = &node[pos..pos + count]; 402 | pos += count; 403 | 404 | // Decode the targets. 405 | let targets = &node[pos..pos + stride * count]; 406 | Self { data, addr, stride, levels, trans, targets } 407 | } 408 | 409 | /// Return the state reached by following the transition labelled `b`. 410 | /// Returns `None` if there is no such state. 411 | fn transition(self, b: u8) -> Option { 412 | self.trans.iter().position(|&x| x == b).map(|idx| { 413 | let offset = self.stride * idx; 414 | let delta = from_be_bytes(&self.targets[offset..offset + self.stride]); 415 | let next = (self.addr as isize + delta) as usize; 416 | Self::at(self.data, next) 417 | }) 418 | } 419 | 420 | /// Returns the levels contained in the state. 421 | fn levels(self) -> impl Iterator + 'a { 422 | let mut offset = 0; 423 | self.levels.iter().map(move |&packed| { 424 | let dist = usize::from(packed / 10); 425 | let level = packed % 10; 426 | offset += dist; 427 | (offset, level) 428 | }) 429 | } 430 | } 431 | 432 | /// Decode a signed number with 1, 2 or 3 bytes. 433 | fn from_be_bytes(buf: &[u8]) -> isize { 434 | if let Ok(array) = buf.try_into() { 435 | i8::from_be_bytes(array) as isize 436 | } else if let Ok(array) = buf.try_into() { 437 | i16::from_be_bytes(array) as isize 438 | } else if buf.len() == 3 { 439 | let first = usize::from(buf[0]) << 16; 440 | let second = usize::from(buf[1]) << 8; 441 | let third = usize::from(buf[2]); 442 | let unsigned = first | second | third; 443 | unsigned as isize - (1 << 23) 444 | } else { 445 | panic!("invalid stride"); 446 | } 447 | } 448 | 449 | /// Whether a byte is a character boundary. 450 | fn is_char_boundary(b: u8) -> bool { 451 | (b as i8) >= -0x40 452 | } 453 | 454 | #[cfg(test)] 455 | mod tests { 456 | use super::{hyphenate, Lang, MAX_INLINE_SIZE}; 457 | 458 | #[allow(unused)] 459 | use Lang::*; 460 | 461 | #[allow(unused)] 462 | fn test(lang: Lang, hyphenated: &str) { 463 | let word = hyphenated.replace('-', ""); 464 | let syllables = hyphenate(&word, lang); 465 | assert_eq!(syllables.join("-"), hyphenated); 466 | } 467 | 468 | #[test] 469 | #[cfg(feature = "english")] 470 | fn test_empty() { 471 | let mut syllables = hyphenate("", English); 472 | assert_eq!(syllables.next(), None); 473 | } 474 | 475 | #[test] 476 | #[cfg(feature = "english")] 477 | fn test_exact() { 478 | assert_eq!(hyphenate("", English).len(), 0); 479 | assert_eq!(hyphenate("hello", English).len(), 1); 480 | assert_eq!(hyphenate("extensive", English).len(), 3); 481 | } 482 | 483 | const LONG_WORD: &str = "thisisaverylongstringwithanunrealisticwordlengthforenglishbutitmightbepossibleinanotherlanguage"; 484 | 485 | #[test] 486 | #[cfg(all(feature = "english", feature = "alloc"))] 487 | fn test_alloc() { 488 | assert_eq!(hyphenate(&LONG_WORD[..MAX_INLINE_SIZE - 1], English).len(), 13); 489 | assert_eq!(hyphenate(&LONG_WORD[..MAX_INLINE_SIZE], English).len(), 12); 490 | assert_eq!(hyphenate(&LONG_WORD[..MAX_INLINE_SIZE + 1], English).len(), 12); 491 | assert_eq!(hyphenate(LONG_WORD, English).len(), 25); 492 | } 493 | 494 | #[test] 495 | #[cfg(all(feature = "english", not(feature = "alloc")))] 496 | fn test_nonalloc() { 497 | _ = hyphenate(&LONG_WORD[..MAX_INLINE_SIZE], English).count(); 498 | } 499 | #[test] 500 | #[should_panic] 501 | #[cfg(all(feature = "english", not(feature = "alloc")))] 502 | fn test_nonalloc_fail() { 503 | _ = hyphenate(&LONG_WORD[..MAX_INLINE_SIZE + 1], English).count(); 504 | } 505 | 506 | #[test] 507 | #[cfg(feature = "english")] 508 | fn test_english() { 509 | test(English, ""); 510 | test(English, "hi"); 511 | test(English, "wel-come"); 512 | test(English, "walk-ing"); 513 | test(English, "cap-tiVe"); 514 | test(English, "pur-sue"); 515 | test(English, "wHaT-eVeR"); 516 | test(English, "bro-ken"); 517 | test(English, "ex-ten-sive"); 518 | test(English, "Prob-a-bil-ity"); 519 | test(English, "rec-og-nize"); 520 | } 521 | 522 | #[test] 523 | #[cfg(feature = "german")] 524 | fn test_german() { 525 | test(German, ""); 526 | test(German, "Baum"); 527 | test(German, "ge-hen"); 528 | test(German, "Ap-fel"); 529 | test(German, "To-ma-te"); 530 | test(German, "Ein-ga-be-auf-for-de-rung"); 531 | test(German, "Fort-pflan-zungs-lem-ma"); 532 | test(German, "stra-te-gie-er-hal-ten-den"); 533 | test(German, "hübsch"); 534 | test(German, "häss-lich"); 535 | test(German, "über-zeu-gen-der"); 536 | } 537 | 538 | #[test] 539 | #[cfg(feature = "greek")] 540 | fn test_greek() { 541 | test(Greek, "δια-με-ρί-σμα-τα"); 542 | test(Greek, "λα-τρευ-τός"); 543 | test(Greek, "κά-τοι-κος"); 544 | } 545 | 546 | #[test] 547 | #[cfg(feature = "georgian")] 548 | fn test_georgian() { 549 | test(Georgian, "თა-რო"); 550 | test(Georgian, "შეყ-ვა-ნა"); 551 | test(Georgian, "კარ-ტო-ფი-ლი"); 552 | } 553 | 554 | #[test] 555 | #[cfg(feature = "polish")] 556 | fn test_polish() { 557 | test(Polish, "wy-kształ-ciu-chy"); 558 | } 559 | 560 | #[test] 561 | #[cfg(feature = "czech")] 562 | fn test_czech() { 563 | test(Czech, "po-ví-dá-me"); 564 | test(Czech, "nej-ja-s-něj-ší"); 565 | test(Czech, "br-něn-ský"); 566 | } 567 | } 568 | -------------------------------------------------------------------------------- /tests/generate.rs: -------------------------------------------------------------------------------- 1 | #![allow(clippy::type_complexity)] 2 | 3 | use std::collections::HashMap; 4 | use std::fmt::{self, Write}; 5 | use std::fs; 6 | use std::path::Path; 7 | 8 | #[test] 9 | fn generate_code() { 10 | let mut languages: [(&str, &str, &[&str], &str, &str, u8, u8); 35] = [ 11 | ("Afrikaans", "af", &[], "Latn", "hyph-af.tex", 1, 2), 12 | ("Belarusian", "be", &[], "Cyrl", "hyph-be.tex", 2, 2), 13 | ("Bulgarian", "bg", &[], "Cyrl", "hyph-bg.tex", 2, 2), 14 | ("Catalan", "ca", &[], "Latn", "hyph-ca.tex", 2, 2), 15 | ("Czech", "cs", &[], "Latn", "hyph-cs-sojka.tex", 2, 2), 16 | ("Danish", "da", &[], "Latn", "hyph-da.tex", 2, 2), 17 | ("German", "de", &[], "Latn", "hyph-de-1996.tex", 2, 2), 18 | ("Greek", "el", &[], "Grek", "hyph-el-monoton.tex", 1, 1), 19 | ("English", "en", &[], "Latn", "hyph-en-us.tex", 2, 3), 20 | ("Spanish", "es", &[], "Latn", "hyph-es.tex", 2, 2), 21 | ("Estonian", "et", &[], "Latn", "hyph-et.tex", 2, 3), 22 | ("Finnish", "fi", &[], "Latn", "hyph-fi.tex", 2, 2), 23 | ("French", "fr", &[], "Latn", "hyph-fr.tex", 2, 2), 24 | ("Croatian", "hr", &[], "Latn", "hyph-hr.tex", 2, 2), 25 | ("Hungarian", "hu", &[], "Latn", "hyph-hu.tex", 2, 2), 26 | ("Icelandic", "is", &[], "Latn", "hyph-is.tex", 2, 2), 27 | ("Italian", "it", &[], "Latn", "hyph-it.tex", 2, 2), 28 | ("Georgian", "ka", &[], "Geor", "hyph-ka.tex", 1, 2), 29 | ("Kurmanji", "ku", &[], "Latn", "hyph-kmr.tex", 2, 2), 30 | ("Latin", "la", &[], "Latn", "hyph-la.tex", 2, 2), 31 | ("Lithuanian", "lt", &[], "Latn", "hyph-lt.tex", 2, 2), 32 | ("Mongolian", "mn", &[], "Cyrl", "hyph-mn.tex", 2, 2), 33 | ("Dutch", "nl", &[], "Latn", "hyph-nl.tex", 2, 2), 34 | ("Norwegian", "no", &["nb", "nn"], "Latn", "hyph-no.tex", 2, 2), 35 | ("Polish", "pl", &[], "Latn", "hyph-pl.tex", 2, 2), 36 | ("Portuguese", "pt", &[], "Latn", "hyph-pt.tex", 2, 3), 37 | ("Russian", "ru", &[], "Cyrl", "hyph-ru.tex", 2, 2), 38 | ("Serbian", "sr", &[], "Cyrl", "hyph-sh-cyrl.tex", 2, 2), 39 | ("Slovak", "sk", &[], "Latn", "hyph-sk.tex", 2, 3), 40 | ("Slovenian", "sl", &[], "Latn", "hyph-sl.tex", 2, 2), 41 | ("Albanian", "sq", &[], "Latn", "hyph-sq.tex", 2, 2), 42 | ("Swedish", "sv", &[], "Latn", "hyph-sv.tex", 2, 2), 43 | ("Turkmen", "tk", &[], "Latn", "hyph-tk.tex", 2, 2), 44 | ("Turkish", "tr", &[], "Latn", "hyph-tr.tex", 2, 2), 45 | ("Ukrainian", "uk", &[], "Cyrl", "hyph-uk.tex", 2, 2), 46 | ]; 47 | 48 | languages.sort(); 49 | 50 | // Build the tries. 51 | let mut fresh = true; 52 | for (_, iso, _, _, filename, ..) in languages { 53 | let path = Path::new("patterns").join(filename); 54 | let tex = fs::read_to_string(&path).unwrap(); 55 | let mut builder = TrieBuilder::new(); 56 | parse(&tex, |pat| builder.insert(pat)); 57 | builder.compress(); 58 | let trie = builder.encode(); 59 | let path = format!("tries/{iso}.bin"); 60 | fresh &= write_check(&path, trie); 61 | } 62 | 63 | // Build the lang.rs file. 64 | let mut text = String::new(); 65 | write_lang(&mut text, &languages).unwrap(); 66 | fresh &= write_check("src/lang.rs", text.into_bytes()); 67 | 68 | if !fresh { 69 | panic!("Trie data or generated code was outdated."); 70 | } 71 | } 72 | 73 | fn write_check(path: &str, data: Vec) -> bool { 74 | let prev = fs::read(path).unwrap_or_default(); 75 | fs::write(path, &data).unwrap(); 76 | prev == data 77 | } 78 | 79 | fn write_lang( 80 | w: &mut String, 81 | languages: &[(&str, &str, &[&str], &str, &str, u8, u8)], 82 | ) -> fmt::Result { 83 | writeln!(w, "// This file is generated by tests/generate.rs")?; 84 | writeln!(w, "// Do not edit by hand!")?; 85 | writeln!(w)?; 86 | 87 | writeln!(w, "/// A language you can hyphenate in.")?; 88 | writeln!(w, "///")?; 89 | writeln!(w, "/// Lists for each language also the ISO 639-1 two")?; 90 | writeln!(w, "/// letter language code and the ISO 15924 four letter")?; 91 | writeln!(w, "/// script code.")?; 92 | writeln!(w, "#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]")?; 93 | writeln!(w, "#[non_exhaustive]")?; 94 | writeln!(w, "pub enum Lang {{")?; 95 | 96 | for &(name, iso, isos, script, ..) in languages { 97 | let feature = name.to_lowercase(); 98 | write!(w, " /// Hyphenation for _{name}._ (Code: `{iso}`, ")?; 99 | for code in isos { 100 | write!(w, "Alias: `{code}`, ")?; 101 | } 102 | writeln!(w, "Script, `{script}`, Feature: `{feature}`)")?; 103 | write!(w, " ")?; 104 | write_cfg(w, &feature)?; 105 | writeln!(w, " {name},")?; 106 | } 107 | 108 | writeln!(w, "}}")?; 109 | writeln!(w)?; 110 | 111 | writeln!(w, "impl Lang {{")?; 112 | 113 | // Implementation of `from_iso`. 114 | writeln!(w, " /// Select a language using its ISO 639-1 code.")?; 115 | writeln!(w, " pub fn from_iso(code: [u8; 2]) -> Option {{")?; 116 | writeln!(w, " match &code {{")?; 117 | for &(name, iso, isos, ..) in languages { 118 | let feature = name.to_lowercase(); 119 | write!(w, " ")?; 120 | write_cfg(w, &feature)?; 121 | writeln!(w, r#" b"{iso}" => Some(Self::{name}),"#)?; 122 | for code in isos { 123 | write!(w, " ")?; 124 | write_cfg(w, &feature)?; 125 | writeln!(w, r#" b"{code}" => Some(Self::{name}),"#)?; 126 | } 127 | } 128 | writeln!(w, " _ => None,")?; 129 | writeln!(w, " }}")?; 130 | writeln!(w, " }}")?; 131 | writeln!(w)?; 132 | 133 | // Implementation of `bounds`. 134 | writeln!(w, " /// The default number of chars to each side between")?; 135 | writeln!(w, " /// which breaking is forbidden.")?; 136 | writeln!(w, " ///")?; 137 | writeln!(w, " /// This follows typographic conventions.")?; 138 | writeln!(w, " pub fn bounds(self) -> (usize, usize) {{")?; 139 | writeln!(w, " match self {{")?; 140 | for (name, .., lmin, rmin) in languages { 141 | let feature = name.to_lowercase(); 142 | write!(w, " ")?; 143 | write_cfg(w, &feature)?; 144 | writeln!(w, " Self::{name} => ({lmin}, {rmin}),")?; 145 | } 146 | writeln!(w, " }}")?; 147 | writeln!(w, " }}")?; 148 | writeln!(w)?; 149 | 150 | // Implementation of `root`. 151 | writeln!(w, " fn root(self) -> State<'static> {{")?; 152 | writeln!(w, " match self {{")?; 153 | for (name, iso, ..) in languages { 154 | let feature = name.to_lowercase(); 155 | write!(w, " ")?; 156 | write_cfg(w, &feature)?; 157 | write!(w, " Self::{name} => State::root(")?; 158 | writeln!(w, "include_bytes!(\"../tries/{iso}.bin\")),")?; 159 | } 160 | writeln!(w, " }}")?; 161 | writeln!(w, " }}")?; 162 | writeln!(w, "}}") 163 | } 164 | 165 | fn write_cfg(w: &mut String, feature: &str) -> fmt::Result { 166 | writeln!(w, r#"#[cfg(feature = "{feature}")]"#) 167 | } 168 | 169 | /// Parse a TeX pattern file, calling `f` with each pattern. 170 | pub fn parse(tex: &str, mut f: F) 171 | where 172 | F: FnMut(&str), 173 | { 174 | let mut s = Scanner(tex); 175 | while let Some(c) = s.eat() { 176 | match c { 177 | '%' => { 178 | s.eat_while(|c| c != '\n'); 179 | } 180 | '\\' if s.eat_if("patterns{") => loop { 181 | let pat = s.eat_while(|c| c != '}' && c != '%' && !c.is_whitespace()); 182 | if !pat.is_empty() { 183 | f(pat); 184 | } 185 | match s.eat() { 186 | Some('}') => break, 187 | Some('%') => s.eat_while(|c| c != '\n'), 188 | _ => s.eat_while(char::is_whitespace), 189 | }; 190 | }, 191 | _ => {} 192 | } 193 | } 194 | } 195 | 196 | struct Scanner<'a>(&'a str); 197 | 198 | impl<'a> Scanner<'a> { 199 | fn eat(&mut self) -> Option { 200 | let mut chars = self.0.chars(); 201 | let c = chars.next(); 202 | self.0 = chars.as_str(); 203 | c 204 | } 205 | 206 | fn eat_if(&mut self, pat: &str) -> bool { 207 | let matches = self.0.starts_with(pat); 208 | if matches { 209 | self.0 = &self.0[pat.len()..]; 210 | } 211 | matches 212 | } 213 | 214 | fn eat_while(&mut self, f: fn(char) -> bool) -> &'a str { 215 | let mut offset = 0; 216 | let mut chars = self.0.chars(); 217 | while chars.next().map_or(false, f) { 218 | offset = self.0.len() - chars.as_str().len(); 219 | } 220 | let head = &self.0[..offset]; 221 | self.0 = &self.0[offset..]; 222 | head 223 | } 224 | } 225 | 226 | /// Builds a trie from patterns. 227 | struct TrieBuilder { 228 | root: usize, 229 | nodes: Vec, 230 | levels: Vec<(usize, u8)>, 231 | } 232 | 233 | /// A node in the trie. 234 | #[derive(Debug, Default, Clone, PartialEq, Eq, Hash)] 235 | struct Node { 236 | trans: Vec, 237 | targets: Vec, 238 | levels: Option<(usize, usize)>, 239 | } 240 | 241 | impl TrieBuilder { 242 | /// Create a new trie with just the root node. 243 | fn new() -> Self { 244 | Self { 245 | root: 0, 246 | nodes: vec![Node::default()], 247 | levels: vec![], 248 | } 249 | } 250 | 251 | /// Insert a pattern like `.a1bc2d` into the trie. 252 | fn insert(&mut self, pattern: &str) { 253 | let mut state = 0; 254 | let mut dist = 0; 255 | let mut levels = vec![]; 256 | 257 | // Follow the existing transitions / add new ones. 258 | for b in pattern.bytes() { 259 | if b.is_ascii_digit() { 260 | levels.push((dist, b - b'0')); 261 | dist = 0; 262 | } else { 263 | let len = self.nodes.len(); 264 | let node = &mut self.nodes[state]; 265 | if let Some(i) = node.trans.iter().position(|&x| x == b) { 266 | state = node.targets[i]; 267 | } else { 268 | node.trans.push(b); 269 | node.targets.push(len); 270 | state = len; 271 | self.nodes.push(Node::default()); 272 | } 273 | dist += 1; 274 | } 275 | } 276 | 277 | // Try to reuse existing levels. 278 | let mut offset = 0; 279 | while offset < self.levels.len() && !self.levels[offset..].starts_with(&levels) { 280 | offset += 1; 281 | } 282 | 283 | // If there was no matching level "substring", we must append the new 284 | // levels at the end. 285 | if offset == self.levels.len() { 286 | self.levels.extend(&levels); 287 | } 288 | 289 | // Add levels for the final node. 290 | self.nodes[state].levels = Some((offset, levels.len())); 291 | } 292 | 293 | /// Perform suffix compression on the trie. 294 | fn compress(&mut self) { 295 | let mut map = HashMap::new(); 296 | let mut new = vec![]; 297 | self.root = self.compress_node(0, &mut map, &mut new); 298 | self.nodes = new; 299 | } 300 | 301 | /// Recursively compress a node. 302 | fn compress_node( 303 | &self, 304 | node: usize, 305 | map: &mut HashMap, 306 | new: &mut Vec, 307 | ) -> usize { 308 | let mut x = self.nodes[node].clone(); 309 | for target in x.targets.iter_mut() { 310 | *target = self.compress_node(*target, map, new); 311 | } 312 | *map.entry(x.clone()).or_insert_with(|| { 313 | let idx = new.len(); 314 | new.push(x); 315 | idx 316 | }) 317 | } 318 | 319 | /// Encode the tree. 320 | fn encode(&self) -> Vec { 321 | let start = 4 + self.levels.len(); 322 | 323 | // Compute an address estimate for each node. We can't know the final 324 | // addresses yet because the addresses depend on the stride of each 325 | // target list and that stride of the target lists depends on the 326 | // addresses. 327 | let mut addr = start; 328 | let mut estimates = vec![]; 329 | for node in &self.nodes { 330 | estimates.push(addr); 331 | addr += 1 332 | + ((node.trans.len() >= 31) as usize) 333 | + 2 * (node.levels.is_some() as usize) 334 | + (1 + 3) * node.trans.len(); 335 | } 336 | 337 | // Use the address estimates to determine how many bytes to use for each 338 | // state and compute the final addresses. 339 | let mut addr = start; 340 | let mut addrs = vec![]; 341 | let mut strides = vec![]; 342 | for (i, node) in self.nodes.iter().enumerate() { 343 | let stride = node 344 | .targets 345 | .iter() 346 | .map(|&t| how_many_bytes(estimates[t] as isize - estimates[i] as isize)) 347 | .max() 348 | .unwrap_or(1); 349 | 350 | addrs.push(addr); 351 | strides.push(stride); 352 | addr += 1 353 | + ((node.trans.len() >= 31) as usize) 354 | + 2 * (node.levels.is_some() as usize) 355 | + (1 + stride) * node.trans.len(); 356 | } 357 | 358 | let mut data = vec![]; 359 | 360 | // Encode the root address. 361 | data.extend(u32::try_from(addrs[self.root]).unwrap().to_be_bytes()); 362 | 363 | // Encode the levels. 364 | for &(dist, level) in &self.levels { 365 | assert!(dist <= 24, "too high level distance"); 366 | assert!(level < 10, "too high level"); 367 | data.push(dist as u8 * 10 + level); 368 | } 369 | 370 | // Encode the nodes. 371 | for ((node, &addr), stride) in self.nodes.iter().zip(&addrs).zip(strides) { 372 | data.push( 373 | (node.levels.is_some() as u8) << 7 374 | | (stride as u8) << 5 375 | | (node.trans.len().min(31) as u8), 376 | ); 377 | 378 | if node.trans.len() >= 31 { 379 | data.push(u8::try_from(node.trans.len()).expect("too many transitions")); 380 | } 381 | 382 | if let Some((offset, len)) = node.levels { 383 | let offset = 4 + offset; 384 | assert!(offset < 4096, "too high level offset"); 385 | assert!(len < 16, "too high level count"); 386 | 387 | let offset_hi = (offset >> 4) as u8; 388 | let offset_lo = ((offset & 15) << 4) as u8; 389 | let len = len as u8; 390 | 391 | data.push(offset_hi); 392 | data.push(offset_lo | len); 393 | } 394 | 395 | data.extend(&node.trans); 396 | 397 | for &target in &node.targets { 398 | let delta = addrs[target] as isize - addr as isize; 399 | to_be_bytes(&mut data, delta, stride); 400 | } 401 | } 402 | 403 | data 404 | } 405 | } 406 | 407 | /// How many bytes are needed to encode a signed number. 408 | fn how_many_bytes(num: isize) -> usize { 409 | if i8::try_from(num).is_ok() { 410 | 1 411 | } else if i16::try_from(num).is_ok() { 412 | 2 413 | } else if (-(1 << 23)..(1 << 23)).contains(&num) { 414 | 3 415 | } else { 416 | panic!("too large number"); 417 | } 418 | } 419 | 420 | /// Encode a signed number with 1, 2 or 3 bytes. 421 | fn to_be_bytes(buf: &mut Vec, num: isize, stride: usize) { 422 | if stride == 1 { 423 | buf.extend(i8::try_from(num).unwrap().to_be_bytes()); 424 | } else if stride == 2 { 425 | buf.extend(i16::try_from(num).unwrap().to_be_bytes()); 426 | } else if stride == 3 { 427 | let unsigned = (num + (1 << 23)) as usize; 428 | buf.push((unsigned >> 16) as u8); 429 | buf.push((unsigned >> 8) as u8); 430 | buf.push(unsigned as u8); 431 | } else { 432 | panic!("invalid stride"); 433 | } 434 | } 435 | -------------------------------------------------------------------------------- /tries/af.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/af.bin -------------------------------------------------------------------------------- /tries/be.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/be.bin -------------------------------------------------------------------------------- /tries/bg.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/bg.bin -------------------------------------------------------------------------------- /tries/ca.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/ca.bin -------------------------------------------------------------------------------- /tries/cs.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/cs.bin -------------------------------------------------------------------------------- /tries/da.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/da.bin -------------------------------------------------------------------------------- /tries/de.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/de.bin -------------------------------------------------------------------------------- /tries/el.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/el.bin -------------------------------------------------------------------------------- /tries/en.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/en.bin -------------------------------------------------------------------------------- /tries/es.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/es.bin -------------------------------------------------------------------------------- /tries/et.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/et.bin -------------------------------------------------------------------------------- /tries/fi.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/fi.bin -------------------------------------------------------------------------------- /tries/fr.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/fr.bin -------------------------------------------------------------------------------- /tries/hr.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/hr.bin -------------------------------------------------------------------------------- /tries/hu.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/hu.bin -------------------------------------------------------------------------------- /tries/is.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/is.bin -------------------------------------------------------------------------------- /tries/it.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/it.bin -------------------------------------------------------------------------------- /tries/ka.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/ka.bin -------------------------------------------------------------------------------- /tries/ku.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/ku.bin -------------------------------------------------------------------------------- /tries/la.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/la.bin -------------------------------------------------------------------------------- /tries/lt.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/lt.bin -------------------------------------------------------------------------------- /tries/mn.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/mn.bin -------------------------------------------------------------------------------- /tries/nl.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/nl.bin -------------------------------------------------------------------------------- /tries/no.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/no.bin -------------------------------------------------------------------------------- /tries/pl.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/pl.bin -------------------------------------------------------------------------------- /tries/pt.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/pt.bin -------------------------------------------------------------------------------- /tries/ru.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/ru.bin -------------------------------------------------------------------------------- /tries/sk.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/sk.bin -------------------------------------------------------------------------------- /tries/sl.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/sl.bin -------------------------------------------------------------------------------- /tries/sq.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/sq.bin -------------------------------------------------------------------------------- /tries/sr.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/sr.bin -------------------------------------------------------------------------------- /tries/sv.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/sv.bin -------------------------------------------------------------------------------- /tries/tk.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/tk.bin -------------------------------------------------------------------------------- /tries/tr.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/tr.bin -------------------------------------------------------------------------------- /tries/uk.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/typst/hypher/5864b75bc2954b048570ff61242438b3537c988e/tries/uk.bin --------------------------------------------------------------------------------