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 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. })
  43. test('compiles map operations', function(t) {
  44. t.plan(1)
  45. const lexer = new Lexer()
  46. const tokenStream = lexer.scan(`
  47. (ul
  48. (each items 'item (li item)))
  49. `)
  50. const parser = new Parser(tokenStream)
  51. const tree = parser.parse()
  52. const compiler = new Compiler(tree, {
  53. items: ['one', 'two', 'three'],
  54. })
  55. const result = compiler.compile()
  56. t.deepEqual(
  57. result.replace(/\n/g, '').replace(/ +/g, ''),
  58. '<ul><li>one</li><li>two</li><li>three</li></ul>',
  59. )
  60. })
  61. test('self closing tags are respected', function(t) {
  62. t.plan(1)
  63. const lexer = new Lexer()
  64. const tokenStream = lexer.scan(`
  65. (meta :charset "UTF-8")
  66. (img :src "test.png")
  67. `)
  68. const parser = new Parser(tokenStream)
  69. const tree = parser.parse()
  70. const compiler = new Compiler(tree)
  71. const result = compiler.compile()
  72. t.deepEqual(
  73. result.replace(/\n/g, '').replace(/ +/g, ''),
  74. '<meta charset="UTF-8"><img src="test.png">',
  75. )
  76. })