From a9e1e71e1f27729f8a19fbaafdd9155bedec2548 Mon Sep 17 00:00:00 2001
From: Michael Kohl
Date: Wed, 2 Oct 2019 15:39:19 +0000
Subject: [PATCH] Add Asciinema Liquid tag (#4152)
* Add Asciinema Liquid tag
Closes #4135
* Fix Iframe URL
* Remove unnecessary regex modifier
* Re-add accidentally deleted closing tag and set iframe height
* Improve error message for invalid ID
Co-Authored-By: Andy Zhao
---
app/liquid_tags/asciinema_tag.rb | 32 +++++++++++++++++++++
app/views/liquids/_asciinema.html.erb | 8 ++++++
app/views/pages/_editor_guide_text.html.erb | 3 ++
spec/liquid_tags/asciinema_tag_spec.rb | 21 ++++++++++++++
4 files changed, 64 insertions(+)
create mode 100644 app/liquid_tags/asciinema_tag.rb
create mode 100644 app/views/liquids/_asciinema.html.erb
create mode 100644 spec/liquid_tags/asciinema_tag_spec.rb
diff --git a/app/liquid_tags/asciinema_tag.rb b/app/liquid_tags/asciinema_tag.rb
new file mode 100644
index 000000000..a28d9e5b7
--- /dev/null
+++ b/app/liquid_tags/asciinema_tag.rb
@@ -0,0 +1,32 @@
+class AsciinemaTag < LiquidTagBase
+ PARTIAL = "liquids/asciinema".freeze
+
+ def initialize(tag_name, id, tokens)
+ super
+ @id = parse_id(id)
+ end
+
+ def render(_context)
+ ActionController::Base.new.render_to_string(
+ partial: PARTIAL,
+ locals: {
+ id: @id
+ },
+ )
+ end
+
+ private
+
+ def parse_id(input)
+ input_no_space = input.delete(" ")
+ raise StandardError, "Invalid Asciinema ID: {% asciinema #{input_no_space} %}" unless valid_id?(input_no_space)
+
+ input_no_space
+ end
+
+ def valid_id?(id)
+ id.match?(/\A\d+\Z/)
+ end
+end
+
+Liquid::Template.register_tag("asciinema", AsciinemaTag)
diff --git a/app/views/liquids/_asciinema.html.erb b/app/views/liquids/_asciinema.html.erb
new file mode 100644
index 000000000..a583aac3f
--- /dev/null
+++ b/app/views/liquids/_asciinema.html.erb
@@ -0,0 +1,8 @@
+
+
+
diff --git a/app/views/pages/_editor_guide_text.html.erb b/app/views/pages/_editor_guide_text.html.erb
index 0467863f5..57a250037 100644
--- a/app/views/pages/_editor_guide_text.html.erb
+++ b/app/views/pages/_editor_guide_text.html.erb
@@ -321,6 +321,9 @@
{% stackexchange 170185 diy %}
+ Asciinema Embed
+ All you need is the Asciinema id:
+ {% asciinema 239367 %}
Parsing Liquid Tags as a Code Example
To parse Liquid tags as code, simply wrap it with a single backtick or triple backticks.
`{% mytag %}{{ site.SOMETHING }}{% endmytag %}`
diff --git a/spec/liquid_tags/asciinema_tag_spec.rb b/spec/liquid_tags/asciinema_tag_spec.rb
new file mode 100644
index 000000000..bd19e4cbe
--- /dev/null
+++ b/spec/liquid_tags/asciinema_tag_spec.rb
@@ -0,0 +1,21 @@
+require "rails_helper"
+
+RSpec.describe AsciinemaTag, type: :liquid_template do
+ describe "#id" do
+ let(:valid_id) { "1234" }
+ let(:invalid_id) { "inv@lid" }
+
+ def generate_tag(id)
+ Liquid::Template.register_tag("asciinema", AsciinemaTag)
+ Liquid::Template.parse("{% asciinema #{id} %}")
+ end
+
+ it "rejects invalid ids" do
+ expect { generate_tag(invalid_id) }.to raise_error(StandardError)
+ end
+
+ it "accepts a valid id" do
+ expect { generate_tag(valid_id) }.not_to raise_error
+ end
+ end
+end