diff --git a/ast/ast.ts b/ast/ast.ts index c62a5be9..276cbce5 100644 --- a/ast/ast.ts +++ b/ast/ast.ts @@ -277,6 +277,8 @@ module TDev.AST { if (n.tokens[i].matches(d)) return true; return false } + + public docText():string { return null } } export class Comment @@ -295,6 +297,7 @@ module TDev.AST { tw.comment(this.text); } public forSearch() { return this.text.toLowerCase(); } + public docText() { return this.text } } export class FieldComment @@ -889,6 +892,30 @@ module TDev.AST { } public forSearch() { return (this.isVarDef() ? "var " : "") + this.expr.forSearch(); } + + public docText():string + { + var prop = this.expr.parsed ? this.expr.parsed.getCalledProperty() : null + if (!prop || prop.getName() != "docs render") return null + var c = this.expr.parsed + var arg0 = c.args[0].getCalledProperty() + if (arg0 instanceof GlobalDef) { + var url = arg0.url + } + if (!url) return null + if (arg0.getKind() == api.core.Picture) { + var h = c.args[1].getNumberLiteral() || 12 + var cap = c.args[2].getStringLiteral() || "" + return "{pic:" + arg0.getName() + ":" + h + "x" + h + (cap ? ":" + cap : "") + "}" + } + + if (arg0.getKind().getName() == "Document") { + var cap = c.args[1].getStringLiteral() || arg0.getName() + return "[" + cap + "] (" + url + ")" + } + + return null + } } export class InlineActionBase @@ -1665,10 +1692,9 @@ module TDev.AST { if (this.body) for (var i = 0; i < this.body.stmts.length; ++i) { - var s = this.body.stmts[i] - if (s instanceof Comment) { - var t = (s).text - if (/{action:ignoreReturn}/i.test(t)) { + var s = this.body.stmts[i].docText() + if (s != null) { + if (/{action:ignoreReturn}/i.test(s)) { flags |= PropertyFlags.IgnoreReturnValue } } else { @@ -3062,6 +3088,12 @@ module TDev.AST { return this.getLiteral() return null } + public getNumberLiteral():number + { + if (typeof this.getLiteral() == "number") + return this.getLiteral() + return null + } public getThing():Decl { return null; } public getLocalDef():LocalDef { var r = this.getThing() diff --git a/ast/compiler.ts b/ast/compiler.ts index 20165f09..3a970e4a 100644 --- a/ast/compiler.ts +++ b/ast/compiler.ts @@ -1056,10 +1056,10 @@ module TDev.AST if (this.options.usedProperties.hasOwnProperty("appconsumerenderedcomments")) { var par = (c.parent).stmts var idx = par.indexOf(c) - if (par[idx - 1] instanceof Comment) + if (par[idx - 1] && par[idx - 1].docText() != null) return []; // not first var end = idx - while (par[end] instanceof Comment) + while (par[end] && par[end].docText() != null) end++ var d = Step.renderDocs(par.slice(idx, end)) return [new JsExprStmt(JsCall.direct("s.rt.saveComment", [new JsLiteral(this.stringLiteral(d))]))] diff --git a/ast/help.ts b/ast/help.ts index 0a0bc8ec..7f9d0f6a 100644 --- a/ast/help.ts +++ b/ast/help.ts @@ -697,8 +697,8 @@ module TDev { if (m) { var url = m[2]; var artId = m[3]; - var width = parseFloat(m[4] || "12"); - var height = parseFloat(m[5] || "12"); + var width = parseFloat(m[5] || "12"); + var height = parseFloat(m[6] || "12"); if (width > 30) { height = 30 / width * height; width = 30; @@ -707,7 +707,7 @@ module TDev { width = 20 / height * width; height = 20; } - var caption = m[6]; + var caption = m[7]; if (artId && !url) { artId = MdComments.findArtId(artId); url = Cloud.artUrl(artId); @@ -1175,7 +1175,7 @@ module TDev { { function isEmptyComment(s:AST.Stmt) { - return s instanceof AST.Comment && !(s).text; + return s.docText() == "" } this.init(); @@ -1184,40 +1184,34 @@ module TDev { var currBox = null; for (var i = 0; i < stmts.length; ) { - if (stmts[i] instanceof AST.Comment) { - var cmt = stmts[i] - } else { - cmt = null; - } + var cmt = stmts[i].docText() - if (cmt) { - var m = /^\s*\{hide(:[^{}]*)?\}\s*$/.exec(cmt.text); + if (cmt != null) { + var m = /^\s*\{hide(:[^{}]*)?\}\s*$/.exec(cmt); if (m) { if (m[1]) output += this.formatText(m[1]); var j = i + 1; while (j < stmts.length) { - if (stmts[j] instanceof AST.Comment && - /^\s*\{\/hide\}\s*$/.test((stmts[j]).text)) { + if (/^\s*\{\/hide\}\s*$/.test(stmts[j].docText())) { j++; break; } j++; } i = j; - } else if (i == 0 && cmt.text == '{var:apihelp}') { + } else if (i == 0 && cmt == '{var:apihelp}') { i++; - } else if ((m = /^\s*(\{code}|````)\s*$/.exec(cmt.text)) != null) { + } else if ((m = /^\s*(\{code}|````)\s*$/.exec(cmt)) != null) { var j = i + 1; var seenStmt = false; while (j < stmts.length) { - if ((stmts[j] instanceof AST.Comment) && - /^\s*(\{\/code}|````)\s*$/.test((stmts[j]).text)) + if (/^\s*(\{\/code}|````)\s*$/.test(stmts[j].docText())) break; j++; } output += this.mkSnippet(stmts.slice(i + 1, j)); i = j + 1; - } else if ((m = /^\s*\{box:([^{}]*)\}\s*$/.exec(cmt.text)) != null) { + } else if ((m = /^\s*\{box:([^{}]*)\}\s*$/.exec(cmt)) != null) { if (currBox) output += ""; var parts = m[1].split(':'); var boxClass = parts[0]; @@ -1268,7 +1262,7 @@ module TDev { currBox = boxClass; output += Util.fmt("
{3}", boxCss, boxClass, boxDir, boxHd) i++; - } else if (/^\s*\{\/box(:[^{}]*)?\}\s*$/.test(cmt.text)) { + } else if (/^\s*\{\/box(:[^{}]*)?\}\s*$/.test(cmt)) { if (currBox) { output += boxFt + "
"; currBox = null; @@ -1277,13 +1271,13 @@ module TDev { } i++; } else { - output += this.formatText(cmt.text); + output += this.formatText(cmt); i++; } } else { var j = i; while (j < stmts.length) { - if (stmts[j] instanceof AST.Comment) break; + if (stmts[j].docText() != null) break; j++; } output += this.mkSnippet(stmts.slice(i, j)); diff --git a/ast/render.ts b/ast/render.ts index 8ed952d1..c68a87b3 100644 --- a/ast/render.ts +++ b/ast/render.ts @@ -517,6 +517,14 @@ module TDev public visitExprStmt(n:AST.ExprStmt) { + if (!this.showDiff && this.formatComments) { + var doc = n.docText() + if (doc != null) { + var inner = this.tline(Renderer.tdiv("md-comment", + this.mdComments.formatText(doc))) + return this.stmt(n, inner + this.possibleError(n)); + } + } return this.stmt(n, this.renderExprStmt(n)) } diff --git a/ast/tutorial.ts b/ast/tutorial.ts index 257a9e51..3bc6da58 100644 --- a/ast/tutorial.ts +++ b/ast/tutorial.ts @@ -233,17 +233,18 @@ module TDev.AST var isAutoStep = "" s.tutorialWarning = null - if (s instanceof AST.Comment) { - var c = s; - if (/^\s*\{box:([^{}]*)\}\s*$/i.test(c.text)) + var ctext = s.docText() + + if (ctext != null) { + if (/^\s*\{box:([^{}]*)\}\s*$/i.test(ctext)) boxNesting++; - if (/^\s*\{\/box\}\s*$/i.test(c.text)) + if (/^\s*\{\/box\}\s*$/i.test(ctext)) boxNesting--; - if (currStepIdx < 0 && /^\s*\{adddecl\}\s*$/i.test(c.text)) + if (currStepIdx < 0 && /^\s*\{adddecl\}\s*$/i.test(ctext)) currStep.addDecl = [] - var m = /^\s*\{stprecise:(.*)\}\s*$/i.exec(c.text) + var m = /^\s*\{stprecise:(.*)\}\s*$/i.exec(ctext) if (m) { var vs = m[1] if (/^["']/.test(vs)) { @@ -253,16 +254,16 @@ module TDev.AST preciseStrings[vs] = true } - m = /^\s*\{stnoprofile}\s*$/i.exec(c.text) + m = /^\s*\{stnoprofile}\s*$/i.exec(ctext) if (m) { combined._skipIntelliProfile = true; } - m = /^\s*\{stauto(:(.*))?}\s*$/i.exec(c.text) + m = /^\s*\{stauto(:(.*))?}\s*$/i.exec(ctext) if (m) isAutoStep = m[2] || "yes" - m = /^\s*\{stcmd:([^:]*)(:(.*))?\}\s*$/i.exec(c.text) + m = /^\s*\{stcmd:([^:]*)(:(.*))?\}\s*$/i.exec(ctext) if (m) { currStep.command = m[1] currStep.commandArg = m[3] || "" @@ -282,12 +283,12 @@ module TDev.AST } } - m = /^\s*\{sthints:([^:]*)\}\s*$/i.exec(c.text) + m = /^\s*\{sthints:([^:]*)\}\s*$/i.exec(ctext) if (m) { currStep.hintLevel = m[1] } - m = /^\s*\{stvalidator:([^:]*)(:(.*))?\}\s*$/i.exec(c.text) + m = /^\s*\{stvalidator:([^:]*)(:(.*))?\}\s*$/i.exec(ctext) if (m) { currStep.validator = m[1] currStep.validatorArg = m[3] || "" @@ -404,7 +405,7 @@ module TDev.AST prune(i, act.body) var newDocs = [] s.docs.forEach(d => { - if (d instanceof Comment && (d).text == "{stcode}") { + if (d.docText() == "{stcode}") { newDocs.pushRange(stepStmts) } else newDocs.push(d) }) diff --git a/lib/Document.ts b/lib/Document.ts index 26a6e137..e59b2066 100644 --- a/lib/Document.ts +++ b/lib/Document.ts @@ -16,5 +16,11 @@ module TDev.RT { doc._url = url; return Promise.as(doc); } + + //? Shows a document link in the docs. + //@ docsOnly + public docs_render(caption:string) + { + } } } diff --git a/lib/Picture.ts b/lib/Picture.ts index 83173d76..c97746df 100644 --- a/lib/Picture.ts +++ b/lib/Picture.ts @@ -1640,5 +1640,11 @@ module TDev.RT { var now = Time.now(); return now.year() + "-" + now.month() + "-" + now.day() + "-" + now.hour() + "-" + now.minute() + "-" + now.second() + "-" + now.millisecond(); } + + //? Shows an art picture in the docs. + //@ docsOnly + public docs_render(height:number, caption:string) + { + } } }