TrudoBot править

Стоп! Первая статья создана неправильно: во-первых, не надо в начале статьи ставить ее заглавное слово, во-вторых, вместо {{Шаблон:new-ru-subst-m-unan}} и т. п. надо ставить: {{subst:new-ru-subst-m-unan}} и т. п. --Al Silonov 09:23, 11 июля 2008 (UTC)Ответить

(Нужно было поставить опцию -notitle). См. иномарка. Neurocod 09:43, 11 июля 2008 (UTC)Ответить
Да, теперь хорошо. Можно запускать в массовом масштабе (надеюсь, в исходной базе классы определены правильно:) --Al Silonov 11:01, 11 июля 2008 (UTC)Ответить
Стоп-стоп! Если судить по иномарке, то попрошу также добавлять определяемое слово в |основа= -- для удобства дальнейшего редактирования ручками. А в остальном вроде намана -- Wesha 11:18, 11 июля 2008 (UTC)Ответить
То есть в каждый шаблон подставлять слово в качестве параметра, например {{subst:new-ru-subst-m-unan|основа=ХХХ}} ? Neurocod 11:41, 11 июля 2008 (UTC)Ответить

Ещё пожелание: можно научить бота проверять, есть ли страница с таким именем в википедии, и если есть, то добавлять в самое начало страница шаблон {{wikipedia}}? -- Wesha 11:21, 11 июля 2008 (UTC)Ответить

Разве таких ботов еще нету? Без этой функции уже почти все готово, обошлось без программирования на Python. Вся работа свелась к переформатированию БД, изучению здешних правил, Pywikipediabot'a и подготовке файлов. А при добавлении такой функции придется глубже выучить Python и Pywikipediabot, на что времени особо нету. Neurocod 11:41, 11 июля 2008 (UTC)Ответить
Я думаю, пусть пока будут пустышки, а когда будем вручную их заполнять, вручную проверим параллели с Википедией. Насчет указания "основы" - да, можно, я подправил шаблоны. --Al Silonov 12:13, 11 июля 2008 (UTC)Ответить

Также обращаю внимание на использование ссылки на близкую статью в иноверная. Neurocod 13:02, 11 июля 2008 (UTC)Ответить

А вот тут прокол: иноверный (как и иноверный) - не существительное, а субстантивированное прилагательное. См. например красный [4]. -- Wesha 13:40, 11 июля 2008 (UTC)Ответить
Да, иноверный, в отличие от иноверная, в БД хранится как прилагательное. Сомнительные варианты могут быть, если встречаются ссылки на другие слова. Там, как правило, несколько типов, бот оставляет только тот, который совпадает с основным словом, а на остальные делает ссылки. Могу не заливать статьи, в которых более одного возможного типа (родственные слова) и ссылки, как в случае с «иноверная/иноверный». Neurocod 13:56, 11 июля 2008 (UTC)Ответить
И второй прокол: для таких ссылок надо использовать {{Cf|куда}}. А у тебя какая-то развернутая разметка. -- Wesha 13:42, 11 июля 2008 (UTC)Ответить
Исправил: было {{subst:Cf|слово}} вместо {{Cf|слово}} Neurocod 13:48, 11 июля 2008 (UTC)Ответить

Флаг бота править

Просьба пока массированно бота не запускать, до получения флага бота, чтобы не замусоривал список свежих правок. То есть десяток-другой статей нормально, а сотню не надо :) -- Wesha 13:29, 11 июля 2008 (UTC)Ответить
Разместил запрос тут: Викисловарь:Организационные_вопросы Neurocod 14:24, 11 июля 2008 (UTC)Ответить

Что делать со словами, у которых в БД есть «ссылки»? править

Например: беглая->

безработная->

безумная->

беспартийная->

Варианты:

  1. Оставить, как сейчас
  2. Вписывать ссылку другим способом; другим шаблоном
  3. Не заносить, создавать страницы без ссылок
  4. (Не) заносить, на страницах, где по БД могли быть ссылки, писать что-то типа «Бот считает эту страницу подозрительной»
  5. Не заносить такие страницы в викисловарь ботом (их меньшинство)
Предлагаю соломоново решение: сейчас не заносить; помечать в твоей базе как "пропущено; для занесения во второй заход" -- а там разберёмся. -- Wesha 16:23, 11 июля 2008 (UTC)Ответить
Хорошо, пока без ссылок. При этом, не проходит около 25% статей. Neurocod 20:52, 11 июля 2008 (UTC)Ответить
А почему бы не давать такие ссылки? Вреда от них нет, а польза - вроде есть. ДА, и еще: предложение относительно проставления параметра "основа" оказалось неудачным: для последующей доработки не сильно помогает, потому что приходится добавлять ударение и отбрасывать окончание. Проще брать уже с ударением часть слова из параметра "слоги" (до того как там проставляются дефисы). По крайней мере пока бот использует те же подстановочные шаблоны, что служат для обычного создания статей, никаких параметров вообще лучше ботом не инициировать. Вариант: написать шаблоны-дубли, предназначенные исключительно для этого бота. --Al Silonov 18:25, 11 июля 2008 (UTC)Ответить


Трудоустройство править

