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
663export 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}
0 commit comments