From 6eeb0d58f51941357347034d5bf1b74fb2b5058a Mon Sep 17 00:00:00 2001 From: Jake Date: Tue, 1 Jun 2021 14:09:41 -0700 Subject: [PATCH 1/4] Add save lang to code tabs. WIP. If multiple tab blocks have different names it will hide all. --- assets/js/multicodetab.js | 85 ++++++++++++++++++++++++++--------- tool/filter_multicode_tabs.py | 77 +++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+), 21 deletions(-) create mode 100644 tool/filter_multicode_tabs.py diff --git a/assets/js/multicodetab.js b/assets/js/multicodetab.js index 38db414ffb..9a8b9436e0 100644 --- a/assets/js/multicodetab.js +++ b/assets/js/multicodetab.js @@ -47,31 +47,74 @@ all copies or substantial portions of the Software. */ jQuery.fn.minitabs = function(speed,effect) { - this.each(function() { - var id = "#" + $(this).attr('id') + + function saveToLocal(lang){ + console.log("saving language > " + lang); + window.localStorage.setItem('user-preferred-devlanguage', lang); + } + + function showSelectedTabFromSaved(id){ + // get any data from local stores. + $savedValue = window.localStorage.getItem('user-preferred-devlanguage'); + // show all tabs if value present + if($savedValue !== null) { + showSlectedTab($savedValue); + }else { $(id + ">DIV:gt(0)").hide(); $(id + ">UL>LI>A:first").addClass("current"); + } + } + + function showSlectedTab(lang) { + // Hide all. + // Tab heads + $(".multicode>UL>LI>A").removeClass("current"); + // Tab contents + $(".multicode>DIV").hide(speed); + + $(this).blur(); + //show selcted. + $(".multicode>UL>LI>."+lang).addClass("current"); + $(".multicode>DIV."+lang).show(speed); + + // TODO: Only add/remove on samples that DO contain that value. + // Example + // if javascript is lang. + // only add current if the UL has javascript in the tabs. + // Otherwise this will hide all tabs and not show anything. + + // save in localstorage. + saveToLocal(lang); + } + + this.each(function() { + var id = "#" + $(this).attr('id') + //Use saved value or set to first tab + showSelectedTabFromSaved(id); + + //Add click on each tab $(id + ">UL>LI>A").click( function(){ - $(id + ">UL>LI>A").removeClass("current"); - $(this).addClass("current"); - $(this).blur(); - var re = /([_\-\w]+$)/i; - var target = $('#' + re.exec(this.href)[1]); - var old = $(id + ">DIV"); - switch (effect) { - case 'fade': - old.fadeOut(speed).fadeOut(speed); - target.fadeIn(speed); - break; - case 'slide': - old.slideUp(speed); - target.fadeOut(speed).fadeIn(speed); - break; - default : - old.hide(speed); - target.show(speed) - } + showSlectedTab($(this).attr('class')) + + //Old + + // var re = /([_\-\w]+$)/i; + // var target = $('#' + re.exec(this.href)[1]); + // var old = $(id + ">DIV"); + // switch (effect) { + // case 'fade': + // old.fadeOut(speed).fadeOut(speed); + // target.fadeIn(speed); + // break; + // case 'slide': + // old.slideUp(speed); + // target.fadeOut(speed).fadeIn(speed); + // break; + // default : + // old.hide(speed); + // target.show(speed) + // } return false; } ); diff --git a/tool/filter_multicode_tabs.py b/tool/filter_multicode_tabs.py new file mode 100644 index 0000000000..a98d5992eb --- /dev/null +++ b/tool/filter_multicode_tabs.py @@ -0,0 +1,77 @@ +################################################################################ +## Multicode Tabs 2 filter ## +## Author: Rome Reginelli ## +## Copyright: Ripple Labs, Inc. 2016 ## +## ## +## Finds multicode tab sections and turns them into properly-formatted ## +## HTML syntax to use with minitabs jQuery ## +################################################################################ +import re +import logging + +MC_START_REGEX = re.compile(r"") +MC_END_REGEX = re.compile(r"") + +def filter_html(html, mode="html", **kwargs): + """ + Turn multicode comments into a div (after markdown inside is parsed). You + can use this div for styling even in PDF format. Doesn't apply to Markdown + since most parsers won't parse markdown inside HTML blocks. + """ + + if mode == "md": + return html + + html = re.sub(MC_START_REGEX, "
", html) + html = re.sub(MC_END_REGEX, "
", html) + return html + +def filter_soup(soup, mode="html", **kwargs): + """Turn a multicode block into the correct syntax for minitabs, but only + in the HTML version.""" + if mode != "html": + return + + multicodes = soup.find_all(class_="multicode") + index1 = 0 + for cb_area in multicodes: + cb_area["id"] = "code-%d" % index1 + + codetabs_ul = soup.new_tag("ul") + codetabs_ul["class"] = "codetabs" + cb_area.insert(0,codetabs_ul) + + pres = cb_area.find_all(class_="codehilite") + index2 = 0 + for pre in pres: + #make a unique ID for this code sample + linkid = "code-%d-%d" % (index1, index2) + + #wrap this code sample in an ID'd div + code_sample_wrapper = soup.new_tag("div", id=linkid) + code_sample_wrapper["style"] = "position: static;" + pre.wrap(code_sample_wrapper) + + #add a link to the tabs ul + linkback = soup.new_tag("a", href=("#%s" % linkid)) + linkback_li = soup.new_tag("li") + + linkback_li.append(linkback) + codetabs_ul.append(linkback_li) + + #find the text label for this sample + prev_p = code_sample_wrapper.find_previous_sibling("p") + try: + label = "".join(prev_p.em.strings) + except AttributeError: + label = "Code Sample %d-%d" % (index1, index2) + linkback.string = label + #add class with name of tab label + label_class = label.replace(" ","").replace("-","").lower() + linkback["class"] = label_class + code_sample_wrapper["class"] = "code_sample " + label_class + prev_p.decompose() + + index2 += 1 + + index1 += 1 \ No newline at end of file From 2981701d59f1f08d7ab5d06307d0f697dfe021b9 Mon Sep 17 00:00:00 2001 From: Jake Date: Sun, 6 Jun 2021 19:18:02 -0700 Subject: [PATCH 2/4] Fix multiple lang blocks. --- assets/js/multicodetab.js | 87 +++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/assets/js/multicodetab.js b/assets/js/multicodetab.js index 9a8b9436e0..d9e301d7a8 100644 --- a/assets/js/multicodetab.js +++ b/assets/js/multicodetab.js @@ -49,72 +49,69 @@ all copies or substantial portions of the Software. jQuery.fn.minitabs = function(speed,effect) { function saveToLocal(lang){ - console.log("saving language > " + lang); window.localStorage.setItem('user-preferred-devlanguage', lang); } + function setTabsToFirst(id){ + console.log("Setting tabs "+id+" toFirst ") + $(".multicode[id='"+id+"']" + ">DIV").hide(); + $(".multicode[id='"+id+"']" + ">UL>LI>A").removeClass("current"); + // + $(".multicode[id='"+id+"']" + ">DIV:first").show(); + $(".multicode[id='"+id+"']" + ">UL>LI>A:first").addClass("current"); + } + + function setTabsToLang(id, lang){ + console.log("Setting tabs "+id+" TO LANG >> " + lang) + $(".multicode[id='"+id+"']" + ">DIV").hide(); + $(".multicode[id='"+id+"']" + ">UL>LI>A").removeClass("current"); + // + $(".multicode[id='"+id+"']" + ">UL>LI>A[class="+lang+"]").addClass("current"); + $(".multicode[id='"+id+"']" + ">DIV."+lang).show(); + } + function showSelectedTabFromSaved(id){ - // get any data from local stores. - $savedValue = window.localStorage.getItem('user-preferred-devlanguage'); - // show all tabs if value present - if($savedValue !== null) { - showSlectedTab($savedValue); + var savedValue = window.localStorage.getItem('user-preferred-devlanguage'); + + if(savedValue !== null) { + showSlectedTab(savedValue); }else { - $(id + ">DIV:gt(0)").hide(); - $(id + ">UL>LI>A:first").addClass("current"); + setTabsToFirst(id); } } function showSlectedTab(lang) { - // Hide all. - // Tab heads - $(".multicode>UL>LI>A").removeClass("current"); - // Tab contents - $(".multicode>DIV").hide(speed); + $('.multicode').each(function() { + var hasLang = false; + $(this).find(">UL>LI>A").each(function() { + if ($(this).attr('class') == lang ) { + hasLang = true; + } + }) - $(this).blur(); - //show selcted. - $(".multicode>UL>LI>."+lang).addClass("current"); - $(".multicode>DIV."+lang).show(speed); + if(hasLang) { + console.log("LANG VALUE> > " + lang) + setTabsToLang($(this).attr('id'), lang); + } else { + setTabsToFirst($(this).attr('id')); + } + }) - // TODO: Only add/remove on samples that DO contain that value. - // Example - // if javascript is lang. - // only add current if the UL has javascript in the tabs. - // Otherwise this will hide all tabs and not show anything. - - // save in localstorage. + // save in localstorage. saveToLocal(lang); } this.each(function() { var id = "#" + $(this).attr('id') //Use saved value or set to first tab - showSelectedTabFromSaved(id); + showSelectedTabFromSaved($(this).attr('id')); //Add click on each tab $(id + ">UL>LI>A").click( function(){ - showSlectedTab($(this).attr('class')) - - //Old - - // var re = /([_\-\w]+$)/i; - // var target = $('#' + re.exec(this.href)[1]); - // var old = $(id + ">DIV"); - // switch (effect) { - // case 'fade': - // old.fadeOut(speed).fadeOut(speed); - // target.fadeIn(speed); - // break; - // case 'slide': - // old.slideUp(speed); - // target.fadeOut(speed).fadeIn(speed); - // break; - // default : - // old.hide(speed); - // target.show(speed) - // } + if(!$(this).hasClass("current") ){ + showSlectedTab($(this).attr('class')) + } return false; } ); From 375282dc481be0f76c56074ff1188f8e1d54ca1c Mon Sep 17 00:00:00 2001 From: Jake Boham Date: Fri, 11 Jun 2021 12:49:27 -0400 Subject: [PATCH 3/4] remove logging statements --- assets/js/multicodetab.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/assets/js/multicodetab.js b/assets/js/multicodetab.js index d9e301d7a8..1a0f743f06 100644 --- a/assets/js/multicodetab.js +++ b/assets/js/multicodetab.js @@ -53,7 +53,6 @@ jQuery.fn.minitabs = function(speed,effect) { } function setTabsToFirst(id){ - console.log("Setting tabs "+id+" toFirst ") $(".multicode[id='"+id+"']" + ">DIV").hide(); $(".multicode[id='"+id+"']" + ">UL>LI>A").removeClass("current"); // @@ -62,7 +61,6 @@ jQuery.fn.minitabs = function(speed,effect) { } function setTabsToLang(id, lang){ - console.log("Setting tabs "+id+" TO LANG >> " + lang) $(".multicode[id='"+id+"']" + ">DIV").hide(); $(".multicode[id='"+id+"']" + ">UL>LI>A").removeClass("current"); // @@ -90,7 +88,6 @@ jQuery.fn.minitabs = function(speed,effect) { }) if(hasLang) { - console.log("LANG VALUE> > " + lang) setTabsToLang($(this).attr('id'), lang); } else { setTabsToFirst($(this).attr('id')); From 7dca2c5852f4b60caacbaf527aa3b7f1f7dcf853 Mon Sep 17 00:00:00 2001 From: Jake Date: Thu, 17 Jun 2021 14:49:19 -0700 Subject: [PATCH 4/4] Strip commas out of tab names --- tool/filter_multicode_tabs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/filter_multicode_tabs.py b/tool/filter_multicode_tabs.py index a98d5992eb..e313714a60 100644 --- a/tool/filter_multicode_tabs.py +++ b/tool/filter_multicode_tabs.py @@ -67,7 +67,7 @@ def filter_soup(soup, mode="html", **kwargs): label = "Code Sample %d-%d" % (index1, index2) linkback.string = label #add class with name of tab label - label_class = label.replace(" ","").replace("-","").lower() + label_class = label.replace(" ","").replace("-","").replace(",","").lower() linkback["class"] = label_class code_sample_wrapper["class"] = "code_sample " + label_class prev_p.decompose()