papagaio 0.7.1 → 0.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/cli.mjs +114 -130
- package/index.html +160 -282
- package/package.json +2 -2
- package/papagaio.js +202 -0
- package/tests/test.js +1 -1
- package/examples/simple.html +0 -15
- package/examples/wasm.papagaio +0 -70
- package/mobile.html +0 -209
- package/src/papagaio-bootstrap.mjs +0 -23
- package/src/papagaio.js +0 -249
package/index.html
CHANGED
|
@@ -2,263 +2,192 @@
|
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
|
6
6
|
<title>🦜 papagaio</title>
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
<hr>
|
|
15
|
-
<div>
|
|
16
|
-
<strong>
|
|
17
|
-
<label for="sketchSelect">Current Sketch:</label>
|
|
18
|
-
</strong>
|
|
19
|
-
|
|
20
|
-
<select id="sketchSelect" onchange="switchSketch()">
|
|
21
|
-
<option value="">-- Select Sketch --</option>
|
|
22
|
-
</select>
|
|
23
|
-
|
|
|
24
|
-
<button onclick="createNewSketch()">New Sketch</button>
|
|
25
|
-
<button onclick="renameCurrentSketch()">Rename</button>
|
|
26
|
-
<button onclick="deleteCurrentSketch()">Delete</button>
|
|
27
|
-
</div>
|
|
28
|
-
<hr>
|
|
29
|
-
<div>
|
|
30
|
-
<strong>
|
|
31
|
-
<label for="sketchSelect">Sketches:</label>
|
|
32
|
-
</strong>
|
|
33
|
-
<button onclick="exportSketches()">Export</button>
|
|
34
|
-
<input type="file" id="importFileInput" onchange="importSketches(this.files[0])" accept=".json">
|
|
35
|
-
</div>
|
|
36
|
-
|
|
37
|
-
<hr>
|
|
38
|
-
|
|
39
|
-
<h3>INPUT</h3>
|
|
40
|
-
<textarea id="input" rows="15" cols="80" style="width: 70%; font-family: monospace;"></textarea>
|
|
41
|
-
|
|
42
|
-
<br><br>
|
|
43
|
-
|
|
44
|
-
<button onclick="processCode()">Process</button>
|
|
45
|
-
|
|
46
|
-
<br><br>
|
|
47
|
-
|
|
48
|
-
<h3>OUTPUT</h3>
|
|
49
|
-
<textarea id="output" rows="15" cols="80" style="width: 70%; font-family: monospace;" readonly></textarea>
|
|
50
|
-
|
|
51
|
-
<script type="module">
|
|
52
|
-
import { Papagaio } from './src/papagaio.js';
|
|
53
|
-
|
|
54
|
-
class SketchesManager {
|
|
55
|
-
constructor() {
|
|
56
|
-
this.sketches = this.loadSketches();
|
|
57
|
-
this.currentSketchId = this.loadCurrentSketchId();
|
|
58
|
-
}
|
|
7
|
+
<style>
|
|
8
|
+
* {
|
|
9
|
+
margin: 0;
|
|
10
|
+
padding: 0;
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
-webkit-tap-highlight-color: transparent;
|
|
13
|
+
}
|
|
59
14
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
}
|
|
15
|
+
body {
|
|
16
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
17
|
+
background: #fff;
|
|
18
|
+
color: #000;
|
|
19
|
+
overflow: hidden;
|
|
20
|
+
}
|
|
68
21
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
22
|
+
.app {
|
|
23
|
+
max-width: 100%;
|
|
24
|
+
height: 100vh;
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
}
|
|
74
28
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
29
|
+
.header {
|
|
30
|
+
background: #fff;
|
|
31
|
+
padding: 24px 20px;
|
|
32
|
+
text-align: center;
|
|
33
|
+
border-bottom: 1px solid #ddd;
|
|
34
|
+
}
|
|
82
35
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
36
|
+
.header h1 {
|
|
37
|
+
font-size: 2rem;
|
|
38
|
+
color: #000;
|
|
39
|
+
margin-bottom: 4px;
|
|
40
|
+
}
|
|
89
41
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
name,
|
|
95
|
-
input: '',
|
|
96
|
-
createdAt: new Date().toLocaleString()
|
|
97
|
-
};
|
|
98
|
-
this.saveSketches();
|
|
99
|
-
this.setCurrentSketchId(id);
|
|
100
|
-
return id;
|
|
101
|
-
}
|
|
42
|
+
.header p {
|
|
43
|
+
font-size: 0.9rem;
|
|
44
|
+
color: #666;
|
|
45
|
+
}
|
|
102
46
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
47
|
+
.tabs {
|
|
48
|
+
display: flex;
|
|
49
|
+
background: #fff;
|
|
50
|
+
border-bottom: 1px solid #ddd;
|
|
51
|
+
}
|
|
106
52
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
53
|
+
.tab {
|
|
54
|
+
flex: 1;
|
|
55
|
+
padding: 18px;
|
|
56
|
+
text-align: center;
|
|
57
|
+
font-size: 1rem;
|
|
58
|
+
font-weight: 500;
|
|
59
|
+
background: #f5f5f5;
|
|
60
|
+
border: none;
|
|
61
|
+
cursor: pointer;
|
|
62
|
+
transition: all 0.2s;
|
|
63
|
+
color: #666;
|
|
64
|
+
border-right: 1px solid #ddd;
|
|
65
|
+
}
|
|
113
66
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if (this.currentSketchId === id) {
|
|
118
|
-
const remaining = Object.keys(this.sketches);
|
|
119
|
-
this.currentSketchId = remaining.length > 0 ? remaining[0] : null;
|
|
120
|
-
if (this.currentSketchId) {
|
|
121
|
-
this.setCurrentSketchId(this.currentSketchId);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
67
|
+
.tab:last-child {
|
|
68
|
+
border-right: none;
|
|
69
|
+
}
|
|
125
70
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
71
|
+
.tab.active {
|
|
72
|
+
background: #fff;
|
|
73
|
+
color: #000;
|
|
74
|
+
border-bottom: 2px solid #000;
|
|
75
|
+
}
|
|
131
76
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
77
|
+
.content {
|
|
78
|
+
flex: 1;
|
|
79
|
+
display: flex;
|
|
80
|
+
flex-direction: column;
|
|
81
|
+
overflow: hidden;
|
|
138
82
|
}
|
|
139
83
|
|
|
140
|
-
|
|
141
|
-
|
|
84
|
+
.editor-container {
|
|
85
|
+
display: none;
|
|
86
|
+
flex-direction: column;
|
|
87
|
+
flex: 1;
|
|
88
|
+
}
|
|
142
89
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
populateSketchSelect();
|
|
147
|
-
});
|
|
90
|
+
.editor-container.active {
|
|
91
|
+
display: flex;
|
|
92
|
+
}
|
|
148
93
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
94
|
+
textarea {
|
|
95
|
+
flex: 1;
|
|
96
|
+
padding: 20px;
|
|
97
|
+
border: none;
|
|
98
|
+
font-family:
|
|
99
|
+
ui-monospace,
|
|
100
|
+
SFMono-Regular,
|
|
101
|
+
Menlo,
|
|
102
|
+
Consolas,
|
|
103
|
+
"Liberation Mono",
|
|
104
|
+
monospace;
|
|
105
|
+
font-size: 15px;
|
|
106
|
+
line-height: 1.55;
|
|
107
|
+
font-weight: 500;
|
|
108
|
+
letter-spacing: 0.2px;
|
|
109
|
+
resize: none;
|
|
110
|
+
background: #fff;
|
|
111
|
+
color: #000;
|
|
112
|
+
white-space: pre;
|
|
113
|
+
overflow-x: auto;
|
|
114
|
+
overflow-y: auto;
|
|
115
|
+
word-break: normal;
|
|
170
116
|
}
|
|
171
117
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
sketchesManager.updateSketch(sketchesManager.currentSketchId, {
|
|
175
|
-
input: document.getElementById('input').value
|
|
176
|
-
});
|
|
177
|
-
}
|
|
118
|
+
textarea:focus {
|
|
119
|
+
outline: none;
|
|
178
120
|
}
|
|
179
121
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
select.innerHTML = '<option value="">-- Select Sketch --</option>';
|
|
183
|
-
|
|
184
|
-
const sketches = sketchesManager.getAllSketches();
|
|
185
|
-
sketches.forEach(sketch => {
|
|
186
|
-
const option = document.createElement('option');
|
|
187
|
-
option.value = sketch.id;
|
|
188
|
-
option.textContent = sketch.name;
|
|
189
|
-
if (sketch.id === sketchesManager.currentSketchId) {
|
|
190
|
-
option.selected = true;
|
|
191
|
-
}
|
|
192
|
-
select.appendChild(option);
|
|
193
|
-
});
|
|
122
|
+
#output {
|
|
123
|
+
background: #fafafa;
|
|
194
124
|
}
|
|
195
125
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
saveCurrentSketch();
|
|
203
|
-
sketchesManager.setCurrentSketchId(id);
|
|
204
|
-
const sketch = sketchesManager.getSketch(id);
|
|
205
|
-
|
|
206
|
-
if (sketch) {
|
|
207
|
-
document.getElementById('input').value = sketch.input;
|
|
208
|
-
document.getElementById('output').value = '';
|
|
126
|
+
@media (min-width: 768px) {
|
|
127
|
+
.app {
|
|
128
|
+
max-width: 600px;
|
|
129
|
+
margin: 0 auto;
|
|
130
|
+
border-left: 1px solid #ddd;
|
|
131
|
+
border-right: 1px solid #ddd;
|
|
209
132
|
}
|
|
210
133
|
}
|
|
134
|
+
</style>
|
|
135
|
+
</head>
|
|
136
|
+
<body>
|
|
137
|
+
<div class="app">
|
|
138
|
+
<div class="header">
|
|
139
|
+
<h1>🦜 papagaio</h1>
|
|
140
|
+
<p>easy yet powerful text preprocessor</p>
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
<div class="tabs">
|
|
144
|
+
<button class="tab active" onclick="switchTab('input')">INPUT</button>
|
|
145
|
+
<button class="tab" onclick="switchTab('output')">OUTPUT</button>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<div class="content">
|
|
149
|
+
<div class="editor-container active" id="inputContainer">
|
|
150
|
+
<textarea id="input"></textarea>
|
|
151
|
+
</div>
|
|
152
|
+
<div class="editor-container" id="outputContainer">
|
|
153
|
+
<textarea id="output" readonly></textarea>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
211
157
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
document.getElementById('input').value = sketch.input;
|
|
225
|
-
document.getElementById('output').value = '';
|
|
226
|
-
}
|
|
158
|
+
<script type="module">
|
|
159
|
+
import Papagaio from './papagaio.js';
|
|
160
|
+
|
|
161
|
+
const processor = new Papagaio();
|
|
162
|
+
|
|
163
|
+
function loadSaved() {
|
|
164
|
+
try {
|
|
165
|
+
const saved = localStorage.getItem('papagaio_input');
|
|
166
|
+
if (saved) {
|
|
167
|
+
document.getElementById('input').value = saved;
|
|
168
|
+
}
|
|
169
|
+
} catch {}
|
|
227
170
|
}
|
|
228
171
|
|
|
229
|
-
function
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const sketch = sketchesManager.getSketch(sketchesManager.currentSketchId);
|
|
236
|
-
const newName = prompt('Enter new name:', sketch.name);
|
|
237
|
-
|
|
238
|
-
if (!newName || !newName.trim()) {
|
|
239
|
-
alert('Please enter a valid name');
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
sketchesManager.renameSketch(sketchesManager.currentSketchId, newName.trim());
|
|
244
|
-
populateSketchSelect();
|
|
172
|
+
function saveInput() {
|
|
173
|
+
try {
|
|
174
|
+
const input = document.getElementById('input').value;
|
|
175
|
+
localStorage.setItem('papagaio_input', input);
|
|
176
|
+
} catch {}
|
|
245
177
|
}
|
|
246
178
|
|
|
247
|
-
function
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
return;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
const sketch = sketchesManager.getSketch(sketchesManager.currentSketchId);
|
|
179
|
+
function switchTab(tab) {
|
|
180
|
+
document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
|
|
181
|
+
document.querySelectorAll('.editor-container').forEach(c => c.classList.remove('active'));
|
|
254
182
|
|
|
255
|
-
if (
|
|
256
|
-
|
|
183
|
+
if (tab === 'input') {
|
|
184
|
+
document.querySelectorAll('.tab')[0].classList.add('active');
|
|
185
|
+
document.getElementById('inputContainer').classList.add('active');
|
|
186
|
+
} else {
|
|
187
|
+
document.querySelectorAll('.tab')[1].classList.add('active');
|
|
188
|
+
document.getElementById('outputContainer').classList.add('active');
|
|
189
|
+
processCode();
|
|
257
190
|
}
|
|
258
|
-
|
|
259
|
-
sketchesManager.deleteSketch(sketchesManager.currentSketchId);
|
|
260
|
-
loadOrCreateDefaultSketch();
|
|
261
|
-
populateSketchSelect();
|
|
262
191
|
}
|
|
263
192
|
|
|
264
193
|
function processCode() {
|
|
@@ -266,66 +195,15 @@
|
|
|
266
195
|
const input = document.getElementById('input').value;
|
|
267
196
|
const output = processor.process(input);
|
|
268
197
|
document.getElementById('output').value = output;
|
|
269
|
-
|
|
198
|
+
saveInput();
|
|
270
199
|
} catch (err) {
|
|
271
200
|
document.getElementById('output').value = `Error: ${err.message}`;
|
|
272
201
|
}
|
|
273
202
|
}
|
|
274
203
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
papagaio_current_sketch: localStorage.getItem('papagaio_current_sketch'),
|
|
279
|
-
papagaio_config: localStorage.getItem('papagaio_config')
|
|
280
|
-
};
|
|
281
|
-
|
|
282
|
-
const blob = new Blob([JSON.stringify(data, null, 2)], {
|
|
283
|
-
type: "application/json"
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
const a = document.createElement("a");
|
|
287
|
-
a.href = URL.createObjectURL(blob);
|
|
288
|
-
a.download = `papagaio_sketches_${Date.now()}.json`;
|
|
289
|
-
a.click();
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
function importSketches(file) {
|
|
293
|
-
if (!file) return;
|
|
294
|
-
|
|
295
|
-
const reader = new FileReader();
|
|
296
|
-
|
|
297
|
-
reader.onload = () => {
|
|
298
|
-
try {
|
|
299
|
-
const data = JSON.parse(reader.result);
|
|
300
|
-
if (data.papagaio_sketches) {
|
|
301
|
-
localStorage.setItem('papagaio_sketches', data.papagaio_sketches);
|
|
302
|
-
}
|
|
303
|
-
if (data.papagaio_current_sketch) {
|
|
304
|
-
localStorage.setItem('papagaio_current_sketch', data.papagaio_current_sketch);
|
|
305
|
-
}
|
|
306
|
-
if (data.papagaio_config) {
|
|
307
|
-
localStorage.setItem('papagaio_config', data.papagaio_config);
|
|
308
|
-
}
|
|
309
|
-
location.reload();
|
|
310
|
-
} catch (err) {
|
|
311
|
-
alert('Error importing file: ' + err.message);
|
|
312
|
-
}
|
|
313
|
-
};
|
|
314
|
-
|
|
315
|
-
reader.readAsText(file);
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
setInterval(() => {
|
|
319
|
-
saveCurrentSketch();
|
|
320
|
-
}, 1000);
|
|
321
|
-
|
|
322
|
-
window.processCode = processCode;
|
|
323
|
-
window.switchSketch = switchSketch;
|
|
324
|
-
window.createNewSketch = createNewSketch;
|
|
325
|
-
window.renameCurrentSketch = renameCurrentSketch;
|
|
326
|
-
window.deleteCurrentSketch = deleteCurrentSketch;
|
|
327
|
-
window.exportSketches = exportSketches;
|
|
328
|
-
window.importSketches = importSketches;
|
|
204
|
+
window.addEventListener('load', loadSaved);
|
|
205
|
+
setInterval(saveInput, 2000);
|
|
206
|
+
window.switchTab = switchTab;
|
|
329
207
|
</script>
|
|
330
208
|
</body>
|
|
331
209
|
</html>
|
package/package.json
CHANGED