priehlazx 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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