demotape 0.0.0.pre.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (939) hide show
  1. checksums.yaml +7 -0
  2. data/.github/CODEOWNERS +4 -0
  3. data/.github/FUNDING.yml +4 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
  5. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  7. data/.github/PULL_REQUEST_TEMPLATE.md +38 -0
  8. data/.github/dependabot.yml +15 -0
  9. data/.github/workflows/ruby-tests.yml +53 -0
  10. data/.gitignore +15 -0
  11. data/.rubocop.yml +18 -0
  12. data/CHANGELOG.md +16 -0
  13. data/CODE_OF_CONDUCT.md +74 -0
  14. data/CONTRIBUTING.md +80 -0
  15. data/Gemfile +5 -0
  16. data/LICENSE.md +20 -0
  17. data/Makefile +29 -0
  18. data/README.md +574 -0
  19. data/Rakefile +19 -0
  20. data/bin/console +16 -0
  21. data/bin/setup +10 -0
  22. data/bin/themes +37 -0
  23. data/demotape.ascii +19 -0
  24. data/demotape.gemspec +55 -0
  25. data/demotape.jsonc +59 -0
  26. data/demotape.y +520 -0
  27. data/demotape_ascii.rb +29 -0
  28. data/editors/sublime-text/Comments (DemoTape).tmPreferences +21 -0
  29. data/editors/sublime-text/DemoTape.sublime-completions +140 -0
  30. data/editors/sublime-text/DemoTape.sublime-syntax +243 -0
  31. data/editors/vim/README.md +91 -0
  32. data/editors/vim/ftdetect/demotape.vim +2 -0
  33. data/editors/vim/syntax/demotape.vim +81 -0
  34. data/editors/vscode/README.md +29 -0
  35. data/editors/vscode/demotape.tmLanguage.json +201 -0
  36. data/editors/vscode/language-configuration.json +24 -0
  37. data/editors/vscode/package.json +30 -0
  38. data/examples/alt.mp4 +0 -0
  39. data/examples/alt.png +0 -0
  40. data/examples/alt.tape +9 -0
  41. data/examples/arrow.mp4 +0 -0
  42. data/examples/arrow.png +0 -0
  43. data/examples/arrow.tape +7 -0
  44. data/examples/backspace.mp4 +0 -0
  45. data/examples/backspace.png +0 -0
  46. data/examples/backspace.tape +4 -0
  47. data/examples/bash.mp4 +0 -0
  48. data/examples/bash.png +0 -0
  49. data/examples/bash.tape +4 -0
  50. data/examples/bg.jpg +0 -0
  51. data/examples/clear.mp4 +0 -0
  52. data/examples/clear.png +0 -0
  53. data/examples/clear.tape +6 -0
  54. data/examples/cli_ui_interactive_prompt.mp4 +0 -0
  55. data/examples/cli_ui_interactive_prompt.png +0 -0
  56. data/examples/cli_ui_interactive_prompt.tape +16 -0
  57. data/examples/cli_ui_nested_frames.mp4 +0 -0
  58. data/examples/cli_ui_nested_frames.png +0 -0
  59. data/examples/cli_ui_nested_frames.tape +15 -0
  60. data/examples/cli_ui_progress.mp4 +0 -0
  61. data/examples/cli_ui_progress.png +0 -0
  62. data/examples/cli_ui_progress.tape +6 -0
  63. data/examples/cli_ui_spinner.mp4 +0 -0
  64. data/examples/cli_ui_spinner.png +0 -0
  65. data/examples/cli_ui_spinner.tape +6 -0
  66. data/examples/cli_ui_status_widget.mp4 +0 -0
  67. data/examples/cli_ui_status_widget.png +0 -0
  68. data/examples/cli_ui_status_widget.tape +6 -0
  69. data/examples/cli_ui_symbols.mp4 +0 -0
  70. data/examples/cli_ui_symbols.png +0 -0
  71. data/examples/cli_ui_symbols.tape +6 -0
  72. data/examples/cli_ui_text_prompt.mp4 +0 -0
  73. data/examples/cli_ui_text_prompt.png +0 -0
  74. data/examples/cli_ui_text_prompt.tape +10 -0
  75. data/examples/clipboard.mp4 +0 -0
  76. data/examples/clipboard.png +0 -0
  77. data/examples/clipboard.tape +5 -0
  78. data/examples/ctrl.mp4 +0 -0
  79. data/examples/ctrl.png +0 -0
  80. data/examples/ctrl.tape +5 -0
  81. data/examples/ctrl_arrows.mp4 +0 -0
  82. data/examples/ctrl_arrows.png +0 -0
  83. data/examples/ctrl_arrows.tape +14 -0
  84. data/examples/demotape.mp4 +0 -0
  85. data/examples/demotape.png +0 -0
  86. data/examples/demotape.tape +6 -0
  87. data/examples/demotape.txt +13 -0
  88. data/examples/enter.mp4 +0 -0
  89. data/examples/enter.png +0 -0
  90. data/examples/enter.tape +3 -0
  91. data/examples/errors/include_itself.tape +1 -0
  92. data/examples/fastfetch.gif +0 -0
  93. data/examples/fastfetch.mp4 +0 -0
  94. data/examples/fastfetch.png +0 -0
  95. data/examples/fastfetch.tape +11 -0
  96. data/examples/fish.mp4 +0 -0
  97. data/examples/fish.png +0 -0
  98. data/examples/fish.tape +4 -0
  99. data/examples/format.mp4 +0 -0
  100. data/examples/format.png +0 -0
  101. data/examples/format.tape +15 -0
  102. data/examples/gh-cli.mp4 +0 -0
  103. data/examples/gh-cli.png +0 -0
  104. data/examples/gh-cli.tape +13 -0
  105. data/examples/gif_loop.gif +0 -0
  106. data/examples/gif_loop.png +0 -0
  107. data/examples/gif_loop.tape +5 -0
  108. data/examples/include.mp4 +0 -0
  109. data/examples/include.png +0 -0
  110. data/examples/include.tape +1 -0
  111. data/examples/include_with_set.mp4 +0 -0
  112. data/examples/include_with_set.png +0 -0
  113. data/examples/include_with_set.tape +2 -0
  114. data/examples/meta/cli.tape +10 -0
  115. data/examples/nerdfonts.mp4 +0 -0
  116. data/examples/nerdfonts.png +0 -0
  117. data/examples/nerdfonts.tape +9 -0
  118. data/examples/output.gif +0 -0
  119. data/examples/output.mp4 +0 -0
  120. data/examples/output.png +0 -0
  121. data/examples/output.tape +8 -0
  122. data/examples/output.webm +0 -0
  123. data/examples/products.json +1803 -0
  124. data/examples/screenshot.mp4 +0 -0
  125. data/examples/screenshot.png +0 -0
  126. data/examples/screenshot.tape +9 -0
  127. data/examples/script.rb +3 -0
  128. data/examples/set_cursor_bar.mp4 +0 -0
  129. data/examples/set_cursor_bar.png +0 -0
  130. data/examples/set_cursor_bar.tape +5 -0
  131. data/examples/set_cursor_blink.mp4 +0 -0
  132. data/examples/set_cursor_blink.png +0 -0
  133. data/examples/set_cursor_blink.tape +4 -0
  134. data/examples/set_cursor_underline.mp4 +0 -0
  135. data/examples/set_cursor_underline.png +0 -0
  136. data/examples/set_cursor_underline.tape +5 -0
  137. data/examples/set_dimensions.mp4 +0 -0
  138. data/examples/set_dimensions.png +0 -0
  139. data/examples/set_dimensions.tape +5 -0
  140. data/examples/set_font_family.mp4 +0 -0
  141. data/examples/set_font_family.png +0 -0
  142. data/examples/set_font_family.tape +4 -0
  143. data/examples/set_font_size.mp4 +0 -0
  144. data/examples/set_font_size.png +0 -0
  145. data/examples/set_font_size.tape +4 -0
  146. data/examples/set_line_height.mp4 +0 -0
  147. data/examples/set_line_height.png +0 -0
  148. data/examples/set_line_height.tape +8 -0
  149. data/examples/set_margin.mp4 +0 -0
  150. data/examples/set_margin.png +0 -0
  151. data/examples/set_margin.tape +7 -0
  152. data/examples/set_margin_with_border_radius.mp4 +0 -0
  153. data/examples/set_margin_with_border_radius.png +0 -0
  154. data/examples/set_margin_with_border_radius.tape +8 -0
  155. data/examples/set_margin_with_image.mp4 +0 -0
  156. data/examples/set_margin_with_image.png +0 -0
  157. data/examples/set_margin_with_image.tape +7 -0
  158. data/examples/set_padding.mp4 +0 -0
  159. data/examples/set_padding.png +0 -0
  160. data/examples/set_padding.tape +7 -0
  161. data/examples/set_theme.mp4 +0 -0
  162. data/examples/set_theme.png +0 -0
  163. data/examples/set_theme.tape +9 -0
  164. data/examples/set_theme_property.mp4 +0 -0
  165. data/examples/set_theme_property.png +0 -0
  166. data/examples/set_theme_property.tape +10 -0
  167. data/examples/set_typing_speed.mp4 +0 -0
  168. data/examples/set_typing_speed.png +0 -0
  169. data/examples/set_typing_speed.tape +6 -0
  170. data/examples/slides.mp4 +0 -0
  171. data/examples/slides.png +0 -0
  172. data/examples/slides.tape +14 -0
  173. data/examples/space.mp4 +0 -0
  174. data/examples/space.png +0 -0
  175. data/examples/space.tape +3 -0
  176. data/examples/stdin.mp4 +0 -0
  177. data/examples/stdin.png +0 -0
  178. data/examples/stdin.tape +7 -0
  179. data/examples/tab.mp4 +0 -0
  180. data/examples/tab.png +0 -0
  181. data/examples/tab.tape +5 -0
  182. data/examples/themes/3024_day.png +0 -0
  183. data/examples/themes/3024_night.png +0 -0
  184. data/examples/themes/aardvark_blue.png +0 -0
  185. data/examples/themes/abernathy.png +0 -0
  186. data/examples/themes/adventure.png +0 -0
  187. data/examples/themes/adventure_time.png +0 -0
  188. data/examples/themes/afterglow.png +0 -0
  189. data/examples/themes/alabaster.png +0 -0
  190. data/examples/themes/alien_blood.png +0 -0
  191. data/examples/themes/andromeda.png +0 -0
  192. data/examples/themes/apple_classic.png +0 -0
  193. data/examples/themes/apple_system_colors.png +0 -0
  194. data/examples/themes/arcoiris.png +0 -0
  195. data/examples/themes/argonaut.png +0 -0
  196. data/examples/themes/arthur.png +0 -0
  197. data/examples/themes/atelier_sulphurpool.png +0 -0
  198. data/examples/themes/atom.png +0 -0
  199. data/examples/themes/atom_one_light.png +0 -0
  200. data/examples/themes/aurora.png +0 -0
  201. data/examples/themes/ayu.png +0 -0
  202. data/examples/themes/ayu_light.png +0 -0
  203. data/examples/themes/ayu_mirage.png +0 -0
  204. data/examples/themes/banana_blueberry.png +0 -0
  205. data/examples/themes/batman.png +0 -0
  206. data/examples/themes/belafonte_day.png +0 -0
  207. data/examples/themes/belafonte_night.png +0 -0
  208. data/examples/themes/birds_of_paradise.png +0 -0
  209. data/examples/themes/blazer.png +0 -0
  210. data/examples/themes/blue_berry_pie.png +0 -0
  211. data/examples/themes/blue_dolphin.png +0 -0
  212. data/examples/themes/blue_matrix.png +0 -0
  213. data/examples/themes/bluloco_dark.png +0 -0
  214. data/examples/themes/bluloco_light.png +0 -0
  215. data/examples/themes/borland.png +0 -0
  216. data/examples/themes/breeze.png +0 -0
  217. data/examples/themes/bright_lights.png +0 -0
  218. data/examples/themes/broadcast.png +0 -0
  219. data/examples/themes/brogrammer.png +0 -0
  220. data/examples/themes/bubbles.png +0 -0
  221. data/examples/themes/builtin_dark.png +0 -0
  222. data/examples/themes/builtin_light.png +0 -0
  223. data/examples/themes/builtin_pastel_dark.png +0 -0
  224. data/examples/themes/builtin_solarized_dark.png +0 -0
  225. data/examples/themes/builtin_solarized_light.png +0 -0
  226. data/examples/themes/builtin_tango_dark.png +0 -0
  227. data/examples/themes/builtin_tango_light.png +0 -0
  228. data/examples/themes/c64.png +0 -0
  229. data/examples/themes/calamity.png +0 -0
  230. data/examples/themes/catppuccin_frappe.png +0 -0
  231. data/examples/themes/catppuccin_latte.png +0 -0
  232. data/examples/themes/catppuccin_macchiato.png +0 -0
  233. data/examples/themes/catppuccin_mocha.png +0 -0
  234. data/examples/themes/cga.png +0 -0
  235. data/examples/themes/chalk.png +0 -0
  236. data/examples/themes/chalkboard.png +0 -0
  237. data/examples/themes/challenger_deep.png +0 -0
  238. data/examples/themes/chester.png +0 -0
  239. data/examples/themes/ciapre.png +0 -0
  240. data/examples/themes/clrs.png +0 -0
  241. data/examples/themes/cobalt2.png +0 -0
  242. data/examples/themes/cobalt_neon.png +0 -0
  243. data/examples/themes/coffee_theme.png +0 -0
  244. data/examples/themes/contrast_light.png +0 -0
  245. data/examples/themes/coolnight.png +0 -0
  246. data/examples/themes/crayon_pony_fish.png +0 -0
  247. data/examples/themes/crystal_violet.png +0 -0
  248. data/examples/themes/cutie_pro.png +0 -0
  249. data/examples/themes/cyber_cube.png +0 -0
  250. data/examples/themes/cyber_punk2077.png +0 -0
  251. data/examples/themes/cyberdyne.png +0 -0
  252. data/examples/themes/cyberpunk.png +0 -0
  253. data/examples/themes/dark_pastel.png +0 -0
  254. data/examples/themes/dark_plus.png +0 -0
  255. data/examples/themes/darkermatrix.png +0 -0
  256. data/examples/themes/darkmatrix.png +0 -0
  257. data/examples/themes/darkside.png +0 -0
  258. data/examples/themes/dayfox.png +0 -0
  259. data/examples/themes/deep.png +0 -0
  260. data/examples/themes/desert.png +0 -0
  261. data/examples/themes/dimmed_monokai.png +0 -0
  262. data/examples/themes/django.png +0 -0
  263. data/examples/themes/django_reborn_again.png +0 -0
  264. data/examples/themes/django_smooth.png +0 -0
  265. data/examples/themes/doom_one.png +0 -0
  266. data/examples/themes/doom_peacock.png +0 -0
  267. data/examples/themes/dot_gov.png +0 -0
  268. data/examples/themes/dracula.png +0 -0
  269. data/examples/themes/dracula_plus.png +0 -0
  270. data/examples/themes/duckbones.png +0 -0
  271. data/examples/themes/duotone_dark.png +0 -0
  272. data/examples/themes/earthsong.png +0 -0
  273. data/examples/themes/elemental.png +0 -0
  274. data/examples/themes/elementary.png +0 -0
  275. data/examples/themes/encom.png +0 -0
  276. data/examples/themes/espresso.png +0 -0
  277. data/examples/themes/espresso_libre.png +0 -0
  278. data/examples/themes/everblush.png +0 -0
  279. data/examples/themes/fahrenheit.png +0 -0
  280. data/examples/themes/fairyfloss.png +0 -0
  281. data/examples/themes/farmhouse_dark.png +0 -0
  282. data/examples/themes/farmhouse_light.png +0 -0
  283. data/examples/themes/fideloper.png +0 -0
  284. data/examples/themes/firefly_traditional.png +0 -0
  285. data/examples/themes/firefox_dev.png +0 -0
  286. data/examples/themes/firewatch.png +0 -0
  287. data/examples/themes/fish_tank.png +0 -0
  288. data/examples/themes/flat.png +0 -0
  289. data/examples/themes/flatland.png +0 -0
  290. data/examples/themes/flexoki_dark.png +0 -0
  291. data/examples/themes/flexoki_light.png +0 -0
  292. data/examples/themes/floraverse.png +0 -0
  293. data/examples/themes/forest_blue.png +0 -0
  294. data/examples/themes/framer.png +0 -0
  295. data/examples/themes/front_end_delight.png +0 -0
  296. data/examples/themes/fun_forrest.png +0 -0
  297. data/examples/themes/galaxy.png +0 -0
  298. data/examples/themes/galizur.png +0 -0
  299. data/examples/themes/ganyu.png +0 -0
  300. data/examples/themes/git_hub_dark.png +0 -0
  301. data/examples/themes/github.png +0 -0
  302. data/examples/themes/glacier.png +0 -0
  303. data/examples/themes/glorious.png +0 -0
  304. data/examples/themes/grape.png +0 -0
  305. data/examples/themes/grass.png +0 -0
  306. data/examples/themes/grey_green.png +0 -0
  307. data/examples/themes/gruvbox_dark.png +0 -0
  308. data/examples/themes/gruvbox_dark_hard.png +0 -0
  309. data/examples/themes/gruvbox_light.png +0 -0
  310. data/examples/themes/guezwhoz.png +0 -0
  311. data/examples/themes/h4rithd.png +0 -0
  312. data/examples/themes/h4rithd_com.png +0 -0
  313. data/examples/themes/ha_x0_r_blue.png +0 -0
  314. data/examples/themes/ha_x0_r_gr33_n.png +0 -0
  315. data/examples/themes/ha_x0_r_r3_d.png +0 -0
  316. data/examples/themes/hacktober.png +0 -0
  317. data/examples/themes/hardcore.png +0 -0
  318. data/examples/themes/harper.png +0 -0
  319. data/examples/themes/highway.png +0 -0
  320. data/examples/themes/hipster_green.png +0 -0
  321. data/examples/themes/hivacruz.png +0 -0
  322. data/examples/themes/homebrew.png +0 -0
  323. data/examples/themes/hopscotch.png +0 -0
  324. data/examples/themes/hopscotch_256.png +0 -0
  325. data/examples/themes/horizon.png +0 -0
  326. data/examples/themes/hurtado.png +0 -0
  327. data/examples/themes/hybrid.png +0 -0
  328. data/examples/themes/hyper.png +0 -0
  329. data/examples/themes/ic_green_ppl.png +0 -0
  330. data/examples/themes/ic_orange_ppl.png +0 -0
  331. data/examples/themes/iceberg_dark.png +0 -0
  332. data/examples/themes/iceberg_light.png +0 -0
  333. data/examples/themes/idea.png +0 -0
  334. data/examples/themes/idle_toes.png +0 -0
  335. data/examples/themes/ir_black.png +0 -0
  336. data/examples/themes/iterm2_dark_background.png +0 -0
  337. data/examples/themes/iterm2_default.png +0 -0
  338. data/examples/themes/iterm2_light_background.png +0 -0
  339. data/examples/themes/iterm2_pastel_dark_background.png +0 -0
  340. data/examples/themes/iterm2_smoooooth.png +0 -0
  341. data/examples/themes/iterm2_solarized_dark.png +0 -0
  342. data/examples/themes/iterm2_solarized_light.png +0 -0
  343. data/examples/themes/iterm2_tango_dark.png +0 -0
  344. data/examples/themes/iterm2_tango_light.png +0 -0
  345. data/examples/themes/jackie_brown.png +0 -0
  346. data/examples/themes/japanesque.png +0 -0
  347. data/examples/themes/jellybeans.png +0 -0
  348. data/examples/themes/jet_brains_darcula.png +0 -0
  349. data/examples/themes/jubi.png +0 -0
  350. data/examples/themes/juicy_colors.png +0 -0
  351. data/examples/themes/kanagawa.png +0 -0
  352. data/examples/themes/kanagawabones.png +0 -0
  353. data/examples/themes/kibble.png +0 -0
  354. data/examples/themes/kolorit.png +0 -0
  355. data/examples/themes/konsolas.png +0 -0
  356. data/examples/themes/lab_fox.png +0 -0
  357. data/examples/themes/laser.png +0 -0
  358. data/examples/themes/later_this_evening.png +0 -0
  359. data/examples/themes/lavandula.png +0 -0
  360. data/examples/themes/liquid_carbon.png +0 -0
  361. data/examples/themes/liquid_carbon_transparent.png +0 -0
  362. data/examples/themes/liquid_carbon_transparent_inverse.png +0 -0
  363. data/examples/themes/lovelace.png +0 -0
  364. data/examples/themes/man_page.png +0 -0
  365. data/examples/themes/mariana.png +0 -0
  366. data/examples/themes/material.png +0 -0
  367. data/examples/themes/material_dark.png +0 -0
  368. data/examples/themes/material_darker.png +0 -0
  369. data/examples/themes/material_design_colors.png +0 -0
  370. data/examples/themes/material_ocean.png +0 -0
  371. data/examples/themes/mathias.png +0 -0
  372. data/examples/themes/matrix.png +0 -0
  373. data/examples/themes/medallion.png +0 -0
  374. data/examples/themes/mellifluous.png +0 -0
  375. data/examples/themes/midnight_in_mojave.png +0 -0
  376. data/examples/themes/mirage.png +0 -0
  377. data/examples/themes/misterioso.png +0 -0
  378. data/examples/themes/molokai.png +0 -0
  379. data/examples/themes/mona_lisa.png +0 -0
  380. data/examples/themes/monokai_cmder.png +0 -0
  381. data/examples/themes/monokai_pro.png +0 -0
  382. data/examples/themes/monokai_pro_filter_octagon.png +0 -0
  383. data/examples/themes/monokai_pro_filter_ristretto.png +0 -0
  384. data/examples/themes/monokai_remastered.png +0 -0
  385. data/examples/themes/monokai_soda.png +0 -0
  386. data/examples/themes/monokai_vivid.png +0 -0
  387. data/examples/themes/moonlight_ii.png +0 -0
  388. data/examples/themes/n0tch2k.png +0 -0
  389. data/examples/themes/neobones_dark.png +0 -0
  390. data/examples/themes/neobones_light.png +0 -0
  391. data/examples/themes/neon.png +0 -0
  392. data/examples/themes/neopolitan.png +0 -0
  393. data/examples/themes/neutron.png +0 -0
  394. data/examples/themes/night_city.png +0 -0
  395. data/examples/themes/night_lion_v1.png +0 -0
  396. data/examples/themes/night_lion_v2.png +0 -0
  397. data/examples/themes/night_owlish_light.png +0 -0
  398. data/examples/themes/nightfox.png +0 -0
  399. data/examples/themes/niji.png +0 -0
  400. data/examples/themes/nocturnal_winter.png +0 -0
  401. data/examples/themes/nord.png +0 -0
  402. data/examples/themes/nord_light.png +0 -0
  403. data/examples/themes/novel.png +0 -0
  404. data/examples/themes/nvim_dark.png +0 -0
  405. data/examples/themes/nvim_light.png +0 -0
  406. data/examples/themes/obsidian.png +0 -0
  407. data/examples/themes/ocean.png +0 -0
  408. data/examples/themes/oceanic_material.png +0 -0
  409. data/examples/themes/oceanic_next.png +0 -0
  410. data/examples/themes/ollie.png +0 -0
  411. data/examples/themes/one_dark.png +0 -0
  412. data/examples/themes/one_half_dark.png +0 -0
  413. data/examples/themes/one_half_light.png +0 -0
  414. data/examples/themes/one_star.png +0 -0
  415. data/examples/themes/operator_mono_dark.png +0 -0
  416. data/examples/themes/overnight_slumber.png +0 -0
  417. data/examples/themes/pale_night_hc.png +0 -0
  418. data/examples/themes/pandora.png +0 -0
  419. data/examples/themes/paraiso_dark.png +0 -0
  420. data/examples/themes/paul_millr.png +0 -0
  421. data/examples/themes/pencil_dark.png +0 -0
  422. data/examples/themes/pencil_light.png +0 -0
  423. data/examples/themes/peppermint.png +0 -0
  424. data/examples/themes/piatto_light.png +0 -0
  425. data/examples/themes/pnevma.png +0 -0
  426. data/examples/themes/popping_and_locking.png +0 -0
  427. data/examples/themes/primary.png +0 -0
  428. data/examples/themes/primer.png +0 -0
  429. data/examples/themes/pro.png +0 -0
  430. data/examples/themes/pro_light.png +0 -0
  431. data/examples/themes/purple_rain.png +0 -0
  432. data/examples/themes/purplepeter.png +0 -0
  433. data/examples/themes/qb64_super_dark_blue.png +0 -0
  434. data/examples/themes/rapture.png +0 -0
  435. data/examples/themes/raycast_dark.png +0 -0
  436. data/examples/themes/raycast_light.png +0 -0
  437. data/examples/themes/rebecca.png +0 -0
  438. data/examples/themes/red_alert.png +0 -0
  439. data/examples/themes/red_planet.png +0 -0
  440. data/examples/themes/red_sands.png +0 -0
  441. data/examples/themes/relaxed.png +0 -0
  442. data/examples/themes/retro.png +0 -0
  443. data/examples/themes/retrowave.png +0 -0
  444. data/examples/themes/rippedcasts.png +0 -0
  445. data/examples/themes/rose_pine.png +0 -0
  446. data/examples/themes/rose_pine_dawn.png +0 -0
  447. data/examples/themes/rose_pine_moon.png +0 -0
  448. data/examples/themes/rouge_2.png +0 -0
  449. data/examples/themes/royal.png +0 -0
  450. data/examples/themes/ryuuko.png +0 -0
  451. data/examples/themes/sakura.png +0 -0
  452. data/examples/themes/scarlet_protocol.png +0 -0
  453. data/examples/themes/sea_shells.png +0 -0
  454. data/examples/themes/seafoam_pastel.png +0 -0
  455. data/examples/themes/seoulbones_dark.png +0 -0
  456. data/examples/themes/seoulbones_light.png +0 -0
  457. data/examples/themes/serendipity_midnight.png +0 -0
  458. data/examples/themes/serendipity_morning.png +0 -0
  459. data/examples/themes/serendipity_sunset.png +0 -0
  460. data/examples/themes/seti.png +0 -0
  461. data/examples/themes/shades_of_purple.png +0 -0
  462. data/examples/themes/shaman.png +0 -0
  463. data/examples/themes/slate.png +0 -0
  464. data/examples/themes/sleepy_hollow.png +0 -0
  465. data/examples/themes/smyck.png +0 -0
  466. data/examples/themes/snazzy.png +0 -0
  467. data/examples/themes/soft_server.png +0 -0
  468. data/examples/themes/solarized_darcula.png +0 -0
  469. data/examples/themes/solarized_dark_higher_contrast.png +0 -0
  470. data/examples/themes/solarized_dark_patched.png +0 -0
  471. data/examples/themes/sonoran_gothic.png +0 -0
  472. data/examples/themes/sonoran_sunrise.png +0 -0
  473. data/examples/themes/space_gray.png +0 -0
  474. data/examples/themes/space_gray_eighties.png +0 -0
  475. data/examples/themes/space_gray_eighties_dull.png +0 -0
  476. data/examples/themes/spacedust.png +0 -0
  477. data/examples/themes/spiderman.png +0 -0
  478. data/examples/themes/spring.png +0 -0
  479. data/examples/themes/square.png +0 -0
  480. data/examples/themes/sublette.png +0 -0
  481. data/examples/themes/subliminal.png +0 -0
  482. data/examples/themes/sundried.png +0 -0
  483. data/examples/themes/symfonic.png +0 -0
  484. data/examples/themes/synthwave.png +0 -0
  485. data/examples/themes/synthwave_alpha.png +0 -0
  486. data/examples/themes/synthwave_everything.png +0 -0
  487. data/examples/themes/tango_adapted.png +0 -0
  488. data/examples/themes/tango_half_adapted.png +0 -0
  489. data/examples/themes/teerb.png +0 -0
  490. data/examples/themes/terafox.png +0 -0
  491. data/examples/themes/terminal_basic.png +0 -0
  492. data/examples/themes/thayer_bright.png +0 -0
  493. data/examples/themes/the_hulk.png +0 -0
  494. data/examples/themes/theme.tape +13 -0
  495. data/examples/themes/tinacious_design_dark.png +0 -0
  496. data/examples/themes/tinacious_design_light.png +0 -0
  497. data/examples/themes/tokyo_night.png +0 -0
  498. data/examples/themes/tokyo_night_light.png +0 -0
  499. data/examples/themes/tokyo_night_storm.png +0 -0
  500. data/examples/themes/tokyonight.png +0 -0
  501. data/examples/themes/tokyonight_day.png +0 -0
  502. data/examples/themes/tokyonight_storm.png +0 -0
  503. data/examples/themes/tomorrow.png +0 -0
  504. data/examples/themes/tomorrow_night.png +0 -0
  505. data/examples/themes/tomorrow_night_blue.png +0 -0
  506. data/examples/themes/tomorrow_night_bright.png +0 -0
  507. data/examples/themes/tomorrow_night_burns.png +0 -0
  508. data/examples/themes/tomorrow_night_eighties.png +0 -0
  509. data/examples/themes/toy_chest.png +0 -0
  510. data/examples/themes/treehouse.png +0 -0
  511. data/examples/themes/twilight.png +0 -0
  512. data/examples/themes/ubuntu.png +0 -0
  513. data/examples/themes/ultra_dark.png +0 -0
  514. data/examples/themes/ultra_violent.png +0 -0
  515. data/examples/themes/under_the_sea.png +0 -0
  516. data/examples/themes/unholy.png +0 -0
  517. data/examples/themes/unikitty.png +0 -0
  518. data/examples/themes/urple.png +0 -0
  519. data/examples/themes/vaughn.png +0 -0
  520. data/examples/themes/vesper.png +0 -0
  521. data/examples/themes/vibrant_ink.png +0 -0
  522. data/examples/themes/vimbones.png +0 -0
  523. data/examples/themes/violet_dark.png +0 -0
  524. data/examples/themes/violet_light.png +0 -0
  525. data/examples/themes/warm_neon.png +0 -0
  526. data/examples/themes/wez.png +0 -0
  527. data/examples/themes/whimsy.png +0 -0
  528. data/examples/themes/wild_cherry.png +0 -0
  529. data/examples/themes/wilmersdorf.png +0 -0
  530. data/examples/themes/wombat.png +0 -0
  531. data/examples/themes/wryan.png +0 -0
  532. data/examples/themes/zenbones.png +0 -0
  533. data/examples/themes/zenbones_dark.png +0 -0
  534. data/examples/themes/zenbones_light.png +0 -0
  535. data/examples/themes/zenburn.png +0 -0
  536. data/examples/themes/zenburned.png +0 -0
  537. data/examples/themes/zenwritten_dark.png +0 -0
  538. data/examples/themes/zenwritten_light.png +0 -0
  539. data/examples/themes/zeonica.png +0 -0
  540. data/examples/tmux.mp4 +0 -0
  541. data/examples/tmux.png +0 -0
  542. data/examples/tmux.tape +28 -0
  543. data/examples/type.mp4 +0 -0
  544. data/examples/type.png +0 -0
  545. data/examples/type.tape +11 -0
  546. data/examples/type_file.mp4 +0 -0
  547. data/examples/type_file.png +0 -0
  548. data/examples/type_file.tape +23 -0
  549. data/examples/variable_typing.mp4 +0 -0
  550. data/examples/variable_typing.png +0 -0
  551. data/examples/variable_typing.tape +41 -0
  552. data/examples/wait_until.mp4 +0 -0
  553. data/examples/wait_until.png +0 -0
  554. data/examples/wait_until.tape +8 -0
  555. data/examples/zsh.mp4 +0 -0
  556. data/examples/zsh.png +0 -0
  557. data/examples/zsh.tape +4 -0
  558. data/exe/demotape +11 -0
  559. data/lib/demo_tape/bounds.rb +15 -0
  560. data/lib/demo_tape/cli.rb +158 -0
  561. data/lib/demo_tape/command.rb +341 -0
  562. data/lib/demo_tape/duration.rb +31 -0
  563. data/lib/demo_tape/exporter.rb +372 -0
  564. data/lib/demo_tape/generator.rb +17 -0
  565. data/lib/demo_tape/lexer.rb +262 -0
  566. data/lib/demo_tape/parser.rb +889 -0
  567. data/lib/demo_tape/rcs/bash +32 -0
  568. data/lib/demo_tape/rcs/fish +31 -0
  569. data/lib/demo_tape/rcs/zsh +40 -0
  570. data/lib/demo_tape/runner.rb +722 -0
  571. data/lib/demo_tape/spacing.rb +5 -0
  572. data/lib/demo_tape/spinner.rb +37 -0
  573. data/lib/demo_tape/templates/.keep +0 -0
  574. data/lib/demo_tape/theme.rb +49 -0
  575. data/lib/demo_tape/themes/3024_day.json +22 -0
  576. data/lib/demo_tape/themes/3024_night.json +22 -0
  577. data/lib/demo_tape/themes/aardvark_blue.json +22 -0
  578. data/lib/demo_tape/themes/abernathy.json +22 -0
  579. data/lib/demo_tape/themes/adventure.json +22 -0
  580. data/lib/demo_tape/themes/adventure_time.json +22 -0
  581. data/lib/demo_tape/themes/afterglow.json +22 -0
  582. data/lib/demo_tape/themes/alabaster.json +22 -0
  583. data/lib/demo_tape/themes/alien_blood.json +22 -0
  584. data/lib/demo_tape/themes/andromeda.json +22 -0
  585. data/lib/demo_tape/themes/apple_classic.json +22 -0
  586. data/lib/demo_tape/themes/apple_system_colors.json +22 -0
  587. data/lib/demo_tape/themes/arcoiris.json +22 -0
  588. data/lib/demo_tape/themes/argonaut.json +22 -0
  589. data/lib/demo_tape/themes/arthur.json +22 -0
  590. data/lib/demo_tape/themes/atelier_sulphurpool.json +22 -0
  591. data/lib/demo_tape/themes/atom.json +22 -0
  592. data/lib/demo_tape/themes/atom_one_light.json +22 -0
  593. data/lib/demo_tape/themes/aurora.json +22 -0
  594. data/lib/demo_tape/themes/ayu.json +22 -0
  595. data/lib/demo_tape/themes/ayu_light.json +22 -0
  596. data/lib/demo_tape/themes/ayu_mirage.json +22 -0
  597. data/lib/demo_tape/themes/banana_blueberry.json +22 -0
  598. data/lib/demo_tape/themes/batman.json +22 -0
  599. data/lib/demo_tape/themes/belafonte_day.json +22 -0
  600. data/lib/demo_tape/themes/belafonte_night.json +22 -0
  601. data/lib/demo_tape/themes/birds_of_paradise.json +22 -0
  602. data/lib/demo_tape/themes/blazer.json +22 -0
  603. data/lib/demo_tape/themes/blue_berry_pie.json +22 -0
  604. data/lib/demo_tape/themes/blue_dolphin.json +22 -0
  605. data/lib/demo_tape/themes/blue_matrix.json +22 -0
  606. data/lib/demo_tape/themes/bluloco_dark.json +22 -0
  607. data/lib/demo_tape/themes/bluloco_light.json +22 -0
  608. data/lib/demo_tape/themes/borland.json +22 -0
  609. data/lib/demo_tape/themes/breeze.json +22 -0
  610. data/lib/demo_tape/themes/bright_lights.json +22 -0
  611. data/lib/demo_tape/themes/broadcast.json +22 -0
  612. data/lib/demo_tape/themes/brogrammer.json +22 -0
  613. data/lib/demo_tape/themes/bubbles.json +22 -0
  614. data/lib/demo_tape/themes/builtin_dark.json +22 -0
  615. data/lib/demo_tape/themes/builtin_light.json +22 -0
  616. data/lib/demo_tape/themes/builtin_pastel_dark.json +22 -0
  617. data/lib/demo_tape/themes/builtin_solarized_dark.json +22 -0
  618. data/lib/demo_tape/themes/builtin_solarized_light.json +22 -0
  619. data/lib/demo_tape/themes/builtin_tango_dark.json +22 -0
  620. data/lib/demo_tape/themes/builtin_tango_light.json +22 -0
  621. data/lib/demo_tape/themes/c64.json +22 -0
  622. data/lib/demo_tape/themes/calamity.json +22 -0
  623. data/lib/demo_tape/themes/catppuccin_frappe.json +22 -0
  624. data/lib/demo_tape/themes/catppuccin_latte.json +22 -0
  625. data/lib/demo_tape/themes/catppuccin_macchiato.json +22 -0
  626. data/lib/demo_tape/themes/catppuccin_mocha.json +22 -0
  627. data/lib/demo_tape/themes/cga.json +22 -0
  628. data/lib/demo_tape/themes/chalk.json +22 -0
  629. data/lib/demo_tape/themes/chalkboard.json +22 -0
  630. data/lib/demo_tape/themes/challenger_deep.json +22 -0
  631. data/lib/demo_tape/themes/chester.json +22 -0
  632. data/lib/demo_tape/themes/ciapre.json +22 -0
  633. data/lib/demo_tape/themes/clrs.json +22 -0
  634. data/lib/demo_tape/themes/cobalt2.json +22 -0
  635. data/lib/demo_tape/themes/cobalt_neon.json +22 -0
  636. data/lib/demo_tape/themes/coffee_theme.json +22 -0
  637. data/lib/demo_tape/themes/contrast_light.json +22 -0
  638. data/lib/demo_tape/themes/coolnight.json +22 -0
  639. data/lib/demo_tape/themes/crayon_pony_fish.json +22 -0
  640. data/lib/demo_tape/themes/crystal_violet.json +22 -0
  641. data/lib/demo_tape/themes/cutie_pro.json +22 -0
  642. data/lib/demo_tape/themes/cyber_cube.json +22 -0
  643. data/lib/demo_tape/themes/cyber_punk2077.json +22 -0
  644. data/lib/demo_tape/themes/cyberdyne.json +22 -0
  645. data/lib/demo_tape/themes/cyberpunk.json +22 -0
  646. data/lib/demo_tape/themes/dark_pastel.json +22 -0
  647. data/lib/demo_tape/themes/dark_plus.json +22 -0
  648. data/lib/demo_tape/themes/darkermatrix.json +22 -0
  649. data/lib/demo_tape/themes/darkmatrix.json +22 -0
  650. data/lib/demo_tape/themes/darkside.json +22 -0
  651. data/lib/demo_tape/themes/dayfox.json +22 -0
  652. data/lib/demo_tape/themes/deep.json +22 -0
  653. data/lib/demo_tape/themes/default_dark.json +22 -0
  654. data/lib/demo_tape/themes/default_light.json +22 -0
  655. data/lib/demo_tape/themes/desert.json +22 -0
  656. data/lib/demo_tape/themes/dimmed_monokai.json +22 -0
  657. data/lib/demo_tape/themes/django.json +22 -0
  658. data/lib/demo_tape/themes/django_reborn_again.json +22 -0
  659. data/lib/demo_tape/themes/django_smooth.json +22 -0
  660. data/lib/demo_tape/themes/doom_one.json +22 -0
  661. data/lib/demo_tape/themes/doom_peacock.json +22 -0
  662. data/lib/demo_tape/themes/dot_gov.json +22 -0
  663. data/lib/demo_tape/themes/dracula.json +22 -0
  664. data/lib/demo_tape/themes/dracula_plus.json +21 -0
  665. data/lib/demo_tape/themes/duckbones.json +22 -0
  666. data/lib/demo_tape/themes/duotone_dark.json +22 -0
  667. data/lib/demo_tape/themes/earthsong.json +22 -0
  668. data/lib/demo_tape/themes/elemental.json +22 -0
  669. data/lib/demo_tape/themes/elementary.json +22 -0
  670. data/lib/demo_tape/themes/encom.json +22 -0
  671. data/lib/demo_tape/themes/espresso.json +22 -0
  672. data/lib/demo_tape/themes/espresso_libre.json +22 -0
  673. data/lib/demo_tape/themes/everblush.json +22 -0
  674. data/lib/demo_tape/themes/fahrenheit.json +22 -0
  675. data/lib/demo_tape/themes/fairyfloss.json +22 -0
  676. data/lib/demo_tape/themes/farmhouse_dark.json +22 -0
  677. data/lib/demo_tape/themes/farmhouse_light.json +22 -0
  678. data/lib/demo_tape/themes/fideloper.json +22 -0
  679. data/lib/demo_tape/themes/firefly_traditional.json +22 -0
  680. data/lib/demo_tape/themes/firefox_dev.json +22 -0
  681. data/lib/demo_tape/themes/firewatch.json +22 -0
  682. data/lib/demo_tape/themes/fish_tank.json +22 -0
  683. data/lib/demo_tape/themes/flat.json +22 -0
  684. data/lib/demo_tape/themes/flatland.json +22 -0
  685. data/lib/demo_tape/themes/flexoki_dark.json +22 -0
  686. data/lib/demo_tape/themes/flexoki_light.json +22 -0
  687. data/lib/demo_tape/themes/floraverse.json +22 -0
  688. data/lib/demo_tape/themes/forest_blue.json +22 -0
  689. data/lib/demo_tape/themes/framer.json +22 -0
  690. data/lib/demo_tape/themes/front_end_delight.json +22 -0
  691. data/lib/demo_tape/themes/fun_forrest.json +22 -0
  692. data/lib/demo_tape/themes/galaxy.json +22 -0
  693. data/lib/demo_tape/themes/galizur.json +22 -0
  694. data/lib/demo_tape/themes/ganyu.json +22 -0
  695. data/lib/demo_tape/themes/git_hub_dark.json +22 -0
  696. data/lib/demo_tape/themes/github.json +22 -0
  697. data/lib/demo_tape/themes/glacier.json +22 -0
  698. data/lib/demo_tape/themes/glorious.json +21 -0
  699. data/lib/demo_tape/themes/grape.json +22 -0
  700. data/lib/demo_tape/themes/grass.json +22 -0
  701. data/lib/demo_tape/themes/grey_green.json +22 -0
  702. data/lib/demo_tape/themes/gruvbox_dark.json +22 -0
  703. data/lib/demo_tape/themes/gruvbox_dark_hard.json +22 -0
  704. data/lib/demo_tape/themes/gruvbox_light.json +22 -0
  705. data/lib/demo_tape/themes/guezwhoz.json +22 -0
  706. data/lib/demo_tape/themes/h4rithd.json +22 -0
  707. data/lib/demo_tape/themes/h4rithd_com.json +22 -0
  708. data/lib/demo_tape/themes/ha_x0_r_blue.json +22 -0
  709. data/lib/demo_tape/themes/ha_x0_r_gr33_n.json +22 -0
  710. data/lib/demo_tape/themes/ha_x0_r_r3_d.json +22 -0
  711. data/lib/demo_tape/themes/hacktober.json +22 -0
  712. data/lib/demo_tape/themes/hardcore.json +22 -0
  713. data/lib/demo_tape/themes/harper.json +22 -0
  714. data/lib/demo_tape/themes/highway.json +22 -0
  715. data/lib/demo_tape/themes/hipster_green.json +22 -0
  716. data/lib/demo_tape/themes/hivacruz.json +22 -0
  717. data/lib/demo_tape/themes/homebrew.json +22 -0
  718. data/lib/demo_tape/themes/hopscotch.json +22 -0
  719. data/lib/demo_tape/themes/hopscotch_256.json +22 -0
  720. data/lib/demo_tape/themes/horizon.json +21 -0
  721. data/lib/demo_tape/themes/hurtado.json +22 -0
  722. data/lib/demo_tape/themes/hybrid.json +22 -0
  723. data/lib/demo_tape/themes/hyper.json +22 -0
  724. data/lib/demo_tape/themes/ic_green_ppl.json +22 -0
  725. data/lib/demo_tape/themes/ic_orange_ppl.json +22 -0
  726. data/lib/demo_tape/themes/iceberg_dark.json +22 -0
  727. data/lib/demo_tape/themes/iceberg_light.json +22 -0
  728. data/lib/demo_tape/themes/idea.json +22 -0
  729. data/lib/demo_tape/themes/idle_toes.json +22 -0
  730. data/lib/demo_tape/themes/ir_black.json +22 -0
  731. data/lib/demo_tape/themes/iterm2_dark_background.json +22 -0
  732. data/lib/demo_tape/themes/iterm2_default.json +22 -0
  733. data/lib/demo_tape/themes/iterm2_light_background.json +22 -0
  734. data/lib/demo_tape/themes/iterm2_pastel_dark_background.json +22 -0
  735. data/lib/demo_tape/themes/iterm2_smoooooth.json +22 -0
  736. data/lib/demo_tape/themes/iterm2_solarized_dark.json +22 -0
  737. data/lib/demo_tape/themes/iterm2_solarized_light.json +22 -0
  738. data/lib/demo_tape/themes/iterm2_tango_dark.json +22 -0
  739. data/lib/demo_tape/themes/iterm2_tango_light.json +22 -0
  740. data/lib/demo_tape/themes/jackie_brown.json +22 -0
  741. data/lib/demo_tape/themes/japanesque.json +22 -0
  742. data/lib/demo_tape/themes/jellybeans.json +22 -0
  743. data/lib/demo_tape/themes/jet_brains_darcula.json +22 -0
  744. data/lib/demo_tape/themes/jubi.json +22 -0
  745. data/lib/demo_tape/themes/juicy_colors.json +22 -0
  746. data/lib/demo_tape/themes/kanagawa.json +22 -0
  747. data/lib/demo_tape/themes/kanagawabones.json +22 -0
  748. data/lib/demo_tape/themes/kibble.json +22 -0
  749. data/lib/demo_tape/themes/kolorit.json +22 -0
  750. data/lib/demo_tape/themes/konsolas.json +22 -0
  751. data/lib/demo_tape/themes/lab_fox.json +22 -0
  752. data/lib/demo_tape/themes/laser.json +22 -0
  753. data/lib/demo_tape/themes/later_this_evening.json +22 -0
  754. data/lib/demo_tape/themes/lavandula.json +22 -0
  755. data/lib/demo_tape/themes/liquid_carbon.json +22 -0
  756. data/lib/demo_tape/themes/liquid_carbon_transparent.json +22 -0
  757. data/lib/demo_tape/themes/liquid_carbon_transparent_inverse.json +22 -0
  758. data/lib/demo_tape/themes/lovelace.json +22 -0
  759. data/lib/demo_tape/themes/man_page.json +22 -0
  760. data/lib/demo_tape/themes/mariana.json +22 -0
  761. data/lib/demo_tape/themes/material.json +22 -0
  762. data/lib/demo_tape/themes/material_dark.json +22 -0
  763. data/lib/demo_tape/themes/material_darker.json +22 -0
  764. data/lib/demo_tape/themes/material_design_colors.json +22 -0
  765. data/lib/demo_tape/themes/material_ocean.json +22 -0
  766. data/lib/demo_tape/themes/mathias.json +22 -0
  767. data/lib/demo_tape/themes/matrix.json +22 -0
  768. data/lib/demo_tape/themes/medallion.json +22 -0
  769. data/lib/demo_tape/themes/mellifluous.json +22 -0
  770. data/lib/demo_tape/themes/midnight_in_mojave.json +22 -0
  771. data/lib/demo_tape/themes/mirage.json +22 -0
  772. data/lib/demo_tape/themes/misterioso.json +22 -0
  773. data/lib/demo_tape/themes/molokai.json +22 -0
  774. data/lib/demo_tape/themes/mona_lisa.json +22 -0
  775. data/lib/demo_tape/themes/monokai_cmder.json +22 -0
  776. data/lib/demo_tape/themes/monokai_pro.json +22 -0
  777. data/lib/demo_tape/themes/monokai_pro_filter_octagon.json +21 -0
  778. data/lib/demo_tape/themes/monokai_pro_filter_ristretto.json +22 -0
  779. data/lib/demo_tape/themes/monokai_remastered.json +22 -0
  780. data/lib/demo_tape/themes/monokai_soda.json +22 -0
  781. data/lib/demo_tape/themes/monokai_vivid.json +22 -0
  782. data/lib/demo_tape/themes/moonlight_ii.json +21 -0
  783. data/lib/demo_tape/themes/n0tch2k.json +22 -0
  784. data/lib/demo_tape/themes/neobones_dark.json +22 -0
  785. data/lib/demo_tape/themes/neobones_light.json +22 -0
  786. data/lib/demo_tape/themes/neon.json +22 -0
  787. data/lib/demo_tape/themes/neopolitan.json +22 -0
  788. data/lib/demo_tape/themes/neutron.json +22 -0
  789. data/lib/demo_tape/themes/night_city.json +22 -0
  790. data/lib/demo_tape/themes/night_lion_v1.json +22 -0
  791. data/lib/demo_tape/themes/night_lion_v2.json +22 -0
  792. data/lib/demo_tape/themes/night_owlish_light.json +22 -0
  793. data/lib/demo_tape/themes/nightfox.json +22 -0
  794. data/lib/demo_tape/themes/niji.json +22 -0
  795. data/lib/demo_tape/themes/nocturnal_winter.json +22 -0
  796. data/lib/demo_tape/themes/nord.json +22 -0
  797. data/lib/demo_tape/themes/nord_light.json +22 -0
  798. data/lib/demo_tape/themes/novel.json +22 -0
  799. data/lib/demo_tape/themes/nvim_dark.json +22 -0
  800. data/lib/demo_tape/themes/nvim_light.json +22 -0
  801. data/lib/demo_tape/themes/obsidian.json +22 -0
  802. data/lib/demo_tape/themes/ocean.json +22 -0
  803. data/lib/demo_tape/themes/oceanic_material.json +22 -0
  804. data/lib/demo_tape/themes/oceanic_next.json +22 -0
  805. data/lib/demo_tape/themes/ollie.json +22 -0
  806. data/lib/demo_tape/themes/one_dark.json +21 -0
  807. data/lib/demo_tape/themes/one_half_dark.json +22 -0
  808. data/lib/demo_tape/themes/one_half_light.json +22 -0
  809. data/lib/demo_tape/themes/one_star.json +21 -0
  810. data/lib/demo_tape/themes/operator_mono_dark.json +22 -0
  811. data/lib/demo_tape/themes/overnight_slumber.json +22 -0
  812. data/lib/demo_tape/themes/pale_night_hc.json +22 -0
  813. data/lib/demo_tape/themes/pandora.json +22 -0
  814. data/lib/demo_tape/themes/paraiso_dark.json +22 -0
  815. data/lib/demo_tape/themes/paul_millr.json +22 -0
  816. data/lib/demo_tape/themes/pencil_dark.json +22 -0
  817. data/lib/demo_tape/themes/pencil_light.json +22 -0
  818. data/lib/demo_tape/themes/peppermint.json +22 -0
  819. data/lib/demo_tape/themes/piatto_light.json +22 -0
  820. data/lib/demo_tape/themes/pnevma.json +22 -0
  821. data/lib/demo_tape/themes/popping_and_locking.json +22 -0
  822. data/lib/demo_tape/themes/primary.json +22 -0
  823. data/lib/demo_tape/themes/primer.json +21 -0
  824. data/lib/demo_tape/themes/pro.json +22 -0
  825. data/lib/demo_tape/themes/pro_light.json +22 -0
  826. data/lib/demo_tape/themes/purple_rain.json +22 -0
  827. data/lib/demo_tape/themes/purplepeter.json +22 -0
  828. data/lib/demo_tape/themes/qb64_super_dark_blue.json +22 -0
  829. data/lib/demo_tape/themes/rapture.json +22 -0
  830. data/lib/demo_tape/themes/raycast_dark.json +22 -0
  831. data/lib/demo_tape/themes/raycast_light.json +22 -0
  832. data/lib/demo_tape/themes/rebecca.json +22 -0
  833. data/lib/demo_tape/themes/red_alert.json +22 -0
  834. data/lib/demo_tape/themes/red_planet.json +22 -0
  835. data/lib/demo_tape/themes/red_sands.json +22 -0
  836. data/lib/demo_tape/themes/relaxed.json +22 -0
  837. data/lib/demo_tape/themes/retro.json +22 -0
  838. data/lib/demo_tape/themes/retrowave.json +21 -0
  839. data/lib/demo_tape/themes/rippedcasts.json +22 -0
  840. data/lib/demo_tape/themes/rose_pine.json +22 -0
  841. data/lib/demo_tape/themes/rose_pine_dawn.json +22 -0
  842. data/lib/demo_tape/themes/rose_pine_moon.json +22 -0
  843. data/lib/demo_tape/themes/rouge_2.json +22 -0
  844. data/lib/demo_tape/themes/royal.json +22 -0
  845. data/lib/demo_tape/themes/ryuuko.json +22 -0
  846. data/lib/demo_tape/themes/sakura.json +22 -0
  847. data/lib/demo_tape/themes/scarlet_protocol.json +22 -0
  848. data/lib/demo_tape/themes/sea_shells.json +22 -0
  849. data/lib/demo_tape/themes/seafoam_pastel.json +22 -0
  850. data/lib/demo_tape/themes/seoulbones_dark.json +22 -0
  851. data/lib/demo_tape/themes/seoulbones_light.json +22 -0
  852. data/lib/demo_tape/themes/serendipity_midnight.json +22 -0
  853. data/lib/demo_tape/themes/serendipity_morning.json +22 -0
  854. data/lib/demo_tape/themes/serendipity_sunset.json +22 -0
  855. data/lib/demo_tape/themes/seti.json +22 -0
  856. data/lib/demo_tape/themes/shades_of_purple.json +22 -0
  857. data/lib/demo_tape/themes/shaman.json +22 -0
  858. data/lib/demo_tape/themes/slate.json +22 -0
  859. data/lib/demo_tape/themes/sleepy_hollow.json +22 -0
  860. data/lib/demo_tape/themes/smyck.json +22 -0
  861. data/lib/demo_tape/themes/snazzy.json +22 -0
  862. data/lib/demo_tape/themes/soft_server.json +22 -0
  863. data/lib/demo_tape/themes/solarized_darcula.json +22 -0
  864. data/lib/demo_tape/themes/solarized_dark_higher_contrast.json +22 -0
  865. data/lib/demo_tape/themes/solarized_dark_patched.json +22 -0
  866. data/lib/demo_tape/themes/sonoran_gothic.json +21 -0
  867. data/lib/demo_tape/themes/sonoran_sunrise.json +22 -0
  868. data/lib/demo_tape/themes/space_gray.json +22 -0
  869. data/lib/demo_tape/themes/space_gray_eighties.json +22 -0
  870. data/lib/demo_tape/themes/space_gray_eighties_dull.json +22 -0
  871. data/lib/demo_tape/themes/spacedust.json +22 -0
  872. data/lib/demo_tape/themes/spiderman.json +22 -0
  873. data/lib/demo_tape/themes/spring.json +22 -0
  874. data/lib/demo_tape/themes/square.json +22 -0
  875. data/lib/demo_tape/themes/sublette.json +22 -0
  876. data/lib/demo_tape/themes/subliminal.json +22 -0
  877. data/lib/demo_tape/themes/sundried.json +22 -0
  878. data/lib/demo_tape/themes/symfonic.json +22 -0
  879. data/lib/demo_tape/themes/synthwave.json +22 -0
  880. data/lib/demo_tape/themes/synthwave_alpha.json +22 -0
  881. data/lib/demo_tape/themes/synthwave_everything.json +22 -0
  882. data/lib/demo_tape/themes/tango_adapted.json +22 -0
  883. data/lib/demo_tape/themes/tango_half_adapted.json +22 -0
  884. data/lib/demo_tape/themes/teerb.json +22 -0
  885. data/lib/demo_tape/themes/terafox.json +22 -0
  886. data/lib/demo_tape/themes/terminal_basic.json +22 -0
  887. data/lib/demo_tape/themes/thayer_bright.json +22 -0
  888. data/lib/demo_tape/themes/the_hulk.json +22 -0
  889. data/lib/demo_tape/themes/tinacious_design_dark.json +22 -0
  890. data/lib/demo_tape/themes/tinacious_design_light.json +22 -0
  891. data/lib/demo_tape/themes/tokyo_night.json +21 -0
  892. data/lib/demo_tape/themes/tokyo_night_light.json +21 -0
  893. data/lib/demo_tape/themes/tokyo_night_storm.json +21 -0
  894. data/lib/demo_tape/themes/tokyonight.json +22 -0
  895. data/lib/demo_tape/themes/tokyonight_day.json +22 -0
  896. data/lib/demo_tape/themes/tokyonight_storm.json +22 -0
  897. data/lib/demo_tape/themes/tomorrow.json +22 -0
  898. data/lib/demo_tape/themes/tomorrow_night.json +22 -0
  899. data/lib/demo_tape/themes/tomorrow_night_blue.json +22 -0
  900. data/lib/demo_tape/themes/tomorrow_night_bright.json +22 -0
  901. data/lib/demo_tape/themes/tomorrow_night_burns.json +22 -0
  902. data/lib/demo_tape/themes/tomorrow_night_eighties.json +22 -0
  903. data/lib/demo_tape/themes/toy_chest.json +22 -0
  904. data/lib/demo_tape/themes/treehouse.json +22 -0
  905. data/lib/demo_tape/themes/twilight.json +22 -0
  906. data/lib/demo_tape/themes/ubuntu.json +22 -0
  907. data/lib/demo_tape/themes/ultra_dark.json +22 -0
  908. data/lib/demo_tape/themes/ultra_violent.json +22 -0
  909. data/lib/demo_tape/themes/under_the_sea.json +22 -0
  910. data/lib/demo_tape/themes/unholy.json +22 -0
  911. data/lib/demo_tape/themes/unikitty.json +22 -0
  912. data/lib/demo_tape/themes/urple.json +22 -0
  913. data/lib/demo_tape/themes/vaughn.json +22 -0
  914. data/lib/demo_tape/themes/vesper.json +22 -0
  915. data/lib/demo_tape/themes/vibrant_ink.json +22 -0
  916. data/lib/demo_tape/themes/vimbones.json +22 -0
  917. data/lib/demo_tape/themes/violet_dark.json +22 -0
  918. data/lib/demo_tape/themes/violet_light.json +22 -0
  919. data/lib/demo_tape/themes/warm_neon.json +22 -0
  920. data/lib/demo_tape/themes/wez.json +22 -0
  921. data/lib/demo_tape/themes/whimsy.json +22 -0
  922. data/lib/demo_tape/themes/wild_cherry.json +22 -0
  923. data/lib/demo_tape/themes/wilmersdorf.json +22 -0
  924. data/lib/demo_tape/themes/wombat.json +22 -0
  925. data/lib/demo_tape/themes/wryan.json +22 -0
  926. data/lib/demo_tape/themes/zenbones.json +22 -0
  927. data/lib/demo_tape/themes/zenbones_dark.json +22 -0
  928. data/lib/demo_tape/themes/zenbones_light.json +22 -0
  929. data/lib/demo_tape/themes/zenburn.json +22 -0
  930. data/lib/demo_tape/themes/zenburned.json +22 -0
  931. data/lib/demo_tape/themes/zenwritten_dark.json +22 -0
  932. data/lib/demo_tape/themes/zenwritten_light.json +22 -0
  933. data/lib/demo_tape/themes/zeonica.json +22 -0
  934. data/lib/demo_tape/token.rb +24 -0
  935. data/lib/demo_tape/ttyd.rb +74 -0
  936. data/lib/demo_tape/version.rb +5 -0
  937. data/lib/demo_tape.rb +30 -0
  938. data/lib/demotape.rb +3 -0
  939. metadata +1209 -0
