Tobias Simetsreiter пре 5 година
комит
f461318cd5
5 измењених фајлова са 176 додато и 0 уклоњено
  1. 2 0
      .gitignore
  2. 18 0
      index.html
  3. 24 0
      vers.css
  4. 110 0
      vers.js
  5. 22 0
      versioner.py

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+v
+versions.js

+ 18 - 0
index.html

@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html class="writer-html5" lang="en" >
+<head>
+  <meta charset="utf-8">
+  <link rel="stylesheet" href="vers.css"></link>
+  <script type="text/javascript" src="vers.js"></script>
+</head>
+<body>
+  <div id="Versioner_overlay">
+    <a href="../docroot">docroot</a>
+    <select name="versions" id="Versioner_selector">
+    </select>
+  </div>
+  <iframe id="Versioner_mainframe" src="">
+    Your browser doesn't support iframes
+  </iframe>
+</body>
+</html>

+ 24 - 0
vers.css

@@ -0,0 +1,24 @@
+body {
+    margin: 0;
+}
+#Versioner_overlay {
+  position:fixed;
+  right: 25px;
+  bottom:0;
+  padding: 5px;
+  z-index:999999;
+}
+#Versioner_mainframe {
+  position:fixed;
+  top:0;
+  left:0;
+  bottom:0;
+  right:0;
+  width:100%;
+  height:100%;
+  border:none;
+  margin:0;
+  padding:0;
+  overflow:hidden;
+  z-index:999998;
+}

+ 110 - 0
vers.js

@@ -0,0 +1,110 @@
+// js
+
+function Versioner(){
+
+    this.version_prefix = "v/";
+
+    this.main = ()=>{
+        this.main_frame = document.getElementById("Versioner_mainframe");
+        this.selector = document.getElementById("Versioner_selector");
+        this.data_script = document.createElement("script");
+        this.data_script.src = "versions.js" + "?js_reload="+this.randomString();
+        this.data_script.addEventListener("load", this.loadData.bind(this));
+        document.body.append(this.data_script)
+
+        this.main_frame.addEventListener("load", this.updateMainFrame.bind(this));
+
+        this.selector.addEventListener("change", ((e)=>{
+            this.version = this.selector.selectedOptions[0].value;
+            this.updateUri(true);
+        }).bind(this));
+
+
+    }
+
+
+    this.loadData = ()=>{
+        this.data = VERSIONER_DATA;
+        console.log(this.data);
+        this.updateOptions()
+    }
+
+
+    this.updateMainFrame = (e)=>{
+        var subp = e.target.contentWindow.location.pathname;
+        if(subp.search(location.pathname)==0){
+            var sub_relpath = subp.slice(location.pathname.length);
+            this.path = sub_relpath.slice(this.version.length);
+            this.path = this.path.slice(this.version_prefix.length)
+            this.updateUri(false);
+        }
+    }
+
+
+    this.updateUri = (reload)=>{
+
+        var version = this.getParameterByName("v");
+        if (this.version){
+        } else if (version) {
+            this.version = version;
+        } else {
+            this.version = this.default_version;
+        }
+        var path = this.getParameterByName("p");
+        if (!this.path){
+            this.path = path;
+        } 
+        if (!this.path){
+            this.path = "";
+        }
+        var query = "?v="+ this.version +"&p=" + this.path;
+        window.history.replaceState("","",query);
+        if(reload){
+            this.main_frame.src = this.version_prefix + this.version + this.path;
+        }
+    }
+
+
+    this.updateOptions = ()=>{
+        this.data["versions"].forEach((el)=>{
+            var opt_exists = false;
+            for (var i = 0; i<this.selector.options.length; i++){
+                if (el == this.selector.options[i].value){
+                    opt_exists = true;
+                    break;
+                }
+            }
+            if (!opt_exists){
+                var opt = document.createElement("option");
+                opt.value = el;
+                opt.text = el;
+                this.selector.appendChild(opt);
+            }
+        })
+        this.default_version = this.data["versions"][0];
+        this.updateUri(true);
+    }
+    this.randomString = ()=>{
+        return Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);
+    }
+    // Get URL arguments
+    this.getParameterByName = (name, url)=>{
+        if (!url) url = window.location.href;
+        name = name.replace(/[\[\]]/g, "\\$&");
+        var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
+            results = regex.exec(url);
+        if (!results) return null;
+        if (!results[2]) return "";
+        return decodeURIComponent(results[2].replace(/\+/g, " "));
+    };
+    
+    this.onload = ()=>{
+        
+    };
+
+    window.addEventListener("load",()=>{
+        this.main.apply(this);
+    })
+}
+
+var versioner = new Versioner();

+ 22 - 0
versioner.py

@@ -0,0 +1,22 @@
+#!/usr/bin/env python3
+
+import os
+import json
+import pprint
+
+cur_dir = os.path.realpath(os.path.join( __file__, ".."))
+dirp = os.path.join( cur_dir,"v")
+verp = os.path.join( cur_dir, "versions.js")
+
+payload = {
+    "versions":[]
+}
+
+for d in os.listdir(dirp):
+    if os.path.isdir(os.path.join(dirp,d)):
+        payload["versions"].append(d)
+
+pprint.pprint(payload)
+with open(verp, "w") as version_file:
+    version_file.write("VERSIONER_DATA=")
+    json.dump( payload, version_file)