Skip to content

Node.js, jQuery и создание Wiki из обычной страницы

23/09/2010

Итак, вчерашний топик о Node.js + jQuery временно ушёл в небытие вместе с Хабром. Впрочем, его копия есть на nodejs.ru. Собственно, заниматься связкой jQuery + node.js меня заставила одна интересная задача: как из страницы определений терминов сделать wiki.

Вообще я рассчитывал использовать это для разбора документации, но пока в качестве пробного шара использовал вот эту страницу. Из этого я хотел сделать wiki, причём с минимальными усилиями. В результате я сделал вот что.

В MediaWiki есть возможность эскпортировать/импортировать статьи в формате XML. Мне нужно было просто получить структуру дампа и переделать страницу в XML в соответствии с образцом. Вообще XML для импорта в Wiki выглядит так:

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd" version="0.3" xml:lang="ru">
  <siteinfo>
    <sitename>Тест Wiki</sitename>
    <base>http://ru.sarmontazara.wikia.com/wiki/%D0%A2%D0%B5%D1%81%D1%82_Wiki</base>
    <generator>MediaWiki 1.15.5</generator>
    <case>first-letter</case>
    <namespaces>
      <namespace key="-2">Медиа</namespace>
      <namespace key="-1">Служебная</namespace>
      <namespace key="0" />
      <namespace key="1">Обсуждение</namespace>
      <namespace key="2">Участник</namespace>
      <namespace key="3">Обсуждение участника</namespace>
      <namespace key="4">Тест Wiki</namespace>
      <namespace key="5">Обсуждение Тест Wiki</namespace>
      <namespace key="6">Файл</namespace>
      <namespace key="7">Обсуждение файла</namespace>
      <namespace key="8">MediaWiki</namespace>
      <namespace key="9">Обсуждение MediaWiki</namespace>
      <namespace key="10">Шаблон</namespace>
      <namespace key="11">Обсуждение шаблона</namespace>
      <namespace key="12">Справка</namespace>
      <namespace key="13">Обсуждение справки</namespace>
      <namespace key="14">Категория</namespace>
      <namespace key="15">Обсуждение категории</namespace>
      <namespace key="110">Форум</namespace>
      <namespace key="111">Обсуждение форума</namespace>
      <namespace key="400">Видео</namespace>
      <namespace key="401">Обсуждение видео</namespace>
      <namespace key="500">Блог участника</namespace>
      <namespace key="501">Комментарий блога участника</namespace>
      <namespace key="502">Блог</namespace>
      <namespace key="503">Обсуждение блога</namespace>
    </namespaces>
  </siteinfo>
  <page>
    <title>Тест</title>
    <id>21</id>
    <revision>
      <id>40</id>
      <timestamp>2010-09-08T14:56:44Z</timestamp>
      <contributor>
        <username>Kurokikaze</username>
        <id>366807</id>
      </contributor>
      <text xml:space="preserve">'''Тест''' - пробная страница
[[Категория:Тестовая категория]]</text>
    </revision>
  </page>
</mediawiki>

С namespace я не разбирался, достаточно было и этого дампа. В результате получился такой jQuery код:

function symbolsToEntities(sText) {
	var sNewText = "";
	var iLen = sText.length;
	for (i=0; i<iLen; i++) {
		iCode = sText.charCodeAt(i);
		sNewText += (iCode > 256? "&#" + iCode + ";": sText.charAt(i));
	}
	return sNewText;
}
var xml = ''; 
// var entities = {};
$('p.ctext').each(function(index, element) { 
  if ($(this).text()) {
  //entities[$(this).children('b').text()] = 1;
  xml = xml + '<page>\
	<titul>'+ $(this).children('b').eq(0).text() + '</titul>\
	<id>' + (30 + index) + '</id>\
	<revision>\
      <id>' + (100 + index) + '</id>\
	  <contributor>\
          <username>Kurokikaze</username>\
          <id>366807</id>\
       </contributor>\
	  <text xml:space="preserve">' + $(this).html() + '</text>\
	</revision>\
  </page>';
  }
   
  });

Функция symbolsToEntities преобразовывает спецсимволы чтобы не нарушать валидность XML. После выполнения кода в переменной xml окажется дамп свежесозданных статей. После этого остаётся добавить к нему остальной XML и можно импортировать в wiki. Специально для этой страницы я создал вики на wikia.com, и импорт прошёл успешно.

Пара замечаний: надо форматировать текст заранее, то что можно сделать простым поиском/заменой, надо сделать ещё до импорта (убрать лишние переносы строк, например). Можно импортировать даже не совсем валидный XML — если у вас ошибка в 101 статье, предыдущие 100 импортируются нормально.

Node.js была мне нужна именно чтобы не запускать этот код в браузере — я пробовал, получается очень долго. В результате после переустановки npm я таки сумел поставить все нужные модули (старая версия почему то отказывалась это делать). Node.js + jQuery, как оказалось, очень удобно пользоваться — можно быстро отладить jQuery-часть в браузере и спокойно запускать краулер.

Добавить комментарий

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: