Итак, "ёфикатор" (мне, правда, как-то ближе название "ёЖИфикатор") для 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.
Решил добавить некоторые технические детали и вопросы, которые у меня вызывают некое беспокойство. В-принципе, читать эти "помои" среднестатистическому гражданину не стоит, а посему использовал великое изобретение subtitles - спойлер.
» Для скриптовых корифеев и всех тех, кому хронически нечем заняться «
Для оценки скорости скрипт сравнивался с программой YO.ехе версии 0.86, взятой всё с того же многострадального сайта http://vgiv.narod.ru/yo.html. Сравнение проводилось на одном и том же тестовом SRT-файле. Быстродействие оценивалось из данных (колонка CPU Time = время, потраченное "камнем" на процесс) в стандартном окне Task Manager. Скрипт написан так, что поиск оптимизирован по скорости за счёт однократной, предварительной сортировки словаря (как я уже писал, для словаря yo2_127.dat на моём Athlon это занимает 7 секунд). Сам же поиск в скрипте - довольно шустрый, шустрее, чем реализован в YO.exe (как я подозреваю, в-основном за счёт того, что YO.exe версия 0.86, по крайней мере, скроллирует корректируемый текст, а скрипт выводит окно с текстом только при обнаружении "сомнительных" слов). То есть, чем длиннее субтитры, тем выгоднее пользоваться скриптом. Скажем, титры к "Амадеус" - 1714 титров, 3097 слов, содержащих "e" и «ё». Полный цикл обработки: YO.ехе - 23 сек, SW-скрипт - 21 сек (это полный цикл, т.е. загрузка словаря = 0:07 + время на поиск и коррекцию = 0:14). Теста ради соорудил титры подлиннее: тот же "Амадеус", но повторённый 2х, 3х и 4х. Видим то, что и должны видеть: выигрыш скрипта перед YO всё больше и больше. А полное время для скрипта с приличной точностью равно 0:07 + 0:14 * k...
Скорее всего, на более коротких сабах скрипт будет проигрывать YO.exe за счёт тех самых "7-ми секунд" на считывание и сортировку словаря... Вот если бы кто подсказал, как в скрипте считывать файл построчно или побуквенно (а не весь целиком) - думаю, что это помогло бы сократить "7сек" вдвое-втрое. На "нормальном" языке программирования - это совсем не проблема. Но в этих идиотских скриптах добрая половина стандартных функций (в т.ч. связанные с обработкой файлов) просто не работает. Я, по крайней мере, пока не догадался, как это сделать. "Будем искать".
И пару слов о памяти... По идее "кушать" её скрипт должен чуть больше, чем размер словаря, помноженный на 2. Скажем словарь yo2_127.dat имеет размер 1115КБ, соответственно памяти скрипт должен попросить ~2230КБ. А после окончания процесса всю её освободить (память освобождается после нажатия княпочки "Спасибо" в финальном диалоге - можно легко убедиться сколько именно освободилось из того же самого Task Manager). И всё же... С памятью есть кое-какие проблемы. Во-первых, память, запрашиваемая SW, существенно больше и зависит от длины файла с сабами (для скрипта, по идее, длина субтитров никак не должна влиять на потребляемую память). "Много думал": может, виноват не скрипт, а сам SW? Он ведь запоминает куда-то внесённые скриптом коррективы, чтобы иметь возможность их откатить обратно по Ctrl-Z. Так или иначе: запускаю скрипт один раз, второй, третий и вижу, что каждый запуск увеличивает память, занимаемую SW, приблизительно на одинаковую величину, пропорциональную длине файла субтитров (для 1х"Амадеус" - 1.3MB, для 4x"Амадеус" - 4.1MB). Не то, чтобы это сильно напрягает, но величина эта не так уж и мала. Есть идеи, как можно от этого избавиться?
Спасибо, НуПогоди! Постоянно пользуюсь этой программой, теперь, стало быть, можно для этого не выходить из SW.
Про баги -- попробуй проверить титры с таким текстом:
1
В то лето, когда мне было восемь лет...
2
Вертолет летал уже семь лет.
погляди, что будет если в диалоге выберешь поставить Ё, и если не поставить.
И два маленьких пожелания:
Не хотелось бы держать словарь в скриптах, нельзя ли там выдать запрос на путь к файлу?
Не лучше ли будет, если когда нажимаешь кнопку Прервать, он дает фокус на ту ячейку, на которой остановился?
В то лето, когда мне было восемь лет...
Вертолет летал уже семь лет.
Aга! Понятно... Если в тексте субтитра сначала встречается последовательность букв, аналогичная "сомнительному" слову (оно выводится на кнопках выбора внизу диалога), то подчёркивается буква в этом первом стринге, а не в слове. В твоих примерах, скрипт спрашивает как ему писать слово "лет", а подчеркивает "лето" и "вертолет" (слова "лёто" в словаре нет и диалога с сомнениями к нему тоже быть не может, а "вертолёт" он поправит без всяких вопросов). В оправдание: подчёркивание делалось как альтернативный вариант (когда заметил, что не все слова на кнопку влезают) и как следует не тестировалось. На кнопках всё правильно: написаны варианты "сомнительного" слова и выбор работает. И при выборе ориентироваться надо на них. Подчёркивание поправлю...
Stevvie (5.11.2007, 12:40) писал:
И два маленьких пожелания: Не хотелось бы держать словарь в скриптах, нельзя ли там выдать запрос на путь к файлу? Не лучше ли будет, если когда нажимаешь кнопку Прервать, он дает фокус на ту ячейку, на которой остановился?
И то, и другое - достойные идеи, взял на заметку... Первое сделать не очень трудно, со вторым дело обстоит хуже. Слишком многого от скрипта не жди: как я уже писал, тут работает только очень малая часть стандартных паскалевских функций. А пока я буду туго соображать как это реализовать (может, Bedazzle что-то умное подскажет?), 1) народу пока придётся собственными руками править путь на словарь в тексте самого скрипта [лежать он может, как сам понимаешь, где угодно] и 2) делать джамп на последний обработанный титр самому по Ctrl-G.
ПС. Как первый официальный багрепортер получаешь большое человеческое спасибо.
Нет, пока я в этом направлении не копал. Спасибо, сегодня-завтра попробую... Вчера вечером в-основном занимался диалогами: самое простое, и к тому же... уж больно я привык, когда интерфейс у меня английский. Часть диалогов уже переписал. Как доделаю все, выложу и соответствующим образом подредактирую описание скрипта (мол, русский фейс уже не нужен).
Заодно сделал кой-какие прикидки по поводу идеи Stevvie вызывать стандартный диалог открытия файла, чтобы локализовать путь к словарю: попробовал стандартный TOpenDialog, оказалось, что в скрипте он не поддерживается. Похоже, придётся городить самокорректирующийся скрипт. Ведь, по идее, после того, как SW скомпиллировал из текста скрипта что-то работоспособное, этот самый текст можно считать и изменить. Что именно считать и изменить? Настройки, ессно: птички в диалоге настроек, путь к словарю и тп. А путь этот, например, определять в каком-нибудь диалоге со встроенным TEdit. Гораздо хуже обстоит дело с джампом по Прервать на последний обработанный титр (идея все того же Stevvie). Тут скрипт должон взаимодействовать с Воркшопом, а кроме тех очень ограниченных функций, которые изволили перечислить в example.pas, под рукой ничего нет. Ладно... Буду думать. Иногда это полезно
Тут скрипт должон взаимодействовать с Воркшопом, а кроме тех очень ограниченных функций, которые изволили перечислить в example.pas, под рукой ничего нет.
Можно сделать через (_|_) - запустить из скрипта внешнюю прогу, которая пошлёт сообщение воркшопу, что нужно "прыгнуть" на необходимый субтитр.
Заодно сделал кой-какие прикидки по поводу идеи 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;
Так. Оказывается SubtitleWorkshop использует innerfuse Pascal Script III 1,20, который больше не поддерживается. Ему на замену пришел RemObjects Pascal Script. http://remobjects.com/?ps http://remobjects.com/?ps1
Бесплатно. Дают вместе с исходниками. И обещаны примеры. Документации никакой на сайте не нашел.
IPSIII также использует программа NetView, в которой есть довольно подробная справка по написанию скриптов. IPSIII вроде как поддерживает работу с DLL, но вроде как это не входит в набор базовых функций, для этого подключать надо плагин.
Код на предмет лаконичности я пока не чистил (некогда было), поэтому многоэтажные варианты a-la Btn1Click наверняка есть и в других местах. Если найдёте ещё что-нибудь, дайте знать. Дойдут руки - поправлю... А пока:
заменил фиксированное значение SIZE на переменную, которая определяется из fs:=TFileStream.Open('yo.dat',fsOpenRead); SIZE:=fs.Size, после чего можно аллокировать под словарь ровно столько памяти, сколько нужно text:=StringOfChar(' ',SIZE)
поправил мелкий баг: при сортировке text, куда сначала копируется словарь, не переписывалась в YO[33] (это стринг со словами, начинающимися на "Я") последняя буква и, соответственно, последнее слово "ящерёнка" получалось урезанным "ящерёнк" (со всеми вытекающими).
нарисовал полноценный диалог финального отчёта.
Дождусь выходных - будет время и код почистить, и диалоги дорисовать, и чужими идеями заняться.
Расковырял Win32dasm'om экзешник там куча интресных строк есть . Прототипы функций, типы, классы и тд. Может это то что он поддерживает?
скорей всё, что он использует из VCL
D!ig (7.11.2007, 17:02) писал:
Ну а внешнюю, из DLL, функцию вызвать можно или нет?
буду изобретать, ибо LoadLibrary находится в windows.pas, а использовать модули отличные от system затруднительно
можно конечно подвесить дополнительный функционал через SubtitleAPI.dll ))
автор скоро год как на мыло не отвечает ((
скорей всё, что он использует из 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 ))
Вот например:
"Function Sqrt(e : Extended) : "
"Function StrGet(var S : String; "
"Function StringOfChar(c : char;I "
"function StrToDate(const s: string): "
и такого добра там полно.
Про StrGet не знаю, а остальные - вполне себе нормальные функции Delphi.
Да. А чего в этом такого?
А описания функций с параметрами точно нет. ("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 говорит не знаю шо такэ.
Поэтому, как я и думал, Win32dasm показывает все что было зарегистрировано, а значит может быть доступно из скриптов. А значит можно получить список доступных скриптам функций и тд.
О! А ты можешь каким-нибудь образом выдрать эту информацию и выложить список доступных скриптам функций? Всем заинтересованным было бы грАмадное подспорье. А то методом научного тыка выходит очень уж медленно.
PS. Внешние dll - тоже очень интересно. Надо будет посмотреть на досуге...
PS. Внешние dll - тоже очень интересно. Надо будет посмотреть на досуге...
Внешние DLL - решили бы очень много проблем, но что то странное с ними.
НуПогоди (9.11.2007, 12:03) писал:
О! А ты можешь каким-нибудь образом выдрать эту информацию и выложить список доступных скриптам функций? Всем заинтересованным было бы грАмадное подспорье. А то методом научного тыка выходит очень уж медленно.
Проще наверно из исходниов IPS'а выдрать. Попробую. Но только список. Никаких описаний.
---
Расковырял исходники IPS. ОЙ! Возможностей у скриптов оказывается больше чем я думал. Особенно в обасти UI строения. Самое интересное, что из скрипта можно обратится к Application (например: Application.minimize - сворачивает окно SW). Через Application можно добраться до MainForm, а оттуда до любого контрола.
---
Для начала.
[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-й перестал работать