Для викисловаря: шаблон «длина слова»

Posted by neurocod on Май 3, 2009

Для ru.wiktionary.org : код для проверки необходимости добавления шаблона «длина слова», для каждого языка в словарной статье. На С++/Qt. Для использования нужно подключить QString и QList. Код не оптимизирован, но, учитывая скорость передачи данных по сети при редактировании, это не проблема.

  1. //WikiLanguages.h
  2. //By neurocod – 03.05.2009 15:59:54
  3.  
  4. #ifndef WIKILANGUAGES_H
  5. #define WIKILANGUAGES_H
  6. #pragma once
  7.  
  8. #include "main.h"
  9.  
  10. struct RuWiktionaryLangInfo
  11. {
  12.         QString m_strLangCode;//пример: ru или uk
  13.         QString m_strLangChapterTitle;//пример: {{-ru-}} или {{-la-|{{PAGENAME}}}} – общая часть будет выглядеть как "{{-ru-"
  14.         QString m_strLengthTemplate;//пример: {{длина слова|6|lang=uk}} и другие варианты – см файл с исходниками.
  15. };
  16.  
  17. //WikiLanguages is singleton
  18. class WikiLanguages
  19. {
  20. public:
  21.         static WikiLanguages* GetInstance();
  22.         virtual ~WikiLanguages(void);
  23.        
  24.         //Если нужно добавить шаблоны длины слова, параметр strNeededChanges будет непустой
  25.         void MaybeInsertWordLengthTemplates(
  26.                 IN const QString & strArticleTitle,
  27.                 IN const QString & strArticle,
  28.                 OUT QString & strNeededChanges)const;
  29.        
  30.         void GetIterators(
  31.                 OUT QList<RuWiktionaryLangInfo>::const_iterator & it,
  32.                 OUT QList<RuWiktionaryLangInfo>::const_iterator & end)const;
  33. protected:
  34.         WikiLanguages(void);
  35.         static WikiLanguages* s_instance;
  36.         QList<RuWiktionaryLangInfo> m_listLanguages;
  37. };
  38.  
  39. #endif//WIKILANGUAGES_H
  40. //________________________________________________________________
  41.  
  1. //WikiLanguages.cpp : implementation file
  2. //By neurocod – 03.05.2009 15:59:56
  3.  
  4. #include "WikiLanguages.h"
  5.  
  6. #ifndef FromUnicode
  7. #define FromUnicode(x) (QString::fromUtf16(reinterpret_cast<const ushort *>(x)))
  8. #endif
  9. //________________________________________________________________
  10. namespace RuWiktionary
  11. {
  12.         QString strWordLengthTemplate(FromUnicode(L"{{длина слова|%2|lang=%1}}"));
  13.         //для русского языка, нужно учитывать дополнительные варианты, см ниже
  14.         QString strWordLengthTemplate2(FromUnicode(L"{{длина слова|%1|lang=}}"));
  15.         //для русского языка, этот шаблон предпочтительнее:
  16.         QString strWordLengthTemplate3(FromUnicode(L"{{длина слова|%1}}"));
  17. }
  18. //________________________________________________________________
  19. WikiLanguages* WikiLanguages::s_instance = 0;
  20. const char* g_arrStrWikiLangCodes[]={
  21.         "af",
  22.         "als",
  23.         "am",
  24.         "an",
  25.         "ang",
  26.         "ar",
  27.         "ast",
  28.         "ay",
  29.         "az",
  30.         "be",
  31.         "bg",
  32.         "bn",
  33.         "br",
  34.         "bs",
  35.         "ca",
  36.         "chr",
  37.         "co",
  38.         "cs",
  39.         "csb",
  40.         "cy",
  41.         "da",
  42.         "de",
  43.         "dv",
  44.         "dz",
  45.         "el",
  46.         "en",
  47.         "eo",
  48.         "es",
  49.         "et",
  50.         "eu",
  51.         "fa",
  52.         "fi",
  53.         "fj",
  54.         "fo",
  55.         "fr",
  56.         "fy",
  57.         "ga",
  58.         "gd",
  59.         "gl",
  60.         "gn",
  61.         "gu",
  62.         "gv",
  63.         "ha",
  64.         "he",
  65.         "hi",
  66.         "hr",
  67.         "hsb",
  68.         "hu",
  69.         "hy",
  70.         "ia",
  71.         "id",
  72.         "ie",
  73.         "ik",
  74.         "io",
  75.         "is",
  76.         "it",
  77.         "iu",
  78.         "ja",
  79.         "jbo",
  80.         "jv",
  81.         "ka",
  82.         "kk",
  83.         "kl",
  84.         "km",
  85.         "kn",
  86.         "ko",
  87.         "ks",
  88.         "ku",
  89.         "kw",
  90.         "ky",
  91.         "la",
  92.         "lb",
  93.         "li",
  94.         "ln",
  95.         "lo",
  96.         "lt",
  97.         "lv",
  98.         "mg",
  99.         "mi",
  100.         "mk",
  101.         "ml",
  102.         "mn",
  103.         "mr",
  104.         "ms",
  105.         "mt",
  106.         "my",
  107.         "na",
  108.         "nah",
  109.         "nds",
  110.         "ne",
  111.         "nl",
  112.         "nn",
  113.         "no",
  114.         "oc",
  115.         "om",
  116.         "pa",
  117.         "pl",
  118.         "ps",
  119.         "pt",
  120.         "qu",
  121.         "ro",
  122.         "roa-rup",
  123.         "ru",
  124.         "rw",
  125.         "sa",
  126.         "scn",
  127.         "sd",
  128.         "sg",
  129.         "sh",
  130.         "si",
  131.         "simple",
  132.         "sk",
  133.         "sl",
  134.         "sm",
  135.         "so",
  136.         "sq",
  137.         "sr",
  138.         "ss",
  139.         "st",
  140.         "su",
  141.         "sv",
  142.         "sw",
  143.         "ta",
  144.         "te",
  145.         "tg",
  146.         "th",
  147.         "ti",
  148.         "tk",
  149.         "tl",
  150.         "tn",
  151.         "tpi",
  152.         "tr",
  153.         "ts",
  154.         "tt",
  155.         "ug",
  156.         "uk",
  157.         "ur",
  158.         "uz",
  159.         "vi",
  160.         "vo",
  161.         "wa",
  162.         "wo",
  163.         "yi",
  164.         "za",
  165.         "zh",
  166.         "zh-min-nan",
  167.         "zu",
  168. };
  169. //________________________________________________________________
  170. WikiLanguages::WikiLanguages(void)
  171. {
  172.         for(int i=0;i<_countof(g_arrStrWikiLangCodes); i++)
  173.         {
  174.                 QString strLang = g_arrStrWikiLangCodes[i];
  175.                 RuWiktionaryLangInfo info;
  176.                 info.m_strLangCode = strLang;
  177.                 info.m_strLangChapterTitle = QString("{{-%1-").arg(strLang);
  178.                 info.m_strLengthTemplate = RuWiktionary::strWordLengthTemplate.arg(strLang);
  179.                
  180.                 m_listLanguages << info;
  181.         }
  182. }
  183.  
  184. WikiLanguages::~WikiLanguages(void)
  185. {
  186. }
  187.  
  188. void WikiLanguages::GetIterators(
  189.                 OUT QList<RuWiktionaryLangInfo>::const_iterator & it,
  190.                 OUT QList<RuWiktionaryLangInfo>::const_iterator & end)const
  191. {
  192.         it = m_listLanguages.begin();
  193.         end = m_listLanguages.end();
  194. }
  195.  
  196. //static
  197. WikiLanguages* WikiLanguages::GetInstance()
  198. {
  199.         if(!s_instance)
  200.         {
  201.                 s_instance = new WikiLanguages();
  202.         }
  203.         return s_instance;
  204. }
  205.  
  206. void WikiLanguages::MaybeInsertWordLengthTemplates(
  207.                 IN const QString & strArticleTitle,
  208.                 IN const QString & strArticle,
  209.                 OUT QString & strNeededChanges)const
  210. {
  211.         ASSERT(strNeededChanges.isEmpty());
  212.         QList<RuWiktionaryLangInfo>::const_iterator it = m_listLanguages.begin();
  213.         for(; it!=m_listLanguages.end(); it++)
  214.         {
  215.                 const RuWiktionaryLangInfo & info = *it;
  216.                 if(-1!=strArticle.indexOf(info.m_strLangChapterTitle))
  217.                 {
  218.                         //встрелился соответствующий язковый раздел. Шаблон присутствует?
  219.                         int nWordLength = strArticleTitle.length();
  220.                         QString strTemplate = QString(info.m_strLengthTemplate).arg(nWordLength);
  221.                         bool bPresent = (-1!=strArticle.indexOf(strTemplate));
  222.                         //для русского языка, параметр языка может быть пустым, проверить эту ситуацию отдельно
  223.                         if(!bPresent && info.m_strLangCode=="ru")
  224.                         {
  225.                                 strTemplate = QString(RuWiktionary::strWordLengthTemplate2).arg(nWordLength);
  226.                                 bPresent = (-1!=strArticle.indexOf(strTemplate));
  227.                                 if(!bPresent)
  228.                                 {
  229.                                         //последним заносится предпочтительный шаблон:
  230.                                         strTemplate = QString(RuWiktionary::strWordLengthTemplate3).arg(nWordLength);
  231.                                         bPresent = (-1!=strArticle.indexOf(strTemplate));
  232.                                 }
  233.                         }
  234.                         if(!bPresent)
  235.                         {
  236.                                 strNeededChanges += strTemplate;
  237.                                 strNeededChanges += "\r\n";
  238.                         }
  239.                 }//если язык встретился
  240.         }//по языкам
  241. }
  242. //________________________________________________________________

Last modified on Май 3, 2009

Filed under: записи с метками Теги/метки: , No Comments »

« | Home | »

Leave a Reply

You must be logged in to post a comment.