پرش به محتوا

کاربر:Rezabot/مقدمه‌ای بر ساخت مقاله با ربات/افزودن زیر بخش به وسط مقاله

از ویکی‌پدیا، دانشنامهٔ آزاد

پیش از مطالعه‌ٔ این مطلب، آموزش مقدمه‌ای بر ساخت مقاله با ربات را مطالعه نمائید.

این آموزش برای ساخت مقالات رباتیکی است که دارای بخش میانی هستند و زیر بخش را می توان از ویکی های دیگر به درون مقاله درون‌ریزی کرد.(مثلا زیر بخش Related eclipses در مقالاتی مانند en:Solar eclipse of May 18, 1901 را به درون مقالات بیافزائیم)

روش کار[ویرایش]

روش کار به شرح زیر است.

این روش شامل ۳ مرحله می‌شود و تفاوت آن با روش‌های مرسوم ساخت مقالات رباتیک در این است که مقاله در سه مرحله ساخته می‌شود که روند ساخت از پائین به بالای مقاله می‌باشد.

در ابتدا بخش پائین مقاله را می‌سازیم و سپس بخش میانی را از ویکی انگلیسی دریافت و ترجمه می‌کنیم و به بالای مقالات می‌افزائیم و سپس بخش بالایی مقاله را به بالای مقاله‌ها می‌افزائیم تا مقاله به صورت کامل ساخته شود.

برای ساخت بخش بالا باید الگوی شابلون را به دو قسمت بالا و پائین تقسیم کنیم که می توان در ابتدا در الگوی شابلون بخش بالای الگو را حذف کرد و مقالات را ساخت وسپس از طریق تاریخچه واگردانی کرد و بخش پائین را حذف نمود ( در کل در این روش به جای یک الکوی شابلون ۲ الگوی نصفحه از الگوی شابلون اصلی داریم)

روند کار[ویرایش]

الف-درون‌ریزی بخش پائین:بخش پائین الگوی شابلون را به کمک متغییرهای موجود در فایل اکسل درون ریزی نمائید و ربات میان‌ویکی را بر روی مقالات برانید تا برای استفاده از ابزار کمک مترجم بتوان از میان‌ویکی‌ها استفاده کرد.
ب-درون‌ریزی بخش میانی:درون ریزی بخش میانی به روز زیر عمل کنید.
دریافت بخش میانی
۱- باید در ویکی‌پدیا دیگر مثلا انگلیسی نام مقالات مورد نظر را وارد نمائیم.
۲- برای برون‌ریزی در آن ویکی به en:Special:Export بروید و نام رده‌ای که مقاله‌ها در آن قرار دارند را در پنجرهٔ Add pages from category: بیافزائید و دکمهٔ add و در پایین دکمهٔ Export را کلیک کنید. همچنین می‌توانید نام مقاله‌ها را به صورت دستی در جعبه پائینی کپی کنید در نهایت به شما فایلی با پسوند xml می‌دهد.
۳- نام و پسوند فایل خروجی (برون‌ریزی شده) را به ExportFromWiki.txt تغییر دهید و آن را در پوشه‌ای که کد ربات (کد در پائین) موجود است قرار دهید.
۴- فایل ExportFromWiki.txt را در نرم‌افزار nodepade++ در بخش encoding تنطیمات آن را به utf-8 تغییر دهید و دخیره کنید.
۵- به کمک کد پائین محتویات فایل ExportFromWiki.txt را پالایش کنید در کد زیر نام عنوانی که قصد دریافت آن را دارید را در مقابل متغییر section_name بنویسید. تا برای بارگذاری مجدد در ویکی‌پدیا آماده گردند که نتیجه کار در فایلی با نام ExportFromWikiResult.txt ذخیره می‌شود.
۶-بخش بدست آمده توسط این ربات را درون‌ریزی به بالای مقاله‌های ساخته شده بکنید توجه داشته باشید که قبل از درون‌ریزی باید عنوان‌ها را به کمک ابزار کمک مترجم جایگزین نمائید.
ج-درون‌ریزی بخش بالای مقاله:بخش بالای مقالات را به بالای مقاله‌ها درون‌ریزی کنید.