Я переслал эту информацию знакомому человеку в Киеве, создателю фирмы, занимающейся информационным поиском (Дмитрий Ланде, мы с ним видимся на лингвистических конференциях). Не знаю, нужны ли ему новые люди, но - вдруг. А насчет бота: я все-таки советую перевести его на Шаблон:trudo-subst, и чтобы проставлять в параметре слоги= описываемое слова (только не с помощью конструкции {{PAGENAME}}, как многие любят делать, а непосредственно, например: слоги=опреснение). Это сэкономит усилия последующим редакторам статей. --Al Silonov 15:17, 16 июля 2008 (UTC)Ответить

Благодарю за беспокойство :)
На счет слогов – извиняюсь, не заметил это улучшение и думал, что раз уж категорию добавлять вручную, то все равно, какой шаблон использовать; особенно, для уже подготовленных и запущенных заданий. Сейчас переделаю… Neurocod 15:41, 16 июля 2008 (UTC)Ответить


Прилагательные - требуется перенастройка править

Надо изменить шаблон, - совсем забыл, что для прилагательных надо больше параметров. Давай перед каждой сменой частей речи будем связываться и производить небольшую настройку. Al Silonov 14:31, 17 июля 2008 (UTC)Ответить

Хорошо. Бота остановил. Файлы перегенерировать нужно? Neurocod 15:40, 17 июля 2008 (UTC)Ответить
Думаю, нет, большинство он сделал уже с измененным, правильным шаблоном (я на ходу поменял), а в десятка два статей придется вставлять кусок типа:
|Категория=Прилагательные, склонение XX
|часть речи=Прилагательное
|степень=
|краткая=

Думаю, справимся вручную. Можно продолжать с прилагательными. --Al Silonov 16:10, 17 июля 2008 (UTC)Ответить

Специализированные шаблоны для создания болванок править

Шаблон:trudo-subst (для болванок о существительных), Шаблон:trudo-subst-Гл (для глаголов) Шаблон:trudo-subst-Прил (для прилагательных). См. также страницы обсуждения этих шаблонов - там описаны параметры. --Al Silonov 12:59, 19 июля 2008 (UTC)Ответить

Нужна проверка для тестовой партии глаголов, созданных при помощи trudo-subst-Гл Neurocod 10:22, 20 июля 2008 (UTC)Ответить
Ну, дык? Надо же начинать? --Al Silonov 11:12, 20 июля 2008 (UTC)Ответить
В смысле, парочку слов залил, желательная проверка. Это как при обращении с оружием: даже без обоймы, с проверенным отсутствием патрона в патроннике, в любом случае нужно сделать контрольный спуск курка, а не то когда-то может быть беда. Закон и порядок  :) Neurocod 11:34, 20 июля 2008 (UTC)Ответить
Судя по этим трем - работает как надо, ставит все куда надо, можно продолжать. Правда, для возвратных глаголов можно и не ставить НП=1 (они все непереходные, и это прописано в конкретных шаблонах так что отдельное указание - лишняя работа), но на виде статьи этот (правильный в общем-то) параметр не сказывается, даже если и ставить, так что терпимо. Al Silonov 12:05, 20 июля 2008 (UTC)Ответить

Украинские слова править

Для заливки по украинским словам:

Категорию "Слово из № букв" изменять? Добавлять, оставить как есть? Кроме того, для глаголов также есть информация о переходности, «доконане/недоконане», для существительных – об одушевленности и роде. Также есть пару тысяч «прислівників». Neurocod 09:10, 23 июля 2008 (UTC)Ответить
Из N букв - лучше добавлять /uk. Несовершенный вид надо давать с параметром |индекс=нес, совершенный - |индекс=сов. Для существительных - тоже параметр индекс, например: |индекс=m a (муж. одуш.); |индекс=m una (муж. неодуш), |индекс=f a (жен. одуш), |индекс=f una (жен. неодуш.), |индекс=n una (средний, неодуш). --Al Silonov 09:36, 23 июля 2008 (UTC)Ответить
Добавлять вот так - {{длина слова/uk|5}} ? Neurocod 12:34, 23 июля 2008 (UTC)Ответить
Да, потом наделаем дополнительные серии соотвтетствующих категорий. Нет, я напутал, надо: длина слова|N|lang=uk |Al Silonov 13:15, 23 июля 2008 (UTC)Ответить
Для наречий я потом переделаю Шаблон:trudo-subst-uk, сначала давай закончим сущ-прил-гл. --Al Silonov 09:49, 23 июля 2008 (UTC)Ответить
Если будет только что-то типа |индекс=f, тоже нормально? Neurocod 09:55, 23 июля 2008 (UTC)Ответить
Да, потом можно будет легко вручную подставить буковку-другую к индексу. --Al Silonov 09:58, 23 июля 2008 (UTC)Ответить

Тестовая партия залита. Ничего, что типы будут перемешаны? Neurocod 14:14, 23 июля 2008 (UTC)Ответить


Мы пока не видели существительных, но, думаю, можно приступать, болванки, вроде, нормальные. --Al Silonov 16:07, 23 июля 2008 (UTC)Ответить

