priehlazx 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/priehlazx.rb ADDED
@@ -0,0 +1,510 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require 'yaml'
5
+ require 'rdoba'
6
+ require 'прѣхлажь/version'
7
+
8
+ class Priehlazx
9
+ attr_reader :истокъ, :цѣль
10
+
11
+ # TODO
12
+ # def puts(*args)
13
+ # File.open('slavconv.log','a') do |f| f.puts *args end
14
+ # end
15
+
16
+ @@Знаци = [
17
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
18
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
19
+ 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
20
+ 't', 'u', 'v', 'w', 'x', 'y', 'z', 'Ꙇожъ', 'Ѕело', 'Ѕело зеркаль',
21
+ 'Ѕело мягъ', 'Ѕело ꙁ', 'Азъ', 'Азъ инъ', 'Буки', 'Вѣдѣ', 'Гервь',
22
+ 'Глаголь', 'Глаголь твердъ', 'Гье', 'Дже', 'Дже', 'Добро', 'Добро мягъ',
23
+ 'Добро удлинь', 'Ере', 'Ери', 'Ери еръ', 'Ери еръ', 'Ери еръ съузь',
24
+ 'Ери съузь', 'Ериі', 'Ериі еръ', 'Ериі еръ', 'Ериі еръ съузь',
25
+ 'Ериі съузь', 'Еръ', 'Еръ высъ', 'Еры', 'Еры еръ', 'Еры еръ съузь',
26
+ 'Еры съузь', 'Ерь', 'Есть', 'Есть чажесь', 'Есть шыръ', 'Живете', 'Земля',
27
+ 'Земля ꙁ', 'Иже', 'Иже чажесь', 'Иже ётъ', 'І',
28
+ 'Икъ', 'Како', 'Копа', 'Кье', 'Лье', 'Люди',
29
+ 'Люди мягъ', 'Мыслете', 'Мыслете мягъ', 'Нашъ', 'Нашъ мягъ', 'Нье',
30
+ 'Омега', 'Оникъ', 'Онъ', 'Онъ двоенъ', 'Онъ двоенъ одинокъ',
31
+ 'Онъ съкрестъ', 'Онъ узъ', 'Онъ шыръ', 'Онъ шыръ двуокъ',
32
+ 'Онъ шыръ одинокъ', 'Покои', 'Рьцы', 'Слово', 'Слово подстрочь', 'Твердо',
33
+ 'Твердо высъ', 'Твердо тревысъ', 'Тше', 'Укикъ', 'Укъ', 'Фертъ', 'Хѣръ',
34
+ 'Цы', 'Цы въгнутъ', 'Червь', 'Червь чашевидь', 'Ша', 'Шта', 'Шта въгнутъ',
35
+ 'Ща', 'Ынъ', 'Это', 'Юсъ', 'Юсъ вель', 'Юсъ вель двуногъ', 'Юсъ зеркаль',
36
+ 'Юсъ кратъ', 'Юсъ малъ', 'Юсъ малъ подчёрчь',
37
+ 'Юсъ малъ подъчерчь', 'Юсъ малъ прогнутъ', 'Юсъ средь', 'Я', 'Ѣдь',
38
+ 'Ѣдь высъ', 'Ѣдь предчерчь', 'острецо', 'чажесь', 'двоострецо', 'двочажесь',
39
+ 'кратьцо', 'крапка', 'двокрапка',
40
+ 'азъ', 'азъ выносъ', 'азъ инъ', 'большѣ', 'буки',
41
+ 'буки выносъ', 'вѣдѣ выносъ', 'вершина глася', 'възметна буква',
42
+ 'възметъ', 'возъгласъ', 'возъгласъ вель', 'восемь', 'вранъ',
43
+ 'въводъ', 'вѣдѣ', 'гервь', 'глава Маркова', 'глаголь',
44
+ 'глаголь твердъ', 'глаголь выносъ', 'гье', 'два', 'двоеточіе',
45
+ 'девѧть', 'гервь выносъ', 'дже', 'добро', 'добро выносъ',
46
+ 'добро мягъ', 'добро удлинь', 'дѣлитель', 'ере', 'ери', 'ери еръ съузь',
47
+ 'ери съузь', 'ериі', 'ериі еръ съузь', 'ериі съузь', 'еръ', 'еръ высъ',
48
+ 'еры', 'еры вынось', 'еры еръ', 'еры еръ съузь', 'еры съузь', 'ерь',
49
+ 'ерь вынось', 'есть', 'есть выносъ', 'есть шыръ', 'живете',
50
+ 'живете выносъ', 'запѧта', 'звательцо', 'звёздочка', 'земля',
51
+ 'земля выносъ', 'земля ꙁ', 'знакъ вопрось', 'знакъ воскличь', 'иже',
52
+ 'і', 'икъ', 'ичокъ', 'иже инъ вынось', 'икъ инъ вынось',
53
+ 'кавыка', 'кавыка выносъ', 'кавыкы обратны', 'кавыкы прямы',
54
+ 'кавычь одина', 'како', 'како выносъ', 'колода',
55
+ 'колода', 'копа', 'крест освящающъ', 'крест освящающъ дужь',
56
+ 'крестикъ сносочь', 'крестъ и҃-конечь', 'крестъ и҃-конечь очерчь',
57
+ 'крестъ равносторонъ изразьцъ', 'крестъ равносторонъ изразьцъ въ кругѣ',
58
+ 'крестъ равносторонъ изразьцъ въ нижемъ полукругѣ',
59
+ 'крестъ равносторонъ изразьцъ очерчь въ кругѣ',
60
+ 'крестъ равносторонъ изразьцъ очерчь въ нижемъ полукругѣ',
61
+ 'крестъ равносторонь очерчь изразьцъ', 'кривька', 'ктому', 'кье',
62
+ 'легіонъ', 'леодръ', 'лье', 'люди',
63
+ 'люди выносъ', 'люди мягъ', 'меньшѣ', 'мыслете', 'мыслете выносъ',
64
+ 'мыслете мягъ', 'мѣта', 'нашъ', 'нашъ выносъ', 'нашъ мягъ',
65
+ 'нье', 'обратный дѣлитель', 'один', 'омега', 'оникъ', 'онъ',
66
+ 'онъ выносъ', 'онъ двоенъ', 'онъ двоенъ одинокъ', 'онъ многоокъ',
67
+ 'онъ съкрестъ', 'онъ узъ', 'онъ шыръ', 'онъ шыръ одинокъ',
68
+ 'онъ шыръ одинъкъ', 'запинка глася', 'отого', 'паеръ', 'паеръ выносъ',
69
+ 'палочка', 'переносъ', 'песъ', 'петелка', 'подчеркъ', 'покои',
70
+ 'покои выносъ', 'покрытіе', 'препинаніе а',
71
+ 'препинаніе б', 'препинаніе в', 'препинаніе г', 'препинаніе д',
72
+ 'препинаніе е', 'препинаніе ж', 'пробѣлъ', 'пущь', 'пѧть', 'равно',
73
+ 'распѣвъ въ слогѣ', 'рьцы', 'рьцы выносъ', 'рѣшётка',
74
+ 'семь', 'сирѣчь', 'скобка закрывающа', 'скобка изразьна закрывающа',
75
+ 'скобка изразьна открывающа', 'скобка открывающа',
76
+ 'скобка прямочерта закрывающа', 'скобка прямочерта открывающа', 'слово',
77
+ 'слово выносъ', 'слово подстрочь', 'слово твердо выносъ',
78
+ 'сотка', 'твердо', 'твердо выносъ', 'твердо высъ', 'твердо тревысъ',
79
+ 'точька запята', 'точька', 'три',
80
+ 'троеточіе одесну несоверше окружено',
81
+ 'троеточіе одесну несоверше окружено очерче',
82
+ 'троеточіе ошую несоверше окружено',
83
+ 'троеточіе ошую несоверше окружено очерче', 'тше', 'тысяча', 'тьма',
84
+ 'тьматемъ', 'укикъ', 'укъ', 'укъ выносъ', 'умилительцо',
85
+ 'умноженіе', 'фертъ', 'фертъ вынось', 'ѳита выносъ', 'хѣръ',
86
+ 'хѣръ выносъ', 'цы', 'цы въгнутъ', 'цы выносъ', 'цѧтокъ', 'червь',
87
+ 'червь выносъ', 'червь чашевидь', 'черта', 'четыре', 'ша',
88
+ 'ша выносъ', 'шта', 'шта въгнутъ', 'шесть',
89
+ 'шта выносъ', 'ща', 'ынъ', 'это', 'юсъ', 'юсъ вель',
90
+ 'юсъ вель выносъ', 'юсъ вель двуногъ', 'юсъ выносъ', 'юсъ зеркаль',
91
+ 'юсъ кратъ', 'юсъ малъ', 'юсъ малъ выносъ', 'юсъ малъ подчёрчь',
92
+ 'юсъ малъ подъчерчь', 'юсъ малъ прогнутъ', 'юсъ средь',
93
+ 'я', 'ѣдь', 'ѣдь выносъ', 'ѣдь высъ',
94
+ 'ѣдь предчерчь', 'яма глася', 'ꙇожъ', 'ѕвездочка', 'ѕвездочка сносоча',
95
+ 'ѕело', 'ѕело зеркаль', 'ѕело мягъ', 'ѕело ꙁ', 'Омега веля', 'Омега шыръ',
96
+ 'Отъ', 'омега веля', 'омега шыръ', 'отъ', 'Ксы', 'ксы', 'Псы', 'псы',
97
+ 'Ѳита', 'ѳита', 'Іжица', 'іжица', 'Ꙇазъ', 'Ꙇоть',
98
+ 'Ꙇазъ пречерчь', 'Ꙇі', 'Ꙇюсъ вель', 'Ꙇюсъ малъ',
99
+ 'Ꙇюсъ малъ подчёрчь', 'Ꙇѣдь', 'Ꙇесть',
100
+ 'ꙇазъ', 'ꙇазъ выносъ', 'ꙇазъ пречерчь', 'ꙇоть',
101
+ 'ꙇі', 'ꙇюсъ вель', 'ꙇюсъ вель выносъ', 'ꙇюсъ малъ',
102
+ 'ꙇюсъ малъ подчёрчь', 'ꙇѣдь', 'ꙇесть',
103
+ 'двоскоба шуя', 'двоскоба десна', 'двокавычь нижя', 'двокавычь десна',
104
+ 'двокавычь шуя', 'кавычь шуя', 'кавычь десна', 'кавычь нижя',
105
+ 'подъглавокъ', 'преносъ мягъ', 'кавычь двоина', 'преносъ', 'вдохъ', 'стои',
106
+ 'закавыка', 'уголъ', 'придыхъ', 'движеніе гласа восходяще',
107
+ 'движеніе гласа нисходяще', 'запинка пѣнія',
108
+ 'преносъ долъгъ',
109
+ ]
110
+
111
+ Useful = [
112
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
113
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
114
+ 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
115
+ 't', 'u', 'v', 'w', 'x', 'y', 'z', 'Ꙇожъ', 'Ѕело', 'Ѕело зеркаль',
116
+ 'Ѕело мягъ', 'Ѕело ꙁ', 'Азъ', 'Азъ инъ', 'Буки', 'Вѣдѣ', 'Гервь',
117
+ 'Глаголь', 'Глаголь твердъ', 'Гье', 'Дже', 'Дже', 'Добро', 'Добро мягъ',
118
+ 'Добро удлинь', 'Ере', 'Ери', 'Ери еръ', 'Ери еръ', 'Ери еръ съузь',
119
+ 'Ери съузь', 'Ериі', 'Ериі еръ', 'Ериі еръ', 'Ериі еръ съузь',
120
+ 'Ериі съузь', 'Еръ', 'Еръ высъ', 'Еры', 'Еры еръ', 'Еры еръ съузь',
121
+ 'Еры съузь', 'Ерь', 'Есть', 'Есть чажесь', 'Есть шыръ', 'Живете', 'Земля',
122
+ 'Земля ꙁ', 'Иже', 'Иже чажесь', 'Иже ётъ', 'І',
123
+ 'Икъ', 'Како', 'Копа', 'Кье', 'Лье', 'Люди',
124
+ 'Люди мягъ', 'Мыслете', 'Мыслете мягъ', 'Нашъ', 'Нашъ мягъ', 'Нье',
125
+ 'Омега', 'Оникъ', 'Онъ', 'Онъ двоенъ', 'Онъ двоенъ одинокъ',
126
+ 'Онъ съкрестъ', 'Онъ узъ', 'Онъ шыръ', 'Онъ шыръ двуокъ',
127
+ 'Онъ шыръ одинокъ', 'Покои', 'Рьцы', 'Слово', 'Слово подстрочь', 'Твердо',
128
+ 'Твердо высъ', 'Твердо тревысъ', 'Тше', 'Укикъ', 'Укъ', 'Фертъ', 'Хѣръ',
129
+ 'Цы', 'Цы въгнутъ', 'Червь', 'Червь чашевидь', 'Ша', 'Шта', 'Шта въгнутъ',
130
+ 'Ща', 'Ынъ', 'Это', 'Юсъ', 'Юсъ вель', 'Юсъ вель двуногъ', 'Юсъ зеркаль',
131
+ 'Юсъ кратъ', 'Юсъ малъ', 'Юсъ малъ подчёрчь',
132
+ 'Юсъ малъ подъчерчь', 'Юсъ малъ прогнутъ', 'Юсъ средь', 'Я', 'Ѣдь',
133
+ 'Ѣдь высъ', 'Ѣдь предчерчь',
134
+ 'азъ', 'азъ инъ', 'буки',
135
+ 'вѣдѣ', 'гервь', 'глава Маркова', 'глаголь',
136
+ 'глаголь твердъ', 'гье',
137
+ 'дже', 'добро',
138
+ 'добро мягъ', 'добро удлинь', 'ере', 'ери', 'ери еръ съузь',
139
+ 'ери съузь', 'ериі', 'ериі еръ съузь', 'ериі съузь', 'еръ', 'еръ высъ',
140
+ 'еры', 'еры еръ', 'еры еръ съузь', 'еры съузь', 'ерь',
141
+ 'есть', 'есть шыръ', 'живете',
142
+ 'земля',
143
+ 'земля ꙁ', 'иже',
144
+ 'і', 'икъ',
145
+ 'како',
146
+ 'копа',
147
+ 'кье',
148
+ 'лье', 'люди',
149
+ 'люди мягъ', 'мыслете',
150
+ 'мыслете мягъ', 'нашъ', 'нашъ мягъ',
151
+ 'нье', 'омега', 'оникъ', 'онъ',
152
+ 'онъ двоенъ', 'онъ двоенъ одинокъ', 'онъ многоокъ',
153
+ 'онъ съкрестъ', 'онъ узъ', 'онъ шыръ', 'онъ шыръ одинокъ',
154
+ 'онъ шыръ одинъкъ',
155
+ 'покои',
156
+ 'рьцы',
157
+ 'слово',
158
+ 'слово подстрочь',
159
+ 'твердо', 'твердо высъ', 'твердо тревысъ',
160
+ 'тше',
161
+ 'укикъ', 'укъ',
162
+ 'фертъ', 'хѣръ',
163
+ 'цы', 'цы въгнутъ', 'червь',
164
+ 'червь чашевидь', 'ша',
165
+ 'шта', 'шта въгнутъ',
166
+ 'ща', 'ынъ', 'это', 'юсъ', 'юсъ вель',
167
+ 'юсъ вель двуногъ', 'юсъ зеркаль',
168
+ 'юсъ кратъ', 'юсъ малъ', 'юсъ малъ подчёрчь',
169
+ 'юсъ малъ подъчерчь', 'юсъ малъ прогнутъ', 'юсъ средь',
170
+ 'я', 'ѣдь', 'ѣдь высъ',
171
+ 'ѣдь предчерчь', 'ꙇожъ',
172
+ 'ѕело', 'ѕело зеркаль', 'ѕело мягъ', 'ѕело ꙁ', 'Омега веля', 'Омега шыръ',
173
+ 'Отъ', 'омега веля', 'омега шыръ', 'отъ', 'Ксы', 'ксы', 'Псы', 'псы',
174
+ 'Ѳита', 'ѳита', 'Іжица', 'іжица', 'Ꙇазъ', 'Ꙇоть',
175
+ 'Ꙇазъ пречерчь', 'Ꙇі', 'Ꙇюсъ вель', 'Ꙇюсъ малъ',
176
+ 'Ꙇюсъ малъ подчёрчь', 'Ꙇѣдь', 'Ꙇесть',
177
+ 'ꙇазъ', 'ꙇазъ пречерчь', 'ꙇоть',
178
+ 'ꙇі', 'ꙇюсъ вель', 'ꙇюсъ малъ',
179
+ 'ꙇюсъ малъ подчёрчь', 'ꙇѣдь', 'ꙇесть',
180
+ ]
181
+
182
+ private
183
+
184
+ def яти_знаци(знч, имя, цѣль_i)
185
+ имяна_н = имя.split(',').map do |ѯ| ѯ.strip end
186
+ имя_н = [] # п - письмене (текст, строка)
187
+ нов_зн = имяна_н.each_comby(:backward) do |съчета|
188
+ next if съчета.size <= 1
189
+ dbp24 "[яти_знаци]> съчета: #{съчета.inspect}"
190
+ нов_зн = ''
191
+ ли_зн_п = съчета.each do |а|
192
+ знаци_нн = @кс[:сѣтка][а.join(',')]
193
+ dbp22 "[яти_знаци]> знаци_нн: #{знаци_нн.inspect}"
194
+ if знаци_нн
195
+ цѣль_зн_п = знаци_нн.each do |знаци_н|
196
+ break знаци_н[цѣль_i] if знаци_н[цѣль_i]
197
+ end
198
+ if цѣль_зн_п.class == String
199
+ dbp22 "[яти_знаци]> цѣль_зн_п: #{цѣль_зн_п.inspect}"
200
+ нов_зн << цѣль_зн_п
201
+ else
202
+ break nil
203
+ end
204
+ else
205
+ break nil
206
+ end
207
+ end
208
+ return нов_зн if ли_зн_п
209
+ end
210
+ nil
211
+ end
212
+
213
+ def initialize
214
+ кс_i = 0
215
+ сѣтка = {}
216
+ ширь = []
217
+ ширь_б = []
218
+ буквы = []
219
+ знаци = {}
220
+ @кс = { :ширь => ширь, :ширь_б => ширь_б,
221
+ :сѣтка => сѣтка, :имяна => [],
222
+ :буквы => буквы, :знаци => знаци,
223
+ :правило => {}, :правило_б => {},
224
+ }
225
+
226
+ home = begin
227
+ ps = Gem::GemPathSearcher.new
228
+ dir = ps.lib_dirs_for(ps.find('priekhlazh')).split('/')
229
+ dir.pop
230
+ dir.join('/')
231
+ rescue NameError
232
+ '.'
233
+ end
234
+
235
+ ($: | [ '.', '/usr/share/priehlazx', '../share', home + '/share' ] ).each do |dir|
236
+ begin; Dir.new(dir).entries.delete_if { |x| x !~ /\.(cp|скс)$/ }
237
+ rescue; []
238
+ end.each do |file_cp|
239
+ begin
240
+ кс = YAML.load(IO.read(File.join(dir,file_cp)))
241
+ rescue
242
+ $stderr.puts "Вънми: нѣсть мощно разъбрати письмена YAML въ '#{file_cp}'. се ошибка: #{$!}"
243
+ next
244
+ end
245
+ кс_имя = кс['имя'].to_sym
246
+ dbp14 "------------"
247
+ dbp14 "#{кс_имя}"
248
+
249
+ @кс[:имяна] << кс_имя
250
+
251
+ ширь_б_н = []
252
+ ширь_н = []
253
+ кс['знаци'].each do |кс_знц, кс_знч|
254
+ def завѣръ_знаци(кс_знц, кс_имя)
255
+ if кс_знц =~ /,/
256
+ кс_знц.split(',').each do |имя|
257
+ unless @@Знаци.include? имя.strip
258
+ $stderr.puts "Вънми: имя знаця '#{имя}' въ страницѣ '#{кс_имя}' нѣсть въ спискѣ имянъ"
259
+ return false
260
+ end
261
+ end
262
+ else
263
+ unless @@Знаци.include? кс_знц.strip
264
+ $stderr.puts "Вънми: имя знаця '#{кс_знц}' въ страницѣ '#{кс_имя}' нѣсть въ спискѣ имянъ"
265
+ return false
266
+ end
267
+ end
268
+ true
269
+ end
270
+
271
+ unless кс_знч and not кс_знч.to_s.empty?
272
+ $stderr.puts "Вънми: знаць '#{кс_знц}' въ страницѣ '#{кс_имя}' имѣетъ пусто значеніе"
273
+ end
274
+
275
+ next unless завѣръ_знаци(кс_знц, кс_имя) and кс_знч and not кс_знч.to_s.empty?
276
+
277
+ сѣтка[кс_знц] = [[]] unless сѣтка[кс_знц]
278
+
279
+ зн_нн_нов = []
280
+ сѣтка_имя = сѣтка[кс_знц]
281
+ кс_знч.to_s.split(',').each do |знч|
282
+ знч = знч.strip.gsub(/ѯ[\da-fA-F]+;?/u) do |a|
283
+ aa = a.unpack('U*')
284
+ aa.shift
285
+ aa.pop if aa.last == 0x3b
286
+ [ aa.pack('U*').to_i(16) ].pack('U*')
287
+ end
288
+ dbp14 "#{кс_знц} = #{знч}"
289
+ зн_нн = сѣтка_имя.dup
290
+ зн_нн.each do |зн_н| зн_н[кс_i] = знч end
291
+ зн_нн_нов |= зн_нн.map {|x| x.dup }
292
+ dbp18 "#{кс_знц} => #{зн_нн_нов.inspect}"
293
+
294
+ #добавление в ширину
295
+ ширь_н << знч
296
+ ширь_б_н << знч if кс_знц.split(',').each do |имя| break nil unless Useful.include?(имя) end
297
+ end
298
+ сѣтка_имя.replace зн_нн_нов
299
+ end if кс['знаци']
300
+
301
+ #ширь
302
+ def разбери_ширь(ширь, кс_i, ширь_н)
303
+ нач = кон = nil
304
+ ширь[кс_i] = []
305
+ ширь_н.compact.map {|x| x.unpack('U*') }.flatten.sort.uniq.each do |знч|
306
+ if not нач
307
+ нач = кон = знч
308
+ elsif кон + 1 == знч
309
+ кон += 1
310
+ else
311
+ ширь[кс_i] << ([ нач ].pack('U*')..[ кон ].pack('U*'))
312
+ нач = кон = знч
313
+ end
314
+ end
315
+ ширь[кс_i] << ([ нач ].pack('U*')..[ кон ].pack('U*')) if нач
316
+ end
317
+
318
+ #ширь букова
319
+ разбери_ширь(ширь, кс_i, ширь_н)
320
+ разбери_ширь(ширь_б, кс_i, ширь_б_н)
321
+
322
+ def створи_правило(шири)
323
+ одинкы = ''
324
+ шири.each do |ширь|
325
+ def re_c(c)
326
+ m = c.match(/(?:([+\[\]\\().*?{}^$\/|]))/u)
327
+ m ? '\\' + m[1] : c
328
+ end
329
+ (b,e) = [ re_c(ширь.begin), re_c(ширь.end) ]
330
+ одинкы << (ширь.begin == ширь.end ? b : "#{b}-#{e}")
331
+ end
332
+ одинкы
333
+ end
334
+
335
+ @кс[:правило][кс_имя] = створи_правило(ширь[кс_i])
336
+ @кс[:правило_б][кс_имя] = створи_правило(ширь_б[кс_i])
337
+
338
+ буквы[кс_i] = {}
339
+
340
+ кс_i += 1
341
+ end; end
342
+
343
+ # разъкрытіе неѥдинныхъ знацей
344
+ @кс[:имяна].each_index do |кс_i|
345
+ dbp22 "Кодачица #{@кс[:имяна][кс_i]}"
346
+ сѣтка.each do |имя, знач_нн|
347
+ знач_нн.each do |знач_н|
348
+ next if знач_н[кс_i]
349
+ dbp22 "Неполна дружь #{знач_н.inspect}"
350
+ ново_знч = яти_знаци(знач_н, имя, кс_i)
351
+ if ново_знч
352
+ знач_н[кс_i] = ново_знч
353
+ dbp24 "Сотвореніе нова значенія #{ново_знч.inspect} для дружи #{знач_н.inspect}"
354
+ end
355
+ end
356
+ end
357
+ end
358
+
359
+ #сортировка слов по первой букве.
360
+ сѣтка.each do |имя, знач_нн|
361
+ знач_нн.each do |знач_н|
362
+ @кс[:имяна].each_index do |кс_i|
363
+ знач = знач_н[кс_i]
364
+ next unless знач
365
+ dbp24 "Значеніе #{знач.inspect} << #{знач_н.inspect}"
366
+ бук = знач.get(0)
367
+ буквы[кс_i][бук] = {} unless буквы[кс_i][бук]
368
+ буквы[кс_i][бук][знач] = [] unless буквы[кс_i][бук][знач]
369
+ буквы[кс_i][бук][знач] << знач_н
370
+ end
371
+ end
372
+ end
373
+
374
+ #полученіе словаря обратныхъ значеній имянъ знацей
375
+ сѣтка.each do |знц, знч_нн|
376
+ знч_нн.each do |знч_н|
377
+ знаци[знч_н] = знц
378
+ end
379
+ end
380
+ end
381
+
382
+ public
383
+
384
+ def цѣль=(cp)
385
+ cp = cp.to_sym
386
+ if @кс[:имяна].include?(cp)
387
+ @цѣль = cp
388
+ else
389
+ raise "Се ошибка: невѣсть къ цѣлева кодачица #{cp}, кодачицы доступныя суть: #{@кс[:имяна].join(', ')}"
390
+ end
391
+ end
392
+
393
+ def истокъ=(cp)
394
+ cp = cp.to_sym
395
+ if @кс[:имяна].include?(cp)
396
+ @истокъ = cp
397
+ else
398
+ raise "Се ошибка: невѣсть къ исходна кодачица #{cp}, кодачицы доступныя суть: #{@кс[:имяна].join(', ')}"
399
+ end
400
+ end
401
+
402
+ def кака_кода(писмя)
403
+ писмя = писмя.to_s
404
+ вѣса_сл = {}
405
+ @кс[:имяна].each_index do |кс_i|
406
+ шири = @кс[:ширь][кс_i]
407
+
408
+ matched = 0
409
+ unmatched = 0
410
+ писмя.each_char do |бк|
411
+ шири.each do |ширь|
412
+ matched += 1 if ширь === бк
413
+ end
414
+ end
415
+
416
+ вѣса_сл[@кс[:имяна][кс_i]] = matched
417
+ end
418
+ вѣса = вѣса_сл.keys.sort do |ѯ,ѱ|
419
+ пл = вѣса_сл[ѱ] <=> вѣса_сл[ѯ]
420
+ пл != 0 ? пл : @цѣль == ѯ ? 1 : @цѣль == ѱ ? -1 :
421
+ ѯ.to_s <=> ѱ.to_s
422
+ end
423
+ вѣса && (not вѣса.empty?) && вѣса[0]
424
+ end
425
+
426
+ def пръ_сл(кс)
427
+ return nil if кс.to_s.empty?
428
+ кс = кс.to_sym
429
+ return nil unless @кс[:имяна].include? кс
430
+
431
+ "[#{@кс[:правило_б][кс]}]"
432
+ end
433
+
434
+ def пръ(кс)
435
+ return nil if кс.to_s.empty?
436
+ кс = кс.to_sym
437
+ return nil unless @кс[:имяна].include? кс
438
+
439
+ "[#{@кс[:правило][кс]}]"
440
+ end
441
+
442
+ def [](str)
443
+ ими(str)
444
+ end
445
+
446
+ def ими(писмя, цѣль = @цѣль, истокъ = @истокъ)
447
+ self.цѣль = цѣль
448
+ цѣль_ѯ = @кс[:имяна].index(@цѣль)
449
+ return nil unless цѣль_ѯ # TODO raise
450
+
451
+ писмя = писмя.to_s
452
+ истокъ = (истокъ || кака_кода(писмя)).to_sym
453
+ исх_ѯ = @кс[:имяна].index(истокъ)
454
+ return nil unless исх_ѯ # TODO raise
455
+
456
+ return nil unless @кс[:сѣтка] # TODO raise
457
+ плодъ = ''
458
+ ѯ = 0
459
+
460
+ dbp22 "Знак: #{писмя.inspect}"
461
+ while писмя and not писмя.empty?
462
+ ѱ = 1
463
+ знк = писмя.get(0)
464
+ dbp22 "Знак: #{знк.inspect}"
465
+ реха = @кс[:буквы][исх_ѯ][знк]
466
+
467
+ if реха
468
+ dbp28 "Реха: #{реха.inspect}"
469
+ реха_а = []
470
+ реха.keys.sort do |а,б| б.size <=> а.size end.each do |знач|
471
+ знач_н = реха[знач]
472
+ реха_а << реха[знач].sort do |а,б| а[цѣль_ѯ].size <=> б[цѣль_ѯ].size end
473
+ end
474
+
475
+ dbp28 "Нова реха: #{реха_а.inspect}"
476
+ пл = реха_а.flatten(1).each do |а|
477
+ dbp24 "Запись: #{а.inspect}"
478
+ if а[исх_ѯ] and писмя =~ /^#{а[исх_ѯ].to_res}(.*)/u
479
+ dbp24 "Попало: #{писмя.inspect} =~ #{а.inspect}"
480
+ if а[цѣль_ѯ]
481
+ писмя = $1
482
+ ѱ = а[исх_ѯ].size
483
+ break а[цѣль_ѯ]
484
+ end
485
+ end
486
+ end
487
+
488
+ if (пл.class == Array) or (пл.class == String and пл =~ /\0/)
489
+ $stderr.puts "Вънми: Се знаць '#{знк}'(#{sprintf "ѯ%x", знк.ord})" +
490
+ " кодачицы #{истокъ} отъторжеся, бо нѣсть мощно прѣхложити и въ кодачицу #{цѣль}"
491
+ писмя =~ /^.(.*)/u; писмя = $1
492
+ elsif пл.class == String
493
+ плодъ << пл
494
+ else
495
+ $stderr.puts "Невѣдома ошибка: sѣло страньнъ класъ #{пл.class} вещи списка"
496
+ писмя =~ /^.(.*)/u; писмя = $1
497
+ end
498
+ else
499
+ $stderr.puts "Вънми: Се знаць '#{знк}'(#{sprintf "ѯ%x", знк.ord}) кодачицы #{истокъ} отъторжеся, зане не обретенъ въ онои"
500
+ писмя =~ /^.(.*)/u; писмя = $1
501
+ end
502
+
503
+ ѯ += ѱ
504
+ end
505
+
506
+ плодъ
507
+ end
508
+ alias :go :ими
509
+ end
510
+
@@ -0,0 +1,3 @@
1
+ class Priehlazx
2
+ VERSION = "0.0.1"
3
+ end