generated from Pixelbite-CSS/template
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplayground.js
More file actions
147 lines (132 loc) · 6.06 KB
/
playground.js
File metadata and controls
147 lines (132 loc) · 6.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
let codeTextarea = document.getElementById('code-textarea')
let customLines = document.getElementById('custom-lines')
let editorArea = document.getElementById('editor-window-inside')
let preview = document.getElementById('preview-window-inside')
codeTextarea.addEventListener('keydown', event => {
if (event.key === 'Tab') {
const start = codeTextarea.selectionStart
const end = codeTextarea.selectionEnd
codeTextarea.value = codeTextarea.value.substring(0, start) + '\t' + codeTextarea.value.substring(end)
codeTextarea.focus()
codeTextarea.selectionEnd = end + 1
event.preventDefault()
}
})
window.addEventListener("load", async () => {
const numberOfLines = codeTextarea.value.split('\n').length
codeTextarea.style.height = (numberOfLines * 17.5) + "px"
customLines.innerHTML = Array(numberOfLines)
.fill('<span></span>')
.join('')
generateEditor()
})
codeTextarea.addEventListener('keyup', event => {
const numberOfLines = event.target.value.split('\n').length
codeTextarea.style.height = (numberOfLines * 17.5) + "px"
customLines.innerHTML = Array(numberOfLines)
.fill('<span></span>')
.join('')
generateEditor()
})
document.getElementById("updateButton").onclick = () => {
document.getElementById('preview-window-inside').innerHTML = codeTextarea.value
pb_classGenerator()
}
const getElements = () => {
let code = codeTextarea.value;
let parser = new DOMParser();
let doc = parser.parseFromString(code, "text/html");
return doc.getElementsByTagName('*')
}
const generateEditor = () => {
// let elements = getElements()
// editorArea.innerHTML = ''
// for (let i = 3; i < elements.length; i++) {
// let element = elements[i]
// let elementId = element.tagName + "[" + (i - 2) + "]"
// let classes = ''
// for (let j = 0; j < element.classList.length; j++) {
// classes += element.classList[j] + " "
// }
// editorArea.innerHTML += '<div class="w-100% noselect flexRow flexSpaceBetween p-6px-10px fs-12px pointer b-1px-solid-black7 bg-black5" onclick="toggleElement(\'' + elementId + '\')">' +
// '<div>' + elementId + '</div>' +
// '<i class="fa-solid fa-chevron-down ' + elementId + ' hidden"></i>' +
// '<i class="fa-solid fa-chevron-up ' + elementId + '"></i>' +
// '</div>' +
// '<div class="flexColumn ' + elementId + ' hidden w-100% ta-left flexLeft p-8px-12px">' +
// '<div class="flexRow w-100%">' +
// '<input class="w-100%" placeholder="Classes" type="text" value="' + classes + '"></input>' +
// '</div>' +
// '</div>'
// }
const treeObject = htmlToTree();
pb_classGenerator()
// console.log(JSON.stringify(treeObject, null, 2));
treeChild(treeObject, treeObject.children)
}
const generateBlock = (object, parents) => {
let elementId = object.tag + "_" + pb_randomString(24)
let contentEdit = ''
if (object.tag === "textContent") {
contentEdit = '<div class="fs-12px">Value</div><input class="w-100% inputs" placeholder="Value" type="text" value="' + object.value + '"></input>'
} else {
contentEdit = '<div class="fs-12px">Class list</div>' +
'<input class="w-100% inputs" placeholder="Classes" type="text" value="' + object.classList + '"></input>' +
'<div class="fs-12px">Value</div>' +
'<input class="w-100% inputs" placeholder="Value" type="text" value="' + object.value + '"></input>' +
'<div class="fs-12px">Type</div>' +
'<input class="w-100% inputs" placeholder="Type" type="text" value="' + object.type + '"></input>' +
'<div class="fs-12px">Onclick action</div>' +
'<input class="w-100% inputs" placeholder="Onclick" type="text" value="' + object.onclick + '"></input>'
}
editorArea.innerHTML += '<div class="w-100% noselect flexRow flexSpaceBetween p-6px-10px fs-12px pointer b-1px-solid-black7 bg-black5" onclick="toggleElement(\'' + elementId + '\')">' +
'<div class="ff-fontMonospace fs-10px o-.7">' + parents + object.tag + '</div>' +
'<i class="fa-solid fa-chevron-down ' + elementId + ' hidden"></i>' +
'<i class="fa-solid fa-chevron-up ' + elementId + '"></i>' +
'</div>' +
'<div class="flexColumn ' + elementId + ' hidden w-100% ta-left flexLeft p-8px-12px">' +
'<div class="flexColumn flexLeft g-4px w-100%">' +
contentEdit
'</div>' +
'</div>'
}
const treeChild = async (object, children, parents) => {
if (children) {
if (!parents) {
parents = ""
}
for (let i = 0; i < children.length; i++) {
let newParents = parents + object.tag + " > " + "[" + i + "]"
generateBlock(children[i], newParents)
await treeChild(children[i], children[i].children, newParents)
}
}
}
const htmlToTree = () => {
editorArea.innerHTML = ''
let code = codeTextarea.value;
let parser = new DOMParser();
let doc = parser.parseFromString(code, "text/html");
function buildTree(node) {
const treeObject = {
tag: node.tagName ? node.tagName.toLowerCase() : undefined,
classList: node.classList ? Array.from(node.classList) : [],
value: node.value ? node.value : [],
onclick: node.onclick ? node.onclick : [],
type: node.type ? node.type : [],
children: []
};
for (const childNode of node.childNodes) {
if (childNode.nodeType === Node.ELEMENT_NODE) {
treeObject.children.push(buildTree(childNode));
} else if (childNode.nodeType === Node.TEXT_NODE && childNode.textContent.trim() !== '') {
treeObject.children.push({
tag: 'textContent',
value: childNode.textContent.trim()
});
}
}
return treeObject;
}
return buildTree(doc.body);
}