Материал из Википедии — свободной энциклопедии
# -*- coding: utf-8 -*-
# Добавляет в начало статей о датах чего-нибудь
import sys, os
import time, datetime
import codecs
import socket
import re
import wikipedia, config
site=None
monthNameGen = [
None,
u'января', u'февраля', u'марта', u'апреля', u'мая', u'июня',
u'июля', u'августа', u'сентября', u'октября', u'ноября', u'декабря'
]
monthDaysAmount = [
None,
31,29,31,30,31,30,
31,31,30,31,30,31
]
monthDaysAmountNormal = [
0,
31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31
]
monthDaysAmountLeap = [
0,
31, 29, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31
]
#
def report(text = ""):
wikipedia.output(text)
def getDatePageTitle(dd, mm):
return "%d %s" % (dd, monthNameGen[mm])
def checkIfAlreadyContainsHeader(text, dd, mm):
# regexp = getDatePageTitle(dd, mm) + "[\s ]|( )"
# if (re.compile(getDatePageTitle(dd, mm) + "( | )" + "—|-" +
report(u"Checking for \"" + getDatePageTitle(dd, mm) + u"\" in article text...")
regexp = u"(''')" + \
getDatePageTitle(dd, mm) + \
u"(''')" + \
u"([\s ]|( ))((-)|(—))([\s ]|( ))"
return re.compile(regexp).search(text)
def addHeader(text, dd, mm):
return compileHeader(dd, mm) + u"\n\n" + text
def isLeapDay(dd, mm):
if (dd == 29) and (mm == 2):
return True
else:
return False
def isBeforeLeapDay(dd, mm):
if isLeapDay(dd, mm):
return False
else:
if mm > 2:
return False
else:
return True
def getRightForm(number, formSingle, formDouble, formPlural):
if ((number%100) > 10) and ((number%100) < 20):
return formPlural
else:
if ((number%10) == 1):
return formSingle
else:
if ((number%10) >= 2) and ((number%10) <= 4):
return formDouble
else:
return formPlural
def getEnding(number):
if ((number%100) > 10) and ((number%100) < 20):
return u"ый"
else:
if ((number%10) == 1):
return u"ый"
if ((number%10) == 2):
return u"ой"
if ((number%10) == 3):
return u"ий"
if ((number%10) == 4):
return u"ый"
if ((number%10) == 5):
return u"ый"
if ((number%10) == 6):
return u"ой"
if ((number%10) == 7):
return u"ой"
if ((number%10) == 8):
return u"ой"
if ((number%10) == 9):
return u"ый"
if ((number%10) == 0):
if ((number%100) == 0):
return u"ый"
if ((number%100) == 10):
return u"ый"
if ((number%100) == 20):
return u"ый"
if ((number%100) == 30):
return u"ый"
if ((number%100) == 40):
return u"ой"
if ((number%100) == 50):
return u"ый"
if ((number%100) == 60):
return u"ый"
if ((number%100) == 70):
return u"ый"
if ((number%100) == 80):
return u"ый"
if ((number%100) == 90):
return u"ый"
def compileHeader(dd, mm):
dayOfTheYearNormal = 0
dayOfTheYearLeap = 0
daysRemainsNormal = 365
daysRemainsLeap = 366
for i in range(1, mm, 1):
dayOfTheYearNormal += monthDaysAmountNormal[i]
dayOfTheYearLeap += monthDaysAmountLeap[i]
daysRemainsNormal -= monthDaysAmountNormal[i]
daysRemainsLeap -= monthDaysAmountLeap[i]
dayOfTheYearNormal += dd
dayOfTheYearLeap += dd
daysRemainsNormal -= dd
daysRemainsLeap -= dd
# '''1 января''' - 1-ый день года в [[Григорианский календарь|григорианском календаре]].
# До конца года остаётся 364 дня (365 дней - в [[Високосный год|високосные годы]]).
# '''31 декабря''' - 365-ый день года (366-ой день в [[Високосный год|високосные годы]]). До конца года остаётся 0 дней.
header = u"'''" + \
getDatePageTitle(dd, mm) + \
u"'''" + \
u" " + u"—" + u" " + \
str(dayOfTheYearNormal) + \
u"-" + getEnding(dayOfTheYearNormal) + \
u" день года"
if isLeapDay(dd, mm):
header += u" в [[Григорианский календарь|григорианском календаре]]. До конца года остаётся " + \
str(daysRemainsLeap) + u" " + getRightForm(daysRemainsLeap, u"день", u"дня", u"дней") + \
u"."
else:
if isBeforeLeapDay(dd, mm):
header += u" в [[Григорианский календарь|григорианском календаре]]. До конца года остаётся " + \
str(daysRemainsNormal) + u" " + getRightForm(daysRemainsNormal, u"день", u"дня", u"дней") + \
u" (" + \
str(daysRemainsLeap) + u" " + getRightForm(daysRemainsLeap, u"день", u"дня", u"дней") + \
u" " + u"—" + u" " + \
u"в [[Високосный год|високосные годы]])."
else:
header += u" (" + \
str(dayOfTheYearLeap) + u"-" + getEnding(dayOfTheYearLeap) + \
u" в [[Високосный год|високосные годы]]) в [[Григорианский календарь|григорианском календаре]]." + \
u" До конца года остаётся " + \
str(daysRemainsNormal) + u" " + getRightForm(daysRemainsNormal, u"день", u"дня", u"дней") + \
u"."
return header
def main():
# wikipedia.output(u"utf-8")
# wikipedia.output(u"Starting: " + str(datetime.datetime.now()))
ddStart = 1
mmStart = 1
for arg in sys.argv[1:]:
arg = wikipedia.argHandler(arg, 'JaroslavleffBot-dates-ru')
if arg:
if arg.startswith('-dd:'):
ddStart = int(arg[4:])
elif arg.startswith('-mm:'):
mmStart = int(arg[4:])
else:
report(u"Unknown argument: " + arg)
wikipedia.stopme()
sys.exit(1)
if not config.never_log:
wikipedia.activateLog('dates-ru.log')
site=wikipedia.getSite()
# check if logged in
#
# if site.loggedin():
# report(u"Logged in (%s)" % repr(site))
# else:
# report(u"Not logged in (%s)" % repr(site))
# os.exit(2)
firstRun = True
print "ddStart=%d"%(ddStart)
print "mmStart=%d"%(mmStart)
for mm in range(1,len(monthNameGen),1):
for dd in range(1,monthDaysAmount[mm]+1,1):
if firstRun:
if (dd == ddStart) and (mm == mmStart):
firstRun = False
else:
continue
datePageTitle = getDatePageTitle(dd, mm)
report("Trying to get page with title = \"" + datePageTitle + "\"")
datePage = wikipedia.Page(site, title = datePageTitle)
datePageText = datePage.get()
global textfile
textfile = None
try:
textfile = codecs.open('dates/%s.txt.old' % datePageTitle, 'w', 'utf-8')
except IOError:
pass
textfile.write(datePageText)
textfile.flush()
if checkIfAlreadyContainsHeader(datePageText, dd, mm):
report(u"Ok, skipping...")
else:
report(u"Adding header and saving it...")
textfile2 = None
try:
textfile2 = codecs.open('dates/%s.txt.new' % datePageTitle, 'w', 'utf-8')
except IOError:
pass
datePageText2 = addHeader(datePageText, dd, mm)
textfile2.write(datePageText2)
textfile2.flush()
try:
status, reason, data = datePage.put(newtext = datePageText2, comment = u"Robot: n-ый день года")
except wikipedia.EditConflict, error:
wikipedia.output(u'ERROR putting page: %s. Giving up.' % error)
except (socket.error, IOError, wikipedia.PageNotSaved), error:
wikipedia.output(u'ERROR putting page: %s. Giving up.' % error)
else:
print status, reason
continue
# break
# wikipedia.stopme()
# break
if __name__ == "__main__":
try:
main()
except:
wikipedia.stopme()
raise
else:
wikipedia.stopme()
wikipedia.stopme()