data/README.md ADDED
@@ -0,0 +1,574 @@
1
+ # demotape
2
+
3
+ [![Tests](https://github.com/fnando/demotape/workflows/ruby-tests/badge.svg)](https://github.com/fnando/demotape)
4
+ [![Gem](https://img.shields.io/gem/v/demotape.svg)](https://rubygems.org/gems/demotape)
5
+ [![Gem](https://img.shields.io/gem/dt/demotape.svg)](https://rubygems.org/gems/demotape)
6
+ [![MIT License](https://img.shields.io/:License-MIT-blue.svg)](https://tldrlegal.com/license/mit-license)
7
+
8
+ ![DemoTape in action!](https://github.com/fnando/demotape/raw/main/examples/fastfetch.gif)
9
+
10
+ Record terminal sessions from your CLI tools
11
+
12
+ ## Dependencies
13
+
14
+ - [ffmpeg](https://ffmpeg.org/) (for video encoding)
15
+ - [ttyd](https://github.com/tsl0922/ttyd) (for terminal recording)
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ gem install demotape
21
+ ```
22
+
23
+ Or add the following line to your project's Gemfile:
24
+
25
+ ```ruby
26
+ gem "demotape"
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ Run a DemoTape script:
32
+
33
+ ```console
34
+ $ demotape run path/to/script.tape
35
+ info Running <stdin>
36
+ info Using zsh
37
+ command Type 'echo "it works with stdin too"'
38
+ command Enter
39
+ command Sleep 5
40
+ output Generating examples/stdin.mp4
41
+ info Finished in 11.92s
42
+ ```
43
+
44
+ Run from stdin:
45
+
46
+ ```console
47
+ $ echo "Type 'echo \"it works with stdin too\"'\nEnter\nSleep 5" | \
48
+ exe/demotape run --overwrite --output-path examples/stdin.mp4
49
+ info Running <stdin>
50
+ info Using zsh
51
+ command Type 'echo "it works with stdin too"'
52
+ command Enter
53
+ command Sleep 5
54
+ output Generating examples/stdin.mp4
55
+ info Finished in 11.92s
56
+ ```
57
+
58
+ ### Examples
59
+
60
+ The [`examples/`](https://github.com/fnando/demotape/tree/main/examples) folder
61
+ contains several DemoTape scripts showcasing different features. There you'll
62
+ also find the generated output files (videos, GIFs, and screenshots).
63
+
64
+ ## DemoTape Syntax
65
+
66
+ DemoTape scripts (`.tape` files) consist of a series of commands, one per line.
67
+ Each command performs an action in the terminal recording, such as typing text,
68
+ pressing keys, waiting, or configuring the recording session.
69
+
70
+ ### Basic Syntax
71
+
72
+ Commands follow this general structure:
73
+
74
+ ```text
75
+ CommandName [arguments] [options]
76
+ ```
77
+
78
+ Comments start with `#` and must be on their own line:
79
+
80
+ ```demotape
81
+ # This is a comment
82
+ # Comments must be on separate lines, not inline
83
+ Type "Hello"
84
+ ```
85
+
86
+ Empty lines are ignored and can be used for readability.
87
+
88
+ ### Commands
89
+
90
+ #### Text and Typing
91
+
92
+ **Type** - Types text into the terminal
93
+
94
+ ```demotape
95
+ Type "text"
96
+ Type@500ms "slow typing"
97
+ Type@2s "very slow"
98
+ Type@10ms "fast typing"
99
+ ```
100
+
101
+ Strings must be quoted (double or single quotes). Speed modifiers (e.g.,
102
+ `@500ms`) control how fast each character is typed. Supported time units: `ms`
103
+ (milliseconds), `s` (seconds), `m` (minutes), `h` (hours).
104
+
105
+ **Multiline strings** - Use triple quotes for multiline text:
106
+
107
+ ```demotape
108
+ Type """
109
+ echo "Type 'echo \"multiline support\"'"
110
+ echo "Line breaks are preserved"
111
+ """
112
+ ```
113
+
114
+ Content between `"""` markers preserves line breaks and spacing. This is useful
115
+ for typing multiple commands or complex text that spans several lines.
116
+
117
+ **TypeFile** - Reads file and types its text into the terminal
118
+
119
+ ```demotape
120
+ TypeFile "text"
121
+ TypeFile@500ms "slow typing"
122
+ TypeFile@2s "very slow"
123
+ TypeFile@10ms "fast typing"
124
+ ```
125
+
126
+ #### Keys and Key Combinations
127
+
128
+ - **Special keys:** `Backspace`, `Delete`, `End`, `Enter`, `Escape`, `Home`,
129
+ `Insert`, `PageDown` `PageUp`, `Space`, `Tab`
130
+ - **Arrow keys:** `Up`, `Down`, `Left`, `Right`
131
+ - **Function keys:** `F1`-`F12`
132
+ - **Modifier keys:** `Alt`, `Command` `Control`/`Ctrl`, `Meta`, `Option`,
133
+ `Shift`
134
+
135
+ ##### Key Combinations
136
+
137
+ You can combine modifier keys with special keys using `+`:
138
+
139
+ ```demotape
140
+ Ctrl+C
141
+ Alt+F
142
+ Shift+Enter
143
+ Ctrl+Shift+T
144
+ Command+Space
145
+ Ctrl+Alt+Delete
146
+ ```
147
+
148
+ ##### Key Counts
149
+
150
+ You can specify how many times to press a key by adding a number after the key.
151
+
152
+ ```demotape
153
+ Enter 3
154
+ Space 5
155
+ Backspace 10
156
+ Ctrl+C 2
157
+ ```
158
+
159
+ #### Timing and Waiting
160
+
161
+ **Wait**/**Sleep** - Pause for a specific duration
162
+
163
+ ```demotape
164
+ Wait 1
165
+ Wait 2s
166
+ Wait 500ms
167
+ Wait 1.5s
168
+ Wait 2m
169
+ Wait 1h
170
+
171
+ Sleep 1
172
+ Sleep 2s
173
+ Sleep 500ms
174
+ Sleep 1.5s
175
+ Sleep 2m
176
+ Sleep 1h
177
+ ```
178
+
179
+ When no time unit is specified, seconds are assumed.
180
+
181
+ **WaitUntil** - Wait for output matching a pattern
182
+
183
+ ```demotape
184
+ WaitUntil /pattern/
185
+ WaitUntil@5s /ready/
186
+ WaitUntil@10s /complete/
187
+ ```
188
+
189
+ The pattern is a regular expression. The command waits until the terminal output
190
+ matches the pattern or the timeout is reached.
191
+
192
+ #### Clipboard
193
+
194
+ **Copy** - Copy text to clipboard
195
+
196
+ ```demotape
197
+ Copy "text to copy"
198
+ ```
199
+
200
+ **Paste** - Paste from clipboard
201
+
202
+ ```demotape
203
+ Paste
204
+ ```
205
+
206
+ #### Recording Control
207
+
208
+ **Output** - Set output file path(s)
209
+
210
+ ```demotape
211
+ Output "recording.mp4"
212
+ Output "demo.gif"
213
+ Output "demo.webm"
214
+ Output "demo.mov"
215
+ ```
216
+
217
+ You can specify multiple Output commands to generate multiple formats:
218
+
219
+ ```demotape
220
+ Output "demo.gif"
221
+ Output "demo.mp4"
222
+ Output "demo.webm"
223
+ ```
224
+
225
+ **Screenshot** - Take a screenshot
226
+
227
+ ```demotape
228
+ Screenshot
229
+ Screenshot "screenshot.png"
230
+ ```
231
+
232
+ Notes:
233
+
234
+ - when called without a path, if there's exactly one screenshot, then the name
235
+ will be inferred from the output path (e.g. `video.png`).
236
+ - when called without a path, if more than one screenshot is taken, than the
237
+ filename will be inferred from the output path plus a screenshot count (e.g.
238
+ `video-01.png`).
239
+ - if more than one output path was specified, then a screenshot will be saved in
240
+ each of those paths.
241
+
242
+ **Pause** - Pause recording
243
+
244
+ ```demotape
245
+ Pause
246
+ ```
247
+
248
+ **Resume** - Resume recording
249
+
250
+ ```demotape
251
+ Resume
252
+ ```
253
+
254
+ #### Screen Control
255
+
256
+ **Clear** - Clear the terminal screen
257
+
258
+ ```demotape
259
+ Clear
260
+ ```
261
+
262
+ **Send** - Send raw text to terminal, with no typing effect
263
+
264
+ ```demotape
265
+ Send "raw text"
266
+ ```
267
+
268
+ #### Configuration
269
+
270
+ `Set` commands configure the recording session. These are typically placed at
271
+ the beginning of the file, but don't have to; they're executed before executing
272
+ other commands. Last definitions will replace previous ones.
273
+
274
+ **Display Dimensions**
275
+
276
+ ```demotape
277
+ Set width 1280
278
+ Set height 720
279
+ ```
280
+
281
+ **Font Settings**
282
+
283
+ ```demotape
284
+ Set font_family "Menlo"
285
+ Set font_size 16
286
+ Set line_height 1.5
287
+ ```
288
+
289
+ **Appearance**
290
+
291
+ ```demotape
292
+ Set theme "default"
293
+ Set theme "default_light"
294
+ Set theme "themes/some_theme.json"
295
+ ```
296
+
297
+ You can also override specific theme colors using dot notation:
298
+
299
+ ```demotape
300
+ Set theme.background "#222222"
301
+ Set theme.foreground "#ffffff"
302
+ Set theme.cursor "#00ff00"
303
+ Set theme.selection "#444444"
304
+ ```
305
+
306
+ **Spacing**
307
+
308
+ ```demotape
309
+ Set padding 20
310
+ Set padding 20, 40
311
+ Set padding 10, 20, 30
312
+ Set padding 10, 20, 30, 40
313
+ Set margin 60
314
+ Set margin 20, 40
315
+ Set margin 10, 20, 30
316
+ Set margin 10, 20, 30, 40
317
+ Set margin_fill "#6b50ff"
318
+ Set margin_fill "examples/background.png"
319
+ ```
320
+
321
+ Padding can be specified with 1-4 values: uniform (all sides), vertical and
322
+ horizontal, top/horizontal/bottom, or top/right/bottom/left.
323
+
324
+ Margin works the same way as padding but adds outer space around the terminal
325
+ window. MarginFill sets the background color (hex color) or image (file path)
326
+ for the margin area.
327
+
328
+ **Cursor**
329
+
330
+ ```demotape
331
+ Set cursor_blink true
332
+ Set cursor_blink false
333
+ Set cursor_style "block"
334
+ Set cursor_style "bar"
335
+ Set cursor_style "underline"
336
+ Set cursor_width 2
337
+ ```
338
+
339
+ **Typing Speed**
340
+
341
+ ```demotape
342
+ Set typing_speed 50ms
343
+ Set typing_speed 0.1s
344
+ ```
345
+
346
+ **GIF Animation Loops**
347
+
348
+ ```demotape
349
+ Set loop true
350
+ Set loop false
351
+ Set loop_delay 5s
352
+ ```
353
+
354
+ **Shell**
355
+
356
+ ```demotape
357
+ Set shell bash
358
+ Set shell zsh
359
+ Set shell fish
360
+ ```
361
+
362
+ #### Script Organization
363
+
364
+ **Include** - Include another tape file
365
+
366
+ ```demotape
367
+ Include "other.tape"
368
+ Include "examples/setup.tape"
369
+ ```
370
+
371
+ **Require** - Require a command to be available
372
+
373
+ ```demotape
374
+ Require "git"
375
+ Require "ll"
376
+ ```
377
+
378
+ ### Data Types
379
+
380
+ #### Strings
381
+
382
+ Strings must be quoted with double or single quotes:
383
+
384
+ ```demotape
385
+ Type "Hello, World!"
386
+ Type 'Hello, World!'
387
+ ```
388
+
389
+ Both double-quoted and single-quoted strings support escape sequences.
390
+
391
+ Escape sequences in quoted strings:
392
+
393
+ ```demotape
394
+ Type "Line 1\nLine 2"
395
+ Type "Tab\there"
396
+ Type "Quote: \"text\""
397
+ Type "Backslash: \\"
398
+ Type "Unicode: \u0041"
399
+ Type "Emoji: \U0001F600"
400
+ ```
401
+
402
+ Supported escape sequences: `\n` (newline), `\t` (tab), `\"` (quote), `\\`
403
+ (backslash), `\u` (4-digit Unicode), `\U` (8-digit Unicode).
404
+
405
+ #### Numbers
406
+
407
+ Numbers can be integers or decimals:
408
+
409
+ ```demotape
410
+ Sleep 1
411
+ Sleep 1.5s
412
+ Set width 1920
413
+ Set typing_speed 0.05s
414
+ ```
415
+
416
+ #### Durations
417
+
418
+ Durations consist of a number followed by a time unit:
419
+
420
+ ```demotape
421
+ 500ms
422
+ 2s
423
+ 1.5s
424
+ 5m
425
+ 1h
426
+ ```
427
+
428
+ Valid time units: `ms`, `s`, `m`, `h`
429
+
430
+ #### Regular Expressions
431
+
432
+ Regular expressions are enclosed in forward slashes:
433
+
434
+ ```demotape
435
+ WaitUntil /complete/
436
+ WaitUntil /error|failed/
437
+ WaitUntil /line \d+/
438
+ ```
439
+
440
+ #### Booleans
441
+
442
+ Boolean values for Set commands:
443
+
444
+ ```demotape
445
+ Set loop true
446
+ Set loop false
447
+ ```
448
+
449
+ ### Modifiers
450
+
451
+ #### Speed Modifier (@)
452
+
453
+ Controls typing speed for Type commands and key presses:
454
+
455
+ ```demotape
456
+ Type@100ms "text"
457
+ Enter@500ms
458
+ Ctrl+C@1s
459
+ Backspace@50ms 5
460
+ ```
461
+
462
+ #### Timeout Modifier (@)
463
+
464
+ Sets timeout for WaitUntil commands:
465
+
466
+ ```demotape
467
+ WaitUntil@5s /pattern/
468
+ WaitUntil@30s /ready/
469
+ ```
470
+
471
+ ### Complete Example
472
+
473
+ ```demotape
474
+ # Configure the recording
475
+ Output "demo.mp4"
476
+ Output "demo.gif"
477
+
478
+ Set width 1280
479
+ Set height 720
480
+ Set font_family "Monaco"
481
+ Set font_size 14
482
+ Set theme "default"
483
+ Set padding 20
484
+
485
+ # Start recording
486
+ Sleep 1
487
+
488
+ Type "echo 'Hello, DemoTape!'"
489
+ Enter
490
+ Sleep 500ms
491
+
492
+ Type "ls -la"
493
+ Enter
494
+ Sleep 1s
495
+
496
+ # Use key combinations
497
+ Ctrl+C
498
+ Sleep 500ms
499
+
500
+ # Type slowly for emphasis
501
+ Type@200ms "This is slow typing"
502
+ Enter
503
+ Sleep 2s
504
+
505
+ # Wait for command completion
506
+ Type "npm install"
507
+ Enter
508
+ WaitUntil@60s /packages installed/
509
+
510
+ # Take a screenshot
511
+ Screenshot "final.png"
512
+
513
+ Sleep 1s
514
+ ```
515
+
516
+ ### Valid Commands Reference
517
+
518
+ - **Typing**: `Type`, `TypeFile`
519
+ - **Special Keys**: `Enter`, `Space`, `Tab`, `Backspace`, `Escape`, `Delete`,
520
+ `Insert`, `Home`, `End`, `PageUp`, `PageDown`, `Up`, `Down`, `Left`, `Right`,
521
+ `F1-F12`
522
+ - **Modifiers**: `Shift`, `Control`/`Ctrl`, `Alt`/`Option`, `Meta`/`Command`
523
+ - **Timing**: `Sleep`, `Wait`, `WaitUntil`
524
+ - **Clipboard**: `Copy`, `Paste`
525
+ - **Recording**: `Output`, `Screenshot`, `Pause`, `Resume`
526
+ - **Screen**: `Clear`, `Send`
527
+ - **Configuration**: `Set`
528
+ - **Organization**: `Include`, `Require`
529
+
530
+ ### Notes
531
+
532
+ - Commands are case-sensitive (e.g., `Type`, not `type`)
533
+ - Each command must be on its own line
534
+ - Trailing whitespace is allowed but not required
535
+ - Comments start with `#` and must be on their own line (inline comments not
536
+ supported)
537
+ - Empty lines are ignored
538
+
539
+ ## Acknowledgements
540
+
541
+ This project is heavily inspired by [vhs](https://github.com/charmbracelet/vhs)
542
+ and was created to provide similar functionality in Ruby, while solving some
543
+ quirks and adding some extra features.
544
+
545
+ > [!WARNING]
546
+ >
547
+ > The syntax is not fully compatible with vhs. Although some commands are
548
+ > similar, there are many differences. Please refer to the DemoTape syntax
549
+ > documentation above.
550
+
551
+ ## Maintainer
552
+
553
+ - [Nando Vieira](https://github.com/fnando)
554
+
555
+ ## Contributors
556
+
557
+ - https://github.com/fnando/demotape/contributors
558
+
559
+ ## Contributing
560
+
561
+ For more details about how to contribute, please read
562
+ https://github.com/fnando/demotape/blob/main/CONTRIBUTING.md.
563
+
564
+ ## License
565
+
566
+ The gem is available as open source under the terms of the
567
+ [MIT License](https://opensource.org/licenses/MIT). A copy of the license can be
568
+ found at https://github.com/fnando/demotape/blob/main/LICENSE.md.
569
+
570
+ ## Code of Conduct
571
+
572
+ Everyone interacting in the demotape project's codebases, issue trackers, chat
573
+ rooms and mailing lists is expected to follow the
574
+ [code of conduct](https://github.com/fnando/demotape/blob/main/CODE_OF_CONDUCT.md).
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+ require "rubocop/rake_task"
6
+
7
+ Rake::TestTask.new(test: :parser) do |t|
8
+ t.libs << "test"
9
+ t.libs << "lib"
10
+ t.test_files = FileList["test/**/*_test.rb"]
11
+ end
12
+
13
+ RuboCop::RakeTask.new
14
+
15
+ task :parser do
16
+ sh "racc demotape.y -o lib/demo_tape/parser.rb"
17
+ end
18
+
19
+ task default: %i[parser test rubocop]
data/bin/console ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "demo_tape"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ begin
11
+ require "pry"
12
+ Pry.start
13
+ rescue LoadError
14
+ require "irb"
15
+ IRB.start(__FILE__)
16
+ end
data/bin/setup ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail
4
+
5
+ IFS=$'\n\t'
6
+ set -vx
7
+
8
+ bundle install
9
+
10
+ # Do any other automated setup that you need to do here
data/bin/themes ADDED
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+
6
+ def normalize(text)
7
+ text
8
+ .to_s
9
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
10
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
11
+ .downcase
12
+ .tr("-", "_")
13
+ .tr(" ", "_")
14
+ .gsub("+", "_plus")
15
+ .gsub(/[^a-z0-9_]/, "_").squeeze("_")
16
+ .gsub(/_$/, "")
17
+ .gsub(/^_/, "")
18
+ .gsub("i_term", "iterm")
19
+ end
20
+
21
+ system("wget -q -O themes.json https://2zrysvpla9.execute-api.eu-west-2.amazonaws.com/prod/themes")
22
+ list = JSON.load_file("themes.json", symbolize_names: true)
23
+
24
+ list.each do |item|
25
+ item.delete(:meta)
26
+ name = normalize(item.delete(:name))
27
+ item.transform_keys! { normalize(it).to_sym }
28
+ item[:magenta] = item.delete(:purple)
29
+ item[:bright_magenta] = item.delete(:bright_purple)
30
+ item[:cursor] = item.delete(:cursor_color)
31
+
32
+ item = item.sort_by {|k, _v| k.to_s }.to_h
33
+
34
+ File.open("lib/demo_tape/themes/#{name}.json", "w") do |io|
35
+ io << JSON.pretty_generate(item)
36
+ end
37
+ end
data/demotape.ascii ADDED
@@ -0,0 +1,19 @@
1
+ 
2
+ 
3
+ ██████╗ ███████╗███╗   ███╗ ██████╗
4
+ ██╔══██╗██╔════╝████╗ ████║██╔═══██╗
5
+ ██║  ██║█████╗  ██╔████╔██║██║   ██║
6
+ ██║  ██║██╔══╝  ██║╚██╔╝██║██║   ██║
7
+ ██████╔╝███████╗██║ ╚═╝ ██║╚██████╔╝
8
+ ╚═════╝ ╚══════╝╚═╝     ╚═╝ ╚═════╝
9
+ 
10
+  ████████╗ █████╗ ██████╗ ███████╗
11
+  ╚══██╔══╝██╔══██╗██╔══██╗██╔════╝
12
+     ██║   ███████║██████╔╝█████╗
13
+     ██║   ██╔══██║██╔═══╝ ██╔══╝
14
+     ██║   ██║  ██║██║     ███████╗
15
+     ╚═╝   ╚═╝  ╚═╝╚═╝     ╚══════╝
16
+ 
17
+        Create terminal video
18
+     captures from your CLI tools
19
+