parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Предложение номер 2 (сам парсер)

Никита Козин 14.08.2004 13:21

Начну с примера:
<table border="1">
^table1.menu{
	<tr>
		<td>$table1.field1</td>
		<td>$table1.field2</td>
		<td>$table1.field3</td>
	</tr>
}
</table>
Если название таблицы длинное и/или составное (например, таблица находиться внутри хэша) тогда для использования значений текущего поля таблицы приходиться каждый раз писать это название. Предлагаю разрешить сокращенную запись имен полей, например так:
<table border="1">
^table1.menu{
	<tr>
		<td>$.field1</td>
		<td>$.field2</td>
		<td>$.field3</td>
	</tr>
}
</table>
Приведу пример по применению. Правда названия там не длинные, т.к. и сам пример не сложный:
# Создаем таблицы...
$forum[^table::create{id	uri	title
1	parser/	Parser
2	php/	PHP
3	mysql/	MySQL
}]
$topic[^table::create{forum_id	uri	title
1	trees/	Посторение деревьев
1	regexp/	Регулярные выражения
1	tables/	Работа с таблицами
2	parser/	Вопросы спецления с Parser-ом
3	select/	Выборка записей
3	insert/	Добавление записей}]

# ...и выводим их:
<table border="1">
	<tr>
		<th>Форум</th>
		<th>Темы</th>
	</tr>

# Сейчас приходиться много раз писать одно и тоже (в данном случае «$forum.» и «$topic.»)
# Пока названия короткие — без проблем, но когда названия становятся длиннее...
^forum.menu{
	<tr>
		<td><a href="/forum/$forum.uri">$forum.title</a></td>
		<td>
			<ul>
			^topic.menu{
				^if($topic.forum_id eq $forum.id){
					<li><a href="/forum/${forum.uri}$topic.uri">$topic.title</a></li>
				}
			}
			</ul>
		</td>
	</tr>
}
</table>
Вот как предлагаю сделать я:
(ну или что-то вроде этого)
^forum.menu{
	<tr>
		<td><a href="/forum/$.uri">$.title</a></td>
		<td>
			<ul>
			^topic.menu{
				^if($.forum_id eq $..id){
					<li><a href="/forum/${..uri}$.uri">$.title</a></li>
				}
			}
			</ul>
		</td>
	</tr>
}
</table>
Или даже не только в menu использовать подобные сокращения, а например еще и в select:
# Сейчас есть:
$thoseAbove20[^men.select($men.age>20)]
# Я предлагаю:
$thoseAbove20[^men.select($.age>20)]
Подобная реализация используется в XSLT:
<xsl:template match="link">
	<a href="{@href}"><xsl:value-of select="." /></a>
</xsl:template>
Может быть я несколько не удачно предложил сокращать запись ($..field), но идея, я думаю, ясна. Кто-нибудь со мной согласен? :)