lasso.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /*
  2. Language: Lasso
  3. Author: Eric Knibbe <eric@lassosoft.com>
  4. Description: Lasso is a language and server platform for database-driven web applications. This definition handles Lasso 9 syntax and LassoScript for Lasso 8.6 and earlier.
  5. Website: http://www.lassosoft.com/What-Is-Lasso
  6. */
  7. function lasso(hljs) {
  8. const LASSO_IDENT_RE = '[a-zA-Z_][\\w.]*';
  9. const LASSO_ANGLE_RE = '<\\?(lasso(script)?|=)';
  10. const LASSO_CLOSE_RE = '\\]|\\?>';
  11. const LASSO_KEYWORDS = {
  12. $pattern: LASSO_IDENT_RE + '|&[lg]t;',
  13. literal:
  14. 'true false none minimal full all void and or not '
  15. + 'bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft',
  16. built_in:
  17. 'array date decimal duration integer map pair string tag xml null '
  18. + 'boolean bytes keyword list locale queue set stack staticarray '
  19. + 'local var variable global data self inherited currentcapture givenblock',
  20. keyword:
  21. 'cache database_names database_schemanames database_tablenames '
  22. + 'define_tag define_type email_batch encode_set html_comment handle '
  23. + 'handle_error header if inline iterate ljax_target link '
  24. + 'link_currentaction link_currentgroup link_currentrecord link_detail '
  25. + 'link_firstgroup link_firstrecord link_lastgroup link_lastrecord '
  26. + 'link_nextgroup link_nextrecord link_prevgroup link_prevrecord log '
  27. + 'loop namespace_using output_none portal private protect records '
  28. + 'referer referrer repeating resultset rows search_args '
  29. + 'search_arguments select sort_args sort_arguments thread_atomic '
  30. + 'value_list while abort case else fail_if fail_ifnot fail if_empty '
  31. + 'if_false if_null if_true loop_abort loop_continue loop_count params '
  32. + 'params_up return return_value run_children soap_definetag '
  33. + 'soap_lastrequest soap_lastresponse tag_name ascending average by '
  34. + 'define descending do equals frozen group handle_failure import in '
  35. + 'into join let match max min on order parent protected provide public '
  36. + 'require returnhome skip split_thread sum take thread to trait type '
  37. + 'where with yield yieldhome'
  38. };
  39. const HTML_COMMENT = hljs.COMMENT(
  40. '<!--',
  41. '-->',
  42. { relevance: 0 }
  43. );
  44. const LASSO_NOPROCESS = {
  45. className: 'meta',
  46. begin: '\\[noprocess\\]',
  47. starts: {
  48. end: '\\[/noprocess\\]',
  49. returnEnd: true,
  50. contains: [ HTML_COMMENT ]
  51. }
  52. };
  53. const LASSO_START = {
  54. className: 'meta',
  55. begin: '\\[/noprocess|' + LASSO_ANGLE_RE
  56. };
  57. const LASSO_DATAMEMBER = {
  58. className: 'symbol',
  59. begin: '\'' + LASSO_IDENT_RE + '\''
  60. };
  61. const LASSO_CODE = [
  62. hljs.C_LINE_COMMENT_MODE,
  63. hljs.C_BLOCK_COMMENT_MODE,
  64. hljs.inherit(hljs.C_NUMBER_MODE, { begin: hljs.C_NUMBER_RE + '|(-?infinity|NaN)\\b' }),
  65. hljs.inherit(hljs.APOS_STRING_MODE, { illegal: null }),
  66. hljs.inherit(hljs.QUOTE_STRING_MODE, { illegal: null }),
  67. {
  68. className: 'string',
  69. begin: '`',
  70. end: '`'
  71. },
  72. { // variables
  73. variants: [
  74. { begin: '[#$]' + LASSO_IDENT_RE },
  75. {
  76. begin: '#',
  77. end: '\\d+',
  78. illegal: '\\W'
  79. }
  80. ] },
  81. {
  82. className: 'type',
  83. begin: '::\\s*',
  84. end: LASSO_IDENT_RE,
  85. illegal: '\\W'
  86. },
  87. {
  88. className: 'params',
  89. variants: [
  90. {
  91. begin: '-(?!infinity)' + LASSO_IDENT_RE,
  92. relevance: 0
  93. },
  94. { begin: '(\\.\\.\\.)' }
  95. ]
  96. },
  97. {
  98. begin: /(->|\.)\s*/,
  99. relevance: 0,
  100. contains: [ LASSO_DATAMEMBER ]
  101. },
  102. {
  103. className: 'class',
  104. beginKeywords: 'define',
  105. returnEnd: true,
  106. end: '\\(|=>',
  107. contains: [ hljs.inherit(hljs.TITLE_MODE, { begin: LASSO_IDENT_RE + '(=(?!>))?|[-+*/%](?!>)' }) ]
  108. }
  109. ];
  110. return {
  111. name: 'Lasso',
  112. aliases: [
  113. 'ls',
  114. 'lassoscript'
  115. ],
  116. case_insensitive: true,
  117. keywords: LASSO_KEYWORDS,
  118. contains: [
  119. {
  120. className: 'meta',
  121. begin: LASSO_CLOSE_RE,
  122. relevance: 0,
  123. starts: { // markup
  124. end: '\\[|' + LASSO_ANGLE_RE,
  125. returnEnd: true,
  126. relevance: 0,
  127. contains: [ HTML_COMMENT ]
  128. }
  129. },
  130. LASSO_NOPROCESS,
  131. LASSO_START,
  132. {
  133. className: 'meta',
  134. begin: '\\[no_square_brackets',
  135. starts: {
  136. end: '\\[/no_square_brackets\\]', // not implemented in the language
  137. keywords: LASSO_KEYWORDS,
  138. contains: [
  139. {
  140. className: 'meta',
  141. begin: LASSO_CLOSE_RE,
  142. relevance: 0,
  143. starts: {
  144. end: '\\[noprocess\\]|' + LASSO_ANGLE_RE,
  145. returnEnd: true,
  146. contains: [ HTML_COMMENT ]
  147. }
  148. },
  149. LASSO_NOPROCESS,
  150. LASSO_START
  151. ].concat(LASSO_CODE)
  152. }
  153. },
  154. {
  155. className: 'meta',
  156. begin: '\\[',
  157. relevance: 0
  158. },
  159. {
  160. className: 'meta',
  161. begin: '^#!',
  162. end: 'lasso9$',
  163. relevance: 10
  164. }
  165. ].concat(LASSO_CODE)
  166. };
  167. }
  168. module.exports = lasso;