{"id":347,"date":"2018-09-23T14:56:20","date_gmt":"2018-09-23T14:56:20","guid":{"rendered":"https:\/\/lab.florianschwarz.net\/PennController\/?post_type=yada_wiki&#038;p=347"},"modified":"2018-11-12T21:28:23","modified_gmt":"2018-11-12T21:28:23","slug":"ontology","status":"publish","type":"yada_wiki","link":"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/ontology\/","title":{"rendered":"Ontology"},"content":{"rendered":"<p><div class='content-column three_fourth'><menuToc><\/menuToc>\n<h1 id=\"elements\">Elements<\/h1>\n<p>The basic units of a PennController trial are <strong>elements<\/strong>: every command relates to an element.<\/p>\n<p>There are no clear-cut <em>types<\/em> of elements: one element can have <strong>visual<\/strong> content (e.g., <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/text-element\/\" class=\"wikilink-published\">Text<\/a>, <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/image-element\/\" class=\"wikilink-published\">Image<\/a> elements) or <strong>audio<\/strong> content (e.g., <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/audio-element\/\" class=\"wikilink-published\">Audio<\/a> elements), it can stand as an <strong>interface<\/strong> to collect responses (e.g., <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/key-element\/\" class=\"wikilink-published\">Key<\/a> elements). More often than not, an element shares several of those properties: for instance, <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/scale-element\/\" class=\"wikilink-published\">Scale<\/a> elements both show buttons and collect scores, and <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/voicerecorder-element\/\" class=\"wikilink-published\">VoiceRecorder<\/a> elements show buttons to record audio and play back the recordings to be collected.<\/p>\n<p>There are two ways to manipulate elements: either by <strong>creating a new element<\/strong>, or by <strong>referring back to an existing element<\/strong>. In this documentation, you will see scripts with blocks of lines separated by commas: the first lines of the blocks always start with <code>new<\/code> or <code>get<\/code>. All the lines below the first one that start with <code>.<\/code> relate to the element in the first line. To give an illustration, consider the bit of script below: its first line creates an <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/audio-element\/\" class=\"wikilink-published\">Audio<\/a> element, its second line starts playing it, and its third line tells the script to wait until the end of the playback before proceeding (more about this point later).<\/p>\n<p>[js try=&#8221;true&#8221;]newAudio(&#8220;myAudio&#8221;, &#8220;test.mp3&#8221;)<br \/>\n    .play()<br \/>\n    .wait()<br \/>\n[\/js]<\/p>\n<h1 id=\"commands\">Commands<\/h1>\n<p>In the code above, <code>play<\/code> and <code>wait<\/code> are <strong>commands<\/strong> that relate to the newly created element named <em>myAudio<\/em>. As just mentioned, commands start with <code>.<\/code> and refer to an element (with <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/clear-command\/\" class=\"wikilink-published\">Clear command<\/a> <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/end-command\/\" class=\"wikilink-published\">exceptions<\/a> as of PennConroller beta 0.2). The list of commands for a given element are <strong>specific to its category<\/strong>. For instance, there is no command <code>wait<\/code> for <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/text-element\/\" class=\"wikilink-published\">Text<\/a> elements. There is a command <code>wait<\/code> both for <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/audio-element\/\" class=\"wikilink-published\">Audio<\/a> and for <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/key-element\/\" class=\"wikilink-published\">Key<\/a> elements, though its meaning is element-dependent: in the case of Audio elements it means &#8220;<em>wait until the audio has ended<\/em>,&#8221; whereas in the case of Key elements it means &#8220;<em>wait until the key has been pressed<\/em>.&#8221; That being said, you can find a list of commands shared by all elements on the page <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/standard-element-commands\/\" class=\"wikilink-published\">Standard Element Commands<\/a> (note that some of those commands simply have no effect on some elements&#8212;e.g., aesthetic commands have no effect on Key elements).<\/p>\n<h2 id=\"flowofevaluationandexecution\">Flow of evaluation and execution<\/h2>\n<p>To design your <em>PennController<\/em> trials, you write scripts that consist of series of <strong>blocks<\/strong> of commands like the one given above as an illustration, separated by commas and contained within the parentheses of <code>PennController( )<\/code>. When a trial is run, it starts by reading the very first commands of the very first block. Let us walk through a basic example:<\/p>\n<p>[js try=&#8221;true&#8221;]newButton(&#8220;myButton&#8221;, &#8220;Click&#8221;)<br \/>\n    .print()<br \/>\n,<br \/>\nnewAudio(&#8220;myAudio&#8221;, &#8220;test.mp3&#8221;)<br \/>\n    .play()<br \/>\n    .wait()<br \/>\n    .print()<br \/>\n,<br \/>\ngetButton(&#8220;myButton&#8221;)<br \/>\n    .wait()<br \/>\n[\/js]<\/p>\n<p>The script starts by reading the first block, which itself starts with <code>newButton(\"myButton\", \"Click\")<\/code>: the script creates a <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/button-element\/\" class=\"wikilink-published\">Button<\/a> element named <em>myButton<\/em>, which will read <em>Click<\/em> when displayed. This block will be about this Button element. <strong>Immediately <em>after<\/em><\/strong> creating the element, the script reads what comes next, <code>.print()<\/code>, and therefore adds the button to the screen. So far, the screen only contains a button that says <em>Click<\/em>. <strong>Immediately <em>after<\/em><\/strong> adding the button to the screen, the script encounters a comma, and it starts reading the second block. Note that the script keeps on reading: it does not wait for a click on the button, as it was not commanded to do so. It now reads <code>newAudio(\"myAudio\", \"test.mp3\")<\/code> and therefore creates a new Audio element named <em>myAudio<\/em>, using the file <em>test.mp3<\/em>: this block will be about this Audio element. <strong>Immediately <em>after<\/em><\/strong> creating the element, the script reads what comes next, <code>.play()<\/code>, and therefore starts playing the audio. <strong>Immediately <em>after<\/em><\/strong> <em>starting<\/em> playing the audio, the script reads <code>.wait()<\/code> and therefore knows that it has to wait until the audio has ended playing before continuing reading. While the audio is playing, the <em>Click<\/em> button is still displayed on the screen, but clicks have no effect (this is just a button that says <em>Click<\/em>, nothing more). <strong>Then, <em>after the audio has ended playing<\/em><\/strong> (and regardless of whether the button was clicked), the script continues and reads <code>.print()<\/code>, which means (in the context of an Audio element) it should add buttons to the page to provide control over the playback of the audio. So far, the script has already added a button to the page, so the controls appear below that button. <strong>Immediately <em>after<\/em><\/strong> adding those controls, the script encounters a comma and starts reading the third block, which starts with <code>getButton(\"myButton\")<\/code>: the third block will be about the Button element that was created in the first block. The script <strong>immediately<\/strong> reads <code>.wait()<\/code> and therefore knows that is has to wait until the button is clicked. So far, the page displays a button that says <em>Click<\/em>, above controls for the audio. Until the <em>Click<\/em> button is clicked, the controls can be used to replay the audio, pause it, change its volume, &#8230;: the script is <em>on hold<\/em> until the <em>Click<\/em> button is clicked. <strong>Immediately <em>after<\/em><\/strong> the <em>Click<\/em> button is clicked, the script resumes and reaches the end: this is the end of the trial, the page is refreshed and the experiment proceeds to the next screen.<\/p>\n<p><strong>PLEASE NOTE<\/strong> that this walk-through did not talk about <em>lines<\/em> or about <em>spaces<\/em>, for the simple reason that <strong>you could remove <em>all<\/em> the linebreaks and <em>all<\/em> the spaces<\/strong> from the script above and it would still work the same: it only cares about <code>.<\/code> and <code>,<\/code> to determine what bits of text to evaluate (and, to some extent, <code>(<\/code> and <code>)<\/code>). The linebreaks and spaces are there for us humans: without them, the script becomes much less readable (to us). By convention, the scripts in this documentation follow spacing and linebreak conventions thought to make things clearer, but do not be surprised to find scripts that do not follow the same conventions, and feel free to adapt your scripts to your own style.<\/p>\n<h2 id=\"typesofcommands\">Types of commands<\/h2>\n<p>Commands are divided in <strong>three types<\/strong>, and you will accordingly find them listed in types in this documentation.<\/p>\n<h3 id=\"actions\">Actions<\/h3>\n<p><strong>Action<\/strong> commands are usually active verbs, like <code>play<\/code> or <code>wait<\/code> above. Actions usually <strong>do<\/strong> at least one of three things: they add visual content to page (e.g., <code>print<\/code>), they trigger an event (e.g., <code>play<\/code>) or they pause the script (<code>wait<\/code>). Other commands can have similar effects but are still better conceived of as <em>settings<\/em> rather than actions (see below).<\/p>\n<p>Actions tend to be element-specific and to have element-depdendent meanings (though see <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/standard-element-commands\/\" class=\"wikilink-published\">Standard Element Commands<\/a>). They also tend to correspond to what you would intuitively <strong>use<\/strong> the elements for: <code>print<\/code>ing some text, <code>play<\/code>ing audios, <code>start<\/code>ing a <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/timer-element\/\" class=\"wikilink-published\">timer<\/a>&#8230;<\/p>\n<h3 id=\"settings\">Settings<\/h3>\n<p><em>Setting<\/em> commands are always preceded with <code>.settings<\/code>, even when they come after another <em>setting<\/em> command in the block:<\/p>\n<p>[js try=&#8221;true&#8221;]newText(&#8220;myText&#8221;, &#8220;Hello world.&#8221;)<br \/>\n    .settings.color(&#8220;green&#8221;)<br \/>\n    .settings.bold()<br \/>\n    .settings.italic()<br \/>\n    .print()<br \/>\n[\/js]<\/p>\n<p>In the code above, you <strong>cannot<\/strong> replace <code>.settings.bold()<\/code> with simply <code>.bold()<\/code> or <code>.settings.italic()<\/code> with simply <code>.italic()<\/code> (even if you cleverly add spaces\/tabs to horizontally align them with <code>.color()<\/code> in the second line&#8212;see <em>PLEASE NOTE<\/em> at the end of the section <em>Flow of evaluation and execution<\/em>).<\/p>\n<p>Settings are usually <strong>not<\/strong> active verbs and can be <strong>participles<\/strong>, <strong>adjectives<\/strong> or <strong>nouns<\/strong> (though there are some exceptions). They tend to affect <em>attributes<\/em> or <em>properties<\/em> of elements, such as aesthetics (as illustrated above) but they can also act on <em>future behaviors<\/em> of the elements: for instance, using <code>.settings.once()<\/code> on a Button element will tell it that it should become disabled after (if) it is clicked. Another way of thinking about this is in terms of <em>what happens when<\/em>, or in terms of <em>listening to events<\/em>.<\/p>\n<p>Even though settings tend to not have the punctuality of actions, they still are evaluated and executed in sequence (see the section <em>Flow of evaluation and execution<\/em> above). In the code below, the text of the first button does not appear boldfaced until it is clicked, because <code>wait<\/code> is executed before <code>.settings.bold<\/code> is evaluated. By contrast, the text of the second button appears boldfaced from the moment it is displayed on, because it is evaluated and executed before <code>print<\/code> gets evaluated.<\/p>\n<p>[js try=&#8221;true&#8221;]newButton(&#8220;first&#8221;, &#8220;Click me!&#8221;)<br \/>\n    .print()<br \/>\n    .wait()<br \/>\n    .settings.bold()<br \/>\n,<br \/>\nnewButton(&#8220;second&#8221;, &#8220;Button 2&#8221;)<br \/>\n    .settings.bold()<br \/>\n    .print()<br \/>\n    .wait()<br \/>\n[\/js]<\/p>\n<h3 id=\"tests\">Tests<\/h3>\n<p><em>Test<\/em> commands are always preceded with <code>.test<\/code> and are of a very different nature from <em>actions<\/em> and <em>settings<\/em>. They can mostly be used in two contexts: as a new block to define <strong>conditional branching<\/strong>, or within certain commands (such as <code>wait<\/code>) to define <strong>conditions of success<\/strong>.<\/p>\n<p>You can always associate a block of command(s) to be evaluated and executed upon <strong>success<\/strong> of the test, and a block of command(s) to be evaluated and executed upon <strong>failure<\/strong> of the test.<\/p>\n<p>[js try=&#8221;true&#8221;]newAudio(&#8220;yarrel&#8221;, &#8220;test.mp3&#8221;)<br \/>\n    .play()<br \/>\n    .wait()<br \/>\n,<br \/>\nnewTextInput(&#8220;heard&#8221;, &#8220;&#8221;)<br \/>\n    .settings.before( newText(&#8220;left&#8221;, &#8220;It said &#8220;) )<br \/>\n    .print()<br \/>\n    .wait()<br \/>\n,<br \/>\ngetTextInput(&#8220;heard&#8221;)<br \/>\n    .test.text( &#8220;laurel&#8221; )<br \/>\n    .success(<br \/>\n        newText(&#8220;laurel&#8221;, &#8220;Yes, you are right, any other response would be wrong.&#8221;)<br \/>\n            .print()<br \/>\n    )<br \/>\n    .failure(<br \/>\n        newText(&#8220;yanny&#8221;, &#8220;You should pay more attention next time&#8230;&#8221;)<br \/>\n            .print()<br \/>\n    )<br \/>\n[\/js]<\/p>\n<p>This script plays the audio file <em>test.mp3<\/em> and, after it is done playing it, invites the participant to enter what they heard. If what they have typed in the input box <em>when they press enter\/return<\/em> is <em>laurel<\/em>, what is inside the parentheses of <code>success<\/code> is evaluated and executed: a text appears below the input box saying <em>Yes, your are right, any other response would be wrong<\/em>. If the content of the input box is different from <em>laurel<\/em>, what is inside the parentheses of <code>failure<\/code> is evaluated and executed: a text appears below the input box saying <em>You should pay more attention next time<\/em>.<\/p>\n<p><strong>Note that tests do not pause the flow of evaluation and execution.<\/strong> That is, if you removed the <code>wait<\/code> command from the second block above, the command <code>.test.text<\/code> would then be evaluated and executed <strong>immediately after<\/strong> the input is added to the page, and therefore the content of <code>success<\/code> would never be evaluated and executed, because the text of the input box is empty (and so, different from <em>laurel<\/em>) when it is added to the page. Instead, the content of <code>failure<\/code> would automatically be evaluated and executed.<\/p>\n<p>To know what happens when you use a test command <strong>within another command<\/strong>, read the documentation about that other command (only <code>wait<\/code> commands accept tests as of PennController 1.1).<\/p>\n<h3 id=\"composition\">testNot, and, or<\/h3>\n<p>Test commands in PennController are compositional to a certain extent. You can express the negation of any test by replacing <code>test<\/code> by <code>testNot<\/code>. The code below, where we replaced <code>test<\/code> with <code>testNot<\/code> and switched <code>success<\/code> and <code>failure<\/code>, has exactly the same effect as the code above:<\/p>\n<p>[js try=&#8221;true&#8221;]newAudio(&#8220;yarrel&#8221;, &#8220;test.mp3&#8221;)<br \/>\n    .play()<br \/>\n    .wait()<br \/>\n,<br \/>\nnewTextInput(&#8220;heard&#8221;, &#8220;&#8221;)<br \/>\n    .settings.before( newText(&#8220;left&#8221;, &#8220;It said &#8220;) )<br \/>\n    .print()<br \/>\n    .wait()<br \/>\n,<br \/>\ngetTextInput(&#8220;heard&#8221;)<br \/>\n    .testNot.text( &#8220;laurel&#8221; )<br \/>\n    .success(<br \/>\n        newText(&#8220;yanny&#8221;, &#8220;You should pay more attention next time&#8230;&#8221;)<br \/>\n            .print()<br \/>\n    )<br \/>\n    .failure(<br \/>\n        newText(&#8220;laurel&#8221;, &#8220;Yes, you are right, any other response would be wrong.&#8221;)<br \/>\n            .print()<br \/>\n    )<br \/>\n[\/js]<\/p>\n<p>Since PennController 1.1, you can test whether several tests are successful using the special keyword <code>and<\/code>, for instance:<\/p>\n<p>[js try=&#8221;true&#8221;]newAudio(&#8220;yarrel&#8221;, &#8220;test.mp3&#8221;)<br \/>\n    .play()<br \/>\n    .wait()<br \/>\n,<br \/>\nnewTextInput(&#8220;heard&#8221;, &#8220;&#8221;)<br \/>\n    .settings.before( newText(&#8220;left&#8221;, &#8220;It said &#8220;) )<br \/>\n    .print()<br \/>\n    .wait()<br \/>\n,<br \/>\ngetTextInput(&#8220;heard&#8221;)<br \/>\n    .testNot.text( &#8220;laurel&#8221; )<br \/>\n    .and( getTextInput(&#8220;heard&#8221;).testNot.text( &#8220;yanny&#8221; ) )<br \/>\n    .success(                                              \/\/ Success means &#8220;neither laurel nor yanny&#8221;<br \/>\n        newText(&#8220;other&#8221;, &#8220;You follow the Middle Path.&#8221;)<br \/>\n            .print()<br \/>\n    )<br \/>\n    .failure(                                              \/\/ Failure means &#8220;either laurel or yanny&#8221;<br \/>\n        newText(&#8220;laurelOrYanny&#8221;, &#8220;You come from a bimodal distribution.&#8221;)<br \/>\n            .print()<br \/>\n    )<br \/>\n[\/js]<\/p>\n<p>Besides <code>and<\/code>, PennController 1.1 introduces the keyword <code>or<\/code>. The code above can therefore be reformulated as:<\/p>\n<p>[js try=&#8221;true&#8221;]newAudio(&#8220;yarrel&#8221;, &#8220;test.mp3&#8221;)<br \/>\n    .play()<br \/>\n    .wait()<br \/>\n,<br \/>\nnewTextInput(&#8220;heard&#8221;, &#8220;&#8221;)<br \/>\n    .settings.before( newText(&#8220;left&#8221;, &#8220;It said &#8220;) )<br \/>\n    .print()<br \/>\n    .wait()<br \/>\n,<br \/>\ngetTextInput(&#8220;heard&#8221;)<br \/>\n    .test.text( &#8220;laurel&#8221; )<br \/>\n    .or( getTextInput(&#8220;heard&#8221;).test.text( &#8220;yanny&#8221; ) )<br \/>\n    .success(                                              \/\/ Success means &#8220;either laurel or yanny&#8221;<br \/>\n        newText(&#8220;laurelOrYanny&#8221;, &#8220;You come from a bimodal distribution.&#8221;)<br \/>\n            .print()<br \/>\n    )<br \/>\n    .failure(                                              \/\/ Failure means &#8220;neither laurel nor yanny&#8221;<br \/>\n        newText(&#8220;other&#8221;, &#8220;You follow the Middle Path.&#8221;)<br \/>\n            .print()<br \/>\n    )<br \/>\n[\/js]<\/p>\n<p><strong>Note that series of <code>and<\/code> and <code>or<\/code>&#8216;s<\/strong> are evaluated linearly. As a result, a test of the form <code>A and B or C and D<\/code> will be successful only if <code>D<\/code> is successful, and either <code>C<\/code> or <code>A and B<\/code> is successful, i.e. <code>( (A and B) or C ) and D<\/code>. If you want to express <code>(A and B) or (C and D)<\/code> you should call the last <code>and<\/code> on <code>C<\/code> itself:<\/p>\n<p>[js try=&#8221;true&#8221;]newAudio(&#8220;yarrel&#8221;, &#8220;test.mp3&#8221;)<br \/>\n    .print()<br \/>\n,<br \/>\nnewTextInput(&#8220;heard&#8221;, &#8220;&#8221;)<br \/>\n    .settings.before( newText(&#8220;left&#8221;, &#8220;It said &#8220;) )<br \/>\n    .print()<br \/>\n    .wait()<br \/>\n,<br \/>\ngetAudio(&#8220;yarrel&#8221;)<br \/>\n    .test.hasPlayed()<br \/>\n    .and( getTextInput(&#8220;heard&#8221;).testNot.text(&#8220;&#8221;) )<br \/>\n    .or (<br \/>\n        getAudio(&#8220;yarrel&#8221;)<br \/>\n            .testNot.hasPlayed()<br \/>\n            .and( getTextInput(&#8220;heard&#8221;).test.text(&#8220;&#8221;) )<br \/>\n    )<br \/>\n    .success(                                              \/\/ (Played &#038; input) or (neither played nor input)<br \/>\n        newText(&#8220;consistent&#8221;, &#8220;You are a reasonable person.&#8221;)<br \/>\n            .print()<br \/>\n    )<br \/>\n    .failure(                                              \/\/ Played but no input, or input bot not played<br \/>\n        newText(&#8220;inconsistent&#8221;, &#8220;You missed one step.&#8221;)<br \/>\n            .print()<br \/>\n    )<br \/>\n[\/js]<\/p>\n<p>The code above prints &#8220;You are a reasonable person.&#8221; after a press on return in the text input box in two conditions: audio has not been played back and the box is empty, or the audio has been played and the input box is not empty. In all other conditions, it prints &#8220;You missed one step.&#8221;<\/p>\n<h1 id=\"defaults\">Defaults<\/h1>\n<p>This page starts with a lie: some commands actually do <em>not<\/em> relate to <em>an<\/em> element. First, there are two <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/clear-command\/\" class=\"wikilink-published\">special<\/a> <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/end-command\/\" class=\"wikilink-published\">cases<\/a>. But what is more, there are <strong>default<\/strong> commands. Say your trial contains lots of italic text lines: you need to create as many Text elements (though you may also consider using an <a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/html-element\/\" class=\"wikilink-published\">Html<\/a> element). But it could quickly feel repetitive to call <code>print<\/code> on every single Text element that you create. To spare you such unnecessary efforts, you can use defaults, like this:<\/p>\n<p>[js]defaultText<br \/>\n    .settings.italic()<br \/>\n    .print()<br \/>\n[\/js]<\/p>\n<p>Now whenever you add a line starting with <code>newText<\/code> to your script, it is as if you actually added two lines right below it: a first line saying <code>.settings.italic()<\/code> and a second line saying <code>.print()<\/code>.<\/p>\n<p>As another illustration, note that this:<\/p>\n<p>[js try=&#8221;true&#8221;]defaultButton<br \/>\n    .print()<br \/>\n    .wait()<br \/>\n,<br \/>\nnewButton(&#8220;first&#8221;, &#8220;Button 1&#8221;)<br \/>\n    .remove()<br \/>\n,<br \/>\nnewButton(&#8220;second&#8221;, &#8220;Button 2&#8221;)<br \/>\n[\/js]<\/p>\n<p>is equivalent to:<\/p>\n<p>[js try=&#8221;true&#8221;]newButton(&#8220;first&#8221;, &#8220;Button 1&#8221;)<br \/>\n    .print()<br \/>\n    .wait()<br \/>\n    .remove()<br \/>\n,<br \/>\nnewButton(&#8220;second&#8221;, &#8220;Button 2&#8221;)<br \/>\n    .print()<br \/>\n    .wait()<br \/>\n[\/js]<\/p>\n<p>You use blocks starting with <code>default<\/code> the same way that you would use blocks starting with <code>new<\/code> or <code>get<\/code>. Elements created before a <code>default<\/code> is encountered are not affected by it (see the section <em>Flow of evaluation and execution<\/em> above to understand why).<\/p><\/div><br \/>\n<div class='content-column one_fourth last_column'><h3>Index<\/h3>\n<ul>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/installation\/\" class=\"wikilink-published\">Installing PennController<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/ontology\/\" class=\"wikilink-published\">Ontology<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/aesthetics\/\" class=\"wikilink-published\">Aesthetics<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/preloading-resources\/\" class=\"wikilink-published\">Preloading resources<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/zipped-resources\/\" class=\"wikilink-published\">ZIPped resources<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/spreadsheet-template\/\" class=\"wikilink-published\">Spreadsheet (CSV)<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/canvas-design-tool\/\" class=\"wikilink-published\">Canvas creation<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/recording-and-collecting-audio-samples\/\" class=\"wikilink-published\">Setup for audio recordings collection<\/a><\/li>\n<hr>\n<li>Commands by <strong>element categories<\/strong>\n<ul>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/standard-element-commands\/\" class=\"wikilink-published\">Standard Element Commands<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/audio-element\/\" class=\"wikilink-published\">Audio element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/button-element\/\" class=\"wikilink-published\">Button element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/298\/\" class=\"wikilink-published\">Canvas element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/function-element\/\" class=\"wikilink-published\">Function element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/html-element\/\" class=\"wikilink-published\">Html element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/image-element\/\" class=\"wikilink-published\">Image element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/key-element\/\" class=\"wikilink-published\">Key element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/scale-element\/\" class=\"wikilink-published\">Scale element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/324\/\" class=\"wikilink-published\">Selector element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/text-element\/\" class=\"wikilink-published\">Text element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/textinput-element\/\" class=\"wikilink-published\">TextInput element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/tooltip-element\/\" class=\"wikilink-published\">Tooltip element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/timer-element\/\" class=\"wikilink-published\">Timer element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/var-element\/\" class=\"wikilink-published\">Var element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/video-element\/\" class=\"wikilink-published\">Video element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/voicerecorder-element\/\" class=\"wikilink-published\">VoiceRecorder element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/youtube-element\/\" class=\"wikilink-published\">Youtube element<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/clear-command\/\" class=\"wikilink-published\">Special clear command<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/end-command\/\" class=\"wikilink-published\">Special end command<\/a><\/li>\n<\/ul>\n<\/li>\n<hr>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/global-commands\/\" class=\"wikilink-published\">Global PennController Commands<\/a>\n<ul>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller\/\" class=\"wikilink-published\">PennController<\/a>\n<ul>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-label\/\" class=\"wikilink-published\">.label<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-log\/\" class=\"wikilink-published\">.log<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-logappend\/\" class=\"wikilink-published\">.logAppend<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-nofooter\/\" class=\"wikilink-published\">.noFooter<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-noheader\/\" class=\"wikilink-published\">.noHeader<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-setoption\/\" class=\"wikilink-published\">.setOption<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-addhost\/\" class=\"wikilink-published\">PennController.AddHost<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-addtable\/\" class=\"wikilink-published\">PennController.AddTable<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-checkpreloaded\/\" class=\"wikilink-published\">PennController.CheckPreloaded<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-downloadvoicebutton\/\" class=\"wikilink-published\">PennController.DownloadVoiceButton<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-feeditems\/\" class=\"wikilink-published\">PennController.FeedItems<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-footer\/\" class=\"wikilink-published\">PennController.Footer<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-gettable\/\" class=\"wikilink-published\">PennController.GetTable<\/a>\n<ul>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-gettable-filter\/\" class=\"wikilink-published\">.filter<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-gettable-setgroupcolumn\/\" class=\"wikilink-published\">.setGroupColumn<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-geturlparameter\/\" class=\"wikilink-published\">PennController.GetURLParameter<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-header\/\" class=\"wikilink-published\">PennController.Header<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-initiaterecorder\/\" class=\"wikilink-published\">PennController.InitiateRecorder<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-preloadzip\/\" class=\"wikilink-published\">PennController.PreloadZip<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-resetprefix\/\" class=\"wikilink-published\">PennController.ResetPrefix<\/a><\/li>\n<li><a href=\"https:\/\/lab.florianschwarz.net\/PennController\/wiki\/penncontroller-template\/\" class=\"wikilink-published\">PennController.Template<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div><div class='clear_column'><\/div><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"wiki_cats":[5],"wiki_tags":[],"class_list":["post-347","yada_wiki","type-yada_wiki","status-publish","hentry","wiki_cats-documentation"],"_links":{"self":[{"href":"https:\/\/lab.florianschwarz.net\/PennController\/wp-json\/wp\/v2\/yada_wiki\/347","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lab.florianschwarz.net\/PennController\/wp-json\/wp\/v2\/yada_wiki"}],"about":[{"href":"https:\/\/lab.florianschwarz.net\/PennController\/wp-json\/wp\/v2\/types\/yada_wiki"}],"author":[{"embeddable":true,"href":"https:\/\/lab.florianschwarz.net\/PennController\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/lab.florianschwarz.net\/PennController\/wp-json\/wp\/v2\/comments?post=347"}],"version-history":[{"count":5,"href":"https:\/\/lab.florianschwarz.net\/PennController\/wp-json\/wp\/v2\/yada_wiki\/347\/revisions"}],"predecessor-version":[{"id":1847,"href":"https:\/\/lab.florianschwarz.net\/PennController\/wp-json\/wp\/v2\/yada_wiki\/347\/revisions\/1847"}],"wp:attachment":[{"href":"https:\/\/lab.florianschwarz.net\/PennController\/wp-json\/wp\/v2\/media?parent=347"}],"wp:term":[{"taxonomy":"wiki_cats","embeddable":true,"href":"https:\/\/lab.florianschwarz.net\/PennController\/wp-json\/wp\/v2\/wiki_cats?post=347"},{"taxonomy":"wiki_tags","embeddable":true,"href":"https:\/\/lab.florianschwarz.net\/PennController\/wp-json\/wp\/v2\/wiki_tags?post=347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}