PDA

Просмотр полной версии : Утилита для подготовки текстов



Vitamin
02.02.2009, 19:32
Благодаря теме http://zx.pk.ru/showthread.php?t=8534 и товарищу axor'у написал одну утилитку подготовки текстов для программ.

Возможности:
- макроподстановки (в том числе и рекурсивные)
- выборка по ключам (для огранизации переводов)
- автоматическая токенизация (для уменьшения размера текста)
- экспорт в ассемблерный файл

Вкратце, на примере, как можно применять.

Предположим, пишем мы игру про Диззи и хотим автоматизировать работу с текстами. Пишем следующий текстовик:



# имена главных персонажей
= HERO1
en> "Dizzy"
ru> "Диззи"

= HERO2
en> "Daisy"
ru> "Дейзи"

# места действия
< PLACE_WORLD
en> HERO1 "'s World"
ru> "Мир " HERO1

< PLACE_HOME
en> HERO1 " and " HERO2 "'s home. "
ru> "Дом " HERO2 " и " HERO2 ". "
en> "Welcome!"
ru> "Добро пожаловать!"

# локация
< START_SCREEN
> PLACE_HOME


Как видно, синтаксис очень простой. За символами = и < начинается имя макроса (вид символа определяет дальнейший тип макроса- локальный или глобальный). После опционального ключа и символа > идут текстовые фрагменты, заключенные в кавычки и имена макросов. Ключи в данном случае определяют язык перевода.

После инстанциирования по ключу (Textator.exe --process --key ru input.txt) получаем результат для русского языка:


# This file was automatically generated

< PLACE_HOME
> "Дом Дейзи и Дейзи. Добро пожаловать!"

< PLACE_WORLD
> "Мир Диззи"

< START_SCREEN
> "Дом Дейзи и Дейзи. Добро пожаловать!"


Или для английского (Textator.exe --process --key en input.txt):


# This file was automatically generated

< PLACE_HOME
> "Dizzy and Daisy's home. Welcome!"

< PLACE_WORLD
> "Dizzy's World"

< START_SCREEN
> "Dizzy and Daisy's home. Welcome!"


Как видно, исчезли все локальные макросы (которые были объявлены через =).
Также заметна избыточность текстов. Для исправления, применим следующую функцию- токенизацию. Ну и попутно переведем все в ассемблерный исходник:



; This source was automatically generated
; Local entries
TOK0 db "Dizzy",0
TOK3 db "Daisy",0
TOK6 db "home",0
TOK8 db "Welcome",0

; Global entries
PLACE_HOME
TOKEN TOK0
db " and "
TOKEN TOK3
db "'s "
TOKEN TOK6
db ". "
TOKEN TOK8
db "!",0
PLACE_WORLD
TOKEN TOK0
db "'s World",0
START_SCREEN
TOKEN TOK0
db " and "
TOKEN TOK3
db "'s "
TOKEN TOK6
db ". "
TOKEN TOK8
db "!",0


Вкратце, все :)

Техническая информация:
- проект хостится на http://code.google.com/p/textator
- доступны исходные коды (+Makefile, Code::Blocks project, MSVS project)
- также выложены последние билды для винды (из разных студий, на всякий случай).

В комплекте с билдом идет файл примера и исходники распаковщиков. Поскольку эти распаковщики писались "вслепую", просьба их потестировать и сообщить мне об ошибках и прочем, равно как и об ошибках в программе:)

Что в планах:
- написать внятное руководство (я тут не весь функционал расписал, но его легко откопать)
- улучшить токенизатор, ибо существующий был написан на коленке:)

Upd:

Свежие билды:
Builds list (http://code.google.com/p/textator/downloads/list)

Руководство:
Manual (http://code.google.com/p/textator/w/list)

breeze
02.02.2009, 21:14
вещь не плоха и весьма интересная, а для работы с текстами вообще очень удобный инструмент ;)

Vitamin
16.02.2009, 10:29
Фух! Я это сделал!:)
Токенизатор по фрагментам (до этого был исключительно по словам). Анализирует текст и выделяет оптимальные фрагменты в токены.

Что еще нового (ревизия 40):
- включение внешних файлов
- логи (ключ --verbose)
- разные оптимизации и фиксы
- руководство (уже немного устаревшее)

Ссылка на бинарники - в первом сообщении.

Shadow Maker
17.02.2009, 19:27
А мой реквест не делал?

Vitamin
17.02.2009, 22:25
А мой реквест не делал?
Который именно?

Shadow Maker
18.02.2009, 02:07
Про кусочки там и сям, которые ты сказал макросами сделаешь.

Vitamin
18.02.2009, 11:19
Про кусочки там и сям, которые ты сказал макросами сделаешь.
45 ревизия. При таком режиме один вариант оптимизации недоступен (местами может довольно серьезно сказаться).

Shadow Maker
18.02.2009, 16:08
Почему недоступен?

PS - Строка "командная", не "коммандная" :) Английский он не русский.

Vitamin
18.02.2009, 16:31
Почему недоступен?

Без режима inline:


; Global
SAMPLE db "sample",0

REPEAT equ SAMPLE


А в режиме inline это проблематично, ибо equ для макросов не работает. А оборачивать макросы друг в друга- хрень какая-то...

Vitamin
21.02.2011, 07:57
Дабы в истории остался след, аттачу статью про сабжевую программу, написанную в свое время для Абзаца.