# frozen_string_literal: true require 'nokogiri' class OPML PROPERTIES = %w[title date_created date_modified owner_name owner_email docs].freeze attr_accessor :title, :date_created, :date_modified, :owner_name, :owner_email, :docs def initialize(&block) instance_eval(&block) @docs = 'http://dev.opml.org/spec2.html' @outlines = [] end def camel_case(str) str.downcase.split('_').each_with_index.map do |v, i| i.zero? ? v : v.capitalize end.join end def add_outline(params) params = Hash[params.map { |k, v| [camel_case(k.to_s), v] }] @outlines.push params end def add_note_with_params(xml, attrs) attrs.each do |attr| val = send(attr.to_sym) key = camel_case(attr).to_sym xml.send(key, val) if val end end def xml Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml| xml.opml(version: '2.0') do xml.head do add_note_with_params xml, PROPERTIES end xml.body do xml.outline text: 'GitHub Releases' do @outlines.each do |outline| xml.outline outline end end end end end.to_xml end end