Останавливаю заливку по следующей причине: нужно закончить с русскими словами (со ссылками и многозначными), а то украинские слова могут совпадать с недозалитыми русскими, и могут создаваться статьи исходно под украинский язык, что в русском викисловаре неправильно. Neurocod 16:46, 23 июля 2008 (UTC)Ответить

Эт-точно, я уже одну такую Авесту дорабатывал. Сначала надо добить весь русский ресурс. Al Silonov 17:58, 23 июля 2008 (UTC)Ответить
Заливку украинских слов продолжу. Около 10 000 украинских слов отфильтрованы, как имеющие написание, аналогичное русским словам. Они теперь вообще не попадут в список. Список для отфильтровки был большой, включал в себя слова, еще не присутствующие в викисловаре. Но та же «Авеста» все равно проскочила бы. Так как есть некоторые проблемы со сравнением слов разных языков в разных регистрах (время сортировки резко увеличивалось и т. д.). Поэтому совсем небольшое количество слов все же может проскочить. Neurocod 11:26, 26 июля 2008 (UTC)Ответить
Есть ли специальное название для слов на разных языках, но с одинаковым написанием? Нужно для того, чтобы правильно назвать список таких слов. Neurocod 11:44, 26 июля 2008 (UTC)Ответить
Нормально назвать это явление "межъязыковая омонимия", а слова - межъязыковыми омонимами. --Al Silonov 12:19, 26 июля 2008 (UTC)Ответить

С украинскими словами покончено. Через месяц-второй, возможно, возьмусь за словарь с aot.ru, в том числе – создание перенаправлений на основные словоформы. Neurocod 18:54, 3 августа 2008 (UTC)Ответить

Хорошо. Схема - такая, же, как для украинских. Создаются интеллектуальные болванки с указанием части речи и первичных грааматических признаков: для существительных - род, одушевленность (тип словоизменения, по-моему, из AOT не удастся узнать); для прилагательных и наречий - (только?) часть речи, для глаголов - вид, переходность. Отличие от украинских: есть информация об ударении. Для заголовка статьи ударения не нужно, а в параметр "слоги" его надо включать (только заменим тамошние ' на ́ ). Вся информация о формах - только для редиректов. Если статья с выбранным именем существует, слово пропускается. --Al Silonov 19:18, 3 августа 2008 (UTC)Ответить

Слова со ссылками править

Добавляются статьи со ссылками. Многие ссылки адекватные, но некоторые лучше убирать - типа ссылок на другие склонения того же слова. Neurocod 18:34, 23 июля 2008 (UTC)Ответить

Может, добавить какую-то "категорию подозрительности" для этих статей? А то просматривал-просматривал, а тут какое-нибудь подозрительное ведомо как проскочит... Пока остановил Neurocod 18:50, 23 июля 2008 (UTC)Ответить

Этой мысли я не понял. Примеры? --Al Silonov 20:00, 23 июля 2008 (UTC)Ответить

Примеры – последние слова ботозаливки… Но если так устраивает, то могу продолжить. А моя подозрительность может быть связана с плохим знанием русского языка. Neurocod 06:52, 24 июля 2008 (UTC)Ответить
Еще есть большое количество слов, у которых есть только ссылки. Например, вчера была создана статья под слово оповещать. В БД на него только есть ссылка такого вида: «оповещать ->оповестить: глагол, переходный». С такими словами что-то делать? Neurocod 07:34, 24 июля 2008 (UTC)Ответить
Если статья уже была создана, бот ее не создает. Конкретно слово ведомо, конечно же, не являетя существительным, это может быть либо вводное слово, либо предикатив. Но, думаю, таких слов - малый процент, так что я бы рискнул продолжить. Если есть априори информация о «подозрительности», можно ставить в начале шаблон {{?}}, потом разберемся. --Al Silonov 07:28, 24 июля 2008 (UTC)Ответить
А шаблон этот вызывать как {{?}}, или дописывать {{subst:?}} ?
Да, если статья создана, то бот ее уже не создает, но бот мог создать такую статью раньше, и сэкономить время/охватить больший словарь. Можно было бы создать как "слово русского языка", без дополнительной информации. Или создать список из таких слов для ручного создания статей в дальнейшем. Neurocod 07:41, 24 июля 2008 (UTC)Ответить
Вариант "просто слово русского языка" не годится: все-таки при создании статьи должна быть презумпция знания частеречной принадлежности (иногда эта презумпция оказывается ложной, и не только у ботов, но все равно, часть речи надо указывать). Вариант с отдельным списком для ручной идентификации части речи - более приемлемый. Шаблон ? просто вызывать, без subst. --Al Silonov 07:43, 24 июля 2008 (UTC)Ответить
Вот слово ярка, как пример использования шаблона {{?}}. Сойдет 4000 таких подозрительных статей? Neurocod 07:55, 24 июля 2008 (UTC)Ответить

Наречия править

Требуется шаблон для заливки наречий Neurocod 09:22, 26 июля 2008 (UTC)Ответить

Сделал Шаблон:Trudo-adv. Параметры: слоги= и значение= (оба необязательные). --Al Silonov 11:24, 26 июля 2008 (UTC)Ответить
Тест готов, требуется проверка. Neurocod 11:34, 26 июля 2008 (UTC)Ответить
Пусть сделает несколько наречий, посмотрим. --Al Silonov 12:19, 26 июля 2008 (UTC)Ответить
По-моему, нормально получается. Давай на конвейер! --Al Silonov 12:26, 26 июля 2008 (UTC)Ответить

Перерыв править

Зарубежный трафик почти закончился, продолжу заливку украинских слов в следующем месяце, через четыре дня. Neurocod 15:01, 28 июля 2008 (UTC)Ответить

OK. Тут у нас, кажется, намечается еще одна серия заливок - снова по русским словам. У одного человека есть морфологическая база на ~180 тыс. слов, может, получится что-нибудь (хотя большинство, наверное, будет пересекаться с уже имеющимися статьями). Потом нам годами сидеть -заполнять болванки ;) --Al Silonov 15:14, 28 июля 2008 (UTC)Ответить
Да, обсуждение Sokirko уже заметил, готовлю ответ... А про года - может, еще люди подтянутся, как увидят, во что превращаетя Викисловарь. Хотя, все равно будут года... Ничего, Линукс вон тоже годами делают, передовые самолеты - так целыми десятилетиями :) Neurocod 15:44, 28 июля 2008 (UTC)Ответить

