Как я могу использовать regex для создания вызова API в моем плагине Jekyll? - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь написать свой собственный плагин Jekyll для создания API-запроса из пользовательского тега. Я дошел до создания плагина и тега basi c, но я столкнулся с ограничениями своих навыков программирования, поэтому обращаюсь к вам за помощью.

Вот мой пользовательский тег для справки:

{% card "Arbor Elf | M13" %}

Вот прогресс на моем плагине:

module Jekyll
    class Scryfall < Liquid::Tag

        def initialize(tag_name, text, tokens)
            super
            @text = text
        end 

        def render(context)
            # Store the name of the card, ie "Arbor Elf"
            @card_name = 

            # Store the name of the set, ie "M13"
            @card_set = 

            # Build the query
            @query = "https://api.scryfall.com/cards/named?exact=#{@card_name}&set=#{@card_set}"

            # Store a specific JSON property
            @card_art = 

            # Finally we render out the result
            "<img src='#{@card_art}' title='#{@card_name}' />"
        end

    end
end

Liquid::Template.register_tag('cards', Jekyll::Scryfall)

Для справки, вот пример запроса с использованием вышеуказанных деталей (вставьте его в браузер, чтобы увидеть ответ, который вы получите обратно)

https://api.scryfall.com/cards/named?exact=arbor+elf&set=m13

Мои первые попытки после Googling заключались в использовании регулярного выражения для разбиения @text на |, например, так:

@card_name = "#{@text}".split(/| */)

Вместо этого это не сработало это выводит это:

[“A”, “r”, “b”, “o”, “r”, “ “, “E”, “l”, “f”, “ “, “|”, “ “, “M”, “1”, “3”, “ “]

Я также тогда не уверен, как получить доступ и сохранить определенные c свойства в ответе JSON. В идеале, я могу сделать что-то вроде этого:

@card_art = JSONRESPONSE.image_uri.large

Я хорошо знаю, я здесь много спрашиваю, но я бы хотел попытаться заставить это работать и учиться у него.

Спасибо за чтение.

1 Ответ

0 голосов
/ 17 марта 2020

На самом деле, ваш split должен работать - вам просто нужно дать ему правильное регулярное выражение (и вы можете вызвать его на @text напрямую). Вы также должны экранировать символ канала в регулярном выражении, потому что каналы могут иметь особое значение. Вы можете использовать rubular.com для экспериментов с регулярными выражениями.

parts = @text.split(/\|/)
# => => ["Arbor Elf ", " M13"]

Обратите внимание, что они также содержат некоторые дополнительные пробелы, которые можно удалить с помощью strip.

@card_name = parts.first.strip
@card_set  = parts.last.strip

Это также подходящее время для ответов на такие вопросы, как: что произойдет, если пользователь вставит несколько каналов? Что если они не вставят ничего? Ваш код даст им полезное сообщение об ошибке для этого?

Вам также нужно будет экранировать эти значения в своем URL. Что если один из ваших пользователей добавит карточку, содержащую & символ ? Ваш URL будет ломаться:

https://api.scryfall.com/cards/named?exact=Sword of Dungeons & Dragons&set=und

Это похоже на URL с тремя параметрами: exact, set и Dragons. Вам необходимо закодировать пользовательский ввод, который будет включен в URL:

require 'cgi'
query = "https://api.scryfall.com/cards/named?exact=#{CGI.escape(@card_name)}&set=#{CGI.escape(@card_set)}"
# => "https://api.scryfall.com/cards/named?exact=Sword+of+Dungeons+%26+Dragons&set=und"

Что будет после этого немного менее понятно, потому что вы еще не написали код. Попробуйте выполнить вызов с помощью модуля Net::HTTP, а затем проанализируйте ответ с помощью модуля JSON. Если у вас возникли проблемы, вернитесь сюда и задайте новый вопрос.

...