digitorum.ru

Как меня найти

Профиль

icq: 4415944

Что такое djem и с чем его едят: магия eval

DJEM, DJEM 2.0, djemscript

Все, кто работает c djemscript, рано или поздно приходят к отцам-создателям, с просьбой внедрить в язык процедуры, функции и макросы. 

Тут я попробую описать то, как это можно реализовать существующими средствами djemscript на примере простой задачи. 

Есть строка, в дибилоформате: 

<set str = 'тЕсТоВаЯ сТрОКа'>

 

Нужно первую букву сделать заглавной, остальные буквы строчными, но в djemscript есть только методы ucase и lcase, а аналога php-шного ucfirst нет. 

Попробуем его сделать. 

Создаем документ с путем ‘main.system.djemscript.ucfirst’ и добавляем в него код: 

<if <var[string_to_process]>>
	<set string_to_process = <var[string_to_process].cut(1).ucase> ~ <var[string_to_process].cut(1, <var[string_to_process].len> - 1).lcase>>
</if>

 

В дизайн шаблоне пишем это:

<set str = 'тЕсТоВаЯ сТрОКа'>
<['main.system.djemscript.ucfirst']._dtpl.eval('str=>string_to_process', 'str<=string_to_process')>
<var[str]>

 

При интерприкации шаблона djemserver'ом, он заберет  дизайн-шаблон документа ‘main.system.djemscript.ucfirst’ и выполнит его, при этом передав значение из локальной переменной ‘str’ текущего дизайн-шаблона во внутреннюю переменную ‘string_to_process’ подгруженного дизайн шаблона. По завершении работы в переменную ‘str’ будет записано значение переменной ‘string_to_process’ из подгруженного дизайн-шаблона. 

Можно не создавать отдельный дизайн шаблон, а сохранить инструкции в переменную. 

То есть код будет такой: 

<set ucfirst = '
	<nodjemscript>
		<if <var[string_to_process]>>
			<set string_to_process = <var[string_to_process].cut(1).ucase> ~ <var[string_to_process].cut(1, <var[string_to_process].len> - 1).lcase>>
		</if>
	</nodjemscript>
'>
<var[ucfirst].eval('str=>string_to_process', 'str<=string_to_process')>
<var[str]>

 

И в первом и во втором случае в результате работы в переменную `str` будет записана строка:

Тестовая строка