علت افزودن وارونه![ویرایش]

به این علت بخش‌ها را به صورت وارونه یعنی از پائین به بالا می‌افزائیم تا در مدت ساخت مقاله ربات‌های میان‌ویکی، میان‌ویکی‌های لازم را به مقاله بیافزایند تا برای ترجمهٔ بخش میانی که از ویکی دیگر دریافت شده‌است بتوان از ابزار کمک مترجم استفاده کرد.

مثال[ویرایش]

به عنوان مثال تاریخچه مقاله را مشاهده کنید که ویرایش‌ها به شرح زیر هستند:

  1. اولین ویرایش
  2. ویرایش ربات میان‌ویکی و رده همسنگ
  3. افزودن بخش میانی به بالای مقاله
  4. افزودن بخش بالای مقاله

برای ساخت مقالات خورشیدگرفتگی کاربر:DarafshBot/solar باید این الگو را دو بخش کنید ۱- بخش بالا که بالای مقاله است ۲- بخش پائین که در پائین زیر بخش مورد نظر قرار می‌گیرد.

  1. ابتدا بخش پائین مقاله را تا زیر بخش جستارهای وابسته را درون‌ریزی نمائید.(کاربر:DarafshBot/solar/۱) تا مقاله با نام فارسی ساخته شود.
  2. زیر بخش بدست آمده توسط این ربات را به بالای مقالات بیافزائید.(قبل از اجرای این ربات باید الگوهای درون زیر بخش را در ویکی‌فا ساخته باشید تا ربات در زمان استخراج ترجمه شده‌آنها را استخراج نماید)
  3. زیر بخش جستارهای وابسته را به بالای جستارهای وابسته بیافزائید (کاربر:DarafshBot/solar/۲)

کد[ویرایش]

<syntaxhighlight lang="python">

  1. !/usr/bin/python
  2. -*- coding: utf-8 -*-
  3. Reza(User:reza1615), 2011
  4. Distributed under the terms of the CC-BY-SA 3.0 .
  5. !/usr/bin/python
  6. -*- coding: utf-8 -*-

import query import pagegenerators,re import wikipedia,codecs wikipedia.config.put_throttle = 0 wikipedia.put_throttle.setDelay() section_name=u'Related eclipses'# name of section that you want to extract

def englishdictionry( enlink ,firstsite,secondsite):

   try:
       enlink=unicode(str(enlink),'UTF-8').replace(u'',u'').replace(u'',u).replace(u'en:',u).replace(u'fa:',u)
   except:
       enlink=enlink.replace(u'',u'').replace(u'',u).replace(u'en:',u).replace(u'fa:',u)
   if enlink.find('#')!=-1:
       return False
   if enlink==u:
       return False    
   enlink=enlink.replace(u' ',u'_')
   site = wikipedia.getSite(firstsite)
   sitesecond= wikipedia.getSite(secondsite)
   params = {
       'action': 'query',
       'prop': 'langlinks',
       'titles': enlink,
       'redirects': 1,
       'lllimit':500,
   }
   try:
       categoryname = query.GetData(params,site, encodeTitle = True)  
       for item in categoryname[u'query'][u'pages']:
           case=categoryname[u'query'][u'pages'][item][u'langlinks']
       for item in case:
           if item[u'lang']==secondsite:
               intersec=item[u'*']
               break
       result=intersec
       if result.find('#')!=-1:
           return False
       return result
   except: 
       return False

