FreeBasic
Главная
Вход
Регистрация
Суббота, 21.12.2024, 19:34Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
алгоритм переносов
electrikДата: Среда, 12.03.2014, 17:15 | Сообщение # 1
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
задумал я для наших ребят в издательстве текстовый редактор написать. все знают, что в наше время написать редактор особого ума не надо, а вот алгоритмы - ...
вобщем, нужна реализация алгоритма расстановки переносов. предположим, в книге длина строки равна 30 символов и должно это выглядеть так:

 Статья ]248. Плоды,продукция
и доходы от использования иму-
щества,находящегося в долевой
собственности
 Плоды,продукция и доходы от
использования имущества,нахо-
дящегося в долевой собственно-
сти,поступают в состав общего
имущества и распределяются
между участниками долевой соб-
ственности соразмерно их до-
лям,если иное не предусмотрено
соглашением между ними.

знаю, есть алгоритм ляна-кнутта, вродь так называется, может кто-то это уже прошёл, уж не охото возиться с этим. я попробую конечно, но если поможете, будет классно.
поповоду денег - думаю вряд ли мне за это заплатят, так как это моя инициатива.
нафиг мне это надо. слепые работают под dos в лексиконе, жесть, а виндовые редакторы, либо не подходят требованиям, а специализированные громоздкие и стоят таких же денег.
у нас требования просты, текст должен форматироваться по 30 символов в строке, текстовый редактор должен уметь расставлять
переносы автоматически, и должен уметь сказать правильно ли написано слово(spellchecker).
остальное, тут уже дело техники, макросы горячки поиск и т.д.
 
haavДата: Среда, 12.03.2014, 18:10 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Серега! Вот здесь реферат с исходником на паскале:

http://xreferat.ru/33....ii.html

В самом реферате описан алгоритм. Сам исходник маленький, разобраться несложно. Как он в действии не знаю, надо конечно тестировать.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Четверг, 13.03.2014, 19:00 | Сообщение # 3
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
спасибо - это я уже видел, взял тож на заметку, но думаю, что оно слабовато будет. вот что нашёл:
http://habrahabr.ru/post/138088/
алгоритм ляна-кнута, описание правил.

попробовал собрать на gcc - ух, библиотек таскать много надо! допилю - выложу. всё будет в виде dll. может потом, разобраться в c++ коде и на fb переписать. эт ладно, будет желание - займусь. главное есть алгоритм заголовки к fb и  правила к этой штуке. хотя уже в правилах баг есть, слово интуиция - переносит и как интуици-я.
 
haavДата: Четверг, 13.03.2014, 19:21 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
На хабре я видел, но че-то там мудрено больно. Хотя попробуешь и тот и другой алгоритм, потом не забудь отпишись. Меня больше интересует алгоритм из реферата, как он на деле.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Пятница, 14.03.2014, 19:09 | Сообщение # 5
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
ух, вот оно - hyphenator:
ftp://el-zone.spb.ru/freebasic/libs/hyphenator.7z
это по алгоритму ляна-кнута.
недостатки - любит оставлять последние буквы, например, интуици-я, тре-ни-ро-воч-ны-й, пе-ре-но-си-мы-й.
видимо, правила фиговые, хотя это стандартные правила tex. обязательно надо проверять, не остались ли одиночные буквы с переносом. считается, не идеальный алгоритм, но универсальный для всех языков. в архиве правила только для русского языка - patterns.bi.
буду глядеть алгоритм из реферата. мож и вместе их скрестить, но эт ладно.

Добавлено (14.03.2014, 19:09)
---------------------------------------------
вот и ссылка на правила:
http://www.tug.org/tex-hyphen/#languages
потом переложу архив с новыми правилами, как выяснилось, у меня старые - около 5000 записей, новый - 7000 с лишним. и английские тож подсуну. а вообще, потом можно будет переработать программу, чтоб не в бинарнике держать правила, а в tex файлах как есть. ну это уже пожеланию. я  в редактор скрою, чтоб шаловливые ручки всё не попортили. глядел реферат, пока сильно не вник, идея ясна, всё-же пока на кнуте попробую. если уж совсем тяжко будет, займусь рефератом.


Сообщение отредактировал electrik - Пятница, 14.03.2014, 19:16
 
haavДата: Суббота, 15.03.2014, 08:29 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Попробовал. Да действительно концы слов выходят с косяками. Использование из готового .bi файла неудобно. Конечно надо считывать из файла .tex Это избавит от необходимости дополнять BI файл , если обновится файл правил на оф. сайте.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Вторник, 18.03.2014, 11:44 | Сообщение # 7
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
вот, переложил файл. реализовал простое чтение данных из tex файла.
обновил tex файл.
английский сами пристроите, там все легко.
мало что изменилось, всё-равно переносит последние гласные - тут можно самим навеску сделать. для тех кто не в курсе, и не ходил по приведённым выше ссылкам, про цитирую правила:
При переносе слов нельзя ни оставлять в конце строки, ни переносить на другую сторону часть слова, не составляющую слога; например, нельзя переносить: просмо-тр, ст-рах
Нельзя отделять согласную от следующей за ней гласной.
Нельзя отрывать буквы ъ и ь от предшествующей согласной.
Нельзя отрывать букву й от предшествующей гласной
Нельзя оставлять в конце строки или переносить на другую строку одну букву
При переносе слов с приставками нельзя разбивать односложную приставку, если за приставкой идёт согласный.
При переносе слов с приставками нельзя оставлять в конце строки при приставке начальную часть корня, не составляющую слога.
При переносе сложных слов нельзя оставлять в конце строки начальную часть второй основы, если эта часть не составляет слога
Нельзя оставлять в конце строки или переносить в начало следующей две одинаковые согласные, стоящие между гласными
Нельзя разбивать переносом односложную часть сложносокращённого слова предыдущие

