Implement IDs with syntax like "div.my-class#my-id() {}"
authorNick Downing <downing.nick@gmail.com>
Sun, 14 Oct 2018 12:01:23 +0000 (23:01 +1100)
committerNick Downing <nick@ndcode.org>
Tue, 30 Oct 2018 07:54:35 +0000 (18:54 +1100)
page.jst
src/expression.js
src/tokenize.js
src/tokentype.js
template.js

index 722c626..9623eb1 100644 (file)
--- a/page.jst
+++ b/page.jst
@@ -1,4 +1,4 @@
-async _env => html.'cls-1'.cls-2(lang=_env.lang true=_env.val something-else="\"val\"") {
+async _env => html.'cls-1'.cls-2#id-1(lang=_env.lang true=_env.val something-else="\"val\"") {
   head {}
   body {
     `hello
index 5a35146..f05ece2 100644 (file)
@@ -269,6 +269,12 @@ pp.parseSubscripts = function(base, startPos, startLoc, noCalls) {
       node.computed = !!computed
       if (computed) this.expect(tt.bracketR)
       base = this.finishNode(node, "MemberExpression")
+    } else if (this.eat(tt.hash)) { // Nick
+      let node = this.startNodeAt(startPos, startLoc)
+      node.object = base
+      //node.property = this.parseIdent(true)
+      node.property = this.type === tt.string ? this.parseLiteral(this.value) : this.parseIdent(true) // Nick
+      base = this.finishNode(node, "MemberExpressionHash")
     } else if (!noCalls && this.eat(tt.parenL)) {
       let refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos
       this.yieldPos = 0
index 5fbbb27..3014ddc 100644 (file)
@@ -293,6 +293,8 @@ pp.getTokenFromCode = function(code) {
   // by a digit or another two dots.
   case 46: // '.'
     return this.readToken_dot()
+  case 35: // Nick '#'
+    ++this.pos; return this.finishToken(tt.hash)
 
   // Punctuation tokens.
   case 40: ++this.pos; return this.finishToken(tt.parenL)
index 76b145f..2fe565c 100644 (file)
@@ -69,6 +69,7 @@ export const types = {
   semi: new TokenType(";", beforeExpr),
   colon: new TokenType(":", beforeExpr),
   dot: new TokenType("."),
+  hash: new TokenType("#"), // Nick
   question: new TokenType("?", beforeExpr),
   arrow: new TokenType("=>", beforeExpr),
   template: new TokenType("template"),
index 0d273c5..8c459f5 100644 (file)
@@ -13,7 +13,7 @@ let expr_to_tag = (node, context, html_allowed, call_allowed) => {
     if (!expr_to_tag(node.right, context, html_allowed, call_allowed))
       return false;
   }
-  else if (node.type === 'MemberExpression') {
+  else if (node.type === 'MemberExpression' && !node.computed) {
     if (!expr_to_tag(node.object, context, false, false))
       return false;
     context.tag[context.tag_type].push(context.name.join('-'))
@@ -22,6 +22,15 @@ let expr_to_tag = (node, context, html_allowed, call_allowed) => {
     if (!expr_to_tag(node.property, context, html_allowed, call_allowed))
       return false;
   }
+  else if (node.type === 'MemberExpressionHash') {
+    if (!expr_to_tag(node.object, context, false, false))
+      return false;
+    context.tag[context.tag_type].push(context.name.join('-'))
+    context.name = []
+    context.tag_type = 2
+    if (!expr_to_tag(node.property, context, html_allowed, call_allowed))
+      return false;
+  }
   else if (html_allowed && node.type === 'HTMLExpression') {
     if (!expr_to_tag(node.tag, context, false, true))
       return false;
@@ -59,6 +68,9 @@ let html_body = (context, st, c) => {
   if (context.tag[1].length)
     prefix += ' class="' + context.tag[1].join(' ') + '"'
 
+  if (context.tag[2].length)
+    prefix += ' id="' + context.tag[2].join(' ') + '"'
+
   let expr = undefined
   for (var i = 0; i < context.arguments.length; ++i) {
     let argument = context.arguments[i]
@@ -241,7 +253,7 @@ visitors.ExpressionStatement = (node, st, c) => {
     node.expression.type === 'MemberExpression' ||
     node.expression.type === 'HTMLExpression'
   ) {
-    context = {name: [], tag: [[], []], tag_type: 0, arguments: []}
+    context = {name: [], tag: [[], [], []], tag_type: 0, arguments: []}
     if (
       expr_to_tag(node.expression, context, true, false) &&
       context.body !== undefined
@@ -260,7 +272,7 @@ visitors.Expression = (node, st, c) => {
     node.type === 'MemberExpression' ||
     node.type === 'HTMLExpression'
   ) {
-    context = {name: [], tag: [[], []], tag_type: 0, arguments: []}
+    context = {name: [], tag: [[], [], []], tag_type: 0, arguments: []}
     if (
       expr_to_tag(node, context, true, false) &&
       context.body !== undefined