gherkin.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. // CodeMirror, copyright (c) by Marijn Haverbeke and others
  2. // Distributed under an MIT license: https://codemirror.net/LICENSE
  3. /*
  4. Gherkin mode - http://www.cukes.info/
  5. Report bugs/issues here: https://github.com/codemirror/CodeMirror/issues
  6. */
  7. // Following Objs from Brackets implementation: https://github.com/tregusti/brackets-gherkin/blob/master/main.js
  8. //var Quotes = {
  9. // SINGLE: 1,
  10. // DOUBLE: 2
  11. //};
  12. //var regex = {
  13. // keywords: /(Feature| {2}(Scenario|In order to|As|I)| {4}(Given|When|Then|And))/
  14. //};
  15. ;(function (mod) {
  16. if (typeof exports == 'object' && typeof module == 'object')
  17. // CommonJS
  18. mod(require('../../lib/codemirror'))
  19. else if (typeof define == 'function' && define.amd)
  20. // AMD
  21. define(['../../lib/codemirror'], mod)
  22. // Plain browser env
  23. else mod(CodeMirror)
  24. })(function (CodeMirror) {
  25. 'use strict'
  26. CodeMirror.defineMode('gherkin', function () {
  27. return {
  28. startState: function () {
  29. return {
  30. lineNumber: 0,
  31. tableHeaderLine: false,
  32. allowFeature: true,
  33. allowBackground: false,
  34. allowScenario: false,
  35. allowSteps: false,
  36. allowPlaceholders: false,
  37. allowMultilineArgument: false,
  38. inMultilineString: false,
  39. inMultilineTable: false,
  40. inKeywordLine: false,
  41. }
  42. },
  43. token: function (stream, state) {
  44. if (stream.sol()) {
  45. state.lineNumber++
  46. state.inKeywordLine = false
  47. if (state.inMultilineTable) {
  48. state.tableHeaderLine = false
  49. if (!stream.match(/\s*\|/, false)) {
  50. state.allowMultilineArgument = false
  51. state.inMultilineTable = false
  52. }
  53. }
  54. }
  55. stream.eatSpace()
  56. if (state.allowMultilineArgument) {
  57. // STRING
  58. if (state.inMultilineString) {
  59. if (stream.match('"""')) {
  60. state.inMultilineString = false
  61. state.allowMultilineArgument = false
  62. } else {
  63. stream.match(/.*/)
  64. }
  65. return 'string'
  66. }
  67. // TABLE
  68. if (state.inMultilineTable) {
  69. if (stream.match(/\|\s*/)) {
  70. return 'bracket'
  71. } else {
  72. stream.match(/[^\|]*/)
  73. return state.tableHeaderLine ? 'header' : 'string'
  74. }
  75. }
  76. // DETECT START
  77. if (stream.match('"""')) {
  78. // String
  79. state.inMultilineString = true
  80. return 'string'
  81. } else if (stream.match('|')) {
  82. // Table
  83. state.inMultilineTable = true
  84. state.tableHeaderLine = true
  85. return 'bracket'
  86. }
  87. }
  88. // LINE COMMENT
  89. if (stream.match(/#.*/)) {
  90. return 'comment'
  91. // TAG
  92. } else if (!state.inKeywordLine && stream.match(/@\S+/)) {
  93. return 'tag'
  94. // FEATURE
  95. } else if (
  96. !state.inKeywordLine &&
  97. state.allowFeature &&
  98. stream.match(
  99. /(機能|功能|フィーチャ|기능|โครงหลัก|ความสามารถ|ความต้องการทางธุรกิจ|ಹೆಚ್ಚಳ|గుణము|ਮੁਹਾਂਦਰਾ|ਨਕਸ਼ ਨੁਹਾਰ|ਖਾਸੀਅਤ|रूप लेख|وِیژگی|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Үзенчәлеклелек|Свойство|Особина|Мөмкинлек|Могућност|Λειτουργία|Δυνατότητα|Właściwość|Vlastnosť|Trajto|Tính năng|Savybė|Pretty much|Požiadavka|Požadavek|Potrzeba biznesowa|Özellik|Osobina|Ominaisuus|Omadus|OH HAI|Mogućnost|Mogucnost|Jellemző|Hwæt|Hwaet|Funzionalità|Funktionalitéit|Funktionalität|Funkcja|Funkcionalnost|Funkcionalitāte|Funkcia|Fungsi|Functionaliteit|Funcționalitate|Funcţionalitate|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Fīča|Feature|Eiginleiki|Egenskap|Egenskab|Característica|Caracteristica|Business Need|Aspekt|Arwedd|Ahoy matey!|Ability):/
  100. )
  101. ) {
  102. state.allowScenario = true
  103. state.allowBackground = true
  104. state.allowPlaceholders = false
  105. state.allowSteps = false
  106. state.allowMultilineArgument = false
  107. state.inKeywordLine = true
  108. return 'keyword'
  109. // BACKGROUND
  110. } else if (
  111. !state.inKeywordLine &&
  112. state.allowBackground &&
  113. stream.match(
  114. /(背景|배경|แนวคิด|ಹಿನ್ನೆಲೆ|నేపథ్యం|ਪਿਛੋਕੜ|पृष्ठभूमि|زمینه|الخلفية|רקע|Тарих|Предыстория|Предистория|Позадина|Передумова|Основа|Контекст|Кереш|Υπόβαθρο|Założenia|Yo\-ho\-ho|Tausta|Taust|Situācija|Rerefons|Pozadina|Pozadie|Pozadí|Osnova|Latar Belakang|Kontext|Konteksts|Kontekstas|Kontekst|Háttér|Hannergrond|Grundlage|Geçmiş|Fundo|Fono|First off|Dis is what went down|Dasar|Contexto|Contexte|Context|Contesto|Cenário de Fundo|Cenario de Fundo|Cefndir|Bối cảnh|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Antecedents|Antecedentes|Ær|Aer|Achtergrond):/
  115. )
  116. ) {
  117. state.allowPlaceholders = false
  118. state.allowSteps = true
  119. state.allowBackground = false
  120. state.allowMultilineArgument = false
  121. state.inKeywordLine = true
  122. return 'keyword'
  123. // SCENARIO OUTLINE
  124. } else if (
  125. !state.inKeywordLine &&
  126. state.allowScenario &&
  127. stream.match(
  128. /(場景大綱|场景大纲|劇本大綱|剧本大纲|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|시나리오 개요|สรุปเหตุการณ์|โครงสร้างของเหตุการณ์|ವಿವರಣೆ|కథనం|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ|परिदृश्य रूपरेखा|سيناريو مخطط|الگوی سناریو|תבנית תרחיש|Сценарийның төзелеше|Сценарий структураси|Структура сценарію|Структура сценария|Структура сценарија|Скица|Рамка на сценарий|Концепт|Περιγραφή Σεναρίου|Wharrimean is|Template Situai|Template Senario|Template Keadaan|Tapausaihio|Szenariogrundriss|Szablon scenariusza|Swa hwær swa|Swa hwaer swa|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario konsep|Shiver me timbers|Senaryo taslağı|Schema dello scenario|Scenariomall|Scenariomal|Scenario Template|Scenario Outline|Scenario Amlinellol|Scenārijs pēc parauga|Scenarijaus šablonas|Reckon it's like|Raamstsenaarium|Plang vum Szenario|Plan du Scénario|Plan du scénario|Osnova scénáře|Osnova Scenára|Náčrt Scenáru|Náčrt Scénáře|Náčrt Scenára|MISHUN SRSLY|Menggariskan Senario|Lýsing Dæma|Lýsing Atburðarásar|Konturo de la scenaro|Koncept|Khung tình huống|Khung kịch bản|Forgatókönyv vázlat|Esquema do Cenário|Esquema do Cenario|Esquema del escenario|Esquema de l'escenari|Esbozo do escenario|Delineação do Cenário|Delineacao do Cenario|All y'all|Abstrakt Scenario|Abstract Scenario):/
  129. )
  130. ) {
  131. state.allowPlaceholders = true
  132. state.allowSteps = true
  133. state.allowMultilineArgument = false
  134. state.inKeywordLine = true
  135. return 'keyword'
  136. // EXAMPLES
  137. } else if (
  138. state.allowScenario &&
  139. stream.match(
  140. /(例子|例|サンプル|예|ชุดของเหตุการณ์|ชุดของตัวอย่าง|ಉದಾಹರಣೆಗಳು|ఉదాహరణలు|ਉਦਾਹਰਨਾਂ|उदाहरण|نمونه ها|امثلة|דוגמאות|Үрнәкләр|Сценарији|Примеры|Примери|Приклади|Мисоллар|Мисаллар|Σενάρια|Παραδείγματα|You'll wanna|Voorbeelden|Variantai|Tapaukset|Se þe|Se the|Se ðe|Scenarios|Scenariji|Scenarijai|Przykłady|Primjeri|Primeri|Příklady|Príklady|Piemēri|Példák|Pavyzdžiai|Paraugs|Örnekler|Juhtumid|Exemplos|Exemples|Exemple|Exempel|EXAMPLZ|Examples|Esempi|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|Dữ liệu|Dead men tell no tales|Dæmi|Contoh|Cenários|Cenarios|Beispiller|Beispiele|Atburðarásir):/
  141. )
  142. ) {
  143. state.allowPlaceholders = false
  144. state.allowSteps = true
  145. state.allowBackground = false
  146. state.allowMultilineArgument = true
  147. return 'keyword'
  148. // SCENARIO
  149. } else if (
  150. !state.inKeywordLine &&
  151. state.allowScenario &&
  152. stream.match(
  153. /(場景|场景|劇本|剧本|シナリオ|시나리오|เหตุการณ์|ಕಥಾಸಾರಾಂಶ|సన్నివేశం|ਪਟਕਥਾ|परिदृश्य|سيناريو|سناریو|תרחיש|Сценарій|Сценарио|Сценарий|Пример|Σενάριο|Tình huống|The thing of it is|Tapaus|Szenario|Swa|Stsenaarium|Skenario|Situai|Senaryo|Senario|Scenaro|Scenariusz|Scenariu|Scénario|Scenario|Scenarijus|Scenārijs|Scenarij|Scenarie|Scénář|Scenár|Primer|MISHUN|Kịch bản|Keadaan|Heave to|Forgatókönyv|Escenario|Escenari|Cenário|Cenario|Awww, look mate|Atburðarás):/
  154. )
  155. ) {
  156. state.allowPlaceholders = false
  157. state.allowSteps = true
  158. state.allowBackground = false
  159. state.allowMultilineArgument = false
  160. state.inKeywordLine = true
  161. return 'keyword'
  162. // STEPS
  163. } else if (
  164. !state.inKeywordLine &&
  165. state.allowSteps &&
  166. stream.match(
  167. /(那麼|那么|而且|當|当|并且|同時|同时|前提|假设|假設|假定|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|하지만|조건|먼저|만일|만약|단|그리고|그러면|และ |เมื่อ |แต่ |ดังนั้น |กำหนดให้ |ಸ್ಥಿತಿಯನ್ನು |ಮತ್ತು |ನೀಡಿದ |ನಂತರ |ಆದರೆ |మరియు |చెప్పబడినది |కాని |ఈ పరిస్థితిలో |అప్పుడు |ਪਰ |ਤਦ |ਜੇਕਰ |ਜਿਵੇਂ ਕਿ |ਜਦੋਂ |ਅਤੇ |यदि |परन्तु |पर |तब |तदा |तथा |जब |चूंकि |किन्तु |कदा |और |अगर |و |هنگامی |متى |لكن |عندما |ثم |بفرض |با فرض |اما |اذاً |آنگاه |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Һәм |Унда |Тоді |Тогда |То |Также |Та |Пусть |Припустимо, що |Припустимо |Онда |Но |Нехай |Нәтиҗәдә |Лекин |Ләкин |Коли |Когда |Когато |Када |Кад |К тому же |І |И |Задато |Задати |Задате |Если |Допустим |Дано |Дадено |Вә |Ва |Бирок |Әмма |Әйтик |Әгәр |Аммо |Али |Але |Агар |А також |А |Τότε |Όταν |Και |Δεδομένου |Αλλά |Þurh |Þegar |Þa þe |Þá |Þa |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Za předpokladu |Za predpokladu |Youse know when youse got |Youse know like when |Yna |Yeah nah |Y'know |Y |Wun |Wtedy |When y'all |When |Wenn |WEN |wann |Ve |Và |Und |Un |ugeholl |Too right |Thurh |Thì |Then y'all |Then |Tha the |Tha |Tetapi |Tapi |Tak |Tada |Tad |Stel |Soit |Siis |Și |Şi |Si |Sed |Se |Så |Quando |Quand |Quan |Pryd |Potom |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O zaman |Niin |Nhưng |När |Når |Mutta |Men |Mas |Maka |Majd |Mając |Mais |Maar |mä |Ma |Lorsque |Lorsqu'|Logo |Let go and haul |Kun |Kuid |Kui |Kiedy |Khi |Ketika |Kemudian |Keď |Když |Kaj |Kai |Kada |Kad |Jeżeli |Jeśli |Ja |It's just unbelievable |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben seien |Gegeben sei |Gdy |Gangway! |Fakat |Étant donnés |Etant donnés |Étant données |Etant données |Étant donnée |Etant donnée |Étant donné |Etant donné |Et |És |Entonces |Entón |Então |Entao |En |Eğer ki |Ef |Eeldades |E |Ðurh |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Diberi |Dengan |Den youse gotta |DEN |De |Dato |Dați fiind |Daţi fiind |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann |dann |Dan |Dados |Dado |Dadas |Dada |Ða ðe |Ða |Cuando |Cho |Cando |Când |Cand |Cal |But y'all |But at the end of the day I reckon |BUT |But |Buh |Blimey! |Biết |Bet |Bagi |Aye |awer |Avast! |Atunci |Atesa |Atès |Apabila |Anrhegedig a |Angenommen |And y'all |And |AN |An |an |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Ak |Adott |Ac |Aber |A zároveň |A tiež |A taktiež |A také |A |a |7 |\* )/
  168. )
  169. ) {
  170. state.inStep = true
  171. state.allowPlaceholders = true
  172. state.allowMultilineArgument = true
  173. state.inKeywordLine = true
  174. return 'keyword'
  175. // INLINE STRING
  176. } else if (stream.match(/"[^"]*"?/)) {
  177. return 'string'
  178. // PLACEHOLDER
  179. } else if (state.allowPlaceholders && stream.match(/<[^>]*>?/)) {
  180. return 'variable'
  181. // Fall through
  182. } else {
  183. stream.next()
  184. stream.eatWhile(/[^@"<#]/)
  185. return null
  186. }
  187. },
  188. }
  189. })
  190. CodeMirror.defineMIME('text/x-feature', 'gherkin')
  191. })