', data, 1)
fol_num += 1
else:
middle_list += ['span']
data = re.sub('(?:{{{((?:(?! |{{{|}}}|<).)*) ?|(}}}))', '', data, 1)
else:
middle_list += ['code']
middle_stack += 1
data = re.sub('(?:{{{((?:(?! |{{{|}}}|<).)*)|(}}}))', '' + middle_data[0].replace('\\', '\\\\'), data, 1)
middle_number += 1
else:
if middle_list == []:
data = re.sub('(?:{{{((?:(?! |{{{|}}}|<).)*) ?|(}}}))', '}}}', data, 1)
else:
if middle_stack > 0:
middle_stack -= 1
if middle_stack > 0:
data = re.sub('(?:{{{((?:(?! |{{{|}}}|<).)*) ?|(}}}))', '}}}', data, 1)
else:
if middle_number > 0:
middle_number -= 1
if middle_list[middle_number] == '2div':
data = re.sub('(?:{{{((?:(?! |{{{|}}}|<).)*) ?|(}}}))', '', data, 1)
elif middle_list[middle_number] == 'pre':
data = re.sub('(?:{{{((?:(?! |{{{|}}}|<).)*) ?|(}}}))', '', data, 1)
else:
data = re.sub('(?:{{{((?:(?! |{{{|}}}|<).)*) ?|(}}}))', '' + middle_list[middle_number] + '>', data, 1)
del(middle_list[middle_number])
else:
break
# NoWiki 처리
num = 0
while 1:
nowiki_data = re.search('((?:(?:(?!<\/code>).)*\n*)*)<\/code>', data)
if nowiki_data:
nowiki_data = nowiki_data.groups()
num += 1
end_data += [['nowiki_' + str(num), nowiki_data[0], 'code']]
data = re.sub('((?:(?:(?!<\/code>).)*\n*)*)<\/code>', '', data, 1)
else:
break
# Syntax 처리
num = 0
while 1:
syntax_data = re.search('((?:(?:(?:(?!<\/code>|((?:(?:(?:(?!<\/code>|', data, 1)
else:
break
# HTML 처리
while 1:
html_data = re.search('((?:(?:(?:(?!<\/span>)).)+\n*)+)<\/span>', data)
if html_data:
html_data = html_data.groups()
html_data_2 = html_data[0]
can_html = ['b', 'span']
dic = {}
for i in can_html:
while 1:
test = re.search('<' + i + '((?:(?!>).)*)>', html_data_2)
if test:
test = test.groups()[0]
test = re.sub('"', '"', test)
html_data_2 = re.sub('<' + i + '((?:(?!>).)*)>', '<' + i + test + '>', html_data_2, 1)
else:
break
for i in can_html:
span_num = re.findall('<' + i + '(?:(?:(?!>).)*)>', html_data_2)
span_num = len(span_num)
span_end_num = re.findall('<\/' + i + '>', html_data_2)
span_end_num = len(span_end_num)
dic[i] = span_num - span_end_num
for i in can_html:
html_data_2 += ('' + i + '>' * dic[i])
data = re.sub('((?:(?:(?:(?!<\/span>)).)+\n*)+)<\/span>', '' + html_data_2 + '<\/span>', data, 1)
else:
break
return data
def link_fix(main_link):
if re.search('^:', main_link):
main_link = re.sub('^:', '', main_link)
main_link = re.sub('^사용자:', 'user:', main_link)
main_link = re.sub('^파일:', 'file:', main_link)
main_link = re.sub('^분류:', 'category:', main_link)
other_link = re.search('(#.+)$', main_link)
if other_link:
other_link = other_link.groups()[0]
main_link = re.sub('(#.+)$', '', main_link)
else:
other_link = ''
return [main_link, other_link]
def namu(conn, data, title, main_num):
# DB 지정
curs = conn.cursor()
# 초기 설정
data = '\n' + data + '\n'
backlink = []
plus_data = '''
'''
math = math.groups()[0]
first += 1
data = math_re.sub('', data, 1)
plus_data += ''
else:
break
# 한 글자 NoWiki
num = 0
while 1:
one_nowiki = re.search('(?:\\\\)(.)', data)
if one_nowiki:
one_nowiki = one_nowiki.groups()
num += 1
end_data += [['one_nowiki_' + str(num), one_nowiki[0], 'normal']]
data = re.sub('(?:\\\\)(.)', '', data, 1)
else:
break
# 수평줄
while 1:
hr = re.search('\n-{4,9}\n', data)
if hr:
data = re.sub('\n-{4,9}\n', '\n\n', data, 1)
else:
break
data += '\n'
# 추가 이스케이프
data = data.replace('\\', '\')
# 텍스트 꾸미기 문법
data = re.sub(''''(?P((?!''').)+)'''', '\g', data)
data = re.sub('''(?P((?!'').)+)''', '\g', data)
data = re.sub('~~(?P(?:(?!~~).)+)~~', '\g', data)
data = re.sub('--(?P(?:(?!~~).)+)--', '\g', data)
data = re.sub('__(?P(?:(?!__).)+)__', '\g', data)
data = re.sub('\^\^(?P(?:(?!\^\^).)+)\^\^', '\g', data)
data = re.sub(',,(?P(?:(?!,,).)+),,', '\g', data)
# 넘겨주기 변환
redirect_re = re.compile('\n#(?:redirect|넘겨주기) ((?:(?!\n).)+)\n', re.I)
redirect = redirect_re.search(data)
if redirect:
redirect = redirect.groups()[0]
return_link = link_fix(redirect)
main_link = return_link[0]
other_link = return_link[1]
backlink += [[title, main_link, 'redirect']]
data = redirect_re.sub('\n * redirect to [[' + main_link + ']]\n', data, 1)
# [목차(-)] 처리
no_toc_re = re.compile('\[(?:목차|toc)\((?:no)\)\]\n', re.I)
toc_re = re.compile('\[(?:목차|toc)\]', re.I)
if not no_toc_re.search(data):
if not toc_re.search(data):
data = re.sub('\n(?P={1,6}) ?(?P(?:(?!=).)+) ?={1,6}\n', '\n[toc]\n\g \g \g\n', data, 1)
else:
data = no_toc_re.sub('', data)
# 문단 문법
toc_full = 0
toc_top_stack = 6
toc_stack = [0, 0, 0, 0, 0, 0]
edit_number = 0
toc_data = '
toc\n\n'
while 1:
toc = re.search('\n(={1,6}) ?((?:(?!\n).)+) ?\n', data)
if toc:
toc = toc.groups()
toc_number = len(toc[0])
edit_number += 1
# 더 크면 그 전 스택은 초기화
if toc_full > toc_number:
for i in range(toc_number, 6):
toc_stack[i] = 0
if toc_top_stack > toc_number:
toc_top_stack = toc_number
toc_full = toc_number
toc_stack[toc_number - 1] += 1
toc_number = str(toc_number)
all_stack = ''
# 스택 합치기
for i in range(0, 6):
all_stack += str(toc_stack[i]) + '.'
while 1:
if re.search('[^0-9]0\.', all_stack):
all_stack = re.sub('[^0-9]0\.', '.', all_stack)
else:
break
all_stack = re.sub('^0\.', '', all_stack)
data = re.sub('\n(={1,6}) ?((?:(?!\n).)+) ?\n', '\n' + all_stack + ' ' + re.sub('=*$', '', toc[1]) + ' (Edit)\n', data, 1)
toc_main_data = toc[1]
toc_main_data = re.sub('=*$', '', toc_main_data)
toc_main_data = re.sub('\[\*((?:(?! |\]).)*)(?: ((?:(?!(\[\*(?:(?:(?!\]).)+)\]|\])).)+))?\]', '', toc_main_data)
toc_main_data = re.sub('<\/span>', '(수식)', toc_main_data)
toc_data += '' + all_stack + ' ' + toc_main_data + '\n'
else:
break
toc_data += '
'
data = toc_re.sub(toc_data, data)
# 일부 매크로 처리
data = tool.savemark(data)
anchor_re = re.compile("\[anchor\((?P(?:(?!\)\]).)+)\)\]", re.I)
data = anchor_re.sub('', data)
ruby_re = re.compile("\[ruby\((?P(?:(?!,).)+)\, ?(?P(?:(?!\)\]).)+)\)\]", re.I)
data = ruby_re.sub('\g', data)
# 글 상자 끼어들기
data = re.sub('{{\|(?P(?:(?:(?!\|}}).)*\n*)+)\|}}', '
\g
', data)
# 원래 코드 재탕
now_time = tool.get_time()
date_re = re.compile('\[date\]', re.I)
data = date_re.sub(now_time, data)
time_data = re.search('^([0-9]{4}-[0-9]{2}-[0-9]{2})', now_time)
time = time_data.groups()
age_re = re.compile('\[age\(([0-9]{4}-[0-9]{2}-[0-9]{2})\)\]', re.I)
while 1:
age_data = age_re.search(data)
if age_data:
age = age_data.groups()[0]
old = datetime.datetime.strptime(time[0], '%Y-%m-%d')
will = datetime.datetime.strptime(age, '%Y-%m-%d')
e_data = old - will
data = age_re.sub(str(int(e_data.days / 365)), data, 1)
else:
break
dday_re = re.compile('\[dday\(([0-9]{4}-[0-9]{2}-[0-9]{2})\)\]', re.I)
while 1:
dday_data = dday_re.search(data)
if dday_data:
dday = dday_data.groups()[0]
old = datetime.datetime.strptime(time[0], '%Y-%m-%d')
will = datetime.datetime.strptime(dday, '%Y-%m-%d')
e_data = old - will
if re.search('^-', str(e_data.days)):
e_day = str(e_data.days)
else:
e_day = '+' + str(e_data.days)
data = dday_re.sub(e_day, data, 1)
else:
break
# 유튜브, 카카오 티비 처리
video_re = re.compile('\[(youtube|kakaotv|nicovideo)\(((?:(?!\)\]).)+)\)\]', re.I)
youtube_re = re.compile('youtube', re.I)
kakaotv_re = re.compile('kakaotv', re.I)
while 1:
video = video_re.search(data)
if video:
video = video.groups()
width = re.search(', ?width=((?:(?!,).)+)', video[1])
if width:
video_width = width.groups()[0]
else:
video_width = '560'
height = re.search(', ?height=((?:(?!,).)+)', video[1])
if height:
video_height = height.groups()[0]
else:
video_height = '315'
code = re.search('^((?:(?!,).)+)', video[1])
if code:
video_code = code.groups()[0]
else:
video_code = ''
if youtube_re.search(video[0]):
video_code = re.sub('^https:\/\/www\.youtube\.com\/watch\?v=', '', video_code)
video_code = re.sub('^https:\/\/youtu\.be\/', '', video_code)
video_src = 'https://www.youtube.com/embed/' + video_code
elif kakaotv_re.search(video[0]):
video_code = re.sub('^https:\/\/tv\.kakao\.com\/channel\/9262\/cliplink\/', '', video_code)
video_code = re.sub('^http:\/\/tv\.kakao\.com\/v\/', '', video_code)
video_src = 'https://tv.kakao.com/embed/player/cliplink/' + video_code +'?service=kakao_tv'
else:
video_src = 'https://embed.nicovideo.jp/watch/' + video_code
data = video_re.sub('', data, 1)
else:
break
# 인용문 구현
while 1:
block = re.search('(\n(?:> ?(?:(?:(?!\n).)+)?\n)+)', data)
if block:
block = block.groups()[0]
block = re.sub('^\n> ?', '', block)
block = re.sub('\n> ?', '\n', block)
block = re.sub('\n$', '', block)
data = re.sub('(\n(?:> ?(?:(?:(?!\n).)+)?\n)+)', '\n
' + block + '
\n', data, 1)
else:
break
data = re.sub('(?P\n +\* ?(?:(?:(?!\|\|).)+))\|\|', '\g\n ||', data)
# 리스트 구현
while 1:
li = re.search('(\n(?:(?: *)\* ?(?:(?:(?!\n).)+)\n)+)', data)
if li:
li = li.groups()[0]
while 1:
sub_li = re.search('\n(?:( *)\* ?((?:(?!\n).)+))', li)
if sub_li:
sub_li = sub_li.groups()
# 앞의 공백 만큼 margin 먹임
if len(sub_li[0]) == 0:
margin = 20
else:
margin = len(sub_li[0]) * 20
li = re.sub('\n(?:( *)\* ?((?:(?!\n).)+))', '
':
footdata_all = ''
data = re.sub('\n$', footdata_all, data + '\n', 1)
# 분류 마지막 처리
category += '
'
category = re.sub(' / <\/div>$', '
', category)
if category == '\n
category :
':
category = ''
data += category
# NoWiki 마지막 처리
i = 0
while 1:
try:
_ = end_data[i][0]
except:
break
if end_data[i][2] == 'normal':
data = data.replace('', end_data[i][1])
data = data.replace(tool.url_pas(''), tool.url_pas(end_data[i][1]))
else:
if re.search('\n', end_data[i][1]):
data = data.replace('', '\n
' + re.sub('^\n', '', end_data[i][1]) + '
')
else:
data = data.replace('', '' + end_data[i][1] + '')
i += 1
if main_num == 1:
# 역링크에도
i = 0
while 1:
try:
_ = backlink[i][0]
except:
break
find_data = re.search('', backlink[i][1])
if find_data:
j = 0
find_data = find_data.groups()[0]
while 1:
try:
_ = end_data[j][0]
except:
break
if end_data[j][0] == find_data:
backlink[i][1] = backlink[i][1].replace('', end_data[j][1])
j += 1
i += 1
# 마지막 처리
data = re.sub('<\/td_end>', '
', data)
data = re.sub('\n', '', data)
data = re.sub('\n<\/include>', '', data)
data = re.sub('(?P<\/h[0-9]>)(\n)+', '\g', data)
data = re.sub('\n\n
', '\n
', data)
data = re.sub('<\/ul>\n\n', '
', data)
data = re.sub('^(\n)+', '', data)
data = re.sub('(\n)+
', '
', data)
data = re.sub('(?P
).)*)>)\n', '\g', data)
data = re.sub('(\n)?(\n)?', '', data)
data = re.sub('<\/ul>\n\n