From ff57cf9172af1ba75ef837fb430079f195c43915 Mon Sep 17 00:00:00 2001 From: Graham Trott Date: Fri, 12 Jun 2020 22:27:18 +0100 Subject: [PATCH] Quickstart tutorial --- dist/easycoder-min.js | 22 +++++------ dist/easycoder.js | 8 +++- dist/plugins/iwsy.js | 3 ++ iwsy/iwsy.js | 51 +++++++++++++++++-------- iwsy/resources/ecs/blocks.txt | 2 + iwsy/resources/ecs/content.txt | 3 ++ iwsy/resources/ecs/fileman.txt | 13 +++---- iwsy/resources/ecs/help.txt | 27 +++++++------ iwsy/resources/ecs/iwsy.txt | 22 ++++++----- iwsy/resources/ecs/steps.txt | 59 +++++++++++++++++++++-------- iwsy/resources/help/action-init.md | 2 +- iwsy/resources/help/contents.md | 2 +- iwsy/resources/help/iwsy.md | 10 ++--- iwsy/resources/help/project.md | 4 +- iwsy/resources/help/quickstart.md | 28 ++++++++------ iwsy/resources/help/quickstart2.md | 51 +++++++++++++++++++++++++ iwsy/resources/help/quickstart3.md | 54 ++++++++++++++++++++++++++ iwsy/resources/help/users.md | 2 +- iwsy/resources/icon/iwsy.png | Bin 0 -> 54734 bytes js/plugins/iwsy.js | 3 ++ 20 files changed, 275 insertions(+), 91 deletions(-) create mode 100644 iwsy/resources/help/quickstart2.md create mode 100644 iwsy/resources/help/quickstart3.md create mode 100644 iwsy/resources/icon/iwsy.png diff --git a/dist/easycoder-min.js b/dist/easycoder-min.js index a099afd..032ee40 100644 --- a/dist/easycoder-min.js +++ b/dist/easycoder-min.js @@ -68,7 +68,7 @@ case "dummy":return EasyCoder_Core.Dummy;case "encode":return EasyCoder_Core.Enc case "negate":return EasyCoder_Core.Negate;case "on":return EasyCoder_Core.On;case "print":return EasyCoder_Core.Print;case "put":return EasyCoder_Core.Put;case "replace":return EasyCoder_Core.Replace;case "require":return EasyCoder_Core.Require;case "return":return EasyCoder_Core.Return;case "run":return EasyCoder_Core.Run;case "sanitize":return EasyCoder_Core.Sanitize;case "script":return EasyCoder_Core.Script;case "send":return EasyCoder_Core.Send;case "set":return EasyCoder_Core.Set;case "sort":return EasyCoder_Core.Sort; case "split":return EasyCoder_Core.Split;case "stop":return EasyCoder_Core.Stop;case "take":return EasyCoder_Core.Take;case "toggle":return EasyCoder_Core.Toggle;case "variable":return EasyCoder_Core.Variable;case "wait":return EasyCoder_Core.Wait;case "while":return EasyCoder_Core.While;default:return!1}},run:function(a){var b=a[a.pc],c=EasyCoder_Core.getHandler(b.keyword);c||a.runtimeError(b.lino,"Unknown keyword '"+b.keyword+"' in 'core' package");return c.run(a)},isNegate:function(a){return"not"=== a.getToken()?(a.next(),!0):!1},value:{compile:function(a){if(a.isSymbol()){var b=a.getToken();switch(a.getSymbolRecord().keyword){case "module":return a.next(),{domain:"core",type:"module",name:b};case "variable":var c=a.nextToken();return["format","modulo"].includes(c)?(a=a.getNextValue(),{domain:"core",type:c,name:b,value:a}):{domain:"core",type:"symbol",name:b}}return null}b=a.getToken();if("true"===b)return a.next(),{domain:"core",type:"boolean",content:!0};if("false"===b)return a.next(),{domain:"core", -type:"boolean",content:!1};if("random"===b)return a.next(),{domain:"core",type:"random",range:a.getValue()};if("cos"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"cos",angle_c:b,radius_c:a};if("sin"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"sin",angle_s:b,radius_s:a};if("tan"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"tan",angle_t:b,radius_t:a};if("now today newline break empty uuid".split(" ").includes(b))return a.next(), +type:"boolean",content:!1};if("random"===b)return a.next(),{domain:"core",type:"random",range:a.getValue()};if("cos"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"cos",angle_c:b,radius_c:a};if("sin"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"sin",angle_s:b,radius_s:a};if("tan"===b)return a.next(),b=a.getValue(),a.skip("radius"),a=a.getValue(),{domain:"core",type:"tan",angle_t:b,radius_t:a};if("now today newline backtick break empty uuid".split(" ").includes(b))return a.next(), {domain:"core",type:b};if("date"===b)return{domain:"core",type:"date",value:a.getNextValue()};if(["encode","decode","lowercase","hash","reverse"].includes(b))return a.next(),a=a.getValue(),{domain:"core",type:b,value:a};if("element"===b)return b=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(c=a.getSymbolRecord(),a.next(),"variable"===c.keyword)?{domain:"core",type:"element",element:b,symbol:c.name}:null;if("property"===b)return b=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&(c=a.getSymbolRecord(), a.next(),"variable"===c.keyword)?{domain:"core",type:"property",property:b,symbol:c.name}:null;if("arg"===b){var d=a.getNextValue();if(a.tokenIs("of")&&a.nextIsSymbol())return b=a.getSymbolRecord(),a.next(),{domain:"core",type:"arg",value:d,target:b.name}}if(["character","char"].includes(b)&&(b=a.getNextValue(),a.tokenIs("of")))return a=a.getNextValue(),{domain:"core",type:"char",index:b,value:a};a.tokenIs("the")&&a.next();b=a.getToken();switch(b){case "elements":if(["of","in"].includes(a.nextToken())&& a.nextIsSymbol())return c=a.getToken(),a.next(),{domain:"core",type:b,name:c};break;case "index":if(a.nextTokenIs("of")){if(a.nextIsSymbol()){if("in"===a.peek())return b=a.getValue(),a=a.getNextValue(),{domain:"core",type:"indexOf",value1:b,value2:a};c=a.getToken();a.next();return{domain:"core",type:b,name:c}}b=a.getValue();if(a.tokenIs("in"))return a=a.getNextValue(),{domain:"core",type:"indexOf",value1:b,value2:a}}break;case "value":if(a.nextTokenIs("of"))return a.next(),{domain:"core",type:"valueOf", @@ -79,16 +79,16 @@ parseFloat(c))*a,10)};case "sin":return c=a.getValue(b.angle_s),a=a.getValue(b.r case "left":return{type:"constant",numeric:!1,content:a.getValue(b.value).substr(0,a.getValue(b.count))};case "right":return c=a.getValue(b.value),{type:"constant",numeric:!1,content:c.substr(c.length-a.getValue(b.count))};case "from":c=a.getValue(b.from);var d=b.to?a.getValue(b.to):null;a=a.getValue(b.value);return{type:"constant",numeric:!1,content:d?a.substr(c,d):a.substr(c)};case "position":return c=a.getValue(b.needle),a=a.getValue(b.haystack),b.nocase&&(c=c.toLowerCase(),a=a.toLowerCase()), {type:"constant",numeric:!0,content:b.last?a.lastIndexOf(c):a.indexOf(c)};case "payload":return{type:"constant",numeric:!1,content:a.getSymbolRecord(b.callback).payload};case "modulo":return c=a.getSymbolRecord(b.name),a=a.evaluate(b.value),{type:"constant",numeric:!0,content:c.value[c.index].content%a.content};case "format":c=a.getSymbolRecord(b.name);c=1E3*a.getValue(c.value[c.index]);try{switch(d=JSON.parse(a.getValue(b.value)),d.mode){case "time":return{type:"constant",numeric:!0,content:(new Date(c)).toLocaleTimeString(d.locale, d.options)};default:var e=new Date(c);return{type:"constant",numeric:!1,content:"iso"===d.format?e.getFullYear()+"-"+(e.getMonth()+1)+"-"+e.getDate():e.toLocaleDateString(d.locale,d.options)}}}catch(f){a.runtimeError(a[a.pc].lino,"Can't parse "+b.value);break}case "empty":return{type:"constant",numeric:!1,content:""};case "now":return{type:"constant",numeric:!0,content:Math.floor(Date.now()/1E3)};case "millisecond":return{type:"constant",numeric:!0,content:Math.floor(Date.now())};case "today":return a= -new Date,a.setHours(0,0,0,0),{type:"constant",numeric:!0,content:Math.floor(a.getTime()/1E3)};case "date":c=Date.parse(a.getValue(b.value))/1E3;if(isNaN(c)){a.runtimeError(a[a.pc].lino,"Invalid date format; expecting 'yyyy-mm-dd'");break}return{type:"constant",numeric:!0,content:c};case "newline":return{type:"constant",numeric:!1,content:"\n"};case "break":return{type:"constant",numeric:!1,content:"
"};case "uuid":return{type:"constant",numeric:!1,content:"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, -function(a){var b=16*Math.random()|0;return("x"==a?b:b&3|8).toString(16)})};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(b.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(b.value))};case "reverse":return{type:"constant",numeric:!1,content:a.getValue(b.value).split("").reverse().join("")};case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(b.value).toLowerCase()};case "hash":a=a.getValue(b.value);b=0;if(0===a.length)return b; -for(c=0;c=c:0c;case "not":return!a.getValue(b.value);case "moduleRunning":return c=a.getSymbolRecord(b.name),EasyCoder.scripts.hasOwnProperty(c.program)?(c=EasyCoder.scripts[c.program],b.sense?c.running:!c.running):!b.sense;case "includes":return c=JSON.parse(a.getValue(b.value1)),b=a.getValue(b.value2),c.includes(b)}return!1}}},EasyCoder_Browser={name:"EasyCoder_Browser",A:{compile:function(a){a.compileVariable("browser", -"a",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Alert:{compile:function(a){var b=a.getLino(),c=a.getNextValue();a.addCommand({domain:"browser",keyword:"alert",lino:b,value:c});return!0},run:function(a){var b=a[a.pc];a=a.getFormattedValue(b.value);alert(a);return b.pc+1}},Attach:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord(),d=c.keyword;switch(d){case "a":case "blockquote":case "button":case "canvas":case "div":case "fieldset":case "file":case "form":case "h1":case "h2":case "h3":case "h4":case "h5":case "h6":case "image":case "img":case "input":case "label":case "legend":case "li":case "option":case "p":case "pre":case "select":case "span":case "table":case "td":case "text":case "textarea":case "tr":case "ul":a.next(); +new Date,a.setHours(0,0,0,0),{type:"constant",numeric:!0,content:Math.floor(a.getTime()/1E3)};case "date":c=Date.parse(a.getValue(b.value))/1E3;if(isNaN(c)){a.runtimeError(a[a.pc].lino,"Invalid date format; expecting 'yyyy-mm-dd'");break}return{type:"constant",numeric:!0,content:c};case "newline":return{type:"constant",numeric:!1,content:"\n"};case "backtick":return{type:"constant",numeric:!1,content:"`"};case "break":return{type:"constant",numeric:!1,content:"
"};case "uuid":return{type:"constant", +numeric:!1,content:"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0;return("x"==a?b:b&3|8).toString(16)})};case "encode":return{type:"constant",numeric:!1,content:a.encode(a.getValue(b.value))};case "decode":return{type:"constant",numeric:!1,content:a.decode(a.getValue(b.value))};case "reverse":return{type:"constant",numeric:!1,content:a.getValue(b.value).split("").reverse().join("")};case "lowercase":return{type:"constant",numeric:!1,content:a.getValue(b.value).toLowerCase()}; +case "hash":a=a.getValue(b.value);b=0;if(0===a.length)return b;for(c=0;c=c:0c;case "not":return!a.getValue(b.value);case "moduleRunning":return c=a.getSymbolRecord(b.name),EasyCoder.scripts.hasOwnProperty(c.program)?(c=EasyCoder.scripts[c.program],b.sense?c.running:!c.running):!b.sense;case "includes":return c=JSON.parse(a.getValue(b.value1)),b=a.getValue(b.value2),c.includes(b)}return!1}}}, +EasyCoder_Browser={name:"EasyCoder_Browser",A:{compile:function(a){a.compileVariable("browser","a",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Alert:{compile:function(a){var b=a.getLino(),c=a.getNextValue();a.addCommand({domain:"browser",keyword:"alert",lino:b,value:c});return!0},run:function(a){var b=a[a.pc];a=a.getFormattedValue(b.value);alert(a);return b.pc+1}},Attach:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord(),d=c.keyword;switch(d){case "a":case "blockquote":case "button":case "canvas":case "div":case "fieldset":case "file":case "form":case "h1":case "h2":case "h3":case "h4":case "h5":case "h6":case "image":case "img":case "input":case "label":case "legend":case "li":case "option":case "p":case "pre":case "select":case "span":case "table":case "td":case "text":case "textarea":case "tr":case "ul":a.next(); if(a.tokenIs("to")){if(a.nextTokenIs("body"))if("div"===d)cssId="body",a.next();else throw Error("Body variable must be a div");else cssId=a.getValue();var e=0;a.tokenIs("or")&&(a.next(),e=a.getPc()+1,a.completeHandler());a.addCommand({domain:"browser",keyword:"attach",lino:b,type:d,symbol:c.name,cssId:cssId,onError:e});return!0}break;default:return a.addWarning("type '"+c.keyword+"' not recognized in browser 'attach'"),!1}}a.addWarning("Unrecognised syntax in 'attach'");return!1},run:function(a){var b= a[a.pc],c=null,d=null;"body"===b.cssId?d=document.body:(c=a.value.evaluate(a,b.cssId).content,d=document.getElementById(c));if(!d)return b.onError?a.run(b.onError):a.runtimeError(b.lino,"No such element: '"+c+"'"),0;var e=a.getSymbolRecord(b.symbol);e.element[e.index]=d;e.value[e.index]={type:"constant",numeric:!1,content:c};"popup"===b.type&&(a.popups.push(d.id),window.onclick=function(b){a.popups.includes(b.target.id)&&(b.target.style.display="none")});return b.pc+1}},Audioclip:{compile:function(a){a.compileVariable("browser", "audioclip");return!0},run:function(a){return a[a.pc].pc+1}},BLOCKQUOTE:{compile:function(a){a.compileVariable("browser","blockquote",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},BUTTON:{compile:function(a){a.compileVariable("browser","button",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},CANVAS:{compile:function(a){a.compileVariable("browser","canvas",!1,"dom");return!0},run:function(a){return a[a.pc].pc+1}},Click:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c= diff --git a/dist/easycoder.js b/dist/easycoder.js index 8346715..9c30bb3 100644 --- a/dist/easycoder.js +++ b/dist/easycoder.js @@ -2317,7 +2317,7 @@ const EasyCoder_Core = { radius_t }; } - if ([`now`, `today`, `newline`, `break`, `empty`, `uuid`].includes(token)) { + if ([`now`, `today`, `newline`, `backtick`, `break`, `empty`, `uuid`].includes(token)) { compiler.next(); return { domain: `core`, @@ -2750,6 +2750,12 @@ const EasyCoder_Core = { numeric: false, content: `\n` }; + case `backtick`: + return { + type: `constant`, + numeric: false, + content: `\`` + }; case `break`: return { type: `constant`, diff --git a/dist/plugins/iwsy.js b/dist/plugins/iwsy.js index 9936c1c..1a9c2c8 100644 --- a/dist/plugins/iwsy.js +++ b/dist/plugins/iwsy.js @@ -141,6 +141,9 @@ const EasyCoder_IWSY = { }); return 0; case `load`: + if (typeof EasyCoder.iwsyFunctions !== `undefined`) { + throw Error(`IWSY has already been set up`); + } const playerRecord = program.getSymbolRecord(command.player); const player = playerRecord.element[playerRecord.index]; player.innerHTML = ``; diff --git a/iwsy/iwsy.js b/iwsy/iwsy.js index 45db6c5..24726bf 100644 --- a/iwsy/iwsy.js +++ b/iwsy/iwsy.js @@ -162,6 +162,8 @@ const IWSY = (player, text) => { element.style[`background-size`] = `cover`; element.style.border = defaults.border; element.style[`overflow`] = `hidden`; + element.style[`display`] = `none`; + element.style[`opacity`] = `0`; val = defaults.textMarginLeft; if (!isNaN(val)) { val *= w; @@ -228,6 +230,7 @@ const IWSY = (player, text) => { for (const block of script.blocks) { if (block.defaults.name === name) { block.element.style.opacity = showHide ? `1.0` : `0.0`; + block.element.style.display = showHide ? `block` : `none`; break; } } @@ -265,27 +268,41 @@ const IWSY = (player, text) => { for (const block of stepBlocks) { block.element.style.opacity = upDown ? 1.0 : 0.0; + block.element.style.display = upDown ? `block` : `none`; } step.next(); } else { const animSteps = Math.round(step.duration * 25); const continueFlag = step.continue; + for (const block of stepBlocks) + { + block.element.style.display = `block`; + } let animStep = 0; const interval = setInterval(() => { - if (animStep < animSteps) { - const ratio = 0.5 - Math.cos(Math.PI * animStep / animSteps) / 2; - let blocks = stepBlocks.length; - for (const block of stepBlocks) - { - block.element.style.opacity = upDown ? ratio : 1.0 - ratio; + try { + if (animStep < animSteps) { + const ratio = 0.5 - Math.cos(Math.PI * animStep / animSteps) / 2; + for (const block of stepBlocks) + { + block.element.style.opacity = upDown ? ratio : 1.0 - ratio; + } + animStep++; + } else { + for (const block of stepBlocks) + { + block.element.style.opacity = upDown ? 1 : 0; + block.element.style.display = upDown ? `block` :`none`; + } + script.stepping = false; + clearInterval(interval); + if (!continueFlag) { + step.next(); + } } - animStep++; - } else { - script.stepping = false; + } catch(err) { clearInterval(interval); - if (!continueFlag) { - step.next(); - } + throw Error(err); } }, 40); if (continueFlag) { @@ -496,6 +513,11 @@ const IWSY = (player, text) => { } return true; }); + if (typeof block.element === `undefined`) { + throw Error(`Block '${block.defaults.name}' has not been set up`); + } + block.element.style.opacity = 1; + block.element.style.display = `block`; if (script.speed === `scan`) { doTransitionStep(block, target, 1.0); setFinalState(block,target); @@ -674,7 +696,6 @@ const IWSY = (player, text) => { // Show a block const block = blockIndex => { player.innerHTML = ``; - // player.style.background = null; const w = player.getBoundingClientRect().width / 1000; const h = player.getBoundingClientRect().height / 1000; script.blocks.forEach((block, index) => { @@ -769,13 +790,13 @@ const IWSY = (player, text) => { } else { switch (item) { case `left`: - styles.push(`float:left`); + styles.push(`float:left;margin-right:1em`); break; case `center`: styles.push(`margin:0 auto`); break; case `right`: - styles.push(`float:right`); + styles.push(`float:right;margin-left:1em`); break; case `clear`: styles.push(`clear:both`); diff --git a/iwsy/resources/ecs/blocks.txt b/iwsy/resources/ecs/blocks.txt index 68db749..86a3eaa 100644 --- a/iwsy/resources/ecs/blocks.txt +++ b/iwsy/resources/ecs/blocks.txt @@ -105,6 +105,7 @@ Restart: index DeleteBlock to N index Editor to N create Row in Table + set the style of Row to `margin-bottom:0.2em` create Cell in Row set the style of Cell to `width:100%;display:flex` create Link in Cell @@ -241,6 +242,7 @@ Restart: put the index of DeleteBlock into N json delete element N of Blocks set property `blocks` of Presentation to Blocks + put -1 into SelectedBlock go to Restart end stop diff --git a/iwsy/resources/ecs/content.txt b/iwsy/resources/ecs/content.txt index 06fa5b4..4ef3408 100644 --- a/iwsy/resources/ecs/content.txt +++ b/iwsy/resources/ecs/content.txt @@ -75,6 +75,7 @@ Restart: set property `content` of Item to empty json add Item to Items set property `content` of Presentation to Items + put -1 into SelectedItem go to Restart end @@ -102,6 +103,7 @@ Restart: put element N of Items into Item put property `name` of Item into ItemName create Row in Table + set the style of Row to `margin-bottom:0.2em` create Cell in Row set the style of Cell to `width:100%;display:flex` create EditButton in Cell @@ -199,6 +201,7 @@ Restart: put property `content` of Presentation into Items json delete property ItemName of Items set property `content` of Presentation to Items + put -1 into SelectedItem go to Restart end stop diff --git a/iwsy/resources/ecs/fileman.txt b/iwsy/resources/ecs/fileman.txt index ad0527b..0e1d6a1 100644 --- a/iwsy/resources/ecs/fileman.txt +++ b/iwsy/resources/ecs/fileman.txt @@ -4,7 +4,6 @@ import div Container - div Tracer div Panel div FileListing div FileRow @@ -51,9 +50,6 @@ if Mobile set the style of Panel to `background:#ffe` else set the style of Panel to `width:100%;height:100%` - create Tracer in Panel - set attribute `id` of Tracer to `easycoder-tracer` - create Uploader in Panel set the style of Uploader to `width:100%;padding:0.5em 0;font-size:80%;text-align:center` create UploadFile in Uploader @@ -68,7 +64,7 @@ set attribute `max` of UploadProgress to 100 create Buttons in Panel - set the style of Buttons to `display:flex` + set the style of Buttons to `display:flex;margin-bottom:0.5em` create UploadButton in Buttons set the style of UploadButton to `flex:1;width:150px;height:40px;font-family:sans;color:black` set the text of UploadButton to `Upload` @@ -132,10 +128,12 @@ Show: put property `home` of UserRecord into Home put Home cat `/` cat property `id` of UserRecord into Home put `users/` cat Home cat `/images` into Home - put Home into CurrentPath + get CurrentPath from storage as `.filepath` + if CurrentPath is empty put Home into CurrentPath ! Build the list Browser: + put CurrentPath into storage as `.filepath` rest get Content from `ulist/` cat Email cat `/` cat Password cat `/` cat CurrentPath cat `?v=` cat now or begin alert `Failed to list files.` @@ -148,7 +146,7 @@ Browser: set the elements of FileName to FileCount ! Add a row for each file - set the content of Scroller to `` + clear Scroller set Even if CurrentPath is not Home @@ -239,7 +237,6 @@ SelectFile: set attribute `src` of Image to `/resources/` cat FilePath cat `?v=` cat now on click CloseButton go to CloseMedia set the text of URL to `resources/` cat FilePath -! highlight URL on click DeleteButton begin rest post to `udelete/` cat Email cat `/` cat Password cat `/` cat FilePath or diff --git a/iwsy/resources/ecs/help.txt b/iwsy/resources/ecs/help.txt index 6d0bd1e..e83592b 100644 --- a/iwsy/resources/ecs/help.txt +++ b/iwsy/resources/ecs/help.txt @@ -25,6 +25,7 @@ if mobile set Mobile else clear Mobile end + set style `position` of Container to `relative` set style `padding` of Container to `0 1em` set style `overflow-y` of Container to `scroll` @@ -70,23 +71,27 @@ GetPage: stop !------------------------------------------------------------------------------ -! This is the Showndown extension. +! This is the Showdown extension. ! Decorate is called for every occurrence of ~...~ in the topic data Decorate: put the payload of DecoratorCallback into Payload - put the position of `:` in Payload into N - if N is -1 - begin - if Payload is `clear` put `
` into Payload - end + if Payload is `iwsy` put `` into Payload + else if Payload is `clear` put `
` into Payload else begin - put left N of Payload into Function - add 1 to N - put from N of Payload into Data - if Function is `img` gosub to ProcessImage - else if Function is `page` gosub to ProcessPage + put the position of `:` in Payload into N + if N is greater than 0 + begin + put left N of Payload into Function + add 1 to N + put from N of Payload into Data + if Function is `m` + put `` cat Data cat `` into Payload + else if Function is `img` gosub to ProcessImage + else if Function is `page` gosub to ProcessPage + end end set the payload of DecoratorCallback to Payload stop diff --git a/iwsy/resources/ecs/iwsy.txt b/iwsy/resources/ecs/iwsy.txt index d63c3af..1b35212 100644 --- a/iwsy/resources/ecs/iwsy.txt +++ b/iwsy/resources/ecs/iwsy.txt @@ -288,6 +288,7 @@ L2: set the content of NameEditor to empty put empty into CurrentScriptName gosub to CreateNewPresentation + iwsy script Presentation put Presentation into LastSavedState gosub to UpdateCurrentSection end @@ -439,6 +440,9 @@ L2: end else if Action is `block` begin + set style `display` of FileManPanel to `none` + set style `display` of HelpPanel to `none` + set style `display` of Player to `block` put property `block` of Message into N iwsy block N end @@ -484,7 +488,6 @@ CreateNewPresentation: set Item to array set property `blocks` of Presentation to Item set property `content` of Presentation to Item - iwsy load Player Presentation return SetupSteps: @@ -653,14 +656,20 @@ SelectFile: put File into CurrentScriptName if UserRecord rest get Presentation from `/resources/users/` cat UserHome cat `/scripts/` cat File cat `?v=` cat now - else get Presentation from storage as File +! else get Presentation from storage as File + send to StepsModule + send to BlocksModule + send to ContentModule put Presentation into LastSavedState gosub to UpdateCurrentSection gosub to SetStatusGreen set the content of Status to `Presentation '` cat File cat `' loaded` fork to ResetStatus set ShowRun - iwsy load Player Presentation + set style `display` of FileManPanel to `none` + set style `display` of HelpPanel to `none` + set style `display` of Player to `block` + iwsy script Presentation CloseBrowser: set style `background-color` of Overlay to `rgba(0,0,0,0.0)` @@ -694,13 +703,8 @@ DoRunStop: set style `display` of Player to `block` put property `steps` of Presentation into Item if the json count of Item is 0 stop - put element 0 of Item into Item - if property `action` of Item is not `init` - begin - alert `The first step of a presentation must be an 'init' action.` - stop - end set Running + set style `display` of FileManPanel to `none` gosub to ClearStepsButtons set attribute `src` of RunStop to `resources/icon/runstop.png` diff --git a/iwsy/resources/ecs/steps.txt b/iwsy/resources/ecs/steps.txt index 8aae1f6..6fc6f6f 100644 --- a/iwsy/resources/ecs/steps.txt +++ b/iwsy/resources/ecs/steps.txt @@ -89,6 +89,7 @@ Start: if the message is empty go to Restart put the message into Message + gosub to SetupArrays if Message is `save` begin if SelectedStep is not -1 @@ -118,12 +119,14 @@ Start: if property `action` of Message is `step` begin put property `step` of Message into N + if N is not less than the json count of Steps stop index StepButton to N set style `background` of StepButton to `#cfc` stop end Restart: + gosub to SetupArrays set style `display` of Panel to `flex` set style `flex-direction` of Panel to `column` clear StepsPanel @@ -141,16 +144,7 @@ Restart: set attribute `src` of AddStep to `resources/icon/plus.png` on click AddStep go to AddNewStep - put property `steps` of Presentation into Steps - put the json count of Steps into N - set the elements of ShowStep to N - set the elements of StepButton to N - set the elements of Up to N - set the elements of DeleteStep to N - set the elements of TitleInput to N - set the elements of LabelInput to N - set the elements of DurationInput to N - set the elements of Editor to N + gosub to SetupArrays put 0 into N while N is less than the json count of Steps begin @@ -261,6 +255,7 @@ Restart: put the index of DeleteStep into N json delete element N of Steps set property `steps` of Presentation to Steps + put -1 into SelectedStep go to Restart end on click ShowStep @@ -310,6 +305,23 @@ Restart: stop +! Set up all the arrays +SetupArrays: + put property `steps` of Presentation into Steps + put the json count of Steps into N + set the elements of ShowStep to N + set the elements of StepButton to N + set the elements of Up to N + set the elements of DeleteStep to N + set the elements of TitleInput to N + set the elements of LabelInput to N + set the elements of DurationInput to N + set the elements of ContinueSelect to N + set the elements of Editor to N + put property `blocks` of Presentation into Blocks + put property `content` of Presentation into Contents + return + ! Add a new step to the list AddNewStep: gosub to CreateNewStep @@ -364,7 +376,7 @@ EditStep: json add property `name` of Defaults to BlockNames add 1 to N end - put property `content` of Presentation into Contents +! put property `content` of Presentation into Contents set ContentNames to array put 0 into N while N is less than the json count of Contents @@ -792,6 +804,7 @@ EditContinue: set the style of TD to `width:6em` set the content of TD to `Continue:` create TD in TR + index ContinueSelect to SelectedStep create ContinueSelect in TD set the style of ContinueSelect to `width:100%` put property `continue` of CurrentStep into TrueFalse @@ -933,12 +946,19 @@ SaveCurrentStep: end else if Action is `set content` begin - put property `blocks` of CurrentStep into Blocks - if Blocks is empty + set Blocks to array + put 0 into N + while N is less than the elements of BlockSelect begin - set Blocks to array - set property `blocks` of CurrentStep to Blocks + index BlockSelect to N + index ContentSelect to N + set Item to object + set property `block` of Item to BlockSelect + set property `content` of Item to ContentSelect + json add Item to Blocks + add 1 to N end + set property `blocks` of CurrentStep to Blocks end else if Action is `show` begin @@ -978,6 +998,8 @@ SaveCurrentStep: end index DurationInput to SelectedStep set property `duration` of CurrentStep to the text of DurationInput + index ContinueSelect to SelectedStep + set property `continue` of CurrentStep to ContinueSelect end else if Action is `fade down` begin @@ -989,6 +1011,8 @@ SaveCurrentStep: end index DurationInput to SelectedStep set property `duration` of CurrentStep to the text of DurationInput + index ContinueSelect to SelectedStep + set property `continue` of CurrentStep to ContinueSelect end else if Action is `crossfade` begin @@ -996,12 +1020,17 @@ SaveCurrentStep: set property `target` of CurrentStep to TargetSelect index DurationInput to SelectedStep set property `duration` of CurrentStep to the text of DurationInput + index ContinueSelect to SelectedStep + set property `continue` of CurrentStep to ContinueSelect end else if Action is `transition` begin set property `block` of CurrentStep to BlockSelect set property `target` of CurrentStep to TargetSelect + index DurationInput to SelectedStep set property `duration` of CurrentStep to the text of DurationInput + index ContinueSelect to SelectedStep + set property `continue` of CurrentStep to ContinueSelect end else if Action is `goto` begin diff --git a/iwsy/resources/help/action-init.md b/iwsy/resources/help/action-init.md index 0e54813..c94f6f6 100644 --- a/iwsy/resources/help/action-init.md +++ b/iwsy/resources/help/action-init.md @@ -2,7 +2,7 @@ # The `init` action -Every presentation starts with an `init` action, which defines the environment in which the presentation will run. The editor looks like this: +Every ~iwsy~ presentation starts with an `init` action, which defines the environment in which the presentation will run. The editor looks like this: ~img:resources/users/2020/160/1/images/help/editor-init.png~ diff --git a/iwsy/resources/help/contents.md b/iwsy/resources/help/contents.md index 2ccf0ab..89938d5 100644 --- a/iwsy/resources/help/contents.md +++ b/iwsy/resources/help/contents.md @@ -1,6 +1,6 @@ ~page:iwsy:Home~ -# Contents +# ~iwsy~ Help - Contents ~page:quickstart:Quick-start tutorial~ **Beginners start here!** diff --git a/iwsy/resources/help/iwsy.md b/iwsy/resources/help/iwsy.md index 175c6d4..3b2b469 100644 --- a/iwsy/resources/help/iwsy.md +++ b/iwsy/resources/help/iwsy.md @@ -1,16 +1,16 @@ ~page:contents:Contents~ -# I Wanna Show You +# ~iwsy~ - I Wanna Show You -I Wanna Show You (IWSY, pronounced "You-zee" as an approximation to the initials) is an online presentation package. It's built to deliver slideshows that either run under manual control or unattended, but instead of being a PC application that's tied to the desktop, IWSY is entirely browser-based. IWSY presentations can run here in this web app, they can be embedded in other web pages or they can run as independent web pages. +I Wanna Show You (~iwsy~, pronounced "You-zee" as an approximation to the initials) is an online presentation package built to deliver slideshows that either run under manual control or unattended. Instead of being a PC application that's tied to the desktop, ~iwsy~ is entirely browser-based. ~iwsy~ presentations can run here in this web app, they can be embedded in other web pages or they can run as independent web pages. -## Quick-start +## ~page:quickstart:Quick-start~ -These help pages contain everything there is to know about IWSY, but there's a lot to read. Most people just want to get started quickly, so we have a built-in ~page:quickstart:quick-start tutorial~ where you can create a simple presentation - a few slides with text and pictures - in just a few minutes. Once you've completed this first step you'll have a pretty good idea of what IWSY is all about, and the rest of the help pages won't be nearly as intimidating. +These help pages contain everything there is to know about ~iwsy~, but there's a lot to read. Most people just want to get started quickly, so we have a built-in ~page:quickstart:quick-start tutorial~ where you can create a simple presentation - a few slides with text and pictures - in just a few minutes. Once you've completed this first step you'll have a pretty good idea of what ~iwsy~ is all about, and the rest of the help pages won't be nearly as intimidating. ## Feature summary -The basic features of IWSY are: +The basic features of ~iwsy~ are: - A step editor, where you create a set of steps that together form your presentation - A block editor, where you define templates to control where things appear on the screen diff --git a/iwsy/resources/help/project.md b/iwsy/resources/help/project.md index cf91c72..68d91ce 100644 --- a/iwsy/resources/help/project.md +++ b/iwsy/resources/help/project.md @@ -21,10 +21,10 @@ This lists the blocks used in your presentation. A block is a rectangular area o It's common to use the same layout for multiple slides in a presentation, and one of the problems with PowerPoint is how difficult it is to change a layout once set. Sometimes the only way is to edit the numerical coordinates of the text and other blocks on each slide; a time-consuming and error-prone task. -IWSY takes a different approach. You define all the different type of block that will be used, giving each one a name, then use them on as many slides as you like. To make changes you then just need to edit the block definition; all the slides that use it will take on the new size and position. See ~page:addBlock:Adding a block~. +~iwsy~ takes a different approach. You define all the different type of block that will be used, giving each one a name, then use them on as many slides as you like. To make changes you then just need to edit the block definition; all the slides that use it will take on the new size and position. See ~page:addBlock:Adding a block~. ## 3 - Content This lists all the content text items used in your presentation. Each one is named. In the step editor you assign content to blocks by clicking names from a drop-down list. This makes it much easier to see what is where than by having the full text visible at each point. -All content text is written using **_MarkDown_**; a format that is mostly plain text, plus simple markup tags to define headers and other text features. IWSY provides a set of custom MarkDown extensions that define image and other attributes. These help pages are written using the same system. See ~page:addContent:Adding content~. +All content text is written using **_MarkDown_**; a format that is mostly plain text, plus simple markup tags to define headers and other text features. ~iwsy~ provides a set of custom MarkDown extensions that define image and other attributes. These help pages are written using the same system. See ~page:addContent:Adding content~. diff --git a/iwsy/resources/help/quickstart.md b/iwsy/resources/help/quickstart.md index a890de3..ea3fecb 100644 --- a/iwsy/resources/help/quickstart.md +++ b/iwsy/resources/help/quickstart.md @@ -1,10 +1,12 @@ ~page:contents:Contents~ -# Quickstart +# ~iwsy~ Quickstart -This tutorial will quickly take you through all the steps needed to build your first IWSY presentation. Everything you need is here and everything will be explained. +This tutorial will quickly take you through all the steps needed to build your first ~iwsy~ presentation. Everything you need is here and everything will be explained. You don't have to register with ~iwsy~ to try it out, so no messing around with login and registration screens. -We don't need to log into IWSY, so that's some time saved already. The first thing to do is define a _block_. This is an area of the screen having a defined position and size, to contain text and/or images. +Presentations can be simple or they can be highly complex and detailed. The computer can't tell what's in your head so everything has to be spelled out in minute detail. With ~iwsy~, much of the work is in the preparation; deciding what the presentation should look like, its block positions and sizes, what transitions and effects are wanted and so on. Once these things are out of the way the remainder of the work gets a lot simpler. This tutorial covers some of the things you will need if you are to do any more than just present one static slide after another. It's likely you'll need at least an hour to complete this tutorial. + +The first thing to do is define a _block_. This is an area of the screen having a defined position and size, to contain text and/or images. ## Your first block @@ -12,13 +14,17 @@ Click the **Blocks** button over in the right-hand panel, then click the ~img:/r ~img:resources/users/2020/160/1/images/quickstart/newblock.png:100%~ -Most of these default values are fine as they are; they describe a block that occupies the whole window area. Let's just change the 'name' property to `background` and the 'background' property to `url('resources/users/2020/160/1/images/SemoigoDawn.jpg')`. The effect will be to display a full-size image. +Most of these default values are fine as they are; they describe a block that occupies the whole window area. Let's just change the ~m:name~ property to ~m:background~ and the ~m:background~ property to ~m:url('resources/users/2020/160/1/images/SemoigoDawn.jpg')~. The effect will be to display a full-size image. This is what the panel should look like now: + +~img:resources/users/2020/160/1/images/quickstart/first-block.png:100%~ + +Now let's save our work. There's a **Save** button in the editor panel but this just anchors your changes and updates titles etc. You really need to save the entire project. If you are registered it will go to the ~iwsy~ website, but if not it will be saved to your browser's own storage space. Type the name ~m:quickstart~ in the **Script name** box under the main button bar, then click the ~img:/resources/icon/save.png:{width:1em}~ icon in the button bar. It's highly recommended that you click this button regularly so you don't lose your work in the event of something going wrong. -The effect I want to create is for the image to fade up from the white of the screen background. So let's go to to the **Steps** editor and make that happen. But before we do so, let's save our work. Type the name `quickstart` in the **Script name** box under the main button bar, then click the ~img:/resources/icon/save.png:{width:1em}~ icon in the button bar. It's highly recommended that you click this button regularly so you don't lose your work in the event of something going wrong. +The effect I want to create is for the image to fade up from the white of the screen background. So let's go to to the **Steps** editor and make that happen. ## Adding some steps -The `init` step is fine as it is so there's no need to touch it. Click the ~img:/resources/icon/plus.png:{width:1em}~ to add a new step, then click the **New step** button. You should see this: +The ~m:init~ step is fine as it is so there's no need to touch it. Click the ~img:/resources/icon/plus.png:{width:1em}~ to add a new step, then click the **New step** button. You should see this: ~img:resources/users/2020/160/1/images/quickstart/newstep.png:100%~ @@ -26,19 +32,19 @@ Click in the Action box and a drop-down list appears: ~img:resources/users/2020/160/1/images/quickstart/actions.png:100%~ -Choose `set content`. Now set the `name` property to `set up background`. It should now look like this: +Choose ~m:set~ ~m:content~. Now set the ~m:Name~ property to ~m:set up background~, then click **Save**. It should now look like this: ~img:resources/users/2020/160/1/images/quickstart/setup-background.png:100%~ -Click the ~img:/resources/icon/plus.png:{width:1em}~ in the `Blocks` row, then click the empty selector under the `Blocks` title. A drop-down list appears with the name of the block we created earlier: +The ~m:set~ ~m:content~ action lets you set up any number of blocks at the same time, though here we only have one. Click the ~img:/resources/icon/plus.png:{width:1em}~ in the **Blocks** row, then click the empty selector under the **Blocks** title. A drop-down list appears with the name of the block we created earlier: ~img:resources/users/2020/160/1/images/quickstart/select-background-block.png:100%~ -so select that. The block has no text; if it did we'd choose it in the `Content` drop-down list. Click the **Save** button for this step, then click the ~img:/resources/icon/save.png:{width:1em}~ icon in the button bar. +so select that. The block has no text, but if it did we'd choose it in the **Content** drop-down list. Click the **Save** button for this step, then click the ~img:/resources/icon/save.png:{width:1em}~ icon in the button bar. ## Fading up -Now we have a block with a background, let's fade it up. Click ~img:/resources/icon/plus.png:{width:1em}~ again or click the **Add step after** button. In the new step, open the editor, give it the name `fade up background` and select the **fade up** action. It should look like this: +Now we have a block with a background, let's fade it up. Click ~img:/resources/icon/plus.png:{width:1em}~ again or click the **Add step after** button. In the new step, open the editor, give it the name ~m:fade up background~ and select the **fade up** action. It should look like this: ~img:resources/users/2020/160/1/images/quickstart/fade-up-background.png:100%~ @@ -58,4 +64,4 @@ A couple of things to note. One is that as the presentation runs the steps in th Another thing is that you can click the ~img:/resources/icon/binoculars.png:{width:1em}~ icon for any step to see what the presentation looks like at that step. The program invisibly runs the entire presentation up to the step you clicked, then runs that step, giving the button a blue background. -in ~page:quickstart-part2:Part 2~ we'll add some text to the presentation. +in ~page:quickstart2:Part 2~ we'll add some text to the presentation. diff --git a/iwsy/resources/help/quickstart2.md b/iwsy/resources/help/quickstart2.md new file mode 100644 index 0000000..61b9c4d --- /dev/null +++ b/iwsy/resources/help/quickstart2.md @@ -0,0 +1,51 @@ +~page:contents:Contents~ + +# ~iwsy~ Quickstart, part 2 + +In ~page:quickstart:Part 1~ we created a presentation that just fades up a background panel. In this part we'll add some text to it and look at some of the actions available. + +After the background has appeared, let's hold it on the screen for a couple of seconds. There are 2 actions to do with pausing; one is a simple pause and the other also marks a point at which the viewer of the presentation can intervene. We'll add the first of these actions here; the simple pause. + +As before, add a new step at the end of your presentation, then go into its editor and name it ~m:pause 2 seconds~. Click the empty selector next to the **Action** label and select the **pause** option. Apart from the properties common to all fields, this one just has a **Duration**, so type ~m:2~ here then save the step (or click ~img:/resources/icon/save.png:{width:1em}~ as before). + +We're going to bring up some text in the center of the screen, zooming it from a point below the center line. This presentation is to be some slides about Italian villages, so let's create our first content item. Click the **Content** button and then the ~img:/resources/icon/plus.png:{width:1em}~ icon. Open the editor for the new item; it should look like this: + +~img:resources/users/2020/160/1/images/quickstart/new-content.png:100%~ + +Set the name to ~m:Italian villages~ then put the same text into the empty box. As usual, save your work. + +What you've done is create a content item whose name is the same as its content (but it often won't be). When you refer to the name in the **Steps** editor you get the content, so if you use the same content in several places this saves repeating it each time and ensures all the affected slides get changed at once. + +The title will end up in the middle of the screen, but to make it more challenging let's get it to zoom up from a point in the bottom third of the screen. For this we need 2 blocks. One holds the text and defines the starting point of the zoom effect. The other holds the final position of the block after the zoom has finished. + +Click the **Blocks** button and create 2 new blocks (I'm assuming you know how to do that; we covered it in ~page:quickstart:Part 1~). Make the first one look like this: + +~img:resources/users/2020/160/1/images/quickstart/main-title.png:100%~ + +and the other like this: + +~img:resources/users/2020/160/1/images/quickstart/center-title.png:100%~ + +The differences are in the ~m:top~, ~m:height~ and ~m:fontSize~ values. The transition effect you'll be using animates the text as it moves from the first to the second state. It can also change the color of the text as it goes, but we're not doing that here. + +All of the numbers you see are _mils_ - that's thousandths of the width or height of the block's container, normally the window. (Though you can use the **parent** field to make a block a child of another block.) If you are proficient with CSS and would like to use its values you can do so, but the results can vary from one screen to another. The sharp-eyed may also be wondering why the **top** value of the second block is only set at 150; this is because the text renderer displays items as HTML ~m:>p<~ tags with margins and padding set by your browser. There are ways to get round this; see the detailed manual pages. + +You may like to note that in the **Blocks** panel each block has a ~img:resources/icon/binoculars.png:{width:1em}~ icon next to it. If you click one of these you will see where your block is on the screen. + +Now go to the **Steps** panel. The first thing to do is to initialize the **main title** block by adding it to the set of blocks that are initialized in the **set up background** step, so click this step to open its editor: + +~img:resources/users/2020/160/1/images/quickstart/setup-background.png:100%~ + +Click the ~img:resources/icon/plus.png:{width:1em}~ in the **Blocks** row to add a new block. Select the **main title** block and then select **Italian villages** from the **Content** drop-down list. Change the name of the step to **set up blocks** and the result should be: + +~img:resources/users/2020/160/1/images/quickstart/setup-blocks.png:100%~ + +If you prefer, you can add a separate step to initialize each block, but it's usually better to do them all at the same time, in one place. + +The animated text effect is done with a **transition** action. Add a new step to your presentation, call it **zoom up title** and choose the action type **transition**. Set **block** to **main title** and **target** to **center title**: + +~img:resources/users/2020/160/1/images/quickstart/zoom-title.png:100%~ + +Now you can run your presentation again. The background will fade upfirst, then after a couple of seconds the text will zoom up. + +In the ~page:quickstart3:final part of this tutorial~ we'll add the first of what might be a large number of similar slides, each one describing a different Italian village. diff --git a/iwsy/resources/help/quickstart3.md b/iwsy/resources/help/quickstart3.md new file mode 100644 index 0000000..349c9ec --- /dev/null +++ b/iwsy/resources/help/quickstart3.md @@ -0,0 +1,54 @@ +~page:contents:Contents~ + +# ~iwsy~ Quickstart, part 3 + +In ~page:quickstart:Part 1~ we created a presentation that just fades up a background panel and a title. In this part we'll add some text to it and look at some of the actions available. + +Click the **Content** button opposite, then click ~img:resources/icon/plus.png:{width:1em}~ to add a new content item. Set the name to ~m:Manarola~ then paste the following text into the empty box: + +> ~m:CINQUE TERRE – MANAROLA~ +> ~m:Romantic Manarola – a hamlet of Riomaggiore – spills down a ravine to the wild and rugged Cinque Terre coastline. Besides its natural beauty, the village is also famous for its sweet Sciacchetrà wine, celebrated by Gabriele D'Annunzio in one of his amazing poems. Manarola has brightly painted houses, priceless medieval relics and a tiny harbour that features a boat ramp and a swimming hole; to the north, on the way to Corniglia, there's a stunning viewpoint (Punta Bonfiglio) where visitors can enjoy a drink in a bar between the village’s cemetery and the sea. Everywhere is the scent of the lemon trees, thyme, rosemary and Mediterranean maquis; the grapevines – grown on terraces – embrace the village in a tight hug.~ + +~img:resources/users/2020/160/1/images/quickstart/manarola-content.png:100%~ + +As usual, save your work, then click the **Blocks** button. We'll have a 2-column layout with text on one side and a photo on the other. Create 2 new blocks and edit them so they look like this: + +~img:resources/users/2020/160/1/images/quickstart/manarola-text.png:100%~ + +~img:resources/users/2020/160/1/images/quickstart/manarola-photo.png:100%~ + +Now Click the **Steps** button. Click the **set up blocks** step. You need to add the Manarola text and photo blocks so they will be ready when needed. Make the step look like this: + +~img:resources/users/2020/160/1/images/quickstart/setup-all-blocks.png:100%~ + +Add a new step with a 2-second pause, exactly as before, then add 2 more new steps and get them looking like this: + +~img:resources/users/2020/160/1/images/quickstart/fade-down-bg.png:100%~ + +~img:resources/users/2020/160/1/images/quickstart/fade-up-manarola.png:100%~ + +Each of these 2 steps operates on a pair of blocks, and the **continue** in the first step means the following step will run without waiting for this one to finish. In this case it means the 2 fades will run concurrently as a cross-fade. + +Now run your presentation. If everything is correct it should end up like this: + +~img:resources/users/2020/160/1/images/quickstart/final-1.png:100%~ + +This is OK but obviously needs a little tweaking here and there. Start with the **manarola text** block and adjust it a little, adding a text margin on the left (which also adds the same on the right): + +~img:resources/users/2020/160/1/images/quickstart/manarola-text-2.png:100%~ + +Next, go to the **Content**, select the **Manarola** item and put `"## "` - that's 2 # characters and a space - in front of the first word (CINQUE). This will turn the first line into a level 2 header. + +Finally, add the following just in front of the word Romantic, at the start of the text: + +~m:~img:resources/users/2020/160/1/images/quickstart/cinqueterre.jpg:left 50%~~ + +This adds an image into the text, using a custom addition to the MarkDown syntax. Everything between the 2 tildes (~) is treated as a special command. It starts with **img:**, which signifies it's an image tag. The URL of the image then follows, after which is another colon then some special tags, in this case one to force the image to "float" to the left and the other being to give it 50% of its container width. Those who are familar with CSS should have little trouble seeing what's happening here. + +Run the presentation again: + +~img:resources/users/2020/160/1/images/quickstart/final-2.png:100%~ + +Ah, this is a lot better. You may want to adjust the size of the font (in the **manarola text** block) so it fills the screen better, but you'll find you get different results on different browsers. For some reason, Chrome gives smaller text than Firefox does for the same numerical value. + +And with that we arrive at the end of the Quickstart tutorial. We've really only skimmed the surface but you should at least have an idea of what ~iwsy~ is all about and whether you're likely to want to use it. In the ~page:contents:Contents~ you'll find a lot more detail about all aspects of this web app, as well as contact details and an invitation to join the development team if you wish. diff --git a/iwsy/resources/help/users.md b/iwsy/resources/help/users.md index ef87af4..ac08bbf 100644 --- a/iwsy/resources/help/users.md +++ b/iwsy/resources/help/users.md @@ -2,7 +2,7 @@ # User registration and login -IWSY can be used without registering, in which case you are an anonymous user of the system. This is OK if all you want to do is evaluate IWSY, though not all its features will be available to you. Any presentations you create will be saved to your local browser storage area and will be unavailable anywhere else. If you later decide to log in you can transfer these presentations to your own private area on the IWSY website. +~iwsy~ can be used without registering, in which case you are an anonymous user of the system. This is OK if all you want to do is evaluate ~iwsy~, though not all its features will be available to you. Any presentations you create will be saved to your local browser storage area and will be unavailable anywhere else. If you later decide to log in you can transfer these presentations to your own private area on the ~iwsy~ website. ## Registration diff --git a/iwsy/resources/icon/iwsy.png b/iwsy/resources/icon/iwsy.png new file mode 100644 index 0000000000000000000000000000000000000000..4c3406089a6b26338e9f3531480744e9d3b19095 GIT binary patch literal 54734 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

4|OR7cKF1kR|JWz?loYv@Mm`!AmW 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 P7{H^VpebJ~YZ3lmSUAM) literal 0 HcmV?d00001 diff --git a/js/plugins/iwsy.js b/js/plugins/iwsy.js index 9936c1c..1a9c2c8 100644 --- a/js/plugins/iwsy.js +++ b/js/plugins/iwsy.js @@ -141,6 +141,9 @@ const EasyCoder_IWSY = { }); return 0; case `load`: + if (typeof EasyCoder.iwsyFunctions !== `undefined`) { + throw Error(`IWSY has already been set up`); + } const playerRecord = program.getSymbolRecord(command.player); const player = playerRecord.element[playerRecord.index]; player.innerHTML = ``;