A long time ago in a galaxy far, far away...


Данная статья помечена как устаревшая, её содержание может быть неверным или неактуальным.

Если она не будет актуализирована или не появится веского повода для снятия этой плашки, то вскоре она будет перемещена в Священный архив.

При желании вы можете помочь проекту Onyx и сообществу Animus-logo.png SS13 в целом — загляните на наш Bus Mainframes.gif Портал сообщества.
Morgue.png


Это 15 глава перевода оригинального руководства по Dream Maker от разработчиков.

Остальные главы руководства и статьи о программировании на коде BYOND от любителей на русском.

Оригинальная 15 глава руководства на английском языке

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

Истинная магия — это изучение высших истин Природы. — Густавус Миллер, Что есть сон.

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

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.

"}

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