element.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package ace
  2. import (
  3. "fmt"
  4. "io"
  5. )
  6. // Helper method names
  7. const (
  8. helperMethodNameConditionalComment = "conditionalComment"
  9. helperMethodNameContent = "content"
  10. helperMethodNameCSS = "css"
  11. helperMethodNameDoctype = "doctype"
  12. helperMethodNameYield = "yield"
  13. helperMethodNameInclude = "include"
  14. helperMethodNameJavascript = "javascript"
  15. )
  16. // element is an interface for storing an element.
  17. type element interface {
  18. io.WriterTo
  19. AppendChild(child element)
  20. ContainPlainText() bool
  21. Base() *elementBase
  22. CanHaveChildren() bool
  23. InsertBr() bool
  24. SetLastChild(lastChild bool)
  25. IsBlockElement() bool
  26. IsControlElement() bool
  27. }
  28. // newElement creates and returns an element.
  29. func newElement(ln *line, rslt *result, src *source, parent element, opts *Options) (element, error) {
  30. var e element
  31. var err error
  32. switch {
  33. case parent != nil && parent.ContainPlainText():
  34. e = newPlainTextInner(ln, rslt, src, parent, parent.InsertBr(), opts)
  35. case ln.isEmpty():
  36. e = newEmptyElement(ln, rslt, src, parent, opts)
  37. case ln.isComment():
  38. e = newComment(ln, rslt, src, parent, opts)
  39. case ln.isHTMLComment():
  40. e = newHTMLComment(ln, rslt, src, parent, opts)
  41. case ln.isHelperMethod():
  42. switch {
  43. case ln.isHelperMethodOf(helperMethodNameConditionalComment):
  44. e, err = newHelperMethodConditionalComment(ln, rslt, src, parent, opts)
  45. case ln.isHelperMethodOf(helperMethodNameContent):
  46. e, err = newHelperMethodContent(ln, rslt, src, parent, opts)
  47. case ln.isHelperMethodOf(helperMethodNameCSS):
  48. e = newHelperMethodCSS(ln, rslt, src, parent, opts)
  49. case ln.isHelperMethodOf(helperMethodNameDoctype):
  50. e, err = newHelperMethodDoctype(ln, rslt, src, parent, opts)
  51. case ln.isHelperMethodOf(helperMethodNameInclude):
  52. e, err = newHelperMethodInclude(ln, rslt, src, parent, opts)
  53. case ln.isHelperMethodOf(helperMethodNameJavascript):
  54. e = newHelperMethodJavascript(ln, rslt, src, parent, opts)
  55. case ln.isHelperMethodOf(helperMethodNameYield):
  56. e, err = newHelperMethodYield(ln, rslt, src, parent, opts)
  57. default:
  58. err = fmt.Errorf("the helper method name is invalid [file: %s][line: %d]", ln.fileName(), ln.no)
  59. }
  60. case ln.isPlainText():
  61. e = newPlainText(ln, rslt, src, parent, opts)
  62. case ln.isAction():
  63. e = newAction(ln, rslt, src, parent, opts)
  64. default:
  65. e, err = newHTMLTag(ln, rslt, src, parent, opts)
  66. }
  67. return e, err
  68. }