Существует два типа языков разметки: языки в стиле XML и языки в стиле YAML.
В XML-языках все элементы, вне зависимости от их смысла оформляются с помощью общих синтаксических конструкций.
В xHTML синтаксис:
Содержимое
!!!]]>
имеют все элементы, вне зависимости от их семантики: заголовки, ссылки, списки, таблицы и т.д.
В YAML-языках каждый тип элемента имеет свой синтаксис, обусловленный семантикой этого элемента.
Например, в Wiki-разметке для задания горизонтальной линии используют ----,
т.к. эта конструкция внешне напоминает линию;
для задания списка перед каждым пунктом ставят *, т.к. она внешне напоминает маркер списка.
В Wiki-разметке каждый тип элемента имеет свой синтаксис:
Для выделения текста жирным шрифтом, текст обрамляется тремя одинарными кавычками: '''жирный текст'''.
Названия разделов статьи обрамляются двумя (или тремя для подразделов) знаками равенства: === Заголовок ===.
Для горизонтальной линии используется четыре дефиса: ----.
Списки делаются так: на каждой отдельной строке ставится символ # и затем следует пункт списка.
Для ненумерованных списков используется *, например:
* Пункт 1;
* Пункт 2;
* Пункт 3.
Ссылки обрамляются конструкцией вида:
[[Название целевой статьи|видимый текст ссылки]
Для картинок используется следующая конструкция: [[Image:имя_файла.png]]
Для таблиц такая:
{|
|Ячейка 1-1
|Ячейка 2-1
|-
|Ячейка 1-2
|Ячейка 2-2
|}
И т.д.
В математической нотации для каждого действия используется своя запись. Даже арифметические действия записываются по-разному:
Сложение, вычитание и умножение имеет следующий синтаксис: операнд1 оператор операнд2,
например: 2+2, 5-3, 4*6.
Для записи деления, делимое размещают над делителем, и отделяется горизонтальной чертой, например: ¾.
А для записи возведения в степень, вообще, обходятся без оператора, размещая показатель степени над основанием,
например: 210
Для любого XML-языка уже существуют готовые парсеры;
Можно применять стандартные действия, например, XSLT-преобразования;
Можно создавать составные документы, например в xHTML документ можно встроить графику на SVG или MathML и т.д.
Документы на XML-языках неудобны для восприятия человеком.
Документы на XML-языках занимают много места.
Удобны для чтения и редактирования человеком;
Занимают мало места;
Для каждого языка приходится писать собственный парсер.
Для каждого нового типа элемента приходится придумывать собственную синтаксическую конструкцию и реализовывать её в парсере.
Нельзя применять стандартные преобразования.
Нельзя создавать составные документы.
В нашей системе тестирования знаний «СИнТеЗ» для экспорта/импорта тестов используются языки обоих типов.
Любой тест может быть экспортирован/импортирован в XML-формат.
Этот формат имеет все преимущества XML-языков: удобен для разбора стандартным XML-парсером, может содержать SVG или MathML-разметку, с помощью XSLT может быть преобразован в любой другой формат, например в международный стандарт дистанционного обучения SCORM.
Однако, ему присущи и недостатки XML-языков: большой размер и неудобность для человека.
Пример простейшего файла тестов:
!!!]]>
Также тест может быть импортирован в YAML-формат. Этот формат настолько прост, что преподаватель может составлять тест даже в отсутствии редактора тестов, просто в «Блокноте».
***Тема 1
? Текст вопроса типа "выбор одного правильного варианта"
+Правильный вариант
-Неправильный вариант
-Неправильный вариант
? Текст вопроса типа "выбор нескольких правильных вариантов"
+Правильный вариант
+Правильный вариант
-Неправильный вариант
-Неправильный вариант
***Тема 2
? Текст вопроса типа "прямой ввод"
=Правильный ответ
? Текст вопроса типа "соответствие"
Левая часть 1 <-> Правая часть 1
Левая часть 2 <-> Правая часть 2
Левая часть 3 <-> Правая часть 3
? Текст вопроса типа "упорядочивание"
1. Первый пункт упорядочивания
2. Второй пункт упорядочивания
3. Третий пункт упорядочивания
XML-языки понятны человеку, но больше предназначены для компьютера. YAML-языки понятны компьютеру, но больше предназначены для человека.
Если Вы хотите, чтобы файлы вашего приложения были удобны как для человека, так и для компьютера, используйте оба этих формата.
<мое сугубо личное мнение>XML(сильно упрощённая версия SGML) намного эффективнее справляется со своей основной задачей <обратите внимание>внесением метаинформации в текст</обратите внимание>.
Насчет понятности человеку первой и второй версии разметок - я с вами мог бы поспорить. Текст в YAML-разметке компактен, но! это достигается за счет потери информативности(понятности) метаинформации, связанной с ним.
Что легче для преподавателя: потратить время на а) изучение синтаксиса вашего мини-языка или b) потратить время на обучение азам работы в "дружественном", "интуитивно-понятном" GUI-редакторе тестов?
Написать качественный YAML-парсер, ничуть не легче чем XML-парсер(попробуйте приделать к своему самомисному парсеру обработку ошибок, валидацию документа, экранирование служебных символов, поддержку различных кодировок и т.д.).
Конечно, если такие задачи решать не надо - то можно обойтись и YAML-разметкой. Но смысл? Зачем себя так ограничивать?</мое сугубо личное мнение>
@Евгений
Насчет понятности человеку первой и второй версии разметок - я с вами мог бы поспорить.Что легче для преподавателя: потратить время на а) изучение синтаксиса вашего мини-языка или b) потратить время на обучение азам работы в "дружественном", "интуитивно-понятном" GUI-редакторе тестов?
Конечно, работать с GUI проще, чем непосредственно с языком разметки.
Но, когда GUI недоступен, и приходится выбирать между двумя стилями разметки: XML или YAML , то, мне кажется, все таки, удобнее — YAML.
Ведь в YAML-языках каждый тип элемента имеет свой синтаксис, который зависит от смысла или внешнего вида элемента. Что делает его более интуитивным для запоминания.
Согласитесь, что для создания списка, YAML (Wiki) синтаксис:
* Пункт 1; * Пункт 2; * Пункт 3.
...проще, чем XML (HTML) синтаксис:
<ul> <li>Пункт 1;</li> <li>Пункт 2;</li> <li>Пункт 3;</li> </ul>
Другое дело, что YAML-синтаксис, действительно, плохо поддерживает метаданные. Ведь для каждого вида метаданных, для каждого параметра в YAML пришлось бы изобретать свою конструкцию, свой значек. И их интуитивность, тогда уже, была бы не выше интуитивности китайских иероглифив (внешний иероглифа, тоже, когда-то, имел сходство с описываем понятием).
Написать качественный YAML-парсер, ничуть не легче чем XML-парсер
Да, конечно, об этом я и пишу в статье.
XML-парсеры есть уже готовые почти для всех языков программирования; для YAML-парсера вручную придется кодировать каждую конструкцию.
Я всегда использовал XML, до знакомства с symfony framework - после этого я ощутил преимущества YAML :)
А я так и не смог найти преимуществ в YAML, кроме внешнего вида. Преимущества XML - легкая расширяемость, неограниченные метаданные, популярность. Кстати, воспринимается XML очень легко, если хоть изредка с ним работать ;)
А где преимущества YAML?
@aktuba
А где преимущества YAML?
О преимуществах и недостатках XML и YAML я и написал в статье.
Главное преимущество YAML-языков — удобство восприятия и редактирования человеком.
Согласитесь, что Wiki-разметка:
* Пункт 1; * Пункт 2; * Пункт 3.
воспринимается легче, чем HTML:
<ul> <li>Пункт 1;</li> <li>Пункт 2;</li> <li>Пункт 3;</li> </ul>
А математическая запись:
a*x^2 + b*x + c
воспринимается и редактируется проще, чем MathML:
<apply>
<plus/>
<apply>
<times/>
<ci>a</ci>
<apply>
<power>
<ci>x</ci>
<cn>2</cn>
</power>
</apply>
</apply>
<apply>
<times/>
<ci>b</ci>
<ci>x</ci>
</apply>
<ci>c</ci>
</apply>
Однако, разумеется, YAML-языки имеют и недостатки, которые я также перечислил в статье.
Из YAML постоянно пользуюсь "Текстилем", т. к. он встроен в CMS TextPattern, в том числе и в форме комментариев (хотя подсказок не даю, чтобы спамеры не досаждали). Очень удобная штука! Кстати, Алик, вот у вас чтобы выделить слово жирным надо набрать дополнительно аж 7 символов, а в Textile для этого используется всего две звёздочки ;)
О, клёвый у меня тут мутант получился.
Для внутреннего использования разрабатываю систему тестирования. Не против, если я использую ваш формат YAML для вопросов?
@Денис Радченко
Для внутреннего использования разрабатываю систему тестирования. Не против, если я использую ваш формат YAML для вопросов?
Нет не против — используйте на здоровье :-)
Пользуюсь хмл так как он более распостранен универсален и удобен.
ещё можно развить идею hiqus и сделать язык двумерной разметки типа такого:
Тема 1: :Текст вопроса типа ""выбор одного правильного варианта"": ::Правильный вариант:right:true ::Неправильный вариант1:right:false ::Неправильный вариант2:right:false :Текст вопроса типа ""выбор одного правильного варианта"": ::Правильный вариант1:right:true ::Правильный вариант2:right:true ::Неправильный вариант1:right:false ::Неправильный вариант2:right:false Тема 2: :Текст вопроса типа ""прямой ввод"":Правильный ответ :Текст вопроса типа ""соответствие"": ::Левая часть 1:to:Правая часть 1 ::Левая часть 2:to:Правая часть 2 ::Левая часть 3:to:Правая часть 3 :Текст вопроса типа ""упорядочивание"": ::Первый пункт упорядочивания: ::Второй пункт упорядочивания: ::Третий пункт упорядочивания:
по мощности он эквивалентен хмл, но визуально воспринимается по проще
примерный эквивалент в json:
{ 'Тема 1':
{ 'Текст вопроса типа ""выбор одного правильного варианта""':
{ 'Правильный вариант': { right: true }
, 'Неправильный вариант1': { right: false }
, 'Неправильный вариант2': { right: false }
}
, 'Текст вопроса типа ""выбор одного правильного варианта""':
{ 'Правильный вариант1': { right: true }
, 'Правильный вариант2': { right: true }
, 'Неправильный вариант1': { right: false }
, 'Неправильный вариант2': { right: false }
}
}
, 'Тема 2':
{ 'Текст вопроса типа ""прямой ввод""': Правильный ответ }
, 'Текст вопроса типа ""соответствие""':
{ 'Левая часть 1': { to: 'Правая часть 1' }
, 'Левая часть 2': { to: 'Правая часть 2' }
, 'Левая часть 3': { to: 'Правая часть 3' }
}
, 'Текст вопроса типа ""упорядочивание""':
{ 'Первый пункт упорядочивания': null
, 'Второй пункт упорядочивания': null
, 'Третий пункт упорядочивания': null
}
}
ну и хмл аналогичный..
Еще один момент, о котором забыли - разное количество спецсимволов способных "сломать" документ. Печатая текст в XML-файле мне нужно следить только за тремя символами ( &, <, > ), при добавлении текста в YAML придется быть куда более внимательным. Если ситуация потребует совсем уж сложной YAML-разметки, то работа с таким документом может и вовсе потребовать заметно большего внимания чем работа с XML. Частично проблему можно решить "объяснив" парсеру, что некоторые символы нужно понимать как спецсимволы, только если они находятся в самом начале строки.
Смешивание обоих форматов в одном документе - идея правильная, от себя могу добавить: если разные XML-теги содержат разные YAML-структуры, то, в большинстве случаев, правильней написать именно два разных парсера, свой под каждую структуру, а не учить один парсер понимать обе структуры.
Парсеры пишу недавно, пока работаю только с XML. Но в плане того недостатка что под каждый YAML нужно делать свои регулярки, то в XML тоже далеко не всегда использую одинаковую структуру. Так что думаю что это не недостаток.
Почувствовал себя в танке. Работал с XML, но не разу не слышал о YAML. Но для меня уже XML гораздо понятнее выглядит, итак понятно)))
да, я тоже работал с XML, так что только это и понимаю, а про YAML - очень полезно было узнать
Вот ведь - про YAML впервые слышу...век живи век учись)
Но "занимает мало места" очень мотивирует.
У меня друг программист, недавно что-то такое мне рассказывал, но мне было не интересно.
А тут все очень интересно расписано