caixanegra 0.4.0 → 0.4.1
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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/caixanegra/api.js +16 -0
- data/app/assets/javascripts/caixanegra/designer.js +131 -3
- data/app/assets/stylesheets/caixanegra/designer.scss +152 -2
- data/app/controllers/caixanegra/api/designer/inputs_controller.rb +32 -0
- data/app/views/caixanegra/designer/index.html.erb +21 -0
- data/config/routes.rb +3 -0
- data/lib/caixanegra/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 182cc119673359db756adcca903e137025ed5283bdae367d7d6c662fc5fdc061
|
4
|
+
data.tar.gz: f075d702d2f361678a7775d286cb7f3b9ec1cb556778b22c4180588efe32d830
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29c0edd8fab4949cab99f6d513b987cda6c87b2fb29fbeb33e447616ff580c0a9fbd3413a2fe4281828f28a8ac1123942fcecbdbeedf7511c64cb000384bd797
|
7
|
+
data.tar.gz: 23e9e398d71b3900759d8a944f20ddf1920ac1f38bb5961d3e36a34d112e36a488301d3c4709de8c9cfc48a8a9f995869ebfea90ed20acf72915b6c61ac48345
|
@@ -66,4 +66,20 @@ window.Caixanegra.API = class {
|
|
66
66
|
request.send(JSON.stringify(initialCarryOver));
|
67
67
|
});
|
68
68
|
}
|
69
|
+
|
70
|
+
evaluateRegex(expression, sample) {
|
71
|
+
return new Promise((resolve, reject) => {
|
72
|
+
const request = new XMLHttpRequest();
|
73
|
+
|
74
|
+
request.addEventListener("load", (event) => {
|
75
|
+
resolve(JSON.parse(event.target.response));
|
76
|
+
});
|
77
|
+
request.addEventListener("error", () => {
|
78
|
+
reject();
|
79
|
+
});
|
80
|
+
|
81
|
+
request.open("GET", `${this.mountedPath()}/api/designer/inputs/evaluate_regex?expression=${encodeURIComponent(expression)}&sample=${encodeURIComponent(sample)}`);
|
82
|
+
request.send();
|
83
|
+
});
|
84
|
+
}
|
69
85
|
}
|
@@ -307,6 +307,11 @@ window.Caixanegra.Designer = {
|
|
307
307
|
document.querySelector("#importFlow").addEventListener("click", this.#importFlow.bind(this));
|
308
308
|
document.querySelector("#exportFlow").addEventListener("click", this.#exportFlow.bind(this));
|
309
309
|
document.querySelector("#importFlowFile").addEventListener("change", this.#importFlowFileChanged.bind(this));
|
310
|
+
document.querySelector("#regexInput").addEventListener("keyup", this.#updateRegexInput.bind(this));
|
311
|
+
document.querySelector("#regexSample").addEventListener("keyup", this.#startRegexEvaluation.bind(this));
|
312
|
+
document.querySelector("#addRegexVariables").addEventListener("click", this.#addRegexVariablesRow.bind(this))
|
313
|
+
document.querySelector("#regexEditorToggleVars").addEventListener("click", this.#toggleRegexVariables.bind(this));
|
314
|
+
document.querySelector("#dismissRegexEditor").addEventListener("click", this.#dismissRegexEditor.bind(this));
|
310
315
|
this.toggleBlocker(true, "loading your flow");
|
311
316
|
window.addEventListener("resize", this.#windowResized.bind(drawingSurface));
|
312
317
|
drawingSurface.addEventListener("update_start", this.#engineUpdate.bind(this));
|
@@ -319,7 +324,6 @@ window.Caixanegra.Designer = {
|
|
319
324
|
|
320
325
|
this.gre.disable();
|
321
326
|
this.getUnits();
|
322
|
-
this.loadFlow();
|
323
327
|
this.gre.enable();
|
324
328
|
}
|
325
329
|
|
@@ -600,7 +604,7 @@ window.Caixanegra.Designer = {
|
|
600
604
|
});
|
601
605
|
|
602
606
|
this.#loadedComponents.catalog = true;
|
603
|
-
this.
|
607
|
+
this.loadFlow();
|
604
608
|
});
|
605
609
|
}
|
606
610
|
|
@@ -620,6 +624,10 @@ window.Caixanegra.Designer = {
|
|
620
624
|
this.#units = [];
|
621
625
|
|
622
626
|
(flowData?.units || []).forEach((unit) => {
|
627
|
+
const catalogUnit = this.#catalog.find((cUnit) => cUnit.class === unit.class);
|
628
|
+
if (catalogUnit) {
|
629
|
+
unit.color = catalogUnit.color;
|
630
|
+
}
|
623
631
|
this.createUnit(unit);
|
624
632
|
});
|
625
633
|
|
@@ -1278,9 +1286,10 @@ window.Caixanegra.Designer = {
|
|
1278
1286
|
case "regex":
|
1279
1287
|
{
|
1280
1288
|
valueInput = document.createElement("input");
|
1281
|
-
if(matrix.type === "regex") { valueInput.classList.add("-
|
1289
|
+
if(matrix.type === "regex") { valueInput.classList.add("-regex")}
|
1282
1290
|
valueInput.value = unit.mappings[input]?.value || matrix.default || "";
|
1283
1291
|
valueInput.addEventListener("change", this.#unitInputValueChanged.bind(this));
|
1292
|
+
valueInput.addEventListener("click", this.#regexEditor.bind(this));
|
1284
1293
|
}
|
1285
1294
|
break;
|
1286
1295
|
case "dataset":
|
@@ -1380,6 +1389,125 @@ window.Caixanegra.Designer = {
|
|
1380
1389
|
this.selectedUnit.mappings[input].value = ev.target.value;
|
1381
1390
|
}
|
1382
1391
|
|
1392
|
+
#toggleRegexVariables() {
|
1393
|
+
const target = document.querySelector("#blocker .regexEditor > div:last-child");
|
1394
|
+
if(target.classList.contains("-visible")) {
|
1395
|
+
target.classList.remove("-visible");
|
1396
|
+
} else {
|
1397
|
+
target.classList.add("-visible");
|
1398
|
+
}
|
1399
|
+
}
|
1400
|
+
|
1401
|
+
#updateRegexInput() {
|
1402
|
+
this.blocker.editorListener.value = this.blocker.querySelector("#regexInput").value;
|
1403
|
+
|
1404
|
+
this.#startRegexEvaluation();
|
1405
|
+
}
|
1406
|
+
|
1407
|
+
#startRegexEvaluation() {
|
1408
|
+
window.clearTimeout(this.blocker.evalTimeout);
|
1409
|
+
this.blocker.querySelector("#regexResults").innerHTML = "wating input end...";
|
1410
|
+
this.blocker.evalTimeout = window.setTimeout(this.#evaluateRegex.bind(this), 1500);
|
1411
|
+
}
|
1412
|
+
|
1413
|
+
#evaluateRegex() {
|
1414
|
+
this.blocker.querySelector("#regexResults").innerHTML = "evaluating...";
|
1415
|
+
let expression = this.blocker.querySelector("#regexInput").value;
|
1416
|
+
const sample = this.blocker.querySelector("#regexSample").value;
|
1417
|
+
document.querySelectorAll("#regexVariablesList .regex-variable-entry").forEach((pair) => {
|
1418
|
+
const placeholder = pair.querySelector("input.placeholder").value;
|
1419
|
+
const value = pair.querySelector("input.value").value;
|
1420
|
+
expression = expression.replace(new RegExp(placeholder, "g"), value);
|
1421
|
+
});
|
1422
|
+
|
1423
|
+
this.api.evaluateRegex(expression, sample).then((response) => {
|
1424
|
+
const tableEntries = Object.keys(response).length - 2 > 0;
|
1425
|
+
|
1426
|
+
this.blocker.querySelector("#regexResults").innerHTML = "";
|
1427
|
+
const expression = document.createElement("div");
|
1428
|
+
const full_match = document.createElement("div");
|
1429
|
+
expression.innerHTML = `<strong>Expression: </strong><code>${response["_expression"] || "unable to get expression"}</code>`;
|
1430
|
+
full_match.innerHTML = `<strong>Full Match: </strong><code>${response["_full"] || "unable to get full match"}</code>`;
|
1431
|
+
|
1432
|
+
this.blocker.querySelector("#regexResults").append(expression, full_match);
|
1433
|
+
|
1434
|
+
if (tableEntries) {
|
1435
|
+
const table = document.createElement("table");
|
1436
|
+
let tr = document.createElement("tr");
|
1437
|
+
let th = document.createElement("th");
|
1438
|
+
th.innerHTML = "capture";
|
1439
|
+
tr.append(th);
|
1440
|
+
th = document.createElement("th");
|
1441
|
+
th.innerHTML = "match";
|
1442
|
+
tr.append(th);
|
1443
|
+
table.append(tr);
|
1444
|
+
|
1445
|
+
for (const key of Object.keys(response)) {
|
1446
|
+
if (key.startsWith("_")) { continue; }
|
1447
|
+
|
1448
|
+
tr = document.createElement("tr");
|
1449
|
+
let td = document.createElement("td");
|
1450
|
+
td.innerHTML = key;
|
1451
|
+
tr.append(td);
|
1452
|
+
td = document.createElement("td");
|
1453
|
+
td.innerHTML = response[key];
|
1454
|
+
tr.append(td);
|
1455
|
+
|
1456
|
+
table.append(tr);
|
1457
|
+
}
|
1458
|
+
|
1459
|
+
this.blocker.querySelector("#regexResults").append(table);
|
1460
|
+
}
|
1461
|
+
}).catch((error) => {
|
1462
|
+
this.blocker.querySelector("#regexResults").innerHTML = "unable to evaluate";
|
1463
|
+
});
|
1464
|
+
}
|
1465
|
+
|
1466
|
+
#regexEditor(ev) {
|
1467
|
+
this.blocker.classList.add("-in-regex-editor");
|
1468
|
+
this.blocker.classList.remove("-released");
|
1469
|
+
this.blocker.editorListener = ev.target;
|
1470
|
+
this.blocker.querySelector("#regexInput").value = ev.target.value;
|
1471
|
+
|
1472
|
+
this.#startRegexEvaluation();
|
1473
|
+
}
|
1474
|
+
|
1475
|
+
#dismissRegexEditor() {
|
1476
|
+
this.blocker.classList.remove("-in-regex-editor");
|
1477
|
+
this.blocker.classList.add("-released");
|
1478
|
+
}
|
1479
|
+
|
1480
|
+
#removeRegexVariable() {
|
1481
|
+
this.parentElement.remove();
|
1482
|
+
}
|
1483
|
+
|
1484
|
+
#addRegexVariablesRow() {
|
1485
|
+
const list = document.querySelector("#regexVariablesList");
|
1486
|
+
|
1487
|
+
const wrapper = document.createElement("div");
|
1488
|
+
const name = document.createElement("input");
|
1489
|
+
const value = document.createElement("input");
|
1490
|
+
const remove = document.createElement("button");
|
1491
|
+
|
1492
|
+
name.placeholder = "placeholder";
|
1493
|
+
name.classList.add("placeholder");
|
1494
|
+
value.classList.add("value");
|
1495
|
+
name.autocomplete=false;
|
1496
|
+
value.autocomplete=false;
|
1497
|
+
value.placeholder = "value";
|
1498
|
+
remove.innerHTML = "-";
|
1499
|
+
|
1500
|
+
remove.addEventListener("click", this.#removeRegexVariable.bind(remove));
|
1501
|
+
|
1502
|
+
name.addEventListener("keyup", this.#startRegexEvaluation.bind(this));
|
1503
|
+
value.addEventListener("keyup", this.#startRegexEvaluation.bind(this));
|
1504
|
+
|
1505
|
+
wrapper.classList.add("regex-variable-entry");
|
1506
|
+
|
1507
|
+
wrapper.append(name, value, remove);
|
1508
|
+
list.append(wrapper);
|
1509
|
+
}
|
1510
|
+
|
1383
1511
|
#addUnitExitMapping(ev) {
|
1384
1512
|
const unit = this.selectedUnit;
|
1385
1513
|
const mapping = { use: "", as: "" };
|
@@ -538,6 +538,7 @@ $accent-contrast-color: darken($accent-color, 20%);
|
|
538
538
|
}
|
539
539
|
|
540
540
|
input {
|
541
|
+
position: relative;
|
541
542
|
width: 100%;
|
542
543
|
box-sizing: border-box;
|
543
544
|
background-color: $accent-highlight-color;
|
@@ -545,7 +546,7 @@ $accent-contrast-color: darken($accent-color, 20%);
|
|
545
546
|
border: none;
|
546
547
|
outline: none;
|
547
548
|
|
548
|
-
&.-
|
549
|
+
&.-regex {
|
549
550
|
font-family: monospace;
|
550
551
|
}
|
551
552
|
}
|
@@ -790,7 +791,7 @@ $accent-contrast-color: darken($accent-color, 20%);
|
|
790
791
|
left:0;
|
791
792
|
right:0;
|
792
793
|
bottom:0;
|
793
|
-
background-color:
|
794
|
+
background-color: rgba(0,0,0, .5);
|
794
795
|
transition: opacity 250ms ease-in-out;
|
795
796
|
opacity: 1;
|
796
797
|
|
@@ -817,6 +818,155 @@ $accent-contrast-color: darken($accent-color, 20%);
|
|
817
818
|
}
|
818
819
|
}
|
819
820
|
|
821
|
+
.regexEditor {
|
822
|
+
position: absolute;
|
823
|
+
top: 50%;
|
824
|
+
left: 50%;
|
825
|
+
transform: translate(-50%, -50%);
|
826
|
+
display: none;
|
827
|
+
font-family: Verdana, Geneva, Tahoma, sans-serif;
|
828
|
+
min-width: 70%;
|
829
|
+
flex-direction: row;
|
830
|
+
align-items: center;
|
831
|
+
justify-content: center;
|
832
|
+
|
833
|
+
& > div {
|
834
|
+
background-color: $accent-color;
|
835
|
+
box-shadow: $accent-shadow;
|
836
|
+
border-radius: 5px;
|
837
|
+
display: flex;
|
838
|
+
flex-direction: column;
|
839
|
+
padding: 12px;
|
840
|
+
position: relative;
|
841
|
+
font-size: 16px;
|
842
|
+
|
843
|
+
&:first-child {
|
844
|
+
margin-right: 15px;
|
845
|
+
width: 70%;
|
846
|
+
z-index: 10;
|
847
|
+
font-size: 0.8em;
|
848
|
+
}
|
849
|
+
|
850
|
+
&:last-child {
|
851
|
+
font-size: 0.8em;
|
852
|
+
transform: translateX(-200%);
|
853
|
+
width: 0;
|
854
|
+
box-shadow: 0 0 0 rgba(0,0,0,0);
|
855
|
+
z-index: 9;
|
856
|
+
overflow: hidden;
|
857
|
+
transition: all 250ms ease-in-out;
|
858
|
+
|
859
|
+
&.-visible {
|
860
|
+
transform: translateX(0%);
|
861
|
+
width: 30%;
|
862
|
+
}
|
863
|
+
}
|
864
|
+
}
|
865
|
+
|
866
|
+
label {
|
867
|
+
margin-bottom: 4px;
|
868
|
+
}
|
869
|
+
|
870
|
+
input {
|
871
|
+
margin-bottom: 6px;
|
872
|
+
box-sizing: border-box;
|
873
|
+
background-color: #9c9c9c;
|
874
|
+
padding: 6px 4px;
|
875
|
+
border: none;
|
876
|
+
outline: none;
|
877
|
+
}
|
878
|
+
|
879
|
+
#regexInput {
|
880
|
+
font-family: monospace;
|
881
|
+
font-size: 1.1em;
|
882
|
+
}
|
883
|
+
|
884
|
+
#regexSample {
|
885
|
+
font-size: 0.8em;
|
886
|
+
}
|
887
|
+
|
888
|
+
#regexResults {
|
889
|
+
padding: 8px;
|
890
|
+
background-color:rgb(200, 200, 200);
|
891
|
+
color: black;
|
892
|
+
max-height: 50vh;
|
893
|
+
overflow: auto;
|
894
|
+
display: block;
|
895
|
+
margin-bottom: 30px;
|
896
|
+
font-size: 0.7em;
|
897
|
+
|
898
|
+
table {
|
899
|
+
margin-top: 15px;
|
900
|
+
width: 100%;
|
901
|
+
border-collapse: collapse;
|
902
|
+
|
903
|
+
th, td {
|
904
|
+
text-align: left;
|
905
|
+
border: 1px solid rgba(0,0,0,.3);
|
906
|
+
padding: 4px;
|
907
|
+
}
|
908
|
+
|
909
|
+
tr:nth-child(even) {
|
910
|
+
background-color: rgba(0,0,0,.15);
|
911
|
+
}
|
912
|
+
}
|
913
|
+
}
|
914
|
+
|
915
|
+
#regexVariables {
|
916
|
+
#regexVariablesList {
|
917
|
+
margin-bottom: 15px;
|
918
|
+
}
|
919
|
+
|
920
|
+
.regex-variable-entry {
|
921
|
+
display: flex;
|
922
|
+
flex-direction: row;
|
923
|
+
margin: 2px 0;
|
924
|
+
align-items: center;
|
925
|
+
|
926
|
+
input {
|
927
|
+
width: 100%;
|
928
|
+
margin-bottom: 0;
|
929
|
+
|
930
|
+
&:first-child {
|
931
|
+
margin-right: 5px;
|
932
|
+
}
|
933
|
+
}
|
934
|
+
|
935
|
+
button {
|
936
|
+
margin-left: 5px;
|
937
|
+
}
|
938
|
+
}
|
939
|
+
}
|
940
|
+
|
941
|
+
button {
|
942
|
+
background-color: $accent-highlight-color;
|
943
|
+
border: 1px solid $accent-color;
|
944
|
+
color: black;
|
945
|
+
padding: 3px 6px;
|
946
|
+
cursor: pointer;
|
947
|
+
transition: all 250ms ease-in-out;
|
948
|
+
|
949
|
+
&:hover {
|
950
|
+
background-color: $accent-contrast-color;
|
951
|
+
color: $accent-highlight-color;
|
952
|
+
}
|
953
|
+
}
|
954
|
+
|
955
|
+
#regexEditorToggleVars {
|
956
|
+
float: right;
|
957
|
+
}
|
958
|
+
}
|
959
|
+
|
960
|
+
&.-in-regex-editor {
|
961
|
+
.information {
|
962
|
+
display: none;
|
963
|
+
}
|
964
|
+
|
965
|
+
.regexEditor {
|
966
|
+
display: flex;
|
967
|
+
}
|
968
|
+
}
|
969
|
+
|
820
970
|
&.-released {
|
821
971
|
pointer-events: none;
|
822
972
|
opacity: 0;
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Caixanegra
|
2
|
+
module API
|
3
|
+
module Designer
|
4
|
+
class InputsController < ::Caixanegra::APIController
|
5
|
+
def evaluate_regex
|
6
|
+
full_match = sample.match(Regexp.new(expression, Regexp::IGNORECASE))
|
7
|
+
direct = { "_full": full_match.to_s, "_expression": expression }
|
8
|
+
captures = {}
|
9
|
+
|
10
|
+
(full_match&.captures || []).each_with_index do |capture, index|
|
11
|
+
captures["c#{index}"] = capture
|
12
|
+
end
|
13
|
+
named_captures = full_match&.named_captures || {}
|
14
|
+
|
15
|
+
render json: direct.merge(captures).merge(named_captures).symbolize_keys
|
16
|
+
rescue RegexpError
|
17
|
+
head 422
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def expression
|
23
|
+
@expression ||= params[:expression]
|
24
|
+
end
|
25
|
+
|
26
|
+
def sample
|
27
|
+
@sample ||= params[:sample]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -108,6 +108,27 @@
|
|
108
108
|
<div>caixa<span>negra</span></div>
|
109
109
|
<div class="message">loading your flow</div>
|
110
110
|
</div>
|
111
|
+
<div class="regexEditor">
|
112
|
+
<div>
|
113
|
+
<label for="regexInput">Regular Expression</label>
|
114
|
+
<input id="regexInput" type="text" />
|
115
|
+
<label for="regexSample" placeholder="type sample text here">Sample</label>
|
116
|
+
<input id="regexSample" type="text" />
|
117
|
+
<label for="regexResults">Result</label>
|
118
|
+
<div id="regexResults"></div>
|
119
|
+
<div>
|
120
|
+
<button id="dismissRegexEditor">dismiss</button>
|
121
|
+
<button id="regexEditorToggleVars">vars</button>
|
122
|
+
</div>
|
123
|
+
</div>
|
124
|
+
<div>
|
125
|
+
<label for="regexVariables">Variables</label>
|
126
|
+
<div id="regexVariables">
|
127
|
+
<div id="regexVariablesList"></div>
|
128
|
+
<button id="addRegexVariables">add</button>
|
129
|
+
</div>
|
130
|
+
</div>
|
131
|
+
</div>
|
111
132
|
</div>
|
112
133
|
<div id="action_messenger">
|
113
134
|
<div class="icon icon-error">
|
data/config/routes.rb
CHANGED
data/lib/caixanegra/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caixanegra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sergiorribeiro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -57,6 +57,7 @@ files:
|
|
57
57
|
- app/assets/stylesheets/caixanegra/application.css
|
58
58
|
- app/assets/stylesheets/caixanegra/designer.scss
|
59
59
|
- app/controllers/caixanegra/api/designer/flows_controller.rb
|
60
|
+
- app/controllers/caixanegra/api/designer/inputs_controller.rb
|
60
61
|
- app/controllers/caixanegra/api/designer/units_controller.rb
|
61
62
|
- app/controllers/caixanegra/api_controller.rb
|
62
63
|
- app/controllers/caixanegra/application_controller.rb
|