Skip to content

Форматирование

Вы можете делать простое форматирование текста с помощью функций:

  • fmt.c(строка) - разместить по центру;
  • fmt.r(строка) - разместить справа;
  • fmt.l(строка) - разместить слева;
  • fmt.top(строка) - сверху строки;
  • fmt.bottom(строка) - снизу строки;
  • fmt.middle(строка) - середина строки (по умолчанию).

Например:

lua
room {
	nam = 'main';
	title = 'Добро пожаловать';
	dsc = fmt.c 'Добро пожаловать!'; -- если у функции только 1 параметр,
	-- скобки можно опускать;
}

Вышеописанные функции влияют не только на текст, но и на изображения, вставленные с помощью ''fmt.img()'.

Следует отметить, что если вы используете несколько функций форматирования, то предполагается, что они относятся к разным строкам (параграфам). В противном случае, результат не определён. Разбивайте текст на абзацы символами '^' или 'pn()'.

INSTEAD при выводе удаляет лишние пробелы. Это значит, что неважно сколько пробелов вы вставляете между словами, всё равно при выводе они не будут учитываться для расчёта расстояния между словами. Иногда это может стать проблемой.

Вы можете создавать неразрывные строки с помощью: fmt.nb(строка). Например, модуль "fmt" использует неразрывные строки для создания отступов в начале параграфов. Также, 'fmt.nb' может оказаться удобной для вывода служебных символов. Можно сказать, что вся строка-параметр 'fmt.nb' воспринимается движком как одно большое слово.

Ещё один пример. Если вы используете подчёркивание текста, то промежутки между словами не будут подчёркнуты. При использовании 'fmt.nb' промежутки также будут подчёркнуты.

INSTEAD не поддерживает отображение таблиц, однако для вывода простых табличных данных можно воспользоваться 'fmt.tab()'. Эта функция используется для абсолютного позиционирования в строке (табулятор).

fmt.tab(позиция, [центр])

Позиция, это текстовый или числовой параметр. Если задан числовой параметр, он воспринимается как позиция в пикселях. Если он задан в виде строкового параметра 'число%', то он воспринимается как позиция, выраженная в процентах от ширины окна вывода сцены.

Необязательный строковой параметр центр задаёт позицию в следующем за 'fmt.tab' слове, которая будет размещена по указанному смещению в строке. Позиции могут быть следующими:

  • left;
  • right;
  • center.

По умолчанию считается что задан параметр "left".

Так, например:

lua
room {
	nam = 'main';
	disp = 'Начало';
	-- размещение 'Начало!' по центру строки
	dsc = fmt.tab('50%', 'center')..'Начало!';
}

Конечно, не очень удачный пример, так как то же самое можно было сделать с помощью 'fmt.c()'. Более удачный пример.

dsc = function(s)
    p(fmt.tab '0%')
    p "Слева";
    p(fmt.tab '100%', 'right')
    p "Справа";
end

На самом деле, единственная ситуация, когда применение 'fmt.tab()' оправдано -- это вывод табличных данных.

Следует отметить, что в ситуации, когда мы пишем что-то вроде:

lua
-- размещение 'Раз' по центру строки
dsc = fmt.tab('50%', 'center')..'Раз два три!';

Только слово 'Раз' будет помещено в центр строки, остальные слова будут дописаны справа от этого слова. Если вы хотите центрировать 'Раз два три!' как одно целое, воспользуйтесь 'fmt.nb()'.

lua
-- размещение 'Раз два три!' по центру строки
dsc = fmt.tab('50%', 'center')..fmt.nb ('Раз два три!');

В INSTEAD также существует возможность выполнять простое вертикальное форматирование. Для этого используйте вертикальный табулятор:

fmt.y(позиция, [центр])

Как и в случае с fmt.tab позиция, это текстовый или числовой параметр. Здесь он воспринимается как позиция строки, выраженная в пикселях или процентах от высоты области сцены. Например, 100% -- соответствует нижней границе области сцены. 200% -- соответствует нижней границе второй страницы вывода (две высоты области вывода сцены).

Необязательный строковой параметр центр задаёт позицию внутри строки, относительно которой выполняется позиционирование:

  • top (по верхнему краю);
  • middle (по центру);
  • bottom (по нижнему краю -- значение по умолчанию).

Следует отметить, что 'fmt.y' работает целиком для строки. Если в строке встретится несколько fmt.y, действовать будет последний из табуляторов.

lua
-- размещение 'ГЛАВА I' - в центре сцены
dsc = fmt.y('100%').."ГЛАВА I";

Если позиция, указанная табулятором, уже занята другой строкой, табулятор игнорируется.

По умолчанию, статическая часть сцены отделяется от динамической двойным переводом строки. Если вам это не подходит, вы можете переопределить 'std.scene_delim', например:

std.scene_delim = '^' -- одинарный перевод строки

Вы не можете менять эту переменную в обработчиках, так как она не сохраняется, но вы можете задать её для игры целиком, или восстанавливать её вручную в функции 'start()'.

Если вас категорически не устраивает то, как INSTEAD формирует вывод (последовательность абзацев текста), вы можете переопределить функцию 'game.display()', которая по умолчанию выглядит следующим образом:

lua
game.display = function(s, state)
	local r, l, av, pv
	local reaction = s:reaction() or nil -- реакция
	r = std.here()
	if state then -- такт игры?
		reaction = iface:em(reaction) -- курсив
		av, pv = s:events()
		av = iface:em(av) -- вывод "важных" life
		pv = iface:em(pv) -- вывод фоновых life
		l = s.player:look() -- objects [and scene] -- объекты и сцена
	end
	l = std.par(std.scene_delim,
		reaction or false, av or false, l or false,
		pv or false) or ''
	return l
end;

Тот факт, что я привёл здесь этот код, не означает, что я рекомендую переопределять эту функцию. Напротив, я категорически против такой сильной привязки к форматированию текста. Тем не менее, иногда возникает ситуация, когда полный контроль за последовательностью вывода необходим. Если вы пишите свою первую игру, просто пропустите этот текст.