Надо починить править

Твой бот во все глаголы вводил

{{cat|Глаголы||lang=}}

Это неправильно. Категория "русские глаголы" прописывается автоматически шаблоном ГлXX. Пожалуйста, пройдись по всем статьям из Категория:Русские глаголы и вычисти из них категорию "Глаголы". Изволил поломать - изволь починить :) -- Wesha 15:53, 12 октября 2008 (UTC)Ответить

Подожди, подожди, Веша! Эти "Глаголы" - часть заготовки, в этом месте просто надо добавить подходящее дополнение, например, Глаголы... ходьбы или Глаголы... технологических операций. Это поломал не Neurocod, а я, причем сознательно: ведь обычно именно мне приходится уточнять категоризацию, и я решил себе облегчить работу на одно слово в каждой такой статье. Категория "Глаголы" сама по себе никому не мешает (и есть почти не просит ;), пусть остается. --Al Silonov 22:20, 12 октября 2008 (UTC)Ответить
Хорошо, сейчас поправлю шаблон cat -- Wesha 23:22, 12 октября 2008 (UTC)Ответить


Некорректная работа бота править

Здравствуйте, ваш бот при добавлении шаблона "длина слова" наделал некорректностей, см. пример: бәрергә. По всей видимости, бот вставляет ссылку на категорию "Слова из n букв" не там где надо в случае, когда значения слов приводятся с условными обозначениями типа "перен." или "матем.". Исправьте бот и ошибки на страницах, пожалуйста. --Murator 07:34, 22 мая 2009 (UTC)Ответить

Действительно... Идея была - вставлять текст после последней категории в статье, а не в конец документа, чтобы не дописывать текст после ссылок на интервики - в википедии указано, что ссылки на интервики должны быть последними. На выходных займусь исправлением... Нужно будет определять интервики регулярным выражением... Neurocod 14:49, 22 мая 2009 (UTC)Ответить

Длина слова для перенаправлений править

Здравствуйте. А сейчас ваш бот добавляет длину слова в новые статьи? И добавляет ли шаблон длины слова в статьи-перенаправления? --Murator 19:45, 25 сентября 2009 (UTC)Ответить

Ответил в раздел "Исходники" ниже Neurocod 06:51, 29 декабря 2009 (UTC)Ответить

Ликбез править

Можно попросить консультации? Я видел, Вы писали бота на С++. У меня самое главное затруднение - как на этом языке (хотя хотелось бы на Mathematica, но для начала в C разобраться) залогиниваться и сохранять отредактированное? Если хотите - дайте ссылку на статью о программном редактировании вики. Заранее спасибо. Infovarius 22:53, 28 декабря 2009 (UTC)Ответить

Ответил в отдельный раздел, сразу за этим. Neurocod 06:50, 29 декабря 2009 (UTC)Ответить
На ваше письмо ответил, исходники выслал. Neurocod 15:44, 30 декабря 2009 (UTC)Ответить

Исходники править

К сожалению, времени на несколько проектов-хобби стало критически не хватать, и ботом для викисловаря пришлось пожертвовать. Если кому-то нужен бот на С++ - могу выложить исходники. Бот использует wikimedia API: http://www.mediawiki.org/wiki/API или на русском тут: http://www.mediawiki.org/wiki/API/ru . Для компилирования нужна либо Visual Studio 2008 + свободный плагин Qt для Visual Studio тут http://qt.nokia.com/downloads , либо свободно доступный Qt Creator (можно скачать по последней ссылке). Но для Qt Creator нужно будет немного переделать бота - я давно не тестировал код под Qt Creator, наверняка вкрались некоторые несовместимости. Преимущества Qt Creator - можно работать из под Linux. Если у вас есть Visual Studio прежней версии, то наверное можно сделать и "даунгрейд" проекта, но уж лучше выкачать пиратскую версию или посмотреть, возможна ли работа с бесплатной Express Edition. Могу выделить время на консультации и передачу проекта.
Сейчас днем я сплю, поэтому мои ответы могут задерживаться - заранее извиняюсь. Neurocod 06:50, 29 декабря 2009 (UTC)Ответить
Для того, чтобы скачивать, заливать и парсить статьи, в боте есть готовые функции. Например, getPageByTitle - по названию статьи идет на сервер, если бот еще не залогинен - логинится, парсит ответ, получает текст, если что-то не вышло (например проблемы с сетью) или ответ содержит ошибки - возвращает код ошибки. Или функция editPageByTitle - нужен только текст для новой статьи, имя статьи и комментарий для описания изменения. Neurocod 07:10, 29 декабря 2009 (UTC)Ответить

