lib/priehlazx.rb in priehlazx-0.0.3 vs lib/priehlazx.rb in priehlazx-0.0.4
- old
+ new
@@ -1,10 +1,12 @@
#!/usr/bin/env ruby
# encoding: UTF-8
require 'yaml'
-require 'rdoba'
+require 'rdoba/debug'
+require 'rdoba/re'
+require 'rdoba/combinations'
require 'прѣхлажь/version'
class Priehlazx
attr_reader :истокъ, :цѣль
@@ -17,11 +19,11 @@
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x', 'y', 'z', 'Ꙇожъ', 'Ѕело', 'Ѕело зеркаль',
'Ѕело мягъ', 'Ѕело ꙁ', 'Азъ', 'Азъ инъ', 'Буки', 'Вѣдѣ', 'Гервь',
- 'Глаголь', 'Глаголь твердъ', 'Гье', 'Дже', 'Дже', 'Добро', 'Добро мягъ',
+ 'Глаголь', 'Глаголь твердъ', 'Гье', 'Дже', 'Дьже', 'Добро', 'Добро мягъ',
'Добро удлинь', 'Ере', 'Ери', 'Ери еръ', 'Ери еръ', 'Ери еръ съузь',
'Ери съузь', 'Ериі', 'Ериі еръ', 'Ериі еръ', 'Ериі еръ съузь',
'Ериі съузь', 'Еръ', 'Еръ высъ', 'Еры', 'Еры еръ', 'Еры еръ съузь',
'Еры съузь', 'Ерь', 'Есть', 'Есть чажесь', 'Есть шыръ', 'Живете', 'Земля',
'Земля ꙁ', 'Иже', 'Иже чажесь', 'Иже ётъ', 'І',
@@ -40,11 +42,11 @@
'азъ', 'азъ выносъ', 'азъ инъ', 'большѣ', 'буки',
'буки выносъ', 'вѣдѣ выносъ', 'вершина глася', 'възметна буква',
'възметъ', 'возъгласъ', 'возъгласъ вель', 'восемь', 'вранъ',
'въводъ', 'вѣдѣ', 'гервь', 'глава Маркова', 'глаголь',
'глаголь твердъ', 'глаголь выносъ', 'гье', 'два', 'двоеточіе',
- 'девѧть', 'гервь выносъ', 'дже', 'добро', 'добро выносъ',
+ 'девѧть', 'гервь выносъ', 'дже', 'дьже', 'добро', 'добро выносъ',
'добро мягъ', 'добро удлинь', 'дѣлитель', 'ере', 'ери', 'ери еръ съузь',
'ери съузь', 'ериі', 'ериі еръ съузь', 'ериі съузь', 'еръ', 'еръ высъ',
'еры', 'еры вынось', 'еры еръ', 'еры еръ съузь', 'еры съузь', 'ерь',
'ерь вынось', 'есть', 'есть выносъ', 'есть шыръ', 'живете',
'живете выносъ', 'запѧта', 'звательцо', 'звёздочка', 'земля',
@@ -72,11 +74,11 @@
'препинаніе е', 'препинаніе ж', 'пробѣлъ', 'пущь', 'пѧть', 'равно',
'распѣвъ въ слогѣ', 'рьцы', 'рьцы выносъ', 'рѣшётка',
'семь', 'сирѣчь', 'скобка закрывающа', 'скобка изразьна закрывающа',
'скобка изразьна открывающа', 'скобка открывающа',
'скобка прямочерта закрывающа', 'скобка прямочерта открывающа', 'слово',
- 'слово выносъ', 'слово подстрочь', 'слово твердо выносъ',
+ 'слово выносъ', 'слово подстрочь', 'слово твердо выносъ', 'смягъченіе',
'сотка', 'твердо', 'твердо выносъ', 'твердо высъ', 'твердо тревысъ',
'точька запята', 'точька', 'три',
'троеточіе одесну несоверше окружено',
'троеточіе одесну несоверше окружено очерче',
'троеточіе ошую несоверше окружено',
@@ -84,11 +86,11 @@
'тьматемъ', 'укикъ', 'укъ', 'укъ выносъ', 'умилительцо',
'умноженіе', 'фертъ', 'фертъ вынось', 'ѳита выносъ', 'хѣръ',
'хѣръ выносъ', 'цы', 'цы въгнутъ', 'цы выносъ', 'цѧтокъ', 'червь',
'червь выносъ', 'червь чашевидь', 'черта', 'четыре', 'ша',
'ша выносъ', 'шта', 'шта въгнутъ', 'шесть',
- 'шта выносъ', 'ща', 'ынъ', 'это', 'юсъ', 'юсъ вель',
+ 'ща выносъ', 'ща', 'ынъ', 'это', 'юсъ', 'юсъ вель',
'юсъ вель выносъ', 'юсъ вель двуногъ', 'юсъ выносъ', 'юсъ зеркаль',
'юсъ кратъ', 'юсъ малъ', 'юсъ малъ выносъ', 'юсъ малъ подчёрчь',
'юсъ малъ подъчерчь', 'юсъ малъ прогнутъ', 'юсъ средь',
'я', 'ѣдь', 'ѣдь выносъ', 'ѣдь высъ',
'ѣдь предчерчь', 'яма глася', 'ꙇожъ', 'ѕвездочка', 'ѕвездочка сносоча',
@@ -112,11 +114,11 @@
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x', 'y', 'z', 'Ꙇожъ', 'Ѕело', 'Ѕело зеркаль',
'Ѕело мягъ', 'Ѕело ꙁ', 'Азъ', 'Азъ инъ', 'Буки', 'Вѣдѣ', 'Гервь',
- 'Глаголь', 'Глаголь твердъ', 'Гье', 'Дже', 'Дже', 'Добро', 'Добро мягъ',
+ 'Глаголь', 'Глаголь твердъ', 'Гье', 'Дже', 'Дьже', 'Добро', 'Добро мягъ',
'Добро удлинь', 'Ере', 'Ери', 'Ери еръ', 'Ери еръ', 'Ери еръ съузь',
'Ери съузь', 'Ериі', 'Ериі еръ', 'Ериі еръ', 'Ериі еръ съузь',
'Ериі съузь', 'Еръ', 'Еръ высъ', 'Еры', 'Еры еръ', 'Еры еръ съузь',
'Еры съузь', 'Ерь', 'Есть', 'Есть чажесь', 'Есть шыръ', 'Живете', 'Земля',
'Земля ꙁ', 'Иже', 'Иже чажесь', 'Иже ётъ', 'І',
@@ -132,11 +134,11 @@
'Юсъ малъ подъчерчь', 'Юсъ малъ прогнутъ', 'Юсъ средь', 'Я', 'Ѣдь',
'Ѣдь высъ', 'Ѣдь предчерчь',
'азъ', 'азъ инъ', 'буки',
'вѣдѣ', 'гервь', 'глава Маркова', 'глаголь',
'глаголь твердъ', 'гье',
- 'дже', 'добро',
+ 'дже', 'дьже', 'добро',
'добро мягъ', 'добро удлинь', 'ере', 'ери', 'ери еръ съузь',
'ери съузь', 'ериі', 'ериі еръ съузь', 'ериі съузь', 'еръ', 'еръ высъ',
'еры', 'еры еръ', 'еры еръ съузь', 'еры съузь', 'ерь',
'есть', 'есть шыръ', 'живете',
'земля',
@@ -187,11 +189,11 @@
нов_зн = имяна_н.each_comby(:backward) do |съчета|
next if съчета.size <= 1
dbp24 "[яти_знаци]> съчета: #{съчета.inspect}"
нов_зн = ''
ли_зн_п = съчета.each do |а|
- знаци_нн = @кс[:сѣтка][а.join(',')]
+ знаци_нн = @cp[:сѣтка][а.join(',')]
dbp22 "[яти_знаци]> знаци_нн: #{знаци_нн.inspect}"
if знаци_нн
цѣль_зн_п = знаци_нн.each do |знаци_н|
break знаци_н[цѣль_i] if знаци_н[цѣль_i]
end
@@ -226,11 +228,11 @@
сѣтка = {}
ширь = []
ширь_б = []
буквы = []
знаци = {}
- @кс = { :ширь => ширь, :ширь_б => ширь_б,
+ @cp = { :ширь => ширь, :ширь_б => ширь_б,
:сѣтка => сѣтка, :имяна => [],
:буквы => буквы, :знаци => знаци,
:правило => {}, :правило_б => {},
:свойства => {},
}
@@ -256,14 +258,14 @@
end
кс_имя = кс['имя'].to_sym
dbp14 "------------"
dbp14 "#{кс_имя}"
- @кс[:имяна] << кс_имя
- @кс[:свойства][кс_имя] = {}
+ @cp[:имяна] << кс_имя
+ @cp[:свойства][кс_имя] = {}
[ 'описаніе' ].each do |свойство|
- @кс[:свойства][кс_имя][свойство.to_sym] = кс[свойство] if кс[свойство]
+ @cp[:свойства][кс_имя][свойство.to_sym] = кс[свойство] if кс[свойство]
end
ширь_б_н = []
ширь_н = []
кс['знаци'].each do |кс_знц, кс_знч|
@@ -346,21 +348,21 @@
одинкы << (ширь.begin == ширь.end ? b : "#{b}-#{e}")
end
одинкы
end
- @кс[:правило][кс_имя] = створи_правило(ширь[кс_i])
- @кс[:правило_б][кс_имя] = створи_правило(ширь_б[кс_i])
+ @cp[:правило][кс_имя] = створи_правило(ширь[кс_i])
+ @cp[:правило_б][кс_имя] = створи_правило(ширь_б[кс_i])
буквы[кс_i] = {}
кс_i += 1
end; end
# разъкрытіе неѥдинныхъ знацей
- @кс[:имяна].each_index do |кс_i|
- dbp22 "Кодачица #{@кс[:имяна][кс_i]}"
+ @cp[:имяна].each_index do |кс_i|
+ dbp22 "Кодачица #{@cp[:имяна][кс_i]}"
сѣтка.each do |имя, знач_нн|
знач_нн.each do |знач_н|
next if знач_н[кс_i]
dbp22 "Неполна дружь #{знач_н.inspect}"
ново_знч = яти_знаци(знач_н, имя, кс_i)
@@ -373,15 +375,15 @@
end
#сортировка слов по первой букве.
сѣтка.each do |имя, знач_нн|
знач_нн.each do |знач_н|
- @кс[:имяна].each_index do |кс_i|
+ @cp[:имяна].each_index do |кс_i|
знач = знач_н[кс_i]
next unless знач
dbp24 "Значеніе #{знач.inspect} << #{знач_н.inspect}"
- бук = знач.get(0)
+ бук = [ знач.unpack("U*")[0] ].pack("U*")
буквы[кс_i][бук] = {} unless буквы[кс_i][бук]
буквы[кс_i][бук][знач] = [] unless буквы[кс_i][бук][знач]
буквы[кс_i][бук][знач] << знач_н
end
end
@@ -395,52 +397,50 @@
end
end
public
- def цѣль=(cp)
- cp = cp.to_sym
- if @кс[:имяна].include?(cp)
- @цѣль = cp
+ def цѣль=(кс)
+ if кс and @cp[:имяна].include?(кс = кс.to_sym)
+ @цѣль = кс
else
- raise "Се ошибка: невѣсть къ цѣлева кодачица #{cp}, кодачицы доступныя суть: #{@кс[:имяна].join(', ')}"
+ raise "Се ошибка: невѣсть къ цѣлева кодачица #{кс}, кодачицы доступныя суть: #{@cp[:имяна].join(', ')}"
end
end
- def истокъ=(cp)
- cp = cp.to_sym
- if @кс[:имяна].include?(cp)
- @истокъ = cp
+ def истокъ=(кс)
+ if кс and @cp[:имяна].include?(кс = кс.to_sym)
+ @истокъ = кс
else
- raise "Се ошибка: невѣсть къ исходна кодачица #{cp}, кодачицы доступныя суть: #{@кс[:имяна].join(', ')}"
+ raise "Се ошибка: невѣсть къ исходна кодачица #{кс}, кодачицы доступныя суть: #{@cp[:имяна].join(', ')}"
end
end
def кодачицы
пл = {}
- @кс[:имяна].each do |име|
- о = @кс[:свойства][име][:описаніе]
+ @cp[:имяна].each do |име|
+ о = @cp[:свойства][име][:описаніе]
пл[име] = о[язы.to_s].to_s if о
end
пл
end
def кака_кода(писмя)
писмя = писмя.to_s
вѣса_сл = {}
- @кс[:имяна].each_index do |кс_i|
- шири = @кс[:ширь][кс_i]
+ @cp[:имяна].each_index do |кс_i|
+ шири = @cp[:ширь][кс_i]
matched = 0
unmatched = 0
писмя.each_char do |бк|
шири.each do |ширь|
matched += 1 if ширь === бк
end
end
- вѣса_сл[@кс[:имяна][кс_i]] = matched
+ вѣса_сл[@cp[:имяна][кс_i]] = matched
end
вѣса = вѣса_сл.keys.sort do |ѯ,ѱ|
пл = вѣса_сл[ѱ] <=> вѣса_сл[ѯ]
пл != 0 ? пл : @цѣль == ѯ ? 1 : @цѣль == ѱ ? -1 :
ѯ.to_s <=> ѱ.to_s
@@ -449,47 +449,47 @@
end
def пръ_сл(кс)
return nil if кс.to_s.empty?
кс = кс.to_sym
- return nil unless @кс[:имяна].include? кс
+ return nil unless @cp[:имяна].include? кс
- "[#{@кс[:правило_б][кс]}]"
+ "[#{@cp[:правило_б][кс]}]"
end
def пръ(кс)
return nil if кс.to_s.empty?
кс = кс.to_sym
- return nil unless @кс[:имяна].include? кс
+ return nil unless @cp[:имяна].include? кс
- "[#{@кс[:правило][кс]}]"
+ "[#{@cp[:правило][кс]}]"
end
def [](str)
ими(str)
end
def ими(писмя, цѣль = @цѣль, истокъ = @истокъ)
self.цѣль = цѣль
- цѣль_ѯ = @кс[:имяна].index(@цѣль)
+ цѣль_ѯ = @cp[:имяна].index(@цѣль)
return nil unless цѣль_ѯ # TODO raise
писмя = писмя.to_s
истокъ = (истокъ || кака_кода(писмя)).to_sym
- исх_ѯ = @кс[:имяна].index(истокъ)
+ исх_ѯ = @cp[:имяна].index(истокъ)
return nil unless исх_ѯ # TODO raise
- return nil unless @кс[:сѣтка] # TODO raise
+ return nil unless @cp[:сѣтка] # TODO raise
плодъ = ''
ѯ = 0
dbp22 "Знак: #{писмя.inspect}"
while писмя and not писмя.empty?
ѱ = 1
- знк = писмя.get(0)
+ знк = [ писмя.unpack("U*")[0] ].pack("U*")
dbp22 "Знак: #{знк.inspect}"
- реха = @кс[:буквы][исх_ѯ][знк]
+ реха = @cp[:буквы][исх_ѯ][знк]
if реха
dbp28 "Реха: #{реха.inspect}"
реха_а = []
реха.keys.sort do |а,б| б.size <=> а.size end.each do |знач|
@@ -507,10 +507,10 @@
ѱ = а[исх_ѯ].size
break а[цѣль_ѯ]
end
end
end
-
+
if (пл.class == Array) or (пл.class == String and пл =~ /\0/)
$stderr.puts "Вънми: Се знаць '#{знк}'(#{sprintf "ѯ%x", знк.ord})" +
" кодачицы #{истокъ} отъторжеся, бо нѣсть мощно прѣхложити и въ кодачицу #{цѣль}"
писмя =~ /^.(.*)/u; писмя = $1
elsif пл.class == String