Project

General

Profile

Download (3.67 KB) Statistics
| Branch: | Tag: | Revision:

haketilo / html / DOM_helpers.js @ f8dedf60

1
/**
2
 * This file is part of Haketilo.
3
 *
4
 * Function: Operations on DOM elements.
5
 *
6
 * Copyright (C) 2021 Wojtek Kosior
7
 *
8
 * This program is free software: you can redistribute it and/or modify
9
 * it under the terms of the GNU General Public License as published by
10
 * the Free Software Foundation, either version 3 of the License, or
11
 * (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * As additional permission under GNU GPL version 3 section 7, you
19
 * may distribute forms of that code without the copy of the GNU
20
 * GPL normally required by section 4, provided you include this
21
 * license notice and, in case of non-source distribution, a URL
22
 * through which recipients can access the Corresponding Source.
23
 * If you modify file(s) with this exception, you may extend this
24
 * exception to your version of the file(s), but you are not
25
 * obligated to do so. If you do not wish to do so, delete this
26
 * exception statement from your version.
27
 *
28
 * As a special exception to the GPL, any HTML file which merely
29
 * makes function calls to this code, and for that purpose
30
 * includes it by reference shall be deemed a separate work for
31
 * copyright law purposes. If you modify this code, you may extend
32
 * this exception to your version of the code, but you are not
33
 * obligated to do so. If you do not wish to do so, delete this
34
 * exception statement from your version.
35
 *
36
 * You should have received a copy of the GNU General Public License
37
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
38
 *
39
 * I, Wojtek Kosior, thereby promise not to sue for violation of this file's
40
 * license. Although I request that you do not make use of this code in a
41
 * proprietary program, I am not going to enforce this in court.
42
 */
43

    
44
#EXPORT  id => document.getElementById(id)  AS by_id
45

    
46
const known_templates = new Map();
47

    
48
function get_template(template_id)
49
{
50
    let template = known_templates.get(template_id) || null;
51
    if (template)
52
	return template;
53

    
54
    for (const template_node of document.getElementsByTagName("TEMPLATE")) {
55
	template = template_node.content.getElementById(template_id);
56
	if (template)
57
	    break;
58
    }
59

    
60
    known_templates.set(template_id, template);
61
    return template;
62
}
63
#EXPORT get_template
64

    
65
function clone_template(template_id)
66
{
67
    const clone = get_template(template_id).cloneNode(true);
68
    const result_object = {};
69
    const to_process = [clone];
70

    
71
    while (to_process.length > 0) {
72
	const element = to_process.pop();
73
	let template_key = element.getAttribute("data-template") || element.id;
74

    
75
	if (template_key)
76
	    result_object[template_key] = element;
77

    
78
	element.removeAttribute("id");
79
	element.removeAttribute("data-template");
80

    
81
	for (const child of element.children)
82
	    to_process.push(child);
83
    }
84

    
85
    return result_object;
86
}
87
#EXPORT clone_template
88

    
89
function Showable(on_show_cb, on_hide_cb) {
90
    this.shown = false;
91

    
92
    /*
93
     * Wrap the requested callback into one that only executes it if showable is
94
     * not shown.
95
     */
96
    this.when_hidden = cb => {
97
	const wrapped_cb = (...args) => {
98
	    if (!this.shown)
99
		return cb(...args);
100
	}
101
	return wrapped_cb;
102
    }
103

    
104
    this.show = () => {
105
	if (this.shown)
106
	    return false;
107

    
108
	this.shown = true;
109

    
110
	try {
111
	    on_show_cb();
112
	} catch(e) {
113
	    console.error("Haketilo:", e);
114
	}
115

    
116
	return true;
117
    }
118

    
119
    this.hide = () => {
120
	if (!this.shown)
121
	    return false;
122

    
123
	this.shown = false;
124

    
125
	try {
126
	    on_hide_cb();
127
	} catch(e) {
128
	    console.error("Haketilo:", e);
129
	}
130

    
131
	return true;
132
    }
133
}
134
#EXPORT Showable
(1-1/28)