Skip to content

Commit 2967f17

Browse files
committed
Merge branch 'gh-pages' of https://github.com/LivelyKernel/lively4-core into gh-pages
2 parents b425713 + 662d523 commit 2967f17

20 files changed

+924
-512
lines changed
Lines changed: 5 additions & 242 deletions
Original file line numberDiff line numberDiff line change
@@ -1,248 +1,11 @@
1-
import ohm from "https://unpkg.com/[email protected]/dist/ohm.js";
2-
3-
const exampleQueries = [
4-
"Composite(AA.AuN='mike smith')",
5-
"Ti='indexing by latent seman'",
6-
"Ti=='indexing by latent semantic analysis'",
7-
"Composite(AA.AuN=='susan t dumais')",
8-
"Y=[2010, 2012)",
9-
"Y=[2010, 2012]",
10-
"Y<=2010",
11-
"Y>=2005",
12-
"Y<2010",
13-
"D>'2010-02-03'",
14-
"D=['2010-02-03','2010-02-05']",
15-
"D='2010-02-03'",
16-
"And(Y=1985, Ti='disordered electronic systems')",
17-
"Or(Ti='disordered electronic systems', Ti='fault tolerance principles and practice')",
18-
"And(Or(Y=1985,Y=2008), Ti='disordered electronic systems')",
19-
"Composite(And(AA.AuN='mike smith',AA.AfN='harvard university'))",
20-
"And(Composite(AA.AuN='mike smith'),Composite(AA.AfN='harvard university'))"
21-
]
22-
23-
24-
/*function createUILayer(object, key) {
25-
var subDiv = <div id="innerDiv" style="margin: 5px; border: 1px solid gray;">{key}</div>;
26-
var valueOrObject = object[key];
27-
if (typeof(valueOrObject) == "object") {
28-
Object.keys(valueOrObject).map(k => {
29-
subDiv.appendChild(createUILayer(valueOrObject, k));
30-
});
31-
} else {
32-
var input = <input value={valueOrObject}></input>;
33-
subDiv.appendChild(input);
34-
}
35-
return subDiv;
36-
}*/
37-
38-
function parseQuery(object) {
39-
var subDiv = <div id="innerDiv" style="margin: 5px; border: 1px solid gray;"></div>;
40-
41-
switch(object.type) {
42-
case "simple":
43-
[object.attribute, object.comparator, object.value].forEach(value => {
44-
var input = <input value={value}></input>;
45-
subDiv.appendChild(input)
46-
});
47-
break;
48-
case "conjunction":
49-
var input = <input value={object.conjunction}></input>;
50-
var left = parseQuery(object.left);
51-
var right = parseQuery(object.right);
52-
[input, left, right].forEach(element => {
53-
subDiv.appendChild(element);
54-
});
55-
break;
56-
case "composite":
57-
[object.attribute, object.comparator, object.value].forEach(value => {
58-
var input = <input value={value}></input>;
59-
subDiv.appendChild(input)
60-
});
61-
}
62-
return subDiv;
63-
}
64-
1+
import AcademicQuery from 'src/components/widgets/academic-query.js';
652

