Mercurial > zeropaste
comparison app/javascript/application.js @ 489:361ab9e7ffad
Replace webpacker with esbuild and use plain js instead of coffee
author | nanaya <me@nanaya.net> |
---|---|
date | Tue, 17 Jan 2023 02:34:06 +0900 |
parents | app/javascript/src/main.coffee@b493db1f40b0 |
children |
comparison
equal
deleted
inserted
replaced
488:994ae0349ade | 489:361ab9e7ffad |
---|---|
1 import 'bootstrap'; | |
2 import hljs from 'highlight.js'; | |
3 import * as commonmark from 'commonmark'; | |
4 | |
5 /* global $ */ | |
6 $(document).on('click', '.js-paste-clear', (e) => { | |
7 e.preventDefault(); | |
8 $('.js-paste-paste') | |
9 .val('') | |
10 .focus(); | |
11 }); | |
12 | |
13 function loadLanguageItems () { | |
14 const $languageSelectBox = $('#paste_language'); | |
15 if ($languageSelectBox.length === 0) return; | |
16 | |
17 for (const language of hljs.listLanguages().sort()) { | |
18 $languageSelectBox.append($( | |
19 '<option />', | |
20 { text: language, value: language } | |
21 )); | |
22 } | |
23 } | |
24 | |
25 function markdownfy (plaintext) { | |
26 const reader = new commonmark.Parser(); | |
27 const writer = new commonmark.HtmlRenderer({ safe: true }); | |
28 | |
29 return writer.render(reader.parse(plaintext)); | |
30 } | |
31 | |
32 function pasteText () { | |
33 return $('.js-paste-paste').val() || $('.js-paste-pl').text(); | |
34 } | |
35 | |
36 function highlightText () { | |
37 const $hlBox = $('.js-paste-hl'); | |
38 if ($hlBox.attr('data-processed') === '1') return; | |
39 | |
40 $hlBox.text(pasteText()); | |
41 | |
42 const highlight = () => hljs.highlightBlock($hlBox[0]); | |
43 window.setTimeout(highlight, 0); | |
44 | |
45 $hlBox.attr('data-processed', '1'); | |
46 } | |
47 | |
48 function markdownText () { | |
49 const $mdBox = $('.js-paste-md'); | |
50 if ($mdBox.attr('data-processed') === '1') return; | |
51 | |
52 $mdBox.html(markdownfy(pasteText())); | |
53 $mdBox.find('a').attr('rel', 'nofollow'); | |
54 $mdBox.attr('data-processed', '1'); | |
55 } | |
56 | |
57 function setHash (e) { | |
58 let newLocation = `#${e.currentTarget.getAttribute('data-mode')}`; | |
59 if (newLocation === '#pl') { | |
60 newLocation = window.location.pathname; | |
61 } | |
62 | |
63 window.history.replaceState(null, '', newLocation); | |
64 } | |
65 | |
66 function showPreview (e) { | |
67 e.preventDefault(); | |
68 const text = pasteText(); | |
69 if (text === '') return; | |
70 $('.js-paste-preview-md-box').html(markdownfy(text)); | |
71 $('.js-paste-preview-md-modal').modal('show'); | |
72 } | |
73 | |
74 function switchToCurrentHash () { | |
75 if ($('.js-showing-paste').length === 0) return; | |
76 | |
77 const format = window.location.hash.slice(1); | |
78 | |
79 if (!['pl', 'hl', 'md'].includes(format)) return; | |
80 | |
81 $('.js-show-tab[data-mode=#{format}]').click(); | |
82 } | |
83 | |
84 $(loadLanguageItems); | |
85 $(switchToCurrentHash); | |
86 $(document).on('click', '.js-paste-preview-md', showPreview); | |
87 $(document).on('click', '.js-show-tab[data-mode=hl]', highlightText); | |
88 $(document).on('click', '.js-show-tab[data-mode=md]', markdownText); | |
89 $(document).on('click', '.js-show-tab', setHash); |