1+ <!DOCTYPE html>
2+ < html >
3+ < head >
4+ < script src ="https://unpkg.com/blockly/blockly.min.js "> </ script >
5+ < script src ="https://unpkg.com/sparql-blockly/sparql-blockly.min.js "> </ script >
6+ < style >
7+ body {
8+ margin : 0 ;
9+ height : 100vh ;
10+ display : flex;
11+ flex-direction : column
12+ }
13+
14+ textarea {
15+ height : 10em ;
16+ padding : 20px ;
17+ }
18+
19+ section {
20+ flex-grow : 1 ;
21+ }
22+ </ style >
23+ < script >
24+ window . addEventListener ( "load" , initialiseBlockly )
25+
26+ async function initialiseBlockly ( ) {
27+ const toolbox = await getToolboxData ( )
28+ const options = { toolbox, sounds : false }
29+ const container = document . querySelector ( "section" )
30+
31+ const workspace = Blockly . inject ( container , options )
32+
33+ workspace . addChangeListener ( blocklyChanged )
34+ }
35+
36+ function blocklyChanged ( e ) {
37+ switch ( e . type ) {
38+ case Blockly . Events . CHANGE :
39+ case Blockly . Events . DELETE :
40+ case Blockly . Events . MOVE :
41+ generateCode ( )
42+ }
43+ }
44+
45+ function generateCode ( ) {
46+ const workspace = Blockly . getMainWorkspace ( )
47+
48+ populateTextarea ( "" )
49+
50+ for ( const block of workspace . getTopBlocks ( false ) ) {
51+ switch ( block . type ) {
52+ case "sparql11_query" :
53+ case "sparql11_update" :
54+ populateTextarea ( SparqlBlockly . blocklyToSparql ( block ) )
55+ }
56+ }
57+ }
58+
59+ function populateTextarea ( sparql ) {
60+ document . querySelector ( "textarea" ) . value = sparql
61+ }
62+
63+ async function getToolboxData ( ) {
64+ const response = await fetch ( "../toolbox.xml" )
65+ return await response . text ( )
66+ }
67+ </ script >
68+ </ head >
69+ < body >
70+ < textarea placeholder ="Interact with Blockly canvas below to generate SPARQL code here. " readonly > </ textarea >
71+ < section > </ section >
72+ </ body >
73+ </ html >
0 commit comments