dekiscript primer
DESCRIPTION
Introduction to DekiScript, the scripting language in MindTouch DekiTRANSCRIPT
DekiScript Primer
Motivation for DekiScript
• Use Case– Embed dynamic content– Create dynamic layouts– Anybody can use it safely (i.e. not JavaScript)
• Design principles– Not case-sensitive– Simple data types– Native support for XML– Concurrent (e.g. write-once, read-many)
Data Types
Type Value
Nil nil, null, _
Bool true, false
Number (num) 123, -1.23e4
String (str) “hi”, ‘bye’
List [ 1, 2, 3 ]
Map { a: 1, b: 2, c: 3 }
Uri n/a
Xml n/a
Basic Operations
DekiScript Output
{{ nil }}
{{ “1” + “23” }} 24
{{ 1 .. 23 }} 123
{{ [ 1 ] .. [ 2, 3 ] }} [ 1, 2, 3]
{{ { x: 1 } .. { y : 2 } }} { x: 1, y: 2 }
{{ “123” != nil ? “1” : 0 }} 1
{{ nil ?? 123 }} 123
{{ false ?? 123 }} False
{{ #[ 1, 2, 3 ] }} 3
Control Flow Statements
DekiScript
var x = 123;
let x += 1;
if(x) { … } else { … }
foreach(var x in y) { … }
{{ var x = 0; foreach(var y in [ 1, 2, 3, 4 ]) {
if(y % 2 == 0) {let x += y;
}}x;
}}
User object
Properties
user.name User name
user.homepage Homepage object
user.anonymous True if user is not logged in
user.gravatar Gravatar image
user.uri Uri for user homepage
user.api Uri for user web-service
Page object
Properties
page.name Page name
page.title Page title
page.uri Uri for page
page.api Uri for page web-service
page.date Date when page was edited
page.author Last author on page
page.subpages Sub-pages of current page
page.files Files attached to page
page.tags Tags associated with page
Site object
Properties
site.name Name of site
site.hostname Internet hostname
site.api Uri for site web-service
site.uri Uri for site homepage
site.homepage Homepage object
site.feed Uri for site RSS feed
site.pagecount Number of pages on site
site.usercount Number of registered users
Sample: Gravatars
Gravatar for most recent page author
<div style=“float: right;”><center>
{{ page.author.gravatar }}<br/>{{ web.link(user.uri, user.name) }}
</center></div>
Control Flow Attributes
DekiScript Attributes
<div block=“var f = page.files”>…</div>
<ul if=“#f”>…</ul>
<li foreach=“var x in page.files” where=“string.endswith(x.name, ‘.doc’)”>
…</li>
<span init=“var f = page.files” if=“#f”>…</span>
Sample: Gravatars, The Sequel
Gravatars for sub-page authors
<table init=“var s = page.subpages” if=“#s” class=“table”><tr>
<th>Title</th><th>Author</th><th>Gravatar</th>
</tr><tr foreach=“var p in s” class=“{{__count % 2 ? ‘bg2’ : ‘bg1’}}” >
<td>{{ web.link(p.uri, p.title) }}</td><td>{{ web.link(p.author.uri, p.author.name) }}</td><td>{{ p.author.gravatar }}</td>
</tr></table>
Finding Functions
Advanced Constructs
Construct
{{save: … }} Substitute on save
{{edit: …}} Substitute on edit
<p class=“noinclude”> Hide when included
<p class=“includeonly”> Show only when included
<pre|span class=“script”> Contents is script<pre class=“script”function=“syntax.xml($, true)”>
Content transforms
$ Template parameters
__request.args Query request parameters
Sample: Custom Search Form
Embed a form for constrained search
Use this page to only search pages tagged with "extensions":{{ dhtml.inputbox{value: __request.args.q, button: "Search", field: "q", publish: page.uri} }}
{{ if(__request.args.q) { wiki.search(__request.args.q, _, _, "tag:extensions")
} }}
Sample: Notebook
Simple notebook application
<p>{{ wiki.create{ label: "Add a note", template: "NotebookPage", title: date.format(date.now, "yyyy MMMM, d") ..
' (' .. user.name .. ')' } }}</p><ul> <li foreach="var p in page.subpages">
{{web.link(p.uri, p.title)}} <span style="color: rgb(128, 128, 128); font-size: small;”>
({{#p.comments}} comments)</span><br />{{ var h = wiki.page(p.path); h["//*[@class='summary']"] }}
</li></ul>
Questions?
• Slides and samples available at– http://wiki.developer.mindtouch.com/DekiCon
• Discussion forums at– http://forums.developer.mindtouch.com
• Latest news at– http://www.mindtouch.com/blog