Попробовал я наконец распаковать вашего бота. Есть VS2008, установил QT. И не компилируется по вашей инструкции... В BuildLog выводит кучу всего (видимо, так и задумано?), но в окошке Output вроде основная ошибка - не находит файлы:
Project : error PRJ0019: A tool returned an error code from "Moc'ing NTableView.h..."
Creating browse information file...
BSCMAKE: error BK1506 : cannot open file '.\Debug\ActionDescContainer.sbr': No such file or directory
Project : warning PRJ0018 : The following environment variables were not found:
$(QTDIR)

Это у меня руки кривые? Infovarius 16:00, 15 февраля 2010 (UTC)Ответить

Для начала проверки (подозрительно сообщение на счет $(QTDIR)):
  1. новый проект Qt (любой) создать/собрать/запустить удалось?
  2. Какая версия Qt? Если не совпадает, то в контекстном меню проекта можно выбрать "Qt Project Settings" и сменить. Хотя врядли не совпадает - не компилировалось бы.
  3. sbr - это sources browser information - создается самой студией по время сборки. Права на запись в ту папку есть? (Могла распаковаться из архива с атрибутом "только для чтения").

Вдогонку: недавно как раз косметические изменения в боте сделал - повыносил некоторые классы в отдельные файлы и привел некоторые функции к общему стилю, как в Qt. Могу выслать новую версию. Neurocod 16:18, 15 февраля 2010 (UTC)Ответить

Всё, спасибо - скомпилировалось и запустилось. Создал переменную $QTDIR и добавил $QTDIR/bin в $PATH. Я надеялся, что установка QT сама всё умеет делать, даже перезагрузил после неё, оказалось недостаточно. Ну теперь будут разбираться. Infovarius 09:11, 16 февраля 2010 (UTC)Ответить

Иерархия классов править

Я тоже своего SKbot сам написал, только не на С++, а на Паскале. Хочу поинтересоваться, как у вас иерархия классов реализована? -- Sergey kudryavtsev 19:46, 15 февраля 2010 (UTC)Ответить

А что именно интересует - например, классы для парсинга ответов wikimedia API, или все классы, или только GUI, или для работы с сетью, ... ? Neurocod 07:54, 16 февраля 2010 (UTC)Ответить
:-) Интересуют классы сущностей MediaWiki (страниц, категорий, интервик, и т.п.). Например у меня есть базовый абстрактный класс TMWObject, от которого все они занаследованы, и в результате получилась вот такая иерархия:
TMWObject
  • TMWIdObject
    • TMWNamespace
    • TMWPage
      • TMWCategory
      • TMWCategoryMember
    • TMWPageRevision
    • TMWLogEntry
  • TMWInterwiki
Конечно, у вас всё может быть реализовано совсем по-другому, и таких классов может не быть вовсе. -- Sergey kudryavtsev 11:01, 16 февраля 2010 (UTC)Ответить
У меня примерно аналогично. Такую структуру классов задает структура xml ответа сервера. Дело в том, что для парсинга xml и занесения данных из xml в объекты классов я написал "фреймворк". Его короткое описание:

Основной класс для тегов - XElement (xml element), для атрибутов - XAttribute. Для автоматического парсинга тега, например, error, создается класс:

class XError: public XElement
{
	XAttribute	m_attrCode;
	XAttribute	m_attrInfo;
public:
	XError(const QString & tagName=defaultTagName());
	DECLARE_X_DYNCREATE(XError);
	...
};

Чтобы информация из атрибутов xml сама занеслась в переменные m_attrCode и m_attrInfo, их нужно где-то зарегистрировать. Регистрация происходит в конструкторе класса:

XError::XError(const QString & tagName):
   XElement(tagName)
   ,m_attrCode(this, Strings::Attributes::code)//Strings::Attributes::code - это синоним строке "code", так код более аккуратен
   ,m_attrInfo(this, Strings::Attributes::info)
{
}

Именно для регистрации в родительском объекте тега и нужно передавать this переменным для хранения атрибутов.

Парсер возьмет объект и тег, посмотрит, какие есть атрибуты у тега, и занесет их в соответствующие зарегестрированные переменные атрибутов. Вторая стадия - это проверка: в конструкторе переменной атрибута можно указать, что этот атрибут - обязательный или опциональный. Если атрибут обязательный, а в данном теге xml так и не встретился, то проверка не будет пройдена. Эта проверка сидит в коде, не нужно использовать всякие xsd для валидации.

