Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Snakeskin (https://javascript.ru/forum/project/35057-snakeskin.html)

kobezzza 27.08.2014 12:43

Отказался от идеи реализации типографа, как в mdash.ru.

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

Правила по умолчанию (можно задать свои)
{
	'"': [['«', '»'], ['„', '“']],
	'\'': [['“', '”'], ['‘', '’']],

	'(c)': '©',
	'(tm)': '™',

	'[v]': '☑',
	'[x]': '☒',
	'[_]': '☐',

	'<-': '←',
	'<-|': '↤',
	'->': '→',
	'|->': '↦',
	'<->': '↔',

	'...': '…',
	'-': '−',
	'--': '—'
};


- template foo()
    "Snakeskin -- 'лучший' шаблонный движок!" (c)


Отрендерится как

«Snakeskin — „лучший“ шаблонный движок!» ©


Система макросов удобна тем, что можно вводить свои правила, например для замены смайликов на картинки, но без использования специальных механизмов Snakeskin, таких как вызываемые блоки или прототипы.

{
	':)': '<img src="..."/>'
};


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

{'[x]'.replace('[x]', 'error')} // данный код не выполнится, т.к. [x] -> ☒


Также будет введена директивы plain, внутри которой текст будет вставляться "как есть" + такое же поведение будет у директив script, style и link

Octane 27.08.2014 13:05

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

да и выдумывать язык разметки символов не лучшая идея, например, что потом каждый результат поиска тоже через препроцессор прогонять, чтобы не видеть там всякие -- и (с)?
помоему лучше сразу нормальные символы использовать, тем более не так много запомнить то надо:
alt+0187
alt+0171
alt+0150
alt+0151
alt+0133
alt+0160
остальное все не часто используется и можно из таблицы символов скопировать

melky 27.08.2014 13:10

kobezzza, это будет будущая фича SS? нифига)

kobezzza 27.08.2014 13:16

Цитата:

а неразрывные пробелы? это же самое основное, что влияет на читабильность, чтобы предлоги, союзы и т.д. не оставались в конце строк, а тире не уезжало в начало строки
Наверн добавлю.

Цитата:

да и выдумывать язык разметки символов не лучшая идея, например, что потом каждый результат поиска тоже через препроцессор прогонять, чтобы не видеть там всякие -- и (с)?
Ну это опциональная фича, т.е. чтобы включить её работу необходимо будет запустить компиляцию с флагом autoCorrect=true.

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

Потом опять таки замена тех же смайликов: можно вставлять картинки, или теги с символьными классами и т.д.

В общем фича будет, но по умолчанию отключу.

kobezzza 27.08.2014 13:17

Цитата:

kobezzza, это будет будущая фича SS? нифига)
Ну, собственно я уже почти всё написал. Сейчас додумываю, пишу тесты и т.д. Фича войдёт в скорый релиз SS 4.1 .

Octane 27.08.2014 13:26

Цитата:

Сообщение от kobezzza
Потом опять таки замена тех же смайликов: можно вставлять картинки, или теги с символьными классами и т.д.

Тут все нормально, теги <img> вместо текстовых смайлов хранить в базе нет смысла.

kobezzza 27.08.2014 17:17

Решил также добавить директиву macro, которая позволит декларировать макросы прямо в области декларации шаблона. Директиву можно будет писать только в глобальной области.

- macro :) = <img src="..." />
- macro (: = <img src="..." />

- template foo()
    Hello :)

kobezzza 28.08.2014 10:44

Цитата:

Сообщение от kobezzza (Сообщение 327755)
Решил также добавить директиву macro, которая позволит декларировать макросы прямо в области декларации шаблона. Директиву можно будет писать только в глобальной области.

- macro :) = <img src="..." />
- macro (: = <img src="..." />

- template foo()
    Hello :)

Додумал эту концепцию.

Будет введёт ряд директив для установки флагов транслятора, т.е. методу compile мы можем передать, например, флаг inlineIterators и тогда все forEach и forIn итераторы будут скомпилированы в виде циклов или же stringBuffer и т.д.

А теперь будет можно задать эти флаги прямо в шаблоне:

/// Отключить опцию

!- escapeOutput 
!- xml

/// Включить опцию

!+ inlineIterators 

/// Или просто подключение файла настроек

!= params 'myParams.json'

/// Подключение файлов для опций

!= language 'myLang.json'
!= macros 'myMacros.json'

- template helloWorld()
	Hello World


Крутость такого подхода в том, что данные директивы будут распространятся только на отдельные странички, т.е. если страничка A включает страничку Б, то у них будут свои настройки, а при задачи параметров в метод compile настройки ставятся глобально.

В главной странице можно будет также задать глобальные настройки, для этого будет синтаксис:

@- escapeOutput 
@- xml
@+ inlineIterators


и т.д.

Локальные настройки будут расширять глобальные.

kobezzza 28.08.2014 12:05

Значение замены для макроса можно также задавать функцией, например,

- template foo()
    Today: %D


Snakeskin.compile(<шаблон>, {
	macros: {
		'%D': function () { return new Date(); }
	}
});


Кейзов для такой фичи не так много, но добавить её было так просто, что я подумал "а почему бы и нет?".

kobezzza 29.08.2014 11:19

Snakeskin 4.1.0 вышел!

Нововведения:

*) Поддержка макросов: 2 новых параметра компилятора: autoReplace (true включает макросы) и macros (таблица для задания своих макросов);

Базовые макросы:

let def = {
			'@quotes': {
				'"': [['«', '»'], ['‘', '’']],
				'\'': [['“', '”'], ['„', '“']]
			},

			'@shorts': {
				'(c)': '©',
				'(tm)': '™',

				'[v]': '☑',
				'[x]': '☒',
				'[_]': '☐',

				'<-': '←',
				'<-|': '↤',
				'->': '→',
				'|->': '↦',
				'<->': '↔',

				'...': {
					inline: true,
					value: '…'
				},

				'-': {
					inline: true,
					value: '−'
				},

				'--': {
					inline: true,
					value: '—'
				}
			},

			'@adv': {
				'%lorem%': 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolor dolores error facilis iusto magnam nisi praesentium voluptas. Delectus laudantium minus quia sapiente sunt temporibus voluptates! Explicabo iusto molestias quis voluptatibus.'
			},

			'@symbols': {
				'\\n': '\\n',
				'\\r': '\\r',
				'\\s': '&nbsp;'
			}
		};


Как видите, что макросы можно разбивать на группы - это нужно чтобы можно было делать "паки" макросов и удобно отключать не угодные, например,

// Отключим пакет @shorts
Snakeskin.compile(<шаблон>, {autoReplace: true, macros: {'@shorts': null}})


*) Добавлен фильтр default, который позволяет задать значение по умолчанию для выражения с undefined;
*) Фильтру truncate добавлен второй параметр, который означает, что символ многоточия должен выводится в виде мнемоника;
*) Множество исправлений ошибок.

****

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


Часовой пояс GMT +3, время: 04:02.