فهرست منبع

katex 내장 및 파서 버그 수정

Surplus_Up (2DU) 7 سال پیش
والد
کامیت
fc6245fb12
76فایلهای تغییر یافته به همراه819 افزوده شده و 51 حذف شده
  1. 1 1
      Version-Ko.md
  2. 0 0
      set_mark/html_only.py
  3. 48 50
      set_mark/namu.py
  4. 90 0
      views/main_css/katex/README.md
  5. 321 0
      views/main_css/katex/contrib/auto-render.js
  6. 0 0
      views/main_css/katex/contrib/auto-render.min.js
  7. 14 0
      views/main_css/katex/contrib/copy-tex.css
  8. 191 0
      views/main_css/katex/contrib/copy-tex.js
  9. 1 0
      views/main_css/katex/contrib/copy-tex.min.css
  10. 0 0
      views/main_css/katex/contrib/copy-tex.min.js
  11. 134 0
      views/main_css/katex/contrib/mathtex-script-type.js
  12. 1 0
      views/main_css/katex/contrib/mathtex-script-type.min.js
  13. BIN
      views/main_css/katex/fonts/KaTeX_AMS-Regular.ttf
  14. BIN
      views/main_css/katex/fonts/KaTeX_AMS-Regular.woff
  15. BIN
      views/main_css/katex/fonts/KaTeX_AMS-Regular.woff2
  16. BIN
      views/main_css/katex/fonts/KaTeX_Caligraphic-Bold.ttf
  17. BIN
      views/main_css/katex/fonts/KaTeX_Caligraphic-Bold.woff
  18. BIN
      views/main_css/katex/fonts/KaTeX_Caligraphic-Bold.woff2
  19. BIN
      views/main_css/katex/fonts/KaTeX_Caligraphic-Regular.ttf
  20. BIN
      views/main_css/katex/fonts/KaTeX_Caligraphic-Regular.woff
  21. BIN
      views/main_css/katex/fonts/KaTeX_Caligraphic-Regular.woff2
  22. BIN
      views/main_css/katex/fonts/KaTeX_Fraktur-Bold.ttf
  23. BIN
      views/main_css/katex/fonts/KaTeX_Fraktur-Bold.woff
  24. BIN
      views/main_css/katex/fonts/KaTeX_Fraktur-Bold.woff2
  25. BIN
      views/main_css/katex/fonts/KaTeX_Fraktur-Regular.ttf
  26. BIN
      views/main_css/katex/fonts/KaTeX_Fraktur-Regular.woff
  27. BIN
      views/main_css/katex/fonts/KaTeX_Fraktur-Regular.woff2
  28. BIN
      views/main_css/katex/fonts/KaTeX_Main-Bold.ttf
  29. BIN
      views/main_css/katex/fonts/KaTeX_Main-Bold.woff
  30. BIN
      views/main_css/katex/fonts/KaTeX_Main-Bold.woff2
  31. BIN
      views/main_css/katex/fonts/KaTeX_Main-BoldItalic.ttf
  32. BIN
      views/main_css/katex/fonts/KaTeX_Main-BoldItalic.woff
  33. BIN
      views/main_css/katex/fonts/KaTeX_Main-BoldItalic.woff2
  34. BIN
      views/main_css/katex/fonts/KaTeX_Main-Italic.ttf
  35. BIN
      views/main_css/katex/fonts/KaTeX_Main-Italic.woff
  36. BIN
      views/main_css/katex/fonts/KaTeX_Main-Italic.woff2
  37. BIN
      views/main_css/katex/fonts/KaTeX_Main-Regular.ttf
  38. BIN
      views/main_css/katex/fonts/KaTeX_Main-Regular.woff
  39. BIN
      views/main_css/katex/fonts/KaTeX_Main-Regular.woff2
  40. BIN
      views/main_css/katex/fonts/KaTeX_Math-BoldItalic.ttf
  41. BIN
      views/main_css/katex/fonts/KaTeX_Math-BoldItalic.woff
  42. BIN
      views/main_css/katex/fonts/KaTeX_Math-BoldItalic.woff2
  43. BIN
      views/main_css/katex/fonts/KaTeX_Math-Italic.ttf
  44. BIN
      views/main_css/katex/fonts/KaTeX_Math-Italic.woff
  45. BIN
      views/main_css/katex/fonts/KaTeX_Math-Italic.woff2
  46. BIN
      views/main_css/katex/fonts/KaTeX_SansSerif-Bold.ttf
  47. BIN
      views/main_css/katex/fonts/KaTeX_SansSerif-Bold.woff
  48. BIN
      views/main_css/katex/fonts/KaTeX_SansSerif-Bold.woff2
  49. BIN
      views/main_css/katex/fonts/KaTeX_SansSerif-Italic.ttf
  50. BIN
      views/main_css/katex/fonts/KaTeX_SansSerif-Italic.woff
  51. BIN
      views/main_css/katex/fonts/KaTeX_SansSerif-Italic.woff2
  52. BIN
      views/main_css/katex/fonts/KaTeX_SansSerif-Regular.ttf
  53. BIN
      views/main_css/katex/fonts/KaTeX_SansSerif-Regular.woff
  54. BIN
      views/main_css/katex/fonts/KaTeX_SansSerif-Regular.woff2
  55. BIN
      views/main_css/katex/fonts/KaTeX_Script-Regular.ttf
  56. BIN
      views/main_css/katex/fonts/KaTeX_Script-Regular.woff
  57. BIN
      views/main_css/katex/fonts/KaTeX_Script-Regular.woff2
  58. BIN
      views/main_css/katex/fonts/KaTeX_Size1-Regular.ttf
  59. BIN
      views/main_css/katex/fonts/KaTeX_Size1-Regular.woff
  60. BIN
      views/main_css/katex/fonts/KaTeX_Size1-Regular.woff2
  61. BIN
      views/main_css/katex/fonts/KaTeX_Size2-Regular.ttf
  62. BIN
      views/main_css/katex/fonts/KaTeX_Size2-Regular.woff
  63. BIN
      views/main_css/katex/fonts/KaTeX_Size2-Regular.woff2
  64. BIN
      views/main_css/katex/fonts/KaTeX_Size3-Regular.ttf
  65. BIN
      views/main_css/katex/fonts/KaTeX_Size3-Regular.woff
  66. BIN
      views/main_css/katex/fonts/KaTeX_Size3-Regular.woff2
  67. BIN
      views/main_css/katex/fonts/KaTeX_Size4-Regular.ttf
  68. BIN
      views/main_css/katex/fonts/KaTeX_Size4-Regular.woff
  69. BIN
      views/main_css/katex/fonts/KaTeX_Size4-Regular.woff2
  70. BIN
      views/main_css/katex/fonts/KaTeX_Typewriter-Regular.ttf
  71. BIN
      views/main_css/katex/fonts/KaTeX_Typewriter-Regular.woff
  72. BIN
      views/main_css/katex/fonts/KaTeX_Typewriter-Regular.woff2
  73. 0 0
      views/main_css/katex/katex.min.css
  74. 0 0
      views/main_css/katex/katex.min.js
  75. 14 0
      views/main_css/parser.js
  76. 4 0
      views/neo_yousoro/css/main.css

