Изменения

Материал из Chaotic Onyx
Перейти к навигацииПерейти к поиску
11 466 байт добавлено ,  23:22, 16 августа 2013
Перенос перевода 15 главы гайда. Перевод от ДжонаГрамматикуса.
''Это 15 глава перевода оригинального руководства по Dream Maker от разработчиков.''

[http://wiki.ss13.ru/index.php?title=All_about_the_code Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.]

[http://www.byond.com/docs/guide/chap15.html Оригинальная 15 глава руководства на английском языке]

= Глава 15: Работа с текстом =

''Истинная магия – это изучение высших истин Природы.'' -- Густавус Миллер, What's in a Dream

Строки текста – важная часть почти любого мира. Вы уже видели один хороший метод конструирования текста со встроенными аргументами и форматированием макросов. Есть другие элементарные команды, рассчитанные для работы с текстом. В этой главе мы вам о них и расскажем.

== findtext ==

Команда ''findtext'' ищет внутри одной строки текста другую. Эта операция работает без учета регистра, а ''findText'' - с учетом. Есть и другие пары команд, следующие такому же принципу: команда, содержащая заглавную букву, учитывает регистр.

findtext(T1,T2,Start=1,End=0)
findText(T1,T2,Start=1,End=0)
T1 – строка, в которой выполняется поиск.
T2 – строка, которую мы ищем.
Start – номер символа, с которого начинаем поиск.
End – номер символа, на котором мы его заканчиваем.
Результатом служит номер первого символа найденной строки. Если искомый текст не найден, то результат будет 0.

''0'' используется как стандартное значение для обозначения позиции, которой нет. То есть, если поиск не требуется прекращать ни на каком символе, или если строка не найдена.

Пример использования ''findtext()'' для поиска в разговоре ключевых слов:

mob/rat
verb/tell(msg as text)
set src in oview()
if(findtext(msg,"cheese"))
view() << "[src] looks at [usr] hopefully."
walk_to(src,usr)

== copytext ==

Команда ''copytext'' копирует кусок строки. Эта команда, и предыдущая ''findtext'' то же самое, что и команды ''copy'' и ''find'' в стандартном текстовом редакторе.

copytext(Txt,Start=1,End=0)
Txt – строка из которой мы хотим скопировать часть.
Start – номер стартового символа.
End – номер символа, на котором нужно остановиться.
Возвращает получившуюся строку.

== addtext ==

Команда addtext объединяет две и более строк в одну. Это также можно сделать, вставляя строки одну за другой в другую строку, но когда нужно объединить много значений, проще использовать ''addtext()''.

addtext(Txt1,Txt2,...)
Возвращает одну строку, полученную путем слияния заданных.

== lentext ==

Команда ''lentex'' измеряет количество символов в строке.

lentext(Txt)
Txt – строка, длину которой вы хотите узнать.
Возвращает число символов в строке.

== Изменение текста ==
Есть несколько операций для изменения формы. Расскажем о каждой из них поподробнее.

=== uppertext ===

Команда ''uppertext'' переводит любые символы нижнего регистра в верхний регистр.

uppertext(Txt)
Txt – текст, который вы хотите изменить.
Возвращает полученную строку.

=== lowertext ===

Команда ''lowertext'' переводит любые символы верхнего регистра в нижний.

lowertext(Txt)
Txt – текст, который вы хотите изменить.
Возвращает полученную строку.

=== text2num ===

Команда ''text2num'' переводит строку в числовое значение. Если текст не состоит из символов цифр, то команда вернет ''0''.

text2num(Txt)
Txt – текст, который вы хотите изменить.
Возвращает соответствующее число.

Важно знать, что текстовое значение кардинально отличается от числового, даже если визуально они похожи. Если вы попробуете совершить числовые операции со строкой, то у вас ничего не выйдет, потому что все текстовые цепочки и прочие нечисловые значения равнозначны нулю при работе с ними, словно с числами. Строку сначало надо перевести в число с помощью ''text2num'', и только потом можно будет работать со значением, как с числом.

=== num2text ===

Команда ''num2text'' - противоположность ''text2num''. Она превращает числовое значение в строку. Этого также можно достигнуть, встраивая символы цифр в строку, но ''num2text()'' обеспечивает больший контроль над тем, как число форматируется.

num2text(Num,SigDigs)
Num – число для записи в строку
SigDigs – количество значащих цифр.
Возвращает новую строку.

Число значащих цифр определяет, когда будут использоваться технические обозначения. Числам стандартно выдаются 6 значащих цифр, так что технический знак будет использоваться только для чисел с 9 и более цифрами. Если вы хотите другого результата, вы можете использовать ''num2text()''.

== Сравнение текстовых цепочек ==

Проще всего сравнить две строки путем сравнения их ссылок на данные, с помощью оператора ''==''. Одинаковые строки всегда хранятся в одном месте для сбережения памяти.

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

=== cmptext ===

Команда ''cmptext'' выполняет сравнение строк, чувствительное к регистру.

cmptext(Txt1,Txt2,...)
Txt1 – первая строка для сравнения.
Txt2 – вторая строка для сравнения.
Возвращает 1, если одинаковы, и 0, если нет.

=== sorttext ===

Команда ''sorttext'' используется для определения алфавитного порядка строк. Она не чувствительна к регистру, а вот ''sortText'' делает тоже самое, но с чувствительностью к нему.

sorttext (Txt1,Txt2,...)
sortText (Txt1,Txt2,...)
Txt1 – первая строка для сравнения.
Txt2 – вторая строка для сравнения.
Возвращает 1, если возрастающий порядок, -1, если убывающий, в других случаях 0.

Следующий пример показывает как можно получить алфавитный список игроков.

proc/SortTextList(lst[])
var/i
var/j
for(i=1,i<=lst.len,i++)
for(j=i+1,j<=lst.len,j++)
if(sorttext(lst[i],lst[j]) == -1) //swap positions
var/tmp = lst[i]
lst[i] = lst[j]
lst[j] = tmp

mob/verb/who()
var/lst[0]
var/mob/M
var/N
for(M)
if(M.client) lst += M.name
SortTextList(lst)
for(N in lst) usr << N

== Текстовые документы ==

Строка в DM заключается в одинарные кавычки. Это сделано для коротких текстовых цепочек, состоящих из нескольких слов. Более длинные строки могут вводиться как текстовые документы. Это тоже самое, что и обычные строки, не считая того, что они начинаются с '''"''' и заканчиваются '''"'''.

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

Следующий пример использует текстовый документ, чтобы написать приветствие игрока.

mob/Login()
. = ..()
usr << {"

The Great BYOND


Welcome, [usr]. I am glad you could join us.


Please refrain from scribbling on the walls.

"}

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

Навигация