A templating language that looks like Lisp and compiles to HTML
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

compiler.js 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. const test = require("tape")
  2. const Compiler = require("../src/compiler")
  3. const Lexer = require("../src/lexer")
  4. const Node = require("../src/node")
  5. const Parser = require("../src/parser")
  6. const tt = require("../src/tokenTypes")
  7. test("compiles a simple template", t => {
  8. t.plan(1)
  9. const lexer = new Lexer()
  10. const tokenStream = lexer.scan(`
  11. (div :class "foobar"
  12. (p :class "bazquux" "Lorem ipsum dolor sit amet."))
  13. `)
  14. const parser = new Parser(tokenStream)
  15. const tree = parser.parse()
  16. const compiler = new Compiler(tree)
  17. const result = compiler.compile()
  18. t.deepEqual(
  19. result.replace(/\n/g, '').replace(/ +/g, ''),
  20. '<div class="foobar"><p class="bazquux">Lorem ipsum dolor sit amet.</p></div>'
  21. )
  22. })
  23. test("renders variables according to passed-in context", t => {
  24. t.plan(1)
  25. const lexer = new Lexer()
  26. const tokenStream = lexer.scan(`
  27. (div :class classOne
  28. (p :class classTwo bodyText))
  29. `)
  30. const parser = new Parser(tokenStream)
  31. const tree = parser.parse()
  32. const compiler = new Compiler(tree, {
  33. classOne: 'foobar',
  34. classTwo: 'bazquux',
  35. bodyText: 'Lorem ipsum dolor sit amet.'
  36. })
  37. const result = compiler.compile()
  38. t.deepEqual(
  39. result.replace(/\n/g, '').replace(/ +/g, ''),
  40. '<div class="foobar"><p class="bazquux">Lorem ipsum dolor sit amet.</p></div>'
  41. )
  42. })