start.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from . import tool
  2. import re
  3. def start(data, title):
  4. # 맨 앞과 끝에 개행 문자 추가
  5. data = '\r\n' + data + '\r\n'
  6. # 텍스트 꾸미기 문법
  7. data = re.sub('\'\'\'(?P<in>(?:(?!\'\'\').)+)\'\'\'', '<b>\g<in></b>', data)
  8. data = re.sub('\'\'(?P<in>(?:(?!\'\').)+)\'\'', '<i>\g<in></i>', data)
  9. data = re.sub('~~(?P<in>(?:(?!~~).)+)~~', '<s>\g<in></s>', data)
  10. data = re.sub('--(?P<in>(?:(?!~~).)+)--', '<s>\g<in></s>', data)
  11. data = re.sub('__(?P<in>(?:(?!__).)+)__', '<u>\g<in></u>', data)
  12. data = re.sub('^^(?P<in>(?:(?!^^).)+)^^', '<sup>\g<in></sup>', data)
  13. data = re.sub(',,(?P<in>(?:(?!,,).)+),,', '<sub>\g<in></sub>', data)
  14. # 넘겨주기 변환
  15. data = re.sub('\r\n#(?:redirect|넘겨주기) (?P<in>(?:(?!\r\n).)+)\r\n', '<meta http-equiv="refresh" content="0; url=/w/\g<in>?froms=' + tool.url_pas(title) + '">', data)
  16. # 문단 문법
  17. toc_full = 0
  18. toc_stack = [0, 0, 0, 0, 0, 0]
  19. while 1:
  20. toc = re.search('\r\n(={1,6}) ?((?:(?!=).)+) ?={1,6}\r\n', data)
  21. if toc:
  22. toc = toc.groups()
  23. toc_number = len(toc[0])
  24. # 더 크면 그 전 스택은 초기화
  25. if toc_full > toc_number:
  26. for i in range(toc_number, 6):
  27. toc_stack[i] = 0
  28. toc_full = toc_number
  29. toc_stack[toc_number - 1] += 1
  30. toc_number = str(toc_number)
  31. all_stack = ''
  32. # 스택 합치기
  33. for i in range(0, 6):
  34. all_stack += str(toc_stack[i]) + '.'
  35. all_stack = re.sub('0.', '', all_stack)
  36. data = re.sub('\r\n(={1,6}) ?((?:(?!=).)+) ?={1,6}\r\n', '<h' + toc_number + '><a href="">' + all_stack + '</a> ' + toc[1] + '</h' + toc_number + '>\r\n', data, 1)
  37. else:
  38. break
  39. while 1:
  40. hr = re.search('\r\n-{4,9}\r\n', data)
  41. if hr:
  42. data = re.sub('\r\n-{4,9}\r\n', '<hr>', data, 1)
  43. else:
  44. break
  45. # 리스트 구현
  46. while 1:
  47. li = re.search('(\r\n(?:(?: *)\* ?(?:(?:(?!\r\n).)+)\r\n)+)', data)
  48. if li:
  49. li = li.groups()[0]
  50. while 1:
  51. sub_li = re.search('\r\n(?:( *)\* ?((?:(?!\r\n).)+))', li)
  52. if sub_li:
  53. sub_li = sub_li.groups()
  54. # 앞의 공백 만큼 margin 먹임
  55. if len(sub_li[0]) == 0:
  56. margin = 20
  57. else:
  58. margin = len(sub_li[0]) * 20
  59. li = re.sub('\r\n(?:( *)\* ?((?:(?!\r\n).)+))', '<li style="margin-left: ' + str(margin) + 'px">' + sub_li[1] + '</li>', li, 1)
  60. else:
  61. break
  62. data = re.sub('(\r\n(?:(?: *)\* ?(?:(?:(?!\r\n).)+)\r\n)+)', '<ul>' + li + '</ul>', data, 1)
  63. else:
  64. break
  65. # 들여쓰기 구현
  66. while 1:
  67. indent = re.search('\r\n( +)', data)
  68. if indent:
  69. indent = len(indent.groups()[0])
  70. # 앞에 공백 만큼 margin 먹임
  71. margin = '<span style="margin-left: 20px;"></span>' * indent
  72. data = re.sub('\r\n( +)', '\r\n' + margin, data, 1)
  73. else:
  74. break
  75. # 마지막 처리
  76. data = re.sub('(?P<in><\/h[1-6]>)\r\n', '\g<in>', data)
  77. data = re.sub('\r\n', '<br>', data)
  78. return data