From a3076b707ad6061bd0c359664dae93467a9a641e Mon Sep 17 00:00:00 2001 From: Llewellyn van der Merwe Date: Mon, 22 Aug 2022 12:42:12 +0200 Subject: [PATCH] Update the deflate script. Converted the parse script. Update README. --- README.md | 77 ++++++++++++--- deflate.js | 185 ++++++++++++++++++++---------------- plantuml.js | 16 ++++ plantuml_codeblock_parse.js | 17 ---- 4 files changed, 185 insertions(+), 110 deletions(-) create mode 100644 plantuml.js delete mode 100644 plantuml_codeblock_parse.js diff --git a/README.md b/README.md index b0386e1..a91fb18 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,83 @@ -# plantuml-code-highlight +# PlantUML -Javascript necessary to render plantuml from content in a html-block of class "language-plantuml". Possible to use with Gitea. +Javascript necessary to render PlantUML from content in a html-block of class "language-uml". + +> With help to get this to work on Gitea. ## Install -Copy the javascript files to your server. Then to convert all html blocks having the class `language-plantuml` add the following to the html page: +Copy the javascript files to your server. +Then to convert all html blocks having the class `language-uml` add the following to the html page: ```html - + ``` -Specifically for Gitea: Copy the javascript files to your `custom/public` folder. Then place the following code in `custom/templates/custom/footer.tmpl`: +### Specifically for Gitea + +Copy the javascript files to your `custom/public` folder. +Then place the following code in `custom/templates/custom/footer.tmpl`: + ```html -{{if .RequireHighlightJS}} - - - -{{end}} +``` + +## How to use in GITEA + +You add a normal code block with 3 backticks `` ``` `` but then add to the opening **uml** like this: `` ```uml `` + +Example: +
+```uml
+@startuml
+(*) --> "Initialization"
+
+if "Some Test" then
+  -->[true] "Some Action"
+  --> "Another Action"
+  -right-> (*)
+else
+  ->[false] "Something else"
+  -->[Ending process] (*)
+endif
+
+@enduml
+```
+
+ +Output: +```uml +@startuml +(*) --> "Initialization" + +if "Some Test" then + -->[true] "Some Action" + --> "Another Action" + -right-> (*) +else + ->[false] "Something else" + -->[Ending process] (*) +endif + +@enduml ``` ## License - deflate.js: Copyright (C) 1999 Masanao Izumo . Some sources claim this to be GPL-2 - encode.js: From https://plantuml.com/code-javascript-synchronous. GPL-3 -- plantuml_codeblock_parse.js: David Svantesson. MIT or GPL-2 or GPL-3 at your choice. +- plantuml.js: MIT or GPL-2 or GPL-3 at your choice. diff --git a/deflate.js b/deflate.js index 9a47af5..7f88f8e 100644 --- a/deflate.js +++ b/deflate.js @@ -1,3 +1,17 @@ +/* + * $Id: rawdeflate.js,v 0.5 2013/04/09 14:25:38 dankogai Exp $ + * + * UPDATED: deflate.js,v 0.6 2021/08/22 11:55:38 <>yn + * https://git.vdm.dev/octoleo/plantuml-gitea + * + * GNU General Public License, version 2 (GPL-2.0) + * http://opensource.org/licenses/GPL-2.0 + * Original: + * http://www.onicos.com/staff/iz/amuse/javascript/expert/deflate.txt + */ + +(function(vdm){ + /* Copyright (C) 1999 Masanao Izumo * Version: 1.0.1 * LastModified: Dec 25 1999 @@ -121,6 +135,42 @@ var zip_static_len; var zip_deflate_data; var zip_deflate_pos; +/* objects (deflate) */ + +var zip_DeflateCT = function() { + this.fc = 0; // frequency count or bit string + this.dl = 0; // father node in Huffman tree or length of bit string +} + +var zip_DeflateTreeDesc = function() { + this.dyn_tree = null; // the dynamic tree + this.static_tree = null; // corresponding static tree or NULL + this.extra_bits = null; // extra bits for each code or NULL + this.extra_base = 0; // base index for extra_bits + this.elems = 0; // max number of elements in the tree + this.max_length = 0; // max bit length for the codes + this.max_code = 0; // largest code with non zero frequency +} + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +var zip_DeflateConfiguration = function(a, b, c, d) { + this.good_length = a; // reduce lazy search above this match length + this.max_lazy = b; // do not perform lazy search above this match length + this.nice_length = c; // quit search above this match length + this.max_chain = d; +} + +var zip_DeflateBuffer = function() { + this.next = null; + this.len = 0; + this.ptr = new Array(zip_OUTBUFSIZ); + this.off = 0; +} + /* constant tables */ var zip_extra_lbits = new Array( 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0); @@ -142,45 +192,10 @@ var zip_configuration_table = new Array( new zip_DeflateConfiguration(32, 128, 258, 1024), new zip_DeflateConfiguration(32, 258, 258, 4096)); -/* objects (deflate) */ - -function zip_DeflateCT() { - this.fc = 0; // frequency count or bit string - this.dl = 0; // father node in Huffman tree or length of bit string -} - -function zip_DeflateTreeDesc() { - this.dyn_tree = null; // the dynamic tree - this.static_tree = null; // corresponding static tree or NULL - this.extra_bits = null; // extra bits for each code or NULL - this.extra_base = 0; // base index for extra_bits - this.elems = 0; // max number of elements in the tree - this.max_length = 0; // max bit length for the codes - this.max_code = 0; // largest code with non zero frequency -} - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -function zip_DeflateConfiguration(a, b, c, d) { - this.good_length = a; // reduce lazy search above this match length - this.max_lazy = b; // do not perform lazy search above this match length - this.nice_length = c; // quit search above this match length - this.max_chain = d; -} - -function zip_DeflateBuffer() { - this.next = null; - this.len = 0; - this.ptr = new Array(zip_OUTBUFSIZ); - this.off = 0; -} /* routines (deflate) */ -function zip_deflate_start(level) { +var zip_deflate_start = function(level) { var i; if(!level) @@ -230,7 +245,7 @@ function zip_deflate_start(level) { zip_flag_buf = new Array(parseInt(zip_LIT_BUFSIZE / 8)); } -function zip_deflate_end() { +var zip_deflate_end = function() { zip_free_queue = zip_qhead = zip_qtail = null; zip_outbuf = null; zip_window = null; @@ -255,12 +270,12 @@ function zip_deflate_end() { zip_flag_buf = null; } -function zip_reuse_queue(p) { +var zip_reuse_queue = function(p) { p.next = zip_free_queue; zip_free_queue = p; } -function zip_new_queue() { +var zip_new_queue = function() { var p; if(zip_free_queue != null) @@ -276,11 +291,11 @@ function zip_new_queue() { return p; } -function zip_head1(i) { +var zip_head1 = function(i) { return zip_prev[zip_WSIZE + i]; } -function zip_head2(i, val) { +var zip_head2 = function(i, val) { return zip_prev[zip_WSIZE + i] = val; } @@ -289,14 +304,14 @@ function zip_head2(i, val) { * suffix table instead of its output buffer, so it does not use put_ubyte * (to be cleaned up). */ -function zip_put_byte(c) { +var zip_put_byte = function(c) { zip_outbuf[zip_outoff + zip_outcnt++] = c; if(zip_outoff + zip_outcnt == zip_OUTBUFSIZ) zip_qoutbuf(); } /* Output a 16 bit value, lsb first */ -function zip_put_short(w) { +var zip_put_short = function(w) { w &= 0xffff; if(zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff); @@ -315,7 +330,7 @@ function zip_put_short(w) { * input characters and the first MIN_MATCH bytes of s are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ -function zip_INSERT_STRING() { +var zip_INSERT_STRING = function() { zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff)) & zip_HASH_MASK; @@ -325,7 +340,7 @@ function zip_INSERT_STRING() { } /* Send a code of the given tree. c and tree must not have side effects */ -function zip_SEND_CODE(c, tree) { +var zip_SEND_CODE = function(c, tree) { zip_send_bits(tree[c].fc, tree[c].dl); } @@ -333,7 +348,7 @@ function zip_SEND_CODE(c, tree) { * must not have side effects. dist_code[256] and dist_code[257] are never * used. */ -function zip_D_CODE(dist) { +var zip_D_CODE = function(dist) { return (dist < 256 ? zip_dist_code[dist] : zip_dist_code[256 + (dist>>7)]) & 0xff; } @@ -342,7 +357,7 @@ function zip_D_CODE(dist) { * Compares to subtrees, using the tree depth as tie breaker when * the subtrees have equal frequency. This minimizes the worst case length. */ -function zip_SMALLER(tree, n, m) { +var zip_SMALLER = function(tree, n, m) { return tree[n].fc < tree[m].fc || (tree[n].fc == tree[m].fc && zip_depth[n] <= zip_depth[m]); } @@ -350,7 +365,7 @@ function zip_SMALLER(tree, n, m) { /* ========================================================================== * read string data */ -function zip_read_buff(buff, offset, n) { +var zip_read_buff = function(buff, offset, n) { var i; for(i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++) buff[offset + i] = @@ -361,7 +376,7 @@ function zip_read_buff(buff, offset, n) { /* ========================================================================== * Initialize the "longest match" routines for a new file */ -function zip_lm_init() { +var zip_lm_init = function() { var j; /* Initialize the hash table. */ @@ -412,7 +427,7 @@ function zip_lm_init() { * IN assertions: cur_match is the head of the hash chain for the current * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 */ -function zip_longest_match(cur_match) { +var zip_longest_match = function(cur_match) { var chain_length = zip_max_chain_length; // max hash chain length var scanp = zip_strstart; // current string var matchp; // matched string @@ -500,7 +515,7 @@ function zip_longest_match(cur_match) { * file reads are performed for at least two bytes (required for the * translate_eol option). */ -function zip_fill_window() { +var zip_fill_window = function() { var n, m; // Amount of free space at the end of the window. @@ -557,7 +572,7 @@ function zip_fill_window() { * new strings in the dictionary only for unmatched strings or for short * matches. It is used only for the fast compression options. */ -function zip_deflate_fast() { +var zip_deflate_fast = function() { while(zip_lookahead != 0 && zip_qhead == null) { var flush; // set if current block must be flushed @@ -635,7 +650,7 @@ function zip_deflate_fast() { } } -function zip_deflate_better() { +var zip_deflate_better = function() { /* Process the input block. */ while(zip_lookahead != 0 && zip_qhead == null) { /* Insert the string window[strstart .. strstart+2] in the @@ -732,7 +747,7 @@ function zip_deflate_better() { } } -function zip_init_deflate() { +var zip_init_deflate = function() { if(zip_eofile) return; zip_bi_buf = 0; @@ -743,6 +758,7 @@ function zip_init_deflate() { zip_qhead = null; zip_outcnt = 0; zip_outoff = 0; + zip_match_available = 0; if(zip_compr_level <= 3) { @@ -753,6 +769,7 @@ function zip_init_deflate() { { zip_match_length = zip_MIN_MATCH - 1; zip_match_available = 0; + zip_match_available = 0; } zip_complete = false; @@ -763,7 +780,7 @@ function zip_init_deflate() { * evaluation for matches: a match is finally adopted only if there is * no better match at the next window position. */ -function zip_deflate_internal(buff, off, buff_size) { +var zip_deflate_internal = function(buff, off, buff_size) { var n; if(!zip_initflag) @@ -795,7 +812,7 @@ function zip_deflate_internal(buff, off, buff_size) { return n + zip_qcopy(buff, n + off, buff_size - n); } -function zip_qcopy(buff, off, buff_size) { +var zip_qcopy = function(buff, off, buff_size) { var n, i, j; n = 0; @@ -842,7 +859,7 @@ function zip_qcopy(buff, off, buff_size) { * location of the internal file attribute (ascii/binary) and method * (DEFLATE/STORE). */ -function zip_ct_init() { +var zip_ct_init = function() { var n; // iterates over tree elements var bits; // bit counter var length; // length value @@ -934,7 +951,7 @@ function zip_ct_init() { /* ========================================================================== * Initialize a new block. */ -function zip_init_block() { +var zip_init_block = function() { var n; // iterates over tree elements // Initialize the trees. @@ -955,7 +972,7 @@ function zip_init_block() { * when the heap property is re-established (each father smaller than its * two sons). */ -function zip_pqdownheap( +var zip_pqdownheap = function( tree, // the tree to restore k) { // node to move down var v = zip_heap[k]; @@ -991,7 +1008,7 @@ function zip_pqdownheap( * The length opt_len is updated; static_len is also updated if stree is * not null. */ -function zip_gen_bitlen(desc) { // the tree descriptor +var zip_gen_bitlen = function(desc) { // the tree descriptor var tree = desc.dyn_tree; var extra = desc.extra_bits; var base = desc.extra_base; @@ -1082,7 +1099,7 @@ function zip_gen_bitlen(desc) { // the tree descriptor * OUT assertion: the field code is set for all tree elements of non * zero code length. */ -function zip_gen_codes(tree, // the tree to decorate +var zip_gen_codes = function(tree, // the tree to decorate max_code) { // largest code with non zero frequency var next_code = new Array(zip_MAX_BITS+1); // next code value for each bit length var code = 0; // running code value @@ -1124,7 +1141,7 @@ function zip_gen_codes(tree, // the tree to decorate * and corresponding code. The length opt_len is updated; static_len is * also updated if stree is not null. The field max_code is set. */ -function zip_build_tree(desc) { // the tree descriptor +var zip_build_tree = function(desc) { // the tree descriptor var tree = desc.dyn_tree; var stree = desc.static_tree; var elems = desc.elems; @@ -1215,7 +1232,7 @@ function zip_build_tree(desc) { // the tree descriptor * counts. (The contribution of the bit length codes will be added later * during the construction of bl_tree.) */ -function zip_scan_tree(tree,// the tree to be scanned +var zip_scan_tree = function(tree,// the tree to be scanned max_code) { // and its largest code of non zero frequency var n; // iterates over all tree elements var prevlen = -1; // last emitted length @@ -1264,7 +1281,7 @@ function zip_scan_tree(tree,// the tree to be scanned * Send a literal or distance tree in compressed form, using the codes in * bl_tree. */ -function zip_send_tree(tree, // the tree to be scanned +var zip_send_tree = function(tree, // the tree to be scanned max_code) { // and its largest code of non zero frequency var n; // iterates over all tree elements var prevlen = -1; // last emitted length @@ -1321,7 +1338,7 @@ function zip_send_tree(tree, // the tree to be scanned * Construct the Huffman tree for the bit lengths and return the index in * bl_order of the last bit length code to send. */ -function zip_build_bl_tree() { +var zip_build_bl_tree = function() { var max_blindex; // index of last bit length code of non zero freq // Determine the bit length frequencies for literal and distance trees @@ -1354,7 +1371,7 @@ function zip_build_bl_tree() { * lengths of the bit length codes, the literal tree and the distance tree. * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. */ -function zip_send_all_trees(lcodes, dcodes, blcodes) { // number of codes for each tree +var zip_send_all_trees = function(lcodes, dcodes, blcodes) { // number of codes for each tree var rank; // index in bl_order // Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); @@ -1380,7 +1397,7 @@ function zip_send_all_trees(lcodes, dcodes, blcodes) { // number of codes for ea * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ -function zip_flush_block(eof) { // true if this is the last block for a file +var zip_flush_block = function(eof) { // true if this is the last block for a file var opt_lenb, static_lenb; // opt_len and static_len in bytes var max_blindex; // index of last bit length code of non zero freq var stored_len; // length of input block @@ -1461,7 +1478,7 @@ function zip_flush_block(eof) { // true if this is the last block for a file * Save the match info and tally the frequency counts. Return true if * the current block must be flushed. */ -function zip_ct_tally( +var zip_ct_tally = function( dist, // distance of matched string lc) { // match length-MIN_MATCH or unmatched char (if dist==0) zip_l_buf[zip_last_lit++] = lc; @@ -1518,7 +1535,7 @@ function zip_ct_tally( /* ========================================================================== * Send the block data compressed using the given Huffman trees */ -function zip_compress_block( +var zip_compress_block = function( ltree, // literal tree dtree) { // distance tree var dist; // distance of matched string @@ -1569,7 +1586,7 @@ function zip_compress_block( * IN assertion: length <= 16 and value fits in length bits. */ var zip_Buf_size = 16; // bit size of bi_buf -function zip_send_bits( +var zip_send_bits = function( value, // value to send length) { // number of bits /* If not enough room in bi_buf, use (valid) bits from bi_buf and @@ -1592,7 +1609,7 @@ function zip_send_bits( * method would use a table) * IN assertion: 1 <= len <= 15 */ -function zip_bi_reverse( +var zip_bi_reverse = function( code, // the value to invert len) { // its bit length var res = 0; @@ -1607,7 +1624,7 @@ function zip_bi_reverse( /* ========================================================================== * Write out any remaining bits in an incomplete byte. */ -function zip_bi_windup() { +var zip_bi_windup = function() { if(zip_bi_valid > 8) { zip_put_short(zip_bi_buf); } else if(zip_bi_valid > 0) { @@ -1617,7 +1634,7 @@ function zip_bi_windup() { zip_bi_valid = 0; } -function zip_qoutbuf() { +var zip_qoutbuf = function() { if(zip_outcnt != 0) { var q, i; q = zip_new_queue(); @@ -1633,8 +1650,7 @@ function zip_qoutbuf() { } } -function zip_deflate(str, level) { - var out, buff; +var zip_deflate = function(str, level) { var i, j; zip_deflate_data = str; @@ -1643,12 +1659,21 @@ function zip_deflate(str, level) { level = zip_DEFAULT_LEVEL; zip_deflate_start(level); - buff = new Array(1024); - out = ""; + var buff = new Array(1024); + var aout = []; while((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { - for(j = 0; j < i; j++) - out += String.fromCharCode(buff[j]); + var cbuf = new Array(i); + for(j = 0; j < i; j++){ + cbuf[j] = String.fromCharCode(buff[j]); + } + aout[aout.length] = cbuf.join(""); } zip_deflate_data = null; // G.C. - return out; + return aout.join(""); } + +if (! vdm.PlantUML) vdm.PlantUML = {}; +vdm.PlantUML.deflate = zip_deflate; + +})(this); + diff --git a/plantuml.js b/plantuml.js new file mode 100644 index 0000000..0eeb783 --- /dev/null +++ b/plantuml.js @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2022 <>yn + * https://git.vdm.dev/octoleo/plantuml-gitea + * MIT License + * + */ + +function plantUML(url = 'http://www.plantuml.com/plantuml') { + $(document).ready(function() { + $(".language-uml").each(function() { + plantuml_text = unescape(encodeURIComponent(this.innerText)); + this.closest(".code-block").outerHTML = + ""; + }); + }); +} diff --git a/plantuml_codeblock_parse.js b/plantuml_codeblock_parse.js deleted file mode 100644 index 64a143c..0000000 --- a/plantuml_codeblock_parse.js +++ /dev/null @@ -1,17 +0,0 @@ -/* Copyright (C) 2020 David Svantesson - * MIT License - * - */ - -function parsePlantumlCodeBlocks(plantumlServer = "http://www.plantuml.com/plantuml", htmlClass = "language-plantuml") { - var codeBlocks = document.getElementsByClassName(htmlClass); - - for (var block_i = 0; block_i < codeBlocks.length; block_i++) { - block_string = codeBlocks[block_i].innerText - //UTF8 - block_string = unescape(encodeURIComponent(block_string)); - codeBlocks[block_i].innerHTML = ""; - } - -} -