+ 1 - 1
Version-Ko.md

@@ -161,7 +161,7 @@
 ### 외부 파일
  * 인용문 아이콘 [Dave Gandy](http://www.flaticon.com/free-icon/quote-left_25672) CC 3.0 BY
  * 구문 강조 [highlightjs](https://highlightjs.org/)
- * 수식 [MathJax](https://www.mathjax.org/)
+ * 수식 [KaTeX](https://github.com/Khan/KaTeX)
  
 ## 기여자들
  * [참조](https://github.com/2DU/opennamu/graphs/contributors)

+ 0 - 0
set_mark/html_only.py


+ 48 - 50
set_mark/namu.py

@@ -240,7 +240,7 @@ def middle_parser(data):
 
                                                     middle_list += ['pre']
                                                     
-                                                    data = re.sub('{{{#!syntax ((?:(?!\n).)+)\n?', '<pre id="syntax"><code class="' + middle_data_2[0] + '">', data, 1)
+                                                    data = re.sub('{{{#!syntax ?((?:(?!\n).)*)\n?', '<pre id="syntax"><code class="' + middle_data_2[0] + '">', data, 1)
                                                 else:
                                                     middle_search = re.search('^#!html', middle_data[0])
                                                     if middle_search:
@@ -258,7 +258,7 @@ def middle_parser(data):
                                                             else:
                                                                 folding_data = ['Test']
                                                             
-                                                            data = re.sub('{{{#!folding ?((?:(?!\n).)*)\n?', '<div>' + str(folding_data[0]) + ' <div style="display: inline-block;"><a href="javascript:void(0);" onclick="folding(' + str(fol_num) + ');">[Work]</a></div_end><div id="folding_' + str(fol_num) + '" style="display: none;"><div id="wiki_div" style="">', data, 1)
+                                                            data = re.sub('{{{#!folding ?((?:(?!\n).)*)\n?', '<div>' + str(folding_data[0]) + ' <div style="display: inline-block;"><a href="javascript:void(0);" onclick="folding(' + str(fol_num) + ');">[do]</a></div_end><div id="folding_' + str(fol_num) + '" style="display: none;"><div id="wiki_div" style="">', data, 1)
                                                             
                                                             fol_num += 1
                                                         else:
@@ -393,21 +393,7 @@ def namu(conn, data, title, main_num):
     plus_data = '''
                 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/default.min.css">
                 <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
-                <script>
-                    hljs.initHighlightingOnLoad(); 
-                    function folding(num) { 
-                        var fol = document.getElementById('folding_' + num); 
-                        if(fol.style.display == 'inline-block' || fol.style.display == 'block') { 
-                            fol.style.display = 'none';
-                        } else {
-                            if(num % 2 == 0) { 
-                                fol.style.display = 'block'; 
-                            } else { 
-                                fol.style.display = 'inline-block'; 
-                            } 
-                        } 
-                    }
-                </script>
+                <script src="/views/main_css/parser.js"</script>
                 '''
     global end_data
     end_data = []
@@ -422,8 +408,9 @@ def namu(conn, data, title, main_num):
     data = middle_parser(data)
 
     # 포함 문법 처리
+    include_re = re.compile('\[include\(((?:(?!\)\]).)+)\)\]', re.I)
     while 1:
-        include = re.search('\[[Ii]nclude\(((?:(?!\)\]).)+)\)\]', data)
+        include = include_re.search(data)
         if include:
             include = include.groups()[0]
     
@@ -472,9 +459,9 @@ def namu(conn, data, title, main_num):
                 include_parser = re.sub('\[\[(?:category|분류):(((?!\]\]|#include).)+)\]\]', '', include_parser)
                 include_parser = html.escape(include_parser)
 
-                data = re.sub('\[[Ii]nclude\(((?:(?!\)\]).)+)\)\]', '<include>\n<a id="include_link" href="/w/' + tool.url_pas(include_link) + '">[' + include_link + ']</a>\n' + include_parser + '\n</include>', data, 1)
+                data = include_re.sub('<include>\n<a id="include_link" href="/w/' + tool.url_pas(include_link) + '">[' + include_link + ']</a>\n' + include_parser + '\n</include>', data, 1)
             else:
-                data = re.sub('\[[Ii]nclude\(((?:(?!\)\]).)+)\)\]', '<a id="not_thing" href="/w/' + tool.url_pas(include_link) + '">' + include_link + '</a>', data, 1)
+                data = include_re.sub('<a id="not_thing" href="/w/' + tool.url_pas(include_link) + '">' + include_link + '</a>', data, 1)
         else:
             break
 
@@ -545,24 +532,21 @@ def namu(conn, data, title, main_num):
     
     # 수식 처리
     first = 0
+    math_re = re.compile('\[math\(((?:(?!\)\]).)+)\)\]', re.I)
     while 1:
-        math = re.search('&lt;[Mm]ath&gt;((?:(?!&lt;\/[Mm]ath&gt;).)+)&lt;\/[Mm]ath&gt;', data)
+        math = math_re.search(data)
         if math:
             if first == 0:
                 plus_data +=    '''
-                                <link   rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.9.0/katex.min.css"
-                                        integrity="sha384-TEMocfGvRuD1rIAacqrknm5BQZ7W7uWitoih+jMNFXQIbNl16bO8OZmylH/Vi/Ei"
-                                        crossorigin="anonymous">
-                                <script src="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.9.0/katex.min.js" 
-                                        integrity="sha384-jmxIlussZWB7qCuB+PgKG1uLjjxbVVIayPJwi6cG6Zb4YKq0JIw+OMnkkEC7kYCq"
-                                        crossorigin="anonymous"></script>
+                                <link rel="stylesheet" href="/views/main_css/katex/katex.min.css">
+                                <script src="/views/main_css/katex/katex.min.js"></script>
                                 '''
 
             math = math.groups()[0]
             
             first += 1
             
-            data = re.sub('&lt;[Mm]ath&gt;((?:(?!&lt;\/[Mm]ath&gt;).)+)&lt;\/[Mm]ath&gt;', '<span id="math_' + str(first) + '"></span>', data, 1)
+            data = math_re.sub('<span id="math_' + str(first) + '"></span>', data, 1)
 
             plus_data += '<script>katex.render("' + math.replace('\\', '\\\\').replace('&lt;', '<').replace('&gt;', '>') +'", document.getElementById("math_' + str(first) + '"));</script>'
         else:
@@ -606,7 +590,8 @@ def namu(conn, data, title, main_num):
     data = re.sub(',,(?P<in>(?:(?!,,).)+),,', '<sub>\g<in></sub>', data)
 
     # 넘겨주기 변환
-    redirect = re.search('\n#(?:[Rr]edirect|넘겨주기) ((?:(?!\n).)+)\n', data)
+    redirect_re = re.compile('\n#(?:redirect|넘겨주기) ((?:(?!\n).)+)\n', re.I)
+    redirect = redirect_re.search(data)
     if redirect:
         redirect = redirect.groups()[0]
         
@@ -616,14 +601,16 @@ def namu(conn, data, title, main_num):
         
         backlink += [[title, main_link, 'redirect']]
         
-        data = re.sub('\n#(?:[Rr]edirect|넘겨주기) (?P<in>(?:(?!\n).)+)\n', '<script>location.href="/w/' + tool.url_pas(main_link) + '?froms=' + tool.url_pas(title) + other_link + '";</script>', data, 1)
+        data = redirect_re.sub('<script>location.href="/w/' + tool.url_pas(main_link) + '?froms=' + tool.url_pas(title) + other_link + '";</script>', data, 1)
 
     # [목차(-)] 처리
-    if not re.search('\[(?:목차|[Tt]oc)\((?:no)\)\]\n', data):
-        if not re.search('\[(?:목차|[Tt]oc)\]', data):
+    no_toc_re = re.compile('\[(?:목차|toc)\((?:no)\)\]\n', re.I)
+    toc_re = re.compile('\[(?:목차|toc)\]', re.I)
+    if not no_toc_re.search(data):
+        if not toc_re.search(data):
             data = re.sub('\n(?P<in>={1,6}) ?(?P<out>(?:(?!=).)+) ?={1,6}\n', '\n[toc]\n\g<in> \g<out> \g<in>\n', data, 1)
     else:
-        data = re.sub('\[(?:목차|[Tt]oc)\((?:no)\)\]\n', '', data)
+        data = no_toc_re.sub('', data)
         
     # 문단 문법
     toc_full = 0
@@ -677,13 +664,16 @@ def namu(conn, data, title, main_num):
 
     toc_data += '</div>'
     
-    data = re.sub('\[(?:목차|[Tt]oc)\]', toc_data, data)
+    data = toc_re.sub(toc_data, data)
 
     # 일부 매크로 처리
     data = tool.savemark(data)
     
-    data = re.sub("\[[Aa]nchor\((?P<in>(?:(?!\)\]).)+)\)\]", '<span id="\g<in>"></span>', data)          
-    data = re.sub('\[[Rr]uby\((?P<in>(?:(?!,).)+)\, ?(?P<out>(?:(?!\)\]).)+)\)\]', '<ruby>\g<in><rp>(</rp><rt>\g<out></rt><rp>)</rp></ruby>', data)
+    anchor_re = re.compile("\[anchor\((?P<in>(?:(?!\)\]).)+)\)\]", re.I)
+    data = anchor_re.sub('<span id="\g<in>"></span>', data)
+
+    ruby_re = re.compile("\[ruby\((?P<in>(?:(?!,).)+)\, ?(?P<out>(?:(?!\)\]).)+)\)\]", re.I)
+    data = ruby_re.sub('<ruby>\g<in><rp>(</rp><rt>\g<out></rt><rp>)</rp></ruby>', data)
 
     # 글 상자 끼어들기
     data = re.sub('{{\|(?P<in>(?:(?:(?!\|}}).)*\n*)+)\|}}', '<table><tbody><tr><td>\g<in></td></tbody></table>', data)
@@ -691,13 +681,15 @@ def namu(conn, data, title, main_num):
     # 원래 코드 재탕
     now_time = tool.get_time()
 
-    data = re.sub('\[[Dd]ate\]', now_time, data)
+    date_re = re.compile('\[date\]', re.I)
+    data = date_re.sub(now_time, data)
     
     time_data = re.search('^([0-9]{4}-[0-9]{2}-[0-9]{2})', now_time)
     time = time_data.groups()
     
+    age_re = re.compile('\[age\(([0-9]{4}-[0-9]{2}-[0-9]{2})\)\]', re.I)
     while 1:
-        age_data = re.search('\[[Aa]ge\(([0-9]{4}-[0-9]{2}-[0-9]{2})\)\]', data)
+        age_data = age_re.search(data)
         if age_data:
             age = age_data.groups()[0]
 
@@ -706,12 +698,13 @@ def namu(conn, data, title, main_num):
             
             e_data = old - will
             
-            data = re.sub('\[[Aa]ge\(([0-9]{4})-([0-9]{2})-([0-9]{2})\)\]', str(int(e_data.days / 365)), data, 1)
+            data = age_re.sub(str(int(e_data.days / 365)), data, 1)
         else:
             break
 
+    dday_re = re.compile('\[dday\(([0-9]{4}-[0-9]{2}-[0-9]{2})\)\]', re.I)
     while 1:
-        dday_data = re.search('\[[Dd]day\(([0-9]{4}-[0-9]{2}-[0-9]{2})\)\]', data)
+        dday_data = dday_re.search(data)
         if dday_data:
             dday = dday_data.groups()[0]
 
@@ -725,13 +718,16 @@ def namu(conn, data, title, main_num):
             else:
                 e_day = '+' + str(e_data.days)
 
-            data = re.sub('\[[Dd]day\(([0-9]{4}-[0-9]{2}-[0-9]{2})\)\]', e_day, data, 1)
+            data = dday_re.sub(e_day, data, 1)
         else:
             break
 
     # 유튜브, 카카오 티비 처리
+    video_re = re.compile('\[(youtube|kakaotv|nicovideo)\(((?:(?!\)\]).)+)\)\]', re.I)
+    youtube_re = re.compile('youtube', re.I)
+    kakaotv_re = re.compile('kakaotv', re.I)
     while 1:
-        video = re.search('\[([Yy]outube|[Kk]akaotv|[Nn]icovideo)\(((?:(?!\)\]).)+)\)\]', data)
+        video = video_re.search(data)
         if video:
             video = video.groups()
             
@@ -747,18 +743,18 @@ def namu(conn, data, title, main_num):
             else:
                 video_height = '315'
 
-            code = re.search('^(((?!,).)+)', video[1])
+            code = re.search('^((?:(?!,).)+)', video[1])
             if code:
                 video_code = code.groups()[0]
             else:
                 video_code = ''
 
-            if video[0] == ('youtube' or 'Youtube'):
+            if youtube_re.search(video[0]):
                 video_code = re.sub('^https:\/\/www\.youtube\.com\/watch\?v=', '', video_code)
                 video_code = re.sub('^https:\/\/youtu\.be\/', '', video_code)
                 
                 video_src = 'https://www.youtube.com/embed/' + video_code
-            elif video[0] == ('kakaotv' or 'Kakaotv'):
+            elif kakaotv_re.search(video[0]):
                 video_code = re.sub('^https:\/\/tv\.kakao\.com\/channel\/9262\/cliplink\/', '', video_code)
                 video_code = re.sub('^http:\/\/tv\.kakao\.com\/v\/', '', video_code)
                 
@@ -766,7 +762,7 @@ def namu(conn, data, title, main_num):
             else:
                 video_src = 'https://embed.nicovideo.jp/watch/' + video_code
                 
-            data = re.sub('\[([Yy]outube|[Kk]akaotv|[Nn]icovideo)\(((?:(?!\)\]).)+)\)\]', '<iframe width="' + video_width + '" height="' + video_height + '" src="' + video_src + '" allowfullscreen frameborder="0"></iframe>', data, 1)
+            data = video_re.sub('<iframe width="' + video_width + '" height="' + video_height + '" src="' + video_src + '" allowfullscreen frameborder="0"></iframe>', data, 1)
         else:
             break
 
@@ -830,6 +826,7 @@ def namu(conn, data, title, main_num):
 
     # 링크 관련 문법 구현
     category = '\n<hr><div id="cate">category : '
+    category_re = re.compile('^(?:category|분류):', re.I)
     while 1:
         link = re.search('\[\[((?:(?!\[\[|\]\]).)+)\]\]', data)
         if link:
@@ -901,9 +898,9 @@ def namu(conn, data, title, main_num):
                     data = re.sub('\[\[((?:(?!\[\[|\]\]).)+)\]\]', '<span style="' + file_align + '"><img style="' + file_style + '" alt="' + file_alt + '" src="' + file_src + '"></span>', data, 1)
                 else:
                     data = re.sub('\[\[((?:(?!\[\[|\]\]).)+)\]\]', '<a id="not_thing" href="/w/' + tool.url_pas(file_alt) + '">' + file_alt + '</a>', data, 1)
-            elif re.search('^(?:[Cc]ategory|분류):', main_link):
+            elif category_re.search(main_link):
                 see_link = re.sub('#include', '', see_link)
-                main_link = re.sub('#include', '', re.sub('^(?:[Cc]ategory|분류):', 'category:', main_link))
+                main_link = re.sub('#include', '', category_re.sub('category:', main_link))
 
                 if re.search('#blur', main_link):
                     see_link = 'Hidden'
@@ -915,7 +912,7 @@ def namu(conn, data, title, main_num):
 
                 backlink += [[title, main_link, 'cat']]
 
-                category += '<a ' + link_id + ' href="' + tool.url_pas(main_link) + '">' + re.sub('^(?:[Cc]ategory|분류):', '', see_link) + '</a> / '
+                category += '<a ' + link_id + ' href="' + tool.url_pas(main_link) + '">' + category_re.sub('', see_link) + '</a> / '
                 data = re.sub('\[\[((?:(?!\[\[|\]\]).)+)\]\]', '', data, 1)
             elif re.search('^wiki:', main_link):
                 data = re.sub('\[\[((?:(?!\[\[|\]\]).)+)\]\]', '<a id="inside" href="/' + tool.url_pas(re.sub('^wiki:', '', main_link)) + '">' + see_link + '</a>', data, 1)
@@ -978,7 +975,8 @@ def namu(conn, data, title, main_num):
             break
 
     # br 처리
-    data = re.sub("\[[Bb]r\]", '<br>', data)
+    br_re = re.compile('\[br\]', re.I)
+    data = br_re.sub('<br>', data)
             
     # 각주 처리
     footnote_number = 0

+ 90 - 0
views/main_css/katex/README.md

@@ -0,0 +1,90 @@
+# [<img src="https://cdn.rawgit.com/Khan/KaTeX/84189cd3adae24d92e766d14eb80d6e54f3c7dca/katex-logo.svg" width="130" alt="KaTeX">](https://khan.github.io/KaTeX/)
+[![npm](https://img.shields.io/npm/v/katex.svg)](https://www.npmjs.com/package/katex)
+[![CircleCI](https://circleci.com/gh/Khan/KaTeX.svg?style=shield)](https://circleci.com/gh/Khan/KaTeX)
+[![codecov](https://codecov.io/gh/Khan/KaTeX/branch/master/graph/badge.svg)](https://codecov.io/gh/Khan/KaTeX)
+[![Join the chat at https://gitter.im/Khan/KaTeX](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Khan/KaTeX?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Greenkeeper badge](https://badges.greenkeeper.io/Khan/KaTeX.svg)](https://greenkeeper.io/)
+[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/katex/badge?style=rounded)](https://www.jsdelivr.com/package/npm/katex)
+![](https://img.badgesize.io/Khan/KaTeX/v0.10.0-rc.1/dist/katex.min.js?compression=gzip)
+
+KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web.
+
+ * **Fast:** KaTeX renders its math synchronously and doesn't need to reflow the page. See how it compares to a competitor in [this speed test](http://www.intmath.com/cg5/katex-mathjax-comparison.php).
+ * **Print quality:** KaTeX’s layout is based on Donald Knuth’s TeX, the gold standard for math typesetting.
+ * **Self contained:** KaTeX has no dependencies and can easily be bundled with your website resources.
+ * **Server side rendering:** KaTeX produces the same output regardless of browser or environment, so you can pre-render expressions using Node.js and send them as plain HTML.
+
+KaTeX is compatible with all major browsers, including Chrome, Safari, Firefox, Opera, Edge, and IE 9–11.
+
+KaTeX supports much (but not all) of LaTeX and many LaTeX packages. See the [list of supported functions](https://khan.github.io/KaTeX/docs/supported.html).
+
+Try out KaTeX [on the demo page](https://khan.github.io/KaTeX/#demo)!
+
+## Getting started
+
+### Starter template
+
+```html
+<!DOCTYPE html>
+<!-- KaTeX requires the use of the HTML5 doctype. Without it, KaTeX may not render properly -->
+<html>
+  <head>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.0-rc.1/dist/katex.min.css" integrity="sha384-D+9gmBxUQogRLqvARvNLmA9hS2x//eK1FhVb9PiU86gmcrBrJAQT8okdJ4LMp2uv" crossorigin="anonymous">
+
+    <!-- The loading of KaTeX is deferred to speed up page rendering -->
+    <script defer src="https://cdn.jsdelivr.net/npm/katex@0.10.0-rc.1/dist/katex.min.js" integrity="sha384-483A6DwYfKeDa0Q52fJmxFXkcPCFfnXMoXblOkJ4JcA8zATN6Tm78UNL72AKk+0O" crossorigin="anonymous"></script>
+
+    <!-- To automatically render math in text elements, include the auto-render extension: -->
+    <script defer src="https://cdn.jsdelivr.net/npm/katex@0.10.0-rc.1/dist/contrib/auto-render.min.js" integrity="sha384-yACMu8JWxKzSp/C1YV86pzGiQ/l1YUfE8oPuahJQxzehAjEt2GiQuy/BIvl9KyeF" crossorigin="anonymous"
+        onload="renderMathInElement(document.body);"></script>
+  </head>
+  ...
+</html>
+```
+
+You can also [download KaTeX](https://github.com/khan/katex/releases) and host it yourself.
+
+For details on how to configure auto-render extension, refer to [the documentation](https://khan.github.io/KaTeX/docs/autorender.html).
+
+### API
+
+Call `katex.render` to render a TeX expression directly into a DOM element.
+For example:
+
+```js
+katex.render("c = \\pm\\sqrt{a^2 + b^2}", element, {
+    throwOnError: false
+});
+```
+
+Call `katex.renderToString` to generate an HTML string of the rendered math,
+e.g., for server-side rendering.  For example:
+
+```js
+var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}", {
+    throwOnError: false
+});
+// '<span class="katex">...</span>'
+```
+
+Make sure to include the CSS and font files in both cases.
+If you are doing all rendering on the server, there is no need to include the
+JavaScript on the client.
+
+The examples above use the `throwOnError: false` option, which renders invalid
+inputs as the TeX source code in red (by default), with the error message as
+hover text.  For other available options, see the
+[API documentation](https://khan.github.io/KaTeX/docs/api.html),
+[options documentation](https://khan.github.io/KaTeX/docs/options.html), and
+[handling errors documentation](https://khan.github.io/KaTeX/docs/error.html).
+
+## Demo and Documentation
+
+Learn more about using KaTeX [on the website](https://khan.github.io/KaTeX)!
+
+## Contributing
+
+See [CONTRIBUTING.md](CONTRIBUTING.md)
+
+## License
+
+KaTeX is licensed under the [MIT License](http://opensource.org/licenses/MIT).

+ 321 - 0
views/main_css/katex/contrib/auto-render.js

@@ -0,0 +1,321 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory(require("katex"));
+	else if(typeof define === 'function' && define.amd)
+		define(["katex"], factory);
+	else if(typeof exports === 'object')
+		exports["renderMathInElement"] = factory(require("katex"));
+	else
+		root["renderMathInElement"] = factory(root["katex"]);
+})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__webpack_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__webpack_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __webpack_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__webpack_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 1);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+// EXTERNAL MODULE: external "katex"
+var external_katex_ = __webpack_require__(0);
+var external_katex_default = /*#__PURE__*/__webpack_require__.n(external_katex_);
+
+// CONCATENATED MODULE: ./contrib/auto-render/splitAtDelimiters.js
+/* eslint no-constant-condition:0 */
+var findEndOfMath = function findEndOfMath(delimiter, text, startIndex) {
+    // Adapted from
+    // https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx
+    var index = startIndex;
+    var braceLevel = 0;
+
+    var delimLength = delimiter.length;
+
+    while (index < text.length) {
+        var character = text[index];
+
+        if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) {
+            return index;
+        } else if (character === "\\") {
+            index++;
+        } else if (character === "{") {
+            braceLevel++;
+        } else if (character === "}") {
+            braceLevel--;
+        }
+
+        index++;
+    }
+
+    return -1;
+};
+
+var splitAtDelimiters = function splitAtDelimiters(startData, leftDelim, rightDelim, display) {
+    var finalData = [];
+
+    for (var i = 0; i < startData.length; i++) {
+        if (startData[i].type === "text") {
+            var text = startData[i].data;
+
+            var lookingForLeft = true;
+            var currIndex = 0;
+            var nextIndex = void 0;
+
+            nextIndex = text.indexOf(leftDelim);
+            if (nextIndex !== -1) {
+                currIndex = nextIndex;
+                finalData.push({
+                    type: "text",
+                    data: text.slice(0, currIndex)
+                });
+                lookingForLeft = false;
+            }
+
+            while (true) {
+                if (lookingForLeft) {
+                    nextIndex = text.indexOf(leftDelim, currIndex);
+                    if (nextIndex === -1) {
+                        break;
+                    }
+
+                    finalData.push({
+                        type: "text",
+                        data: text.slice(currIndex, nextIndex)
+                    });
+
+                    currIndex = nextIndex;
+                } else {
+                    nextIndex = findEndOfMath(rightDelim, text, currIndex + leftDelim.length);
+                    if (nextIndex === -1) {
+                        break;
+                    }
+
+                    finalData.push({
+                        type: "math",
+                        data: text.slice(currIndex + leftDelim.length, nextIndex),
+                        rawData: text.slice(currIndex, nextIndex + rightDelim.length),
+                        display: display
+                    });
+
+                    currIndex = nextIndex + rightDelim.length;
+                }
+
+                lookingForLeft = !lookingForLeft;
+            }
+
+            finalData.push({
+                type: "text",
+                data: text.slice(currIndex)
+            });
+        } else {
+            finalData.push(startData[i]);
+        }
+    }
+
+    return finalData;
+};
+
+/* harmony default export */ var auto_render_splitAtDelimiters = (splitAtDelimiters);
+// CONCATENATED MODULE: ./contrib/auto-render/auto-render.js
+/* eslint no-console:0 */
+
+
+
+
+var auto_render_splitWithDelimiters = function splitWithDelimiters(text, delimiters) {
+    var data = [{ type: "text", data: text }];
+    for (var i = 0; i < delimiters.length; i++) {
+        var delimiter = delimiters[i];
+        data = auto_render_splitAtDelimiters(data, delimiter.left, delimiter.right, delimiter.display || false);
+    }
+    return data;
+};
+
+/* Note: optionsCopy is mutated by this method. If it is ever exposed in the
+ * API, we should copy it before mutating.
+ */
+var auto_render_renderMathInText = function renderMathInText(text, optionsCopy) {
+    var data = auto_render_splitWithDelimiters(text, optionsCopy.delimiters);
+    var fragment = document.createDocumentFragment();
+
+    for (var i = 0; i < data.length; i++) {
+        if (data[i].type === "text") {
+            fragment.appendChild(document.createTextNode(data[i].data));
+        } else {
+            var span = document.createElement("span");
+            var math = data[i].data;
+            // Override any display mode defined in the settings with that
+            // defined by the text itself
+            optionsCopy.displayMode = data[i].display;
+            try {
+                external_katex_default.a.render(math, span, optionsCopy);
+            } catch (e) {
+                if (!(e instanceof external_katex_default.a.ParseError)) {
+                    throw e;
+                }
+                optionsCopy.errorCallback("KaTeX auto-render: Failed to parse `" + data[i].data + "` with ", e);
+                fragment.appendChild(document.createTextNode(data[i].rawData));
+                continue;
+            }
+            fragment.appendChild(span);
+        }
+    }
+
+    return fragment;
+};
+
+var renderElem = function renderElem(elem, optionsCopy) {
+    for (var i = 0; i < elem.childNodes.length; i++) {
+        var childNode = elem.childNodes[i];
+        if (childNode.nodeType === 3) {
+            // Text node
+            var frag = auto_render_renderMathInText(childNode.textContent, optionsCopy);
+            i += frag.childNodes.length - 1;
+            elem.replaceChild(frag, childNode);
+        } else if (childNode.nodeType === 1) {
+            (function () {
+                // Element node
+                var className = ' ' + childNode.className + ' ';
+                var shouldRender = optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 && optionsCopy.ignoredClasses.every(function (x) {
+                    return className.indexOf(' ' + x + ' ') === -1;
+                });
+
+                if (shouldRender) {
+                    renderElem(childNode, optionsCopy);
+                }
+            })();
+        }
+        // Otherwise, it's something else, and ignore it.
+    }
+};
+
+var renderMathInElement = function renderMathInElement(elem, options) {
+    if (!elem) {
+        throw new Error("No element provided to render");
+    }
+
+    var optionsCopy = {};
+
+    // Object.assign(optionsCopy, option)
+    for (var option in options) {
+        if (options.hasOwnProperty(option)) {
+            optionsCopy[option] = options[option];
+        }
+    }
+
+    // default options
+    optionsCopy.delimiters = optionsCopy.delimiters || [{ left: "$$", right: "$$", display: true }, { left: "\\(", right: "\\)", display: false },
+    // LaTeX uses $…$, but it ruins the display of normal `$` in text:
+    // {left: "$", right: "$", display: false},
+
+    //  \[…\] must come last in this array. Otherwise, renderMathInElement
+    //  will search for \[ before it searches for $$ or  \(
+    // That makes it susceptible to finding a \\[0.3em] row delimiter and
+    // treating it as if it were the start of a KaTeX math zone.
+    { left: "\\[", right: "\\]", display: true }];
+    optionsCopy.ignoredTags = optionsCopy.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code"];
+    optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || [];
+    optionsCopy.errorCallback = optionsCopy.errorCallback || console.error;
+
+    // Enable sharing of global macros defined via `\gdef` between different
+    // math elements within a single call to `renderMathInElement`.
+    optionsCopy.macros = optionsCopy.macros || {};
+
+    renderElem(elem, optionsCopy);
+};
+
+/* harmony default export */ var auto_render = __webpack_exports__["default"] = (renderMathInElement);
+
+/***/ })
+/******/ ])["default"];
+});

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
views/main_css/katex/contrib/auto-render.min.js


+ 14 - 0
views/main_css/katex/contrib/copy-tex.css

@@ -0,0 +1,14 @@
+/* Force selection of entire .katex/.katex-display blocks, so that we can
+ * copy/paste the entire source code.  If you omit this CSS, partial
+ * selections of a formula will work, but will copy the ugly HTML
+ * representation instead of the LaTeX source code.  (Full selections will
+ * still produce the LaTeX source code.)
+ */
+.katex,
+.katex-display {
+    user-select: all;
+    -moz-user-select: all;
+    -webkit-user-select: all;
+    -ms-user-select: all;
+}
+

+ 191 - 0
views/main_css/katex/contrib/copy-tex.js

@@ -0,0 +1,191 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else {
+		var a = factory();
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})((typeof self !== 'undefined' ? self : this), function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__webpack_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__webpack_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __webpack_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__webpack_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 2);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// extracted by mini-css-extract-plugin
+
+/***/ }),
+/* 1 */,
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+
+// EXTERNAL MODULE: ./contrib/copy-tex/copy-tex.css
+var copy_tex = __webpack_require__(0);
+
+// CONCATENATED MODULE: ./contrib/copy-tex/katex2tex.js
+// Set these to how you want inline and display math to be delimited.
+var defaultCopyDelimiters = {
+    inline: ['$', '$'], // alternative: ['\(', '\)']
+    display: ['$$', '$$'] // alternative: ['\[', '\]']
+};
+
+// Replace .katex elements with their TeX source (<annotation> element).
+// Modifies fragment in-place.  Useful for writing your own 'copy' handler,
+// as in copy-tex.js.
+var katexReplaceWithTex = function katexReplaceWithTex(fragment) {
+    var copyDelimiters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultCopyDelimiters;
+
+    // Remove .katex-html blocks that are preceded by .katex-mathml blocks
+    // (which will get replaced below).
+    var katexHtml = fragment.querySelectorAll('.katex-mathml + .katex-html');
+    for (var i = 0; i < katexHtml.length; i++) {
+        var element = katexHtml[i];
+        if (element.remove) {
+            element.remove(null);
+        } else {
+            element.parentNode.removeChild(element);
+        }
+    }
+    // Replace .katex-mathml elements with their annotation (TeX source)
+    // descendant, with inline delimiters.
+    var katexMathml = fragment.querySelectorAll('.katex-mathml');
+    for (var _i = 0; _i < katexMathml.length; _i++) {
+        var _element = katexMathml[_i];
+        var texSource = _element.querySelector('annotation');
+        if (texSource) {
+            if (_element.replaceWith) {
+                _element.replaceWith(texSource);
+            } else {
+                _element.parentNode.replaceChild(texSource, _element);
+            }
+            texSource.innerHTML = copyDelimiters.inline[0] + texSource.innerHTML + copyDelimiters.inline[1];
+        }
+    }
+    // Switch display math to display delimiters.
+    var displays = fragment.querySelectorAll('.katex-display annotation');
+    for (var _i2 = 0; _i2 < displays.length; _i2++) {
+        var _element2 = displays[_i2];
+        _element2.innerHTML = copyDelimiters.display[0] + _element2.innerHTML.substr(copyDelimiters.inline[0].length, _element2.innerHTML.length - copyDelimiters.inline[0].length - copyDelimiters.inline[1].length) + copyDelimiters.display[1];
+    }
+    return fragment;
+};
+
+/* harmony default export */ var katex2tex = (katexReplaceWithTex);
+// CONCATENATED MODULE: ./contrib/copy-tex/copy-tex.js
+
+
+
+// Global copy handler to modify behavior on .katex elements.
+document.addEventListener('copy', function (event) {
+    var selection = window.getSelection();
+    if (selection.isCollapsed) {
+        return; // default action OK if selection is empty
+    }
+    var fragment = selection.getRangeAt(0).cloneContents();
+    if (!fragment.querySelector('.katex-mathml')) {
+        return; // default action OK if no .katex-mathml elements
+    }
+    // Preserve usual HTML copy/paste behavior.
+    var html = [];
+    for (var i = 0; i < fragment.childNodes.length; i++) {
+        html.push(fragment.childNodes[i].outerHTML);
+    }
+    event.clipboardData.setData('text/html', html.join(''));
+    // Rewrite plain-text version.
+    event.clipboardData.setData('text/plain', katex2tex(fragment).textContent);
+    // Prevent normal copy handling.
+    event.preventDefault();
+});
+
+/***/ })
+/******/ ])["default"];
+});

+ 1 - 0
views/main_css/katex/contrib/copy-tex.min.css

@@ -0,0 +1 @@
+.katex,.katex-display{-moz-user-select:all;-ms-user-select:all;-webkit-user-select:all;user-select:all}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
views/main_css/katex/contrib/copy-tex.min.js


+ 134 - 0
views/main_css/katex/contrib/mathtex-script-type.js

@@ -0,0 +1,134 @@
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory(require("katex"));
+	else if(typeof define === 'function' && define.amd)
+		define(["katex"], factory);
+	else {
+		var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]);
+		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
+	}
+})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// define __esModule on exports
+/******/ 	__webpack_require__.r = function(exports) {
+/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 		}
+/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 	};
+/******/
+/******/ 	// create a fake namespace object
+/******/ 	// mode & 1: value is a module id, require it
+/******/ 	// mode & 2: merge all properties of value into the ns
+/******/ 	// mode & 4: return value when already ns object
+/******/ 	// mode & 8|1: behave like require
+/******/ 	__webpack_require__.t = function(value, mode) {
+/******/ 		if(mode & 1) value = __webpack_require__(value);
+/******/ 		if(mode & 8) return value;
+/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ 		var ns = Object.create(null);
+/******/ 		__webpack_require__.r(ns);
+/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ 		return ns;
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 1);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
+/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__);
+
+
+var scripts = document.body.getElementsByTagName("script");
+scripts = Array.prototype.slice.call(scripts);
+scripts.forEach(function (script) {
+    if (!script.type || !script.type.match(/math\/tex/i)) {
+        return -1;
+    }
+    var display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null;
+
+    var katexElement = document.createElement(display ? "div" : "span");
+    katexElement.setAttribute("class", display ? "equation" : "inline-equation");
+    try {
+        katex__WEBPACK_IMPORTED_MODULE_0___default.a.render(script.text, katexElement, { displayMode: display });
+    } catch (err) {
+        //console.error(err); linter doesn't like this
+        katexElement.textContent = script.text;
+    }
+    script.parentNode.replaceChild(katexElement, script);
+});
+
+/***/ })
+/******/ ])["default"];
+});