Но данный пример только рассказывает, как парсер наполняет атрибуты, если уже есть тег и есть объект нужного класса. А как создать объект? Для полностью автоматического парсинга такие объекты создавать надо тоже автоматически. Как? Для начала парсинга, объект тега верхнего уровня создается вручную. В данном случае - тег api, класс XWikiApi

class XWikiApi: public XElement
{
	XHandler<XError>	m_xErrors;
	XHandler<XWarning>	m_xWarnings;
	XHandler<XQuery>	m_xQuery;
	XHandler<XEdit>		m_xEdit;
	XHandler<XQueryContinue> m_xQueryContinue;
...

А в этом классе зарегестрированы списки тегов - например, XHandler<XError> m_xErrors (шаблонная переменная типа XHandler с параметром шаблона XError и именем m_xErrors). Эта переменная сама знает, теги с какими именами должны в ней храниться - так как ее конструктор вызывается с параметром по умолчанию, равным "XError::defaultTagName()" (но этот вызов можно и переопределить). Далее, этот список регистрируется у своего родительского объекта XWikiApi в его конструкторе:

XWikiApi::XWikiApi(const QString & tagName):
   XElement(tagName)
   , m_xErrors	(this, 0)
   , m_xWarnings(this, 0)
   , m_xQuery	(this, 0)
   , m_xQueryContinue(this, 0)
   , m_xEdit	(this, 0)
{
}

Происходит парсинг тега api с объеком XWikiApi. Внутри api встречается тег - пусть error. Парсер проходит по всем зарегестрированным спискам объекта XWikiApi, видит, что некий список (зарегестрированный m_xErrors) может хранить теги с данным именем. И теперь нужно автоматически создать объект типа XError и поместить его в список m_xErrors. Как? Через указатель на функцию создания объекта. Такая функция как раз и создается макросом DECLARE_X_DYNCREATE(XError), который внедрен в определение класса. И список тегов XHandler сам найдет указатель на функцию создания своего хранимого тега.

Эти списки тегов XHandler можно использовать для создания итераторов или для создания поисковых запросов. Например:

//перебрать все теги страниц
XHandler<XPages>::iterator it(m_xPages);
for(; it!=0; it++)
{
	XPages*pages = it;
	...
}
//найти страницу с заданным значение атрибута "title"
XPage* page = m_xPage.makeAttrRequest(Strings::Attributes::title, strTitle);
//найти тег с "title"=strTitle и result="Success"
XEdit * edit = m_xEdit
		.makeAttrRequest(Strings::Attributes::title, strTitle)
		.And(Strings::Attributes::result, "Success");

Проверки структуры тегов. У списков тегов есть параметры - минимальное и максимальное допустимые количества встречи тега внутри родительского. В примере выше, указано только минимальное значение - 0. Максимальное значение по умолчанию - бесконечно. После окончания парсинга тега, происходит сверка количеств - если не пройдена, то тег уничтожается. То есть, для парснга нужно только правильно описать структуру классов, а затем - пользоваться сформированной иерархией без опасений и лишних проверок. А Паскаль - в смысле Delphi? Neurocod

Да, Delphi. Для парсинга XML и работы с сетью я использую объекты ActiveX Microsoft XML DOM, наверное, сталкивались. В вашем последнем примере мне непонятно, что такое m_xPages, m_xPage, m_xEdit? Судя по префиксу, члены (переменные) некого класса? Отрывок вырван из контекста, и поэтому не понятен.
Да, переменные - аналогично описанному m_xErrors. В C++ объявление переменной - это ИмяТипа имяПеременной;, в данном случае имя типа переменной - это XHandler<XEdit>, то есть шаблонный тип XHandler с параметром шаблона XEdit - то есть список, который хранит объекты типа XEdit. Neurocod 15:21, 16 февраля 2010 (UTC)Ответить

Работа с итератором тоже не понятна:

//перебрать все теги страниц
XHandler<XPages>::iterator it(m_xPages);
for(; it!=0; it++)
{
	XPages*pages = it;
	...
}

Поясните: 1 it — это экземпляр класса итератора? Если так, то присвоение XPages*pages = it; выглядит как-то странно...

Да, итератор. А чтобы не писать что-то типа page = it.getObject(), применяется приведение типов - в С++ функцию приведения типов можно переопределить для любого заданного сочетания. Neurocod 15:21, 16 февраля 2010 (UTC)Ответить

2 ++ — перегруженный оператор итератора?

Да, переход к следующему элементу. В С++ это общепринятая практика - для списков и т. д. Neurocod 15:21, 16 февраля 2010 (UTC)Ответить

Правильно я предполагаю, что вы итераторы используете для получения продолжения запроса? Я для этого использую классический приём, callback-функции. Вот, например, функция для получения всех страниц:

procedure TMWConnection.EnumAllPages(n_namespace_id: Integer; n_min_size, n_max_size: Integer;
                                     ro: TMWRedirectOption; iwo: TMWIwikiOption;
                                     pto: TMWProtectionTypeOption; plo: TMWProtectionLevelOption;
                                     EnumProc: TMWEnumProc; data: Pointer);
var
  s_query: WideString;
begin
  s_query := 'list=allpages&aplimit=max&apnamespace='+IntToStr(n_namespace_id)+'&apfilterredir='+GetRedirectOptionStr(ro);
  if n_min_size >= 0 then
    s_query := s_query + '&apminsize=' + IntToStr(n_min_size);
  if n_max_size >= 0 then
    s_query := s_query + '&apmaxsize=' + IntToStr(n_max_size);
  if pto <> PTO_ALL then begin
    case pto of
      PTO_EDIT:
        s_query := s_query + '&apprtype=edit';
      PTO_MOVE:
        s_query := s_query + '&apprtype=move';
    end;
    case plo of
      PLO_SYSOP:
        s_query := s_query + '&apprlevel=sysop';
      PLO_REG:
        s_query := s_query + '&apprlevel=autoconfirmed';
    end;
  end;
  Enumerate(s_query, 'api/query/allpages/p', 'apcontinue', 'api/query-continue/allpages/@apcontinue', TMWPage, EnumProc, data);
end;

TMWConnection — это класс, отвечающий за соединение с сервером. Вся сермяга в вызове его же функции Enumerate:

