История создания: Меня давно не устраивало то, как Subtitle Workshop работает с тэгами текстовых стилей (если кто ещё не в курсе, он умеет выставлять тэги только для полного титра, а не для отдельных слов). Отключив работу с тэгами в SW-настройках (Alt+S > Основные), можно частично решить проблему - SW перестает противиться выделению отдельных слов, но делать это приходится ручонками, набирая в текстовой строке <b>...</b>, <i>...</i>, etc. Поскольку печатать одно и то же мне было лень, я когда-то написал коротенький скрипт, вызывающий (после выделения нужного текста) правым кликом мыши всплывающее меню - в нём нужно было выбрать нужный пункт и выделенный текст "обрастал" с двух сторон тэгами (где-то вот так: <b>выделенный текст</b>). Шло время, я по-мере необходимости потихоньку дописывал к всплывающему меню очередные функции (либо совсем отсутствующие в Воркшопе, либо имеющиеся среди них, но чем-то меня не устраивающие). В результате, скрипт постепенно превратился в некое кладбище, которое я и выкладываю на всеобщее посмешище.
Краткое описание:
В скрипте предусмотрен вызов двух типов меню. Если текст (или часть текста) в поле "Текст" выделен, клик по правой клавише мыши вызывает простое меню (см. приложенный скриншот) - в нем можно обрамлять выделенный текст тэгами стилей (<i>...</i>), всевозможными кавычками и скобками, менять регистр букв, искать синонимы и тд.
Более сложное меню вызывается правой же клавишей мышки при условии, что а) в поле "Текст" ничего не выделено либо б) поле "Текст" пусто (это происходит, если в таблице субтитров выбраны сразу несколько строк). Все функции в этом меню сгруппированы в несколько групп, а именно:
По каждой из перечисленных выше групп грядёт отдельный пост с описанием... Что ещё? Скрипт двуязычный, он сам определяет язык SW-интерфейса. Если UI-язык русский, скрипт создаёт русское меню и отчёты о проделанной работе (они выводятся прямо над полем "Текст"). В противном случае, всё будет написано на ломаном английском...
Ссылки для скачивания словарей:
Начиная с версии 0.02 в скрипте появились отдельные функции, требующие наличия внешних текстовых словарей. Процедура использования этих функций детально описана в последущих постах, а здесь, в шапке, я для удобства собрал только прямые ссылки для скачивания. Итак...
Набор (159KБ) для упрощения жизни тайпсеттера, который включает а) список дополнения скобок и кавычек, б) два файла с 2х- и 3хбуквенными макросами, а также в) частотный словарь для автоматического дополнения слов, собранный на основе сборника русских лемм, отсортированных по частоте С.А.Шаровым, и аналогичного сборника для английского языка от Adam Kilgarriff
Словарь антонимов (версия от 19.11.2010, автор: EdwART; размер = 74КБ)
И, наконец, словарь словоформ позволяет скрипту найти синонимы и антонимы не только к корневым словам (например, метла), а и к его производным (т.е., метлы, метле, метлой и т.д.) Я скомпиллировал несколько версий словаря. Чем больше размер, тем больше вероятность найти в нём корневое слово, и тем дольше длится поиск. Подчёркиваю: для работы нужен только один из перечисленных ниже словарей
В этом меню всего две взаимнообратных функции: весь загруженный в SW текст переводится (восстанавливается) в родную кодировку Windows (CP1251 = кириллица) или же конвертируется из неё в одну из указанных в списке пяти русских кодировок. Собственно, функция автовосстановления CP1251 уже былa выложенa здесь на форуме в виде отдельного скрипта. То есть в данной его реинкарнации добавлены функции конвертации в различные кодировки - может пригодиться для экстренных случаев...
Этот пункт менювключает список всевозможных вспомогательных функций, которые предназначены, в-основном, для тайпсеттеров. Среди этих функций:
исправление прописных букв на буквы заглавные (если они следуют после знаков окончания предложения, а именно - после .!? - и пробела).
исправление сдвоенных заглавных букв, ошибочно набранных, если Shift был отжат чуть позже (т.е. СЛово > Слово); учтите, что сдвоенных заглавных букв, набранных при включённом CapsLock, эта функция сознательно не исправляет.
дополнение скобок и кавычек парными символами, список которых помещен во внешний файл (Pascal Scripts\Dictionaries\AutoCorrection\Brackets.txt). В результате, пользователь имеет возможность безопасно для текста самого скрипта отредактировать нужные ему команды автодополнения.
отслеживание и выполнение 2х- и 3хбуквенных макросов, перечисленных, как и скобки с кавычками, во внешних файлах - соответственно в UserDic-2.txt и в UserDic-3.txt. Зачем это нужно? Скажем, +- можно автоматически заменить на ±; два последовательных минуса на знак тире, три последовательных точки на знак троеточия и т.д
наконец, последняя, самая "тяжёлая" для процессора функция - автоматическое распознавание слов по первым введённым буквам и их дополнение. Распознавание реализовано на основе английского и русского частотных словарей (Pascal Scripts\Dictionaries\AutoCorrection\CompleteWords.txt), в которых я оставил только слова, состоящие из 3х и более букв. Эта функция (пока) используется только в режиме набора текста, т.е. когда курсор стоит в крайнем правом положении. Ввиду особенностей русского языка (окончания, будь они неладны!) эта функция вряд ли будет очень полезна для набора русского текста, но для английского (особенно тем, кто владеет слепой печатью) может стать довольно серьёзным подспорьем.
Предусмотрено и быстрое - по хоткею Ctrl+Alt+T или через меню - блокирование перечисленных выше вспомогательных функций. Линк для скачивания набора внешних словарей, необходимых для работы перечисленных выше функций, указан в шапке темы. Напоминаю: каждый может отредактировать содержание текстовых словарей под свой собственный стиль печати, не влезая при этом в текст скрипта!
Редактирование (готового) текста
Удалить лишние пробелы
Удалить тэги стилей текста (Любые или Бесполезные)
Заменить одиночные кавычки '…' (на ‘…’ или ‚…’ или ‹…›)
Заменить двойные кавычки "…" (на “…” или „…” или «…»)
Заменить 3 точки троеточием
Ё(жи)фикация текста: Только бесспорные замены / Плюс сомнительные слова
Удалить лишние пробелы Функция сканирует текст выделенных титров на предмет лишних пробелов (двойных пробелов, ненужных пробелов в начале и конце строк, пробелов перед кое-какими спец. символами типа закрывающих кавычек, скобок и тп) и удаляет их.
Удалить тэги стилей текста Так как я планировал отказаться от встроенной в SW поддержки стилевых тэгов, мне пришлось самому написать две маленькие функции. Первая из них находит и удаляет любые тэги. Вторая находит и удаляет только те из них, которые никак не повлияют на то, как текст будет смотреться на экране - скажем, парные тэги вокруг пробелов, которыми зачастую грешат OCR-программы типа SubRip.
Заменить одиночные / двойные кавычки Функция находит в выделенных титрах симметричные кавычки (одиночные '...' или двойные "...") и заменяет их на несимметричные - те, в которых открывающая и закрывающая кавычки отличаются. Если количество симметричных кавычек в тексте титра нечётное, функция оставляет текст нетронутым.
Заменить 3 точки троеточием Простейшая функция замены трёх последовательных точек (3 байта) на символ троеточия (1 байт). Смысл? Выглядит одинаково, размер меньше. Да и фунция оценки количества букв в титре, необходимая для расчета длительности показа субтитра, не будет введена в заблуждение.
Ё(жи)фикация текста Данная функция появляется в меню только при наличии в папке ...\PascalScripts\Dictionaries\YO\ специального словаря Ё-слов. Исходник для него (версия 1.27) был взят с сайта http://vgiv.narod.ru/yo.html. Собственно, скомпиллированный словарь состоит из отдельных файлов, содержащих слова, начинающиеся с одной из букв русского алфавита (А.txt, Б.txt и т.д.) Полностью готовую к употреблению версию можно скачать здесь. Функция ё(жи)фикации слов имеет две опции. Если выбрать опцию Только бесспорные замены скрипт заменит е на ё только в тех словах, которые существуют в единственной форме, а именно - с буквой ё (скажем, одарённый, ночёвка). Если же выбрать опцию Плюс сомнительные слова (т.е. слова, существующие в двух формах одновременно - все и всё, берет и берёт), помимо бесспорных замен скрипт будет обрабатывать и сомнительные случаи - выводить интерактивное окно, где пользователь сможет выбрать правильный вариант самостоятельно.
Добавить ноту в начало строк Когда в титрах идёт текст песни, я обычно маркирую каждую из строк нотой. В CP1251-наборе классической ноты, к сожалению, нет - приходится использовать значок #. Но если кто-то планирует впоследствии загнать субтитры в SubtitleCreator, преобразовать их в SUP и, наконец, подмешать к DVD, то ему удобнее сразу добавить символ <s M> который SubtitleCreator автоматически распознает и заменит нотой.
Модифицированный Ctrl-E
1. Заменить дефисы и тире
2. Ctrl+E (это просто хоткей, вы сами должны вызвать стандартную функцию SW)
3. Обратная замена
Резать многострочные титры
на однострочные
на двухстрочные
Троеточия в местаx разрезов
Добавить
Удалить
Модифицированный Ctrl-E Хоткеи Ctrl-А и Ctrl+E я использую чаще других. Но со временем заметил, что вызываемая по второму из них функция Smart Line Adjust часто принимает дефисы и тире (а их в русском тексте хватает) за знак начала диалога. В результате, страдает разметка текста. Я попробовал обойти эту проблему распознаванием дефисов и тире и заменой их на визуально похожий символ (En Dash) - разметка диалогов стала получше. Ну а если кому-то всенепременно захочется восстановить дефисы и тире в виде минусов, выберите после выполнения первых двух шагов шаг №3 - "Обратная замена".
Резать многострочные титры Функция находит среди выбранных титров те, в которых больше строк, чем положено, и режет на несколько титров. Чтобы было понятнее: субтитр с семью строками при выборе опции "на однострочные" будет разделен на 7 однострочных титров, длительность показа которых будет пропорциональна количеству букв (зазор между субтитрами выставлен по умолчанию 80мс). Если выбрать опцию "на двухстрочные", то 7-мистрочный титр станет четырьмя титрами - тремя двухстрочными + одним однострочным.
Троеточия в местаx разрезов Поскольку при разрезании титров часто режутся и предложения, то при желании можно добавить (или убрать) в точки разрезов троеточие. Иначе говоря, функция анализирует и, при выполнении некоторых признаков, изменяет последний символ первого титра и первый символ второго.
Функция Блочное таймирование написана по просьбе Stevvie и становится доступной, если в списке титров выбраны два и более последовательных титров. Что она делает? В зависимости от введенных пользователем значений сдвига для начала и конца выбранного блока субтитров (в миллисекундах) она пересчитывает их тайминг. Кроме того, она позволяет гибко обходиться с субтитрами ДО и ПОСЛЕ выбранного блока - либо не трогать их совсем, либо смещать их на сдвиг первой или последней точки блока, либо экстраполировать их тайминг из параметров, заданных для блока.
Две последующих функции функции используются для массового изменения длительности показа предварительно выбранных титров. Первая функция (Удлинить время показа) увеличивает время скрытия титра на указанную величину. Если при увеличении оно достигает точки появления следующего титра (с точностью до некоего маленького зазора, 80мс), то удлинение времени показа на этом заканчивается.
Вторая функция тоже уважает зазор в 80мс, но... Она удлиняет не все, а только те титры, которые нельзя успеть прочитать при выбранной скорости чтения. Если быть совсем точным, то идеальное время показа титра расчитывается так:
Для продвинутых пользователей: функция "скорость чтения" довольно похожа на стандартную Ctrl+Shift-R - только она учитывает длину тэгов <i></i><b></b><u></u>, которыми стандартная SW-функция пренебрегает...
Сообщение отредактировал НуПогоди: 31 Июль 2011 - 17:11
[list][*]Удлинить время показа
+100 мс
+300 мс
+500 мс[*][i][font="Tahoma"][size="2"]
А можно сделать скрипт, где бы все сабы меньше заданной длительности удалялись? Например, все сабы короче 300мс - в топку?
После выдирания тайминга из хардсаба осталось много мусора с нулевыми и близкими к нулю значениями.
А можно сделать скрипт, где бы все сабы меньше заданной длительности удалялись? Например, все сабы короче 300мс - в топку?
Попробуй. По идее, должно работать...
program test;
var i: integer;
begin
i:=0;
while i<GetSubtitleCount do
if (GetSubtitleFinalTime(i)-GetSubtitleInitialTime(i))<300 then DeleteSubtitle(i)
else i:=i+1;
end.
[EDIT] А вот так пошустрее шуршать должен.
Сообщение отредактировал НуПогоди: 01 Декабрь 2010 - 19:50
Довёл до приемлемого вида словари и добавил к простому меню (оно возникает при выделенном тексте) поиск и замену синонимов и антонимов. Все словари (полностью готовые к употреблению) выложил на файлообменник, ссылки собраны в шапке темы.
Тем, кто хочет добавить к скрипту возможность работы с синонимами и/или антонимами надо
скачать последнюю версию скрипта и распаковать в папку ..\SubtitleWorkshop\PascalScripts\
скачать zip(ы) с синонимами и/или антонимами, распаковать его/их содержимое в папку ..\SubtitleWorkshop\PascalScripts\Dictionaries\
туда же (в папку \PascalScripts\Dictionaries\) нужно распаковать один из словарей русских словоформ StemsRU.txt
Предполагаемый вариант использования: левый двойной клик по интересующему вас слову в поле "Текст" = оно выделяется > правый клик мыши по полю "Текст" = появляется всплывающее меню > выбираем пункт меню Синонимы (или Антонимы) > выбираем подпункт меню с выбранным словом (самое верхнее) или с его корневой формой(ами) > клик по нужному синониму (или антониму), которым вы хотите заменить выделенное слово.
Пример использования: смотри скриншот в шапке! Синонимов к выделенному слову "биты" не найдено, зато словарь словоформ находит к нему сразу три корневых слова
бит (т.е. бит информации, множеств. число = биты)
бита (т.е палка в лапте и бейсболе, множеств. число = биты)
битый (прилагательное, краткая формы = биты),
к каждому из которых найдено #N-ое количество синонимов.
Примечание: Если отсутствует словарь словоформ или найти в нём корневую словоформу к выделенному слову не удалось, то скрипт ищет синонимы (антонимы) только к выделенному слову (с крайне низкими шансами на успех).
При отсутствии словарей синонимов и антонимов версия 0.03 скрипта будет работать в режиме версии 0.01, т.е. без поддержки поиска синонимов/антонимов (просто будет отсутствовать соответствующие пункты меню).
Выложил очередную модификацию скрипта. Список изменений:
добавлена функция ё(жи)фикация текста: в отличие от отдельного скрипта ё(жи)фикации в данной реинкарнации ё(жи)фикатора главным образом изменён формат словаря. Теперь он сознательно скомпиллирован так, что все Ё-слова, начинающиеся с одной из букв русского алфавита, помещены в отдельный файл (A.txt, Б.txt, и т.д.) Формат этих отдельных файлов: слово, в котором все буквы ё заменены на е, за ним следует метка (0-бит), затем один (или несколько битов), в котором/ых хранится позиция буквы ё в слове, и опять 0-бит. В результате, слегка уменьшилась скорость обработки, но зато скрипту не надо постоянно хранить в памяти весь словарь.
добавлена двухсторонняя функция конвертации кодировки UTF8: UTF8 > CP1251 и CP1251 > UTF8.
добавлена функция поиска корневой словоформы (кажется, её ещё называют парадигмой) к выделенному слову перед тем, как начать поиск в словарях синонимов и антонимов. Поскольку поиск синонимов (включая поиск парадигмы) стал занимать значительно больше времени (что особенно заметно на старых контуперах), я слегка изменил порядок создания простого меню - если раньше весь цикл поиска синонимов/антонимов осуществлялся непосредственно при создании меню по правому клику мыши, то теперь он вызывается только при выборе соответствующего пункта: Синонимы... или Антонимы к слову (т.е. подменю с синонимами изменяется динамически).
Кроме того: в соответствующих постах этой темы обновлены описания функций меню; словари выложены на бесплатный хостинг без ограничений по срокам хранения; ссылки на словари обновлены и выложены в шапке темы.
А можешь добавить кнопку Exit'а, чтобы скрипт не висел в контекстном меню дольше, чем он нужен? А то стандартные функции убираются далеко, приходится перезаходить в программу. (Или я просто не знаю как это сделать?)
Посмотрел бегло ёфикацию -- как я понял, она не заменяет автоматически того, что в программе Yo реализовано в файле yo_regexpr.dat -- различные выражения типа: ни в чём, всё равно, о нём и тд. Это так?
А можешь добавить кнопку Exit'а, чтобы скрипт не висел в контекстном меню дольше, чем он нужен? А то стандартные функции убираются далеко, приходится перезаходить в программу. (Или я просто не знаю как это сделать?)
Честно говоря, стандартными функциями мемо я пользуюсь исключительно по хоткеям (они ведь универсальные, виндовые: Ctrl-C, Ctrl-V, Ctrl-Z, etc), поэтому и в меню их добавлял скорее "бандитского форсу ради" ([EDIT] вспомнил! была когда-то бредовая идея сделать функцию мультиклипбоарда). "Выход из скрипта" (точнее говоря, восстановление стандартного простого меню) попробую добавить. Правда, со стандартной функцией Undo были, кажется, какие-то проблемы, надо будет взглянуть детальнее.
В качестве альтернативы, могу слепить конкретно под тебя версию, в которой будет переписан обработчик правого клика не по мемо, а по какому-нибудь другому элементу - хоть по главному окну SW, чуть выше/ниже/левее/правее текста мемо, хоть по какой-нибудь дополнительной кнопке, как пожелаешь... все стандартные функции мемо с текстом в этом случае останутся оригинальными.
Stevvie (04 Июль 2011 - 15:19) писал:
Посмотрел бегло ёфикацию -- как я понял, она не заменяет автоматически того, что в программе Yo реализовано в файле yo_regexpr.dat -- различные выражения типа: ни в чём, всё равно, о нём и тд. Это так?
Нет, не заменяет. Я сначала хотел было добавить и регэкпры, но потом отказался от этой идеи. Почему? Во-первых, они имеют смысл только при автоматической замене (лично я ей практически не пользуюсь). Во-вторых, текст разбивается на слова в пределах одного титра, т.е. регэкпры могут оказаться разрезанными на два титра; и, наконец, попытка анализировать текст не пословно, а пофразно, ну оооочень сильно замедлит процесс - т.е. скрипту придётся сперва прогнать текст титра в поисках каждой фразы из файла yo_regexpr.dat (на каждую фразу по функции Pos), отметить внесённые изменения, а остальное скармливать стандартному словарю. Имхо, овчинка выделки не стоит.
ПС. Я из этих же соображений (ненужные тормоза) не перехожу на более свежую версию Ё-словаря (вместо моей старой 1.27 сейчас уже есть версия 1.45 - туда добавлены в-основном фамилии, а кому они в титрах нужны?), более свежую версию тришинского словаря синонимов (сейчас уже есть 6.2, которая разрослась до совсем неприличных размеров за счёт синонимов типа город=Москва,Воркута,Чебоксары... или лекарство=анальгин,валидол,пурген...) Когда здоровая идея превращается в идею-фикс (как, скажем, у Тришина: любой ценой собрать саааамый большой словарь русских синонимов) - это не есть карашо.
Честно говоря, стандартными функциями мемо я пользуюсь исключительно по хоткеям (они ведь универсальные, виндовые: Ctrl-C, Ctrl-V, Ctrl-Z, etc)
А я вот к этому так и не привык, и уже наверное не привыкну, юзаю контекст
Цитата
В качестве альтернативы, могу слепить конкретно под тебя версию, в которой будет переписан обработчик правого клика не по мемо, а по какому-нибудь другому элементу
Эта "безвыходность" меня в принципе не напрягает, так что не нужно, фенкс. Надумаешь добавить в основной скрипт выход - хорошо, нет - так нет.
Цитата
ПС. Я из этих же соображений (ненужные тормоза) не перехожу на более свежую версию Ё-словаря (вместо моей старой 1.27 сейчас уже есть версия 1.45 - туда добавлены в-основном фамилии, а кому они в титрах нужны?)
В предыдущих версиях встречались ошибки, например "отеле" заменял без спросу на "отёле"
Надумаешь добавить в основной скрипт выход - хорошо, нет - так нет.
Скрипт заканчивает свою работу и выходит спустя доли секунды после его запуска - просто переписав обработчик события правый клик мыши по полю "Текст". Для "выхода" же в пользовательском смысле надо просто ещё раз переписать обработчик, восстановив то, что было до запуска скрипта. Если найду, как запустить функцию undo, то обязательно добавлю такую возможность. Если нет, то все равно добавлю, но меню останется без undo (ctrl-z) .
Stevvie (04 Июль 2011 - 17:25) писал:
В предыдущих версиях встречались ошибки, например "отеле" заменял без спросу на "отёле"
В текущей версии 1.27 слово "отеле" сомнительное, сам скрипт (без участия пользователя) его на "отёле" не заменит. Но в-целом ты, конечно, прав: в ближайшее же время прогоню версию 1.45, выкину из неё фамилии (точнее, всё, что начинается с заглавной буквы) и обновлю словарик.
Кстати, может есть идеи, какие ещё полезные словари можно сюда привесить? Может, поговорки какие-нибудь идиотские с пословицами? Да и не только словари... Мне ничего путного в голову не приходит.
В текущей версии 1.27 слово "отеле" сомнительное, сам скрипт (без участия пользователя) его на "отёле" не заменит.
Стало быть, предыдущая версия, которую я ставил, была младше 1.27
Цитата
Кстати, может есть идеи, какие ещё полезные словари можно сюда привесить? Может, поговорки какие-нибудь идиотские с пословицами? Мне ничего путного в голову не приходит.
Полно идей как улучшить сам воркшоп , а что можно выполнить через скрипт, даже не знаю. Например, словарь автозамен можно организовать? -- пишешь ае-, а скрипт меняет на Андрей Евгеньевич, и так же распространенные опечатки.
Например, словарь автозамен можно организовать? -- пишешь ае-, а скрипт меняет на Андрей Евгеньевич, и так же распространенные опечатки.
Автозамены-то? Легко... Только если отслеживать и менять текст непосредственно в процессе набирания текста, то имхо это будет нервировать, особенно с непривычки. Если же реализовать команду меню типа "Автоисправление ачипяток" и применять эту функцию к выделенным титрам, то идея выглядит более привлекательной - хотя всё равно не заменит стандартной проверки по F7. А самое главное тут - найти или самому составить словарик замен...
Stevvie (04 Июль 2011 - 19:28) писал:
Полно идей как улучшить сам воркшоп ...
Ты бы поделился, хотя бы совсем кратенько, а я на досуге подумаю, можно ли это реализовать скриптом.
Автозамены-то? Легко... Только если отслеживать и менять текст непосредственно в процессе набирания текста, то имхо это будет нервировать, особенно с непривычки. Если же реализовать команду меню типа "Автоисправление ачипяток" и применять эту функцию к выделенным титрам, то идея выглядит более привлекательной - хотя всё равно не заменит стандартной проверки по F7. А самое главное тут - найти или самому составить словарик замен...
Автозамена нужна такая, как она выполнена в Ворде, только в Вш. То есть пишешь кодовые символы (например ае-), ставишь пробел и они меняются на то, что в словаре замен. Ты выправляешь руками падеж и печатаешь дальше. Словарь неплохо бы взять оттуда же, из Ворд, сконвертировать его в простой текстовый файл, как словарь у ёжификатора, и дописывать в него свои замены через ноутпад. Как-то так.
Цитата
Ты бы поделился, хотя бы совсем кратенько, а я на досуге подумаю, можно ли это реализовать скриптом.
Напишу на днях в лс, эти пожелания надо еще как-то систематизировать.