+ 1 - 0
views/main_css/katex/contrib/mathtex-script-type.min.js

@@ -0,0 +1 @@
+!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("katex"));else if("function"==typeof define&&define.amd)define(["katex"],t);else{var r="object"==typeof exports?t(require("katex")):t(e.katex);for(var n in r)("object"==typeof exports?exports:e)[n]=r[n]}}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(t,r){t.exports=e},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),u=document.body.getElementsByTagName("script");(u=Array.prototype.slice.call(u)).forEach(function(e){if(!e.type||!e.type.match(/math\/tex/i))return-1;var t=null!=e.type.match(/mode\s*=\s*display(;|\s|\n|$)/),r=document.createElement(t?"div":"span");r.setAttribute("class",t?"equation":"inline-equation");try{o.a.render(e.text,r,{displayMode:t})}catch(t){r.textContent=e.text}e.parentNode.replaceChild(r,e)})}]).default});

BIN
views/main_css/katex/fonts/KaTeX_AMS-Regular.ttf


BIN
views/main_css/katex/fonts/KaTeX_AMS-Regular.woff


BIN
views/main_css/katex/fonts/KaTeX_AMS-Regular.woff2


BIN
views/main_css/katex/fonts/KaTeX_Caligraphic-Bold.ttf


BIN
views/main_css/katex/fonts/KaTeX_Caligraphic-Bold.woff


