mirror of
https://github.com/sigmasternchen/telescope
synced 2025-03-14 23:58:59 +00:00
first commit
This commit is contained in:
commit
efed9cb991
2 changed files with 169 additions and 0 deletions
20
site.html
Normal file
20
site.html
Normal file
|
@ -0,0 +1,20 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<script src="telescope.js"></script>
|
||||
<script>
|
||||
window.onload = function() {
|
||||
var telescope = new Telescope({
|
||||
"element": document.getElementById("tele"),
|
||||
"text": "[Hi]{Hello [friends]{friends and followers}}. [This]{This [website]{[small web page]{static web page, that is [rather small]{only 10 lines of [code]{code (if you exclude [javascript]{javascript - Which is a scripting language [for websites]{[designed]{designed (but often abused for [other]{[partly]{at least partly} bad} [things]{things, as for example identifying [users]{the browsers of users}})} for dynamic [content]{content - like telescope-texts -} on the client side}.})}}},}} [is]{is actually} a [demo]{[demonstration]{nice demonstration} of the [telescope module]{telescope module, I wrote [some time ago]{on [the 16th]{Sunday, the 16th} of October [2016]{[2016]{2016 (the year Donald Trump got elected as the new US president)}, for [a friend]{Adrian, a friend} of [mine]{mine. He was [fascinated]{absolutely fascinated} by that [website]{[website]{website (http://www.telescopictext.org/text/KPx0nlXlKTciC)} that shows you a [telescope-text]{text which you can [expand]{[expand]{expand [nearly]{nearly (okay, [not really]{not really, but you get the idea})} [endlessly]{endlessly to get more and more information}} by clicking on highlighted word}. That was really [cool]{cool, so I decided to make [that]{this telescope-text-thingamajig} [myself]{[myself]{myself (I accidentally wrote [mysql here.]{mysql here. Yes, I am a nerd. ^^})}. That was [fun]{fun but [lots of]{lots of hard} [work]{work because I wanted for [it]{the program} [to be intuitive]{that the creation of texts is [intuitive]{intuitive. The [user]{user of this module} [has]{only has} to specify the [text]{plain [text]{text, of what the user wishes to [display]{display as triggers and [what]{which text} to substitute it [with]{which. Check out the [source code]{source code (You can also check out the [module]{modules source [code]{file telescope.js}}.)} of [the demo]{this [small]{small ([Okay]{Okay, okay}, it's [not]{not really} [small]{small at [all]{all, I admit it}}.)} [demo]{[demonstration]{demonstration web page}}} to get [a idea]{the idea on how this [works]{works. What you think about this? [Tell me]{Tell me by commenting the code on [github]{github (you can also [fork]{fork it and send pull [requests]{requests (to make it better)} for} [it]{it if you like to})}}}}}}}}}}}}}}}}}}}}.}",
|
||||
"flags": Telescope.USE_STYLES
|
||||
});
|
||||
telescope.display();
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tele"></div>
|
||||
</body>
|
||||
</html>
|
149
telescope.js
Normal file
149
telescope.js
Normal file
|
@ -0,0 +1,149 @@
|
|||
var Telescope = function(obj) {
|
||||
if (!obj.element)
|
||||
throw "No target element given!";
|
||||
this.element = obj.element;
|
||||
if (!obj.text)
|
||||
throw "No text given.";
|
||||
this.text = this.parseText(obj.text);
|
||||
if (obj.style)
|
||||
this.style = obj.style;
|
||||
|
||||
if (obj.flags) {
|
||||
this.useStyles = obj.flags & Telescope.USE_STYLES;
|
||||
}
|
||||
}
|
||||
Telescope.prototype.style = {
|
||||
"triggers": {
|
||||
"cursor": "pointer",
|
||||
"backgroundColor": "#ddd"
|
||||
},
|
||||
"text": {
|
||||
"fontSize": "30px",
|
||||
"fontFamily": "Arial"
|
||||
}
|
||||
}
|
||||
Telescope.USE_STYLES = 1 << 1;
|
||||
Telescope.prototype.useStyles = false;
|
||||
Telescope.prototype.text = undefined;
|
||||
Telescope.prototype.element = undefined;
|
||||
Telescope.prototype.parseText = function(string) {
|
||||
var scope = [];
|
||||
|
||||
var tmpObj = {};
|
||||
|
||||
var index = string.indexOf("[");
|
||||
while (index >= 0) {
|
||||
scope.push(string.substring(0, index));
|
||||
string = string.substring(index + 1);
|
||||
|
||||
tmpObj = {
|
||||
"trigger": "",
|
||||
"sub": []
|
||||
}
|
||||
|
||||
index = string.indexOf("]");
|
||||
|
||||
if (index < 0)
|
||||
throw "Syntax Error: ']' expected";
|
||||
|
||||
tmpObj.trigger = string.substring(0, index);
|
||||
|
||||
string = string.substring(index + 1);
|
||||
|
||||
var layer = getFirstLayer(string, "{", "}");
|
||||
|
||||
if (!layer)
|
||||
throw "Syntax Error: '{' expected";
|
||||
|
||||
scope.push(string.substring(0, layer[0]));
|
||||
|
||||
var sub = string.substring(layer[0] + 1, layer[1]);
|
||||
string = string.substring(layer[1] + 1);
|
||||
|
||||
tmpObj.sub = this.parseText(sub);
|
||||
|
||||
scope.push(tmpObj);
|
||||
|
||||
index = string.indexOf("[");
|
||||
}
|
||||
scope.push(string);
|
||||
|
||||
return scope;
|
||||
}
|
||||
Telescope.prototype.display = function() {
|
||||
this.element.appendChild(this.generate(this.text, true));
|
||||
};
|
||||
|
||||
Telescope._id = 0;
|
||||
Telescope.getId = function() {
|
||||
return "telescope_id_" + Telescope._id++;
|
||||
}
|
||||
|
||||
Telescope.prototype.generate = function(text, show) {
|
||||
var obj = document.createElement("span");
|
||||
obj.className = "TelescopeText";
|
||||
if (this.useStyles) {
|
||||
for (var attr in this.style.text) {
|
||||
obj.style[attr] = this.style.text[attr];
|
||||
}
|
||||
}
|
||||
if (!show)
|
||||
obj.style.display = "none";
|
||||
for (var i = 0; i < text.length; i++) {
|
||||
if ((typeof text[i]) == "string")
|
||||
obj.appendChild(document.createTextNode(text[i]));
|
||||
else {
|
||||
var id = Telescope.getId();
|
||||
var trigger = document.createElement("span");
|
||||
if (this.useStyles) {
|
||||
for (var attr in this.style.triggers) {
|
||||
trigger.style[attr] = this.style.triggers[attr];
|
||||
}
|
||||
}
|
||||
trigger.className = "TelescopeTrigger";
|
||||
trigger.appendChild(document.createTextNode(text[i].trigger));
|
||||
trigger.id = id + "_trigger";
|
||||
trigger.onclick = function() {
|
||||
Telescope.show(this.id.substring(0, this.id.indexOf("_trigger")));
|
||||
};
|
||||
obj.appendChild(trigger);
|
||||
var sub = this.generate(text[i].sub);
|
||||
sub.id = id;
|
||||
obj.appendChild(sub);
|
||||
}
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
Telescope.show = function(id) {
|
||||
document.getElementById(id + "_trigger").style.display = "none";
|
||||
document.getElementById(id).style.display = "inline";
|
||||
}
|
||||
|
||||
var getFirstLayer = function(string, s, e) {
|
||||
var first = -1;
|
||||
|
||||
var ignore = 0;
|
||||
|
||||
for (var i = 0; i < string.length; i++) {
|
||||
if (first < 0) {
|
||||
if (string.charAt(i) == e)
|
||||
throw "Syntax Error: Unexpected '" + e + "'";
|
||||
else if (string.charAt(i) == s)
|
||||
first = i;
|
||||
} else {
|
||||
if (string.charAt(i) == s)
|
||||
ignore++;
|
||||
else if (string.charAt(i) == e)
|
||||
ignore--;
|
||||
if (ignore < 0)
|
||||
return [first, i];
|
||||
}
|
||||
}
|
||||
if (first < 0)
|
||||
return undefined;
|
||||
|
||||
throw "Syntax Error: '" + e + "' expected";
|
||||
}
|
||||
|
Loading…
Reference in a new issue