Участник:Carn/код

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

JS скрипты, которые я использую:

  • Модуль для составления списков статей, когда регулярное выражение слишком сложное, чтобы делать это поиском insource:/regexp/ (может пропускать некоторые значения почему-то):
    public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
    { Skip = false;
      Summary = " ";
      Regex Findthis = new Regex(@"(.)+");
      string old = ArticleText;
      ArticleText = Findthis.Replace(ArticleText, "$1" );
      if(old.Equals(ArticleText))
        Skip = true;
      else { 
        Skip = true;
        System.IO.StreamWriter sw = System.IO.File.AppendText("C:/Documents/list.txt");
        sw.WriteLine(ArticleTitle);
        sw.Close(); }
      return ArticleText; }
    
  • Модуль для извлечения из шаблона строки с параметром (не оптимизирован, возвращает всю строку), есть решения лучше
         public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {   Skip = true;
            Summary = "test";
            String outStr = ArticleTitle + ";";

            if (ArticleText.Length < 10) {
            outStr = outStr + " " + "none" + ";";
            }
            else {}

            Match m = Regex.Match(ArticleText, @"(\|\s*?alias\s*?=\s*?(.*?)\n)");
            while (m.Success) {
              outStr = outStr + " " + m.Result("$1") + ";";
              m = m.NextMatch();
            }

            System.IO.StreamWriter sw = System.IO.File.AppendText("C:/Documents/list.txt");
            sw.WriteLine(outStr);
            sw.Close(); 
            return ArticleText;
        }
  • Модуль для составления списка статей с встречающимися внутри модулями и категориями (потом файл множно переименовать в .csv и работать как с таблицей)
public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {   Summary = "test";
            String outStr = ArticleTitle + ";";

            if (ArticleText.Length < 10) {
            outStr = outStr + " " + "none" + ";";
            }
            else {}
            
            Match m = Regex.Match(ArticleText, @"(?:\{\{#invoke:)([^|]+)");
            while (m.Success) {
              outStr = outStr + " " + m.Value + ";";
              m = m.NextMatch();
            }

            m = Regex.Match(ArticleText, @"(?:\{\{#invoke:[^|]+\|)([^|]+)");
            while (m.Success) {
              outStr = outStr + " " + m.Value + ";";
              m = m.NextMatch();
            }

            m = Regex.Match(ArticleText, @"(?:\{\{#invoke:[^|]+\|[^|]+)([^}]+)");
            while (m.Success) {
              outStr = outStr + " " + m.Value + ";";
              m = m.NextMatch();
            }

            System.IO.StreamWriter sw = System.IO.File.AppendText("C:/Documents/list.txt");
            sw.WriteLine(outStr);
            sw.Close(); 
            Skip = true;
            return ArticleText;
        }
private static readonly Regex TemplateString = Tools.NestedTemplateRegex(new List<string>("СС,OldStyleDate,СС2,OldStyleDate2,СС4,cc4,OldStyleDate4".Split(',')));
public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
{
	Skip = true;
	Summary = "";
    String outStr = ArticleTitle + ";";
	string arg1="", arg2="", arg3="", arg4="", arg5="", arg6="", year="";
    System.IO.StreamWriter sw = System.IO.File.AppendText("C:/Documents/list.txt");
	foreach(Match m in TemplateString.Matches(ArticleText))
	{
		string ParameterCall = m.Value;
		arg1 = WikiFunctions.Tools.GetTemplateArgument(ParameterCall, 1);
		arg2 = WikiFunctions.Tools.GetTemplateArgument(ParameterCall, 2);
		arg3 = WikiFunctions.Tools.GetTemplateArgument(ParameterCall, 3);
		arg4 = WikiFunctions.Tools.GetTemplateArgument(ParameterCall, 4);
		arg5 = WikiFunctions.Tools.GetTemplateArgument(ParameterCall, 5);
		arg6 = WikiFunctions.Tools.GetTemplateArgument(ParameterCall, 6);
		year = WikiFunctions.Tools.GetTemplateParameterValue(ParameterCall,"Год");
           
	}
    outStr = outStr + arg1 + "; " + arg2 + "; " + arg3 + "; " + arg4 + "; " + arg5 + "; " + arg6 + "; " + year;
    sw.WriteLine(outStr);
    sw.Close();    
    return ArticleText;
}
private static readonly Regex TemplateString = Tools.NestedTemplateRegex(new List<string>("НП,НП-Австралия,НП-Армения,НП-Белоруссия,НП-Великобритания,НП-Грузия,НП-Израиль,НП-Ирландия,НП-Казахстан,НП-Канада,НП-Киргизия,НП-Мексика,НП-Молдавия,НП-Нидерланды,НП-ОАЭ,НП-Польша,НП-Россия,НП+Россия,НП-США,НП-Северная Ирландия,НП-Таиланд,НП-Турция,НП-Украина,НП-Франция,НП-Южная Корея,НП-Япония,НП-Крым,НП-Донбасс,НП-Майотта,НП-ПНА,НП-ПМР,НП-НКР,НП-Абхазия,НП-Тайвань,НП-Южная Осетия".Split(',')));
public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
{
	Skip = true;
	Summary = "";
    String outStr = ArticleTitle + ";";
	string utc="", dts="";
    System.IO.StreamWriter sw = System.IO.File.AppendText("C:/Documents/list.txt");
	foreach(Match m in TemplateString.Matches(ArticleText))
	{
		string ParameterCall = m.Value;
//		nonameprmtr = WikiFunctions.Tools.GetTemplateArgument(ParameterCall, 1); нумерованный безымянный параметр
		utc = WikiFunctions.Tools.GetTemplateParameterValue(ParameterCall,"часовой пояс");
		dts = WikiFunctions.Tools.GetTemplateParameterValue(ParameterCall,"DST"); 
           
	}
    outStr = outStr + utc + "; " + dts;
    sw.WriteLine(outStr);
    sw.Close();    
    return ArticleText;
}

