from . import tool
import datetime
import html
import re
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 = ''
main_link = re.sub('\\\\#', '%23', main_link)
return [main_link, other_link]
def table_parser(data, cel_data, start_data, num = 0):
table_class = 'class="'
div_style = 'style="'
all_table = 'style="'
cel_style = 'style="'
row_style = 'style="'
row = ''
cel = 'colspan="' + str(round(len(start_data) / 2)) + '"'
if num == 0:
if re.search('^ ', cel_data) and re.search(' $', cel_data):
cel_style += 'text-align: center;'
elif re.search('^ ', cel_data):
cel_style += 'text-align: right;'
elif re.search(' $', cel_data):
cel_style += 'text-align: left;'
table_state = re.findall('<((?:(?!>).)+)>', data)
for in_state in table_state:
if re.search("^table ?width=([^=]+)$", in_state):
table_data = re.sub('^table ?width=', '', in_state)
div_style += 'width: ' + ((table_data + 'px') if re.search('^[0-9]+$', table_data) else table_data) + ';'
all_table += 'width: 100%;'
elif re.search("^table ?height=([^=]+)$", in_state):
table_data = re.sub('^table ?height=', '', in_state)
div_style += 'height: ' + ((table_data + 'px') if re.search('^[0-9]+$', table_data) else table_data) + ';'
elif re.search("^table ?align=([^=]+)$", in_state):
table_data = re.sub('^table ?align=', '', in_state)
if table_data == 'right':
div_style += 'float: right;'
elif table_data == 'center':
all_table += 'margin: auto;'
elif re.search("^table ?textalign=([^=]+)$", in_state):
num = 1
table_data = re.sub('^table ?textalign=', '', in_state)
if table_data == 'right':
all_table += 'text-align: right;'
elif table_data == 'center':
all_table += 'text-align: center;'
elif re.search("^row ?textalign=([^=]+)$", in_state):
table_data = re.sub('^row ?textalign=', '', in_state)
if table_data == 'right':
row_style += 'text-align: right;'
elif table_data == 'center':
row_style += 'text-align: center;'
else:
row_style += 'text-align: left;'
elif re.search('^-([0-9]+)$', in_state):
cel = 'colspan="' + re.sub('^-', '', in_state) + '"'
elif re.search("^(\^|v)?\|([^|]+)$", in_state):
if re.search('^\^', in_state):
cel_style += 'vertical-align: top;'
elif re.search('^v', in_state):
cel_style += 'vertical-align: bottom;'
row = 'rowspan="' + re.sub('^(\^|v)?\|', '', in_state) + '"'
elif re.search("^row ?bgcolor=([^=]+)$", in_state):
table_data = re.sub('^row ?bgcolor=', '', in_state)
row_style += 'background: ' + re.sub(',([^,]*)', '', table_data) if re.search(',', table_data) else table_data + ';'
elif re.search("^row ?color=([^=]+)$", in_state):
table_data = re.sub('^row ?color=', '', in_state)
row_style += 'color: ' + re.sub(',([^,]*)', '', table_data) if re.search(',', table_data) else table_data + ';'
elif re.search("^table ?bordercolor=([^=]+)$", in_state):
table_data = re.sub('^table ?bordercolor=', '', in_state)
all_table += 'border: ' + re.sub(',([^,]*)', '', table_data) if re.search(',', table_data) else table_data + ' 2px solid;'
elif re.search("^table ?bgcolor=([^=]+)$", in_state):
table_data = re.sub('^table ?bgcolor=', '', in_state)
all_table += 'background: ' + re.sub(',([^,]*)', '', table_data) if re.search(',', table_data) else table_data + ';'
elif re.search("^table ?color=([^=]+)$", in_state):
table_data = re.sub('^table ?color=', '', in_state)
all_table += 'color: ' + re.sub(',([^,]*)', '', table_data) if re.search(',', table_data) else table_data + ';'
elif re.search("^(bgcolor=([^=]+)|#(?:[0-9a-f-A-F]{3}){1,2}|\w+)$", in_state):
cel_style += 'background: ' + re.sub('^bgcolor=', '', in_state) + ';'
elif re.search("^color=([^=]+)$", in_state):
table_data = re.sub('^color=', '', in_state)
cel_style += 'color: ' + re.sub(',([^,]*)', '', table_data) if re.search(',', table_data) else table_data + ';'
elif re.search("^width=([^=]+)$", in_state):
table_data = re.sub('^width=', '', in_state)
cel_style += 'width: ' + ((table_data + 'px') if re.search('^[0-9]+$', table_data) else table_data) + ';'
elif re.search("^height=([^=]+)$", in_state):
table_data = re.sub('^height=', '', in_state)
cel_style += 'height: ' + ((table_data + 'px') if re.search('^[0-9]+$', table_data) else table_data) + ';'
elif re.search('^\(|:|\)$', in_state):
if in_state == '(':
cel_style += 'text-align: right;'
elif in_state == ':':
cel_style += 'text-align: center;'
else:
cel_style += 'text-align: left;'
elif re.search("^table ?class=([^=]+)$", in_state):
table_class += re.sub("^table ?class=", '', in_state)
div_style += '"'
all_table += '"'
cel_style += '"'
row_style += '"'
table_class += '"'
return [all_table, row_style, cel_style, row, cel, table_class, num, div_style]
def table_start(data):
while 1:
table = re.search('\n((?:(?:(?:(?:\|\||\|[^|]+\|)+(?:(?:(?!\|\|).\n*)*))+)\|\|(?:\n)?)+)', data)
if table:
table = table.groups()[0]
all_table = re.search('^((?:\|\||\|[^|]+\|)+)((?:<(?:(?:(?!>).)+)>)*)\n*((?:(?!\|\|).\n*)*)', table)
if all_table:
all_table = all_table.groups()
return_table = table_parser(all_table[1], all_table[2], re.sub('^\|([^|]+)\|', '||', all_table[0]))
number = return_table[6]
table_caption = re.search('^\|([^|]+)\|', table)
table_caption = '
| ',
table,
1
)
else:
break
while 1:
cel_table = re.search('((?:\|\|)+)((?:<(?:(?:(?!>).)+)>)*)\n*((?:(?:(?!\|\||<\/td>).)|\n)*\n*)', table)
if cel_table:
cel_table = cel_table.groups()
return_table = table_parser(cel_table[1], re.sub('\n', ' ', cel_table[2]), cel_table[0], number)
table = re.sub(
'((?:\|\|)+)((?:<(?:(?:(?!>).)+)>)*)\n*',
' | ',
table,
1
)
else:
break
data = re.sub('\n((?:(?:(?:(?:\|\||\|[^|]+\|)+(?:(?:(?!\|\|).\n*)*))+)\|\|(?:\n)?)+)', table, data, 1)
else:
break
return data
def middle_parser(data, include_num):
global end_data
global plus_data
middle_stack = 0
middle_list = []
middle_num = 0
html_num = 0
syntax_num = 0
folding_num = 0
middle_re = re.compile('(?:{{{((?:(?:(?! |{{{|}}}|<).)*) ?)|(}}}))')
middle_all_data = middle_re.findall(data)
for middle_data in middle_all_data:
if not middle_data[1]:
if middle_stack > 0:
middle_stack += 1
data = re.sub('(?:{{{((?:(?! |{{{|}}}|<).)*)(?P ?)|(}}}))', '{{{' + middle_data[0] + '\g', data, 1)
else:
if re.search('^(#|@|\+|\-)', middle_data[0]) and not re.search('^(#|@|\+|\-){2}|(#|@|\+|\-)\\\\', middle_data[0]):
if re.search('^(#(?:[0-9a-f-A-F]{3}){1,2})', middle_data[0]):
middle_search = re.search('^(#(?:[0-9a-f-A-F]{3}){1,2})', middle_data[0])
middle_list += ['span']
data = middle_re.sub('', data, 1)
elif re.search('^(?:#(\w+))', middle_data[0]):
middle_search = re.search('^(?:#(\w+))', middle_data[0])
middle_list += ['span']
data = middle_re.sub('', data, 1)
elif re.search('^(?:@((?:[0-9a-f-A-F]{3}){1,2}))', middle_data[0]):
middle_search = re.search('^(?:@((?:[0-9a-f-A-F]{3}){1,2}))', middle_data[0])
middle_list += ['span']
data = middle_re.sub('', data, 1)
elif re.search('^(?:@(\w+))', middle_data[0]):
middle_search = re.search('^(?:@(\w+))', middle_data[0])
middle_list += ['span']
data = middle_re.sub('', data, 1)
elif re.search('^(\+|-)([1-5])', middle_data[0]):
middle_search = re.search('^(\+|-)([1-5])', middle_data[0])
middle_search = middle_search.groups()
if middle_search[0] == '+':
font_size = str(int(middle_search[1]) * 20 + 100)
else:
font_size = str(100 - int(middle_search[1]) * 10)
middle_list += ['span']
data = middle_re.sub('', data, 1)
elif re.search('^#!wiki', middle_data[0]):
middle_data_2 = re.search('{{{#!wiki(?: style=(?:"|')((?:(?!"|').)*)(?:"|'))?(?: *)\n?', data)
if middle_data_2:
middle_data_2 = middle_data_2.groups()
else:
middle_data_2 = ['']
middle_list += ['div_1']
data = re.sub(
'{{{#!wiki(?: style=(?:"|')((?:(?!"|').)*)(?:"|'))?(?: *)\n?',
'',
data,
1
)
elif re.search('^#!syntax', middle_data[0]):
middle_data_2 = re.search('{{{#!syntax ((?:(?!\n).)+)\n?', data)
if middle_data_2:
middle_data_2 = middle_data_2.groups()
else:
middle_data_2 = ['python']
if syntax_num == 0:
plus_data += 'hljs.initHighlightingOnLoad();\n'
syntax_num = 1
middle_list += ['pre']
data = re.sub(
'{{{#!syntax ?((?:(?!\n).)*)\n?',
' ',
data,
1
)
elif re.search('^#!folding', middle_data[0]):
middle_list += ['2div']
folding_data = re.search('{{{#!folding ?((?:(?!\n).)*)\n?', data)
if folding_data:
folding_data = folding_data.groups()
else:
folding_data = ['Test']
data = re.sub(
'{{{#!folding ?((?:(?!\n).)*)\n?', '' + \
'' + \
str(folding_data[0]) + ' ' + \
' ' + \
' ' + \
'[+]' + \
'' + \
'' + \
' ' + \
' ',
data,
1
)
folding_num += 1
elif re.search('^#!html', middle_data[0]):
middle_list += ['span']
html_num += 1
data = middle_re.sub(' ', data, 1)
else:
middle_list += ['span']
data = middle_re.sub('', data, 1)
else:
middle_list += ['code']
middle_stack += 1
data = middle_re.sub('' + middle_data[0].replace('\\', '\\\\'), data, 1)
middle_num += 1
else:
if middle_list == []:
data = middle_re.sub('}}}', data, 1)
else:
if middle_stack > 0:
middle_stack -= 1
if middle_stack > 0:
data = middle_re.sub('}}}', data, 1)
else:
if middle_num > 0:
middle_num -= 1
if middle_list[middle_num] == '2div':
data = middle_re.sub('', data, 1)
elif middle_list[middle_num] == 'pre':
data = middle_re.sub('', data, 1)
else:
data = middle_re.sub('' + middle_list[middle_num] + '>', data, 1)
del(middle_list[middle_num])
while 1:
if middle_stack == 0:
break
else:
if middle_list == []:
data += '}}}'
else:
if middle_stack > 0:
middle_stack -= 1
if middle_stack > 0:
data += '}}}'
else:
if middle_num > 0:
middle_num -= 1
if middle_list[middle_num] == '2div':
data += ''
elif middle_list[middle_num] == 'pre':
data += ''
else:
data += '' + middle_list[middle_num] + '>'
del(middle_list[middle_num])
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
num = 0
while 1:
syntax_data = re.search('|<).)+)">((?:\n*(?:(?:(?!<\/code>||<).)+)">((?:\n*(?:(?:(?!<\/code>|',
data,
1
)
else:
break
return data
def namumark(conn, data, title, main_num, include_num):
curs = conn.cursor()
global plus_data
global end_data
data = '\n' + data + '\n'
include_num = include_num + '_' if include_num else ''
plus_data = 'get_link_state("' + include_num + '");\nget_file_state("' + include_num + '");\n'
backlink = []
end_data = {}
data = re.sub('
| ', data)
data = re.sub('<\/ul>\n?', '', data)
data = re.sub('<\/pre>\n?', '', data)
data = re.sub('(?P)(\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)+