  • s_query — запрос, который надо выполнить;
  • 'api/query/allpages/p' — XML-запрос, который надо применить к ответу сервера;
  • 'apcontinue' — параметр в URL для продолжения запроса;
  • 'api/query-continue/allpages/@apcontinue' — XML-запрос, как получить значение для продолжения запроса;
  • TMWPage — класс, экземпляр которого будет создан для каждого из XML-узлов, удовлетворяющего запросу 'api/query/allpages/p';
  • EnumProc — callback-функция, которую надо выполнить для каждого из XML-узла, удовлетворяющего запросу;
  • data — указатель, который будет передан callback-функции.

Сallback-функция принимает два параметра: экземпляр класса (в данном примере класса TMWPage) и указатель data (что именно передавать, дело разработчика бота). Вот так это выглядит у меня. -- Sergey kudryavtsev 14:44, 16 февраля 2010 (UTC)Ответить

Нет, итераторы так не использовал, хотя и можно - так как не было задачи получить все страницы. Все страницы брал из последнего дампа - так намного быстрее. Neurocod 15:21, 16 февраля 2010 (UTC)Ответить

Ну а как у вас выглядит собственно посылка запроса на сервер? Для определённости — пусть надо получить список страниц основного пространства имён в Категория:Немецкий язык. -- Sergey kudryavtsev 21:08, 16 февраля 2010 (UTC)Ответить

Примерно так (редактирование статьи вместо получения категории - так как категории еще не получал)
QBlockingHttp* m_http;//в определении класса
//в конструкторе бота:
m_http = new QBlockingHttp();
addPersistentHttpHeaders();

void TrudoBot::addPersistentHttpHeaders()
{
	m_http->addPersistentRawHeader("User-Agent", "TrudoBot 0.1");
	m_http->addPersistentRawHeader("Accept", "*/*");
	m_http->addPersistentRawHeader("Accept-Language", "ru");
	//Accept-Encoding: gzip - added by Qt 
	m_http->addPersistentRawHeader("Content-Type", "application/x-www-form-urlencoded");
}
	//в функции редактирования
	...
	QString strTitle(toPercentEncoding(_strTitle));
	QString strContent(toPercentEncoding(_strContent));
	QString strComment(toPercentEncoding(_strComment));
	QString strEditToken(toPercentEncoding(editToken()));
	QString data("action=edit&bot=1&format=xml");
	if(bMinor)
		data += "&minor=1";
	data += "&title=" + strTitle;
	data += "&text=" + strContent;
	data += "&summary=" + strComment;
	data += "&token=" + strEditToken;
	sendPostRequest(data);

void TrudoBot::sendPostRequest(QString strUrl, QByteArray data)
{
	m_strReply.clear();
	if(-1==data.indexOf("format=xml"))
	{
		trace("Looks like you forget to add format=xml\n");
	}
	if(-1==data.indexOf("bot"))
	{
		trace("Looks like you forget to add bot flag\n");
	}
	QByteArray arr = m_http->blockingPost(strUrl, data);
	m_strReply =  QString::fromUtf8(arr, arr.size());
}

Neurocod 08:34, 17 февраля 2010 (UTC)Ответить

А дальше чего происходит с m_strReply из последней строчки TrudoBot::sendPostRequest()? Я так понимаю, что она должна каким-то волшебным образом превратиться в экземпляр класса XWikiApi? -- Sergey kudryavtsev 12:51, 17 февраля 2010 (UTC)Ответить

А дальше уже рассказывал, что: для парсера нужно создать только корень документа, остальное распарсится и создастся автоматически. В частности, будет:
	XWikiApi api;
	if(api.checkAndBuild(m_strReply))
	{
		api.maybeLog();
		if(api.editSuccessOnTitle(_strTitle))
			return XWikiApiRpc::Success;
		XWikiApiRpc::Codes ret;
		bool b = api.errorCode(ret);
		if(b)
			return ret;
		return XWikiApiRpc::Error;
	}
	else
	{
		log(tr("Error: wrong xml on editPageByTitle: %1\nResponse part:%2\n")
			.arg(_strTitle)
			//не весь документ, чтобы не засорять экран
			.arg(m_strReply.left(2000))
			);
		return XWikiApiRpc::BadXml;
	}

//список кодов определен так:
namespace XWikiApiRpc
{
	enum Codes
	{
		Success=0,
		NoNeedChanges,
		Error,
		NetworkError,
		BadXml,
		NoSuchResults,
		PageMissing,
		PageProtected,
		PageDeleted,
	};
}

Neurocod 13:42, 17 февраля 2010 (UTC)Ответить

Ясненько. -- Sergey kudryavtsev 20:46, 17 февраля 2010 (UTC)Ответить

Словарные БД править

Если будет соблюдена тайна - то могу передать в персональное пользование и некоторые словарные БД. В них нету статей с переводами, только различные формы слов. Этого должно быть достаточно для заливки слов в викисловарь по языкам, аналогично произведенному мною для русского и украинского языка. (При заливке слов в викисловарь формат статей меняется, и тайна сохраняется). Более года назад я предлагал Schwallex (в приватном общении) залить и другие языки, но он не одобрил эту затею, так как другие языки заливаются и другими ботами, причем часто с более детальной информацией. Neurocod 08:10, 29 декабря 2009 (UTC)Ответить

Встроенный редактор править

А можно нам такое прикрутить? editor.js Don Rumata 15:30, 10 марта 2010 (UTC)Ответить

Внутрь бота? Neurocod 15:36, 10 марта 2010 (UTC)Ответить
Нет это javascript, позволяет делать умные формы. Посмотрите как в английской части делается добавление перевода слова. Don Rumata 15:49, 10 марта 2010 (UTC)Ответить
Увидел. Вопрос о добавлении в текущую версию, или в этот проект? Если последнее, то примерно так и планируется. Спасибо за наводку - я раньше планировал делать только два вида создания новых секций - выпадающий список с выбором языка/другой секции, и кнопки - для одиночных секций, для избранных языков. А теперь вот и третье - поле ввода имени... Neurocod 16:22, 10 марта 2010 (UTC)Ответить
Я читал ваши предложения. Я не очень понимаю необходимость хранить всё в xml. Мой опыт работы с xml показывает, что парсинг xml документов в 10 раз более затратен по памяти и процессорному времени, чем обычного текста. Я просто хотел обратить ваше внимание на то как можно упростить вашу задачу. Почитайте раздел Importing script to other Wiktionaries. Вот пример портированного кода для литовского словаря lt:Naudotojas:Vpovilaitis/editor.js. Don Rumata 18:22, 10 марта 2010 (UTC)Ответить
Процессорное время и память на традиционных задачах сейчас не особо дефицитный ресурс - за 4 года как раз в 10 раз производительность возрастает. Больше задержек возникает из-за обращения на чтение многих шаблонов... Часто считается, что удобство пользователей более важно, в обмен на работу компьютера. Написание скриптов требует знания программирования. А в случае реализации той идеи, новую структуру можно будет описывать в визуальном редакторе шаблонов, коллективно, распределенно по разным статьям, а gui будет генерироваться автоматически. Кроме того, xml важен для написания ботов - так как в большинстве языков программирования нету нормального парсера wiki-текста, а парсеры xml - есть. Neurocod 18:57, 10 марта 2010 (UTC)Ответить
Не подумайте, что я хочу с вами спорить, но я считаю шаблоны вики некоторым упрощенным xslt. И думаю, вы понимаете, что без описания схемы документа xml не чем не лучше простого текста. А если учесть, что простой пользователь ничего не знает и знать не хочет о xml, то нет никакой разницы в форматах хранения. Это всего лишь моё мнение. Кстати, хотел вас спросить, насколько трудно заставить бота пройтись по статьям на предмет добавления кода языка в шаблоны помет? Часто их забывают добавлять. Don Rumata 20:13, 10 марта 2010 (UTC)Ответить
Xml лучше простого текста тем, что позволяет хотя бы навигацию по иерархии баз ошибок, с учетом вызовов шаблонов, а парсеры есть в любом распространенном языке. В данном случае, схема обычных статей будет простая - теги t и p. Детальная проверка - аналог валидации по xsd - будет производиться движком на основе описания шаблонов. Шаблоны - аналог распределенного xsd. И у xsd можно подключать внешние файлы, но опять же, xml не допускает имена тегов с пробелами и многими другими знаками пунктуации - поэтому все такие специфические названия лучше перевести в атрибуты и теги, и использовать отдельный механизм проверки.
Пройтись не сложно, только рутина. А добавлять - не знаю, насколько сложные варианты вызова есть. Код нахождения пометы и вставки кода языка внутрь шаблона придется писать отдельно. Neurocod 20:41, 10 марта 2010 (UTC)Ответить

Изменения в API править

Хочу предупредить об изменениях в API по авторизации (см. Викисловарь:Технические вопросы#Ошибка авторизации бота и [1]). Мне пришлось изменить код авторизации бота, вероятно, вам тоже нужны изменения. -- Sergey kudryavtsev 11:27, 7 апреля 2010 (UTC)Ответить

Спасибо! Neurocod 11:50, 7 апреля 2010 (UTC)Ответить