В помощь шпаргалка, песочница, поиск регулярок по Википедии при помощи insource необходимо сочетать с поискам по ключевым словам, причём многие функции в рамках регулярок в поиске не работают, внутри стандартного AWB тоже не всё работает, поэтому зачастую необходимо задействование модулей на C#

  • [\.\(\)\,\:\{\}\|\-\+\←\→\«\»\…\!\#\=\\\/\=\[\]\'\"] → ; [\w] → ; [^█\s]
  • (?<!\<nowiki\>)\<ref\>[\s<br\/>]*?\<\/ref\>(?!.*\<\/nowiki\>) — нахождение пустых (с пробелами и тегами <br/> и похожим мусором, не отлажено) сносок, не внутри тегов nowiki
  • (\[\[([Фф]айл|[Ff]ile|[Ii]mage|[Ии]зображение):[^\]]*?)\|(ссылка|link)=https:\/\/([a-z]{2,3})\.wikipedia\.org\/wiki\/[^\]\|]+[\|\]]$1|
  • AWB (\[\[(:?[Фф]айл|[Ff]ile|[Ii]mage|[Ии]зображение):.+?)\|(:?ссылка|link)=(:?https:\/\/(:?[a-z]{2,3})\.wikipedia\.org\/wiki\/|(:?[Фф]айл|[Ff]ile|[Ii]mage|[Ии]зображение):)([^\]\|]+?(\||\]\]))$1$8
    Тут нужна более сложная логика - если сам файл и ссылка на него отличаются см. en:Norwich City F.C. и en:Wave function
  • AWB \[\[:(aa|ab|ace|ady|af|ak|als|am|an|ang|ar|arc|ary|arz|as|ast|atj|av|avk|awa|ay|az|azb|ba|ban|bar|bat-smg|bcl|be|be-tarask|be-x-old|bg|bh|bi|bjn|bm|bn|bo|bpy|br|bs|bug|bxr|ca|cbk-zam|cdo|ce|ceb|ch|cho|chr|chy|ckb|co|cr|crh|cs|csb|cu|cv|cy|da|de|din|diq|dsb|dty|dv|dz|ee|el|eml|en|eo|es|et|eu|ext|fa|ff|fi|fiu-vro|fj|fo|fr|frp|frr|fur|fy|ga|gag|gan|gcr|gd|gl|glk|gn|gom|gor|got|gu|gv|ha|hak|haw|he|hi|hif|ho|hr|hsb|ht|hu|hy|hyw|hz|ia|id|ie|ig|ii|ik|ilo|inh|io|is|it|iu|ja|jam|jbo|jv|ka|kaa|kab|kbd|kbp|kg|ki|kj|kk|kl|km|kn|ko|koi|kr|krc|ks|ksh|ku|kv|kw|ky|la|lad|lb|lbe|lez|lfn|lg|li|lij|lmo|ln|lo|lrc|lt|ltg|lv|mai|map-bms|mdf|mg|mh|mhr|mi|min|mk|ml|mn|mnw|mo|mr|mrj|ms|mt|mus|mwl|my|myv|mzn|na|nah|nap|nds|nds-nl|ne|new|ng|nl|nn|no|nov|nqo|nrm|nso|nv|ny|oc|olo|om|or|os|pa|pag|pam|pap|pcd|pdc|pfl|pi|pih|pl|pms|pnb|pnt|ps|pt|qu|rm|rmy|rn|ro|roa-rup|roa-tara|ru|rue|rw|sa|sah|sat|sc|scn|sco|sd|se|sg|sh|shn|si|simple|sk|sl|sm|sn|so|sq|sr|srn|ss|st|stq|su|sv|sw|szl|szy|ta|tcy|te|tet|tg|th|ti|tk|tl|tn|to|tpi|tr|ts|tt|tum|tw|ty|tyv|udm|ug|uk|ur|uz|ve|vec|vep|vi|vls|vo|wa|war|wo|wuu|xal|xh|xmf|yi|yo|yue|za|zea|zh|zh-classical|zh-min-nan|zh-yue|zu|nb|zh-cn|zh-tw|nan|vro|lzh|rup|gsw|sgs|egl):([\w\s_\(\)]+?)\|([\w\s_]+?)\]]{{iw|$3||$1|$2}}
  • ((?:(?:\{\{[Мм]узыкант(?:.|\n)*?)\|(?:\s|)[Сc]трана(?:\s*?|)=(?:\s*|))(?:|(?:\{\{флагификация\|(?:[a-zа-яА-Я0-9\s\-]{3,60})\}\}|,|\<br\>|\s)+))(Социалистическая Республика Босния и Герцеговина|Народная Социалистическая Республика Албания|Объединённое княжество Валахии и Молдавии|Демократическая Республика Афганистан|Социалистическая Республика Румыния|Хорватская республика Герцег-Босна|Ломбардо-Венецианское королевство|Демократическая Республика Конго|Центральноафриканская Республика|Белорусская Народная Республика|Венгерская Народная Республика|Федеративные Штаты Микронезии|Народная Республика Болгария|Великое княжество Литовское|Французская Верхняя Вольта|Республика Сербская Краина|Соединённые Штаты Америки|Священная Римская империя|Республика Верхняя Вольта|Королевство Обеих Сицилий|Третье Болгарское царство|Доминиканская Республика|Сент-Винсент и Гренадины|Австрийская республика|Экваториальная Гвинея|Веймарская республика|Босния и Герцеговина|Папуа — Новая Гвинея|Босния и Герцеговина|Сан-Томе и Принсипи|Британский Гондурас|Австрийская империя|Бразильская империя|Азербайджанская ССР|Республика Сербская|Королевство Румыния|Республика Беларусь|Королевство Бавария|Королевство Франция|Российская империя|Маршалловы острова|Соломоновы острова|Британская империя|Западная Австралия|Республика Дагомея|Германская империя|Карело-Финская ССР|Антигуа и Барбуда|Багамские Острова|Коморские Острова|Саудовская Аравия|Сент-Китс и Невис|Тринидад и Тобаго|Новый Южный Уэльс|Республика Косово|Северная Ирландия|Республика Корея|Республика Конго|Германский союз|Восточный Тимор|Южная Австралия|Белорусская ССР|Туркменская ССР|Папская область|Республика Кипр|Великобритания|Новая Зеландия|Австро-Венгрия|Грузинская ССР|Киргизская ССР|Латвийская ССР|Молдавская ССР|Таджикская ССР|Украинская ССР|Рейнский союз|Армянская ССР|Казахская ССР|Литовская ССР|Узбекская ССР|Эстонская ССР|Страна Басков|Буркина-Фасо|Гвинея-Бисау|Сьерра-Леоне|Чехословакия|Азербайджан|Южная Корея|Кот-д’Ивуар|Лихтенштейн|Таджикистан|Южный Судан|Третий рейх|Пуэрто-Рико|Афганистан|Белоруссия|Кабо-Верде|Коста-Рика|Люксембург|Мавритания|Мадагаскар|Нидерланды|Португалия|Сан-Марино|Сент-Люсия|Узбекистан|Черногория|Австралия|Аргентина|Бангладеш|Венесуэла|Гватемала|Индонезия|Казахстан|Никарагуа|Сальвадор|Македония|Туркмения|Филиппины|Финляндия|Швейцария|Шри-Ланка|Квинсленд|Шотландия|Голландия|Барбадос|Болгария|Ботсвана|Бразилия|Беларусь|Германия|Гондурас|Доминика|Зимбабве|Иордания|Ирландия|Исландия|Камбоджа|Киргизия|Кирибати|Колумбия|Маврикий|Малайзия|Мальдивы|Мозамбик|Молдавия|Монголия|Норвегия|Пакистан|Парагвай|Сингапур|Словакия|Словения|Танзания|Хорватия|Эсватини|Виктория|Тасмания|Австрия|Албания|Андорра|Армения|Бахрейн|Бельгия|Боливия|Бурунди|Вануату|Венгрия|Вьетнам|Гренада|Джибути|Израиль|Испания|Камерун|Либерия|Марокко|Мексика|Намибия|Нигерия|Румыния|Сейшелы|Сенегал|Суринам|Таиланд|Украина|Уругвай|Франция|Эквадор|Эритрея|Эстония|Эфиопия|Тайвань|Ангола|Бруней|Гайана|Гамбия|Гвинея|Греция|Грузия|Египет|Замбия|Италия|Канада|Кувейт|Латвия|Лесото|Малави|Мальта|Монако|Мьянма|Панама|Польша|Россия|Руанда|Сербия|Сомали|Тувалу|Турция|Уганда|Швеция|Ямайка|Япония|Англия|Алжир|Белиз|Бенин|Бутан|Габон|Гаити|Дания|Индия|Йемен|Катар|Кения|Китай|Ливан|Ливия|Литва|Науру|Непал|Нигер|Палау|Самоа|Сирия|Судан|Тонга|Тунис|Фиджи|Чехия|РСФСР|Гана|Ирак|Иран|Кипр|КНДР|Куба|Лаос|Мали|Оман|Перу|Того|Чили|СССР|ГСХС|СФРЮ|ОАЭ|США|Чад|ЮАР|ФРГ|ГДР|ВНР|НРБ|ПНР|(?:[a-zа-яЁёА-Я]{1,15}[\s\-]{0,1}[a-zа-яЁёА-Я]{1,15}[\s\-]{0,1}[a-zа-яЁёА-Я]{1,15}))$1{{флагификация|$2}}
  • \[https://ru.wikipedia.org/w/index.php\?title=(.+?)&type=revision&diff=([0-9]+?)&oldid=([0-9]+?)(:?\s)(.+?)\][[Special:Diff/$3/$2|$5]]<!--$1-->

Свалка того, что может оказаться полезным

mw.ustring.isutf8( s )
mw.text.split( 'a b\tc\nd', '%s' )
mw.text.tag{ name = string, attrs = table, content = string|false }
mw.text.trim( s, charset )
mw.allToString( ... )
local value = mw.ustring.char( 0x41f, 0x440, 0x438, 0x432, 0x435, 0x442, 0x21 ) -- value is now 'Привет!'
-- {{#tag:nowiki|some text}}
frame:callParserFunction( '#tag:nowiki', 'some text' )
frame:expandTemplate{ title = title, args = table }

mw.logObject( object, prefix )
mw.clearLogBuffer()
mw.getLogBuffer()

mw.addWarning( text )
io.input("votings_full.txt")
-- \A\d{4}.+?\n	.*?\n	.*?$

local vote_data = {}
while true do
    local vote_name, list_pro, list_con = io.read("*line", "*line", "*line")
    if not vote_name then break end
    local vote_year=tonumber(string.match(vote_name,"(%d+)"))
    table.insert(vote_data,{vote_name,vote_year,list_pro,list_con})
end

-- перевод формата данных
local voters = {}

local elections = {}
local default = {__index = function() return 0 end}
local sep = "	"
for _,portion in ipairs(vote_data) do
    local vote_name, vote_year = portion[1], portion[2]
    local list_pro, list_con = portion[3], portion[4]
    if vote_year > 2016 then
      elections[vote_name] = elections[vote_name] or {}
      setmetatable(elections[vote_name], default)
      for voter_nick in string.gmatch(list_pro, "([^"..sep.."]+)") do
          voters[voter_nick] = voters[voter_nick] or {}
          voters[voter_nick][vote_name] = 1
          elections[vote_name][voter_nick] = 1
      end
      for voter_nick in string.gmatch(list_con, "([^"..sep.."]+)") do
          voters[voter_nick] = voters[voter_nick] or {}
          voters[voter_nick][vote_name] = -1
          elections[vote_name][voter_nick] = -1
      end
    end
end

-- упрощение структуры
-- voters   [voter_nick][vote_name]
-- elections[vote_name] [voter_nick]

local vote_names = {}
for k,v in pairs(elections) do
  table.insert(vote_names,k)
end

local ivot = {}
local evot = {}
for voter_nick,nick_votes in pairs(voters) do
  ivot[voter_nick] = ivot[voter_nick] or {}
  evot[voter_nick] = evot[voter_nick] or 0
  for i, name_vote in ipairs(vote_names) do
    local value = nick_votes[name_vote]
    if value then 
      evot[voter_nick] = 1 + evot[voter_nick]
    end
    ivot[voter_nick][i] = value or 0
  end
end

for k,v in pairs(evot) do
  if v < 10 then
    ivot[k] = nil
  end
end

local file = assert(io.open("output2017.txt", "w"))
io.output(file)

for voter_nick, values in pairs(ivot) do
  io.write(voter_nick .. ", " .. table.concat(values,", "), "\n")
end