BIN
views/main_css/katex/fonts/KaTeX_Caligraphic-Bold.woff2


BIN
views/main_css/katex/fonts/KaTeX_Caligraphic-Regular.ttf


BIN
views/main_css/katex/fonts/KaTeX_Caligraphic-Regular.woff


BIN
views/main_css/katex/fonts/KaTeX_Caligraphic-Regular.woff2


BIN
views/main_css/katex/fonts/KaTeX_Fraktur-Bold.ttf


BIN
views/main_css/katex/fonts/KaTeX_Fraktur-Bold.woff


BIN
views/main_css/katex/fonts/KaTeX_Fraktur-Bold.woff2


BIN
views/main_css/katex/fonts/KaTeX_Fraktur-Regular.ttf


BIN
views/main_css/katex/fonts/KaTeX_Fraktur-Regular.woff


BIN
views/main_css/katex/fonts/KaTeX_Fraktur-Regular.woff2


BIN
views/main_css/katex/fonts/KaTeX_Main-Bold.ttf


BIN
views/main_css/katex/fonts/KaTeX_Main-Bold.woff


BIN
views/main_css/katex/fonts/KaTeX_Main-Bold.woff2


BIN
views/main_css/katex/fonts/KaTeX_Main-BoldItalic.ttf


BIN
views/main_css/katex/fonts/KaTeX_Main-BoldItalic.woff