663
export default class LeoUIExample{
674
static async create () {
5+
var queryWidget = await (<academic-query></academic-query>);
6+
queryWidget.setQuery("And(Or(Y='1985', Y='2008'), Ti='disordered electronic systems')");
7+
//queryWidget.setQuery("Y='1985'");
688

69-
// var hello = <div id="helloDiv" draggable="true" click={() => lively.notify('hi')}>
70-
// Hi
71-
// </div>
72-
73-
// var world = <div id="worldDiv">
74-
// World
75-
// </div>
76-
77-
// let description = <p id="description"></p>
78-
79-
// hello.addEventListener('dragstart', dragStart);
80-
// hello.addEventListener('dragend', dragEnd);
81-
82-
// world.addEventListener('drop', drop);
83-
84-
var g = ohm.grammar(
85-
`Academic {
86-
Exp =
87-
AcademicQuery
88-
89-
AcademicQuery = Attribute Comparator Value -- simple
90-
| ("And" | "Or") "(" AcademicQuery "," AcademicQuery ")" -- complex
91-
| "Composite(" CompositeQuery ")" -- composite
92-
CompositeQuery = Attribute "." Attribute Comparator Value -- simple
93-
| ("And" | "Or") "(" CompositeQuery "," CompositeQuery ")" -- complex
94-
95-
Comparator =
96-
PartialComparator "="?
97-
PartialComparator =
98-
"=" | "<" | ">"
99-
100-
Attribute (an attribute) =
101-
letter letter? letter?
102-
103-
Value (a value) =
104-
"\'" alnum* "\'" -- string
105-
| Number
106-
| Date
107-
| ( "[" | "(" ) Number "," Number ( "]" | ")" ) -- numberRange
108-
| ( "[" | "(" ) Date "," Date ( "]" | ")" ) -- dateRange
109-
110-
Number =
111-
digit+
112-
Date =
113-
"\'" Number "-" Number "-" Number "\'"
114-
}`
115-
);
116-
117-
var s = g.createSemantics();
118-
119-
s.addOperation(
120-
'interpret', {
121-
Exp: function(e) {
122-
return e.interpret();
123-
},
124-
125-
AcademicQuery_simple: function(attribute, comparator, value) {
126-
return {
127-
"attribute" : attribute.interpret(),
128-
"comparator" : comparator.interpret(),
129-
"value" : value.interpret(),
130-
"type" : "simple"
131-
}
132-
},
133-
AcademicQuery_complex: function(conjunction, _1, left, _2, right, _3) {
134-
return {
135-
"conjunction" : conjunction.sourceString,
136-
"left" : left.interpret(),
137-
"right" : right.interpret(),
138-
"type" : "conjunction"
139-
}
140-
},
141-
AcademicQuery_composite: function(_1, query, _2) {
142-
return query.interpret();
143-
},
144-
145-
CompositeQuery_simple: function(mainAttribute, _, secondaryAttribute, comparator, value) {
146-
// would it make sense to split main and secondary attribute?
147-
var main = mainAttribute.interpret();
148-
var secondary = secondaryAttribute.interpret();
149-
return {
150-
"attribute" : main + "." + secondary,
151-
"comparator" : comparator.interpret(),
152-
"value" : value.interpret(),
153-
"type" : "composite"
154-
}
155-
},
156-
CompositeQuery_complex: function(conjunction, _1, left, _2, right, _3) {
157-
return {
158-
"conjunction" : conjunction.sourceString,
159-
"left" : left.interpret(),
160-
"right" : right.interpret(),
161-
"type" : "conjunction"
162-
}
163-
},
164-
165-
Comparator: function(main, secondary) {
166-
return [main.interpret(), secondary.sourceString].join('');
167-
},
168-
PartialComparator: function(comparator) {
169-
return comparator.sourceString;
170-
},
171-
172-
Attribute: function(a, b, c) {
173-
return [a.interpret(), b.interpret(), c.interpret()].join('');
174-
},
175-
176-
Value: function(value) {
177-
return value.interpret();
178-
},
179-
Value_string: function(_1, string, _2) {
180-
return string.sourceString;
181-
},
182-
Value_numberRange: function(leftBracket, nLeft, _, nRight, rightBracket) {
183-
return "TODO";//arguments.map(a => {a.sourceString}).join('');
184-
},
185-
Value_dateRange: function(leftBracket, dLeft, _, dRight, rightBracket) {
186-
return "TODO";//arguments.map(a => {a.sourceString}).join('');
187-
},
188-
189-
Number: function(n) {
190-
return parseFloat(n.sourceString);
191-
},
192-
Date: function(_1, year, _2, month, _3, day, _4) {
193-
return new Date(year.interpret(),
194-
month.interpret(),
195-
day.interpret())
196-
},
197-
198-
letter: function(a) {
199-
return a.sourceString;
200-
}
201-
}
202-
)
203-
204-
// "Test"
205-
exampleQueries.forEach(q => {
206-
var m = g.match(q);
207-
if (m.failed()) {
208-
lively.notify("Failed query: ", q)
209-
} else {
210-
lively.notify(q, s(m).interpret());
211-
}
212-
})
213-
214-
215-
// function dragStart(event) {
216-
// description.innerHTML = "dragging";
217-
// event.dataTransfer.setData("element", event.target.id);
218-
// }
219-
220-
// function dragEnd(event) {
221-
// description.innerHTML = "";
222-
// }
223-
224-
// function drop(event) {
225-
// event.preventDefault();
226-
// var data = event.dataTransfer.getData("element");
227-
// console.log("Datatransfer Types" + event.dataTransfer.types);
228-
// event.target.appendChild(lively.query(this, '#'+data))
229-
// }
230-
231-
var query = "And(Or(Y='1985', Y='2008'), Ti='disordered electronic systems')";
232-
var match = g.match(query);
233-
var queryObject = s(match).interpret();
234-
235-
var input = <input id="queryInput" value={query} style="width: 100%"></input>
236-
var div = <div id="outerDiv" style="padding-right : 20px">
237-
{input}
238-
</div>
239-
240-
/*Object.keys(queryObject).forEach(key => {
241-
div.appendChild(createUILayer(queryObject, key));
242-
});*/
243-
244-
div.appendChild(parseQuery(queryObject));
245-
246-
return div;
9+
return <div>{queryWidget}</div>;
24710
}
24811
}

