app.py 180 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531
  1. from flask import Flask, request, session, render_template, send_file
  2. app = Flask(__name__)
  3. from urllib import parse
  4. import json
  5. import pymysql
  6. import time
  7. import re
  8. import bcrypt
  9. import os
  10. import difflib
  11. import hashlib
  12. json_data = open('set.json').read()
  13. data = json.loads(json_data)
  14. print('오픈나무 시작 포트 : ' + data['port'])
  15. import logging
  16. log = logging.getLogger('werkzeug')
  17. log.setLevel(logging.ERROR)
  18. def 시작():
  19. try:
  20. DB_실행("select * from data limit 1")
  21. except:
  22. DB_실행("create table data(title text, data longtext, acl text)")
  23. try:
  24. DB_실행("select * from history limit 1")
  25. except:
  26. DB_실행("create table 역사_추가(id text, title text, data longtext, date text, ip text, send text, leng text)")
  27. try:
  28. DB_실행("select * from rd limit 1")
  29. except:
  30. DB_실행("create table rd(title text, sub text, date text)")
  31. try:
  32. DB_실행("select * from user limit 1")
  33. except:
  34. DB_실행("create table user(id text, pw text, acl text)")
  35. try:
  36. DB_실행("select * from ban limit 1")
  37. except:
  38. DB_실행("create table ban(block text, end text, why text, band text)")
  39. try:
  40. DB_실행("select * from topic limit 1")
  41. except:
  42. DB_실행("create table topic(id text, title text, sub text, data longtext, date text, ip text, block text)")
  43. try:
  44. DB_실행("select * from stop limit 1")
  45. except:
  46. DB_실행("create table stop(title text, sub text, close text)")
  47. try:
  48. DB_실행("select * from rb limit 1")
  49. except:
  50. DB_실행("create table rb(block text, end text, today text, blocker text, why text)")
  51. try:
  52. DB_실행("select * from login limit 1")
  53. except:
  54. DB_실행("create table login(user text, ip text, today text)")
  55. try:
  56. DB_실행("select * from back limit 1")
  57. except:
  58. DB_실행("create table back(title text, link text, type text)")
  59. try:
  60. DB_실행("select * from cat limit 1")
  61. except:
  62. DB_실행("create table cat(title text, cat text)")
  63. try:
  64. DB_실행("select * from hidhi limit 1")
  65. except:
  66. DB_실행("create table hidhi(title text, re text)")
  67. try:
  68. DB_실행("select * from distop limit 1")
  69. except:
  70. DB_실행("create table distop(id text, title text, sub text)")
  71. try:
  72. DB_실행("select * from agreedis limit 1")
  73. except:
  74. DB_실행("create table agreedis(title text, sub text)")
  75. conn = pymysql.connect(host = data['host'], user = data['user'], password = data['pw'], charset = 'utf8mb4')
  76. curs = conn.cursor(pymysql.cursors.DictCursor)
  77. def DB_실행(데이터):
  78. curs.execute(데이터)
  79. def DB_갱신():
  80. conn.commit()
  81. def URL_인코딩(데이터):
  82. return parse.quote(데이터).replace('/','%2F')
  83. def DB_인코딩(데이터):
  84. return pymysql.escape_string(데이터)
  85. def DB_가져오기():
  86. return curs.fetchall()
  87. try:
  88. DB_실행("use " + data['db'])
  89. except:
  90. DB_실행("create database " + data['db'])
  91. DB_실행("use " + data['db'])
  92. DB_실행("alter database " + data['db'] + " character set = utf8mb4 collate = utf8mb4_unicode_ci")
  93. 시작()
  94. app.secret_key = hashlib.sha512(bytes(data['key'], 'ascii')).hexdigest()
  95. def 비교(seqm):
  96. output= []
  97. for opcode, a0, a1, b0, b1 in seqm.get_opcodes():
  98. if(opcode == 'equal'):
  99. output.append(seqm.a[a0:a1])
  100. elif(opcode == 'insert'):
  101. output.append("<span style='background:#CFC;'>" + seqm.b[b0:b1] + "</span>")
  102. elif(opcode == 'delete'):
  103. output.append("<span style='background:#FDD;'>" + seqm.a[a0:a1] + "</span>")
  104. elif(opcode == 'replace'):
  105. output.append("<span style='background:#CFC;'>" + seqm.b[b0:b1] + "</span><span style='background:#FDD;'>" + seqm.a[a0:a1] + "</span>")
  106. else:
  107. output.append(seqm.a[a0:a1])
  108. return ''.join(output)
  109. def 관리자_확인():
  110. if(session.get('Now') == True):
  111. ip = 아이피_확인(request)
  112. DB_실행("select * from user where id = '" + DB_인코딩(ip) + "'")
  113. rows = DB_가져오기()
  114. if(rows):
  115. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  116. return 1
  117. def 소유자_확인():
  118. if(session.get('Now') == True):
  119. ip = 아이피_확인(request)
  120. DB_실행("select * from user where id = '" + DB_인코딩(ip) + "'")
  121. rows = DB_가져오기()
  122. if(rows):
  123. if(rows[0]['acl'] == 'owner'):
  124. return 1
  125. def 틀_확인(이름, 데이터):
  126. if(re.search('^틀:', 이름)):
  127. DB_실행("select * from back where title = '" + DB_인코딩(이름) + "' and type = 'include'")
  128. 틀_역링크 = DB_가져오기()
  129. if(틀_역링크):
  130. 숫자 = 0
  131. while(True):
  132. try:
  133. 나무마크(틀_역링크[i]['link'], 데이터)
  134. except:
  135. break
  136. 숫자 += 1
  137. def 세이브마크(데이터):
  138. 데이터 = re.sub("\[date\(now\)\]", 시간(), 데이터)
  139. if(not re.search("\.", 아이피_확인(request))):
  140. 이름 = '[[사용자:' + 아이피_확인(request) + '|' + 아이피_확인(request) + ']]'
  141. else:
  142. 이름 = 아이피_확인(request)
  143. 데이터 = re.sub("\[name\]", 이름, 데이터)
  144. return 데이터
  145. def 로그인_확인():
  146. if(session.get('Now') == True):
  147. return 1
  148. else:
  149. return 0
  150. def 아이디_파싱(원래_아이디):
  151. 있나 = re.search("([^-]*)\s\-\s(Close|Reopen|Stop|Restart|Admin|Agreement|Settlement)$", 원래_아이디)
  152. if(있나):
  153. 분리 = 있나.groups()
  154. DB_실행("select * from data where title = '사용자:" + DB_인코딩(분리[0]) + "'")
  155. row = DB_가져오기()
  156. if(row):
  157. ip = '<a href="/w/' + URL_인코딩('사용자:' + 분리[0]) + '">' + 분리[0] + '</a> - ' + 분리[1] + ' <a href="/record/' + URL_인코딩(분리[0]) + '/n/1">(기록)</a>'
  158. else:
  159. ip = '<a class="not_thing" href="/w/' + URL_인코딩('사용자:' + 분리[0]) + '">' + 분리[0] + '</a> - ' + 분리[1] + ' <a href="/record/' + URL_인코딩(분리[0]) + '/n/1">(기록)</a>'
  160. elif(re.search("\.", 원래_아이디)):
  161. ip = 원래_아이디 + ' <a href="/record/' + URL_인코딩(원래_아이디) + '/n/1">(기록)</a>'
  162. else:
  163. DB_실행("select * from data where title = '사용자:" + DB_인코딩(원래_아이디) + "'")
  164. row = DB_가져오기()
  165. if(row):
  166. ip = '<a href="/w/' + URL_인코딩('사용자:' + 원래_아이디) + '">' + 원래_아이디 + '</a> <a href="/record/' + URL_인코딩(원래_아이디) + '/n/1">(기록)</a>'
  167. else:
  168. ip = '<a class="not_thing" href="/w/' + URL_인코딩('사용자:' + 원래_아이디) + '">' + 원래_아이디 + '</a> <a href="/record/' + URL_인코딩(원래_아이디) + '/n/1">(기록)</a>'
  169. return ip
  170. def HTML_파싱(데이터):
  171. while(True):
  172. 있나 = re.search("<((div|span|embed|iframe)(?:[^>]*))>", 데이터)
  173. if(있나):
  174. 분리 = 있나.groups()
  175. if(re.search("<(\/" + 분리[1] + ")>", 데이터) and not re.search("'", 분리[0])):
  176. XSS = re.search('src="http(?:s)?:\/\/([^\/]*)\/(?:[^"]*)"', 분리[0])
  177. if(XSS):
  178. 확인 = XSS.groups()
  179. if(확인[0] == "www.youtube.com" or 확인[0] == "serviceapi.nmv.naver.com" or 확인[0] == "tv.kakao.com" or 확인[0] == "tvple.com" or 확인[0] == "tvpot.daum.net"):
  180. 임시_저장 = 분리[0]
  181. else:
  182. 임시_저장 = re.sub('src="([^"]*)"', '', 분리[0])
  183. else:
  184. 임시_저장 = 분리[0]
  185. 임시_저장 = re.sub('"', '#.#', 임시_저장)
  186. 데이터 = re.sub("<((?:\/)?" + 분리[1] + "(?:[^>]*))>", "[" + 임시_저장 + "]", 데이터, 1)
  187. 데이터 = re.sub("<\/" + 분리[1] + ">", "[/" + 분리[1] + "]", 데이터, 1)
  188. else:
  189. 데이터 = re.sub("<((?:\/)?" + 분리[1] + "(?:[^>]*))>", '&lt;' + 분리[0] + '&gt;', 데이터, 1)
  190. break
  191. else:
  192. break
  193. 데이터 = re.sub('<', '&lt;', 데이터)
  194. 데이터 = re.sub('>', '&gt;', 데이터)
  195. 데이터 = re.sub('"', '&quot;', 데이터)
  196. 데이터 = re.sub("\[(?P<in>(?:\/)?(?:div|span|embed|iframe)(?:[^\]]*))\]", "<\g<in>>", 데이터)
  197. 데이터 = re.sub('#.#', '"', 데이터)
  198. return 데이터
  199. def 중괄호_문법(데이터, 접기_숫자):
  200. while(True):
  201. 문법_컴파일 = re.compile("{{{((?:(?!{{{)(?!}}}).)*)}}}", re.DOTALL)
  202. 있나 = 문법_컴파일.search(데이터)
  203. if(있나):
  204. 분리 = 있나.groups()
  205. 크게_문법 = re.compile("^\+([1-5])\s(.*)$", re.DOTALL)
  206. 크게 = 크게_문법.search(분리[0])
  207. 작게_문법 = re.compile("^\-([1-5])\s(.*)$", re.DOTALL)
  208. 작게 = 작게_문법.search(분리[0])
  209. 색깔_문법_1 = re.compile("^(#[0-9a-f-A-F]{6})\s(.*)$", re.DOTALL)
  210. 색깔_1 = 색깔_문법_1.search(분리[0])
  211. 색깔_문법_2 = re.compile("^(#[0-9a-f-A-F]{3})\s(.*)$", re.DOTALL)
  212. 색깔_2 = 색깔_문법_2.search(분리[0])
  213. 색깔_문법_3 = re.compile("^#(\w+)\s(.*)$", re.DOTALL)
  214. 색깔_3 = 색깔_문법_3.search(분리[0])
  215. 배경색_문법_1 = re.compile("^@([0-9a-f-A-F]{6})\s(.*)$", re.DOTALL)
  216. 배경색_1 = 배경색_문법_1.search(분리[0])
  217. 배경색_문법_2 = re.compile("^@([0-9a-f-A-F]{3})\s(.*)$", re.DOTALL)
  218. 배경색_2 = 배경색_문법_2.search(분리[0])
  219. 배경색_문법_3 = re.compile("^@(\w+)\s(.*)$", re.DOTALL)
  220. 배경색_3 = 배경색_문법_3.search(분리[0])
  221. 틀_제외_문법 = re.compile("^#!noin\s(.*)$", re.DOTALL)
  222. 틀_제외 = 틀_제외_문법.search(분리[0])
  223. DIV_문법 = re.compile("^#!wiki\sstyle=&quot;((?:(?!&quot;|\n).)*)&quot;\n?\s\n(.*)$", re.DOTALL)
  224. DIV = DIV_문법.search(분리[0])
  225. HTML_문법 = re.compile("^#!html\s(.*)$", re.DOTALL)
  226. HTML = HTML_문법.search(분리[0])
  227. 접기_문법 = re.compile("^#!folding\s((?:(?!\n).)*)\n?\s\n(.*)$", re.DOTALL)
  228. 접기 = 접기_문법.search(분리[0])
  229. if(크게):
  230. 결과 = 크게.groups()
  231. 데이터 = 문법_컴파일.sub('<span class="font-size-' + 결과[0] + '">' + 결과[1] + '</span>', 데이터, 1)
  232. elif(작게):
  233. 결과 = 작게.groups()
  234. 데이터 = 문법_컴파일.sub('<span class="font-size-small-' + 결과[0] + '">' + 결과[1] + '</span>', 데이터, 1)
  235. elif(색깔_1):
  236. 결과 = 색깔_1.groups()
  237. data = 문법_컴파일.sub('<span style="color:' + 결과[0] + '">' + 결과[1] + '</span>', 데이터, 1)
  238. elif(색깔_2):
  239. 결과 = 색깔_2.groups()
  240. 데이터 = 문법_컴파일.sub('<span style="color:' + 결과[0] + '">' + 결과[1] + '</span>', 데이터, 1)
  241. elif(색깔_3):
  242. 결과 = 색깔_3.groups()
  243. 데이터 = 문법_컴파일.sub('<span style="color:' + 결과[0] + '">' + 결과[1] + '</span>', 데이터, 1)
  244. elif(배경색_1):
  245. 결과 = 배경색_1.groups()
  246. 데이터 = 문법_컴파일.sub('<span style="background:#' + 결과[0] + '">' + 결과[1] + '</span>', 데이터, 1)
  247. elif(배경색_2):
  248. 결과 = 배경색_2.groups()
  249. 데이터 = 문법_컴파일.sub('<span style="background:#' + 결과[0] + '">' + 결과[1] + '</span>', 데이터, 1)
  250. elif(배경색_3):
  251. 결과 = 배경색_3.groups()
  252. 데이터 = 문법_컴파일.sub('<span style="background:' + 결과[0] + '">' + 결과[1] + '</span>', 데이터, 1)
  253. elif(DIV):
  254. 결과 = DIV.groups()
  255. 데이터 = 문법_컴파일.sub('<div style="' + 결과[0] + '">' + 결과[1] + '</div>', 데이터, 1)
  256. elif(HTML):
  257. 결과 = HTML.groups()
  258. 데이터 = 문법_컴파일.sub(결과[0], 데이터, 1)
  259. elif(접기):
  260. 결과 = 접기.groups()
  261. 데이터 = 문법_컴파일.sub("<div>" + 결과[0] + "<span style='float:right;'><div id='folding_" + str(접기_숫자 + 1) + "' style='display:block;'>[<a href='javascript:void(0);' onclick='var f=document.getElementById(\"folding_" + str(접기_숫자) + "\");var s=f.style.display==\"block\";f.style.display=s?\"none\":\"block\";this.className=s?\"\":\"opened\";var f=document.getElementById(\"folding_" + str(접기_숫자 + 1) + "\");var s=f.style.display==\"none\";f.style.display=s?\"block\":\"none\";var f=document.getElementById(\"folding_" + str(접기_숫자 + 2) + "\");var s=f.style.display==\"block\";f.style.display=s?\"none\":\"block\";'>펼치기</a>]</div><div id='folding_" + str(접기_숫자 + 2) + "' style='display:none;'>[<a href='javascript:void(0);' onclick='var f=document.getElementById(\"folding_" + str(접기_숫자) + "\");var s=f.style.display==\"block\";f.style.display=s?\"none\":\"block\";this.className=s?\"\":\"opened\";var f=document.getElementById(\"folding_" + str(접기_숫자 + 1) + "\");var s=f.style.display==\"none\";f.style.display=s?\"block\":\"none\";var f=document.getElementById(\"folding_" + str(접기_숫자 + 2) + "\");var s=f.style.display==\"block\";f.style.display=s?\"none\":\"block\";'>접기</a>]</div></a></span><div id='folding_" + str(접기_숫자) + "' style='display:none;'><br>" + 결과[1] + "</div></div>", 데이터, 1)
  262. 접기_숫자 += 3
  263. elif(HTML):
  264. 결과 = HTML.groups()
  265. 데이터 = 문법_컴파일.sub(결과[0], 데이터, 1)
  266. else:
  267. 데이터 = 문법_컴파일.sub('<code>' + 분리[0] + '</code>', 데이터, 1)
  268. else:
  269. break
  270. while(True):
  271. 문법_컴파일 = re.compile("<code>(((?!<\/code>).)*)<\/code>", re.DOTALL)
  272. 있나 = 문법_컴파일.search(데이터)
  273. if(있나):
  274. 결과 = 있나.groups()
  275. 중간_데이터 = re.sub("<\/span>", "}}}", 결과[0])
  276. 중간_데이터 = re.sub("<\/div>", "}}}", 중간_데이터)
  277. 중간_데이터 = re.sub('<span class="font\-size\-(?P<in>[1-6])">', "{{{+\g<in> ", 중간_데이터)
  278. 중간_데이터 = re.sub('<span class="font\-size\-small\-(?P<in>[1-6])">', "{{{-\g<in> ", 중간_데이터)
  279. 중간_데이터 = re.sub('<span style="color:(?:#)?(?P<in>[^"]*)">', "{{{#\g<in> ", 중간_데이터)
  280. 중간_데이터 = re.sub('<span style="background:(?:#)?(?P<in>[^"]*)">', "{{{@\g<in> ", 중간_데이터)
  281. 중간_데이터 = re.sub('<div style="(?P<in>[^"]*)">', "{{{#!wiki style=&quot;\g<in>&quot;\n", 중간_데이터)
  282. 중간_데이터 = re.sub("(?P<in>.)", "<span>\g<in></span>", 중간_데이터)
  283. 데이터 = 문법_컴파일.sub(중간_데이터, 데이터, 1)
  284. else:
  285. break
  286. 데이터 = re.sub("<span>&</span><span>l</span><span>t</span><span>;</span>", "<span>&lt;</span>", 데이터)
  287. 데이터 = re.sub("<span>&</span><span>g</span><span>t</span><span>;</span>", "<span>&gt;</span>", 데이터)
  288. return (데이터, 접기_숫자)
  289. def 나무마크(title, data):
  290. data = HTML_파싱(data)
  291. 접기_숫자 = 0
  292. 임시_저장 = 중괄호_문법(data, 접기_숫자)
  293. data = 임시_저장[0]
  294. 접기_숫자 = 임시_저장[1]
  295. data = re.sub("\[anchor\((?P<in>[^\[\]]*)\)\]", '<span id="\g<in>"></span>', data)
  296. data = re.sub('\[date\(now\)\]', 시간(), data)
  297. if(not re.search("\.", 아이피_확인(request))):
  298. name = '[[사용자:' + 아이피_확인(request) + '|' + 아이피_확인(request) + ']]'
  299. else:
  300. name = 아이피_확인(request)
  301. data = re.sub("\[name\]", name, data)
  302. while(True):
  303. m = re.search("\[include\(((?:(?!\)\]|,).)*)((?:,\s?(?:[^)]*))+)?\)\]", data)
  304. if(m):
  305. results = m.groups()
  306. if(results[0] == title):
  307. data = re.sub("\[include\(((?:(?!\)\]|,).)*)((?:,\s?(?:[^)]*))+)?\)\]", "<b>" + results[0] + "</b>", data, 1)
  308. else:
  309. DB_실행("select * from data where title = '" + DB_인코딩(results[0]) + "'")
  310. 틀_내용 = DB_가져오기()
  311. if(틀_내용):
  312. DB_실행("select * from back where title = '" + DB_인코딩(results[0]) + "' and link = '" + DB_인코딩(title) + "' and type = 'include'")
  313. 역링크 = DB_가져오기()
  314. if(not 역링크):
  315. DB_실행("insert into back (title, link, type) value ('" + DB_인코딩(results[0]) + "', '" + DB_인코딩(title) + "', 'include')")
  316. DB_갱신()
  317. 틀_데이터 = 틀_내용[0]['data']
  318. 틀_데이터 = re.sub("\[include\(((?:(?!\)\]|,).)*)((?:,\s?(?:[^)]*))+)?\)\]", "", 틀_데이터)
  319. 틀_데이터 = HTML_파싱(틀_데이터)
  320. 틀_데이터 = 중괄호_문법(틀_데이터, 접기_숫자)[0]
  321. if(results[1]):
  322. a = results[1]
  323. while(True):
  324. g = re.search("([^= ,]*)\=([^,]*)", a)
  325. if(g):
  326. result = g.groups()
  327. 틀_데이터 = re.sub("@" + result[0] + "@", result[1], 틀_데이터)
  328. a = re.sub("([^= ,]*)\=([^,]*)", "", a, 1)
  329. else:
  330. break
  331. data = re.sub("\[include\(((?:(?!\)\]|,).)*)((?:,\s?(?:[^)]*))+)?\)\]", '\n<div>' + 틀_데이터 + '</div>\n', data, 1)
  332. else:
  333. DB_실행("select * from back where title = '" + DB_인코딩(results[0]) + "' and link = '" + DB_인코딩(title) + "' and type = 'include'")
  334. abb = DB_가져오기()
  335. if(not abb):
  336. DB_실행("insert into back (title, link, type) value ('" + DB_인코딩(results[0]) + "', '" + DB_인코딩(title) + "', 'include')")
  337. DB_갱신()
  338. data = re.sub("\[include\(((?:(?!\)\]|,).)*)((?:,\s?(?:[^)]*))+)?\)\]", "<a class=\"not_thing\" href=\"" + URL_인코딩(results[0]) + "\">" + results[0] + "</a>", data, 1)
  339. else:
  340. break
  341. while(True):
  342. m = re.search('^#(?:redirect|넘겨주기)\s([^\n]*)', data)
  343. if(m):
  344. results = m.groups()
  345. aa = re.search("^(.*)(#(?:.*))$", results[0])
  346. if(aa):
  347. results = aa.groups()
  348. data = re.sub('^#(?:redirect|넘겨주기)\s([^\n]*)', '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(results[0]) + '/from/' + URL_인코딩(title) + results[1] + '" />', data, 1)
  349. else:
  350. data = re.sub('^#(?:redirect|넘겨주기)\s([^\n]*)', '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(results[0]) + '/from/' + URL_인코딩(title) + '" />', data, 1)
  351. DB_실행("select * from back where title = '" + DB_인코딩(results[0]) + "' and link = '" + DB_인코딩(title) + "' and type = 'redirect'")
  352. abb = DB_가져오기()
  353. if(not abb):
  354. DB_실행("insert into back (title, link, type) value ('" + DB_인코딩(results[0]) + "', '" + DB_인코딩(title) + "', 'redirect')")
  355. DB_갱신()
  356. else:
  357. break
  358. data = '\n' + data + '\n'
  359. while(True):
  360. m = re.search("\n&gt;\s?((?:[^\n]*)(?:(?:(?:(?:\n&gt;\s?)(?:[^\n]*))+)?))", data)
  361. if(m):
  362. result = m.groups()
  363. blockquote = result[0]
  364. blockquote = re.sub("\n&gt;\s?", "\n", blockquote)
  365. data = re.sub("\n&gt;\s?((?:[^\n]*)(?:(?:(?:(?:\n&gt;\s?)(?:[^\n]*))+)?))", "\n<blockquote>" + blockquote + "</blockquote>", data, 1)
  366. else:
  367. break
  368. m = re.search('\[목차\]', data)
  369. if(not m):
  370. data = re.sub("(?P<in>(={1,6})\s?([^=]*)\s?(?:={1,6})(?:\s+)?\n)", "[목차]\n\g<in>", data, 1)
  371. i = 0
  372. h0c = 0
  373. h1c = 0
  374. h2c = 0
  375. h3c = 0
  376. h4c = 0
  377. h5c = 0
  378. last = 0
  379. rtoc = '<div id="toc"><span id="toc-name">목차</span><br><br>'
  380. while(True):
  381. i = i + 1
  382. m = re.search('(={1,6})\s?([^=]*)\s?(?:={1,6})(?:\s+)?\n', data)
  383. if(m):
  384. result = m.groups()
  385. wiki = len(result[0])
  386. if(last < wiki):
  387. last = wiki
  388. else:
  389. last = wiki
  390. if(wiki == 1):
  391. h1c = 0
  392. h2c = 0
  393. h3c = 0
  394. h4c = 0
  395. h5c = 0
  396. elif(wiki == 2):
  397. h2c = 0
  398. h3c = 0
  399. h4c = 0
  400. h5c = 0
  401. elif(wiki == 3):
  402. h3c = 0
  403. h4c = 0
  404. h5c = 0
  405. elif(wiki == 4):
  406. h4c = 0
  407. h5c = 0
  408. elif(wiki == 5):
  409. h5c = 0
  410. if(wiki == 1):
  411. h0c = h0c + 1
  412. elif(wiki == 2):
  413. h1c = h1c + 1
  414. elif(wiki == 3):
  415. h2c = h2c + 1
  416. elif(wiki == 4):
  417. h3c = h3c + 1
  418. elif(wiki == 5):
  419. h4c = h4c + 1
  420. else:
  421. h5c = h5c + 1
  422. toc = str(h0c) + '.' + str(h1c) + '.' + str(h2c) + '.' + str(h3c) + '.' + str(h4c) + '.' + str(h5c) + '.'
  423. toc = re.sub("(?P<in>[0-9]0(?:[0]*)?)\.", '\g<in>#.', toc)
  424. toc = re.sub("0\.", '', toc)
  425. toc = re.sub("#\.", '.', toc)
  426. toc = re.sub("\.$", '', toc)
  427. rtoc = rtoc + '<a href="#s-' + toc + '">' + toc + '</a>. ' + result[1] + '<br>'
  428. c = re.sub(" $", "", result[1])
  429. d = c
  430. c = re.sub("\[\[(([^|]*)\|)?(?P<in>[^\]]*)\]\]", "\g<in>", c)
  431. data = re.sub('(={1,6})\s?([^=]*)\s?(?:={1,6})(?:\s+)?\n', '<h' + str(wiki) + ' id="' + c + '"><a href="#toc" id="s-' + toc + '">' + toc + '.</a> ' + d + ' <span style="font-size:11px;">[<a href="/edit/' + URL_인코딩(title) + '/section/' + str(i) + '">편집</a>]</span></h' + str(wiki) + '>', data, 1);
  432. else:
  433. rtoc = rtoc + '</div>'
  434. break
  435. data = re.sub("\[목차\]", rtoc, data)
  436. category = ''
  437. while(True):
  438. m = re.search("\[\[(분류:(?:(?:(?!\]\]).)*))\]\]", data)
  439. if(m):
  440. g = m.groups()
  441. if(not title == g[0]):
  442. DB_실행("select * from cat where title = '" + DB_인코딩(g[0]) + "' and cat = '" + DB_인코딩(title) + "'")
  443. abb = DB_가져오기()
  444. if(not abb):
  445. DB_실행("insert into cat (title, cat) value ('" + DB_인코딩(g[0]) + "', '" + DB_인코딩(title) + "')")
  446. DB_갱신()
  447. if(category == ''):
  448. DB_실행("select * from data where title = '" + DB_인코딩(g[0]) + "'")
  449. exists = DB_가져오기()
  450. if(exists):
  451. red = ""
  452. else:
  453. red = 'class="not_thing"'
  454. category = category + '<a ' + red + ' href="/w/' + URL_인코딩(g[0]) + '">' + re.sub("분류:", "", g[0]) + '</a>'
  455. else:
  456. DB_실행("select * from data where title = '" + DB_인코딩(g[0]) + "'")
  457. exists = DB_가져오기()
  458. if(exists):
  459. red = ""
  460. else:
  461. red = 'class="not_thing"'
  462. category = category + ' / ' + '<a ' + red + ' href="/w/' + URL_인코딩(g[0]) + '">' + re.sub("분류:", "", g[0]) + '</a>'
  463. data = re.sub("\[\[(분류:(?:(?:(?!\]\]).)*))\]\]", '', data, 1)
  464. else:
  465. break
  466. data = re.sub("'''(?P<in>.+?)'''(?!')", '<b>\g<in></b>', data)
  467. data = re.sub("''(?P<in>.+?)''(?!')", '<i>\g<in></i>', data)
  468. data = re.sub('~~(?P<in>.+?)~~(?!~)', '<s>\g<in></s>', data)
  469. data = re.sub('--(?P<in>.+?)--(?!-)', '<s>\g<in></s>', data)
  470. data = re.sub('__(?P<in>.+?)__(?!_)', '<u>\g<in></u>', data)
  471. data = re.sub('\^\^(?P<in>.+?)\^\^(?!\^)', '<sup>\g<in></sup>', data)
  472. data = re.sub(',,(?P<in>.+?),,(?!,)', '<sub>\g<in></sub>', data)
  473. data = re.sub('&lt;math&gt;(?P<in>((?!&lt;math&gt;).)*)&lt;\/math&gt;', '$\g<in>$', data)
  474. data = re.sub('{{\|(?P<in>(?:(?:(?:(?!\|}}).)*)(?:\n?))+)\|}}', '<table><tbody><tr><td>\g<in></td></tr></tbody></table>', data)
  475. data = re.sub('\[ruby\((?P<in>[^\|]*)\|(?P<out>[^\)]*)\)\]', '<ruby>\g<in><rp>(</rp><rt>\g<out></rt><rp>)</rp></ruby>', data)
  476. data = re.sub("##\s?(?P<in>[^\n]*)\n", "<div style='display:none;'>\g<in></div>", data);
  477. while(True):
  478. m = re.search("\[\[파일:((?:(?!\]\]|\|).)*)(?:\|((?:(?!\]\]).)*))?\]\]", data)
  479. if(m):
  480. c = m.groups()
  481. if(c[1]):
  482. n = re.search("width=([^ \n&]*)", c[1])
  483. e = re.search("height=([^ \n&]*)", c[1])
  484. if(n):
  485. a = n.groups()
  486. width = a[0]
  487. else:
  488. width = ''
  489. if(e):
  490. b = e.groups()
  491. height = b[0]
  492. else:
  493. height = ''
  494. img = re.sub("\.(?P<in>[Jj][Pp][Gg]|[Pp][Nn][Gg]|[Gg][Ii][Ff]|[Jj][Pp][Ee][Gg])", "#\g<in>#", c[0])
  495. data = re.sub("\[\[파일:((?:(?!\]\]|\?).)*)(?:\?((?:(?!\]\]).)*))?\]\]", '<a href="/w/파일:' + img + '"><img src="/image/' + img + '" width="' + width + '" height="' + height + '"></a>', data, 1)
  496. else:
  497. img = re.sub("\.(?P<in>[Jj][Pp][Gg]|[Pp][Nn][Gg]|[Gg][Ii][Ff]|[Jj][Pp][Ee][Gg])", "#\g<in>#", c[0])
  498. data = re.sub("\[\[파일:((?:(?!\]\]|\?).)*)(?:\?((?:(?!\]\]).)*))?\]\]", "<a href='/w/파일:" + img + "'><img src='/image/" + img + "'></a>", data, 1)
  499. if(not re.search("^파일:([^\n]*)", title)):
  500. DB_실행("select * from back where title = '" + DB_인코딩(c[0]) + "' and link = '" + DB_인코딩(title) + "' and type = 'redirect'")
  501. abb = DB_가져오기()
  502. if(not abb):
  503. DB_실행("insert into back (title, link, type) value ('파일:" + DB_인코딩(c[0]) + "', '" + DB_인코딩(title) + "', 'file')")
  504. DB_갱신()
  505. else:
  506. break
  507. data = re.sub("\[br\]",'<br>', data);
  508. while(True):
  509. m = re.search("\[youtube\(((?:(?!,|\)\]).)*)(?:,\s)?(?:width=((?:(?!,|\)\]).)*))?(?:,\s)?(?:height=((?:(?!,|\)\]).)*))?(?:,\s)?(?:width=((?:(?!,|\)\]).)*))?\)\]", data)
  510. if(m):
  511. result = m.groups()
  512. if(result[1]):
  513. if(result[2]):
  514. width = result[1]
  515. height = result[2]
  516. else:
  517. width = result[1]
  518. height = '315'
  519. elif(result[2]):
  520. if(result[3]):
  521. height = result[2]
  522. width = result[3]
  523. else:
  524. height = result[2]
  525. width = '560'
  526. else:
  527. width = '560'
  528. height = '315'
  529. data = re.sub("\[youtube\(((?:(?!,|\)\]).)*)(?:,\s)?(?:width=((?:(?!,|\)\]).)*))?(?:,\s)?(?:height=((?:(?!,|\)\]).)*))?(?:,\s)?(?:width=((?:(?!,|\)\]).)*))?\)\]", '<iframe width="' + width + '" height="' + height + '" src="https://www.youtube.com/embed/' + result[0] + '" frameborder="0" allowfullscreen></iframe>', data, 1)
  530. else:
  531. break
  532. data = re.sub("\[\[(?::(?P<in>(?:분류|파일):(?:(?:(?!\]\]).)*)))\]\]", "[[\g<in>]]", data)
  533. while(True):
  534. m = re.search("\[\[(((?!\]\]).)*)\]\]", data)
  535. if(m):
  536. result = m.groups()
  537. a = re.search("((?:(?!\|).)*)\|(.*)", result[0])
  538. if(a):
  539. results = a.groups()
  540. aa = re.search("^(.*)(#(?:.*))$", results[0])
  541. if(aa):
  542. g = results[1]
  543. results = aa.groups()
  544. b = re.search("^http(?:s)?:\/\/", results[0])
  545. if(b):
  546. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a class="out_link" href="' + results[0] + results[1] + '">' + g + '</a>', data, 1)
  547. else:
  548. if(results[0] == title):
  549. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<b>' + g + '</b>', data, 1)
  550. else:
  551. DB_실행("select * from data where title = '" + DB_인코딩(results[0]) + "'")
  552. rows = DB_가져오기()
  553. if(rows):
  554. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a title="' + results[0] + results[1] + '" href="/w/' + URL_인코딩(results[0]) + results[1] + '">' + g + '</a>', data, 1)
  555. else:
  556. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a title="' + results[0] + results[1] + '" class="not_thing" href="/w/' + URL_인코딩(results[0]) + results[1] + '">' + g + '</a>', data, 1)
  557. DB_실행("select * from back where title = '" + DB_인코딩(results[0]) + "' and link = '" + DB_인코딩(title) + "'")
  558. rows = DB_가져오기()
  559. if(not rows):
  560. DB_실행("insert into back (title, link, type) value ('" + DB_인코딩(results[0]) + "', '" + DB_인코딩(title) + "', '')")
  561. DB_갱신()
  562. else:
  563. b = re.search("^http(?:s)?:\/\/", results[0])
  564. if(b):
  565. c = re.search("(?:\.[Jj][Pp][Gg]|\.[Pp][Nn][Gg]|\.[Gg][Ii][Ff]|\.[Jj][Pp][Ee][Gg])", results[0])
  566. if(c):
  567. img = results[0]
  568. img = re.sub("\.(?P<in>[Jj][Pp][Gg]|[Pp][Nn][Gg]|[Gg][Ii][Ff]|[Jj][Pp][Ee][Gg])", "#\g<in>#", img)
  569. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a class="out_link" href="' + img + '">' + results[1] + '</a>', data, 1)
  570. else:
  571. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a class="out_link" href="' + results[0] + '">' + results[1] + '</a>', data, 1)
  572. else:
  573. if(results[0] == title):
  574. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<b>' + results[1] + '</b>', data, 1)
  575. else:
  576. DB_실행("select * from data where title = '" + DB_인코딩(results[0]) + "'")
  577. rows = DB_가져오기()
  578. if(rows):
  579. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a title="' + results[0] + '" href="/w/' + URL_인코딩(results[0]) + '">' + results[1] + '</a>', data, 1)
  580. else:
  581. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a title="' + results[0] + '" class="not_thing" href="/w/' + URL_인코딩(results[0]) + '">' + results[1] + '</a>', data, 1)
  582. DB_실행("select * from back where title = '" + DB_인코딩(results[0]) + "' and link = '" + DB_인코딩(title) + "'")
  583. rows = DB_가져오기()
  584. if(not rows):
  585. DB_실행("insert into back (title, link, type) value ('" + DB_인코딩(results[0]) + "', '" + DB_인코딩(title) + "', '')")
  586. DB_갱신()
  587. else:
  588. aa = re.search("^(.*)(#(?:.*))$", result[0])
  589. if(aa):
  590. result = aa.groups()
  591. b = re.search("^http(?:s)?:\/\/", result[0])
  592. if(b):
  593. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a class="out_link" href="' + result[0] + result[1] + '">' + result[0] + result[1] + '</a>', data, 1)
  594. else:
  595. if(result[0] == title):
  596. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<b>' + result[0] + result[1] + '</b>', data, 1)
  597. else:
  598. DB_실행("select * from data where title = '" + DB_인코딩(result[0]) + "'")
  599. rows = DB_가져오기()
  600. if(rows):
  601. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a href="/w/' + URL_인코딩(result[0]) + result[1] + '">' + result[0] + result[1] + '</a>', data, 1)
  602. else:
  603. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a class="not_thing" href="/w/' + URL_인코딩(result[0]) + result[1] + '">' + result[0] + result[1] + '</a>', data, 1)
  604. DB_실행("select * from back where title = '" + DB_인코딩(result[0]) + "' and link = '" + DB_인코딩(title) + "'")
  605. rows = DB_가져오기()
  606. if(not rows):
  607. DB_실행("insert into back (title, link, type) value ('" + DB_인코딩(result[0]) + "', '" + DB_인코딩(title) + "', '')")
  608. DB_갱신()
  609. else:
  610. b = re.search("^http(?:s)?:\/\/", result[0])
  611. if(b):
  612. c = re.search("(?:\.[Jj][Pp][Gg]|\.[Pp][Nn][Gg]|\.[Gg][Ii][Ff]|\.[Jj][Pp][Ee][Gg])", result[0])
  613. if(c):
  614. img = result[0]
  615. img = re.sub("\.(?P<in>[Jj][Pp][Gg]|[Pp][Nn][Gg]|[Gg][Ii][Ff]|[Jj][Pp][Ee][Gg])", "#\g<in>#", img)
  616. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a class="out_link" href="' + img + '">' + img + '</a>', data, 1)
  617. else:
  618. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a class="out_link" href="' + result[0] + '">' + result[0] + '</a>', data, 1)
  619. else:
  620. if(result[0] == title):
  621. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<b>' + result[0] + '</b>', data, 1)
  622. else:
  623. DB_실행("select * from data where title = '" + DB_인코딩(result[0]) + "'")
  624. rows = DB_가져오기()
  625. if(rows):
  626. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a href="/w/' + URL_인코딩(result[0]) + '">' + result[0] + '</a>', data, 1)
  627. else:
  628. data = re.sub('\[\[(((?!\]\]).)*)\]\]', '<a class="not_thing" href="/w/' + URL_인코딩(result[0]) + '">' + result[0] + '</a>', data, 1)
  629. DB_실행("select * from back where title = '" + DB_인코딩(result[0]) + "' and link = '" + DB_인코딩(title) + "'")
  630. rows = DB_가져오기()
  631. if(not rows):
  632. DB_실행("insert into back (title, link, type) value ('" + DB_인코딩(result[0]) + "', '" + DB_인코딩(title) + "', '')")
  633. DB_갱신()
  634. else:
  635. break
  636. while(True):
  637. m = re.search("(http(?:s)?:\/\/(?:(?:(?:(?!\.[Jj][Pp][Gg]|\.[Pp][Nn][Gg]|\.[Gg][Ii][Ff]|\.[Jj][Pp][Ee][Gg]|#[Jj][Pp][Gg]#|#[Pp][Nn][Gg]#|#[Gg][Ii][Ff]#|#[Jj][Pp][Ee][Gg]#|<\/(?:[^>]*)>).)*)(?:\.[Jj][Pp][Gg]|\.[Pp][Nn][Gg]|\.[Gg][Ii][Ff]|\.[Jj][Pp][Ee][Gg])))(?:(?:(?:\?)width=((?:[0-9]*)(?:px|%)?))?(?:(?:\?|&)height=((?:[0-9]*)(?:px|%)?))?(?:(?:&)width=((?:[0-9]*)(?:px|%)?))?)?", data)
  638. if(m):
  639. result = m.groups()
  640. if(result[1]):
  641. if(result[2]):
  642. width = result[1]
  643. height = result[2]
  644. else:
  645. width = result[1]
  646. height = ''
  647. elif(result[2]):
  648. if(result[3]):
  649. height = result[2]
  650. width = result[3]
  651. else:
  652. height = result[2]
  653. width = ''
  654. else:
  655. width = ''
  656. height = ''
  657. c = result[0]
  658. c = re.sub("\.(?P<in>[Jj][Pp][Gg]|[Pp][Nn][Gg]|[Gg][Ii][Ff]|[Jj][Pp][Ee][Gg])", "#\g<in>#", c)
  659. data = re.sub("(http(?:s)?:\/\/(?:(?:(?:(?!\.[Jj][Pp][Gg]|\.[Pp][Nn][Gg]|\.[Gg][Ii][Ff]|\.[Jj][Pp][Ee][Gg]|#[Jj][Pp][Gg]#|#[Pp][Nn][Gg]#|#[Gg][Ii][Ff]#|#[Jj][Pp][Ee][Gg]#|<\/(?:[^>]*)>).)*)(?:\.[Jj][Pp][Gg]|\.[Pp][Nn][Gg]|\.[Gg][Ii][Ff]|\.[Jj][Pp][Ee][Gg])))(?:(?:(?:\?)width=((?:[0-9]*)(?:px|%)?))?(?:(?:\?|&)height=((?:[0-9]*)(?:px|%)?))?(?:(?:&)width=((?:[0-9]*)(?:px|%)?))?)?", "<img width='" + width + "' height='" + height + "' src='" + c + "'>", data, 1)
  660. else:
  661. break
  662. while(True):
  663. m = re.search("((?:(?:( +)\*\s(?:[^\n]*))\n?)+)", data)
  664. if(m):
  665. result = m.groups()
  666. end = str(result[0])
  667. while(True):
  668. isspace = re.search("( +)\*\s([^\n]*)", end)
  669. if(isspace):
  670. spacebar = isspace.groups()
  671. up = len(spacebar[0]) * 20
  672. end = re.sub("( +)\*\s([^\n]*)", "<li style='margin-left:" + str(up) + "px'>" + spacebar[1] + "</li>", end, 1)
  673. else:
  674. break
  675. end = re.sub("\n", '', end)
  676. data = re.sub("(?:(?:(?:( +)\*\s([^\n]*))\n?)+)", '<ul id="list">' + end + '</ul>', data, 1)
  677. else:
  678. break
  679. data = re.sub('\[date\]', 시간(), data)
  680. data = re.sub("#(?P<in>[Jj][Pp][Gg]|[Pp][Nn][Gg]|[Gg][Ii][Ff]|[Jj][Pp][Ee][Gg])#", ".\g<in>", data)
  681. data = re.sub("-{4,11}", "<hr>", data)
  682. while(True):
  683. b = re.search("\n( +)", data)
  684. if(b):
  685. result = b.groups()
  686. up = re.sub(' ', '<span id="in"></span>', result[0])
  687. data = re.sub("\n( +)", '<br>' + up, data, 1)
  688. else:
  689. break
  690. a = 1
  691. tou = "<hr id='footnote'><div class='wiki-macro-footnote'><br>"
  692. while(True):
  693. b = re.search("\[\*([^\s]*)\s(((?!\]).)*)\]", data)
  694. if(b):
  695. results = b.groups()
  696. if(results[0]):
  697. c = results[1]
  698. c = re.sub("<(?:[^>]*)>", '', c)
  699. tou = tou + "<span class='footnote-list'><a href=\"#rfn-" + str(a) + "\" id=\"fn-" + str(a) + "\">[" + results[0] + "]</a> " + results[1] + "</span><br>"
  700. data = re.sub("\[\*([^\s]*)\s(((?!\]).)*)\]", "<sup><a class=\"footnotes\" title=\"" + c + "\" id=\"rfn-" + str(a) + "\" href=\"#fn-" + str(a) + "\">[" + results[0] + "]</a></sup>", data, 1)
  701. else:
  702. c = results[1]
  703. c = re.sub("<(?:[^>]*)>", '', c)
  704. tou = tou + "<span class='footnote-list'><a href=\"#rfn-" + str(a) + "\" id=\"fn-" + str(a) + "\">[" + str(a) + "]</a> " + results[1] + "</span><br>"
  705. data = re.sub("\[\*([^\s]*)\s(((?!\]).)*)\]", '<sup><a class="footnotes" title="' + c + '" id="rfn-' + str(a) + '" href="#fn-' + str(a) + '">[' + str(a) + ']</a></sup>', data, 1)
  706. a = a + 1
  707. else:
  708. tou = tou + '</div>'
  709. if(tou == "<hr id='footnote'><div class='wiki-macro-footnote'><br></div>"):
  710. tou = ""
  711. break
  712. data = re.sub("\[각주\](?:(?:<br>| |\r|\n)+)?$", "", data)
  713. data = re.sub("(?:(?:<br>| |\r|\n)+)$", "", data)
  714. data = re.sub("\[각주\]", "<br>" + tou, data)
  715. data = data + tou
  716. if(category):
  717. data = data + '<div style="width:100%;border: 1px solid #777;padding: 5px;margin-top: 1em;">분류: ' + category + '</div>'
  718. while(True):
  719. 있나 = re.search("\n(\|\|((?:(?:(?:(?!\|\|).)*)(?:\n?))+))", data)
  720. if(있나):
  721. 분리 = 있나.groups()
  722. 중간_내용 = re.sub("\|\|", "#table#", 분리[0])
  723. 중간_내용 = re.sub("\r\n", "<br>", 중간_내용)
  724. data = re.sub("\n(\|\|((?:(?:(?:(?!\|\|).)*)(?:\n?))+))", '\n' + 중간_내용, data, 1)
  725. else:
  726. break
  727. data = re.sub("#table#", "||", data)
  728. while(True):
  729. m = re.search("(\|\|(?:(?:(?:.*)\n?)\|\|)+)", data)
  730. if(m):
  731. results = m.groups()
  732. table = results[0]
  733. while(True):
  734. a = re.search("^(\|\|(?:(?:\|\|)+)?)((?:&lt;(?:(?:(?!&gt;).)*)&gt;)+)?", table)
  735. if(a):
  736. row = ''
  737. cel = ''
  738. celstyle = ''
  739. rowstyle = ''
  740. alltable = ''
  741. result = a.groups()
  742. if(result[1]):
  743. q = re.search("&lt;table\s?width=((?:(?!&gt;).)*)&gt;", result[1])
  744. w = re.search("&lt;table\s?height=((?:(?!&gt;).)*)&gt;", result[1])
  745. e = re.search("&lt;table\s?align=((?:(?!&gt;).)*)&gt;", result[1])
  746. alltable = 'style="'
  747. celstyle = 'style="'
  748. rowstyle = 'style="'
  749. if(q):
  750. resultss = q.groups()
  751. alltable = alltable + 'width:' + resultss[0] + ';'
  752. if(w):
  753. resultss = w.groups()
  754. alltable = alltable + 'height:' + resultss[0] + ';'
  755. if(e):
  756. resultss = e.groups()
  757. if(resultss[0] == 'right'):
  758. alltable = alltable + 'margin-left:auto;'
  759. elif(resultss[0] == 'center'):
  760. alltable = alltable + 'margin:auto;'
  761. else:
  762. alltable = alltable + 'margin-right:auto;'
  763. ee = re.search("&lt;table\s?textalign=((?:(?!&gt;).)*)&gt;", result[1])
  764. if(ee):
  765. resultss = ee.groups()
  766. if(resultss[0] == 'right'):
  767. alltable = alltable + 'text-align:right;'
  768. elif(resultss[0] == 'center'):
  769. alltable = alltable + 'text-align:center;'
  770. else:
  771. alltable = alltable + 'text-align:left;'
  772. r = re.search("&lt;-((?:(?!&gt;).)*)&gt;", result[1])
  773. if(r):
  774. resultss = r.groups()
  775. cel = 'colspan="' + resultss[0] + '"'
  776. else:
  777. cel = 'colspan="' + str(round(len(result[0]) / 2)) + '"'
  778. t = re.search("&lt;\|((?:(?!&gt;).)*)&gt;", result[1])
  779. if(t):
  780. resultss = t.groups()
  781. row = 'rowspan="' + resultss[0] + '"'
  782. ba = re.search("&lt;rowbgcolor=(#[0-9a-f-A-F]{6})&gt;", result[1])
  783. bb = re.search("&lt;rowbgcolor=(#[0-9a-f-A-F]{3})&gt;", result[1])
  784. bc = re.search("&lt;rowbgcolor=(\w+)&gt;", result[1])
  785. if(ba):
  786. resultss = ba.groups()
  787. rowstyle = rowstyle + 'background:' + resultss[0] + ';'
  788. elif(bb):
  789. resultss = bb.groups()
  790. rowstyle = rowstyle + 'background:' + resultss[0] + ';'
  791. elif(bc):
  792. resultss = bc.groups()
  793. rowstyle = rowstyle + 'background:' + resultss[0] + ';'
  794. z = re.search("&lt;table\s?bordercolor=(#[0-9a-f-A-F]{6})&gt;", result[1])
  795. x = re.search("&lt;table\s?bordercolor=(#[0-9a-f-A-F]{3})&gt;", result[1])
  796. c = re.search("&lt;table\s?bordercolor=(\w+)&gt;", result[1])
  797. if(z):
  798. resultss = z.groups()
  799. alltable = alltable + 'border:' + resultss[0] + ' 2px solid;'
  800. elif(x):
  801. resultss = x.groups()
  802. alltable = alltable + 'border:' + resultss[0] + ' 2px solid;'
  803. elif(c):
  804. resultss = c.groups()
  805. alltable = alltable + 'border:' + resultss[0] + ' 2px solid;'
  806. aq = re.search("&lt;table\s?bgcolor=(#[0-9a-f-A-F]{6})&gt;", result[1])
  807. aw = re.search("&lt;table\s?bgcolor=(#[0-9a-f-A-F]{3})&gt;", result[1])
  808. ae = re.search("&lt;table\s?bgcolor=(\w+)&gt;", result[1])
  809. if(aq):
  810. resultss = aq.groups()
  811. alltable = alltable + 'background:' + resultss[0] + ';'
  812. elif(aw):
  813. resultss = aw.groups()
  814. alltable = alltable + 'background:' + resultss[0] + ';'
  815. elif(ae):
  816. resultss = ae.groups()
  817. alltable = alltable + 'background:' + resultss[0] + ';'
  818. j = re.search("&lt;bgcolor=(#[0-9a-f-A-F]{6})&gt;", result[1])
  819. k = re.search("&lt;bgcolor=(#[0-9a-f-A-F]{3})&gt;", result[1])
  820. l = re.search("&lt;bgcolor=(\w+)&gt;", result[1])
  821. if(j):
  822. resultss = j.groups()
  823. celstyle = celstyle + 'background:' + resultss[0] + ';'
  824. elif(k):
  825. resultss = k.groups()
  826. celstyle = celstyle + 'background:' + resultss[0] + ';'
  827. elif(l):
  828. resultss = l.groups()
  829. celstyle = celstyle + 'background:' + resultss[0] + ';'
  830. aa = re.search("&lt;(#[0-9a-f-A-F]{6})&gt;", result[1])
  831. ab = re.search("&lt;(#[0-9a-f-A-F]{3})&gt;", result[1])
  832. ac = re.search("&lt;(\w+)&gt;", result[1])
  833. if(aa):
  834. resultss = aa.groups()
  835. celstyle = celstyle + 'background:' + resultss[0] + ';'
  836. elif(ab):
  837. resultss = ab.groups()
  838. celstyle = celstyle + 'background:' + resultss[0] + ';'
  839. elif(ac):
  840. resultss = ac.groups()
  841. celstyle = celstyle + 'background:' + resultss[0] + ';'
  842. qa = re.search("&lt;width=((?:(?!&gt;).)*)&gt;", result[1])
  843. qb = re.search("&lt;height=((?:(?!&gt;).)*)&gt;", result[1])
  844. if(qa):
  845. resultss = qa.groups()
  846. celstyle = celstyle + 'width:' + resultss[0] + ';'
  847. if(qb):
  848. resultss = qb.groups()
  849. celstyle = celstyle + 'height:' + resultss[0] + ';'
  850. i = re.search("&lt;\)&gt;", result[1])
  851. o = re.search("&lt;:&gt;", result[1])
  852. p = re.search("&lt;\(&gt;", result[1])
  853. if(i):
  854. celstyle = celstyle + 'text-align:right;'
  855. elif(o):
  856. celstyle = celstyle + 'text-align:center;'
  857. elif(p):
  858. celstyle = celstyle + 'text-align:left;'
  859. alltable = alltable + '"'
  860. celstyle = celstyle + '"'
  861. rowstyle = rowstyle + '"'
  862. table = re.sub("^(\|\|(?:(?:\|\|)+)?)((?:&lt;(?:(?:(?!&gt;).)*)&gt;)+)?", "<table " + alltable + "><tbody><tr " + rowstyle + "><td " + cel + " " + row + " " + celstyle + ">", table, 1)
  863. else:
  864. cel = 'colspan="' + str(round(len(result[0]) / 2)) + '"'
  865. table = re.sub("^(\|\|(?:(?:\|\|)+)?)((?:&lt;(?:(?:(?!&gt;).)*)&gt;)+)?", "<table><tbody><tr><td " + cel + ">", table, 1)
  866. else:
  867. break
  868. table = re.sub("\|\|$", "</td></tr></tbody></table>", table)
  869. while(True):
  870. b = re.search("\|\|\r\n(\|\|(?:(?:\|\|)+)?)((?:&lt;(?:(?:(?!&gt;).)*)&gt;)+)?", table)
  871. if(b):
  872. row = ''
  873. cel = ''
  874. celstyle = ''
  875. rowstyle = ''
  876. result = b.groups()
  877. if(result[1]):
  878. celstyle = 'style="'
  879. rowstyle = 'style="'
  880. r = re.search("&lt;-((?:(?!&gt;).)*)&gt;", result[1])
  881. if(r):
  882. resultss = r.groups()
  883. cel = 'colspan="' + resultss[0] + '"'
  884. else:
  885. cel = 'colspan="' + str(round(len(result[0]) / 2)) + '"'
  886. t = re.search("&lt;\|((?:(?!&gt;).)*)&gt;", result[1])
  887. if(t):
  888. resultss = t.groups()
  889. row = 'rowspan="' + resultss[0] + '"'
  890. ba = re.search("&lt;rowbgcolor=(#[0-9a-f-A-F]{6})&gt;", result[1])
  891. bb = re.search("&lt;rowbgcolor=(#[0-9a-f-A-F]{3})&gt;", result[1])
  892. bc = re.search("&lt;rowbgcolor=(\w+)&gt;", result[1])
  893. if(ba):
  894. resultss = ba.groups()
  895. rowstyle = rowstyle + 'background:' + resultss[0] + ';'
  896. elif(bb):
  897. resultss = bb.groups()
  898. rowstyle = rowstyle + 'background:' + resultss[0] + ';'
  899. elif(bc):
  900. resultss = bc.groups()
  901. rowstyle = rowstyle + 'background:' + resultss[0] + ';'
  902. j = re.search("&lt;bgcolor=(#[0-9a-f-A-F]{6})&gt;", result[1])
  903. k = re.search("&lt;bgcolor=(#[0-9a-f-A-F]{3})&gt;", result[1])
  904. l = re.search("&lt;bgcolor=(\w+)&gt;", result[1])
  905. if(j):
  906. resultss = j.groups()
  907. celstyle = celstyle + 'background:' + resultss[0] + ';'
  908. elif(k):
  909. resultss = k.groups()
  910. celstyle = celstyle + 'background:' + resultss[0] + ';'
  911. elif(l):
  912. resultss = l.groups()
  913. celstyle = celstyle + 'background:' + resultss[0] + ';'
  914. aa = re.search("&lt;(#[0-9a-f-A-F]{6})&gt;", result[1])
  915. ab = re.search("&lt;(#[0-9a-f-A-F]{3})&gt;", result[1])
  916. ac = re.search("&lt;(\w+)&gt;", result[1])
  917. if(aa):
  918. resultss = aa.groups()
  919. celstyle = celstyle + 'background:' + resultss[0] + ';'
  920. elif(ab):
  921. resultss = ab.groups()
  922. celstyle = celstyle + 'background:' + resultss[0] + ';'
  923. elif(ac):
  924. resultss = ac.groups()
  925. celstyle = celstyle + 'background:' + resultss[0] + ';'
  926. qa = re.search("&lt;width=((?:(?!&gt;).)*)&gt;", result[1])
  927. qb = re.search("&lt;height=((?:(?!&gt;).)*)&gt;", result[1])
  928. if(qa):
  929. resultss = qa.groups()
  930. celstyle = celstyle + 'width:' + resultss[0] + ';'
  931. if(qb):
  932. resultss = qb.groups()
  933. celstyle = celstyle + 'height:' + resultss[0] + ';'
  934. i = re.search("&lt;\)&gt;", result[1])
  935. o = re.search("&lt;:&gt;", result[1])
  936. p = re.search("&lt;\(&gt;", result[1])
  937. if(i):
  938. celstyle = celstyle + 'text-align:right;'
  939. elif(o):
  940. celstyle = celstyle + 'text-align:center;'
  941. elif(p):
  942. celstyle = celstyle + 'text-align:left;'
  943. celstyle = celstyle + '"'
  944. rowstyle = rowstyle + '"'
  945. table = re.sub("\|\|\r\n(\|\|(?:(?:\|\|)+)?)((?:&lt;(?:(?:(?!&gt;).)*)&gt;)+)?", "</td></tr><tr " + rowstyle + "><td " + cel + " " + row + " " + celstyle + ">", table, 1)
  946. else:
  947. cel = 'colspan="' + str(round(len(result[0]) / 2)) + '"'
  948. table = re.sub("\|\|\r\n(\|\|(?:(?:\|\|)+)?)((?:&lt;(?:(?:(?!&gt;).)*)&gt;)+)?", "</td></tr><tr><td " + cel + ">", table, 1)
  949. else:
  950. break
  951. while(True):
  952. c = re.search("(\|\|(?:(?:\|\|)+)?)((?:&lt;(?:(?:(?!&gt;).)*)&gt;)+)?", table)
  953. if(c):
  954. row = ''
  955. cel = ''
  956. celstyle = ''
  957. result = c.groups()
  958. if(result[1]):
  959. celstyle = 'style="'
  960. r = re.search("&lt;-((?:(?!&gt;).)*)&gt;", result[1])
  961. if(r):
  962. resultss = r.groups()
  963. cel = 'colspan="' + resultss[0] + '"';
  964. else:
  965. cel = 'colspan="' + str(round(len(result[0]) / 2)) + '"'
  966. t = re.search("&lt;\|((?:(?!&gt;).)*)&gt;", result[1])
  967. if(t):
  968. resultss = t.groups()
  969. row = 'rowspan="' + resultss[0] + '"';
  970. j = re.search("&lt;bgcolor=(#[0-9a-f-A-F]{6})&gt;", result[1])
  971. k = re.search("&lt;bgcolor=(#[0-9a-f-A-F]{3})&gt;", result[1])
  972. l = re.search("&lt;bgcolor=(\w+)&gt;", result[1])
  973. if(j):
  974. resultss = j.groups()
  975. celstyle = celstyle + 'background:' + resultss[0] + ';'
  976. elif(k):
  977. resultss = k.groups()
  978. celstyle = celstyle + 'background:' + resultss[0] + ';'
  979. elif(l):
  980. resultss = l.groups()
  981. celstyle = celstyle + 'background:' + resultss[0] + ';'
  982. aa = re.search("&lt;(#[0-9a-f-A-F]{6})&gt;", result[1])
  983. ab = re.search("&lt;(#[0-9a-f-A-F]{3})&gt;", result[1])
  984. ac = re.search("&lt;(\w+)&gt;", result[1])
  985. if(aa):
  986. resultss = aa.groups()
  987. celstyle = celstyle + 'background:' + resultss[0] + ';'
  988. elif(ab):
  989. resultss = ab.groups()
  990. celstyle = celstyle + 'background:' + resultss[0] + ';'
  991. elif(ac):
  992. resultss = ac.groups()
  993. celstyle = celstyle + 'background:' + resultss[0] + ';'
  994. qa = re.search("&lt;width=((?:(?!&gt;).)*)&gt;", result[1])
  995. qb = re.search("&lt;height=((?:(?!&gt;).)*)&gt;", result[1])
  996. if(qa):
  997. resultss = qa.groups()
  998. celstyle = celstyle + 'width:' + resultss[0] + ';'
  999. if(qb):
  1000. resultss = qb.groups()
  1001. celstyle = celstyle + 'height:' + resultss[0] + ';'
  1002. i = re.search("&lt;\)&gt;", result[1])
  1003. o = re.search("&lt;:&gt;", result[1])
  1004. p = re.search("&lt;\(&gt;", result[1])
  1005. if(i):
  1006. celstyle = celstyle + 'text-align:right;'
  1007. elif(o):
  1008. celstyle = celstyle + 'text-align:center;'
  1009. elif(p):
  1010. celstyle = celstyle + 'text-align:left;'
  1011. celstyle = celstyle + '"'
  1012. table = re.sub("(\|\|(?:(?:\|\|)+)?)((?:&lt;(?:(?:(?!&gt;).)*)&gt;)+)?", "</td><td " + cel + " " + row + " " + celstyle + ">", table, 1)
  1013. else:
  1014. cel = 'colspan="' + str(round(len(result[0]) / 2)) + '"'
  1015. table = re.sub("(\|\|(?:(?:\|\|)+)?)((?:&lt;(?:(?:(?!&gt;).)*)&gt;)+)?", "</td><td " + cel + ">", table, 1)
  1016. else:
  1017. break
  1018. data = re.sub("(\|\|(?:(?:(?:.*)\n?)\|\|)+)", table, data, 1)
  1019. else:
  1020. break
  1021. data = re.sub('<\/blockquote>((\r)?\n){2}<blockquote>', '</blockquote><br><blockquote>', data)
  1022. data = re.sub('\n', '<br>', data)
  1023. data = re.sub('^<br>', '', data)
  1024. return str(data)
  1025. def 아이피_확인(request):
  1026. if(session.get('Now') == True):
  1027. ip = format(session['DREAMER'])
  1028. else:
  1029. if(request.headers.getlist("X-Forwarded-For")):
  1030. ip = request.headers.getlist("X-Forwarded-For")[0]
  1031. else:
  1032. ip = request.remote_addr
  1033. return ip
  1034. def ACL_체크(ip, name):
  1035. m = re.search("^사용자:(.*)", name)
  1036. n = re.search("^파일:(.*)", name)
  1037. if(m):
  1038. g = m.groups()
  1039. if(ip == g[0]):
  1040. if(re.search("\.", g[0])):
  1041. return 1
  1042. else:
  1043. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  1044. rows = DB_가져오기()
  1045. if(rows):
  1046. return 1
  1047. else:
  1048. return 0
  1049. else:
  1050. return 1
  1051. elif(n):
  1052. if(not 소유자_확인() == 1):
  1053. return 1
  1054. else:
  1055. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))", ip)
  1056. if(b):
  1057. results = b.groups()
  1058. DB_실행("select * from ban where block = '" + DB_인코딩(results[0]) + "' and band = 'O'")
  1059. rowss = DB_가져오기()
  1060. if(rowss):
  1061. return 1
  1062. else:
  1063. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  1064. rows = DB_가져오기()
  1065. if(rows):
  1066. return 1
  1067. else:
  1068. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  1069. row = DB_가져오기()
  1070. if(row):
  1071. DB_실행("select * from user where id = '" + DB_인코딩(ip) + "'")
  1072. rows = DB_가져오기()
  1073. if(row[0]['acl'] == 'user'):
  1074. if(rows):
  1075. return 0
  1076. else:
  1077. return 1
  1078. elif(row[0]['acl'] == 'admin'):
  1079. if(rows):
  1080. if(rows[0]['acl'] == 'admin' or rows[0]['acl'] == 'owner'):
  1081. return 0
  1082. else:
  1083. return 1
  1084. else:
  1085. return 1
  1086. else:
  1087. return 0
  1088. else:
  1089. return 0
  1090. else:
  1091. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  1092. rows = DB_가져오기()
  1093. if(rows):
  1094. return 1
  1095. else:
  1096. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  1097. row = DB_가져오기()
  1098. if(row):
  1099. DB_실행("select * from user where id = '" + DB_인코딩(ip) + "'")
  1100. rows = DB_가져오기()
  1101. if(row[0]['acl'] == 'user'):
  1102. if(rows):
  1103. return 0
  1104. else:
  1105. return 1
  1106. elif(row[0]['acl'] == 'admin'):
  1107. if(rows):
  1108. if(rows[0]['acl'] == 'admin' or rows[0]['acl'] == 'owner'):
  1109. return 0
  1110. else:
  1111. return 1
  1112. else:
  1113. return 1
  1114. else:
  1115. return 0
  1116. else:
  1117. return 0
  1118. def 차단_체크(ip):
  1119. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))", ip)
  1120. if(b):
  1121. results = b.groups()
  1122. DB_실행("select * from ban where block = '" + DB_인코딩(results[0]) + "' and band = 'O'")
  1123. rowss = DB_가져오기()
  1124. if(rowss):
  1125. return 1
  1126. else:
  1127. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  1128. rows = DB_가져오기()
  1129. if(rows):
  1130. return 1
  1131. else:
  1132. return 0
  1133. else:
  1134. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  1135. rows = DB_가져오기()
  1136. if(rows):
  1137. return 1
  1138. else:
  1139. return 0
  1140. def 토론자_체크(ip, name, sub):
  1141. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))", ip)
  1142. if(b):
  1143. results = b.groups()
  1144. DB_실행("select * from ban where block = '" + DB_인코딩(results[0]) + "' and band = 'O'")
  1145. rowss = DB_가져오기()
  1146. if(rowss):
  1147. return 1
  1148. else:
  1149. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  1150. rows = DB_가져오기()
  1151. if(rows):
  1152. return 1
  1153. else:
  1154. DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'")
  1155. rows = DB_가져오기()
  1156. if(rows):
  1157. return 1
  1158. else:
  1159. return 0
  1160. else:
  1161. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  1162. rows = DB_가져오기()
  1163. if(rows):
  1164. return 1
  1165. else:
  1166. DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'")
  1167. rows = DB_가져오기()
  1168. if(rows):
  1169. return 1
  1170. else:
  1171. return 0
  1172. def 시간():
  1173. now = time.localtime()
  1174. s = "%04d-%02d-%02d %02d:%02d:%02d" % (now.tm_year, now.tm_mon, now.tm_mday, now.tm_hour, now.tm_min, now.tm_sec)
  1175. return s
  1176. def 최근_토론_추가(title, sub, date):
  1177. DB_실행("select * from rd where title = '" + DB_인코딩(title) + "' and sub = '" + DB_인코딩(sub) + "'")
  1178. 최근_토론 = DB_가져오기()
  1179. if(최근_토론):
  1180. DB_실행("update rd set date = '" + DB_인코딩(date) + "' where title = '" + DB_인코딩(title) + "' and sub = '" + DB_인코딩(sub) + "'")
  1181. else:
  1182. DB_실행("insert into rd (title, sub, date) value ('" + DB_인코딩(title) + "', '" + DB_인코딩(sub) + "', '" + DB_인코딩(date) + "')")
  1183. DB_갱신()
  1184. def 최근_차단_추가(block, end, today, blocker, why):
  1185. DB_실행("insert into rb (block, end, today, blocker, why) value ('" + DB_인코딩(block) + "', '" + DB_인코딩(end) + "', '" + today + "', '" + DB_인코딩(blocker) + "', '" + DB_인코딩(why) + "')")
  1186. DB_갱신()
  1187. def 역사_추가(title, data, date, ip, send, leng):
  1188. DB_실행("select * from history where title = '" + DB_인코딩(title) + "' order by id+0 desc limit 1")
  1189. rows = DB_가져오기()
  1190. if(rows):
  1191. number = int(rows[0]['id']) + 1
  1192. DB_실행("insert into history (id, title, data, date, ip, send, leng) value ('" + str(number) + "', '" + DB_인코딩(title) + "', '" + DB_인코딩(data) + "', '" + date + "', '" + DB_인코딩(ip) + "', '" + DB_인코딩(send) + "', '" + leng + "')")
  1193. DB_갱신()
  1194. else:
  1195. DB_실행("insert into history (id, title, data, date, ip, send, leng) value ('1', '" + DB_인코딩(title) + "', '" + DB_인코딩(data) + "', '" + date + "', '" + DB_인코딩(ip) + "', '" + DB_인코딩(send + ' (새 문서)') + "', '" + leng + "')")
  1196. DB_갱신()
  1197. def 길이_확인(기존, 바뀜):
  1198. if(기존 < 바뀜):
  1199. 길이 = 바뀜 - 기존
  1200. 길이 = '+' + str(길이)
  1201. elif(바뀜 < 기존):
  1202. 길이 = 기존 - 바뀜
  1203. 길이 = '-' + str(길이)
  1204. else:
  1205. 길이 = '0'
  1206. return 길이
  1207. @app.route('/upload', methods=['GET', 'POST'])
  1208. def 업로드():
  1209. app.config['MAX_CONTENT_LENGTH'] = int(data['upload']) * 1024 * 1024
  1210. if(request.method == 'POST'):
  1211. ip = 아이피_확인(request)
  1212. ban = 차단_체크(ip)
  1213. if(ban == 1):
  1214. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  1215. else:
  1216. file = request.files['file']
  1217. if(file):
  1218. if(re.search('^([^./\\*<>|:?"]+)\.([Jj][Pp][Gg]|[Gg][Ii][Ff]|[Jj][Pp][Ee][Gg]|[Pp][Nn][Gg])$', file.filename)):
  1219. filename = file.filename
  1220. if(os.path.exists(os.path.join('image', filename))):
  1221. return '<meta http-equiv="refresh" content="0;url=/error/16" />'
  1222. else:
  1223. file.save(os.path.join('image', filename))
  1224. DB_실행("insert into data (title, data, acl) value ('" + DB_인코딩('파일:' + filename) + "', '" + DB_인코딩('[[파일:' + filename + ']][br][br]{{{[[파일:' + filename + ']]}}}') + "', '')")
  1225. DB_갱신()
  1226. 역사_추가('파일:' + filename, '[[파일:' + filename + ']][br][br]{{{[[파일:' + filename + ']]}}}', 시간(), ip, '파일:' + filename + ' 업로드', '0')
  1227. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩('파일:' + filename) + '" />'
  1228. else:
  1229. return '<meta http-equiv="refresh" content="0;url=/error/15" />'
  1230. else:
  1231. return '<meta http-equiv="refresh" content="0;url=/error/14" />'
  1232. else:
  1233. ip = 아이피_확인(request)
  1234. ban = 차단_체크(ip)
  1235. if(ban == 1):
  1236. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  1237. else:
  1238. return render_template('index.html', logo = data['name'], title = '업로드', tn = 21, number = data['upload'])
  1239. @app.route('/image/<path:name>')
  1240. def 이미지(name = None):
  1241. if(os.path.exists(os.path.join('image', name))):
  1242. return send_file(os.path.join('image', name), mimetype='image')
  1243. else:
  1244. return render_template('index.html', logo = data['name'], data = '이미지 없음.', title = '이미지 보기'), 404
  1245. @app.route('/adminlist')
  1246. def 관리자_목록():
  1247. i = 0
  1248. div = '<div>'
  1249. DB_실행("select * from user where acl = 'admin' or acl = 'owner'")
  1250. rows = DB_가져오기()
  1251. if(rows):
  1252. while(True):
  1253. try:
  1254. a = rows[i]
  1255. except:
  1256. div = div + '</div>'
  1257. break
  1258. if(rows[i]['acl'] == 'owner'):
  1259. acl = '소유자'
  1260. else:
  1261. acl = '관리자'
  1262. DB_실행("select * from data where title = '사용자:" + rows[i]['id'] + "'")
  1263. user = DB_가져오기()
  1264. if(user):
  1265. name = '<a href="/w/' + URL_인코딩('사용자:' + rows[i]['id']) + '">' + rows[i]['id'] + '</a> (' + acl + ')'
  1266. else:
  1267. name = '<a class="not_thing" href="/w/' + URL_인코딩('사용자:' + rows[i]['id']) + '">' + rows[i]['id'] + '</a> (' + acl + ')'
  1268. div = div + '<li>' + str(i + 1) + '. ' + name + '</li>'
  1269. i = i + 1
  1270. return render_template('index.html', logo = data['name'], data = div, title = '관리자 목록')
  1271. else:
  1272. return render_template('index.html', logo = data['name'], title = '관리자 목록')
  1273. @app.route('/recentchanges')
  1274. def 최근바뀜():
  1275. i = 0
  1276. div = '<div>'
  1277. DB_실행("select * from history order by date desc limit 50")
  1278. rows = DB_가져오기()
  1279. if(rows):
  1280. admin = 관리자_확인()
  1281. while(True):
  1282. try:
  1283. a = rows[i]
  1284. except:
  1285. div = div + '</div>'
  1286. break
  1287. if(rows[i]['send']):
  1288. send = rows[i]['send']
  1289. send = re.sub('<a href="\/w\/(?P<in>[^"]*)">(?P<out>[^&]*)<\/a>', '<a href="/w/\g<in>">\g<out></a>', send)
  1290. else:
  1291. send = '<br>'
  1292. title = rows[i]['title']
  1293. title = re.sub('<', '&lt;', title)
  1294. title = re.sub('>', '&gt;', title)
  1295. m = re.search("\+", rows[i]['leng'])
  1296. n = re.search("\-", rows[i]['leng'])
  1297. if(m):
  1298. leng = '<span style="color:green;">' + rows[i]['leng'] + '</span>'
  1299. elif(n):
  1300. leng = '<span style="color:red;">' + rows[i]['leng'] + '</span>'
  1301. else:
  1302. leng = '<span style="color:gray;">' + rows[i]['leng'] + '</span>'
  1303. if(admin == 1):
  1304. DB_실행("select * from ban where block = '" + DB_인코딩(rows[i]['ip']) + "'")
  1305. row = DB_가져오기()
  1306. if(row):
  1307. ban = ' <a href="/ban/' + URL_인코딩(rows[i]['ip']) + '">(해제)</a>'
  1308. else:
  1309. ban = ' <a href="/ban/' + URL_인코딩(rows[i]['ip']) + '">(차단)</a>'
  1310. else:
  1311. ban = ''
  1312. if(re.search('\.', rows[i]['ip'])):
  1313. ip = rows[i]['ip'] + ' <a href="/record/' + URL_인코딩(rows[i]['ip']) + '/n/1">(기록)</a>'
  1314. else:
  1315. DB_실행("select * from data where title = '사용자:" + DB_인코딩(rows[i]['ip']) + "'")
  1316. row = DB_가져오기()
  1317. if(row):
  1318. ip = '<a href="/w/' + URL_인코딩('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a> <a href="/record/' + URL_인코딩(rows[i]['ip']) + '/n/1">(기록)</a>'
  1319. else:
  1320. ip = '<a class="not_thing" href="/w/' + URL_인코딩('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a> <a href="/record/' + URL_인코딩(rows[i]['ip']) + '/n/1">(기록)</a>'
  1321. if((int(rows[i]['id']) - 1) == 0):
  1322. revert = ''
  1323. else:
  1324. revert = '<a href="/revert/' + URL_인코딩(rows[i]['title']) + '/r/' + str(int(rows[i]['id']) - 1) + '">(되돌리기)</a>'
  1325. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;"><a href="/w/' + URL_인코딩(rows[i]['title']) + '">' + title + '</a> <a href="/history/' + URL_인코딩(rows[i]['title']) + '/n/1">(역사)</a> ' + revert + ' (' + leng + ')</td><td style="text-align: center;width:33.33%;">' + ip + ban + '</td><td style="text-align: center;width:33.33%;">' + rows[i]['date'] + '</td></tr><tr><td colspan="3" style="text-align: center;width:100%;">' + send + '</td></tr></tbody></table>'
  1326. i = i + 1
  1327. return render_template('index.html', logo = data['name'], rows = div, tn = 3, title = '최근 변경내역')
  1328. else:
  1329. return render_template('index.html', logo = data['name'], rows = '', tn = 3, title = '최근 변경내역')
  1330. @app.route('/history/<path:name>/r/<int:num>/hidden')
  1331. def 역사_숨기기(name = None, num = None):
  1332. if(소유자_확인() == 1):
  1333. DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(num)) + "'")
  1334. rows = DB_가져오기()
  1335. if(rows):
  1336. DB_실행("delete from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(num)) + "'")
  1337. else:
  1338. DB_실행("insert into hidhi (title, re) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(str(num)) + "')")
  1339. DB_갱신()
  1340. return '<meta http-equiv="refresh" content="0;url=/history/' + URL_인코딩(name) + '/n/1" />'
  1341. else:
  1342. return '<meta http-equiv="refresh" content="0;url=/history/' + URL_인코딩(name) + '/n/1" />'
  1343. @app.route('/record/<path:name>/n/<int:number>')
  1344. def 사용자_기록(name = None, number = None):
  1345. v = number * 50
  1346. i = v - 50
  1347. div = '<div>'
  1348. DB_실행("select * from history where ip = '" + DB_인코딩(name) + "' order by date desc")
  1349. rows = DB_가져오기()
  1350. if(rows):
  1351. admin = 관리자_확인()
  1352. while(True):
  1353. try:
  1354. a = rows[i]
  1355. except:
  1356. div = div + '</div>'
  1357. if(number != 1):
  1358. div = div + '<br><a href="/record/' + URL_인코딩(name) + '/n/' + str(number - 1) + '">(이전)'
  1359. break
  1360. if(rows[i]['send']):
  1361. send = rows[i]['send']
  1362. send = re.sub('<a href="\/w\/(?P<in>[^"]*)">(?P<out>[^&]*)<\/a>', '<a href="/w/\g<in>">\g<out></a>', send)
  1363. else:
  1364. send = '<br>'
  1365. title = rows[i]['title']
  1366. title = re.sub('<', '&lt;', title)
  1367. title = re.sub('>', '&gt;', title)
  1368. m = re.search("\+", rows[i]['leng'])
  1369. n = re.search("\-", rows[i]['leng'])
  1370. if(m):
  1371. leng = '<span style="color:green;">' + rows[i]['leng'] + '</span>'
  1372. elif(n):
  1373. leng = '<span style="color:red;">' + rows[i]['leng'] + '</span>'
  1374. else:
  1375. leng = '<span style="color:gray;">' + rows[i]['leng'] + '</span>'
  1376. if(admin == 1):
  1377. DB_실행("select * from ban where block = '" + DB_인코딩(rows[i]['ip']) + "'")
  1378. row = DB_가져오기()
  1379. if(row):
  1380. ban = ' <a href="/ban/' + URL_인코딩(rows[i]['ip']) + '">(해제)</a>'
  1381. else:
  1382. ban = ' <a href="/ban/' + URL_인코딩(rows[i]['ip']) + '">(차단)</a>'
  1383. else:
  1384. ban = ''
  1385. if(re.search('\.', rows[i]['ip'])):
  1386. ip = rows[i]['ip']
  1387. else:
  1388. DB_실행("select * from data where title = '사용자:" + DB_인코딩(rows[i]['ip']) + "'")
  1389. row = DB_가져오기()
  1390. if(row):
  1391. ip = '<a href="/w/' + URL_인코딩('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a>'
  1392. else:
  1393. ip = '<a class="not_thing" href="/w/' + URL_인코딩('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a>'
  1394. if((int(rows[i]['id']) - 1) == 0):
  1395. revert = ''
  1396. else:
  1397. revert = '<a href="/revert/' + URL_인코딩(rows[i]['title']) + '/r/' + str(int(rows[i]['id']) - 1) + '">(되돌리기)</a>'
  1398. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;"><a href="/w/' + URL_인코딩(rows[i]['title']) + '">' + title + '</a> r' + rows[i]['id'] + ' <a href="/history/' + URL_인코딩(rows[i]['title']) + '/n/1">(역사)</a> ' + revert + ' (' + leng + ')</td><td style="text-align: center;width:33.33%;">' + ip + ban + '</td><td style="text-align: center;width:33.33%;">' + rows[i]['date'] + '</td></tr><tr><td colspan="3" style="text-align: center;width:100%;">' + send + '</td></tr></tbody></table>'
  1399. if(i == v):
  1400. div = div + '</div>'
  1401. if(number == 1):
  1402. div = div + '<br><a href="/record/' + URL_인코딩(name) + '/n/' + str(number + 1) + '">(다음)'
  1403. else:
  1404. div = div + '<br><a href="/record/' + URL_인코딩(name) + '/n/' + str(number - 1) + '">(이전) <a href="/record/' + URL_인코딩(name) + '/n/' + str(number + 1) + '">(다음)'
  1405. break
  1406. else:
  1407. i = i + 1
  1408. return render_template('index.html', logo = data['name'], rows = div, tn = 3, title = '유저 기록')
  1409. else:
  1410. return render_template('index.html', logo = data['name'], rows = '', tn = 3, title = '유저 기록')
  1411. @app.route('/userlog/n/<int:number>')
  1412. def 모든_사용자(number = None):
  1413. 숫자_1 = number * 50
  1414. 숫자_2 = 숫자_1 - 50
  1415. 목록 = ''
  1416. DB_실행("select * from user")
  1417. 사용자_목록 = DB_가져오기()
  1418. if(사용자_목록):
  1419. 관리자 = 관리자_확인()
  1420. while(True):
  1421. try:
  1422. 임시_변수 = 사용자_목록[숫자_2]
  1423. except:
  1424. if(number != 1):
  1425. 목록 = 목록 + '<br><a href="/userlog/n/' + str(number - 1) + '">(이전)'
  1426. break
  1427. if(관리자 == 1):
  1428. DB_실행("select * from ban where block = '" + DB_인코딩(사용자_목록[숫자_2]['id']) + "'")
  1429. 차단인가 = DB_가져오기()
  1430. if(차단인가):
  1431. 차단_버튼 = ' <a href="/ban/' + URL_인코딩(사용자_목록[숫자_2]['id']) + '">(해제)</a>'
  1432. else:
  1433. 차단_버튼 = ' <a href="/ban/' + URL_인코딩(사용자_목록[숫자_2]['id']) + '">(차단)</a>'
  1434. else:
  1435. 차단_버튼 = ''
  1436. DB_실행("select * from data where title = '사용자:" + DB_인코딩(사용자_목록[숫자_2]['id']) + "'")
  1437. 자료 = DB_가져오기()
  1438. if(자료):
  1439. 아이피 = '<a href="/w/' + URL_인코딩('사용자:' + 사용자_목록[숫자_2]['id']) + '">' + 사용자_목록[숫자_2]['id'] + '</a> <a href="/record/' + URL_인코딩(사용자_목록[숫자_2]['id']) + '/n/1">(기록)</a>'
  1440. else:
  1441. 아이피 = '<a class="not_thing" href="/w/' + URL_인코딩('사용자:' + 사용자_목록[숫자_2]['id']) + '">' + 사용자_목록[숫자_2]['id'] + '</a> <a href="/record/' + URL_인코딩(사용자_목록[숫자_2]['id']) + '/n/1">(기록)</a>'
  1442. 목록 = 목록 + '<li>' + str(숫자_2 + 1) + '. ' + 아이피 + 차단_버튼 + '</li>'
  1443. if(숫자_2 == 숫자_1):
  1444. if(number == 1):
  1445. 목록 = 목록 + '<br><a href="/userlog/n/' + str(number + 1) + '">(다음)'
  1446. else:
  1447. 목록 = 목록 + '<br><a href="/userlog/n/' + str(number - 1) + '">(이전) <a href="/userlog/n/' + str(number + 1) + '">(다음)'
  1448. break
  1449. else:
  1450. 숫자_2 += 1
  1451. return render_template('index.html', logo = data['name'], data = 목록, title = '유저 가입 기록')
  1452. else:
  1453. return render_template('index.html', logo = data['name'], data = '', title = '유저 가입 기록')
  1454. @app.route('/backlink/<path:name>/n/<int:number>')
  1455. def 역링크(name = None, number = None):
  1456. v = number * 50
  1457. i = v - 50
  1458. div = ''
  1459. restart = 0
  1460. DB_실행("select * from back where title = '" + DB_인코딩(name) + "' order by link asc")
  1461. rows = DB_가져오기()
  1462. if(rows):
  1463. while(True):
  1464. try:
  1465. a = rows[i]
  1466. except:
  1467. if(number != 1):
  1468. div = div + '<br><a href="/backlink/n/' + str(number - 1) + '">(이전)'
  1469. break
  1470. if(rows[i]['type'] == 'include'):
  1471. DB_실행("select * from back where title = '" + DB_인코딩(name) + "' and link = '" + DB_인코딩(rows[i]['link']) + "' and type = ''")
  1472. test = DB_가져오기()
  1473. if(test):
  1474. restart = 1
  1475. DB_실행("delete from back where title = '" + DB_인코딩(name) + "' and link = '" + DB_인코딩(rows[i]['link']) + "' and type = ''")
  1476. DB_갱신()
  1477. if(not re.search('^사용자:', rows[i]['link'])):
  1478. DB_실행("select * from data where title = '" + DB_인코딩(rows[i]['link']) + "'")
  1479. row = DB_가져오기()
  1480. if(row):
  1481. aa = row[0]['data']
  1482. aa = re.sub("(?P<in>\[include\((?P<out>(?:(?!\)\]|,).)*)((?:,\s?(?:[^)]*))+)?\)\])", "\g<in>\n\n[[\g<out>]]\n\n", aa)
  1483. aa = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', '[[\g<in>]]', aa)
  1484. aa = 나무마크('', aa)
  1485. if(re.search("<a(?:(?:(?!href=).)*)?href=\"\/w\/" + URL_인코딩(name) + "(?:\#[^\"]*)?\">([^<]*)<\/a>", aa)):
  1486. div = div + '<li><a href="/w/' + URL_인코딩(rows[i]['link']) + '">' + rows[i]['link'] + '</a>'
  1487. if(rows[i]['type']):
  1488. div = div + ' (' + rows[i]['type'] + ')</li>'
  1489. else:
  1490. div = div + '</li>'
  1491. if(i == v):
  1492. if(number == 1):
  1493. div = div + '<br><a href="/backlink/' + URL_인코딩(name) + '/n/' + str(number + 1) + '">(다음)'
  1494. else:
  1495. div = div + '<br><a href="/backlink/' + URL_인코딩(name) + '/n/' + str(number - 1) + '">(이전) <a href="/backlink/' + URL_인코딩(name) + '/n/' + str(number + 1) + '">(다음)'
  1496. break
  1497. else:
  1498. i = i + 1
  1499. else:
  1500. DB_실행("delete from back where title = '" + DB_인코딩(name) + "' and link = '" + DB_인코딩(rows[i]['link']) + "'")
  1501. DB_갱신()
  1502. i = i + 1
  1503. v = v + 1
  1504. else:
  1505. DB_실행("delete from back where title = '" + DB_인코딩(name) + "' and link = '" + DB_인코딩(rows[i]['link']) + "'")
  1506. DB_갱신()
  1507. i = i + 1
  1508. v = v + 1
  1509. else:
  1510. DB_실행("delete from back where title = '" + DB_인코딩(name) + "' and link = '" + DB_인코딩(rows[i]['link']) + "'")
  1511. DB_갱신()
  1512. i = i + 1
  1513. v = v + 1
  1514. if(restart == 1):
  1515. return '<meta http-equiv="refresh" content="0;url=/backlink/' + URL_인코딩(name) + '/n/' + str(number) + '" />'
  1516. else:
  1517. return render_template('index.html', logo = data['name'], data = div, title = name, sub = '역링크')
  1518. else:
  1519. return render_template('index.html', logo = data['name'], data = '', title = name, sub = '역링크')
  1520. @app.route('/recentdiscuss')
  1521. def 최근_토론():
  1522. i = 0
  1523. div = '<div>'
  1524. DB_실행("select * from rd order by date desc limit 50")
  1525. rows = DB_가져오기()
  1526. if(rows):
  1527. while(True):
  1528. try:
  1529. a = rows[i]
  1530. except:
  1531. div = div + '</div>'
  1532. break
  1533. title = rows[i]['title']
  1534. title = re.sub('<', '&lt;', title)
  1535. title = re.sub('>', '&gt;', title)
  1536. sub = rows[i]['sub']
  1537. sub = re.sub('<', '&lt;', sub)
  1538. sub = re.sub('>', '&gt;', sub)
  1539. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:50%;"><a href="/topic/' + URL_인코딩(rows[i]['title']) + '/sub/' + URL_인코딩(rows[i]['sub']) + '">' + title + '</a> (' + sub + ')</td><td style="text-align: center;width:50%;">' + rows[i]['date'] + '</td></tr></tbody></table>'
  1540. i = i + 1
  1541. return render_template('index.html', logo = data['name'], rows = div, tn = 12, title = '최근 토론내역')
  1542. else:
  1543. return render_template('index.html', logo = data['name'], rows = '', tn = 12, title = '최근 토론내역')
  1544. @app.route('/blocklog/n/<int:number>')
  1545. def blocklog(number = None):
  1546. v = number * 50
  1547. i = v - 50
  1548. div = '<div>'
  1549. DB_실행("select * from rb order by today desc")
  1550. rows = DB_가져오기()
  1551. if(rows):
  1552. while(True):
  1553. try:
  1554. a = rows[i]
  1555. except:
  1556. div = div + '</div>'
  1557. if(number != 1):
  1558. div = div + '<br><a href="/blocklog/n/' + str(number - 1) + '">(이전)'
  1559. break
  1560. why = rows[i]['why']
  1561. why = re.sub('<', '&lt;', why)
  1562. why = re.sub('>', '&gt;', why)
  1563. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))$", rows[i]['block'])
  1564. if(b):
  1565. ip = rows[i]['block'] + ' (대역)'
  1566. else:
  1567. ip = rows[i]['block']
  1568. div = div + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:20%;">' + ip + '</a></td><td style="text-align: center;width:20%;">' + rows[i]['blocker'] + '</td><td style="text-align: center;width:20%;">' + rows[i]['end'] + '</td><td style="text-align: center;width:20%;">' + rows[i]['why'] + '</td><td style="text-align: center;width:20%;">' + rows[i]['today'] + '</td></tr></tbody></table>'
  1569. if(i == v):
  1570. div = div + '</div>'
  1571. if(number == 1):
  1572. div = div + '<br><a href="/blocklog/n/' + str(number + 1) + '">(다음)'
  1573. else:
  1574. div = div + '<br><a href="/blocklog/n/' + str(number - 1) + '">(이전) <a href="/blocklog/n/' + str(number + 1) + '">(다음)'
  1575. break
  1576. else:
  1577. i = i + 1
  1578. return render_template('index.html', logo = data['name'], rows = div, tn = 20, title = '유저 차단 기록')
  1579. else:
  1580. return render_template('index.html', logo = data['name'], rows = '', tn = 20, title = '유저 차단 기록')
  1581. @app.route('/history/<path:name>/n/<int:number>', methods=['POST', 'GET'])
  1582. def 역사_보기(name = None, number = None):
  1583. if(request.method == 'POST'):
  1584. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '/r/' + request.form["b"] + '/diff/' + request.form["a"] + '" />'
  1585. else:
  1586. select = ''
  1587. v = number * 50
  1588. i = v - 50
  1589. div = '<div>'
  1590. DB_실행("select * from history where title = '" + DB_인코딩(name) + "' order by id+0 desc")
  1591. rows = DB_가져오기()
  1592. if(rows):
  1593. admin = 관리자_확인()
  1594. while(True):
  1595. style = ''
  1596. try:
  1597. a = rows[i]
  1598. except:
  1599. div = div + '</div>'
  1600. if(number != 1):
  1601. div = div + '<br><a href="/history/' + URL_인코딩(name) + '/n/' + str(number - 1) + '">(이전)'
  1602. break
  1603. select = '<option value="' + str(i + 1) + '">' + str(i + 1) + '</option>' + select
  1604. if(rows[i]['send']):
  1605. send = rows[i]['send']
  1606. send = re.sub('<a href="\/w\/(?P<in>[^"]*)">(?P<out>[^&]*)<\/a>', '<a href="/w/\g<in>">\g<out></a>', send)
  1607. else:
  1608. send = '<br>'
  1609. m = re.search("\+", rows[i]['leng'])
  1610. n = re.search("\-", rows[i]['leng'])
  1611. if(m):
  1612. leng = '<span style="color:green;">' + rows[i]['leng'] + '</span>'
  1613. elif(n):
  1614. leng = '<span style="color:red;">' + rows[i]['leng'] + '</span>'
  1615. else:
  1616. leng = '<span style="color:gray;">' + rows[i]['leng'] + '</span>'
  1617. if(re.search("\.", rows[i]["ip"])):
  1618. ip = rows[i]["ip"] + ' <a href="/record/' + URL_인코딩(rows[i]["ip"]) + '/n/1">(기록)</a>'
  1619. else:
  1620. DB_실행("select * from data where title = '사용자:" + DB_인코딩(rows[i]['ip']) + "'")
  1621. row = DB_가져오기()
  1622. if(row):
  1623. ip = '<a href="/w/' + URL_인코딩('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a> <a href="/record/' + URL_인코딩(rows[i]["ip"]) + '/n/1">(기록)</a>'
  1624. else:
  1625. ip = '<a class="not_thing" href="/w/' + URL_인코딩('사용자:' + rows[i]['ip']) + '">' + rows[i]['ip'] + '</a> <a href="/record/' + URL_인코딩(rows[i]["ip"]) + '/n/1">(기록)</a>'
  1626. if(admin == 1):
  1627. DB_실행("select * from user where id = '" + DB_인코딩(rows[i]['ip']) + "'")
  1628. row = DB_가져오기()
  1629. if(row):
  1630. if(row[0]['acl'] == 'owner' or row[0]['acl'] == 'admin'):
  1631. ban = ''
  1632. else:
  1633. DB_실행("select * from ban where block = '" + DB_인코딩(rows[i]['ip']) + "'")
  1634. row = DB_가져오기()
  1635. if(row):
  1636. ban = ' <a href="/ban/' + URL_인코딩(rows[i]['ip']) + '">(해제)</a>'
  1637. else:
  1638. ban = ' <a href="/ban/' + URL_인코딩(rows[i]['ip']) + '">(차단)</a>'
  1639. else:
  1640. DB_실행("select * from ban where block = '" + DB_인코딩(rows[i]['ip']) + "'")
  1641. row = DB_가져오기()
  1642. if(row):
  1643. ban = ' <a href="/ban/' + URL_인코딩(rows[i]['ip']) + '">(해제)</a>'
  1644. else:
  1645. ban = ' <a href="/ban/' + URL_인코딩(rows[i]['ip']) + '">(차단)</a>'
  1646. if(소유자_확인() == 1):
  1647. DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(rows[i]['id']) + "'")
  1648. row = DB_가져오기()
  1649. if(row):
  1650. ip = ip + ' (숨김)'
  1651. hidden = ' <a href="/history/' + URL_인코딩(name) + '/r/' + rows[i]['id'] + '/hidden">(공개)'
  1652. else:
  1653. hidden = ' <a href="/history/' + URL_인코딩(name) + '/r/' + rows[i]['id'] + '/hidden">(숨김)'
  1654. else:
  1655. DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(rows[i]['id']) + "'")
  1656. row = DB_가져오기()
  1657. if(row):
  1658. ip = '숨김'
  1659. hidden = ''
  1660. send = '숨김'
  1661. ban = ''
  1662. style = 'display:none;'
  1663. v = v + 1
  1664. else:
  1665. hidden = ''
  1666. else:
  1667. ban = ''
  1668. DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(rows[i]['id']) + "'")
  1669. row = DB_가져오기()
  1670. if(row):
  1671. ip = '숨김'
  1672. hidden = ''
  1673. send = '숨김'
  1674. ban = ''
  1675. style = 'display:none;'
  1676. v = v + 1
  1677. else:
  1678. hidden = ''
  1679. div = div + '<table style="width: 100%;' + style + '"><tbody><tr><td style="text-align: center;width:33.33%;">r' + rows[i]['id'] + '</a> <a href="/w/' + URL_인코딩(rows[i]['title']) + '/r/' + rows[i]['id'] + '">(w)</a> <a href="/w/' + URL_인코딩(rows[i]['title']) + '/raw/' + rows[i]['id'] + '">(Raw)</a> <a href="/revert/' + URL_인코딩(rows[i]['title']) + '/r/' + rows[i]['id'] + '">(되돌리기)</a> (' + leng + ')</td><td style="text-align: center;width:33.33%;">' + ip + ban + hidden + '</td><td style="text-align: center;width:33.33%;">' + rows[i]['date'] + '</td></tr><tr><td colspan="3" style="text-align: center;width:100%;">' + send + '</td></tr></tbody></table>'
  1680. if(i == v):
  1681. div = div + '</div>'
  1682. if(number == 1):
  1683. div = div + '<br><a href="/history/' + URL_인코딩(name) + '/n/' + str(number + 1) + '">(다음)'
  1684. else:
  1685. div = div + '<br><a href="/history/' + URL_인코딩(name) + '/n/' + str(number - 1) + '">(이전) <a href="/history/' + URL_인코딩(name) + '/n/' + str(number + 1) + '">(다음)'
  1686. break
  1687. else:
  1688. i = i + 1
  1689. return render_template('index.html', logo = data['name'], rows = div, tn = 5, title = name, page = URL_인코딩(name), select = select, sub = '역사')
  1690. else:
  1691. return render_template('index.html', logo = data['name'], rows = '', tn = 5, title = name, page = URL_인코딩(name), select = select, sub = '역사')
  1692. @app.route('/search', methods=['POST'])
  1693. def search():
  1694. DB_실행("select * from data where title = '" + DB_인코딩(request.form["search"]) + "'")
  1695. rows = DB_가져오기()
  1696. if(rows):
  1697. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(request.form["search"]) + '" />'
  1698. else:
  1699. DB_실행("select * from data where title like '%" + DB_인코딩(request.form["search"]) + "%'")
  1700. rows = DB_가져오기()
  1701. if(rows):
  1702. i = 0
  1703. div = '<li>문서가 없습니다. <a href="/w/' + URL_인코딩(request.form["search"]) + '">바로가기</a></li><br>'
  1704. while(True):
  1705. try:
  1706. div = div + '<li><a href="/w/' + URL_인코딩(rows[i]['title']) + '">' + rows[i]['title'] + '</a></li>'
  1707. except:
  1708. break
  1709. i = i + 1
  1710. else:
  1711. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(request.form["search"]) + '" />'
  1712. return render_template('index.html', logo = data['name'], data = div, title = '검색')
  1713. @app.route('/w/<path:name>')
  1714. @app.route('/w/<path:name>/from/<path:redirect>')
  1715. def w(name = None, redirect = None):
  1716. i = 0
  1717. DB_실행("select * from rd where title = '" + DB_인코딩(name) + "' order by date asc")
  1718. rows = DB_가져오기()
  1719. while(True):
  1720. try:
  1721. a = rows[i]
  1722. except:
  1723. topic = ""
  1724. break
  1725. DB_실행("select * from stop where title = '" + DB_인코딩(rows[i]['title']) + "' and sub = '" + DB_인코딩(rows[i]['sub']) + "' and close = 'O'")
  1726. row = DB_가져오기()
  1727. if(not row):
  1728. topic = "open"
  1729. break
  1730. else:
  1731. i = i + 1
  1732. acl = ''
  1733. m = re.search("^(.*)\/(.*)$", name)
  1734. if(m):
  1735. g = m.groups()
  1736. uppage = g[0]
  1737. style = ""
  1738. else:
  1739. uppage = ""
  1740. style = "display:none;"
  1741. if(re.search("^분류:", name)):
  1742. DB_실행("select * from cat where title = '" + DB_인코딩(name) + "' order by cat asc")
  1743. rows = DB_가져오기()
  1744. if(rows):
  1745. div = ''
  1746. i = 0
  1747. while(True):
  1748. try:
  1749. a = rows[i]
  1750. except:
  1751. break
  1752. DB_실행("select * from data where title = '" + DB_인코딩(rows[i]['cat']) + "'")
  1753. row = DB_가져오기()
  1754. if(row):
  1755. aa = row[0]['data']
  1756. aa = 나무마크('', aa)
  1757. bb = re.search('<div style="width:100%;border: 1px solid #777;padding: 5px;margin-top: 1em;">분류:((?:(?!<\/div>).)*)<\/div>', aa)
  1758. if(bb):
  1759. cc = bb.groups()
  1760. mm = re.search("^분류:(.*)", name)
  1761. if(mm):
  1762. ee = mm.groups()
  1763. if(re.search("<a (class=\"not_thing\")? href=\"\/w\/" + URL_인코딩(name) + "\">" + ee[0] + "<\/a>", cc[0])):
  1764. div = div + '<li><a href="/w/' + URL_인코딩(rows[i]['cat']) + '">' + rows[i]['cat'] + '</a></li>'
  1765. i = i + 1
  1766. else:
  1767. DB_실행("delete from cat where title = '" + DB_인코딩(name) + "' and cat = '" + DB_인코딩(rows[i]['cat']) + "'")
  1768. DB_갱신()
  1769. i = i + 1
  1770. else:
  1771. DB_실행("delete from cat where title = '" + DB_인코딩(name) + "' and cat = '" + DB_인코딩(rows[i]['cat']) + "'")
  1772. DB_갱신()
  1773. i = i + 1
  1774. else:
  1775. DB_실행("delete from cat where title = '" + DB_인코딩(name) + "' and cat = '" + DB_인코딩(rows[i]['cat']) + "'")
  1776. DB_갱신()
  1777. i = i + 1
  1778. else:
  1779. DB_실행("delete from cat where title = '" + DB_인코딩(name) + "' and cat = '" + DB_인코딩(rows[i]['cat']) + "'")
  1780. DB_갱신()
  1781. i = i + 1
  1782. div = '<h2>분류</h2>' + div
  1783. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  1784. bb = DB_가져오기()
  1785. if(bb):
  1786. if(bb[0]['acl'] == 'admin'):
  1787. acl = '(관리자)'
  1788. elif(bb[0]['acl'] == 'user'):
  1789. acl = '(유저)'
  1790. else:
  1791. if(not acl):
  1792. acl = ''
  1793. enddata = 나무마크(name, bb[0]['data'])
  1794. m = re.search('<div id="toc">((?:(?!\/div>).)*)<\/div>', enddata)
  1795. if(m):
  1796. result = m.groups()
  1797. left = result[0]
  1798. else:
  1799. left = ''
  1800. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = enddata + '<br>' + div, license = data['license'], tn = 1, uppage = uppage, style = style, acl = acl, topic = topic, redirect = redirect, login = 로그인_확인())
  1801. else:
  1802. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = div, license = data['license'], tn = 1, uppage = uppage, style = style, acl = acl, topic = topic, redirect = redirect, login = 로그인_확인())
  1803. else:
  1804. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = '분류 문서 없음', license = data['license'], tn = 1, uppage = uppage, style = style, acl = acl, topic = topic, redirect = redirect, login = 로그인_확인()), 404
  1805. else:
  1806. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  1807. rows = DB_가져오기()
  1808. if(rows):
  1809. if(rows[0]['acl'] == 'admin'):
  1810. acl = '(관리자)'
  1811. elif(rows[0]['acl'] == 'user'):
  1812. acl = '(유저)'
  1813. else:
  1814. if(not acl):
  1815. acl = ''
  1816. m = re.search("^사용자:(.*)", name)
  1817. if(m):
  1818. g = m.groups()
  1819. DB_실행("select * from user where id = '" + DB_인코딩(g[0]) + "'")
  1820. test = DB_가져오기()
  1821. if(test):
  1822. if(test[0]['acl'] == 'owner'):
  1823. acl = '(소유자)'
  1824. elif(test[0]['acl'] == 'admin'):
  1825. acl = '(관리자)'
  1826. DB_실행("select * from ban where block = '" + DB_인코딩(g[0]) + "'")
  1827. user = DB_가져오기()
  1828. if(user):
  1829. elsedata = '{{{#!wiki style="border:2px solid red;padding:10px;"\r\n{{{+2 {{{#red 이 사용자는 차단 당했습니다.}}}}}}\r\n\r\n차단 해제 일 : ' + user[0]['end'] + '[br]사유 : ' + user[0]['why'] + '}}}[br]' + rows[0]['data']
  1830. else:
  1831. elsedata = rows[0]['data']
  1832. else:
  1833. elsedata = rows[0]['data']
  1834. enddata = 나무마크(name, elsedata)
  1835. m = re.search('<div id="toc">((?:(?!\/div>).)*)<\/div>', enddata)
  1836. if(m):
  1837. result = m.groups()
  1838. left = result[0]
  1839. else:
  1840. left = ''
  1841. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license'], tn = 1, acl = acl, left = left, uppage = uppage, style = style, topic = topic, redirect = redirect, login = 로그인_확인())
  1842. else:
  1843. m = re.search("^사용자:(.*)", name)
  1844. if(m):
  1845. g = m.groups()
  1846. DB_실행("select * from ban where block = '" + DB_인코딩(g[0]) + "'")
  1847. user = DB_가져오기()
  1848. if(user):
  1849. elsedata = '{{{#!wiki style="border:2px solid red;padding:10px;"\r\n{{{+2 {{{#red 이 사용자는 차단 당했습니다.}}}}}}\r\n\r\n차단 해제 일 : ' + user[0]['end'] + '[br]사유 : ' + user[0]['why'] + '}}}[br]' + '문서 없음'
  1850. else:
  1851. elsedata = '문서 없음'
  1852. else:
  1853. elsedata = '문서 없음'
  1854. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = 나무마크(name, elsedata), license = data['license'], tn = 1, uppage = uppage, style = style, acl = acl, topic = topic, redirect = redirect, login = 로그인_확인()), 404
  1855. @app.route('/w/<path:name>/r/<int:number>')
  1856. def rew(name = None, number = None):
  1857. DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(number)) + "'")
  1858. row = DB_가져오기()
  1859. if(row):
  1860. if(소유자_확인() == 1):
  1861. DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'")
  1862. rows = DB_가져오기()
  1863. if(rows):
  1864. enddata = 나무마크(name, rows[0]['data'])
  1865. m = re.search('<div id="toc">((?:(?!\/div>).)*)<\/div>', enddata)
  1866. if(m):
  1867. result = m.groups()
  1868. left = result[0]
  1869. else:
  1870. left = ''
  1871. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license'], tn = 6, left = left, sub = '옛 문서')
  1872. else:
  1873. return '<meta http-equiv="refresh" content="0;url=/history/' + URL_인코딩(name) + '" />'
  1874. else:
  1875. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  1876. else:
  1877. DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'")
  1878. rows = DB_가져오기()
  1879. if(rows):
  1880. enddata = 나무마크(name, rows[0]['data'])
  1881. m = re.search('<div id="toc">((?:(?!\/div>).)*)<\/div>', enddata)
  1882. if(m):
  1883. result = m.groups()
  1884. left = result[0]
  1885. else:
  1886. left = ''
  1887. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license'], tn = 6, left = left, sub = '옛 문서')
  1888. else:
  1889. return '<meta http-equiv="refresh" content="0;url=/history/' + URL_인코딩(name) + '" />'
  1890. @app.route('/w/<path:name>/raw/<int:number>')
  1891. def reraw(name = None, number = None):
  1892. DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(number)) + "'")
  1893. row = DB_가져오기()
  1894. if(row):
  1895. if(소유자_확인() == 1):
  1896. DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'")
  1897. rows = DB_가져오기()
  1898. if(rows):
  1899. enddata = re.sub('<', '&lt;', rows[0]['data'])
  1900. enddata = re.sub('>', '&gt;', enddata)
  1901. enddata = re.sub('"', '&quot;', enddata)
  1902. enddata = '<pre>' + enddata + '</pre>'
  1903. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license'])
  1904. else:
  1905. return '<meta http-equiv="refresh" content="0;url=/history/' + URL_인코딩(name) + '" />'
  1906. else:
  1907. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  1908. else:
  1909. DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'")
  1910. rows = DB_가져오기()
  1911. if(rows):
  1912. enddata = re.sub('<', '&lt;', rows[0]['data'])
  1913. enddata = re.sub('>', '&gt;', enddata)
  1914. enddata = re.sub('"', '&quot;', enddata)
  1915. enddata = '<pre>' + enddata + '</pre>'
  1916. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license'])
  1917. else:
  1918. return '<meta http-equiv="refresh" content="0;url=/history/' + URL_인코딩(name) + '" />'
  1919. @app.route('/raw/<path:name>')
  1920. def raw(name = None):
  1921. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  1922. rows = DB_가져오기()
  1923. if(rows):
  1924. enddata = re.sub('<', '&lt;', rows[0]['data'])
  1925. enddata = re.sub('>', '&gt;', enddata)
  1926. enddata = re.sub('"', '&quot;', enddata)
  1927. enddata = '<pre>' + enddata + '</pre>'
  1928. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = enddata, license = data['license'], tn = 7, sub = 'Raw')
  1929. else:
  1930. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  1931. @app.route('/revert/<path:name>/r/<int:number>', methods=['POST', 'GET'])
  1932. def revert(name = None, number = None):
  1933. if(request.method == 'POST'):
  1934. DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(number)) + "'")
  1935. row = DB_가져오기()
  1936. if(row):
  1937. if(소유자_확인() == 1):
  1938. DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'")
  1939. rows = DB_가져오기()
  1940. if(rows):
  1941. ip = 아이피_확인(request)
  1942. can = ACL_체크(ip, name)
  1943. if(can == 1):
  1944. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  1945. else:
  1946. today = 시간()
  1947. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  1948. row = DB_가져오기()
  1949. if(row):
  1950. leng = 길이_확인(len(row[0]['data']), len(rows[0]['data']))
  1951. DB_실행("update data set data = '" + DB_인코딩(rows[0]['data']) + "' where title = '" + DB_인코딩(name) + "'")
  1952. DB_갱신()
  1953. else:
  1954. leng = '+' + str(len(rows[0]['data']))
  1955. DB_실행("insert into data (title, data, acl) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(rows[0]['data']) + "', '')")
  1956. DB_갱신()
  1957. 역사_추가(name, rows[0]['data'], today, ip, '문서를 ' + str(number) + '판으로 되돌렸습니다.', leng)
  1958. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  1959. else:
  1960. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  1961. else:
  1962. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  1963. else:
  1964. DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'")
  1965. rows = DB_가져오기()
  1966. if(rows):
  1967. ip = 아이피_확인(request)
  1968. can = ACL_체크(ip, name)
  1969. if(can == 1):
  1970. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  1971. else:
  1972. today = 시간()
  1973. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  1974. row = DB_가져오기()
  1975. if(row):
  1976. leng = 길이_확인(len(row[0]['data']), len(rows[0]['data']))
  1977. DB_실행("update data set data = '" + DB_인코딩(rows[0]['data']) + "' where title = '" + DB_인코딩(name) + "'")
  1978. DB_갱신()
  1979. else:
  1980. leng = '+' + str(len(rows[0]['data']))
  1981. DB_실행("insert into data (title, data, acl) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(rows[0]['data']) + "', '')")
  1982. DB_갱신()
  1983. 역사_추가(name, rows[0]['data'], today, ip, '문서를 ' + str(number) + '판으로 되돌렸습니다.', leng)
  1984. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  1985. else:
  1986. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  1987. else:
  1988. DB_실행("select * from hidhi where title = '" + DB_인코딩(name) + "' and re = '" + DB_인코딩(str(number)) + "'")
  1989. row = DB_가져오기()
  1990. if(row):
  1991. if(소유자_확인() == 1):
  1992. ip = 아이피_확인(request)
  1993. can = ACL_체크(ip, name)
  1994. if(can == 1):
  1995. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  1996. else:
  1997. DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'")
  1998. rows = DB_가져오기()
  1999. if(rows):
  2000. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), r = URL_인코딩(str(number)), tn = 13, plus = '정말 되돌리시겠습니까?', sub = '되돌리기', login = 로그인_확인())
  2001. else:
  2002. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2003. else:
  2004. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2005. else:
  2006. ip = 아이피_확인(request)
  2007. can = ACL_체크(ip, name)
  2008. if(can == 1):
  2009. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2010. else:
  2011. DB_실행("select * from history where title = '" + DB_인코딩(name) + "' and id = '" + str(number) + "'")
  2012. rows = DB_가져오기()
  2013. if(rows):
  2014. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), r = URL_인코딩(str(number)), tn = 13, plus = '정말 되돌리시겠습니까?', sub = '되돌리기', login = 로그인_확인())
  2015. else:
  2016. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2017. @app.route('/edit/<path:name>', methods=['POST', 'GET'])
  2018. def edit(name = None):
  2019. if(request.method == 'POST'):
  2020. m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.form["send"])
  2021. if(m):
  2022. return '<meta http-equiv="refresh" content="0;url=/error/17" />'
  2023. else:
  2024. today = 시간()
  2025. content = 세이브마크(request.form["content"])
  2026. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  2027. rows = DB_가져오기()
  2028. if(rows):
  2029. if(rows[0]['data'] == content):
  2030. return '<meta http-equiv="refresh" content="0;url=/error/18" />'
  2031. else:
  2032. ip = 아이피_확인(request)
  2033. can = ACL_체크(ip, name)
  2034. if(can == 1):
  2035. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2036. else:
  2037. leng = 길이_확인(len(rows[0]['data']), len(content))
  2038. 역사_추가(name, content, today, ip, request.form["send"], leng)
  2039. DB_실행("update data set data = '" + DB_인코딩(content) + "' where title = '" + DB_인코딩(name) + "'")
  2040. DB_갱신()
  2041. else:
  2042. ip = 아이피_확인(request)
  2043. can = ACL_체크(ip, name)
  2044. if(can == 1):
  2045. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2046. else:
  2047. leng = '+' + str(len(content))
  2048. 역사_추가(name, content, today, ip, request.form["send"], leng)
  2049. DB_실행("insert into data (title, data, acl) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(content) + "', '')")
  2050. DB_갱신()
  2051. 틀_확인(name, content)
  2052. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2053. else:
  2054. ip = 아이피_확인(request)
  2055. can = ACL_체크(ip, name)
  2056. if(can == 1):
  2057. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2058. else:
  2059. DB_실행("select * from data where title = '" + DB_인코딩(data["help"]) + "'")
  2060. rows = DB_가져오기()
  2061. if(rows):
  2062. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * \g<in> 문서로 넘겨주기', rows[0]["data"])
  2063. left = 나무마크(name, newdata)
  2064. else:
  2065. left = ''
  2066. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  2067. rows = DB_가져오기()
  2068. if(rows):
  2069. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = rows[0]['data'], tn = 2, left = left, sub = '편집', login = 로그인_확인())
  2070. else:
  2071. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = '', tn = 2, left = left, sub = '편집', login = 로그인_확인())
  2072. @app.route('/edit/<path:name>/section/<int:number>', methods=['POST', 'GET'])
  2073. def secedit(name = None, number = None):
  2074. if(request.method == 'POST'):
  2075. m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.form["send"])
  2076. if(m):
  2077. return '<meta http-equiv="refresh" content="0;url=/error/17" />'
  2078. else:
  2079. today = 시간()
  2080. content = 세이브마크(request.form["content"])
  2081. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  2082. rows = DB_가져오기()
  2083. if(rows):
  2084. if(request.form["otent"] == content):
  2085. return '<meta http-equiv="refresh" content="0;url=/error/18" />'
  2086. else:
  2087. ip = 아이피_확인(request)
  2088. can = ACL_체크(ip, name)
  2089. if(can == 1):
  2090. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2091. else:
  2092. leng = 길이_확인(len(request.form['otent']), len(content))
  2093. content = rows[0]['data'].replace(request.form['otent'], content)
  2094. 역사_추가(name, content, today, ip, request.form["send"], leng)
  2095. DB_실행("update data set data = '" + DB_인코딩(content) + "' where title = '" + DB_인코딩(name) + "'")
  2096. DB_갱신()
  2097. 틀_확인(name, content)
  2098. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2099. else:
  2100. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2101. else:
  2102. ip = 아이피_확인(request)
  2103. can = ACL_체크(ip, name)
  2104. if(can == 1):
  2105. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2106. else:
  2107. DB_실행("select * from data where title = '" + DB_인코딩(data["help"]) + "'")
  2108. rows = DB_가져오기()
  2109. if(rows):
  2110. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * \g<in> 문서로 넘겨주기', rows[0]["data"])
  2111. left = 나무마크(name, newdata)
  2112. else:
  2113. left = ''
  2114. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  2115. rows = DB_가져오기()
  2116. if(rows):
  2117. i = 0
  2118. j = 0
  2119. gdata = rows[0]['data'] + '\r\n'
  2120. while(True):
  2121. m = re.search("((?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n(?:(?:(?:(?!(?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n).)*)(?:\n)?)+)", gdata)
  2122. if(m):
  2123. if(i == number - 1):
  2124. g = m.groups()
  2125. gdata = re.sub("\r\n$", "", g[0])
  2126. break
  2127. else:
  2128. gdata = re.sub("((?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n(?:(?:(?:(?!(?:={1,6})\s?(?:[^=]*)\s?(?:={1,6})(?:\s+)?\n).)*)(?:\n)?)+)", "", gdata, 1)
  2129. i = i + 1
  2130. else:
  2131. j = 1
  2132. break
  2133. if(j == 0):
  2134. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = gdata, tn = 2, left = left, section = 1, number = number, sub = '편집', login = 로그인_확인())
  2135. else:
  2136. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2137. else:
  2138. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2139. @app.route('/preview/<path:name>', methods=['POST'])
  2140. def 미리보기(name = None):
  2141. ip = 아이피_확인(request)
  2142. can = ACL_체크(ip, name)
  2143. if(can == 1):
  2144. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2145. else:
  2146. newdata = request.form["content"]
  2147. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * \g<in> 문서로 넘겨주기', newdata)
  2148. enddata = 나무마크(name, newdata)
  2149. DB_실행("select * from data where title = '" + DB_인코딩(data["help"]) + "'")
  2150. rows = DB_가져오기()
  2151. if(rows):
  2152. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * \g<in> 문서로 넘겨주기', rows[0]["data"])
  2153. left = 나무마크(name, newdata)
  2154. else:
  2155. left = ''
  2156. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = request.form["content"], tn = 2, preview = 1, enddata = enddata, left = left, sub = '미리보기', login = 로그인_확인())
  2157. @app.route('/preview/<path:name>/section/<int:number>', methods=['POST'])
  2158. def 문단_미리보기(name = None, number = None):
  2159. ip = 아이피_확인(request)
  2160. can = ACL_체크(ip, name)
  2161. if(can == 1):
  2162. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2163. else:
  2164. if(re.search('\.', ip)):
  2165. notice = '비 로그인 상태 입니다. 비 로그인으로 편집시 아이피가 역사에 기록 됩니다. 편집 시 동의 함으로 간주 됩니다.'
  2166. else:
  2167. notice = ''
  2168. newdata = request.form["content"]
  2169. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * \g<in> 문서로 넘겨주기', newdata)
  2170. enddata = 나무마크(name, newdata)
  2171. DB_실행("select * from data where title = '" + DB_인코딩(data["help"]) + "'")
  2172. rows = DB_가져오기()
  2173. if(rows):
  2174. newdata = re.sub('^#(?:redirect|넘겨주기)\s(?P<in>[^\n]*)', ' * \g<in> 문서로 넘겨주기', rows[0]["data"])
  2175. left = 나무마크(name, newdata)
  2176. else:
  2177. left = ''
  2178. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), data = request.form["content"], tn = 2, preview = 1, enddata = enddata, left = left, notice = notice, section = 1, number = number, odata = request.form["otent"], sub = '미리보기')
  2179. @app.route('/delete/<path:name>', methods=['POST', 'GET'])
  2180. def 문서_삭제(name = None):
  2181. if(request.method == 'POST'):
  2182. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  2183. rows = DB_가져오기()
  2184. if(rows):
  2185. ip = 아이피_확인(request)
  2186. can = ACL_체크(ip, name)
  2187. if(can == 1):
  2188. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2189. else:
  2190. today = 시간()
  2191. leng = '-' + str(len(rows[0]['data']))
  2192. 역사_추가(name, '', today, ip, '문서를 삭제 했습니다.', leng)
  2193. DB_실행("delete from data where title = '" + DB_인코딩(name) + "'")
  2194. DB_갱신()
  2195. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2196. else:
  2197. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2198. else:
  2199. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  2200. rows = DB_가져오기()
  2201. if(rows):
  2202. ip = 아이피_확인(request)
  2203. can = ACL_체크(ip, name)
  2204. if(can == 1):
  2205. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2206. else:
  2207. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), tn = 8, plus = '정말 삭제 하시겠습니까?', sub = '삭제', login = 로그인_확인())
  2208. else:
  2209. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2210. @app.route('/move/<path:name>', methods=['POST', 'GET'])
  2211. def 문서_이동(name = None):
  2212. if(request.method == 'POST'):
  2213. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  2214. rows = DB_가져오기()
  2215. if(rows):
  2216. ip = 아이피_확인(request)
  2217. can = ACL_체크(ip, name)
  2218. if(can == 1):
  2219. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2220. else:
  2221. today = 시간()
  2222. leng = '0'
  2223. DB_실행("select * from history where title = '" + DB_인코딩(request.form["title"]) + "'")
  2224. row = DB_가져오기()
  2225. if(row):
  2226. return '<meta http-equiv="refresh" content="0;url=/error/19" />'
  2227. else:
  2228. 역사_추가(name, rows[0]['data'], today, ip, '<a href="/w/' + URL_인코딩(name) + '">' + name + '</a> 문서를 <a href="/w/' + URL_인코딩(request.form["title"]) + '">' + request.form["title"] + '</a> 문서로 이동 했습니다.', leng)
  2229. DB_실행("update data set title = '" + DB_인코딩(request.form["title"]) + "' where title = '" + DB_인코딩(name) + "'")
  2230. DB_실행("update history set title = '" + DB_인코딩(request.form["title"]) + "' where title = '" + DB_인코딩(name) + "'")
  2231. DB_갱신()
  2232. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(request.form["title"]) + '" />'
  2233. else:
  2234. ip = 아이피_확인(request)
  2235. can = ACL_체크(ip, name)
  2236. if(can == 1):
  2237. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2238. else:
  2239. today = 시간()
  2240. leng = '0'
  2241. DB_실행("select * from history where title = '" + DB_인코딩(request.form["title"]) + "'")
  2242. row = DB_가져오기()
  2243. if(row):
  2244. return '<meta http-equiv="refresh" content="0;url=/error/19" />'
  2245. else:
  2246. 역사_추가(name, '', today, ip, '<a href="/w/' + URL_인코딩(name) + '">' + name + '</a> 문서를 <a href="/w/' + URL_인코딩(request.form["title"]) + '">' + request.form["title"] + '</a> 문서로 이동 했습니다.', leng)
  2247. DB_실행("update history set title = '" + DB_인코딩(request.form["title"]) + "' where title = '" + DB_인코딩(name) + "'")
  2248. DB_갱신()
  2249. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(request.form["title"]) + '" />'
  2250. else:
  2251. ip = 아이피_확인(request)
  2252. can = ACL_체크(ip, name)
  2253. if(can == 1):
  2254. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2255. else:
  2256. return render_template('index.html', title = name, logo = data['name'], page = URL_인코딩(name), tn = 9, plus = '정말 이동 하시겠습니까?', sub = '이동', login = 로그인_확인())
  2257. @app.route('/other')
  2258. def 나머지():
  2259. return render_template('index.html', title = '기타 메뉴', logo = data['name'], data = '<h2 style="margin-top: 0px;">기록</h2><li><a href="/blocklog/n/1">유저 차단 기록</a></li><li><a href="/userlog/n/1">유저 가입 기록</a></li><li><a href="/manager/6">유저 기록</a></li><h2>기타</h2><li><a href="/titleindex">모든 문서</a></li><li><a href="/upload">업로드</a></li><li><a href="/adminlist">관리자 목록</a></li><li><a href="/manager/1">관리자 메뉴</a></li><br>이 오픈나무의 버전은 <a href="https://github.com/2DU/openNAMU/blob/master/version.md">1.8.8b</a> 입니다.')
  2260. @app.route('/manager/<int:num>', methods=['POST', 'GET'])
  2261. def 관리_기능(num = None):
  2262. if(num == 1):
  2263. return render_template('index.html', title = '관리자 메뉴', logo = data['name'], data = '<h2 style="margin-top: 0px;">관리자 및 소유자</h2><li><a href="/manager/2">문서 ACL</a></li><li><a href="/manager/3">유저 체크</a></li><li><a href="/manager/4">유저 차단</a></li><h2>소유자</h2><li><a href="/manager/5">관리자 권한 주기</a></li><h2>기타</h2><li>이 메뉴에 없는 기능은 해당 문서의 역사나 토론에서 바로 사용 가능함</li>')
  2264. elif(num == 2):
  2265. if(request.method == 'POST'):
  2266. return '<meta http-equiv="refresh" content="0;url=/acl/' + URL_인코딩(request.form["name"]) + '" />'
  2267. else:
  2268. return render_template('index.html', title = 'ACL 이동', logo = data['name'], data = '<form id="usrform" method="POST" action="/manager/2"><input name="name" type="text"><br><br><button class="btn btn-primary" type="submit">이동</button></form>')
  2269. elif(num == 3):
  2270. if(request.method == 'POST'):
  2271. return '<meta http-equiv="refresh" content="0;url=/check/' + URL_인코딩(request.form["name"]) + '" />'
  2272. else:
  2273. return render_template('index.html', title = '체크 이동', logo = data['name'], data = '<form id="usrform" method="POST" action="/manager/3"><input name="name" type="text"><br><br><button class="btn btn-primary" type="submit">이동</button></form>')
  2274. elif(num == 4):
  2275. if(request.method == 'POST'):
  2276. return '<meta http-equiv="refresh" content="0;url=/ban/' + URL_인코딩(request.form["name"]) + '" />'
  2277. else:
  2278. return render_template('index.html', title = '차단 이동', logo = data['name'], data = '<form id="usrform" method="POST" action="/manager/4"><input name="name" type="text"><br><br><button class="btn btn-primary" type="submit">이동</button><br><br><span>아이피 앞 두자리 (XXX.XXX) 입력하면 대역 차단</span></form>')
  2279. elif(num == 5):
  2280. if(request.method == 'POST'):
  2281. return '<meta http-equiv="refresh" content="0;url=/admin/' + URL_인코딩(request.form["name"]) + '" />'
  2282. else:
  2283. return render_template('index.html', title = '권한 이동', logo = data['name'], data = '<form id="usrform" method="POST" action="/manager/5"><input name="name" type="text"><br><br><button class="btn btn-primary" type="submit">이동</button></form>')
  2284. elif(num == 6):
  2285. if(request.method == 'POST'):
  2286. return '<meta http-equiv="refresh" content="0;url=/record/' + URL_인코딩(request.form["name"]) + '/n/1" />'
  2287. else:
  2288. return render_template('index.html', title = '기록 이동', logo = data['name'], data = '<form id="usrform" method="POST" action="/manager/6"><input name="name" type="text"><br><br><button class="btn btn-primary" type="submit">이동</button></form>')
  2289. else:
  2290. return '<meta http-equiv="refresh" content="0;url=/" />'
  2291. @app.route('/titleindex')
  2292. def 모든_문서():
  2293. 숫자 = 0
  2294. 데이터 = '<div>'
  2295. DB_실행("select title from data order by title asc")
  2296. 문서명 = DB_가져오기()
  2297. if(문서명):
  2298. while(True):
  2299. try:
  2300. 덤 = 문서명[숫자]
  2301. except:
  2302. break
  2303. 데이터 = 데이터 + '<li>' + str(숫자 + 1) + '. <a href="/w/' + URL_인코딩(문서명[숫자]['title']) + '">' + 문서명[숫자]['title'] + '</a></li>'
  2304. 숫자 += 1
  2305. 데이터 = 데이터 + '</div>'
  2306. return render_template('index.html', logo = data['name'], rows = 데이터 + '<br><span>이 위키에는 총 ' + str(숫자) + '개의 문서가 있습니다.</span>', tn = 4, title = '모든 문서')
  2307. else:
  2308. return render_template('index.html', logo = data['name'], rows = '', tn = 4, title = '모든 문서')
  2309. @app.route('/topic/<path:name>', methods=['POST', 'GET'])
  2310. def 토론_목록(name = None):
  2311. if(request.method == 'POST'):
  2312. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(request.form["topic"]) + '" />'
  2313. else:
  2314. div = '<div>'
  2315. i = 0
  2316. j = 1
  2317. DB_실행("select * from rd where title = '" + DB_인코딩(name) + "' order by date asc")
  2318. rows = DB_가져오기()
  2319. while(True):
  2320. try:
  2321. a = rows[i]
  2322. except:
  2323. div = div + '</div>'
  2324. break
  2325. DB_실행("select * from topic where title = '" + DB_인코딩(rows[i]['title']) + "' and sub = '" + DB_인코딩(rows[i]['sub']) + "' and id = '1' order by sub asc")
  2326. aa = DB_가져오기()
  2327. indata = 나무마크(name, aa[0]['data'])
  2328. if(aa[0]['block'] == 'O'):
  2329. indata = '블라인드 되었습니다.'
  2330. block = 'style="background: gainsboro;"'
  2331. else:
  2332. block = ''
  2333. ip = 아이디_파싱(aa[0]['ip'])
  2334. DB_실행("select * from stop where title = '" + DB_인코딩(rows[i]['title']) + "' and sub = '" + DB_인코딩(rows[i]['sub']) + "' and close = 'O'")
  2335. row = DB_가져오기()
  2336. if(not row):
  2337. div = div + '<h2><a href="/topic/' + URL_인코딩(rows[i]['title']) + '/sub/' + URL_인코딩(rows[i]['sub']) + '">' + str(j) + '. ' + rows[i]['sub'] + '</a></h2><table id="toron"><tbody><tr><td id="toroncolorgreen"><a href="javascript:void(0);" id="1">#1</a> ' + ip + ' <span style="float:right;">' + aa[0]['date'] + '</span></td></tr><tr><td ' + block + '>' + indata + '</td></tr></tbody></table><br>'
  2338. j = j + 1
  2339. i = i + 1
  2340. return render_template('index.html', title = name, page = URL_인코딩(name), logo = data['name'], plus = div, tn = 10, list = 1, sub = '토론 목록')
  2341. @app.route('/topic/<path:name>/close')
  2342. def 닫힌_토론_목록(name = None):
  2343. div = '<div>'
  2344. i = 0
  2345. DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and close = 'O' order by sub asc")
  2346. rows = DB_가져오기()
  2347. while(True):
  2348. try:
  2349. a = rows[i]
  2350. except:
  2351. div = div + '</div>'
  2352. break
  2353. DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(rows[i]['sub']) + "' and id = '1'")
  2354. row = DB_가져오기()
  2355. if(row):
  2356. indata = 나무마크(name, row[0]['data'])
  2357. if(row[0]['block'] == 'O'):
  2358. indata = '블라인드 되었습니다.'
  2359. block = 'style="background: gainsboro;"'
  2360. else:
  2361. block = ''
  2362. 아이디 = 아이디_파싱(row[0]['ip'])
  2363. div = div + '<h2><a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(rows[i]['sub']) + '">' + str((i + 1)) + '. ' + rows[i]['sub'] + '</a></h2><table id="toron"><tbody><tr><td id="toroncolorgreen"><a href="javascript:void(0);" id="1">#1</a> ' + 아이디 + ' <span style="float:right;">' + row[0]['date'] + '</span></td></tr><tr><td ' + block + '>' + indata + '</td></tr></tbody></table><br>'
  2364. i += 1
  2365. return render_template('index.html', title = name, page = URL_인코딩(name), logo = data['name'], plus = div, tn = 10, sub = '닫힌 토론')
  2366. @app.route('/topic/<path:name>/agree')
  2367. def 합의된_토론_목록(name = None):
  2368. 보여줄_내용 = '<div>'
  2369. 숫자 = 0
  2370. DB_실행("select * from agreedis where title = '" + DB_인코딩(name) + "' order by sub asc")
  2371. 합의_토론 = DB_가져오기()
  2372. while(True):
  2373. try:
  2374. 덤 = 합의_토론[숫자]
  2375. except:
  2376. 보여줄_내용 = 보여줄_내용 + '</div>'
  2377. break
  2378. DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(합의_토론[숫자]['sub']) + "' and id = '1'")
  2379. 내용 = DB_가져오기()
  2380. if(내용):
  2381. 내용_파싱 = 나무마크(name, 내용[0]['data'])
  2382. if(내용[0]['block'] == 'O'):
  2383. 내용_파싱 = '블라인드 되었습니다.'
  2384. 가리기 = 'style="background: gainsboro;"'
  2385. else:
  2386. 가리기 = ''
  2387. 아이디 = 아이디_파싱(내용[0]['ip'])
  2388. 보여줄_내용 = 보여줄_내용 + '<h2><a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(내용[숫자]['sub']) + '">' + str((숫자 + 1)) + '. ' + 내용[숫자]['sub'] + '</a></h2><table id="toron"><tbody><tr><td id="toroncolorgreen"><a href="javascript:void(0);" id="1">#1</a> ' + 아이디 + ' <span style="float:right;">' + 내용[0]['date'] + '</span></td></tr><tr><td ' + 가리기 + '>' + 내용_파싱 + '</td></tr></tbody></table><br>'
  2389. 숫자 += 1
  2390. return render_template('index.html', title = name, page = URL_인코딩(name), logo = data['name'], plus = 보여줄_내용, tn = 10, sub = '합의된 토론')
  2391. @app.route('/topic/<path:name>/sub/<path:sub>', methods=['POST', 'GET'])
  2392. def 토론(name = None, sub = None):
  2393. if(request.method == 'POST'):
  2394. DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' order by id+0 desc limit 1")
  2395. rows = DB_가져오기()
  2396. if(rows):
  2397. number = int(rows[0]['id']) + 1
  2398. else:
  2399. number = 1
  2400. ip = 아이피_확인(request)
  2401. ban = 토론자_체크(ip, name, sub)
  2402. admin = 관리자_확인()
  2403. if(ban == 1 and not admin == 1):
  2404. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2405. else:
  2406. DB_실행("select * from user where id = '" + DB_인코딩(ip) + "'")
  2407. rows = DB_가져오기()
  2408. if(rows):
  2409. if(rows[0]['acl'] == 'owner' or rows[0]['acl'] == 'admin'):
  2410. ip = ip + ' - Admin'
  2411. today = 시간()
  2412. 최근_토론_추가(name, sub, today)
  2413. aa = request.form["content"]
  2414. aa = re.sub("\[\[(분류:(?:(?:(?!\]\]).)*))\]\]", "[br]", aa)
  2415. aa = 세이브마크(aa)
  2416. DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + str(number) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', '" + DB_인코딩(aa) + "', '" + today + "', '" + ip + "', '')")
  2417. DB_갱신()
  2418. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '" />'
  2419. else:
  2420. style = ''
  2421. ip = 아이피_확인(request)
  2422. ban = 토론자_체크(ip, name, sub)
  2423. admin = 관리자_확인()
  2424. DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = 'O'")
  2425. 닫음 = DB_가져오기()
  2426. DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = ''")
  2427. 정지 = DB_가져오기()
  2428. if(admin == 1):
  2429. div = '<div>'
  2430. if(닫음):
  2431. div = div + '<a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '/close">(토론 열기)</a> '
  2432. else:
  2433. div = div + '<a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '/close">(토론 닫기)</a> '
  2434. if(정지):
  2435. div = div + '<a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '/stop">(토론 재개)</a> '
  2436. else:
  2437. div = div + '<a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '/stop">(토론 정지)</a> '
  2438. DB_실행("select * from agreedis where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'")
  2439. 합의 = DB_가져오기()
  2440. if(합의):
  2441. div = div + '<a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '/agree">(합의 취소)</a>'
  2442. else:
  2443. div = div + '<a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '/agree">(합의 완료)</a>'
  2444. div = div + '<br><br>'
  2445. else:
  2446. div = '<div>'
  2447. if(닫음 or 정지):
  2448. if(not admin == 1):
  2449. style = 'display:none;'
  2450. DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' order by id+0 asc")
  2451. rows = DB_가져오기()
  2452. DB_실행("select * from distop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' order by id+0 asc")
  2453. 공지 = DB_가져오기()
  2454. i = 0
  2455. if(공지):
  2456. while(True):
  2457. try:
  2458. a = 공지[i]
  2459. except:
  2460. break
  2461. num = int(공지[i]['id']) - 1
  2462. if(i == 0):
  2463. start = rows[num]['ip']
  2464. 공지_데이터 = 나무마크('', rows[num]['data'])
  2465. 공지_데이터 = re.sub("(?P<in>#(?:[0-9]*))", '<a href="\g<in>">\g<in></a>', 공지_데이터)
  2466. ip = 아이디_파싱(rows[num]['ip'])
  2467. div = div + '<table id="toron"><tbody><tr><td id="toroncolorred"><a href="#' + 공지[i]['id'] + '" id="' + 공지[i]['id'] + '-nt">#' + 공지[i]['id'] + '</a> ' + ip + ' <span style="float:right;">' + rows[num]['date'] + '</span></td></tr><tr><td>' + 공지_데이터 + '</td></tr></tbody></table><br>'
  2468. i = i + 1
  2469. i = 0
  2470. while(True):
  2471. try:
  2472. a = rows[i]
  2473. except:
  2474. div = div + '</div>'
  2475. break
  2476. if(i == 0):
  2477. start = rows[i]['ip']
  2478. indata = 나무마크('', rows[i]['data'])
  2479. indata = re.sub("(?P<in>#(?:[0-9]*))", '<a href="\g<in>">\g<in></a>', indata)
  2480. if(rows[i]['block'] == 'O'):
  2481. indata = '블라인드 되었습니다.'
  2482. block = 'style="background: gainsboro;"'
  2483. else:
  2484. block = ''
  2485. m = re.search("^([^-]*)\s\-\s(Close|Reopen|Stop|Restart|Agreement|Settlement)$", rows[i]['ip'])
  2486. if(m):
  2487. ban = ""
  2488. else:
  2489. if(admin == 1):
  2490. if(rows[i]['block'] == 'O'):
  2491. isblock = ' <a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '/b/' + str(i + 1) + '">(해제)</a>'
  2492. else:
  2493. isblock = ' <a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '/b/' + str(i + 1) + '">(블라인드)</a>'
  2494. DB_실행("select * from distop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and id = '" + DB_인코딩(str(i + 1)) + "'")
  2495. row = DB_가져오기()
  2496. if(row):
  2497. isblock = isblock + ' <a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '/notice/' + str(i + 1) + '">(해제)</a>'
  2498. else:
  2499. isblock = isblock + ' <a href="/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '/notice/' + str(i + 1) + '">(공지)</a>'
  2500. n = re.search("\- (?:Admin)$", rows[i]['ip'])
  2501. if(n):
  2502. ban = isblock
  2503. else:
  2504. DB_실행("select * from ban where block = '" + DB_인코딩(rows[i]['ip']) + "'")
  2505. row = DB_가져오기()
  2506. if(row):
  2507. ban = ' <a href="/ban/' + URL_인코딩(rows[i]['ip']) + '">(해제)</a>' + isblock
  2508. else:
  2509. ban = ' <a href="/ban/' + URL_인코딩(rows[i]['ip']) + '">(차단)</a>' + isblock
  2510. else:
  2511. ban = ""
  2512. ip = 아이디_파싱(rows[i]['ip'])
  2513. if(rows[i]['ip'] == start):
  2514. j = i + 1
  2515. div = div + '<table id="toron"><tbody><tr><td id="toroncolorgreen"><a href="javascript:void(0);" id="' + str(j) + '">#' + str(j) + '</a> ' + ip + ban + ' <span style="float:right;">' + rows[i]['date'] + '</span></td></tr><tr><td ' + block + '>' + indata + '</td></tr></tbody></table><br>'
  2516. else:
  2517. j = i + 1
  2518. div = div + '<table id="toron"><tbody><tr><td id="toroncolor"><a href="javascript:void(0);" id="' + str(j) + '">#' + str(j) + '</a> ' + ip + ban + ' <span style="float:right;">' + rows[i]['date'] + '</span></td></tr><tr><td ' + block + '>' + indata + '</td></tr></tbody></table><br>'
  2519. i = i + 1
  2520. return render_template('index.html', title = name, page = URL_인코딩(name), suburl = URL_인코딩(sub), toron = sub, logo = data['name'], rows = div, tn = 11, ban = ban, style = style, sub = '토론', login = 로그인_확인())
  2521. @app.route('/topic/<path:name>/sub/<path:sub>/b/<int:number>')
  2522. def 토론_블라인드(name = None, sub = None, number = None):
  2523. if(관리자_확인() == 1):
  2524. DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and id = '" + str(number) + "'")
  2525. 가리기 = DB_가져오기()
  2526. if(가리기):
  2527. if(가리기[0]['block'] == 'O'):
  2528. DB_실행("update topic set block = '' where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and id = '" + str(number) + "'")
  2529. else:
  2530. DB_실행("update topic set block = 'O' where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and id = '" + str(number) + "'")
  2531. DB_갱신()
  2532. 최근_토론_추가(name, sub, 시간())
  2533. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '" />'
  2534. else:
  2535. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '" />'
  2536. else:
  2537. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2538. @app.route('/topic/<path:name>/sub/<path:sub>/notice/<int:number>')
  2539. def 토론_공지(name = None, sub = None, number = None):
  2540. if(관리자_확인() == 1):
  2541. DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and id = '" + str(number) + "'")
  2542. 토론_내용 = DB_가져오기()
  2543. if(토론_내용):
  2544. DB_실행("select * from distop where id = '" + str(number) + "' and title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'")
  2545. 공지_내용 = DB_가져오기()
  2546. if(공지_내용):
  2547. DB_실행("delete from distop where id = '" + str(number) + "' and title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'")
  2548. else:
  2549. DB_실행("insert into distop (id, title, sub) value ('" + DB_인코딩(str(number)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "')")
  2550. DB_갱신()
  2551. 최근_토론_추가(name, sub, 시간())
  2552. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '" />'
  2553. else:
  2554. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '" />'
  2555. else:
  2556. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2557. @app.route('/topic/<path:name>/sub/<path:sub>/stop')
  2558. def 토론_정지(name = None, sub = None):
  2559. if(관리자_확인() == 1):
  2560. 아이피 = 아이피_확인(request)
  2561. DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' limit 1")
  2562. 토론_확인 = DB_가져오기()
  2563. if(토론_확인):
  2564. 현재_시간 = 시간()
  2565. DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = ''")
  2566. 정지 = DB_가져오기()
  2567. if(정지):
  2568. DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론_확인[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Restart', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Restart', '')")
  2569. DB_실행("delete from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = ''")
  2570. else:
  2571. DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론_확인[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Stop', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Stop', '')")
  2572. DB_실행("insert into stop (title, sub, close) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', '')")
  2573. DB_갱신()
  2574. 최근_토론_추가(name, sub, 현재_시간)
  2575. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '" />'
  2576. else:
  2577. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '" />'
  2578. else:
  2579. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2580. @app.route('/topic/<path:name>/sub/<path:sub>/close')
  2581. def 토론_닫기(name = None, sub = None):
  2582. if(관리자_확인() == 1):
  2583. 아이피 = 아이피_확인(request)
  2584. DB_실행("select * from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' order by id+0 desc limit 1")
  2585. 토론_확인 = DB_가져오기()
  2586. if(토론_확인):
  2587. 현재_시간 = 시간()
  2588. DB_실행("select * from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = 'O'")
  2589. 닫기 = DB_가져오기()
  2590. if(닫기):
  2591. DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론_확인[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Reopen', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Reopen', '')")
  2592. DB_실행("delete from stop where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' and close = 'O'")
  2593. else:
  2594. DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론_확인[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Close', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Close', '')")
  2595. DB_실행("insert into stop (title, sub, close) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'O')")
  2596. DB_갱신()
  2597. 최근_토론_추가(name, sub, 현재_시간)
  2598. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '" />'
  2599. else:
  2600. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '" />'
  2601. else:
  2602. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2603. @app.route('/topic/<path:name>/sub/<path:sub>/agree')
  2604. def 토론_관리자_기능(name = None, sub = None):
  2605. if(관리자_확인() == 1):
  2606. 아이피 = 아이피_확인(request)
  2607. DB_실행("select id from topic where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "' order by id+0 desc limit 1")
  2608. 토론 = DB_가져오기()
  2609. if(토론):
  2610. 현재_시간 = 시간()
  2611. DB_실행("select * from agreedis where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'")
  2612. 합의안 = DB_가져오기()
  2613. if(합의안):
  2614. DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Settlement', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Settlement', '')")
  2615. DB_실행("delete from agreedis where title = '" + DB_인코딩(name) + "' and sub = '" + DB_인코딩(sub) + "'")
  2616. else:
  2617. DB_실행("insert into topic (id, title, sub, data, date, ip, block) value ('" + DB_인코딩(str(int(토론[0]['id']) + 1)) + "', '" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "', 'Agreement', '" + DB_인코딩(현재_시간) + "', '" + DB_인코딩(아이피) + " - Agreement', '')")
  2618. DB_실행("insert into agreedis (title, sub) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(sub) + "')")
  2619. DB_갱신()
  2620. 최근_토론_추가(name, sub, 시간())
  2621. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '" />'
  2622. else:
  2623. return '<meta http-equiv="refresh" content="0;url=/topic/' + URL_인코딩(name) + '/sub/' + URL_인코딩(sub) + '" />'
  2624. else:
  2625. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2626. @app.route('/login', methods=['POST', 'GET'])
  2627. def 로그인():
  2628. 아이피 = 아이피_확인(request)
  2629. 차단인가 = 차단_체크(아이피)
  2630. if(request.method == 'POST'):
  2631. if(차단인가 == 1):
  2632. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2633. else:
  2634. DB_실행("select * from user where id = '" + DB_인코딩(request.form["id"]) + "'")
  2635. 사용자_정보 = DB_가져오기()
  2636. if(사용자_정보):
  2637. if(session.get('Now') == True):
  2638. return '<meta http-equiv="refresh" content="0;url=/error/11" />'
  2639. elif(bcrypt.checkpw(bytes(request.form["pw"], 'utf-8'), bytes(사용자_정보[0]['pw'], 'utf-8'))):
  2640. session['Now'] = True
  2641. session['DREAMER'] = request.form["id"]
  2642. DB_실행("insert into login (user, ip, today) value ('" + DB_인코딩(request.form["id"]) + "', '" + DB_인코딩(아이피) + "', '" + DB_인코딩(시간()) + "')")
  2643. DB_갱신()
  2644. return '<meta http-equiv="refresh" content="0;url=/user" />'
  2645. else:
  2646. return '<meta http-equiv="refresh" content="0;url=/error/13" />'
  2647. else:
  2648. return '<meta http-equiv="refresh" content="0;url=/error/12" />'
  2649. else:
  2650. if(차단인가 == 1):
  2651. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2652. else:
  2653. if(session.get('Now') == True):
  2654. return '<meta http-equiv="refresh" content="0;url=/error/11" />'
  2655. else:
  2656. return render_template('index.html', title = '로그인', enter = '로그인', logo = data['name'], tn = 15)
  2657. @app.route('/change', methods=['POST', 'GET'])
  2658. def 비밀번호_변경():
  2659. 아이피 = 아이피_확인(request)
  2660. 차단인가 = 차단_체크(아이피)
  2661. if(request.method == 'POST'):
  2662. if(request.form["pw2"] == request.form["pw3"]):
  2663. if(차단인가 == 1):
  2664. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2665. else:
  2666. DB_실행("select * from user where id = '" + DB_인코딩(request.form["id"]) + "'")
  2667. 사용자_정보 = DB_가져오기()
  2668. if(사용자_정보):
  2669. if(session.get('Now') == True):
  2670. session['Now'] = False
  2671. session.pop('DREAMER', None)
  2672. return '<meta http-equiv="refresh" content="0;url=/change" />'
  2673. elif(bcrypt.checkpw(bytes(request.form["pw"], 'utf-8'), bytes(사용자_정보[0]['pw'], 'utf-8'))):
  2674. hashed = bcrypt.hashpw(bytes(request.form["pw2"], 'utf-8'), bcrypt.gensalt())
  2675. DB_실행("update user set pw = '" + DB_인코딩(hashed.decode()) + "' where id = '" + DB_인코딩(request.form["id"]) + "'")
  2676. DB_갱신()
  2677. return '<meta http-equiv="refresh" content="0;url=/login" />'
  2678. else:
  2679. return '<meta http-equiv="refresh" content="0;url=/error/10" />'
  2680. else:
  2681. return '<meta http-equiv="refresh" content="0;url=/error/9" />'
  2682. else:
  2683. return '<meta http-equiv="refresh" content="0;url=/error/20" />'
  2684. else:
  2685. if(차단인가 == 1):
  2686. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2687. else:
  2688. if(session.get('Now') == True):
  2689. session['Now'] = False
  2690. session.pop('DREAMER', None)
  2691. return '<meta http-equiv="refresh" content="0;url=/change" />'
  2692. else:
  2693. return render_template('index.html', title = '비밀번호 변경', enter = '변경', logo = data['name'], tn = 15)
  2694. @app.route('/check/<name>')
  2695. def 사용자_아이피_확인(name = None, sub = None, number = None):
  2696. DB_실행("select * from user where id = '" + DB_인코딩(name) + "'")
  2697. 사용자_정보 = DB_가져오기()
  2698. if(사용자_정보 and 사용자_정보[0]['acl'] == 'owner' or 사용자_정보 and 사용자_정보[0]['acl'] == 'admin'):
  2699. return '<meta http-equiv="refresh" content="0;url=/error/4" />'
  2700. else:
  2701. if(관리자_확인() == 1):
  2702. m = re.search('(?:[0-9](?:[0-9][0-9])?\.[0-9](?:[0-9][0-9])?\.[0-9](?:[0-9][0-9])?\.[0-9](?:[0-9][0-9])?)', name)
  2703. if(m):
  2704. DB_실행("select * from login where ip = '" + DB_인코딩(name) + "' order by today desc")
  2705. row = DB_가져오기()
  2706. if(row):
  2707. i = 0
  2708. c = ''
  2709. while(True):
  2710. try:
  2711. c = c + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;">' + row[i]['user'] + '</td><td style="text-align: center;width:33.33%;">' + row[i]['ip'] + '</td><td style="text-align: center;width:33.33%;">' + row[i]['today'] + '</td></tr></tbody></table>'
  2712. except:
  2713. break
  2714. i = i + 1
  2715. return render_template('index.html', title = '다중 검사', logo = data['name'], tn = 22, rows = c)
  2716. else:
  2717. return render_template('index.html', title = '다중 검사', logo = data['name'], tn = 22, rows = '')
  2718. else:
  2719. DB_실행("select * from login where user = '" + DB_인코딩(name) + "' order by today desc")
  2720. row = DB_가져오기()
  2721. if(row):
  2722. i = 0
  2723. c = ''
  2724. while(True):
  2725. try:
  2726. c = c + '<table style="width: 100%;"><tbody><tr><td style="text-align: center;width:33.33%;">' + row[i]['user'] + '</td><td style="text-align: center;width:33.33%;">' + row[i]['ip'] + '</td><td style="text-align: center;width:33.33%;">' + row[i]['today'] + '</td></tr></tbody></table>'
  2727. except:
  2728. break
  2729. i = i + 1
  2730. return render_template('index.html', title = '다중 검사', logo = data['name'], tn = 22, rows = c)
  2731. else:
  2732. return render_template('index.html', title = '다중 검사', logo = data['name'], tn = 22, rows = '')
  2733. else:
  2734. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2735. @app.route('/register', methods=['POST', 'GET'])
  2736. def 가입():
  2737. 아이피 = 아이피_확인(request)
  2738. 차단인가 = 차단_체크(아이피)
  2739. if(request.method == 'POST'):
  2740. if(request.form["pw"] == request.form["pw2"]):
  2741. if(차단인가 == 1):
  2742. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2743. else:
  2744. m = re.search('(?:[^A-Za-zㄱ-힣0-9 ])', request.form["id"])
  2745. if(m):
  2746. return '<meta http-equiv="refresh" content="0;url=/error/8" />'
  2747. else:
  2748. if(len(request.form["id"]) > 20):
  2749. return '<meta http-equiv="refresh" content="0;url=/error/7" />'
  2750. else:
  2751. DB_실행("select * from user where id = '" + DB_인코딩(request.form["id"]) + "'")
  2752. rows = DB_가져오기()
  2753. if(rows):
  2754. return '<meta http-equiv="refresh" content="0;url=/error/6" />'
  2755. else:
  2756. hashed = bcrypt.hashpw(bytes(request.form["pw"], 'utf-8'), bcrypt.gensalt())
  2757. if(request.form["id"] == data['owner']):
  2758. DB_실행("insert into user (id, pw, acl) value ('" + DB_인코딩(request.form["id"]) + "', '" + DB_인코딩(hashed.decode()) + "', 'owner')")
  2759. else:
  2760. DB_실행("insert into user (id, pw, acl) value ('" + DB_인코딩(request.form["id"]) + "', '" + DB_인코딩(hashed.decode()) + "', 'user')")
  2761. DB_갱신()
  2762. return '<meta http-equiv="refresh" content="0;url=/login" />'
  2763. else:
  2764. return '<meta http-equiv="refresh" content="0;url=/error/20" />'
  2765. else:
  2766. if(차단인가 == 1):
  2767. return '<meta http-equiv="refresh" content="0;url=/ban" />'
  2768. else:
  2769. return render_template('index.html', title = '회원가입', enter = '회원가입', logo = data['name'], tn = 15)
  2770. @app.route('/logout')
  2771. def 로그아웃():
  2772. session['Now'] = False
  2773. session.pop('DREAMER', None)
  2774. return '<meta http-equiv="refresh" content="0;url=/user" />'
  2775. @app.route('/ban/<name>', methods=['POST', 'GET'])
  2776. def 사용자_차단(name = None):
  2777. DB_실행("select * from user where id = '" + DB_인코딩(name) + "'")
  2778. rows = DB_가져오기()
  2779. if(rows and rows[0]['acl'] == 'owner' or rows and rows[0]['acl'] == 'admin'):
  2780. return '<meta http-equiv="refresh" content="0;url=/error/4" />'
  2781. else:
  2782. if(request.method == 'POST'):
  2783. if(관리자_확인() == 1):
  2784. ip = 아이피_확인(request)
  2785. if(not re.search("[0-9]{4}-[0-9]{2}-[0-9]{2}", request.form["end"])):
  2786. end = ''
  2787. else:
  2788. end = request.form["end"]
  2789. DB_실행("select * from ban where block = '" + DB_인코딩(name) + "'")
  2790. row = DB_가져오기()
  2791. if(row):
  2792. 최근_차단_추가(name, '해제', 시간(), ip, '')
  2793. DB_실행("delete from ban where block = '" + DB_인코딩(name) + "'")
  2794. else:
  2795. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))$", name)
  2796. if(b):
  2797. 최근_차단_추가(name, end, 시간(), ip, request.form["why"])
  2798. DB_실행("insert into ban (block, end, why, band) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(end) + "', '" + DB_인코딩(request.form["why"]) + "', 'O')")
  2799. else:
  2800. 최근_차단_추가(name, end, 시간(), ip, request.form["why"])
  2801. DB_실행("insert into ban (block, end, why, band) value ('" + DB_인코딩(name) + "', '" + DB_인코딩(end) + "', '" + DB_인코딩(request.form["why"]) + "', '')")
  2802. DB_갱신()
  2803. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(data['frontpage']) + '" />'
  2804. else:
  2805. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2806. else:
  2807. if(관리자_확인() == 1):
  2808. DB_실행("select * from ban where block = '" + DB_인코딩(name) + "'")
  2809. row = DB_가져오기()
  2810. if(row):
  2811. now = '차단 해제'
  2812. else:
  2813. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))$", name)
  2814. if(b):
  2815. now = '대역 차단'
  2816. else:
  2817. now = '차단'
  2818. return render_template('index.html', title = name, page = URL_인코딩(name), logo = data['name'], tn = 16, now = now, today = 시간(), sub = '차단')
  2819. else:
  2820. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2821. @app.route('/acl/<path:name>', methods=['POST', 'GET'])
  2822. def ACL(name = None):
  2823. if(request.method == 'POST'):
  2824. if(관리자_확인() == 1):
  2825. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  2826. row = DB_가져오기()
  2827. if(row):
  2828. if(request.form["select"] == 'admin'):
  2829. DB_실행("update data set acl = 'admin' where title = '" + DB_인코딩(name) + "'")
  2830. elif(request.form["select"] == 'user'):
  2831. DB_실행("update data set acl = 'user' where title = '" + DB_인코딩(name) + "'")
  2832. else:
  2833. DB_실행("update data set acl = '' where title = '" + DB_인코딩(name) + "'")
  2834. DB_갱신()
  2835. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2836. else:
  2837. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2838. else:
  2839. if(관리자_확인() == 1):
  2840. DB_실행("select * from data where title = '" + DB_인코딩(name) + "'")
  2841. row = DB_가져오기()
  2842. if(row):
  2843. if(row[0]['acl'] == 'admin'):
  2844. now = '관리자만'
  2845. elif(row[0]['acl'] == 'user'):
  2846. now = '유저 이상'
  2847. else:
  2848. now = '일반'
  2849. return render_template('index.html', title = name, page = URL_인코딩(name), logo = data['name'], tn = 19, now = '현재 ACL 상태는 ' + now, sub = 'ACL')
  2850. else:
  2851. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(name) + '" />'
  2852. else:
  2853. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2854. @app.route('/admin/<name>', methods=['POST', 'GET'])
  2855. def 관리자_부여(name = None):
  2856. if(request.method == 'POST'):
  2857. if(소유자_확인() == 1):
  2858. DB_실행("select * from user where id = '" + DB_인코딩(name) + "'")
  2859. 사용자_정보 = DB_가져오기()
  2860. if(사용자_정보):
  2861. if(사용자_정보[0]['acl'] == 'admin' or 사용자_정보[0]['acl'] == 'owner'):
  2862. DB_실행("update user set acl = 'user' where id = '" + DB_인코딩(name) + "'")
  2863. else:
  2864. DB_실행("update user set acl = '" + DB_인코딩(request.form["select"]) + "' where id = '" + DB_인코딩(name) + "'")
  2865. DB_갱신()
  2866. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(data['frontpage']) + '" />'
  2867. else:
  2868. return '<meta http-equiv="refresh" content="0;url=/error/5" />'
  2869. else:
  2870. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2871. else:
  2872. if(소유자_확인() == 1):
  2873. DB_실행("select * from user where id = '" + DB_인코딩(name) + "'")
  2874. 사용자_정보 = DB_가져오기()
  2875. if(사용자_정보):
  2876. if(사용자_정보[0]['acl'] == 'admin' or 사용자_정보[0]['acl'] == 'owner'):
  2877. now = '권한 해제'
  2878. else:
  2879. now = '권한 부여'
  2880. return render_template('index.html', title = name, page = URL_인코딩(name), logo = data['name'], tn = 18, now = now, sub = '권한 부여')
  2881. else:
  2882. return '<meta http-equiv="refresh" content="0;url=/error/5" />'
  2883. else:
  2884. return '<meta http-equiv="refresh" content="0;url=/error/3" />'
  2885. @app.route('/ban')
  2886. def 차단_확인_페이지():
  2887. ip = 아이피_확인(request)
  2888. if(차단_체크(ip) == 1):
  2889. DB_실행("select * from ban where block = '" + DB_인코딩(ip) + "'")
  2890. rows = DB_가져오기()
  2891. if(rows):
  2892. if(rows[0]['end']):
  2893. end = rows[0]['end'] + ' 까지 차단 상태 입니다. / 사유 : ' + rows[0]['why']
  2894. now = 시간()
  2895. now = re.sub(':', '', now)
  2896. now = re.sub('\-', '', now)
  2897. now = re.sub(' ', '', now)
  2898. now = int(now)
  2899. day = rows[0]['end']
  2900. day = re.sub('\-', '', day)
  2901. if(now >= int(day + '000000')):
  2902. DB_실행("delete from ban where block = '" + DB_인코딩(ip) + "'")
  2903. DB_갱신()
  2904. end = '차단이 풀렸습니다. 다시 시도 해 보세요.'
  2905. else:
  2906. end = '영구 차단 상태 입니다. / 사유 : ' + rows[0]['why']
  2907. else:
  2908. b = re.search("^([0-9](?:[0-9]?[0-9]?)\.[0-9](?:[0-9]?[0-9]?))", ip)
  2909. if(b):
  2910. results = b.groups()
  2911. DB_실행("select * from ban where block = '" + DB_인코딩(results[0]) + "' and band = 'O'")
  2912. row = DB_가져오기()
  2913. if(row):
  2914. if(row[0]['end']):
  2915. end = row[0]['end'] + ' 까지 차단 상태 입니다. / 사유 : ' + rows[0]['why']
  2916. now = 시간()
  2917. now = re.sub(':', '', now)
  2918. now = re.sub('\-', '', now)
  2919. now = re.sub(' ', '', now)
  2920. now = int(now)
  2921. day = row[0]['end']
  2922. day = re.sub('\-', '', day)
  2923. if(now >= int(day + '000000')):
  2924. DB_실행("delete from ban where block = '" + DB_인코딩(results[0]) + "' and band = 'O'")
  2925. DB_갱신()
  2926. end = '차단이 풀렸습니다. 다시 시도 해 보세요.'
  2927. else:
  2928. end = '영구 차단 상태 입니다. / 사유 : ' + row[0]['why']
  2929. else:
  2930. end = '권한이 맞지 않는 상태 입니다.'
  2931. return render_template('index.html', title = '권한 오류', logo = data['name'], data = end), 401
  2932. @app.route('/w/<path:name>/r/<int:a>/diff/<int:b>')
  2933. def 문서_비교(name = None, a = None, b = None):
  2934. DB_실행("select * from history where id = '" + DB_인코딩(str(a)) + "' and title = '" + DB_인코딩(name) + "'")
  2935. rows = DB_가져오기()
  2936. if(rows):
  2937. DB_실행("select * from history where id = '" + DB_인코딩(str(b)) + "' and title = '" + DB_인코딩(name) + "'")
  2938. row = DB_가져오기()
  2939. if(row):
  2940. indata = re.sub('<', '&lt;', rows[0]['data'])
  2941. indata = re.sub('>', '&gt;', indata)
  2942. indata = re.sub('"', '&quot;', indata)
  2943. enddata = re.sub('<', '&lt;', row[0]['data'])
  2944. enddata = re.sub('>', '&gt;', enddata)
  2945. enddata = re.sub('"', '&quot;', enddata)
  2946. sm = difflib.SequenceMatcher(None, indata, enddata)
  2947. c = 비교(sm)
  2948. c = '<pre>' + c + '</pre>'
  2949. return render_template('index.html', title = name, logo = data['name'], data = c, sub = '비교')
  2950. else:
  2951. return '<meta http-equiv="refresh" content="0;url=/history/' + URL_인코딩(name) + '" />'
  2952. else:
  2953. return '<meta http-equiv="refresh" content="0;url=/history/' + URL_인코딩(name) + '" />'
  2954. @app.route('/user')
  2955. def 사용자():
  2956. ip = 아이피_확인(request)
  2957. DB_실행("select * from user where id = '" + DB_인코딩(ip) + "'")
  2958. rows = DB_가져오기()
  2959. if(차단_체크(ip) == 0):
  2960. if(rows):
  2961. if(rows[0]['acl'] == 'admin' or rows[0]['acl'] == 'owner'):
  2962. if(rows[0]['acl'] == 'admin'):
  2963. acl = '관리자'
  2964. else:
  2965. acl = '소유자'
  2966. else:
  2967. acl = '유저'
  2968. else:
  2969. acl = '일반'
  2970. else:
  2971. acl = '차단'
  2972. if(not re.search('\.', ip)):
  2973. DB_실행("select * from data where title = '사용자:" + DB_인코딩(ip) + "'")
  2974. row = DB_가져오기()
  2975. if(row):
  2976. ip = '<a href="/w/' + URL_인코딩('사용자:' + ip) + '">' + ip + '</a>'
  2977. else:
  2978. ip = '<a class="not_thing" href="/w/' + URL_인코딩('사용자:' + ip) + '">' + ip + '</a>'
  2979. return render_template('index.html', title = '유저 메뉴', logo = data['name'], data = ip + '<br><br><span>권한 상태 : ' + acl + '<br><br><li><a href="/login">로그인</a></li><li><a href="/logout">로그아웃</a></li><li><a href="/register">회원가입</a></li><li><a href="/change">비밀번호 변경</a></li>')
  2980. @app.route('/random')
  2981. def 무작위_문서():
  2982. DB_실행("select * from data order by rand() limit 1")
  2983. rows = DB_가져오기()
  2984. if(rows):
  2985. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(rows[0]['title']) + '" />'
  2986. else:
  2987. return '<meta http-equiv="refresh" content="0;url=/" />'
  2988. @app.route('/error/<int:num>')
  2989. def 오류(num = None):
  2990. if(num == 1):
  2991. return render_template('index.html', title = '권한 오류', logo = data['name'], data = '비 로그인 상태 입니다.'), 401
  2992. elif(num == 2):
  2993. return render_template('index.html', title = '권한 오류', logo = data['name'], data = '이 계정이 없습니다.'), 401
  2994. elif(num == 3):
  2995. return render_template('index.html', title = '권한 오류', logo = data['name'], data = '권한이 모자랍니다.'), 401
  2996. elif(num == 4):
  2997. return render_template('index.html', title = '권한 오류', logo = data['name'], data = '관리자는 차단, 검사 할 수 없습니다.'), 401
  2998. elif(num == 5):
  2999. return render_template('index.html', title = '유저 오류', logo = data['name'], data = '그런 계정이 없습니다.'), 401
  3000. elif(num == 6):
  3001. return render_template('index.html', title = '가입 오류', logo = data['name'], data = '동일한 아이디의 유저가 있습니다.'), 401
  3002. elif(num == 7):
  3003. return render_template('index.html', title = '가입 오류', logo = data['name'], data = '아이디는 20글자보다 짧아야 합니다.'), 401
  3004. elif(num == 8):
  3005. return render_template('index.html', title = '가입 오류', logo = data['name'], data = '아이디에는 한글과 알파벳과 공백만 허용 됩니다.'), 401
  3006. elif(num == 9):
  3007. return render_template('index.html', title = '변경 오류', logo = data['name'], data = '그런 계정이 없습니다.'), 401
  3008. elif(num == 10):
  3009. return render_template('index.html', title = '변경 오류', logo = data['name'], data = '비밀번호가 다릅니다.'), 401
  3010. elif(num == 11):
  3011. return render_template('index.html', title = '로그인 오류', logo = data['name'], data = '이미 로그인 되어 있습니다.'), 401
  3012. elif(num == 12):
  3013. return render_template('index.html', title = '로그인 오류', logo = data['name'], data = '그런 계정이 없습니다.'), 401
  3014. elif(num == 13):
  3015. return render_template('index.html', title = '로그인 오류', logo = data['name'], data = '비밀번호가 다릅니다.'), 401
  3016. elif(num == 14):
  3017. return render_template('index.html', title = '업로드 오류', logo = data['name'], data = 'jpg, gif, jpeg, png만 가능 합니다.'), 401
  3018. elif(num == 15):
  3019. return render_template('index.html', title = '업로드 오류', logo = data['name'], data = '파일 명에 . / \ * < > | : ? 가 들어 갈 수 없습니다.'), 401
  3020. elif(num == 16):
  3021. return render_template('index.html', title = '업로드 오류', logo = data['name'], data = '동일한 이름의 파일이 있습니다.'), 401
  3022. elif(num == 17):
  3023. return render_template('index.html', title = '편집 오류', logo = data['name'], data = '편집 내용 기록에는 한글과 영어와 숫자, 공백만 허용 됩니다.'), 401
  3024. elif(num == 18):
  3025. return render_template('index.html', title = '편집 오류', logo = data['name'], data = '내용이 원래 문서와 동일 합니다.'), 401
  3026. elif(num == 19):
  3027. return render_template('index.html', title = '이동 오류', logo = data['name'], data = '이동 하려는 곳에 문서가 이미 있습니다.'), 401
  3028. elif(num == 20):
  3029. return render_template('index.html', title = '비밀번호 오류', logo = data['name'], data = '재 확인이랑 비밀번호가 다릅니다.'), 401
  3030. else:
  3031. return '<meta http-equiv="refresh" content="0;url=/" />'
  3032. @app.errorhandler(404)
  3033. def uncaughtError(error):
  3034. return '<meta http-equiv="refresh" content="0;url=/w/' + URL_인코딩(data['frontpage']) + '" />'
  3035. @app.errorhandler(413)
  3036. def uncaughtError(error):
  3037. app.config['MAX_CONTENT_LENGTH'] = (1024**3)
  3038. return error, 401
  3039. if(__name__ == '__main__'):
  3040. app.run(host = '0.0.0.0', port = int(data['port']))