BIN
views/main_css/katex/fonts/KaTeX_Main-BoldItalic.woff2


BIN
views/main_css/katex/fonts/KaTeX_Main-Italic.ttf


BIN
views/main_css/katex/fonts/KaTeX_Main-Italic.woff


BIN
views/main_css/katex/fonts/KaTeX_Main-Italic.woff2


BIN
views/main_css/katex/fonts/KaTeX_Main-Regular.ttf


BIN
views/main_css/katex/fonts/KaTeX_Main-Regular.woff


BIN
views/main_css/katex/fonts/KaTeX_Main-Regular.woff2


BIN
views/main_css/katex/fonts/KaTeX_Math-BoldItalic.ttf


BIN
views/main_css/katex/fonts/KaTeX_Math-BoldItalic.woff


BIN
views/main_css/katex/fonts/KaTeX_Math-BoldItalic.woff2


BIN
views/main_css/katex/fonts/KaTeX_Math-Italic.ttf


BIN
views/main_css/katex/fonts/KaTeX_Math-Italic.woff


BIN
views/main_css/katex/fonts/KaTeX_Math-Italic.woff2


BIN
views/main_css/katex/fonts/KaTeX_SansSerif-Bold.ttf


BIN
views/main_css/katex/fonts/KaTeX_SansSerif-Bold.woff


