Автор Тема: Вопросы по работе в вики.  (Прочитано 9536 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Asva

  • Пользователь
  • **
  • Сообщений: 96
    • Просмотр профиля
Вопросы по работе в вики.
« : 27 Август 2013, 18:50:06 »
Есть несколько вопросов к разбирающимся людям.
1) В англоязычной вики, воркшопы, существа, вещи многие параметры берут из равов. Можно ли реализовать что-то сходное?
Ведь ручная правка, в сравнении, куда более трудоемка и, менее - мобильна.
2) Вброс кипы картинок, реально?

Оффлайн Admin

  • Администратор
  • Пользователь
  • *****
  • Сообщений: 95
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #1 : 28 Август 2013, 21:09:17 »
1. В нашей вики-дварфии тоже самое, инфа о существах, растениях, камнях берётся из равок. Ведь во многом она является зеркальным отражением англовики.
2. Картинки можно, только не переборщить, как с количеством, так и с размером. Картинки по 5-10 Мб каждая не нужны. Куда именно ты хочешь их вставлять?

Оффлайн AnotherBoris

  • Ветеран
  • *****
  • Сообщений: 1031
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #2 : 29 Август 2013, 04:24:09 »
:) Асва скромный, и не в обиду ему будет сказано, мутный :) Он имел в виду не столько можно ли в русской вики реализовать что-то подобное (ибо Асва уже знал до этого, что можно), и даже не столько как это реализовать, сколько просил показать ему на конкретных примерах как этим пользоваться для конкретных, не названных Асвой в целях конспирации, целях, прости Господи за тавтологию :)

Оффлайн Asva

  • Пользователь
  • **
  • Сообщений: 96
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #3 : 29 Август 2013, 11:16:44 »
Подтверждаю сказанное нескромным AnotherBoris-ом.
1) Нужно взять равы из мастерворка и адаптировать автоматическое из них выдирание нужных кусков так, чтобы минимально затронуть работу вики ванильной. Я слабое представление имею, как  это делается :).
На данном этапе интересуют воркшопы. В перспективе - также существа и вещи. Хотя если ориентироваться на вики англоязычную, существ может оказаться сделать изрядно просто (если на задаваться целью впихнуть в каждую статью кастомный кусок).
2) Меня интересуют картинки воркшопов. Сильно заколебался их руками вставлять. Они в сумме на пару мегабайт может завесят.

Оффлайн Oreyn

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #4 : 29 Август 2013, 14:57:34 »
Подтверждаю сказанное нескромным AnotherBoris-ом.
1) Нужно взять равы из мастерворка и адаптировать автоматическое из них выдирание нужных кусков так, чтобы минимально затронуть работу вики ванильной. Я слабое представление имею, как  это делается :).
На данном этапе интересуют воркшопы. В перспективе - также существа и вещи. Хотя если ориентироваться на вики англоязычную, существ может оказаться сделать изрядно просто (если на задаваться целью впихнуть в каждую статью кастомный кусок).
2) Меня интересуют картинки воркшопов. Сильно заколебался их руками вставлять. Они в сумме на пару мегабайт может завесят.

Давно тыкал я медиавики. Но помню там можно указывать тег на принадлежность статьи к определенной группе. Создаешь группу "Мастерворк" и вперед. Мало того, можно сделать шаблон специальной плашки с картинкой и надписью "Эта статья относится к моду Мастерворк", и в которую включить тег группы. После чего такую плашку можно добавить в статью одной строчкой вызова, статья обзаведется нужным заголовком плюс автоматически попадет в список статей по мастерворку, который можно получать в виде списка. Кроме того, в шаблон плашки можно передавать например название статьи в виде параметра, и тогда она будет выглядеть как "Мастерская Говнокрафтера относится к моду мастерворк!". И сюда же линк, на статью что же такое мастерворк вообще.

Что ты имеешь в виду под "подсунуть равки - получить статьи?". В принципе это возможно, фактически тебе нужно всего лишь написать текстовый парсер, который из подсунутых равок сделает шаблон в формате медиавики. Если шаришь в любом языке программирования, открыть/закрыть/построчно прочитать/записать текстовый файл, регулярные выражения, словари для уже имеющихся статей, чтобы делать медиавики линки и вперед.
Но опять таки, сколько там всего этих мастерских? 10-20? Написать и отладить такой парсер по времени будет дольше чем руками их набрать. Разве что ошибок по невнимательности будет меньше, да и стиль единым.
А вот если замахиваться на парсер, который будет инкрементально обновлять статьи по новым равкам. Тут задачка еще посложнее и позаковыристей. Но опять таки вопрос "маю час, маю натхнення".

