From 6eeb0d58f51941357347034d5bf1b74fb2b5058a Mon Sep 17 00:00:00 2001 From: Jake Date: Tue, 1 Jun 2021 14:09:41 -0700 Subject: [PATCH] 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