def linktranslation():

       wikipedia.output(u'link translating is started')
       text2 = codecs.open( u'ExportFromWikiResult.txt','r' ,'utf8' )
       text = text2.read()
       linken = re.findall(ur'\[\[.*?\]\]',text, re.S)
       counter=0
       for item in linken:
               counter+=1
               itemmain=item
               item=item.replace(u'en:',u)
               if item.find('user:')!=-1 or item.find('User:')!=-1 or item.find('template:')!=-1 or item.find('Template:')!=-1 or item.find('category:')!=-1 or item.find('Category:')!=-1 or item.find('Wikipedia:')!=-1 or item.find('wikipedia:')!=-1 or item.find('Talk:')!=-1 or item.find('talk:')!=-1 or item.find('Help:')!=-1 or item.find('help:')!=-1:
                   continue
               itemen=item.split(u'|')[0].replace(u'',u'').replace(u'',u).strip()
               if text.find(itemmain)!=-1:
                   itemfa=englishdictionry(itemen ,'en','fa')
                   wikipedia.output(itemen)
               else:
                   continue
               if itemfa==False:
                   itemen=item.replace(u'',u'').replace(u'',u).strip()
                   itemen=itemen.replace(u'',u'').replace(u'',u)
                   text=text.replace(u''+itemen+u'',u'@1@'+itemen+u'@2@')
                   continue
               else:
                   text=text.replace(itemmain,u'@1@'+itemfa+u'@2@')
               linken = re.findall(ur'\[\[.*?\]\]',text, re.S)
               wikipedia.output(u'\03{lightred}----'+str(counter)+u'/'+str(len(linken))+u'----\03{default}')
               wikipedia.output(itemen)    
       text=text.replace(u'@1@',u'').replace(u'@2@',u'')
       text=text.replace(u'$$$',u"'''").replace(u'$$$',u"")
       with codecs.open( u'ExportFromWikiResult.txt',mode = 'a',encoding = 'utf8' ) as f:
                   f.write( text )

def findsection(text):

   threads=[]
   sections=[] 
   header=u'\n'
   lines=text.split('\n')
   for line in lines:
       threadHeader = re.search(ur'^== *([^=].*?) *== *$',line)
       if threadHeader:
               threads.append(threadHeader.group(0))
   numpart=len(threads)
   for part in range(0,numpart-1,2):
       sections.append(threads[part]+'\n'+text.split(threads[part])[1].split(threads[part+1])[0])
   sections.append(threads[numpart-1]+'\n'+text.split(threads[numpart-1])[1])
   return sections
   

def subsec(text):

   try:
       sections=findsection(text)
   except:
       sections=False
   if sections:
       for i in sections:
           if i.find(section_name)!=-1:
               return i
   return u'no section found!'
   

def run():

   count = 0
   filesample = 'ExportFromWiki.txt' #---XMl that came from other wiki 
   text2 = codecs.open( filesample,'r' ,'utf8' )
   text = text2.read()
   for pag in text.split( u'<page>' ):
       section1 = {}
       count += 1
       if count==1:
           continue
       title = pag.split( u'</title>' )[0].replace( u'<title>', ).strip()
       section = pag.split( u'<revision>' )[-1]
       try:
           section = section.split( u'<text xml:space="preserve" bytes=' )[1]
           section = section.split( u'>' )[1]
           section = section.split( u'</text' )[0]
       except:
           a = 1
       section = section.replace( u'<',u'<' )
       section = section.replace( u'>',u'>' )
       section = section.replace( u'"',u'"' )
       section = section.replace( u'•',u'•' )
       section = section.replace( u'–',u'-' )
       section = section.replace( u'أ£',u'ã' )
       section = section.replace( u'أ©',u'é' )
       section = section.replace( u'أ­',u'í' )
       section = section.replace( u'أ´',u'ô' )
       title = title.replace( u'أ£',u'ã' )
       title = title.replace( u'أ©',u'é' )
       title = title.replace(u'أ­',u'í' )
       title = title.replace( u'أ´',u'ô' )
       section=subsec(section)
       resultdata = "\n@@@\n%s\n" % ( title ) + section+u'\n@@@'
       with codecs.open( 'ExportFromWikiResult.txt',mode = 'a',encoding = 'utf8' ) as f:# 
                   f.write( resultdata )
       f.close()
   wikipedia.output(u'\03{lightred}text filtering is done!\03{default}')
   wikipedia.output(u'\03{lightgreen}--------------------------------------------\03{default}')

def main():

   run()
   linktranslation()

if __name__ == '__main__':

       main()