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