src/client/boot.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ async function intializeLively() {
451451
groupedMessage('Load Standard Library');
452452
await System.import("lang");
453453
await System.import("lang-ext");
454+
await System.import("lang-zone");
454455
groupedMessageEnd();
455456

456457
groupedMessage('Initialize Document (in lively.js)' );

src/client/lang/lang-zone.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import 'lang';
2+
import Dexie from "src/external/dexie3.js";
3+
4+
const { incrementExpectedAwaits, newPSD, decrementExpectedAwaits } = Dexie.Promise;
5+
6+
const global = self;
7+
8+
function exposeGlobal(key, value) {
9+
Object.defineProperty(global, key, {
10+
configurable: true,
11+
enumerable: true,
12+
13+
value,
14+
writable: true,
15+
});
16+
}
17+
18+
/*MD
19+
## ZONES
20+
21+
- a **minimal interface** to zones intended to be as compliant as possible to Dart's [Zone concept](https://dart.dev/articles/archive/zones)
22+
- intended to be exchangeable in case of future standard or library advancements
23+
- <span style='background: red'>!only modify if you know what you are doing and understand the **long-term consequences**!</span>
24+
- currently implemented as a lightweight wrapper around [Dexie.Promise](https://dexie.org/docs/Promise/Promise.PSD)
25+
- Caution: we <span style='background: red'>monkey-patched Dexie</span> to access `incrementExpectedAwaits` and `decrementExpectedAwaits` to correctly detect native await on primitives
26+
27+
MD*/
28+
29+
// check if `incrementExpectedAwaits` and `decrementExpectedAwaits` are available
30+
if (![incrementExpectedAwaits, decrementExpectedAwaits].every(func => typeof func === 'function')) {
31+
throw new Error('Dexie not monkey-patched to expose `incrementExpectedAwaits` and `decrementExpectedAwaits`');
32+
}
33+
34+
const globalZone = (() => {
35+
let zone = Dexie.Promise.PSD;
36+
37+
while (!zone.global) {
38+
if (zone.parent && zone.parent !== zone) {
39+
zone = zone.parent;
40+
} else {
41+
throw new Error('could not initialize `zones`: no global zone found');
42+
}
43+
}
44+
45+
46+
return zone;
47+
})();
48+
49+
50+
51+
const Zone = {
52+
53+
get root() { return globalZone; },
54+
55+
get current() { return Dexie.Promise.PSD; }
56+
57+
};
58+
59+
export function withZone(scopeFunc, zoneProps = {}) {
60+
let returnValue;
61+
try {
62+
incrementExpectedAwaits();
63+
64+
newPSD(() => {
65+
returnValue = scopeFunc.call();
66+
}, zoneProps);
67+
68+
return returnValue;
69+
} finally {
70+
if (returnValue && typeof returnValue.then === 'function') {
71+
(async () => {
72+
try {
73+
await returnValue;
74+
} catch(e) {
75+
} finally {
76+
decrementExpectedAwaits();
77+
}
78+
})();
79+
} else {
80+
decrementExpectedAwaits();
81+
}
82+
}
83+
}
84+
85+
function runZoned(fn, { zoneValues } = {} ) {
86+
return withZone(fn, zoneValues);
87+
}
88+
89+
exposeGlobal('Zone', Zone);
90+
exposeGlobal('runZoned', runZoned);

src/client/pen-editor/components/abstract-ast-node.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ export default class AbstractAstNode extends Morph {
308308
});
309309
this.setAttribute('ast-node-scope', SCOPE_MAP.getOrCreate(path.scope, () => NEXT_SCOPE_ID++ % 20));
310310
this.setAttribute('ast-node-depth', depth);
311-
this.style.setProperty("--my-border", `10px solid red`);
311+
// this.style.setProperty("--my-border", `10px solid green`);
312312
}
313313

314314
async setPath(path) {

src/client/pen-editor/components/ast-node-block-statement.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
}
99
#indention-container {
1010
display: grid;
11-
border-left: solid 1px goldenrod;
12-
border-right: solid 1px goldenrod;
11+
/* border-left: solid 1px goldenrod; */
12+
/* border-right: solid 1px goldenrod; */
1313
}
1414
#indention {
1515
align-self: center;

src/client/pen-editor/components/ast-node-function-declaration.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010

1111
#body-container {
1212
width: min-content;
13-
border: 1px solid goldenrod;
14-
background-color: #eeeeee;
13+
/* border: 1px solid goldenrod; */
14+
/* background-color: #eeeeee; */
1515
}
1616
#header {
1717
display: flex;

0 commit comments

Comments
 (0)