from bottle import request, app from bottle.ext import beaker from urllib import parse import json import sqlite3 import time import re import hashlib import html import datetime import time from multiprocessing import Process json_data = open('set.json').read() set_data = json.loads(json_data) conn = sqlite3.connect(set_data['db'] + '.db') curs = conn.cursor() session_opts = { 'session.type': 'dbm', 'session.data_dir': './app_session/', 'session.auto': 1 } app = beaker.middleware.SessionMiddleware(app(), session_opts) def get_time(): now = time.localtime() date = "%04d-%02d-%02d %02d:%02d:%02d" % (now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec) return(date) def ip_check(): session = request.environ.get('beaker.session') try: if(session.get('Now') == 1): ip = format(session['DREAMER']) else: if(request.environ.get('HTTP_X_FORWARDED_FOR')): ip = request.environ.get('HTTP_X_FORWARDED_FOR') else: ip = request.environ.get('REMOTE_ADDR') except: ip = 'None' return(ip) def url_pas(data): return(parse.quote(data).replace('/','%2F')) def sha224(data): return(hashlib.sha224(bytes(data, 'utf-8')).hexdigest()) def savemark(data): data = re.sub("\[date\(now\)\]", get_time(), data) if(not re.search("\.", ip_check())): name = '[[사용자:' + ip_check() + '|' + ip_check() + ']]' else: name = ip_check() data = re.sub("\[name\]", name, data) return(data) def send_p(d): d = html.escape(d) js_p = re.compile('javascript:', re.I) d = js_p.sub('', d) d = re.sub('<a href="(?:[^"]*)">(?P(?:(?!<).)*)<\/a>', '\g', d) return(d) def table_p(d, d2): table_class = 'class="' alltable = 'style="' celstyle = 'style="' rowstyle = 'style="' row = '' cel = '' table_w = re.search("<table\s?width=((?:(?!>).)*)>", d) table_h = re.search("<table\s?height=((?:(?!>).)*)>", d) table_a = re.search("<table\s?align=((?:(?!>).)*)>", d) if(table_w): alltable += 'width: ' + table_w.groups()[0] + ';' if(table_h): alltable += 'height: ' + table_h.groups()[0] + ';' if(table_a): if(table_a.groups()[0] == 'right'): alltable += 'float: right;' elif(table_a.groups()[0] == 'center'): alltable += 'margin: auto;' table_t_a = re.search("<table\s?textalign=((?:(?!>).)*)>", d) if(table_t_a): if(table_t_a.groups()[0] == 'right'): alltable += 'text-align: right;' elif(table_t_a.groups()[0] == 'center'): alltable += 'text-align: center;' row_t_a = re.search("<row\s?textalign=((?:(?!>).)*)>", d) if(row_t_a): if(row_t_a.groups()[0] == 'right'): rowstyle += 'text-align: right;' elif(row_t_a.groups()[0] == 'center'): rowstyle += 'text-align: center;' else: rowstyle += 'text-align: left;' table_cel = re.search("<-((?:(?!>).)*)>", d) if(table_cel): cel = 'colspan="' + table_cel.groups()[0] + '"' else: cel = 'colspan="' + str(round(len(d2) / 2)) + '"' table_row = re.search("<\|((?:(?!>).)*)>", d) if(table_row): row = 'rowspan="' + table_row.groups()[0] + '"' row_bgcolor_2 = re.search("<rowbgcolor=(#(?:[0-9a-f-A-F]{3}){1,2})>", d) row_bgcolor_3 = re.search("<rowbgcolor=(\w+)>", d) if(row_bgcolor_2): rowstyle += 'background: ' + row_bgcolor_2.groups()[0] + ';' elif(row_bgcolor_3): rowstyle += 'background: ' + row_bgcolor_3.groups()[0] + ';' table_border_2 = re.search("<table\s?bordercolor=(#(?:[0-9a-f-A-F]{3}){1,2})>", d) table_border_3 = re.search("<table\s?bordercolor=(\w+)>", d) if(table_border_2): alltable += 'border: ' + table_border_2.groups()[0] + ' 2px solid;' elif(table_border_3): alltable += 'border: ' + table_border_3.groups()[0] + ' 2px solid;' table_bgcolor_2 = re.search("<table\s?bgcolor=(#(?:[0-9a-f-A-F]{3}){1,2})>", d) table_bgcolor_3 = re.search("<table\s?bgcolor=(\w+)>", d) if(table_bgcolor_2): alltable += 'background: ' + table_bgcolor_2.groups()[0] + ';' elif(table_bgcolor_3): alltable += 'background: ' + table_bgcolor_3.groups()[0] + ';' bgcolor_2 = re.search("<(?:bgcolor=)?(#(?:[0-9a-f-A-F]{3}){1,2})>", d) bgcolor_3 = re.search("<(?:bgcolor=)?(\w+)>", d) if(bgcolor_2): celstyle += 'background: ' + bgcolor_2.groups()[0] + ';' elif(bgcolor_3): celstyle += 'background: ' + bgcolor_3.groups()[0] + ';' n_width = re.search("<width=((?:(?!>).)*)>", d) n_height = re.search("<height=((?:(?!>).)*)>", d) if(n_width): celstyle += 'width: ' + n_width.groups()[0] + ';' if(n_height): celstyle += 'height: ' + n_height.groups()[0] + ';' text_right = re.search("<\)>", d) text_center = re.search("<:>", d) text_left = re.search("<\(>", d) if(text_right): celstyle += 'text-align: right;' elif(text_center): celstyle += 'text-align: center;' elif(text_left): celstyle += 'text-align: left;' text_class = re.search("<table\s?class=((?:(?!>).)+)>", d) if(text_class): d = text_class.groups() table_class += d[0] alltable += '"' celstyle += '"' rowstyle += '"' table_class += '"' return([alltable, rowstyle, celstyle, row, cel, table_class]) def html_pas(data): data = re.sub('%H%', '<', data) data = re.sub('%\/H%', '>', data) d_list = re.findall('<(\/)?([^> ]+)( (?:[^>]+)?)?>', data) for i_list in d_list: if(i_list[0] == ''): if(i_list[1] in ['div', 'span', 'embed', 'iframe']): if(re.search('<\/' + i_list[1] + '>', data)): src = re.search('src=([^ ]*)', i_list[2]) if(src): v_src = re.search('http(?:s)?:\/\/([^/\'" ]*)', src.groups()[0]) if(v_src): if(not v_src.groups()[0] in ["www.youtube.com", "serviceapi.nmv.naver.com", "tv.kakao.com", "www.google.com", "serviceapi.rmcnmv.naver.com"]): ot = re.sub('src=([^ ]*)', '', i_list[2]) else: ot = i_list[2] else: ot = re.sub('src=([^ ]*)', '', i_list[2]) else: ot = i_list[2] po = re.compile('position', re.I) data = data.replace('<' + i_list[1] + i_list[2] + '>', '%H%' + i_list[1] + po.sub('', ot) + '%/H%', 1) data = re.sub('<\/' + i_list[1] + '>', '%H%/' + i_list[1] + '%/H%', data, 1) data = html.escape(data) end = re.findall('%H%((?:(?!%/H%).)*)%/H%', data) for d_end in end: data = re.sub('%H%((?:(?!%/H%).)*)%/H%', '<' + re.sub('"', '"', re.sub(''', "'", d_end)) + '>', data, 1) return(data) def mid_pas(data, fol_num, include, in_c): p = re.compile('{{{((?:(?:(?:\+|-)[0-5])|(?:#|@)(?:(?:[0-9a-f-A-F]{3}){1,2}|(?:\w+))|(?:#!(?:html|wiki|noin|folding|syntax)))(?:(?!{{{|}}}).)+)}}}', re.DOTALL) while(1): m = p.search(data) if(m): d = m.groups() data = p.sub('###' + d[0] + '/###', data, 1) else: break com = re.compile("{{{((?:(?!{{{|}}}).)*)}}}", re.DOTALL) while(1): m = com.search(data) if(m): d = m.groups() data = com.sub('' + d[0] + '', data, 1) else: break com3 = re.compile('###((?:(?!\/###).)+)\/###', re.DOTALL) m = com3.search(data) while(1): m = com3.search(data) if(m): d = m.groups() data = com3.sub('{{{' + d[0] + '}}}', data, 1) else: break com2 = re.compile("((?:(?!(?:|<\/code>)).)*)<\/code>", re.DOTALL) da_com = com2.findall(data) for com_da in da_com: mid_data = com_da.replace('<', '<').replace('>', '>') mid_data = re.sub("(?P.)", "#no#\g#/no#", mid_data) data = com2.sub(mid_data, data, 1) while(1): is_it = com.search(data) if(is_it): it_d = is_it.groups()[0] big_a = re.compile("^\+([1-5])\s(.*)$", re.DOTALL) big = big_a.search(it_d) small_a = re.compile("^\-([1-5])\s(.*)$", re.DOTALL) small = small_a.search(it_d) color_b = re.compile("^(#(?:[0-9a-f-A-F]{3}){1,2})\s(.*)$", re.DOTALL) color_2 = color_b.search(it_d) color_c = re.compile("^#(\w+)\s(.*)$", re.DOTALL) color_3 = color_c.search(it_d) back_a = re.compile("^@((?:[0-9a-f-A-F]{3}){1,2})\s(.*)$", re.DOTALL) back = back_a.search(it_d) back_c = re.compile("^@(\w+)\s(.*)$", re.DOTALL) back_3 = back_c.search(it_d) include_out_a = re.compile("^#!noin\s(.*)$", re.DOTALL) include_out = include_out_a.search(it_d) div_a = re.compile("^#!wiki\sstyle=(?:"|')((?:(?!"|').)*)(?:"|')\r\n(.*)$", re.DOTALL) div = div_a.search(it_d) html_a = re.compile("^#!html\s(.*)$", re.DOTALL) html = html_a.search(it_d) fol_a = re.compile("^#!folding\s((?:(?!\n).)*)\n?\s\n(.*)$", re.DOTALL) fol = fol_a.search(it_d) syn_a = re.compile("^#!syntax\s([^\n]*)\r\n(.*)$", re.DOTALL) syn = syn_a.search(it_d) if(big): big_d = big.groups() data = com.sub('' + big_d[1] + '', data, 1) elif(small): sm_d = small.groups() data = com.sub('' + sm_d[1] + '', data, 1) elif(color_2): c_d_2 = color_2.groups() data = com.sub('' + c_d_2[1] + '', data, 1) elif(color_3): c_d_3 = color_3.groups() data = com.sub('' + c_d_3[1] + '', data, 1) elif(back): back_d_1 = back.groups() data = com.sub('' + back_d_1[1] + '', data, 1) elif(back_3): back_d_3 = back_3.groups() data = com.sub('' + back_d_3[1] + '', data, 1) elif(div): div_d = div.groups() data = com.sub('
' + div_d[1] + '
', data, 1) elif(html): data = com.sub(html.groups()[0], data, 1) elif(fol): fol_d = fol.groups() data = com.sub( "
\ " + fol_d[0] + " \
\ [펼치기] \
\ \ \
", data, 1) fol_num += 3 elif(syn): syn_d = syn.groups() data = com.sub('
' + re.sub('\r\n', '', re.sub(' ', '', syn_d[1])) + '
', data, 1) elif(include_out): if((include or in_c) == 1): data = com.sub("", data, 1) else: data = com.sub(include_out.groups()[0], data, 1) else: data = com.sub(it_d, data, 1) else: break com2 = re.compile("((?:(?!(?:|<\/code>)).)*)<\/code>", re.DOTALL) da_com = com2.findall(data) for com_da in da_com: mid_data = com_da.replace('<', '<').replace('>', '>') mid_data = re.sub("(?P.)", "#no#\g#/no#", mid_data) data = com2.sub(mid_data, data, 1) return([data, fol_num]) def toc_pas(data, title, num, toc_y): i = [0, 0, 0, 0, 0, 0, 0] last = 0 toc_c = -1 toc_d = -1 span = '' rtoc = '
목차

' while(1): i[0] += 1 m = re.search('(={1,6})\s?([^=]*)\s?(?:={1,6})(?:\s+)?\r\n', data) if(m): result = m.groups() wiki = len(result[0]) if(last < wiki): last = wiki else: last = wiki for a in range(wiki + 1, 7): i[a] = 0 i[wiki] += 1 toc = str(i[1]) + '.' + str(i[2]) + '.' + str(i[3]) + '.' + str(i[4]) + '.' + str(i[5]) + '.' + str(i[6]) + '.' toc = re.sub("(?P[0-9]0(?:[0]*)?)\.", '\g#.', toc) toc = re.sub("0\.", '', toc) toc = re.sub("#\.", '.', toc) toc = re.sub("\.$", '', toc) if(toc_c == -1): margin = 'style="margin-top: 30px;"' toc_c = toc.count('.') else: toc_d = toc.count('.') if(toc_c == toc_d): margin = 'style="margin-top: 30px;"' else: if(toc_d < toc_c): margin = 'style="margin-top: 30px;"' else: margin = '' toc_c = toc_d t = toc.count('.') span = '' * t rtoc += span + '' + toc + '. ' + result[1] + '
' c = re.sub(" $", "", result[1]) d = c c = re.sub("\[\[(([^|]*)\|)?(?P[^\]]*)\]\]", "\g", c) edit_d = '' if(toc_y == 1): edit_d = ' [편집]' data = re.sub('(={1,6})\s?([^=]*)\s?(?:={1,6})(?:\s+)?\n', '' + toc + '. ' + d + edit_d + '
\n', data, 1) else: rtoc += '
' break data = re.sub("\[목차\]", rtoc, data) return(data) def link(title, data, num, category): m = re.findall("\[\[(분류:(?:(?:(?!\]\]).)*))\]\]", data) for g in m: if(title != g): backlink_plus(title, g, 'cat', num) if(category == ''): curs.execute("select title from data where title = ?", [g]) exists = curs.fetchall() if(exists): red = "" else: red = 'class="not_thing"' category += '' + re.sub("분류:", "", g) + '' else: curs.execute("select title from data where title = ?", [g]) exists = curs.fetchall() if(exists): red = "" else: red = 'class="not_thing"' category += ' / ' + '' + re.sub("분류:", "", g) + '' data = re.sub("\[\[(분류:(?:(?:(?!\]\]).)*))\]\]", '', data, 1) test = re.findall('\[\[wiki:([^|\]]+)(?:\|([^\]]+))?\]\]', data) if(test): for wiki in test: if(wiki[1]): data = re.sub('\[\[wiki:([^|\]]+)(?:\|([^\]]+))?\]\]', '' + wiki[1] + '', data, 1) else: data = re.sub('\[\[wiki:([^|\]]+)(?:\|([^\]]+))?\]\]', '' + wiki[0] + '', data, 1) data = re.sub("\[\[(?::(?P(?:분류|파일):(?:(?:(?!\]\]).)*)))\]\]", "[[\g]]", data) a = re.findall('\[\[\.\.\/(\|(?:(?!]]).)+)?]]', data) for i in a: b = re.search('(.*)\/', title) if(b): m = b.groups() if(i): data = re.sub('\[\[\.\.\/(\|((?!]]).)+)?]]', '[[' + m[0] + i + ']]', data, 1) else: data = re.sub('\[\[\.\.\/(\|((?!]]).)+)?]]', '[[' + m[0] + ']]', data, 1) else: if(i): data = re.sub('\[\[\.\.\/(\|((?!]]).)+)?]]', '[[' + title + i + ']]', data, 1) else: data = re.sub('\[\[\.\.\/(\|((?!]]).)+)?]]', '[[' + title + ']]', data, 1) data = re.sub('\[\[(?P\/(?:(?!]]|\|).)+)(?P\|(?:(?:(?!]]).)+))?]]', '[[' + title + '\g\g]]', data) link = re.compile('\[\[((?:(?!\[\[|\]\]|\|).)*)(?:\|((?:(?!\[\[|\]\]).)*))?\]\]') while(1): l_d = link.search(data) if(l_d): d = l_d.groups() if(re.search('^(?:파일|외부):', d[0])): width = '' height = '' align = '' span = ['', ''] try: w_d = re.search('width=([0-9]+(?:[a-z%]+)?)', d[1]) if(w_d): width = 'width="' + w_d.groups()[0] + '" ' h_d = re.search('height=([0-9]+(?:[a-z%]+)?)', d[1]) if(h_d): height = 'height="' + h_d.groups()[0] + '" ' a_d = re.search('align=(center|right)', d[1]) if(a_d): span[0] = '' span[1] = '' except: pass f_d = re.search('^파일:([^.]+)\.(.+)$', d[0]) if(f_d): if(not re.search("^파일:([^\n]*)", title)): backlink_plus(title, d[0], 'file', num) img = span[0] + '' + span[1] data = link.sub(img, data, 1) else: img = span[0] + '' + span[1] data = link.sub(img, data, 1) elif(re.search('^https?:\/\/', d[0])): view = d[0] try: if(re.search('(.+)', d[1])): view = d[1] except: pass data = link.sub('' + view + '', data, 1) else: view = d[0].replace('\\\\', '').replace('\\', '').replace('', '\\') try: if(re.search('(.+)', d[1])): view = d[1].replace('\\\\', '').replace('\\', '').replace('', '\\') except: pass sh = '' s_d = re.search('#((?:(?!x27;|#).)+)$', d[0]) if(s_d): href = re.sub('#((?:(?!x27;|#).)+)$', '', d[0]) sh = '#' + s_d.groups()[0] else: href = d[0] if(d[0] == title): data = link.sub('' + view + '', data, 1) elif(re.search('^#', d[0])): data = link.sub('' + view + '', data, 1) else: a = href.replace(''', "'").replace('"', '"').replace('\\\\', '').replace('\\', '').replace('', '\\') backlink_plus(title, a, '', num) curs.execute("select title from data where title = ?", [a]) if(not curs.fetchall()): no = 'class="not_thing"' backlink_plus(title, a, 'no', num) else: no = '' data = link.sub('' + view.replace('\\', '\\\\') + '', data, 1) else: break return([data, category]) def backlink_plus(name, link, backtype, num): if(num == 1): curs.execute("select title from back where title = ? and link = ? and type = ?", [link, name, backtype]) d = curs.fetchall() if(not d): try: curs.execute("insert into back (title, link, type) values (?, ?, ?)", [link, name, backtype]) except: while(1): try: curs.execute("insert into back (title, link, type) values (?, ?, ?)", [link, name, backtype]) break except: time.sleep(1) def namumark(title, data, num, in_c, toc_y): data = re.sub("\n", "\r\n", re.sub("\r\n", "\n", data)) data = html_pas(data) data = '\r\n' + data + '\r\n' fol_num = 0 var_d = mid_pas(data, fol_num, 0, in_c) data = var_d[0] fol_num = var_d[1] category = '' include = re.compile("\[include\(((?:(?!\)\]|,).)*)((?:(?:,\s?(?:(?!\)\]).)*))+)?\)\]") m = include.findall(data) for results in m: if(results[0] == title): data = include.sub("" + results[0] + "", data, 1) else: curs.execute("select data from data where title = ?", [results[0]]) in_con = curs.fetchall() backlink_plus(title, results[0], 'include', num) if(in_con): in_data = in_con[0][0] in_data = include.sub("", in_data) in_data = re.sub("\n", "\r\n", re.sub("\r\n", "\n", in_data)) in_data = html_pas(in_data) var_d = mid_pas(in_data, fol_num, 1, in_c) var_d2 = link(title, var_d[0], 0, category) in_data = var_d2[0] category = var_d2[1] fol_num = var_d[1] if(results[1]): a = results[1] while(1): g = re.search("([^= ,]*)\=([^,]*)", a) if(g): result = g.groups() in_data = re.sub("@" + result[0] + "@", result[1], in_data) a = re.sub("([^= ,]*)\=([^,]*)", "", a, 1) else: break in_data = toc_pas(in_data, results[0], num, toc_y) data = include.sub('\n[' + results[0] + ' 이동]
' + in_data + '
\n', data, 1) else: data = include.sub("" + results[0] + "", data, 1) data = re.sub("\r\n##\s?([^\n]*)\r\n", "\r\n", data) data = re.sub("\[anchor\((?P[^\[\]]*)\)\]", '', data) data = savemark(data) d_re = re.findall('\r\n#(?:redirect|넘겨주기) ((?:(?!\r|\n|%0D).)+)', data) for d in d_re: view = d.replace('\\', '') sh = '' s_d = re.search('#((?:(?!x27;|#).)+)$', d) if(s_d): href = re.sub('#((?:(?!x27;|#).)+)$', '', d) sh = '#' + s_d.groups()[0] else: href = d a = href.replace(''', "'").replace('"', '"').replace('\\\\', '').replace('\\', '').replace('', '\\') backlink_plus(title, a, 'redirect', num) data = re.sub('\r\n#(?:redirect|넘겨주기) ((?:(?!\r|\n|%0D).)+)', '', data, 1) data = re.sub("\[nicovideo\((?P[^,)]*)(?:(?:,(?:[^,)]*))+)?\)\]", "[[http://embed.nicovideo.jp/watch/\g]]", data) while(1): m = re.search("\n>\s?((?:[^\n]*)(?:(?:(?:(?:\n>\s?)(?:[^\n]*))+)?))", data) if(m): result = m.groups() blockquote = result[0] blockquote = re.sub("\n>\s?", "\n", blockquote) data = re.sub("\n>\s?((?:[^\n]*)(?:(?:(?:(?:\n>\s?)(?:[^\n]*))+)?))", "\n
" + blockquote + "
", data, 1) else: break if(not re.search('\[목차\]', data)): if(not re.search('\[목차\(없음\)\]', data)): data = re.sub("(?P(={1,6})\s?([^=]*)\s?(?:={1,6})(?:\s+)?\n)", "[목차]\n\g", data, 1) else: data = re.sub("\[목차\(없음\)\]", "", data) data = re.sub("(\n)(?P\r\n(={1,6})\s?([^=]*)\s?(?:={1,6})(?:\s+)?\n)", "\g", data) data = toc_pas(data, title, num, toc_y) 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('<math>(?P((?!<math>).)*)<\/math>', '[math]\g[/math]', data) data = re.sub('{{\|(?P(?:(?:(?:(?!\|}}).)*)(?:\n?))+)\|}}', '
\g
', data) data = re.sub('\[ruby\((?P[^\,]*)\,\s?(?P[^\)]*)\)\]', '\g(\g)', data) data = re.sub("\[br\]", '
', data) while(1): com = re.compile("\[youtube\(([^, )]*)(,[^)]*)?\)\]") m = com.search(data) if(m): src = '' width = '560' height = '315' time = '0' result = m.groups() if(result[0]): yudt = re.search('(?:\?v=(.*)|\/([^/?]*)|^([a-zA-Z0-9\-_]*))$', result[0]) if(yudt): if(yudt.groups()[0]): src = yudt.groups()[0] elif(yudt.groups()[1]): src = yudt.groups()[1] elif(yudt.groups()[2]): src = yudt.groups()[2] else: src = '' if(result[1]): mdata = re.search('width=([0-9%]*)', result[1]) if(mdata): width = mdata.groups()[0] mdata = re.search('height=([0-9%]*)', result[1]) if(mdata): height = mdata.groups()[0] mdata = re.search('time=([0-9]*)', result[1]) if(mdata): time = mdata.groups()[0] data = com.sub('
', data, 1) else: break var_d2 = link(title, data, num, category) data = var_d2[0] category = var_d2[1] while(1): m = re.search("(\n(?:(?:( +)\*\s(?:[^\n]*))\n?)+)", data) if(m): result = m.groups() end = str(result[0]) while(1): isspace = re.search("( +)\*\s([^\n]*)", end) if(isspace): spacebar = isspace.groups() up = len(spacebar[0]) * 20 end = re.sub("( +)\*\s([^\n]*)", "
  • " + spacebar[1] + "
  • ", end, 1) else: break end = re.sub("\n", '', end) data = re.sub("(\n(?:(?:( +)\*\s(?:[^\n]*))\n?)+)", '
      ' + end + '
    ', data, 1) else: break now_time = get_time() data = re.sub('\[date\]', now_time, data) time_data = re.search('^([0-9]{4}-[0-9]{2}-[0-9]{2})', now_time) time = time_data.groups() age_data = re.findall('\[age\(([0-9]{4}-[0-9]{2}-[0-9]{2})\)\]', data) for age in age_data: old = datetime.datetime.strptime(time[0], '%Y-%m-%d') will = datetime.datetime.strptime(age, '%Y-%m-%d') e_data = old - will data = re.sub('\[age\(([0-9]{4})-([0-9]{2})-([0-9]{2})\)\]', str(int(int(e_data.days) / 365)), data, 1) dday_data = re.findall('\[dday\(([0-9]{4}-[0-9]{2}-[0-9]{2})\)\]', data) for dday in dday_data: 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 = re.sub('\[dday\(([0-9]{4}-[0-9]{2}-[0-9]{2})\)\]', e_day, data, 1) data = re.sub("-{4,11}", "
    ", data) while(1): b = re.search("(<\/h[0-9]>|\n)( +)", data) if(b): result = b.groups() up = re.sub(' ', '', result[1]) if(re.search('<\/h[0-9]>', result[0])): data = re.sub("(?P\/h[0-9]>)( +)", '\g' + up, data, 1) else: data = re.sub("(?:\n)( +)", '
    ' + up, data, 1) else: break a = 1 tou = "

    " namu = [] pop_re = re.compile('(?:\[\*([^\s]*)(?:\s((?:(?!\[|\]).)*))?\]|(\[각주\]))') while(1): b = pop_re.search(data) if(b): results = b.groups() try: if(not results[1] and results[0]): i = 0 while(1): try: if(namu[i] == results[0]): none_this = 0 break else: i += 2 except: none_this = 1 break if(none_this == 0): data = pop_re.sub(" \ [" + results[0] + "] \ \ ", data, 1) else: data = pop_re.sub(" \ #d#" + results[0] + "#/d# \ ", data, 1) else: if(results[0]): namu += [results[0]] namu += [results[1]] tou += "[" + results[0] + "] " + results[1] + "
    " data = pop_re.sub(" \ #d#" + results[0] + "#/d# \ \ ", data, 1) else: tou += "[" + str(a) + "] " + results[1] + "
    " data = pop_re.sub(' \ #d#' + str(a) + '#/d# \ \ ', data, 1) a += 1 fol_num += 2 except: tou += '
    ' if(tou == "

    "): tou = "" else: tou = re.sub('#d#(?P(?:(?!#\/d#).)*)#\/d#', '[\g]', tou) data = pop_re.sub("
    " + tou, data, 1) tou = "

    " else: tou += '
    ' if(tou == "

    "): tou = "" else: tou = re.sub('#d#(?P(?:(?!#\/d#).)*)#\/d#', '[\g]', tou) break data = re.sub('#d#(?P(?:(?!#\/d#).)*)#\/d#', '[\g]', data) data = re.sub("\[각주\](?:(?:
    | |\r|\n)+)?$", "", data) data = re.sub("(?:(?:
    | |\r|\n)+)$", "", data) data += tou if(category): data += '
    분류: ' + category + '
    ' data = re.sub("(?:\|\|\r\n)", "#table#", data) while(1): y = re.search("(\|\|(?:(?:(?:(?:(?!\|\|).)*)(?:\n?))+))", data) if(y): a = y.groups() mid_data = re.sub("\|\|", "#table#", a[0]) mid_data = re.sub("\r\n", "
    ", mid_data) data = re.sub("(\|\|((?:(?:(?:(?!\|\|).)*)(?:\n?))+))", mid_data, data, 1) else: break data = re.sub("#table#", "||", data) data = re.sub("", "\r\n", data) while(1): m = re.search("(\|\|(?:(?:(?:.*)\n?)\|\|)+)", data) if(m): results = m.groups() table = results[0] while(1): a = re.search("^(\|\|(?:(?:\|\|)+)?)((?:<(?:(?:(?!>).)*)>)+)?", table) if(a): row = '' cel = '' celstyle = '' rowstyle = '' alltable = '' table_d = '' result = a.groups() if(result[1]): table_d = table_p(result[1], result[0]) alltable = table_d[0] rowstyle = table_d[1] celstyle = table_d[2] row = table_d[3] cel = table_d[4] table_class = table_d[5] table = re.sub("^(\|\|(?:(?:\|\|)+)?)((?:<(?:(?:(?!>).)*)>)+)?", " \ \ \ \ \ \ \ \ \ \ \
    ", table, 1) else: cel = 'colspan="' + str(round(len(result[0]) / 2)) + '"' table = re.sub("^(\|\|(?:(?:\|\|)+)?)((?:<(?:(?:(?!>).)*)>)+)?", " \ \ \ \ \ \
    ", table, 1) else: break table = re.sub("\|\|$", "
    ", table) while(1): b = re.search("\|\|\r\n(\|\|(?:(?:\|\|)+)?)((?:<(?:(?:(?!>).)*)>)+)?", table) if(b): row = '' cel = '' celstyle = '' rowstyle = '' table_d = '' result = b.groups() if(result[1]): table_d = table_p(result[1], result[0]) rowstyle = table_d[1] celstyle = table_d[2] row = table_d[3] cel = table_d[4] table = re.sub("\|\|\r\n(\|\|(?:(?:\|\|)+)?)((?:<(?:(?:(?!>).)*)>)+)?", "
    ", table, 1) else: cel = 'colspan="' + str(round(len(result[0]) / 2)) + '"' table = re.sub("\|\|\r\n(\|\|(?:(?:\|\|)+)?)((?:<(?:(?:(?!>).)*)>)+)?", "
    ", table, 1) else: break while(1): c = re.search("(\|\|(?:(?:\|\|)+)?)((?:<(?:(?:(?!>).)*)>)+)?", table) if(c): row = '' cel = '' celstyle = '' table_d = '' result = c.groups() if(result[1]): table_d = table_p(result[1], result[0]) celstyle = table_d[2] row = table_d[3] cel = table_d[4] table = re.sub("(\|\|(?:(?:\|\|)+)?)((?:<(?:(?:(?!>).)*)>)+)?", "", table, 1) else: cel = 'colspan="' + str(round(len(result[0]) / 2)) + '"' table = re.sub("(\|\|(?:(?:\|\|)+)?)((?:<(?:(?:(?!>).)*)>)+)?", "", table, 1) else: break data = re.sub("(\|\|(?:(?:(?:.*)\n?)\|\|)+)", table, data, 1) else: break data = re.sub("\r\n(?P", data) data = re.sub("(\n|\n|)", "", data) data = re.sub("#no#(?P.)#\/no#", "\g", data) data = re.sub("<space>", " ", data) data = re.sub('<\/blockquote>(?:(?:\r)?\n){2}
    ', '
    ', data) data = re.sub('<\/blockquote>(?:(?:\r)?\n)
    ', '
    ', data) data = re.sub('\n', '
    ', data) data = re.sub('

    ', '
    ', data) data = re.sub('<isbr>', '\r\n', data) data = re.sub('^(?:
    |\r|\n| )+', '', data) data = re.sub('^
    ', '
    ', data) if(num == 1): conn.commit() return(data)