class Jekyll::WebMonetization::Tag

Public Instance Methods

render(context) click to toggle source
# File lib/jekyll/web_monetization/tag.rb, line 7
def render(context)
  site_payment_pointer = context.registers[:site].config["payment_pointer"]
  page_payment_pointer = context.registers[:page]["payment_pointer"] || site_payment_pointer
  if page_payment_pointer.is_a?(Array) 
    pointers_with_weights = array_to_object(page_payment_pointer)
    return javascript(pointers_with_weights)
  elsif page_payment_pointer.is_a?(Hash)
    return javascript(page_payment_pointer)
  elsif page_payment_pointer.is_a?(String)
    "<meta name='monetization' content='#{page_payment_pointer}'>"
  end
end

Private Instance Methods

array_to_object(pointers) click to toggle source
# File lib/jekyll/web_monetization/tag.rb, line 22
def array_to_object(pointers)
  pointers.reduce({}) { |acc, pointer| acc[pointer] = 1; acc }
end
javascript(pointers_with_weights) click to toggle source
# File lib/jekyll/web_monetization/tag.rb, line 26
      def javascript(pointers_with_weights)
        sum = pointers_with_weights.reduce(0) { |acc, (pointer, weight)| acc + weight }
        pointers = JSON.generate(pointers_with_weights)
        script = <<~JAVASCRIPT
          <script>
            (function() {
              function pickPointer(pointers, sum) {
                let choice = Math.random() * sum;
                for (const pointer in pointers) {
                  const weight = pointers[pointer];
                  if ((choice -= weight) <= 0) {
                    return pointer;
                  }
                }
              }
            
              window.addEventListener("load", function() {
                const tag = document.createElement("meta");
                tag.name = "monetization";
                tag.content = pickPointer(#{pointers}, #{sum});
                document.head.appendChild(tag);
              });
            })();
          </script>
        JAVASCRIPT
      end