Да, про размер файлов - в фотошопе юзайте Save for Web and Devices, с небольшой потерей в качестве отличная потеря в весе. Вместо 2 мб будет килобайт 500 от силы.

Оффлайн Admin

  • Администратор
  • Пользователь
  • *****
  • Сообщений: 95
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #5 : 29 Август 2013, 15:03:35 »
1. А если равки мастерворка слегка переименовать, добавить какую-нибудь букву к текстовым файлам в начале? Тогда стандартные шаблоны можно использовать без изменений.
2. Про картинки не совсем понял, тебя утомило их по одной загружать на сайт и хочется сразу десяток выбрать?

Мало того, можно сделать шаблон специальной плашки с картинкой и надписью "Эта статья относится к моду Мастерворк", и в которую включить тег группы.
Стоит уже нечто подобное.
Что ты имеешь в виду под "подсунуть равки - получить статьи?". В принципе это возможно, фактически тебе нужно всего лишь написать текстовый парсер, который из подсунутых равок сделает шаблон в формате медиавики. Если шаришь в любом языке программирования, открыть/закрыть/построчно прочитать/записать текстовый файл, регулярные выражения, словари для уже имеющихся статей, чтобы делать медиавики линки и вперед.
Парсер уже есть, но как я понял, есть вероятность затереть оригинальные равки, если они имеют одинаковые названия с равками из Мастерворка.