пока ещё руки до реферата не дошли, как только что-то сделаю, суда солью.


Сообщение отредактировал electrik - Вторник, 18.03.2014, 11:50
 
haavДата: Четверг, 20.03.2014, 12:57 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Репутация: 50
Статус: Offline
Ну как с рефератами сделаешь, потом перемещу тему в раздел freebasic. Все таки данная тема полезна и больше относится к FB , чем к оффтопу.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
electrikДата: Четверг, 07.04.2022, 22:43 | Сообщение # 9
Полковник
Группа: Друзья
Сообщений: 182
Репутация: 3
Статус: Offline
Так и не написал я редактор для издательства, но вспомнил про переносы. Да уж, написан там алгоритм жестячно, это я про математический вариант.
По правилам Нельзя отделять согласную от следующей за ней гласной, интересно, а как же "Под-окон-ник"? И таких слов, думаю не мало. Ещё правило, Нельзя оставлять в конце строки или переносить в начало следующей две одинаковые согласные, стоящие между гласными. А как же слова по-ссорился, и по-ссал?

Добавлено (07.04.2022, 22:49)
---------------------------------------------
Я до сих пор работаю в издательстве, и правим мы почти каждый день. Частая проблема при правке - это переносы. ДЛя школьных переносов, наверное математический алгоритм пойдёт, а для издательских точно нет.

Добавлено (08.04.2022, 01:41)
---------------------------------------------
Ох какая печалька... На гитхабе больше нет тех исходников которые я собирал в 2014 году. И кажется у меня их не осталось.

 
DarkDemonДата: Пятница, 08.04.2022, 04:00 | Сообщение # 10
Полковник
Группа: Друзья
Сообщений: 200
Репутация: -1
Статус: Offline
Вот вроде нормальные правила русского языка:

Цитата
1. Слова переносят по слогам: лам-па, пи-ра-ми-да, по-клон-ник, пей-заж, мо-но-лит-ный, гор-дость
2. Одну букву нельзя оставлять на строке и нельзя переносить на другую строку: Яма, ар-мия, Юлия, ель, стог
3. Буквы ъ, ь не отделяют от предыдущей согласной: паль-то, се-мья, объ-езд, конь-ки, подъ-емник, объ-ятия
А букву й нельзя отделять от предшествующей гласной: вой-лок, бой-кот, дизай-нер, кофей-ник, злодей-ство, россий-ский
4. В словах с двойными согласными одну букву оставляют на строке, вторую переносят на другу строку: Ан-на, суб-бота
5. При переносе нельзя отрывать от приставки одну букву: Под-бросить, под-писать
6. Нельзя отрывать первую букву от корня: По-строить, при-учить, со-брать


А вот зацитирую один комментарий с хабра:

Цитата
Если лень возится с Ляна-Кнутом, и требуется только русский язык, то можно воспользоваться алгоритмом П.Хpистова в модификации Дымченко и Ваpсанофьева.

Всего шесть правил:

«Х-»
«Г-Г»
«ГС-СГ»
«СГ-СГ»
«ГС-ССГ»
«ГСС-ССГ»

Где: Г — гласная, С — согласная, Х — буква из набора «ьъй».

Элементарно реализуется на регекспах.
Утверждается, что покрывает немалую часть правил русского языка.

Вот по этой ссылке вышеозвученный алгоритм и тоже интересно почитать:  https://sites.google.com/site/foliantapp/project-updates/hyphenation

Моё предположение: нужно найти приставку и корень слова, а далее перебирать все буквы слова, проверяя по шаблонам, можно ли
в это место засунуть перенос, если можно, то заносить вариант слова в список(или массив). Далее нужен алгоритм который по корню и
приставке(по озвученным выше правилам русского языка) - отсечёт неверные варианты из этого списка и совместит их в один вариант.

А как переносить: дойти до выхода за лимит(конец слова после 30 символов), выделить слово, провести анализ слова, про который писал
выше, функция после анализа должна возвращать два значения: 0 - переносить всё слово, 1 - переносить часть слова.
В случае с 1 нужно проверить по шаблону переноса(в слове после анализа должны стоять чёрточки где можно переносить),
идти с конца слова и проверять укладывается ли обрезанное слово плюс чёрточка в лимит(30 символов). Если ни один перенос
не укладывается - то переводить состояние в 0 (т.е. перенос всего слова).

Короче это очень геморройное дело, чтобы правильно сделать, очень многоэтапный алгоритм, где каждая часть важна.
Думаю он вполне детерминируется, но это много времени на анализ логики.

Слоги и приставки, наверное, надо брать из словаря, т.к. есть, конечно, правила, но фонетики там грызутся меж собой:

Цитата
Слова "разрубаются" на слоги после каждой гласной. Сколько гласных, столько слогов.
НО: если после гласной стоят р, рь, л, ль, м, мь, н, нь и за ними есть еще парная согласная, они (сонорные и сонорные с ь) отходят к предыдущему слогу; если после й есть любой другой согласный, й отходит к предыдущему слогу.


Добавлено (08.04.2022, 11:29)
---------------------------------------------
Цитата electrik ()
По правилам Нельзя отделять согласную от следующей за ней гласной, интересно, а как же "Под-окон-ник"?

Под - приставка, окон - корень и нн - двойная согласная, которая бьётся пополам (правило 4 выше).

Состав: https://kartaslov.ru/разбор-слова-по-составу/подоконник
Перенос: https://xn----8sbi5ahhceu.xn--p1ai/слово....кон-ник
Слоги: https://slogi.su/подоконник


Сообщение отредактировал DarkDemon - Пятница, 08.04.2022, 11:41
 
  • Страница 1 из 1
  • 1
Поиск: