Русские субтитры: Ёжификатор для Subtitle Workshop - Русские субтитры

Перейти к содержимому

  • (2 Страниц)
  • +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Ёжификатор для Subtitle Workshop

#1 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 45
  • Своих переводов: 19

Отправлено 05 Ноябрь 2007 - 12:55

Не слишком короткое введение

Итак, "ёфикатор" (мне, правда, как-то ближе название "ёЖИфикатор") для Subtitle Workshop (впоследствии SW). Писал исключительно из интереса освоить скрипты, но вещь получилась вполне функциональная... Что это такое? Текстовый скрипт. Он находит среди выбранных пользователем субтитров слова, содержащие буквы «Е» и/или «Ё», проверяет и, при необходимости, корректирует их, используя расширенную базу «Ё»-слов (yo2_127.zip) или в простонародье «Ё»-словарь. Другие подобные словари (yoX_XXX.dat) пока не тестировались, но по идее скрипт должен нормально работать со всеми расширенными версиями yo2_XXX.dat, т.е. с теми, в которых отсутствуют словоформы, начинающиеся на * (так называемые правила). Свежие версии словаря (а также программу YO.exe, которая обрабатывает обыкновенные текстовые файлы, а значит и сабы) можно найти на сайте http://vgiv.narod.ru/yo.html. После окончания обработки скрипт выдаёт результаты в виде окна (сколько слов обработано, сколько из них изменено, информацию о словаре и т.д).

Решил, что захламлять тему самим текстом скрипта не стоит. Тот, кому интересно, скачает доаттаченный zip и пpосмотрит текст в спокойной обстановке.

Как заставить скрипт работать?
  • Копируем сам скрипт "- YO -.pas" в папку ...\Subtitle Workshop\PascalScripts\
  • Скачиваем «Ё»-словарь (yo2_127.zip, ~0.2MB) и, простоты ради, копируем его туда же.
  • Открываем SW и загружаем туда свои субтитры.
  • Запускаем скрипт: Инструменты > Скрипты на Паскале > - YO - (или, с большой вероятностью, просто жмём комбинацию клавиш Shift+Ctrl+1).
  • Дальше следуем подсказкам, которые вам сделает уже сам скрипт...
Краткие пояснения настроек скрипта
  • Ускоренный запуск скрипта (необходимо ~1МБ места на диске) - в этом режиме на диске создаётся файл с ежифицированным словарём (т.е. буквы «Ё» во всех словах заменены на «Е»). При последующих запусках скрипта этот «Е»-словарь считывается с диска, а не получается в результате ежификации «Ё»-словаря, что даёт существенный выигрыш в скорости запуска скрипта.
  • Сохранять откорректированные титры в колонку «Перевод» - Если эта опция выбрана, то скрипт будет не переписывать откорректированный текст поверх исходного, а сохранять его в колонку «Перевод», которая появляется при включённом "Режиме перевода" (Ctrl-U). В этом режиме SW умеет сравнивать исходные ("Текст/Text") и откорректированные ("Перевод/Translation") субтитры и подсвечивать сделанные поправки, что иногда бывает очень кстати.
  • Только бесспорные замены - игнорируются замены, требующие ответа от пользователя.
  • Проверять расстановку Ё - если опция включена, то скрипт меняет как «Е» на «Ё», так и «Ё» на «Е», если нет - только первое.
  • Начинать с текущей позиции / Только выбранные субтитры - если опция включена, то скрипт будет обрабатывать только указанную часть субтитров, в противном случае - все субтитры, загруженные на данный момент в SW.
  • Спорные слова: «Ё» > «E» - опция, которая появляется только при выбранных Проверять расстановку «Ё» и Только бесспорные замены. Она позволяет два режима работы: безопасный (все "сомнительные" слова будут ежифицированы, т.е все буквы «Ё» будут заменены на «E») и консервативный (все "сомнительные" слова останутся без изменений. Сделан для тех, кто желает сохранить частично ёжифицированные фрагменты текста в автоматическом режиме поиска и замены).
  • Перед запуском скрипта проверить целостность «Ё»-словаря - для нормальной работы скрипта необходимо, чтобы слова в словаре следовали в алфавитном порядке. Рекомендуется использовать эту опцию только после обновления и/или самостоятельного редактирования словаря.
История изменений

[list]
[*]Версия 0.06 (02.12.2007) [list]
[*] Добавлена возможность проверки целостности «ё»-словаря (слова в нём должны следовать в алфавитном порядке).
[*] Файл конфигурации теперь сохраняется в папку, где лежат паскалевские скрипты .\PascalScripts\YO.ini (идея D!ig).
[*] Оптимизация скорости: в функциях IsYOEInside & YO2E побуквенный поиск заменён Pos-ом. Выигрыш по сравнению с прежней версией составил 10..15% 
[*] Оптимизация скорости: условие "разделителя" (c1<'А') & (c1<>'ё') & (c1<>'Ё') заменено на (c1 in RuAlphabet). Быстрее на ~3% (идея D!ig).
[*] Переписана функция ежификации «ё»-словаря - теперь заметно быстрее. 
[*] По многочисленным просьбам трудящихся текст скрипта частично сокращён.
[/list]
[*]Версия 0.05 (26.11.07)[list]
[*] [b]Окно диалога с настройками скрипта[/b]: добавлена опция [i]Сохранять откорректированные титры в колонку «Перевод»[/i]. Если эта опция выбрана, то скрипт будет не переписывать откорректированный текст поверх исходного, а сохранять его в колонку «Перевод», которая появляется при включённом "Режиме перевода" (Ctrl-U). В этом режиме SW умеет сравнивать исходные ("Текст/Text") и откорректированные ("Перевод/Translation") субтитры и подсвечивать сделанные поправки, что иногда бывает очень кстати (идея Bedazzle). 
[*] Добавлена опциональная проверка: включён ли в SW-настройках "Режим перевода" и предупреждение, если этого не сделано...
[*] [b]Окно диалога "сомнительных" слов[/b]: сейчас само окно (со всеми его компонентами) создаётся и уничтожается только один раз (идея D!ig).
[*] Теперь можно менять размеры окна и шрифта (левый и правый клик по тексту титра).
[*] Добавлен скроллбар для просмотра соседних титров.
[*] Дополнена обработка тэгов <i>, <b>, <u> & <c:#RRGGBB> в субтитрах.
[*] Добавлен выбор варианта сомнительного слова с клавиатуры: соответственно клавиши «ё» и «е», «Прервать»=«ь».
[*] Расширен список параметров в файле конфигурации.
[*] Дальнейшая оптимизация производительности скрипта (скорость поиска и замены увеличилась на ~15%). 
[*] Кое-какие косметические правки...
[/list]
[*]Версия 0.04 (18.11.2007) [list]
[*] В очередной раз переработана функция поиска и замены: приблизительно двукратный выигрыш по скорости по сравнению с версией 0.03 (14.11.2007) 
[*] Вместо того, чтобы каждый раз при запуске скрипта создавать в памяти «Е»-словарь (он нужен для поиска), пользователю предоставлена возможность создать файл с этим словарём на диске (требуется столько же свободного места на диске, сколько занимает «Ё»-словарь, т.е. ~1MB). При последующих запусках скрипта с диска будут считываться оба словаря, что даёт большой выигрыш в длительности подготовительных процедур: 0.1s в текущей версии против 7.0s в версии 0.03. В диалог настроек скрипта добавлена соответствующая опция для выбора "Ускоренного запуска скрипта" (15.11.2007) 
[*] Добавлено автоматическое сохранение настроек скрипта: последние настройки записываются в текстовый файл c:\Windows\YO.ini (при выходе из скрипта) и считываются оттуда при каждом последующем запуске скрипта (18.11.2007)
[*] Исправлен мелкий баг в процедуре коррекции слов (18.11.2007)
[/list]
[*]Версия 0.03 (11.11.2007)[list]
[*] Исправлен баг с подчеркиванием "сомнительных" букв (обнаружен Stevvie) 05.11.2007 
[*] Исправлен баг: не считывалась последняя буква словаря и, как следствие, неверно распознавалось последнее слово - для версии 1.27 слово "ящерёнок" (НуПогоди) 06.11.2007
[*] Фиксированный параметр SIZE, отвечающий за размер выделенной под словарь памяти, теперь определяется автоматически. Больше ошибок, возможных, скажем, при замене словаря словарём большего размера, возникать не должно. Немного изменена функция считывания из файла словаря > Довольно приличный выигрыш в длительности загрузки (НуПогоди) 06.11.2007
[*] При ошибке считывания файла со словарём появилась возможность изменить путь к словарю... Пока только как стринг и пока изменённый адрес не сохраняется (запрос Stevvie) 08.11.2007
[*] Переписаны стандартные SW-диалоги, теперь они полностью независимы от языка SW-интерфейса. Кроме того, они стали чуть "красивее" и, что важнее, функциональнее. (НуПогоди) 10.11.2007
[*] В диалоге настроек скрипта появилась новая опция «Спорные слова: «Ё» > «Е», определяющая как скрипт будет обходиться со спорными словами в режиме автокоррекции: теперь скрипт может либо оставлять такие слова без изменения, либо (безопасности ради) полностью их ежифицировать: "всё">"все" (НуПогоди) 10.11.2007
[*] Обнаружен и исправлен баг в процедуре коррекции слов: в словах с несколькими буквами «Ё» корректировалась только первая буква. Теперь, по крайней мере для несомнительных слов, меняются ВСЕ буквы Ё. Надо поиграться со случаем, когда слово в словаре содержит насколько букв Ё и флажок сомнений «?» одновременно. Кажется, таких слов нет (НуПогоди) 11.11.2007...
[*] Добавлен минисловарь = буквально пару наиболее часто встречаемых слов ("не" & "же") > даёт небольшое ускорение в процедуре поиска и замены. Эффект зависит от содержания титров. Для примера 10x"Джентельмены предпочитают блондинок": без минисловаря - 1:21, с минисловарём - 1:18 (3.8%).
[*] После всех оптимизаций проведены тесты по скорости а) загрузки словаря и б) самой процедуры поиска и замены. Длительность загрузки словаря по сравнению с версией 0.02 уменьшилась на 11.7972-7.09091=4.70629s. Скорость поиска и замены: 3.8483 words/ms > 3.1053 words/ms = 23.9% (НуПогоди) 11.11.2007
[/list]
[*]Версия 0.02 (04.11.2007) Переписана функция поиска, теперь она заметно быстрее. Отдельные диалоги настроек заменены на единое окно с чекбоксами. Первая публичная версия. 
[*]Версия 0.01 (01.11.2007) Первая мало-мальски функциональная версия. О-о-чень ме-едленная...
[/list]

Проблемы: большие и не очень
  • По умолчанию скрипт требует довольно много времени на начальные процедуры. Причина проста: для поиска скрипту необходимо создать в памяти «Е»-копию «Ё»-словаря (т.е. просканировать около миллиона букв «Ё»-словаря и заменить все имеющиеся там буквы «Ё» на буквы «Е»). Начиная с версии 0.04 добавлена возможность ускорять загрузку скрипта за счёт создания на диске дополнительного «Е»-файла (он создаётся рядом с файлом «Ё»-словаря), который будет считываться при всех последующих запусках. Время, которое тратится на загрузку такого файла, несравнимо меньше чем, время, необходимое на его получение путем обработки «Ё»-словаря.
  • Скрипт работает только с новыми (yo2_XXX.dat) версиями «Ё»-словаря. Старые версии содержат так называемые правила (их легко отличить: в словаре они идут сразу же после комментариев # и начинаются на *). Хотя обработка таких правил и, как следствие, поддержка старых версий словарей может быть реализована достаточно просто, заниматься этим я пока не планирую.
  • Возможны проблемы, если в словаре найдётся слово с несколькими буквами «Ё» (скажем, "трёхведёрный"), но заканчивающееся на '?' (флажок сомнений). В этом случае в диалоге выбора «Ё»- или «Е»-варианта, как и обычно, будет выведено слово из словаря (с буквами «Ё») и слово, в котором ВСЕ буквы «Ё» заменены на «Е».
Достоинства
  • Скрипт работает, не выходя из SW. Откат сделанных изменений (сколько бы "ошибок" скрипт ни исправил) делается в один клик (Edit > Undo = Ctrl-Z).
  • Как вы сами понимаете, скрипт - это всего лишь текст, так сказать полный open-source. Таким образом, подкорректировать его под собственные нужды и чаяния может (почти) любой.
Багрепорты

Багрепорты будут категорически приветствоваться при соблюдении следующих условий:
  • Предварительно убедитесь, что проблема не связана с тем, что буква «Е» в русском слове была случайно набрана при английской раскладке клавиатуры. Русское «Е» и английское «Е» только для человека выглядят одинаково, скрипт же чётко различает их и рассматривает английское «Е» (как впрочем и все английские буквы) в качестве разделителя. Например, если «Е» - английское, то для скрипта слово "благонадежный" эквивалентно двум словам "благонад" и "жный". Со всеми вытекающими последствиями: коррекции "благонадежный" > "благонадёжный" вам не дождаться.
  • Убедитесь, что проблема не связана со словарём. Иначе говоря, если вы заметили, что фамилия любимой актрисы (скажем, Одри Хепберн) после обработки скриптом превратилась в "Хепбёрн", а вас это непадецки коробит, то сперва поищите это слово в вашем «Ё»-словаре. Если там есть слово "хепбёрн" (а оно там есть), не бомбите меня багрепортами. Для начала советую убрать это слово из словаря. Если же вас этот вариант не устраивает, то пишите багрепорт в ту самую уважаемую организацию, в которую Остап Бендер некогда советовал обращаться моему знаменитому земляку. ;)
  • Ну и наконец... В словаре всё ОК, а скрипт чего-то намудрил. Тогда не пишите в стиле "Всё пропало, шеф!", а постарайтесь описать проблему по-человечески. И обязательно укажите, на каком именно фрагменте текста обнаружена проблема, просто сделайте copy-paste - из субтитров в багрепорт.
Планы, идеи & предложения
  • Есть планы функции проверки словаря на целостность (алфавитный порядок слов) и его упорядочения при обнаружении ошибок.
  • Если есть идеи - пишите. Хоть скриптовый язык прилично ограничен в возможностях, но если что смогу - сделаю. Опять же... см. "Достоинства", п.2.

Прикрепленные файлы

  • Прикрепленный файл  __YO__.zip (12,88К)
    Количество загрузок:: 13

Сообщение отредактировал НуПогоди: 04 Декабрь 2007 - 21:40

0

#2 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 45
  • Своих переводов: 19

Отправлено 05 Ноябрь 2007 - 13:08

Решил добавить некоторые технические детали и вопросы, которые у меня вызывают некое беспокойство. В-принципе, читать эти "помои" среднестатистическому гражданину не стоит, а посему использовал великое изобретение subtitles - спойлер.
» Для скриптовых корифеев и всех тех, кому хронически нечем заняться «

0

#3 Пользователь офлайн   Stevvie Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 1 687
  • Регистрация: 02 Июль 04
  • Пол:Мужчина
  • Страна:
  • Прислал(a) субтитров: 120
  • Своих переводов: 46

Отправлено 05 Ноябрь 2007 - 15:40

Спасибо, НуПогоди! Постоянно пользуюсь этой программой, теперь, стало быть, можно для этого не выходить из SW. :)

Про баги -- попробуй проверить титры с таким текстом:
1
В то лето, когда мне было восемь лет...
2
Вертолет летал уже семь лет.

погляди, что будет если в диалоге выберешь поставить Ё, и если не поставить.

И два маленьких пожелания:
Не хотелось бы держать словарь в скриптах, нельзя ли там выдать запрос на путь к файлу?
Не лучше ли будет, если когда нажимаешь кнопку Прервать, он дает фокус на ту ячейку, на которой остановился?
0

#4 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 45
  • Своих переводов: 19

Отправлено 05 Ноябрь 2007 - 17:12

Просмотр сообщенияStevvie (5.11.2007, 12:40) писал:

В то лето, когда мне было восемь лет...
Вертолет летал уже семь лет.
Aга! Понятно... Если в тексте субтитра сначала встречается последовательность букв, аналогичная "сомнительному" слову (оно выводится на кнопках выбора внизу диалога), то подчёркивается буква в этом первом стринге, а не в слове. В твоих примерах, скрипт спрашивает как ему писать слово "лет", а подчеркивает "лето" и "вертолет" (слова "лёто" в словаре нет и диалога с сомнениями к нему тоже быть не может, а "вертолёт" он поправит без всяких вопросов). В оправдание: подчёркивание делалось как альтернативный вариант (когда заметил, что не все слова на кнопку влезают) и как следует не тестировалось. На кнопках всё правильно: написаны варианты "сомнительного" слова и выбор работает. И при выборе ориентироваться надо на них. Подчёркивание поправлю...

Просмотр сообщенияStevvie (5.11.2007, 12:40) писал:

И два маленьких пожелания: Не хотелось бы держать словарь в скриптах, нельзя ли там выдать запрос на путь к файлу? Не лучше ли будет, если когда нажимаешь кнопку Прервать, он дает фокус на ту ячейку, на которой остановился?
И то, и другое - достойные идеи, взял на заметку... Первое сделать не очень трудно, со вторым дело обстоит хуже. Слишком многого от скрипта не жди: как я уже писал, тут работает только очень малая часть стандартных паскалевских функций. А пока я буду туго соображать как это реализовать (может, Bedazzle что-то умное подскажет?), 1) народу пока придётся собственными руками править путь на словарь в тексте самого скрипта [лежать он может, как сам понимаешь, где угодно] и 2) делать джамп на последний обработанный титр самому по Ctrl-G.

ПС. Как первый официальный багрепортер получаешь большое человеческое спасибо.
0

#5 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 991
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 96
  • Своих переводов: 16

Отправлено 06 Ноябрь 2007 - 02:50

Просмотр сообщенияНуПогоди (5.11.2007, 10:55) писал:

Итак, "ёфикатор" (мне, правда, как-то ближе название "ёЖИфикатор") для Subtitle Workshop


Жаль, нельзя честными методами несколько раз "отспасибить". :)
0

#6 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 991
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 96
  • Своих переводов: 16

Отправлено 06 Ноябрь 2007 - 03:03

Просмотр сообщенияНуПогоди (5.11.2007, 11:08) писал:

Решил добавить некоторые технические детали и вопросы, которые у меня вызывают некое беспокойство.


for k:=1 to Length(src) do


здесь у тебя на каждом проходе цикла подсчитывается длина. Лучше так:

x := Length(src);
for k:=1 to x do


Более подробно потом покопаю.
0

#7 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 991
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 96
  • Своих переводов: 16

Отправлено 06 Ноябрь 2007 - 03:25

Просмотр сообщенияНуПогоди (5.11.2007, 11:08) писал:

как в скрипте считывать файл построчно или побуквенно[/b] (а не весь целиком)


так пробовал?

var
   aaa: array of byte;
   strmInput: TMemoryStream;

begin
   ...
   strmInput := TFileStream.Create('yo.dat',fmOpenRead);
   SetLength(aaa, 100);
   strmInput.ReadBuffer(aaa, Length(aaa) );
   ...
end;

0

#8 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 45
  • Своих переводов: 19

Отправлено 06 Ноябрь 2007 - 12:49

Просмотр сообщенияBedaZzle (6.11.2007, 0:25) писал:

так пробовал?
Нет, пока я в этом направлении не копал. Спасибо, сегодня-завтра попробую... Вчера вечером в-основном занимался диалогами: самое простое, и к тому же... уж больно я привык, когда интерфейс у меня английский. Часть диалогов уже переписал. Как доделаю все, выложу и соответствующим образом подредактирую описание скрипта (мол, русский фейс уже не нужен).

Заодно сделал кой-какие прикидки по поводу идеи Stevvie вызывать стандартный диалог открытия файла, чтобы локализовать путь к словарю: попробовал стандартный TOpenDialog, оказалось, что в скрипте он не поддерживается. Похоже, придётся городить самокорректирующийся скрипт. Ведь, по идее, после того, как SW скомпиллировал из текста скрипта что-то работоспособное, этот самый текст можно считать и изменить. Что именно считать и изменить? Настройки, ессно: птички в диалоге настроек, путь к словарю и тп. А путь этот, например, определять в каком-нибудь диалоге со встроенным TEdit. Гораздо хуже обстоит дело с джампом по Прервать на последний обработанный титр (идея все того же Stevvie). Тут скрипт должон взаимодействовать с Воркшопом, а кроме тех очень ограниченных функций, которые изволили перечислить в example.pas, под рукой ничего нет. Ладно... Буду думать. Иногда это полезно ;)
0

#9 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 991
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 96
  • Своих переводов: 16

Отправлено 06 Ноябрь 2007 - 15:01

Просмотр сообщенияНуПогоди (6.11.2007, 10:49) писал:

Тут скрипт должон взаимодействовать с Воркшопом, а кроме тех очень ограниченных функций, которые изволили перечислить в example.pas, под рукой ничего нет.



Можно сделать через (_|_) - запустить из скрипта внешнюю прогу, которая пошлёт сообщение воркшопу, что нужно "прыгнуть" на необходимый субтитр. ;)
0

#10 Пользователь офлайн   D!ig Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 140
  • Регистрация: 11 Март 06
  • Страна:

Отправлено 07 Ноябрь 2007 - 04:44

Просмотр сообщенияНуПогоди (6.11.2007, 11:49) писал:

Заодно сделал кой-какие прикидки по поводу идеи Stevvie вызывать стандартный диалог открытия файла, чтобы локализовать путь к словарю: попробовал стандартный TOpenDialog, оказалось, что в скрипте он не поддерживается. Похоже, придётся городить самокорректирующийся скрипт.

А WinApi в скриптах использовать можно? Если да, то есть GetOpenFileName - вызывает стандартный Open диалог.
---
В основной функции есть такой код:
txt:=Copy(text, n, 1);
if ( ((txt>='А')and(txt<='я')) or (txt='Ё') or (txt='ё') ) then				
word:=word+txt

Почему бы не заменить на:
txt := text[n];
if ( ((txt>='А')and(txt<='я')) or (txt='Ё') or (txt='ё') ) then				
word:=word+txt;

Или даже такой:
if ( ((text[n]>='А')and(text[n]<='я')) or (text[n]='Ё') or (text[n]='ё') ) then
word:=word+text[n];

А вот так вроде не прокатывает :(:
 if (text[n] in ['А'..'я']) or (text[n]='Ё') or (text[n]='ё') then
 word:=word+text[n];

А лучше это вообще убрать. И вместо добавления к word по 1 символу, завести 2 переменные FirstL, LastL, а потом сделать word := Copy(Text, FirstL, LastL - FirstL);

P/S/
Скачал только скрипт. Поэтому предложенные изменения не проверял.

P/P/S
Вот еще такое изменение могу предложить :), но этого не критично.

procedure Btn1Click(Sender: TObject);
begin
	ASK := Chk1.Checked;
	REGIME := 1 + byte(Chk2.Checked);

	//Всегда если chk3.checked = false переменной start присваивается 1.
	if (not Chk3.Checked) then start:=1; 

	// finish:=num делается в 3 случаях из 4 и незачем гору If'ов городить.
	if not ((start<>finish) and chk3.checked)
	then finish:=num;	
 end;

0

#11 Пользователь офлайн   D!ig Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 140
  • Регистрация: 11 Март 06
  • Страна:

Отправлено 07 Ноябрь 2007 - 05:44

Так. Оказывается SubtitleWorkshop использует innerfuse Pascal Script III 1,20, который больше не поддерживается. Ему на замену пришел RemObjects Pascal Script.
http://remobjects.com/?ps
http://remobjects.com/?ps1
Бесплатно. Дают вместе с исходниками. И обещаны примеры. Документации никакой на сайте не нашел.

IPSIII также использует программа NetView, в которой есть довольно подробная справка по написанию скриптов. IPSIII вроде как поддерживает работу с DLL, но вроде как это не входит в набор базовых функций, для этого подключать надо плагин.
0

#12 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 991
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 96
  • Своих переводов: 16

Отправлено 07 Ноябрь 2007 - 10:49

Просмотр сообщенияD!ig (7.11.2007, 3:44) писал:

Оказывается SubtitleWorkshop использует innerfuse Pascal Script III 1,20


Точно так.
0

#13 Пользователь офлайн   D!ig Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 140
  • Регистрация: 11 Март 06
  • Страна:

Отправлено 07 Ноябрь 2007 - 19:02

Просмотр сообщенияBedaZzle (7.11.2007, 9:49) писал:

Точно так.

Документации что ли нету?

Расковырял Win32dasm'om экзешник там куча интресных строк есть :). Прототипы функций, типы, классы и тд. Может это то что он поддерживает?

Ну а внешнюю, из DLL, функцию вызвать можно или нет?
0

#14 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 45
  • Своих переводов: 19

Отправлено 07 Ноябрь 2007 - 19:22

Код на предмет лаконичности я пока не чистил (некогда было), поэтому многоэтажные варианты a-la Btn1Click наверняка есть и в других местах. Если найдёте ещё что-нибудь, дайте знать. Дойдут руки - поправлю... А пока:
  • заменил фиксированное значение SIZE на переменную, которая определяется из fs:=TFileStream.Open('yo.dat',fsOpenRead); SIZE:=fs.Size, после чего можно аллокировать под словарь ровно столько памяти, сколько нужно text:=StringOfChar(' ',SIZE)
  • поправил мелкий баг: при сортировке text, куда сначала копируется словарь, не переписывалась в YO[33] (это стринг со словами, начинающимися на "Я") последняя буква и, соответственно, последнее слово "ящерёнка" получалось урезанным "ящерёнк" (со всеми вытекающими).
  • нарисовал полноценный диалог финального отчёта.
Дождусь выходных - будет время и код почистить, и диалоги дорисовать, и чужими идеями заняться.
0

#15 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 991
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 96
  • Своих переводов: 16

Отправлено 07 Ноябрь 2007 - 23:43

Просмотр сообщенияD!ig (7.11.2007, 17:02) писал:

Документации что ли нету?


автор скоро год как на мыло не отвечает :(((


Просмотр сообщенияD!ig (7.11.2007, 17:02) писал:

Расковырял Win32dasm'om экзешник там куча интресных строк есть :). Прототипы функций, типы, классы и тд. Может это то что он поддерживает?


скорей всё, что он использует из VCL

Просмотр сообщенияD!ig (7.11.2007, 17:02) писал:

Ну а внешнюю, из DLL, функцию вызвать можно или нет?


буду изобретать, ибо LoadLibrary находится в windows.pas, а использовать модули отличные от system затруднительно
можно конечно подвесить дополнительный функционал через SubtitleAPI.dll :)))
0

#16 Пользователь офлайн   D!ig Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 140
  • Регистрация: 11 Март 06
  • Страна:

Отправлено 08 Ноябрь 2007 - 02:09

Просмотр сообщенияBedaZzle (7.11.2007, 22:43) писал:

автор скоро год как на мыло не отвечает :(((
скорей всё, что он использует из VCL
буду изобретать, ибо LoadLibrary находится в windows.pas, а использовать модули отличные от system затруднительно
можно конечно подвесить дополнительный функционал через SubtitleAPI.dll :)))

Автор innerfuse Pascal Script или SW?

Просмотр сообщенияBedaZzle (7.11.2007, 22:43) писал:

скорей всё, что он использует из VCL

Но там например упомянут TStringList. И в скриптпе его использовать можно. Глянул свою VCL программку ничего подобного Win32dasm не находит.
Вот например:
"Function Sqrt(e : Extended) : "
"Function StrGet(var S : String; "
"Function StringOfChar(c : char;I "
"function StrToDate(const s: string): "
и такого добра там полно.

Просмотр сообщенияBedaZzle (7.11.2007, 22:43) писал:

буду изобретать, ибо LoadLibrary находится в windows.pas, а использовать модули отличные от system затруднительно
можно конечно подвесить дополнительный функционал через SubtitleAPI.dll :)))

Тоже что ль поковырятся :unsure: .
0

#17 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 991
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 96
  • Своих переводов: 16

Отправлено 08 Ноябрь 2007 - 04:01

Просмотр сообщенияD!ig (8.11.2007, 0:09) писал:

Автор innerfuse Pascal Script или SW?


SW

Просмотр сообщенияD!ig (8.11.2007, 0:09) писал:

Но там например упомянут TStringList. И в скриптпе его использовать можно. Глянул свою VCL программку ничего подобного Win32dasm не находит.


А в твоей программке используется TStringList?

Просмотр сообщенияD!ig (8.11.2007, 0:09) писал:

Вот например:
"Function Sqrt(e : Extended) : "
"Function StrGet(var S : String; "
"Function StringOfChar(c : char;I "
"function StrToDate(const s: string): "
и такого добра там полно.


Про StrGet не знаю, а остальные - вполне себе нормальные функции Delphi. ;)
0

#18 Пользователь офлайн   D!ig Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 140
  • Регистрация: 11 Март 06
  • Страна:

Отправлено 08 Ноябрь 2007 - 22:42

Просмотр сообщенияBedaZzle (8.11.2007, 3:01) писал:

А в твоей программке используется

Да. А чего в этом такого?
А описания функций с параметрами точно нет. ("Function Sqrt(e : Extended) : ")

Просмотр сообщенияBedaZzle (8.11.2007, 3:01) писал:

Про StrGet не знаю, а остальные - вполне себе нормальные функции Delphi. ;)

Скачал я этот IPS глянул как оно работает. Нифига нельзя system, windows и т.д. из скрипта использовать.

Все функции, типы, классы, свойства, методы регистрируются.
  s.AddFunction('function inttostr(i: Longint): string;');
  cl.se.AddTypeS('TScrollEvent', 'procedure(Sender: TObject; ScrollCode: TScrollCode;var ScrollPos: Integer)');
  Cl.Se.AddConstantN('odSelected', 'Byte')^.Value.Value := #1;
  with Cl.Add(cl.FindClass('TWINCONTROL'), TSCROLLBAR) do
  begin
	RegisterProperty('KIND', 'TSCROLLBARKIND', iptrw);
 и т.д.

Поэтому, как я и думал, Win32dasm показывает все что было зарегистрировано, а значит может быть доступно из скриптов. А значит можно получить список доступных скриптам функций и тд.
---
IPS, вообще-то, поддерживает внешние (из Dll) функции.
Описываеться должно в начале скрипта вот так:
function FindWindow(C1, C2: PChar): Longint; external 'FindWindowA@user32.dll stdcall';

Попробовал, ругается "Semicolon ';' expected;" и указывает на 1 символ следующей строки. Думал может он вообще не понимает что я от него хочу.

Попробовал вот так.
function FindWindow(C1, C2: PChar): Longint; external;

Ругается "String Error. String Expected." и указывает куда то в конец строки с объявлением функции.

Получается он все таки ждет строку, а раз так то и понимает объявления внешних функций?

Просмотр сообщенияBedaZzle (7.11.2007, 22:43) писал:

буду изобретать, ибо LoadLibrary находится в windows.pas, а использовать модули отличные от system затруднительно

Не получилось у меня через LoadLibrary говорит не знаю шо такэ.
0

#19 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 45
  • Своих переводов: 19

Отправлено 09 Ноябрь 2007 - 13:03

Просмотр сообщенияD!ig (8.11.2007, 19:42) писал:

Поэтому, как я и думал, Win32dasm показывает все что было зарегистрировано, а значит может быть доступно из скриптов. А значит можно получить список доступных скриптам функций и тд.

О! А ты можешь каким-нибудь образом выдрать эту информацию и выложить список доступных скриптам функций? Всем заинтересованным было бы грАмадное подспорье. А то методом научного тыка выходит очень уж медленно.
PS. Внешние dll - тоже очень интересно. Надо будет посмотреть на досуге...
0

#20 Пользователь офлайн   D!ig Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 140
  • Регистрация: 11 Март 06
  • Страна:

Отправлено 10 Ноябрь 2007 - 01:53

Просмотр сообщенияНуПогоди (9.11.2007, 12:03) писал:

PS. Внешние dll - тоже очень интересно. Надо будет посмотреть на досуге...

Внешние DLL - решили бы очень много проблем, но что то странное с ними.

Просмотр сообщенияНуПогоди (9.11.2007, 12:03) писал:

О! А ты можешь каким-нибудь образом выдрать эту информацию и выложить список доступных скриптам функций? Всем заинтересованным было бы грАмадное подспорье. А то методом научного тыка выходит очень уж медленно.

Проще наверно из исходниов IPS'а выдрать. Попробую. Но только список. Никаких описаний.
---
Расковырял исходники IPS. ОЙ! Возможностей у скриптов оказывается больше чем я думал. Особенно в обасти UI строения. Самое интересное, что из скрипта можно обратится к Application (например: Application.minimize - сворачивает окно SW). Через Application можно добраться до MainForm, а оттуда до любого контрола. :o
---
    Для начала.
    [list=1]
  • Список ключевых слов:
    [color="#33CCFF"]
    and
    array
    as
    begin
    break
    case
    chr
    class
    const
    constructor
    continue
    destructor
    div
    do
    downto
    else
    end
    except
    exit
    export
    external
    finally
    for
    forward
    function
    goto
    if
    implementation
    in
    inherited
    interface
    is
    label
    mod
    not
    of
    or
    ord
    override
    private
    procedure
    program
    property
    protected
    public
    published
    record
    repeat
    set
    shl
    shr
    then
    to
    try
    type
    unit
    until
    uses
    var
    virtual
    while
    with
    xor
    [/color]
    

  • Стандартные функции:
    [color="#33CCFF"]
    function  floattostr (e: extended): string;
    function  inttostr (i: Longint ): string;
    function  strtoint (s: string ): Longint;
    function  strtointdef(s: string; def: Longint): Longint;
    function  pos (substr, s: string): Longint;
    function  copy (s: string; ifrom, icount: Longint): string;
    procedure delete(var s: string; ifrom, icount: Longint): string;
    procedure insert(s: string; var s2: string; ipos: Longint): string;
    function  getarraylength(var v: array): Integer;
    procedure setarraylength(var v: array; i: Integer);
    
    function  StrGet(var S: String; I: Integer): Char;
    procedure StrSet(c: Char; I: Integer; var s: String);
    function  Uppercase(s: string): string;
    function  Lowercase(s: string): string;
    function  Trim (s: string): string;
    function  Length (s: String): Longint;
    procedure SetLength(var s: String; l: Longint);
    function  Sin (e: Extended): Extended;
    function  Cos (e: Extended): Extended;
    function  Sqrt (e: Extended): Extended;
    function  Round(e: Extended): Longint;
    function  Trunc(e: Extended): Longint;
    function  Int (e: Extended): Longint;
    function  Pi : Extended;
    function  Abs (e: Extended): Extended;
    function  StrToFloat(s: string ): Extended;
    function  FloatToStr(e: Extended): String;
    function  Padl (s: string; I: longInt): string;
    function  Padr (s: string; I: longInt): string;
    function  Padz (s: string; I: longInt): string;
    function  Replicate (c: char; I: longInt): string;
    function  StringOfChar(c: char; I: longInt): string;
    
    type TVarType = (vtNull, vtString, vtU64, vtS32, vtU32, vtS16, vtU16, vtS8, vtU8,
    vtSingle, vtDouble, vtExtended, vtResourcePointer, vtArray, vtRecord);
    function  VarGetType(x: Variant): TVarType;
    function  Null: Variant;
    
    type
    TIFException = (ErNoError, erCannotImport, erInvalidType, ErInternalError,
    erInvalidHeader, erInvalidOpcode, erInvalidOpcodeParameter, erNoMainProc,
    erOutOfGlobalVarsRange, erOutOfProcRange, ErOutOfRange, erOutOfStackRange,
    ErTypeMismatch, erUnexpectedEof, erVersionerror, ErDivideByZero, ErMathError,
    erCouldNotCallProc, erOutofRecordRange, erOutOfMemory, erException,
    erNullPointerException, erNullVariantError, erCustomError);
    
    procedure RaiseLastException;
    procedure RaiseException(Ex: TIFException; Param: string);
    function  ExceptionType: TIFException;
    function  ExceptionParam: string;
    function  ExceptionProc: Cardinal;
    function  ExceptionPos: Cardinal;
    function  ExceptionToString(er: TIFException; Param: string): string;
    [/color]
    
-----
P/S/
Хотел покрасить синтаксис, это несложно, но на один этот кусок ушло бы 100Кб :mad:
P/P/S
Хотел поместить в 2 спойлера, 1-й работает 2-й нет. По началу вроде ОК было, а после редактирования сообщения 2-й перестал работать :(
0

  • (2 Страниц)
  • +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему