jekyll-feed-0.3.1/0000755000175000017500000000000012540452645013551 5ustar uwabamiuwabamijekyll-feed-0.3.1/.rspec0000644000175000017500000000003212540452645014661 0ustar uwabamiuwabami--color --format progress jekyll-feed-0.3.1/script/0000755000175000017500000000000012540452645015055 5ustar uwabamiuwabamijekyll-feed-0.3.1/script/bootstrap0000755000175000017500000000003512540452645017016 0ustar uwabamiuwabami#! /bin/bash bundle install jekyll-feed-0.3.1/script/release0000755000175000017500000000012512540452645016421 0ustar uwabamiuwabami#!/bin/sh # Tag and push a release. set -e script/cibuild bundle exec rake release jekyll-feed-0.3.1/script/cibuild0000755000175000017500000000010612540452645016413 0ustar uwabamiuwabami#! /bin/bash set -e bundle exec rspec gem build jekyll-feed.gemspec jekyll-feed-0.3.1/.gitignore0000644000175000017500000000030212540452645015534 0ustar uwabamiuwabami/vendor /.bundle/ /.yardoc /Gemfile.lock /_yardoc/ /coverage/ /doc/ /pkg/ /spec/reports/ /tmp/ *.bundle *.so *.o *.a mkmf.log *.gem Gemfile.lock spec/dest .bundle spec/fixtures/.jekyll-metadata jekyll-feed-0.3.1/LICENSE.txt0000644000175000017500000000205312540452645015374 0ustar uwabamiuwabamiCopyright (c) 2015 Ben Balter MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. jekyll-feed-0.3.1/jekyll-feed.gemspec0000644000175000017500000000177412540452645017322 0ustar uwabamiuwabami# coding: utf-8 Gem::Specification.new do |spec| spec.name = "jekyll-feed" spec.version = "0.3.1" spec.authors = ["Ben Balter"] spec.email = ["ben.balter@github.com"] spec.summary = "A Jekyll plugin to generate an Atom feed of your Jekyll posts" spec.homepage = "https://github.com/jekyll/jekyll-feed" spec.license = "MIT" spec.files = `git ls-files -z`.split("\x0") spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) spec.require_paths = ["lib"] spec.add_development_dependency "jekyll", ">= 2.4.0", "< 3.1.0" spec.add_development_dependency "bundler", "~> 1.6" spec.add_development_dependency "rake", "~> 10.0" spec.add_development_dependency "rspec", "~> 3.0" spec.add_development_dependency "typhoeus", "~> 0.7" spec.add_development_dependency "nokogiri", "~> 1.6" spec.add_development_dependency "jekyll-last-modified-at", "0.3.4" end jekyll-feed-0.3.1/lib/0000755000175000017500000000000012540452645014317 5ustar uwabamiuwabamijekyll-feed-0.3.1/lib/jekyll-feed.rb0000644000175000017500000000463712540452645017051 0ustar uwabamiuwabamirequire 'fileutils' module Jekyll class PageWithoutAFile < Page def read_yaml(*) @data ||= {} end end class FeedMetaTag < Liquid::Tag def config @context.registers[:site].config end def path if config["feed"] && config["feed"]["path"] config["feed"]["path"] else "feed.xml" end end def url if config["url"] config["url"] elsif config["github"] && config["github"]["url"] config["github"]["url"] end end def render(context) @context = context "" end end class JekyllFeed < Jekyll::Generator safe true priority :lowest # Path to feed from config, or feed.xml for default def path if @site.config["feed"] && @site.config["feed"]["path"] @site.config["feed"]["path"] else "feed.xml" end end # Main plugin action, called by Jekyll-core def generate(site) @site = site @site.config["time"] = Time.new unless feed_exists? write @site.keep_files ||= [] @site.keep_files << path end end # Path to feed.xml template file def source_path File.expand_path "feed.xml", File.dirname(__FILE__) end # Destination for feed.xml file within the site source directory def destination_path if @site.respond_to?(:in_dest_dir) @site.in_dest_dir(path) else Jekyll.sanitized_path(@site.dest, path) end end # copy feed template from source to destination def write FileUtils.mkdir_p File.dirname(destination_path) File.open(destination_path, 'w') { |f| f.write(feed_content) } end def feed_content site_map = PageWithoutAFile.new(@site, File.dirname(__FILE__), "", path) site_map.content = File.read(source_path).gsub(/\s*\n\s*/, "\n").gsub(/\n{%/, "{%") site_map.data["layout"] = nil site_map.render(Hash.new, @site.site_payload) site_map.output end # Checks if a feed already exists in the site source def feed_exists? if @site.respond_to?(:in_source_dir) File.exists? @site.in_source_dir(path) else File.exists? Jekyll.sanitized_path(@site.source, path) end end end end Liquid::Template.register_tag('feed_meta', Jekyll::FeedMetaTag) jekyll-feed-0.3.1/lib/feed.xml0000644000175000017500000000553412540452645015753 0ustar uwabamiuwabami {% if site.url %} {% assign url_base = site.url | append: site.baseurl %} {% else %} {% assign url_base = site.github.url %} {% endif %} Jekyll {{ site.time | date_to_xmlschema }} {{ url_base | xml_escape }}/ {% if site.name %} {{ site.name | xml_escape }} {% endif %} {% if site.description %} {{ site.description | xml_escape }} {% endif %} {% if site.author %} {% if site.author.name %} {{ site.author.name | xml_escape }} {% else %} {{ site.author | xml_escape }} {% endif %} {% if site.author.email %} {{ site.author.email | xml_escape }} {% endif %} {% if site.author.uri %} {{ site.author.uri | xml_escape }} {% endif %} {% endif %} {% for post in site.posts limit: 10 %} {{ post.title | markdownify | strip_html | strip_newlines | xml_escape }} {{ post.date | date_to_xmlschema }} {% if post.last_modified_at %} {{ post.last_modified_at | date_to_xmlschema }} {% else %} {{ post.date | date_to_xmlschema }} {% endif %} {{ post.id | prepend: url_base | xml_escape }} {{ post.content | markdownify | xml_escape }} {% if post.author %} {% if post.author.name %} {{ post.author.name | xml_escape }} {% else %} {{ post.author | xml_escape }} {% endif %} {% if post.author.email %} {{ post.author.email | xml_escape }} {% endif %} {% if post.author.uri %} {{ post.author.uri | xml_escape }} {% endif %} {% endif %} {% if post.category %} {% endif %} {% for tag in post.tags %} {% endfor %} {% if post.excerpt and post.excerpt != blank %} {{ post.excerpt | markdownify | strip_html | strip_newlines | xml_escape }} {% endif %} {% endfor %} jekyll-feed-0.3.1/.travis.yml0000644000175000017500000000056312540452645015666 0ustar uwabamiuwabamilanguage: ruby rvm: - 2.1 - 2.2 - 2.0 - 1.9 script: "script/cibuild" before_script: bundle update cache: bundler sudo: false matrix: exclude: - rvm: 1.9 env: JEKYLL_VERSION=3.0.0.beta5 - env: JEKYLL_VERSION=2.4 rvm: 2.1 - rvm: 2.2 env: JEKYLL_VERSION=2.4 env: matrix: - "" - JEKYLL_VERSION=2.4 - JEKYLL_VERSION=3.0.0.beta5 jekyll-feed-0.3.1/Rakefile0000644000175000017500000000016512540452645015220 0ustar uwabamiuwabamirequire "bundler/gem_tasks" require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) task :default => :spec jekyll-feed-0.3.1/spec/0000755000175000017500000000000012540452645014503 5ustar uwabamiuwabamijekyll-feed-0.3.1/spec/spec_helper.rb0000644000175000017500000000105012540452645017315 0ustar uwabamiuwabamirequire 'jekyll' require 'typhoeus' require 'nokogiri' require 'rss' require File.expand_path('../lib/jekyll-feed', File.dirname(__FILE__)) Jekyll.logger.log_level = :error RSpec.configure do |config| config.run_all_when_everything_filtered = true config.filter_run :focus config.order = 'random' SOURCE_DIR = File.expand_path("../fixtures", __FILE__) DEST_DIR = File.expand_path("../dest", __FILE__) def source_dir(*files) File.join(SOURCE_DIR, *files) end def dest_dir(*files) File.join(DEST_DIR, *files) end end jekyll-feed-0.3.1/spec/fixtures/0000755000175000017500000000000012540452645016354 5ustar uwabamiuwabamijekyll-feed-0.3.1/spec/fixtures/feeds/0000755000175000017500000000000012540452645017442 5ustar uwabamiuwabamijekyll-feed-0.3.1/spec/fixtures/feeds/atom.xml0000644000175000017500000000014312540452645021122 0ustar uwabamiuwabami--- --- jekyll-feed-0.3.1/spec/fixtures/_my_collection/0000755000175000017500000000000012540452645021353 5ustar uwabamiuwabamijekyll-feed-0.3.1/spec/fixtures/_my_collection/custom_permalink.md0000644000175000017500000000006312540452645025250 0ustar uwabamiuwabami--- permalink: /permalink/ --- # Custom permalink jekyll-feed-0.3.1/spec/fixtures/_my_collection/custom_permalink_2.md0000644000175000017500000000010312540452645025464 0ustar uwabamiuwabami--- permalink: /permalink/unique_name.html --- # Unique html name jekyll-feed-0.3.1/spec/fixtures/_my_collection/test.html0000644000175000017500000000003612540452645023217 0ustar uwabamiuwabami--- --- This is just a test. jekyll-feed-0.3.1/spec/fixtures/some-subfolder/0000755000175000017500000000000012540452645021302 5ustar uwabamiuwabamijekyll-feed-0.3.1/spec/fixtures/some-subfolder/this-is-a-subpage.html0000644000175000017500000000003412540452645025407 0ustar uwabamiuwabami--- --- This is a subpage! jekyll-feed-0.3.1/spec/fixtures/some-subfolder/test_index.html0000644000175000017500000000012112540452645024330 0ustar uwabamiuwabami--- --- The permalink of this page does not end with a '/', but with a filename jekyll-feed-0.3.1/spec/fixtures/some-subfolder/exclude-this-page.html0000644000175000017500000000005212540452645025475 0ustar uwabamiuwabami--- sitemap: false --- Exclude this page jekyll-feed-0.3.1/spec/fixtures/some-subfolder/this-is-a-subfile.html0000644000175000017500000000000012540452645025403 0ustar uwabamiuwabamijekyll-feed-0.3.1/spec/fixtures/jekyll-last-modified-at/0000755000175000017500000000000012540452645022767 5ustar uwabamiuwabamijekyll-feed-0.3.1/spec/fixtures/jekyll-last-modified-at/page.html0000644000175000017500000000005612540452645024572 0ustar uwabamiuwabami--- --- This is a page with a modified time. jekyll-feed-0.3.1/spec/fixtures/_posts/0000755000175000017500000000000012540452645017663 5ustar uwabamiuwabamijekyll-feed-0.3.1/spec/fixtures/_posts/2013-12-12-dec-the-second.md0000644000175000017500000000005312540452645024010 0ustar uwabamiuwabami--- --- # December the twelfth, actually. jekyll-feed-0.3.1/spec/fixtures/_posts/2015-05-18-author-detail.md0000644000175000017500000000016712540452645024010 0ustar uwabamiuwabami--- author: name: Ben uri: "http://ben.balter.com" email: ben@example.com --- # December the twelfth, actually. jekyll-feed-0.3.1/spec/fixtures/_posts/2014-03-02-march-the-second.md0000644000175000017500000000003312540452645024345 0ustar uwabamiuwabami--- --- March the second! jekyll-feed-0.3.1/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md0000644000175000017500000000011112540452645025642 0ustar uwabamiuwabami--- --- Please don't modify this file. It's modified time is important. jekyll-feed-0.3.1/spec/fixtures/_posts/2015-05-12-pre.html0000644000175000017500000000006512540452645022367 0ustar uwabamiuwabami--- author: Pat ---
Line 1
Line 2
Line 3
jekyll-feed-0.3.1/spec/fixtures/_posts/2014-03-04-march-the-fourth.md0000644000175000017500000000006112540452645024404 0ustar uwabamiuwabami--- tags: - '"/>' --- March the fourth! jekyll-feed-0.3.1/spec/fixtures/_posts/2014-05-11-exclude-this-post.md0000644000175000017500000000010412540452645024606 0ustar uwabamiuwabami--- sitemap: false --- This post should not appear in the sitemap. jekyll-feed-0.3.1/spec/fixtures/_config.yml0000644000175000017500000000022212540452645020477 0ustar uwabamiuwabamitimezone: UTC gems: - jekyll-last-modified-at defaults: - scope: path: "" type: page values: layout: some_default jekyll-feed-0.3.1/spec/fixtures/index.html0000644000175000017500000000010212540452645020342 0ustar uwabamiuwabami--- --- HERE IS MY SITE I AM SO EXCITED TO BE USING GITHUB PAGES jekyll-feed-0.3.1/spec/fixtures/_layouts/0000755000175000017500000000000012540452645020213 5ustar uwabamiuwabamijekyll-feed-0.3.1/spec/fixtures/_layouts/some_default.html0000644000175000017500000000016112540452645023546 0ustar uwabamiuwabami--- --- {% feed_meta %} THIS IS MY LAYOUT {{ content }} jekyll-feed-0.3.1/spec/fixtures/images/0000755000175000017500000000000012540452645017621 5ustar uwabamiuwabamijekyll-feed-0.3.1/spec/fixtures/images/hubot.png0000644000175000017500000015137012540452645021457 0ustar uwabamiuwabamiPNG  IHDR":9gAMA asRGB cHRMz&u0`:pQ<bKGDIDATx{Tg.:oN2WNHq;q(Z VcXR4mzB B>&}{k=Kn21oπğyB!ß׸Uxt/ˁ5w:KX5uՇe ` ]XF.ҦFȡXX|Q7:bFk?ug ?8`Iƺ>4qO,N˥_Zi-]7KOɺ6\o{F~:w.cQBP?_ZZjፆ jtX5cW֯~0 @`ɨoa ,Xt/a hL̤j&`% JvMWcW]IJ! S3rI-Embfi&M#A~]_?Xtol7T /Yø"caBGeFRDw]G,>h6#̟(>чK1w9 7]?{4Ě}Lch!=kIdT膪fh_S - $QfCS xpM]?շ,AKe+誢\&t#fݦ 7CRjTMLVCi3NC6% 5i3\_t5ijqC@5lR'lg4Y`^TBcM+% ,$ukʹd#o7v]Pvv}uSiBW:yai;=?>uI&NjzfU^֋뺞b>` o'y@GemdO/a let$0W(S+;hVGݑ'~/h@xX~7pC];=ӱ=Ug+ǍE[~%\S2]G!A[38׍-4#R;:#eR^VTߴkM^< ^hl9A7HŃxءh=[F…Wȯ GJJ0[̹M=Σcg?{OjABaM9KajK ,G\@H!h]Yo/P?q)FpAF j(a╠V"SdЫ%5(qhZgg{"й?ѶzSRdDMFDKT|`X60ZnpLPqOcAc&zz WBv-46rF@V¢kW"I xԠR @ƫaao _6kscYe=FPDB?s|ɭ`N""a L?k%- "DXNœK b-\Xpԃp) j+&C\"d&~ ^-]Rkd|ؠw7FWH $ UQ]pӛ߳kRT(_fס/h tXpϙ z `JF$2O%}‡dIщ:lU;%dU>aW4tr[:BhQpTcLZqi*`aHb)齆ifd7}H{(dH s)aI 1"YeL='HxY @DdE PcAG" [7Oh1:vy81E'/럧`Loxꗢ՗ooOӓIz}/fsji#ǣ!!a.x%c\O.! ,5,L00G'1ArJ:aLP`~V".#T"pq]K&CY~-#d\!y̼cZ{ ;!qtҬЅąv>ۘ|fې$09+s=pEGzs+R?mkĩc)66͟g~(n0.hd )QDz K/FJވ{U P{´rjv.[yuoD3v]tŽ3TMDB* {Bt`YəAJJjz,aF5\ j&z,z]0[.>^`g~ nJ!!g"׍8L4I.b0S%`u?'X \Dl1-A&O*$ YQ:m6R,^ܜ1UuH*HXXw-wG$#AJPߠv݈_dC7 fR"dΙD=*}8q=`޳fד{/8|\Sxe|t4ֱcE#,vrl<[o"k_juO[ F ^oL;R?~2I!. fՕ̐#YKsr z_͙W&p%tvFF;;C[4bى Q#vً3ZQ `JHR0c7T?)T!l%D `3wEu5Û~#~5O 䧦WuJ]Gia$HvhL`]jρ/X hأ Ep$Q׃rsXb`ᯘ6SrDboXìZ_{ 6]ѴT〨? ˽߁cSմe'+,Ps^i*O2(tl*M
 ={ISSZE9%%5C.!.R;'쨄Ϣq0&'PVG}$c]QMUI* _i/?Sk<0N( 'Zoo˻}Ku٥5t}?}:B@`pȁ|D 'I}I%`jXNTY {#]aUѓInzv_L4U`}WML[{b%ٍ1So7UҺۃ%"&¾dأ ͤ0hщbq+CD IҿU"p20 ]o&(F.kЦ* r]WzWi?ֱy~Dn|>I*` ގ0G 0a.vjaX$_k:L60p8/\}V3U4I7%F{lA*4!H򫴘8y~~AʹOf")X ɜTZljG7^/(%IWI9?eDT׼Dk;GOLu>]u7]2,Ï[&:8c%5Bve'跪١]~)ԸW8~TB׭؁*%ھ8T :~oG$nĒ҃afOt Tn/ )W yK44 ׅ$T @%~XaX IաXQ HJHILJNֲ/˲ELD k~xo7\dž楚}\.ca(@3"2hQ5=zvDWP=6J2 'i; &(8 ]ìŀH*B |V JNrЁBgfO$ja_}b>.Q R|2%L4'k Z- JfH6#n K$X%@62ď)VNrUtނE څ颞_1 ^QTCb]y{DG 0OMk|vz:n2Hd7l=4LN K%${YApqCw~+}Yu\9n&$uFVk-! O!TQ<$BRoH&SK-JDzDw*U0بds57uy잏[rPqOx`?fMNK2*s[޽˽gBnKX͏ ƀFX- I@f,(7UfY?=Z"wTH]jzqoHM&J&Gxid0; 5k-MDP6ְZ,b%=1Uce) FMx5 &豇dPQ JЕ S˭;zR61-\r*'7fdlh[2{7w\ 䜮-8^AKx+ok ߪr)&|hҐicW>9o%\1-[ä*cΓD7he00~`/xYeYM+(,ŏjD?L]TձͶ#YR"wvnDSM`̸=Ʈ`tAhvq~jBeHL%\xJSBvmeM?Yj֐#^}ڦl}s)xT+Hn.'/:~\s̃U]op,ZbP5;] f*9%g=%|zIݮ4y1\Js24XrQŲ<q< 8AxsRڈiiݜD*Z[c Qx|@5 u4{]ONr,1yWȱB~x3<5TFt92(Nd4k9;͹hEeJҲV97F$DAI`d=xYex=6w!G>EeF8aI`LɬFr1nJpn֖Kkc.K r1d_;V_ڳbL@h)߯_Ծ/-FMy@ݦ?;fCO4WQFOcۗu2G j4)[J߮)[k١?x2w"O\ڟ8l&dN+GnzHc$,5qArx-ДR@I"yI@lH py!dp Hxe^Y7x('\x ,0n0hHwbώ/[57ဪ LgJGddyZ\n֋,'HTGz@so]JфL[w=Rh؝HMgEʧg1C$:wdIw93. KQ4O9r#0"x$""v2$X p",rO2 x@1"bF@!xQ ?[%'Bgg=HpVHērxcB<^6lϊܞ p p3DyKguQٗne3 =7 ۃyp=KMokyFYWz|El,o;NbxM@A$+98@œ% DHqwq܀ p|DzCA,qp pL,-yYK$ D1a=ȠnOs֋hE>~*m`YExxg$2H1:')wyw:A;*ݟp]-*:VKGoX'~ 7^%-T TԣlXZ6J$3{׼ʌl?HnJ}F Ȳ[HYoGUH1$"u  xd GhD$\&xٍbۢ&xE+]x;qxu"*10gɈ,'3NyzyV t c;M$p aA W8p%1j fm&s︚F6V1* Hڽ#&kR>```h$l*3Lo:OftoB8/^ƭY?}P$A??VGKKby떟  (XeYH9ƃ G# (+^&+8mGz ^э=ޙ$?XeGS iw- d7mL@`D]X|9_z5*0$#+3ZӚ+UTSR-j}_z;M#e s@c-{Vr̪R :k|{+\+ʘmY3ejVꜦ3jsՀWw;5s0C lQ(‰|?_;4 Կ`he/fap׈Q /YzD伵_L3YCq4뱻.0|d/2;?A |g-`i5X4դ}Dlf+IdKPot A`avP#tZDZvV\G+-lcWڕ`Ab 6b0֫o-9TFO<'[ܗlĕyp C+Xˤ;rs~8M}W >0I^@K"EZeQC&gIvCwad#w"-8YyX&PY)3Yy쒒u;Ji`Dɝ2#ӳ'U|1jwws1`WAsY0±l7woO *`r,l`Zj2vT8~_Ho̪@6,ɏs* 4fcEƱ*[wG0_CRf~F2zcC K"UA x lZȤ-5tb%=EFO@z<2L)wk&*<)Xts?`5x±ظ*!+ XQD災k'6-fTpi 4PWsyƅZQ udX0܊(ng2-z"[o6h(b,1"G  q  ^# &Dh)V =aZB dEKG &E!\(No/ΗK0u06cw>XQ"Eɲ7&zO1kN>R>JPMƑ WUL3%_X ETa iM;k#M ULvj3UPɭkr;+88WQT2 n1tGXyx wUFrKFӸ.AvroY:2Z R,-fl-MztPK?םtȬ14eRA_ c]pv\r'7'K`3ȫKcv/ ~9~L`(mxvF wIY-_٭|jÕ#?{N| UWTWlg_\DC9FY%Z>{*ʁ*gczrrqGȧ M]28E_WU#iA`Q.'B2pb}FZID`)NF1nrsü;Pbx43=OW}xGȰ,%%'#1C,饥;*{6BPq烥[)ݝ.{?]ess^wړE S͘ϧ=kvIDx]9jO5~Gwɮݱ{%'PVKqcsv*v6aw,{ExP~>H`ssnfe P싲VQ3.}`GΪ:GV)yYtM?zសbՍ 9u2;aG+Jw'n<0ă9S@a%@,Pq5RMx`{vXA)=9|rTg*QoL4dtx5c!kF JɰHfzr]Nnb-bN}ZtI7ӨďZ5 _\{-:0[t&fLv2@C٣;~Ol]Q{8-Q#<%;,]{蒽҈ ˜Ot!Or|9P=:^m"878pp3o\`$rjx^`t |)9ƞ>nBFa#˵y6 T:gw kּu"}EAON fof9ǀ+&8"Ÿ3iHfk%uuՖn큇مw߮fx&f|4 Q 1$Ol%Q^&3ymܗgJ+w )s0dL}nJDz3n؁@PYd_%!,29s9|rş~7x\U& t0J >e>γNfXq^X<ϹYz}~B%QYdS+c5ԸfW/\'.(3 ,+=Īܞ۞UvTтLEVV =Vzײ|w 613S=&h|w;STΪͣ/9x#UiY%ibm^w~|.57y;q IMo\݊aM@ 2M;x5Ssm׳7-=Yl`1\ݔcLv0vCO>G_w 6N>y!b/xb7 !0 g2YWˁ=ͤKJ˹#ܙLya:'8=qp}"b49ZPX6.=yZCo=_ ,S{.F T5ނ^qbutzF~evEf[VbS{m_l.|ӓ:=jǹѻ.5a_t—K6p_: f95ԓUv➟JwO,CExOt&g.j6N}LȹA!LK8>fG稏{runnpN*TpJ 9c],۴qS9tRq {:'rPG+ieNo[%.PmG="pH6x8L)!2ܻE'Z [ bXw|gu2&`wyrΪo 5 ,-i`Bh}W4[&Ԍ r6]VyڅtNG0zhNgw$3`}v:sEXv}S9>s7.P2O/Y.QpQd8ng۸/:.":H7Oeu>;_P x|O]FR^yޫwttw|§'Ӧ<ΈLaѿT(9aX]"{-f99;;?<5x< o wY̾MDd_IP(%")@]˳CK'NR6K>~Pnk 79@T2G-Ճw/i!c.+;NlS uxsԌr29-SRn;bK,| K-ug>Gg~i7;=.aRf'E}ఱ༉o#Ys1b9"g8 h|,\@@&n̸¢Wz-b&xus\8@r of?9Jvu ytIf+ՓvCBNY } cyDžxw y^yنU:^w\ ἥI|p GseZÒt~u=ٙ0~4sJop?P Sq;`EBWZeWX!(&@kAc4!6,g'9Xɹ]vٍ)1xT'rL)0S#DI~6~oǨOwLy6O~gJ?6cʓ6ʓI#i"&Gf32J!тWƒ099d8+#]ξMܹͬ >vҮ6 NdmN]Ű />:IKeΆ2ەr4V;Z*\-6.ypqB5~GcjXo0c ), e68iZʅ*gҩ=_ u\,B%79Z9<N&@Lspe]^0  SFjy )N,*8`;l{eYG  ~ +ܧdRt~挖NYˠE7n8KEwM sKvb(1ډ>+G603p-Wzj J$K lĪ!VF?`N B |Fǁ5wź52cNX׉O4tuS~<vn+3d,  `iDB?g?RZ;|Wdcl rpYJb貘+ }Z+|,ڧuMol݉g/l:9h:)uLI )4IG{+ci1E#pq%Ã1']"Slog/4TΔͥ_ruvHh@5XgC k&$B9c8=h+i +/|tS%P\a߽4꟒y_75[ɽi* *,DC;gnu,$q2ág!hdΓE3=.`&cv`I˯P8%Yg9z˷OWyƁ)U?|2Bbnf|"M:2F+ ɹɂGc \N2r]ϧ8-sRmw]`]xE &1L;Gzz%[8XHlՄ&(-7wUL+ `$-{W7-7iNx aǦ!wgoYR;%bb8+FbXܖȘsXcƐO,h!:ӧ>u'ߌn@frȲ { \) ûe+rHPd4Xʌ0oO߁Q4ijzdy+Jt% u@WaXɓֿzgWX(u8وp="J`aCPq"cww=jg76nΏ9{pr#ҡ*W:RnfIr[M prOm)*ɳAyLA57Id)!ɍzE ` DH!@#5eM9N&=jp;-#ǡє섁3X'sL IAI 3$?DnJt#B^1␀(9E>hL y/5 ]+|g_|zӓu9ۙ$C8!L i /B0X] i_W,f۷V4.9?ܿIc rG`eϏ_;Thr$!f3͕EdHCN jJ~(~D#C rIlt̼/1E| -JS"Wd!0X$@ ъ 'OW_$`P` 9,n)ǰDa"c. K$x"R3X`,˔NMY\,ZW-iIjWꄋ]M&HpqT?$&LS!C۵Ta 9uͶq`&0#W#~f[XU5~) YzN|l+e͉c>>ȮyzRAZW<$ */Xe s*eF=̘75 iE.D&5ӀQ7)gxNF@R0,c0p+`- s\,^9HJvჍ-^yѵCxȭ$ 1Qm-h jQAxvhIzc 'Or,V k X7XXn{hxG%{ˎUj"ɍcnq`Z67SBJ)NWAQ܃'1 Q# B[hHx+6y }\G&b4a)!Ƥd,+2QČVgGvN7_D LXA ƁKX1y˹8&% 7 _}񊧦U6<9cRS QIl':cؾtٍG+X45i7-f/+~$pvg}q `sL: ;ܱa2^ݔ gR0&s+/E)jgp,bd,<$"\%$%%qPka4 c>BH(H5HQ=b^ eX恃H3o5Eq@"n\;+.*-..=x1Mgs}S{`{f|j֬{y_̺w~҅ͥJ'~WM0oYQF[u{G0hX8E1, c?H!U%egfe*([2f섉&u]}9y3xhΌ{/>>էʗf/ymޚ>(c%lYv+b}ܻ݉N:&|qO1Paw>/^U6I&O eZoWz-kԺDȝKJ3B1vł̉[S, &I! +prk k=jmlZfbvo0HE닏m,|i"Fp|QD`zgX D](:x sy9 Z2G!O{2eN3/|r#>4fČgfܬ/[ oL -kܻۗCF5_zdC׵ .(w{BypN.'V l6BSq 4(+NqgPB2`1Vb"%!髋-y\ M `- 0NJqy,;#d 5j,dxxrChԇV<=E3_X8GמֳQ6H}dWo߿{Ŕëk^sw`/=u>P/GCp^2P:ި͈lbkcEZLiJ 2VllHSlqn $axX\ 0 d#Da`,%nNUmtjӘ>VfoXkkԬX#FGF_?9I] MXUdΖY-"x#!\CVޗ fE7ewKNK*>}1\]WɏFd%}JGWfP Tz1V"xDؕ Ić@>~ [Arpj^u!NNJbCDH~v UWPuv}kX_Xi}';+c> \q%pWT~z%<Dƍ6ax-KcF5~y3"a{ N GT iMc5Ht4ȔxX `M`%#R;QklY?Z8a˩A6Lf҃ @+]ILpp5Wd4q[ ֑r*obI.7T1`YoW;*1pOKVSyƩ4qfg `/:^ظԆO&j -| h"lp)-3 0J7霎uȲiJWNq"U"U ` ܘV'N DܧWSQE U֙L[)~K%ۅ7X7FD޳{I x 5v0EjH PdЃ jq3p:&#\׻X/k8@tLXLFsPD‘n"rсFs騑EknkɥvufT'Q*gOk@UG\r)/ R.k@ f n*w4W;3VrX'h(Om,W ™E1N\т^ :k|%s@-8''l)d8$H"9uK2/@` ( 3>zCd效LsEåRi- `g֒Z8M몏Ұˌ=j|S@̑ R4Td|-NΛ$Za8$B#A#6Xv,r"Ȅwk^b %!˚Ò[,"z vKp"ڬKpWɒ6YJ ma~Ǜc,oοǷTY=t bkWMG&p6u-J̟q d߽,*/U&!Wav0YE%xŚݭ<3.MRB"cR-Y:+7o`Ach{9"8[.1dqIbB-h`kV g[nWCեq/!(M #u5?U#J  ŮSL3߯?kud#% ?qbѪ xXAx*۱X-25b)b<A⋶2-#Ńást'+?( .@(ύ5f Ym_ :yiKa`o.IvHeZ_T:O+<GL [:4dk-U6k+JooB`9VeD7$EI"R/&S?% 2fȡ:g# h#ȜzIeD/&#*"HI >D:@f<(7@/?Z- 5JʫǷ<,X S~ XWGShod7\b,RV n 3RJ8GA7sb)Yia{!clsXbz^]/`REJDWP`b%ϠX>rC3%Sx X#̡Ŏu )$~G:ClUU?*w&=}VFj"&Of$L.1?(ej8 aPx@ǫ3*R"F jP%0GZuE5¤놌_znTC7V] ,ul`A1N`2SvvO8 O̰L:679B}K^rkNbs~ͣ/F /fC:_5̈́ qW#M,I@ 5O׺5v,Xr{(8Az%yc@W#qŻ]5LC,]'uSk:Baut^oLl-m͉oˉm-T^_rlƢo׍::R*7M/'wrVͣߘzn3lޥDG)`a}oﮠ~ ,V!bZm_,^E/=!Iw פyW,TΖ^*?Xw{3<)]Y8i.v%8e3ye[^W(N~pa,?;@eXw!-MotF`5U]X'$:6UEOI0nܖu%L,4Ҙ$xawO|j$jY4Unɳ{XZ":0Jy7X:Jvţ-d3gzV\YEc/}K3ID @E2xx(;XXI!XRoP Qz|w-ԕRsk}c}}[?έ|=6 wR{ھS,ii Z [t`ҜՎ#]eS:JbC4[3ū * av̔TozWyytQɜ1fs;"w rLE/x̂'̉1+Qsp| >ݞ1 =sKϯ~z=5߯N_v㛥Kmؾ^bzDx:Ve;Vi;ZqoӏV!hYԯ-d5VXv5<]֑jrBXXao 5{5X^=WrwK f6/zZ$*wɑ=T (Jcd,w2ּH #7fS7jәU3t'D=N)'IeobΘⱏYzKrv'>ȸ䲇2-Z5UoָOS9l2ۥ =l0nZԗ gKIVkmՎCTj۾Ŏk,Ӹ!s$ Ȋ^h9jj UͿd*`,7c@2 N,0NnĆeĬT!O2$'R" RtеQxnC;dBO֝L6ȦQLuIgܨ1s2K'>˿䏛9=-OS>7~ɌKmM|# Y [ ](4-o5W;S9 $ |QE4NBDVSf h6U3]J)>說+O~w6]WF{'3zk%%hJ$ HG?d+-,Yö3MX J=~{#۶uf *Ao8$U#VN?X5t~z-3j)ʿ{Ty%Rﹻp.RvVc??択I>_::ł'<͛jcK<ٓ',wgi}yqGzU.f]q0QuXjK]jub (QxWʹv,=Bu_n\aqKԸnʑHv/Xl{sŰM8-G?$*[Hf<=~TmP?Z~KFqrđ(A2 FX !`7;$SJѹ9H~4FIwyx#o@'h艏8|1kq~s1qc̻!D/f}z*fbr+gG\Wrٯn8ݗkf2퓘Bg?n< q5yvV+,GsK:j(8M<݉'k׶w懕oe_~&HƲMeÛGy|$9SgmňdYgM$NR:VzR{s%8s>X2ܒO.3x4)|%w!swO\X8~:)IGOzd_|?*sW?&6,lqUG/f4`Xp `'X+F\:~ákf9S9߯뛷3NԌuqiJ G+X2# g'pƪ~6ITۮRY.75Vg ;K$-r"+3Ȳv|ZK*_=d*om)Z* ޶a-,޾KG*ؖ @7sMe|K9R8Rn;Zn?RTlTD*i-Újk2`5-7-q4-u,PGRG2-5ts5EmĦ*o9J,P%{;X+}ցJs;X. VjhXЇkK-ej\b[C+G@+0cD\vÍ+@9i:?~{p?u;8!u}DHEzS;c*XikB뉍$H.M x pFk?Te;\dވȈ5{cqa)

u ?rG n+̾m[W;e,\+f߲|yZ>?+ư\3n]>3X9cYw,}Yr Z>Un]9>\uʙr+`ͼyՌ[̸o]>kw,y>Y376̿_:I쏚7:aN ˋ0OWdCqVLjXq+`r]M_+Q d[d$Fްָĉ0Z6pU\C%wB~ζ鴺'gEC?sߙnY1n[mԺeCVjSWkճZ3 Y=kꙸV0 [~b?Xt3wg߶z֭Qn]6ַgYl޺h`e=oyiKۖ˨Q97c7f^i{ez|꾌'=~WÓNL[0>mnGޢ Fޕ?rr#'d^6;lghgHw0.ߐ" \AxѾc|f3rBވ G?jԱfM1I39yd,7|ɼ5/Fsn[1vެ;ޝ=hVθmٌ*r͕3- wI{Ȏ sO y*(wvJF߳bTCpш/ƐE8jES1\N5-KClCwr+@OO?:䃅Eg~_+{Z>_fgٜۖln[趷Y0l lxaF3\OoۂIYҧN ?|B1!}C+M_ysuȀHZ\Ӣ+TeRPl iȰ^)I(f |$zdx.κyGf}mh$:M==aqrX=̐cyAհ\'l~ªC@&(p?Cę)d~iA_[,XfgB\SF6M5,W0ޢ>y)޼;V߫gk5Ҭ2]>_r0}VΜAރ#l% MaʰEM-y<)L͒Ȁ{cqI8+GIpdB(d4%5a >SyY yng{@*(GgӌaymOQ6N9)rX6ni6[ݞa;N͖a餇Xsy;M IwH;;t:A9F"kQmHQUpI *!0]-tU+9'ˆJ7SӍk)Ϡ@`Vz ThhѾ7_:qJ4ds _1kYCVj`\Eϻm['_3sJn](Ur~ka|dCbqȳ>` #$Q&{ J2͑3"/a2ܳg_sˑ'9ٶq%f&Otz~Ө/46gufH\5O7q nne t׌;%u]QAOф~ٴB56=hO$X +)l7àb .VHU4cfdX(.$bH<17όz lF{NV5٥nlf⌎v}dWv5?y*8]}w7yUK$t#hi5p3npj[QünĹcێo_͏>y{憊{ּ2j yK*rO/V>gdܑesFV+/X2dC팋3qa5CA;4o䴻JΝ3O'~ǎmmmhTQC$SDg:k9cmZ-Xsɠ|X8pL뒈^~ Яar-M-1U?ysѠ*OFxDN[s'#r2,'RO>+5 BtŚ:w,"Gވ7iRôf&=,;@pj~Jwt3 wn-j_4P?̞SQ7zdwPij7]+]ftH7^,PL2itJ=<}D#gt>~j_۩qg?}ř_>Sǂ>UZ1IsSUpo~I^)6}Ɲkծ3vz" {6єLhɤT=ra3BnlIb;VyE%B_.Jt, YJ-n2~|}Wǁt\籕cZؖQ7uBC"[s:Qqb5"lWH5Ҧ\ [ @:WNxf ureoXl&O@xy$-3yn9)XI]s^EZ2~I5j:]crL7m|}U tkfٹ߸q8J9Q{?Xٺ3S6uM9mŭyUiS=: tC3whh1ؓڀw5ԘŽϝp`ao&> x:gjmS)4 CAG%x8, XTI]kY.!rFjj6.A9,/7dE=`I!Yr\I$p< K<5XԉU20y(=©0膇[Mc;?l;=|>T43T!ݯd&\_T>5zYncj*p~"/yRwiߕ=SuEF HE 8Tի7. jI'YcD &B%LRp^*Sxq/7Wq*#cUrVNnBD:ir VJIMӢl8FЭÂπ_@(<YM7t&4MR:gw|aiM`U׎>[J:Y!7xNԄ3,$AdFqC8U+9^7'Ȍ9O ~M`)=UH:hu})&IDhVL{,0; .!U@`YK5,;h:WW[ө1)`  V%"SIeyH][l*h9ZIWS.E1u xLa\ZPG|E9t2 p`=oJ˒؁7z浅A _֠Q2i4&RA:% @`y*aۅк%组&/Vw ^pC1dMWZZgbZ0"d>l= ֋B1 O1eP }軝Qjj?Tr؄GWoxdžY\uiE}fj^=8TFP2OpYrV؎V:w; r"( 4\I8{ #nH" y*hTS!j k/~>u="c]Bw- ɀK HOd@4&2G9lu@;0[pSA2j b/_ԣ_ùۿHFBUvTƿZ?3]b3MYׂ;B/ jދ^#EpFoޣχ&ŃUrjgpa7UN<ꄈT y˨jۑ Ǒ2U}Ix' 0QsP}RLyU'ھ4hKc{{{읎C]رg6#Rm xXJFP?ID<W eB@dJcS5o1Lw[).Hd=Ǯ!^{SQ%H:zE8d7ph׺PŠ|񋇵o 'weݦC7] qkwB%b`bN-JZcyR`]uT2\߼*4!K\-eecvZc \jZ5>'p+*Lg'wNŎ./vn3\^ߵ1wCv|CѧoY~{``Z,(h~f3IՍ<&[ޑu ZNZ/kKRp%[ǝj_fƾWW}挴~Bw>bz[ /"XŰxGF0T0[rP[XFG`+kOuYw.0>X /8 nTVOk=s3o\-\C%P=HȣeBKbg=~2tfmGkf'F?l=A\hMŝ__Hx8. FxIsU %pϞT[XOjVDYw5-u[LaLftv_Z7nW=A,)uEjFk_2h?5Ua2#[*p{ynRu^z?sĎ`IWm&Z!S@8h HWqkYr#$QdQxRZ+uw$WtN 6BɔtuALޗ3hYH]3Cq~=5m BDÞSd`ut2LwsƘAƀ.}Q:$)4i$Cz9 xCGVLa9SȪa{ [a)o*:/'5#F{T6'Ap2r"5HFYgǗYc&]%9g hkhmѣ6}vB3/}^F0U_Iq)#Rc#).abM񠘨:>X ~_mz3lin׀U[{w&2I#C+3Y J` ҁz*T`E>jv,PU!Nk \TQ ^sXMT]rPQ+k0xJ sqx`ICMXyh}\e"L2VHFaooc׮gRb2b T;-|?}HlԸ*֣ ~$4jok^DOGW_Ĝ᧴;qWN $~o JWGz~/.K`}<3ƺ&eYP W2$pi(-SjrρkNվ]Gv p;oS%2nRTS#'+@Ӏ߷}3P`1Ήg:̅gG0膗HbQ l\Qihf5zUo>lNPfІ!Y f`&qDJ-k^zqhaKy=5ZP<|d$ZO9d^Q7)^&9 bi@N\YG A7jւ8]2n xZHP` D>=ݵd8tՍZ.B~yF=9b*kT*OAuMFWԈcVHBw",'~h$w] k]<KAH*ܐ0?+7F&x)5H'ti!{<T"~[FJ>פ7ۚ'C*Xƞy9 oL܍d?leYGp3!KwkӾq3B\bD:H"*XMgPV?ydʎwfLK83/ԺZTK$IU8j T Po3^r\ yx)ߧGx`PL`18bjj_ #3 Z 8p 4DgdȓGh-Bar D(OCZǑw PWπWXZK`]Z&n2*0BRDñq*s{͌aJ=LmjU)jB ץ'x5,G7vǍ0 .|H8YɪnUqjXǢLvvX4@FСCR7Xd&CMȼ* ă"B{,B2Tna Hc=o}4d pg#%@qP#ĕzB<%#bŞK5W.cBkTw0; Fgf\daI3=pW=&:ta^]]]ҹՓF~ZuLbܚ?Sgy aܘO/xN y̪s'In#*DuLIp6Ժ 32k ;Ku%Pik`y>{wo pku`7]Xqu7:Z%uK1{cA_#ρ5 "0bIUIj›Fp^۞j3qZѻHRaI$A߸VU%AHifmB?G ùH'\Q\K?sy48P7!*ԫX%7e[z!ִ#n ?]!/K{1&rң#Ul/C`prΈHFlnr޺X0S(h~.{II=7۷>ݜs$0qmȍs>{y9#ޜ~v:ݮ]3J)2>1!hWV rn4a;,\82 4{\KE:z]R> ҿ|U^y}Xd \gHx)EłNvQRn_k+c }NľmZw _u{5BӞZCpzu)qz5ie~:6nA3\s`Ax!Qqa$XJhXm P[|w([ոHntk^VΝq0d@EDO|naٴa|Wڻ$ӻѽv64Ѣ!Ұhhq2 Me)9Vf/O]xi.] z5+5Vr˦j^1cڎx)),T)yZ0$ƙ.}Ϫ K1T RH]a#zw TL t'C913?tUtR7Q80oZ!T|W1"oXrcGs3Huޟ<`tt[/Jͅ/2$cRAƘ"l\)72.0 Zw>ڼ9yilz9Ft۩ݫ zg(ph#InY#2/(LAd]^7=s?պyl 16bɬ˜y_ mt2B?jym3ιqP!KS7Q H DHLI\0ufqrUMJN녬pXupi} \0@;/)G乸nDuҿB.t…n$*5w~lճX:GΓ:1uM!ͫz_h&0 p¦yㇱÇJ.:x3g8ߦf{U`%¤u?.ädp-XT`]  %K%LeԈ}JB;®x݈,9\tFø>z錍LZL~ݺN6x$3s_UkFܢ,m۶mڴܹV<P4]zyy詃M7VVUn\3ͮm-H  ux<#nt!> 0NKQ\3uE&p' {M4BY0AHkXSlU7*>BdAnq(g8sk术W3]isA>ݼQ٫ucf2SWA:M_"EvS3ҬB6lcz?-=7IrfOY\dxiE^=xl'KG~nVGhĕq+ũL OTۏ~B>[ӍTC5O$t_,‰Aj6@Vq 3fvV5{)5|@bXmrwm+GJUzyZ~MNOkm2xR^UX| ;hт3s=L-`m߾5{6k҆ڷj&K V(cۻ뵮xOnH^,wf[r"ϺͺQ?X!*^"12i3(|~=#xI7䛡"c}RPy ^5kG8s/p>:a&/2e k}.[|o֙_ndMF',ǃ^{AFt$Ǭ'#h,5Vxb{[O~V6ު~Y\6Eq|zg娛 ?I .I{qjc '?4; rp}kNw Rm){c#x)˝1t뛜MֻZp AXJ!N"rz ,K]]7Ϭy4ާ^T>}2.5H,D%R""Ncϛf H$0B -# uT}TV (z]ots8%e% g[?Hl='{DXa13:ŵ󀱦M Io>)S3gnIV2̭E_2^A ~~J/7ڻ7:1T^3)qib,%#Q1^ CT<7-幍m.:tgӨSq'"\zQdgWG%zvmSϳk(+ K<(^+ջ%{(ɹ=a۫sͭ| F&}$XWk+"(9Cґr6\gKM)w'pź+7~&j}+3d%6.EMO`C,u%4"EhxjU}8xKhJWmD-$ /pPuRߥFizϜ1ci/b4Wz" e|Q):3V.`O?z5Leqol*JVvG}T![(^1/&) >fQiVV>VljEbX 9h~[%&-uuԎUCIpR}N(&%pۖoaa$I䩴wO ^p{vg%\.I

m݆ ֮ _m+/nЙ VQZت*ݥ$E'E=?)Og'&**!Y=l1%動(EMy)TDd]ʻRJ,Q/TJbޥ(p`)JK'!v3WZ0<]gWh1G>SgpUX);HO ,,4aqб1!g)jngFPjDϞ[F~;R#NP: W23V(z/lcZ v1R,QDp=(`n6Yy{ϔzyS9wVաndJfLԜG;TR)_L^sбU5"y|"-Ncڶ?Frh6E%l2jG{GXRT:˩sێjү\ɨQ6rU&\eFKJ`rt T=J2wj3ʰfJ*>]I0Smp88`fk\-mQ X9;`3f/,J[0ucsks{;$}J= =cv Df@ $u_ MDAc74zO܄&3'HfGYφF 81 %xJ%g7r[{cv"B#5 M l!ۻ֯]>ּkC|gգSF/'&|2ެW9u2 >Q*Qi9v&Ǔ#|=zA׼4}VKU)4r^azn1beڸ<^$*߭$p(Wx4iS/'< [fwhz߶SN^TjzQ9ZRJ&)j)y\OI?Sn5}j+QHfNr?SR'Lֿj+X)Š粡{i5\ 4&AD%(v[q(W"n-kWaE3jW.nuXd" Һd+_֮Olޔݷe獨7Ĩ%J1Q^pjrҼ \+Oϻw*D$$)uboO yA6$JM:>$_'+h⍉CW#W/6Q"6M83e4kV'R(`"BTcPjdFBW ʕIW"Z•2 qfEjO;D$zTh 1!^O Sd.ˌRR;XT><;C>¡ ~8 k; Zџ $L DD @TPQT 4jj2 1sxAUgd|w}wiأ:RxȞ@T.`3F_ai5 A6l)`=ha`ӵ6_ԭQ )ᑳ ]Ͽ"T|܅}ٕYiF8Ac2%KzwO)_szT?I/K xyg)9BQɓE/|悾82l`H^JQ)&0WCT\FŢV3C׮''V弸JХH)jBmLTsN_A\ɖKIp/e\yu&A@cXfR=O7尭DՑx))cޭgJ;,)nZ4-/nsA9s6E`㜒ٹ}j3|o|I[o$(m7j\ `|O5Xt2#HX=৻S>)[A#\}`2<*]ֲ$n *~n|=\M<#< 1,,:QђU/wM _\rT4ELϧ䦫ƨMT7Um7b֬^jV-J2M;˖ݡpckyc`nR&VTV bIb$A1Lz>?0xv-AVS߭Ч*V+z>#M;:}3; h_YYi>.*E.vB:j*c9ɮdK?[ h{7+m]2/;DoN^ΔzZX=oV#eLC0"LO'6e_,a2e%ҏ2S[ .:kғ}돊>n 1i 6`miNy$ᣝo@*`I~pꄈ(.?[Ux%)d?x{6CsAXu:E0a67XJz^/Get?pn=*Pd"㱀nj:ܔCH)T9Ȥr*ʨ\X\#7%,Q]J@xP'kE)8K2iMINiҘD-ڑSK(\;D,!h[_(V/7Y[lMdrOY_Rx/E_)1bkU.MCrׁKIxX-DaS뒱N95^=&c=)zRezʳަ<"9_\[!8}^9yfnBd Ճ vmYn_MD,{X@gC!G,cc E'b|zb x ca>RP2&phXUNQ>pk{.~6 PA2J4R4Vt_ Io"F2%On5,^ iH7Z?ī52}3-|5ʑȗG (+7ʳ+[Ex혱8Hl{Kqpi"?>0:a'q0A//>4!]JXw"%&Rf+_ w=%;h=T A?=_qn>JZqnFT> ;5*ŝ_Czt{X.-БmaPLN"DA!KSTcXn P=~g*6C?Pr)ƾ z0qA/cs(`J6Oь?ИMt$̚en^c\SE?SзzŚ~ݳ- ';fq EfCNWwr S.k-]9R9nF+ {&N8@ޮ$QZ{^*tWι9TJL9e1,$(D,^80 k-mO,@?FP('ܓ =FTn$Hg):ѨYt JyϹ_(HTl|h3+8ٲw7+|]T^R:ѷ͎i ;Y@̽u2:xV}4f]ˏĎ=t?;7,´3`OU yrGƁi5ɱF¦@J,`Ln @h sMσQW *6)ilyS2b9VtV :r%splB𚍪Xwfq}cwSw)ƴ$+ ( ʢ(z|n]lBrLR-XB-XlmƮ~GJĝB9tp錧Џޫqi|?bnt ,Q _c0ph5I61nNa]D*z:6Vo P;cF#-l!9@́s1pF9,u&25`rÌ ģu@U;;5trSMRkU3έ?WxӂMssB1Viכ޸w偪<6Fri hp(эpO@f߭-\aNb:`q^BCBKS Ņ{GlD 2ɴCNmϥhU2 xILO8~h&"AAVMyW#%OE54G.#Dq`a*N$~C!5Ö#9%#0> TCs h?QNGBX*0Ȝ VI%`iCe̸zS lU _,.Lцg7Gp|_~^yTss]wx촉XVp`KHzt'떏˜޺Q.88jpgш5W$T4cf RCLIUQS~jE%P´pg~(ݬOXGsݦãޥX 0 Js5 [LAžVkh'л sD𵽾eCv7/Yī-3gik9p&ch~&H=XB 8oaey wa\Y"Gpn81~ i1/O/S|y)7ø&.[4L` c*c<q-`܃N8W! g<'yG ?/i=zq[N\= 6=0M4k_K(n@/k2-7~#LV` :&Bغz.OseC3krh}ՠs ߡ]x.eiBfEil't`GcXI?7 xrvD`*ƖR@ K fRwzr +,>b=z? Gcu:!C`Z5V=C=[/ RhݼYUy_ >=lO@%JIc fՈoϽdw\9\jpG֬4Ҍ\Q .ݠq@`J*7l eBIY}@1݁$BC8# [ـۻRz`i΂_\BDA1$Pm!?7LD&i8tP.X G13tH;x@{Ps@UwBŽBٽ"iW3Oԙ'Js$m9lykQV&j2E Vq5hYܰ^gN0OJ"zAemF\MQ Hd}+)ܴg7SӐjBP7dh3uMuu hzFprbMTPlm1BU%*Β߭ZP5.{~uH5Y^Vq|itF)U!@Iu %((Ýz]gJPܲ(m+?hx^QsۆG0`+{'I;h7PD3yC7=4ȩ&6O0 da6:xs(rP5 CǻDwak!)Di8{ct2€*u`W* H5^)tt,HXZ\<b!G<8(PpʎΎ^TkWo]h]d #Q=d7IEzbp-dIГY UY/U6q!UԼDh+48ilن9nfct>?ʦhɐ4W!jHBJz,<+OR 5q,Raa!e-!]͛uM!{p-[c)yn"$Mb}r\{b7`a#U׾pDKx{oq.eԙD8#NO١(C8v96;3nqqӡlH`sqE2e5B1W㋰x, DA݈%4` mY 9d?*+2ͷY*ڦbc1޶nJp3+-j+/fr!/L^7dL[ޮ{ϓ+o#?ݞљ<т͇ ?>POl?(wIчS,*3d'u cx/-4 ~&`(6Zq:1C\k̺64709P C[;`|;us&nl PɅWwڗ u$SD.2ƫr.|BIC4cVy}P<ŰcZm4 I2p@Nܻ9cA} PEu yCĪ#oۏҟ5Wcvpӑϋ >?NᶒmŅ v~];x}/=P݇͡:|xϑ=v*evVϝ8O#$ ,\7tjHgqts;˼_^⺰m_׷o~^opB;ʁW-[xtr&Q96tnm累Z$p!r܎9wXH3 <0#M}7(s@P*F{4`V8XBU *DZܹ?f8^WEv}KMЙU7`f5 8_ p?|k1#j|&_O72A-DFy5@}{:Tw:9܎@N{m Zù-pAK$9B5v])z&CRU[wT r3S;GōZK6pR`%*\8cK @k?:POGSVd7QDᱍ s(Dڇ8Her CgXK=^5dN<`51> >τߔ& m=1?p ;M-ЁƦc}swG8f> CS=s`D 3!n 47ÁC#o/h mDak_,h%qm䴅9贅rZåur¦lz))gS KuB'(`[U1,BDcxDY&c5 Sp?$=ωb{zKW_[Ax r)~Mc} ,Lk{>3toh4BEv6IUǀEzDtPmQfYy%{ۆݭ#}ۇu}| C a[hNAqu_a}wQƾ6-k=,j e9L^k#`+bX85Su/݁13ʺ琊'O@US 2YM* U8b kXw';91r;T:8Kqy>äRH;vK0$G?p "Y..EfCN !嵆` +(i5UlīPĪ-;]GV[͈^.0w,Q`E*|7Z3~_2!u{DXapa|.puO| (ȣ^1VF*v!L`Oc7InRkѡP.xn y[Ñ$y7 w*?Q^uP}Bw#WWW/gPZi xBt>}jv2*j-&`qO ,Gu:P@.KZ73~':%$^4|>n?t{xvg"e7E=>=B2Z\ ;V~ԮΓ6cc`wD`Qc=Kͮʋho u@h_ {FBݾQ<['UtWV4l96JWpi@y}Oi}@^{4E5< Xߏw0 *<7\j`Xx@1MLlVnuўAtEXtcommentCREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90 wu^%tEXtdate:create2013-08-14T10:50:35-04:00py%tEXtdate:modify2013-08-14T10:50:35-04:00HtEXtjpeg:colorspace2,uU tEXtjpeg:sampling-factor2x2,1x1,1x1IIENDB`jekyll-feed-0.3.1/spec/fixtures/_other_things/0000755000175000017500000000000012540452645021210 5ustar uwabamiuwabamijekyll-feed-0.3.1/spec/fixtures/_other_things/test2.html0000644000175000017500000000006512540452645023140 0ustar uwabamiuwabami--- --- This file shouldn't show up in the sitemap. jekyll-feed-0.3.1/spec/jekyll-feed_spec.rb0000644000175000017500000001322112540452645020234 0ustar uwabamiuwabamirequire 'spec_helper' describe(Jekyll::JekyllFeed) do let(:overrides) do { "full_rebuild" => true, "source" => source_dir, "destination" => dest_dir, "url" => "http://example.org", "name" => "My awesome site", "author" => { "name" => "Dr. Jekyll" }, "collections" => { "my_collection" => { "output" => true }, "other_things" => { "output" => false } } } end let(:config) do Jekyll.configuration(overrides) end let(:site) { Jekyll::Site.new(config) } let(:contents) { File.read(dest_dir("feed.xml")) } before(:each) do site.process end it "has no layout" do expect(contents).not_to match(/\ATHIS IS MY LAYOUT/) end it "creates a feed.xml file" do expect(Pathname.new(dest_dir("feed.xml"))).to exist end it "doesn't have multiple new lines or trailing whitespace" do expect(contents).to_not match /\s+\n/ expect(contents).to_not match /\n{2,}/ end it "puts all the posts in the feed.xml file" do expect(contents).to match /http:\/\/example\.org\/2014\/03\/04\/march-the-fourth\.html/ expect(contents).to match /http:\/\/example\.org\/2014\/03\/02\/march-the-second\.html/ expect(contents).to match /http:\/\/example\.org\/2013\/12\/12\/dec-the-second\.html/ end it "does not include assets or any static files that aren't .html" do expect(contents).not_to match /http:\/\/example\.org\/images\/hubot\.png/ expect(contents).not_to match /http:\/\/example\.org\/feeds\/atom\.xml/ end it "preserves linebreaks in preformatted text in posts" do expect(contents).to match /Line 1\nLine 2\nLine 3/ end it "supports post author name as an object" do expect(contents).to match /\s*Ben<\/name>\s*ben@example.com<\/email>\s*http:\/\/ben.balter.com<\/uri>\s*<\/author>/ end it "supports post author name as a string" do expect(contents).to match /\s*Pat<\/name>\s*<\/author>/ end it "does not output author tag no author is provided" do expect(contents).not_to match /\s*<\/name>\s*<\/author>/ end it "converts markdown posts to HTML" do expect(contents).to match /<p>March the second!<\/p>/ end it "converts uses last_modified_at where available" do expect(contents).to match /2015-05-12T13:27:59\+00:00<\/updated>/ end context "parsing" do let(:feed) { RSS::Parser.parse(contents) } it "outputs an RSS feed" do expect(feed.feed_type).to eql("atom") expect(feed.feed_version).to eql("1.0") expect(feed.encoding).to eql("UTF-8") end it "outputs the link" do expect(feed.link.href).to eql("http://example.org/feed.xml") end it "outputs the generator" do expect(feed.generator.content).to eql("Jekyll") expect(feed.generator.version).to eql(Jekyll::VERSION) end it "includes the items" do expect(feed.items.count).to eql(7) end it "includes item contents" do post = feed.items.last expect(post.title.content).to eql("Dec The Second") expect(post.link.href).to eql("http://example.org/2013/12/12/dec-the-second.html") expect(post.published.content).to eql(Time.parse("2013-12-12")) end end context "validation" do it "validates" do # See https://validator.w3.org/docs/api.html url = "https://validator.w3.org/feed/check.cgi?output=soap12" response = Typhoeus.post(url, body: { rawdata: contents }, accept_encoding: "gzip") pending "Something went wrong with the W3 validator" unless response.success? result = Nokogiri::XML(response.body) result.remove_namespaces! result.css("warning").each do |warning| # Quiet a warning that results from us passing the feed as a string next if warning.css("text").text =~ /Self reference doesn't match document location/ warn "Validation warning: #{warning.css("text").text} on line #{warning.css("line").text} column #{warning.css("column").text}" end errors = result.css("error").map do |error| "Validation error: #{error.css("text").text} on line #{error.css("line").text} column #{error.css("column").text}" end expect(result.css("validity").text).to eql("true"), errors.join("\n") end end context "with a baseurl" do let(:config) do Jekyll.configuration(Jekyll::Utils.deep_merge_hashes(overrides, {"baseurl" => "/bass"})) end it "correctly adds the baseurl to the posts" do expect(contents).to match /http:\/\/example\.org\/bass\/2014\/03\/04\/march-the-fourth\.html/ expect(contents).to match /http:\/\/example\.org\/bass\/2014\/03\/02\/march-the-second\.html/ expect(contents).to match /http:\/\/example\.org\/bass\/2013\/12\/12\/dec-the-second\.html/ end end context "feed meta" do it "renders the feed meta" do index = File.read(dest_dir("index.html")) expected = '' expect(index).to include(expected) end end context "changing the feed path" do let(:config) do Jekyll.configuration(Jekyll::Utils.deep_merge_hashes(overrides, {"feed" => {"path" => "atom.xml"}})) end it "should write to atom.xml" do expect(Pathname.new(dest_dir("atom.xml"))).to exist end it "renders the feed meta with custom feed path" do index = File.read(dest_dir("index.html")) expected = '' expect(index).to include(expected) end end end jekyll-feed-0.3.1/Gemfile0000644000175000017500000000016212540452645015043 0ustar uwabamiuwabamisource 'https://rubygems.org' gemspec if ENV["JEKYLL_VERSION"] gem "jekyll", "~> #{ENV["JEKYLL_VERSION"]}" end jekyll-feed-0.3.1/README.md0000644000175000017500000000616012540452645015033 0ustar uwabamiuwabami# Jekyll Feed plugin A Jekyll plugin to generate an Atom (RSS-like) feed of your Jekyll posts [![Build Status](https://travis-ci.org/jekyll/jekyll-feed.svg)](https://travis-ci.org/jekyll/jekyll-feed) [![Gem Version](https://badge.fury.io/rb/jekyll-feed.svg)](http://badge.fury.io/rb/jekyll-feed) ## Installation Add this line to your site's Gemfile: ```ruby gem 'jekyll-feed' ``` And then add this line to your site's `_config.yml`: ```yml gems: - jekyll-feed ``` ## Usage The plugin will automatically generate an Atom feed at `/feed.xml`. ### Optional configuration options The plugin will automatically use any of the following configuration variables, if they are present in your site's `_config.yml` file. * `name` - The title of the site, e.g., "My awesome site" * `description` - A longer description of what your site is about, e.g., "Where I blog about Jekyll and other awesome things" * `url` - The URL to your site, e.g., `http://example.com`. If none is provided, the plugin will try to use `site.github.url`. * `author` - Your name, e.g., "Dr. Jekyll." This can be a string (with the author's name), or an object with the following properties: - `name` - **Required** Display name of the author - `email` - Email address of the author - `uri` - Webpage where more information about the author can be found ### Already have a feed path? Do you already have an existing feed someplace other than `/feed.xml`, but are on a host like GitHub Pages that doesn't support machine-friendly redirects? If you simply swap out `jekyll-feed` for your existing template, your existing subscribers won't continue to get updates. Instead, you can specify a non-default path via your site's config. ```yml feed: path: atom.xml ``` To note, you shouldn't have to do this unless you already have a feed you're using, and you can't or wish not to redirect existing subscribers. ### Optional front matter The plugin will use the following post metadata, automatically generated by Jekyll, which you can override via a post's YAML front matter: * `date` * `title` * `excerpt` * `id` * `category` * `tags` Additionally, the plugin will use the following values, if present in a post's YAML front matter: * `author` - The author of the post, e.g., "Dr. Jekyll". If none is given, feed readers will look to the feed author as defined in `_config.yml`. Like the feed author, this can also be an object. ### Meta tags The plugin exposes a helper tag to expose the appropriate meta tags to support automated discovery of your feed. Simply place `{% feed_meta %}` someplace in your template's `` section, to output the necessary metadata. ## Why Atom, and not RSS? Great question. In short, Atom is a better format. Think of it like RSS 3.0. For more information, see [this discussion on why we chose Atom over RSS 2.0](https://github.com/jekyll/jekyll-rss-feed/issues/2). ## Contributing 1. Fork it (https://github.com/jekyll/jekyll-feed/fork) 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Add some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create a new Pull Request