X-Git-Url: https://git.draconx.ca/gitweb/homepage.git/blobdiff_plain/f4a242c7d6f647387767f2a4b3ac2ce215384bd7..86d0dac7b5713b9d312dd8fea8da80132829d6e6:/lib/helpers.rb diff --git a/lib/helpers.rb b/lib/helpers.rb index c9a1cc3..cc0bf04 100644 --- a/lib/helpers.rb +++ b/lib/helpers.rb @@ -16,9 +16,11 @@ # along with this program. If not, see . require 'nokogiri' +require 'fastimage' -use_helper Nanoc::Helpers::Breadcrumbs use_helper Nanoc::Helpers::Blogging +use_helper Nanoc::Helpers::Breadcrumbs +use_helper Nanoc::Helpers::Rendering Xmlns = { 'xhtml' => 'http://www.w3.org/1999/xhtml' @@ -75,6 +77,81 @@ def counter(name = :default, item = @item) name.to_s.capitalize + " " + ($counters[item][name] += 1).to_s end +def img_rep_fallback(item, rep) + return rep unless item.reps[rep].raw_path.nil? + return :large +end + +def item_to_img(item, rep: :large, alt: nil, caption: nil) + unless item + return "[image not found]" + end + + alt ||= item[:title] + caption ||= alt + caption = caption.strip + caption.gsub!(/\s+/, " ") + + rep = img_rep_fallback(item, rep) + attrs = { :src => item_uri(item, rep: rep), :alt => item[:title] } + attrs[:width], attrs[:height] = FastImage.size(item.reps[rep].raw_path) + + b = Nokogiri::XML::Builder.new do |xml| + xml.a(:href => item_uri(item, rep: :info)) { + xml.img(attrs) + unless caption.empty? + xml << " ⁠" + xml.small { + xml << caption + } + end + } + end + b.to_xml(:save_with => Nokogiri::XML::Node::SaveOptions::NO_DECLARATION) +end + +def expand_copyright(copyright) + result = { :years => {} } + + /^([-–[:digit:][:space:],]*)(.*)$/.match(copyright) do |m| + m[1].split(/\s*,\s*/).each do |range| + lo, hi = range.split(/[^[:digit:]]+/) + for y in (lo..hi||lo) + result[:years][y] = 1 + end + end + + result[:years] = result[:years].keys.sort + result[:name] = m[2] + return result + end + + return nil +end + +def path_to_rep(path) + @items.find_all(File::dirname(path) + "/*").each do |item| + item.reps.each do |rep| + return rep if rep.path == path + end + end + return nil +end + +def find_images(item = @item) + return [] if item.binary? + + result = {} + doc = Nokogiri::HTML(item.compiled_content(snapshot: :pre)) + doc.xpath("//img/@src").each do |imgsrc| + rep = path_to_rep(imgsrc.value) + if rep + result[rep.item.identifier] ||= rep.item + end + end + return result.values +end + def human_filesize(size) units = ["B", "KiB", "MiB", "GiB"] prec = 0 @@ -90,3 +167,7 @@ def human_filesize(size) sprintf("%.*f %s", prec, size + 0.05, unit) end + +def license_shortname(item) + item.fetch(:shortname, File::basename(item.identifier.without_ext).upcase) +end