BIN
views/main_css/katex/fonts/KaTeX_SansSerif-Bold.woff2


BIN
views/main_css/katex/fonts/KaTeX_SansSerif-Italic.ttf


BIN
views/main_css/katex/fonts/KaTeX_SansSerif-Italic.woff


BIN
views/main_css/katex/fonts/KaTeX_SansSerif-Italic.woff2


BIN
views/main_css/katex/fonts/KaTeX_SansSerif-Regular.ttf


BIN
views/main_css/katex/fonts/KaTeX_SansSerif-Regular.woff


BIN
views/main_css/katex/fonts/KaTeX_SansSerif-Regular.woff2


BIN
views/main_css/katex/fonts/KaTeX_Script-Regular.ttf


BIN
views/main_css/katex/fonts/KaTeX_Script-Regular.woff


BIN
views/main_css/katex/fonts/KaTeX_Script-Regular.woff2


BIN
views/main_css/katex/fonts/KaTeX_Size1-Regular.ttf


BIN
views/main_css/katex/fonts/KaTeX_Size1-Regular.woff


BIN
views/main_css/katex/fonts/KaTeX_Size1-Regular.woff2


BIN
views/main_css/katex/fonts/KaTeX_Size2-Regular.ttf


BIN
views/main_css/katex/fonts/KaTeX_Size2-Regular.woff