Оффлайн Asva

  • Пользователь
  • **
  • Сообщений: 96
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #6 : 30 Август 2013, 02:26:42 »
Oreyn, >10-20
В районе трехсот, если не больше  :-[.

Admin, >тебя утомило их по одной загружать на сайт
Да, разбалован дропбоксом и любыми другими хостингами.
> есть вероятность затереть оригинальные равки
Не знаю. И толком не могу найти информации на эту тему. Предположительно, для загрузки равок нужно больше прав (чем есть у меня).
Можно по-подробнее, как создаются (тырятся из англ. вики) модули парсера?

Эдит: немного разобрался в том, как это работает. Для существ есть темплейт, выдирающий из равов все, что полагается. Равы делаются подстатьей (?), так: Beer Man/raw‎.
Для воркшопов ситуация куда грустней. В ваниле воркшопов немного и они не полностью описаны равками. Т.е. их проще описать ручками, а парсера нет.
Для мастерворка хотел бы сделать автовыдирание из равов профессии строителя и работника, горячие клавиши, список реакций. Таков план.
« Последнее редактирование: 30 Август 2013, 13:51:49 от Asva »

Оффлайн Admin

  • Администратор
  • Пользователь
  • *****
  • Сообщений: 95
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #7 : 30 Август 2013, 20:03:18 »
Вроде вот этот парсер обрабатывает информацию. Если ты в этом разбираешься, то можешь переделать его под свои нужды, а я прикручу его к движку вики-дварфии. А дальше уже шаблонами.
<?php
/*
 * DFRawFunctions extension by Quietust
 * Dwarf Fortress Raw parser functions
 */

if (!defined('MEDIAWIKI'))
{
echo "This file is an extension of the MediaWiki software and cannot be used standalone\n";
die(1);
}

$wgExtensionCredits['parserhook'][] = array(
'path'           => __FILE__,
'name'           => 'DFRawFunctions',
'author'         => 'Quietust',
'url'            => 'http://df.magmawiki.com/index.php/User:Quietust',
'version'        => '1.0',
'description'    => 'Dwarf Fortress Raw parser functions',
);

$wgHooks['ParserFirstCallInit'][] 'efDFRawFunctions_Setup';
$wgHooks['LanguageGetMagic'][] 'efDFRawFunctions_Magic';

function 
efDFRawFunctions_Setup (&$parser)
{
$parser->setFunctionHook('df_raw', 'DFRawFunctions::raw');
$parser->setFunctionHook('df_tag', 'DFRawFunctions::tag');
$parser->setFunctionHook('df_tagentry', 'DFRawFunctions::tagentry');
$parser->setFunctionHook('df_tagvalue', 'DFRawFunctions::tagvalue');
$parser->setFunctionHook('df_foreachtag', 'DFRawFunctions::foreachtag');
$parser->setFunctionHook('df_foreachtoken', 'DFRawFunctions::foreachtoken');
$parser->setFunctionHook('df_makelist', 'DFRawFunctions::makelist');
$parser->setFunctionHook('df_statedesc', 'DFRawFunctions::statedesc');
$parser->setFunctionHook('mreplace', 'DFRawFunctions::mreplace');
$parser->setFunctionHook('delay', 'DFRawFunctions::delay');
$parser->setFunctionHook('eval', 'DFRawFunctions::evaluate');
return true;
}

function 
efDFRawFunctions_Magic (&$magicWords$langCode)
{
$magicWords['df_raw'] = array(0'df_raw');
$magicWords['df_tag'] = array(0'df_tag');
$magicWords['df_tagentry'] = array(0'df_tagentry');
$magicWords['df_tagvalue'] = array(0'df_tagvalue');
$magicWords['df_foreachtag'] = array(0'df_foreachtag');
$magicWords['df_foreachtoken'] = array(0'df_foreachtoken');
$magicWords['df_makelist'] = array(0'df_makelist');
$magicWords['df_statedesc'] = array(0'df_statedesc');
$magicWords['mreplace'] = array(0'mreplace');
$magicWords['delay'] = array(0'delay');
$magicWords['eval'] = array(0'eval');
return true;
}

class 
DFRawFunctions
{
// Takes some raws and returns a 2-dimensional token array
// If 2nd parameter is specified, then only tags of the specified type will be returned
private static function getTags ($data$type '')
{
$raws = array();
$off 0;
while (1)
{
$start strpos($data'['$off);
if ($start === FALSE)
break;
$end strpos($data']'$start);
if ($end === FALSE)
break;
$off $end 1;
$tag explode(':'substr($data$start 1$end $start 1));
if (($type == '') || ($tag[0] == $type))
$raws[] = $tag;
}
return $raws;
}

// Take an entire raw file and extract one entity
public static function raw (&$parser$data ''$object ''$id ''$notfound '')
{
$start strpos($data'['$object .':'$id .']');
if ($start === FALSE)
return $notfound;
$end strpos($data'['$object .':'$start 1);
if ($end === FALSE)
return substr($data$start);
return substr($data$start$end $start);
}

// Checks if a tag is present, optionally with a particular token at a specific offset
public static function tag (&$parser$data ''$type ''$offset 0$entry '')
{
if ($entry == '')
$entry $type;
$tags self::getTags($data$type);
foreach ($tags as $tag)
{
if ($offset >= count($tag))
continue;
if ($tag[$offset] == $entry)
return TRUE;
}
return FALSE;
}

// Locates a tag matching certain criteria and returns the tag at the specified offset
// Match condition parameters are formatted CHECKOFFSET:CHECKVALUE
// If offset is of format MIN:MAX, then all tokens within the range will be returned, colon-separated
public static function tagentry (&$parser$data ''$type ''$offset 0$notfound 'not found')
{
$numcaps func_num_args() - 5;
$tags self::getTags($data$type);
foreach ($tags as $tag)
{
if ($offset >= count($tag))
continue;
$match true;
for ($i 0$i $numcaps$i++)
{
$parm func_get_arg($i 5);
list($checkoffset$checkval) = explode(':'$parm);
if (($checkoffset >= count($tag)) || ($tag[$checkoffset] != $checkval))
{
$match false;
break;
}
}
if ($match)
{
$range explode(':'$offset);
if (count($range) == 1)
return $tag[$offset];
else
{
$out = array();
for ($i $range[0]; $i <= $range[1]; $i++)
$out[] = $tag[$i];
return implode(':'$out);
}
}
}
return $notfound;
}

// Locates a tag and returns all of its tokens as a colon-separated string
public static function tagvalue (&$parser$data ''$type ''$notfound 'not found')
{
$tags self::getTags($data$type);
if (count($tags) == 0)
return $notfound;
$tag $tags[0];
array_shift($tag);
return implode(':'$tag);
}

// Iterates across all matching tags and produces the string for each one, substituting \1, \2, etc. for the tokens
// Probably won't work with more than 9 parameters
public static function foreachtag (&$parser$data ''$type ''$string '')
{
$tags self::getTags($data$type);
$out '';
foreach ($tags as $tag)
{
$rep_in = array();
for ($i 0$i count($tag); $i++)
$rep_in[$i] = '\\'. ($i 1);
$out .= str_replace($rep_in$tag$string);
}
return $out;
}

// Iterates across all tokens within a specific tag in groups and produces the string for each group, substituting \1, \2, etc.
// Input data is expected to come from tagvalue()
public static function foreachtoken (&$parser$data ''$offset 0$group 1$string '')
{
$tag explode(':'$data);
$out '';
$rep_in = array();
for ($i 0$i $group$i++)
$rep_in[] = '\\'. ($i 1);
for ($i $offset$i count($tag); $i += $group)
{
$rep_out = array();
for ($j 0$j $group$j++)
$rep_out[] = $tag[$i $j];
$out .= str_replace($rep_in$rep_out$string);
}
return $out;
}

// Iterates across all objects in the specified raw file and extracts specific tokens
// Token extraction parameters are formatted TYPE:OFFSET:CHECKOFFSET:CHECKVALUE
// If CHECKOFFSET is -1, then CHECKVALUE is ignored
// If TYPE is "STATE" and OFFSET is "NAME" or "ADJ", then OFFSET and CHECKOFFSET will be fed into statedesc() to return the material's state descriptor
// Objects which fail to match *any* of the checks will be skipped
public static function makelist (&$parser$data ''$object ''$string '')
{
$numcaps func_num_args() - 4;
$rep_in = array();
for ($i 0$i $numcaps$i++)
$rep_in[$i] = '\\'. ($i 1);
$out '';
$off 0;
while (1)
{
$start strpos($data'['$object .':'$off);
if ($start === FALSE)
break;
$end strpos($data'['$object .':'$start 1);
if ($end === FALSE)
$end strlen($data);
$off $end;
$tags self::getTags(substr($data$start$end $start));
$rep_out = array();
for ($i 0$i $numcaps$i++)
{
$parm func_get_arg($i 4);
list($gettype$getoffset$checkoffset$checkval) = explode(':'$parm);
// permit fetching material state descriptors from here
if (($gettype == 'STATE') && (in_array($getoffset, array('NAME''ADJ'))))
{
$val self::statedesc($parsersubstr($data$start$end $start), $getoffset$checkoffset);
if (strlen($val))
$rep_out[$i] = $val;
continue;

foreach ($tags as $tag)
{
if (($tag[0] != $gettype) || ($getoffset >= count($tag)))
continue;
if (($checkoffset 0) || (($checkoffset count($tag)) && ($tag[$checkoffset] == $checkval)))  
{
$rep_out[$i] = $tag[$getoffset];
break;
}
}
}
if (count($rep_in) == count($rep_out))
$out .= str_replace($rep_in$rep_out$string);
}
return $out;
}

// Determines a material's state descriptor by parsing its raws
public static function statedesc (&$parser$data ''$type ''$state '')
{
$tags self::getTags($data);
$names = array('NAME' => array(), 'ADJ' => array());
foreach ($tags as $tag)
{
if (in_array($tag[0], array('STATE_NAME''STATE_NAME_ADJ')))
{
if (in_array($tag[1], array('SOLID''ALL_SOLID')))
$names['NAME']['SOLID'] = $tag[2];
if (in_array($tag[1], array('SOLID_POWDER''POWDER''ALL_SOLID')))
$names['NAME']['POWDER'] = $tag[2];
if (in_array($tag[1], array('SOLID_PASTE''PASTE''ALL_SOLID')))
$names['NAME']['PASTE'] = $tag[2];
if (in_array($tag[1], array('SOLID_PRESSED''PRESSED''ALL_SOLID')))
$names['NAME']['PRESSED'] = $tag[2];
if ($tag[1] == 'LIQUID')
$names['NAME']['LIQUID'] = $tag[2];
if ($tag[1] == 'GAS')
$names['NAME']['GAS'] = $tag[2];
}
if (in_array($tag[0], array('STATE_ADJ''STATE_NAME_ADJ')))
{
if (in_array($tag[1], array('SOLID''ALL_SOLID')))
$names['ADJ']['SOLID'] = $tag[2];
if (in_array($tag[1], array('SOLID_POWDER''POWDER''ALL_SOLID')))
$names['ADJ']['POWDER'] = $tag[2];
if (in_array($tag[1], array('SOLID_PASTE''PASTE''ALL_SOLID')))
$names['ADJ']['PASTE'] = $tag[2];
if (in_array($tag[1], array('SOLID_PRESSED''PRESSED''ALL_SOLID')))
$names['ADJ']['PRESSED'] = $tag[2];
if ($tag[1] == 'LIQUID')
$names['ADJ']['LIQUID'] = $tag[2];
if ($tag[1] == 'GAS')
$names['ADJ']['GAS'] = $tag[2];
}
}
if (!isset($names[$type]))
return '';
if (!isset($names[$type][$state]))
return '';
return $names[$type][$state];
}

// Performs multiple string replacements
public static function mreplace (&$parser$data '')
{
$numargs func_num_args() - 2;
$rep_in = array();
$rep_out = array();
for ($i 0$i $numargs$i += 2)
{
$rep_in[] = func_get_arg($i 2);
if ($i == $numargs 2)
$rep_out[] = '';
else $rep_out[] = func_get_arg($i 3);
}
return str_replace($rep_in$rep_out$data);
}

public static function delay (&$parser)
{
$args func_get_args();
array_shift($args);
return '{{'implode('|'$args) .'}}';
}

// Evaluates any templates within the specified data - best used with foreachtag
public static function evaluate (&$parser$data '')
{
return $parser->replaceVariables($data);
}
}

Касательно мультизагрузки, есть пара плагинов для медиавики, но ни один не захотел работать.
« Последнее редактирование: 30 Август 2013, 21:14:10 от Admin »

Оффлайн Asva

  • Пользователь
  • **
  • Сообщений: 96
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #8 : 30 Август 2013, 22:09:01 »
Admin:
Этот то, что нужно!
Возьми отсюда (справа кнопочка загрузить) новую версию. Вероятно, она куда-то кидается через FTР. В ней и равы мастерворка есть. Это даст мне возможность поколупать парсер в боевых условиях.
Есть основания полагать, что дописывать массу кода не нужно; необходимы, в худшем случае, косметические изменения.
С картинками печально. Ну да ладно, вставлю руками.

Оффлайн Oreyn

  • Старожил
  • ****
  • Сообщений: 331
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #9 : 30 Август 2013, 22:46:52 »
поколупать парсер в боевых условиях.

Я бы советовал поднять медиавики на локале и опробовать и отладить парсер там, перед "боевыми условиями".
Всяко меньше крови сдавать на откатах версии обратно, даже если для этого есть инструменты.

Оффлайн Admin

  • Администратор
  • Пользователь
  • *****
  • Сообщений: 95
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #10 : 30 Август 2013, 23:50:07 »
Вероятно, она куда-то кидается через FTР. В ней и равы мастерворка есть. Это даст мне возможность поколупать парсер в боевых условиях.
Я знаю, куда она кидается, потому что ранняя версия этого парсера у нас уже стояла. Версию обновил, вроде всё работает как прежде, что радует.

Вижу появилось в парсере разделение на версии, в зависимости от префиксов названий страниц (40d, DF2012 и т.д.)  Буржуям ещё не надоело плодить разные пространства имён. Если ничего не найдено, то грузятся настройки по умолчанию, видимо как у нас. Не знаю, может быть для работы должной с равками мастерворка потребуется создавать пространство имён Masterwork, чтобы страницы в итоге имели наименования вида Masterwork:Tribal_Wargear‎, а может и так работать будет, если грузить равки вручную самому на сайт.

Оффлайн Asva

  • Пользователь
  • **
  • Сообщений: 96
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #11 : 31 Август 2013, 10:47:27 »
Странное дело. Я не нашел на русской вики ни одного случая использования этого раводера - #df_raw. Т.е. любая информация сначала любовно по-кусочкам добавляется ручками - потом парсится средствами медиавики.
Провел несколько опытов по использованию #df_raw:
  • Русская вики - команда не находит файл равов
  • Голая вики на локалхосте - команда не находит файл равов
  • Английская вики - works like a charm
Задал вопрос главному повару всей этой кухни. Глядишь, проблема разрешится.

Оффлайн Admin

  • Администратор
  • Пользователь
  • *****
  • Сообщений: 95
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #12 : 31 Август 2013, 13:23:29 »
Странное дело. Я не нашел на русской вики ни одного случая использования этого раводера - #df_raw.
Может быть кто-то уже перелопатил наши шаблоны на другой лад, я этим не занимался.

Повторюсь, на английской есть разделение на версии (это прописывается в конфиге вики). Но даже если тупо назвать страницу Masterwork:мастерская, то всё вероятно будет работать.

Оффлайн Asva

  • Пользователь
  • **
  • Сообщений: 96
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #13 : 31 Август 2013, 13:31:16 »
2. Да, забыл сказать, в голой вики на локалхосте я добавил namespace - Masterwork. Пробовал создать с ним статьи. Это дало ничего.
Кроме того, на вики англоязычной выдирание равов мастерворка можно проводить и не в неймспейсе мастерворка, а вполне даже DF2012.
Цитировать
Может быть кто-то уже перелопатил наши шаблоны на другой лад, я этим не занимался.
Хочешь сказать, раньше было по-другому?
Просто в англоязычной эту команду тоже никто особо не использовал (ввиду сложности, надо думать), предпочитая копипастить кусочки ручками.  :)

Оффлайн Admin

  • Администратор
  • Пользователь
  • *****
  • Сообщений: 95
    • Просмотр профиля
Re: Вопросы по работе в вики.
« Ответ #14 : 31 Август 2013, 17:11:20 »
Я в шаблонах вики мало смыслю, поэтому ничего не могу сказать, что было и что стало. Юзер Cypselus очень много менял.