BIN
views/main_css/katex/fonts/KaTeX_Size2-Regular.woff2


BIN
views/main_css/katex/fonts/KaTeX_Size3-Regular.ttf


BIN
views/main_css/katex/fonts/KaTeX_Size3-Regular.woff


BIN
views/main_css/katex/fonts/KaTeX_Size3-Regular.woff2


BIN
views/main_css/katex/fonts/KaTeX_Size4-Regular.ttf


BIN
views/main_css/katex/fonts/KaTeX_Size4-Regular.woff


BIN
views/main_css/katex/fonts/KaTeX_Size4-Regular.woff2


BIN
views/main_css/katex/fonts/KaTeX_Typewriter-Regular.ttf


BIN
views/main_css/katex/fonts/KaTeX_Typewriter-Regular.woff


BIN
views/main_css/katex/fonts/KaTeX_Typewriter-Regular.woff2


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
views/main_css/katex/katex.min.css


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
views/main_css/katex/katex.min.js


+ 14 - 0
views/main_css/parser.js

@@ -0,0 +1,14 @@
+hljs.initHighlightingOnLoad(); 
+
+function folding(num) { 
+    var fol = document.getElementById('folding_' + num); 
+    if(fol.style.display == 'inline-block' || fol.style.display == 'block') { 
+        fol.style.display = 'none';
+    } else {
+        if(num % 2 == 0) { 
+            fol.style.display = 'block'; 
+        } else { 
+            fol.style.display = 'inline-block'; 
+        } 
+    } 
+}

+ 4 - 0
views/neo_yousoro/css/main.css

@@ -306,4 +306,8 @@ input {
 
 #cate {
     border: 2px solid gainsboro;
+}
+
+#syntax code {
+    background: transparent;
 }

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است