Class: AlExtPosts::ExternalPostsGenerator

Inherits:
Jekyll::Generator
  • Object
show all
Defined in:
lib/al_ext_posts.rb

Constant Summary collapse

PAGE_EXTENSIONS =

Extensions dropped from a URL segment before it is turned into a title, so .../my-post.html reads as "My Post" rather than "My Post Html".

%w[html htm xhtml shtml php asp aspx jsp cfm md markdown txt].freeze
FALLBACK_TITLE =

Last-resort title for a URL with neither a usable path nor a host.

'External post'.freeze

Instance Method Summary collapse

Instance Method Details

#build_slug(source_name, url, title) ⇒ Object

Build a filesystem-safe post slug from the title, falling back to the source name + last URL segment when the title is missing, blank, or made up entirely of non-word characters. Guards against a nil title (e.g. an RSS entry or fetched page with no ), which previously raised a NoMethodError and aborted the whole build.</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 91 92 93 94 95 96</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 91</span> <span class='kw'>def</span> <span class='id identifier rubyid_build_slug'>build_slug</span><span class='lparen'>(</span><span class='id identifier rubyid_source_name'>source_name</span><span class='comma'>,</span> <span class='id identifier rubyid_url'>url</span><span class='comma'>,</span> <span class='id identifier rubyid_title'>title</span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='id identifier rubyid_fallback_slug'>fallback_slug</span><span class='lparen'>(</span><span class='id identifier rubyid_source_name'>source_name</span><span class='comma'>,</span> <span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='kw'>unless</span> <span class='id identifier rubyid_title'>title</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_match?'>match?</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>\w</span><span class='regexp_end'>/</span></span><span class='rparen'>)</span> <span class='id identifier rubyid_slug'>slug</span> <span class='op'>=</span> <span class='id identifier rubyid_slugify'>slugify</span><span class='lparen'>(</span><span class='id identifier rubyid_title'>title</span><span class='rparen'>)</span> <span class='id identifier rubyid_slug'>slug</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span> <span class='op'>?</span> <span class='id identifier rubyid_fallback_slug'>fallback_slug</span><span class='lparen'>(</span><span class='id identifier rubyid_source_name'>source_name</span><span class='comma'>,</span> <span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='op'>:</span> <span class='id identifier rubyid_slug'>slug</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="create_document-instance_method"> #<strong>create_document</strong>(site, source_name, url, content, src = {}) ⇒ <tt>Object</tt> </h3><table class="source_code"> <tr> <td> <pre class="lines"> 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 57</span> <span class='kw'>def</span> <span class='id identifier rubyid_create_document'>create_document</span><span class='lparen'>(</span><span class='id identifier rubyid_site'>site</span><span class='comma'>,</span> <span class='id identifier rubyid_source_name'>source_name</span><span class='comma'>,</span> <span class='id identifier rubyid_url'>url</span><span class='comma'>,</span> <span class='id identifier rubyid_content'>content</span><span class='comma'>,</span> <span class='id identifier rubyid_src'>src</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span><span class='rparen'>)</span> <span class='comment'># The slug is still derived from the raw title so existing post URLs keep </span> <span class='comment'># their source-name fallback; only the published title is filled in. </span> <span class='id identifier rubyid_slug'>slug</span> <span class='op'>=</span> <span class='id identifier rubyid_build_slug'>build_slug</span><span class='lparen'>(</span><span class='id identifier rubyid_source_name'>source_name</span><span class='comma'>,</span> <span class='id identifier rubyid_url'>url</span><span class='comma'>,</span> <span class='id identifier rubyid_content'>content</span><span class='lbracket'>[</span><span class='symbol'>:title</span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='id identifier rubyid_title'>title</span> <span class='op'>=</span> <span class='id identifier rubyid_resolve_title'>resolve_title</span><span class='lparen'>(</span><span class='id identifier rubyid_content'>content</span><span class='lbracket'>[</span><span class='symbol'>:title</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='id identifier rubyid_path'>path</span> <span class='op'>=</span> <span class='id identifier rubyid_site'>site</span><span class='period'>.</span><span class='id identifier rubyid_in_source_dir'>in_source_dir</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>_posts/</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_slug'>slug</span><span class='embexpr_end'>}</span><span class='tstring_content'>.md</span><span class='tstring_end'>"</span></span><span class='rparen'>)</span> <span class='id identifier rubyid_doc'>doc</span> <span class='op'>=</span> <span class='const'>Jekyll</span><span class='op'>::</span><span class='const'>Document</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='id identifier rubyid_path'>path</span><span class='comma'>,</span> <span class='lbrace'>{</span> <span class='symbol'>:site</span> <span class='op'>=></span> <span class='id identifier rubyid_site'>site</span><span class='comma'>,</span> <span class='symbol'>:collection</span> <span class='op'>=></span> <span class='id identifier rubyid_site'>site</span><span class='period'>.</span><span class='id identifier rubyid_collections'>collections</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>posts</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='rbrace'>}</span> <span class='rparen'>)</span> <span class='id identifier rubyid_doc'>doc</span><span class='period'>.</span><span class='id identifier rubyid_data'>data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>external_source</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_source_name'>source_name</span> <span class='id identifier rubyid_doc'>doc</span><span class='period'>.</span><span class='id identifier rubyid_data'>data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>title</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_title'>title</span> <span class='id identifier rubyid_doc'>doc</span><span class='period'>.</span><span class='id identifier rubyid_data'>data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>feed_content</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_content'>content</span><span class='lbracket'>[</span><span class='symbol'>:content</span><span class='rbracket'>]</span> <span class='id identifier rubyid_doc'>doc</span><span class='period'>.</span><span class='id identifier rubyid_data'>data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>description</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_content'>content</span><span class='lbracket'>[</span><span class='symbol'>:summary</span><span class='rbracket'>]</span> <span class='id identifier rubyid_doc'>doc</span><span class='period'>.</span><span class='id identifier rubyid_data'>data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>date</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_content'>content</span><span class='lbracket'>[</span><span class='symbol'>:published</span><span class='rbracket'>]</span> <span class='id identifier rubyid_doc'>doc</span><span class='period'>.</span><span class='id identifier rubyid_data'>data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>redirect</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_url'>url</span> <span class='comment'># Apply default categories and tags from source configuration </span> <span class='kw'>if</span> <span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>categories</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='op'>&&</span> <span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>categories</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'>Array</span><span class='rparen'>)</span> <span class='op'>&&</span> <span class='op'>!</span><span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>categories</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span> <span class='id identifier rubyid_doc'>doc</span><span class='period'>.</span><span class='id identifier rubyid_data'>data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>categories</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>categories</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='kw'>end</span> <span class='kw'>if</span> <span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>tags</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='op'>&&</span> <span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>tags</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'>Array</span><span class='rparen'>)</span> <span class='op'>&&</span> <span class='op'>!</span><span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>tags</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span> <span class='id identifier rubyid_doc'>doc</span><span class='period'>.</span><span class='id identifier rubyid_data'>data</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>tags</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>tags</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='kw'>end</span> <span class='id identifier rubyid_doc'>doc</span><span class='period'>.</span><span class='id identifier rubyid_content'>content</span> <span class='op'>=</span> <span class='id identifier rubyid_content'>content</span><span class='lbracket'>[</span><span class='symbol'>:content</span><span class='rbracket'>]</span> <span class='id identifier rubyid_site'>site</span><span class='period'>.</span><span class='id identifier rubyid_collections'>collections</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>posts</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_docs'>docs</span> <span class='op'><<</span> <span class='id identifier rubyid_doc'>doc</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="decode_url_segment-instance_method"> #<strong>decode_url_segment</strong>(segment) ⇒ <tt>Object</tt> </h3><div class="docstring"> <div class="discussion"> <p>Percent-decode a single URL segment, keeping the raw text whenever the escapes are malformed or decode to invalid bytes. Scrubbed either way so the callers below can match against it without raising.</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 173 174 175 176 177 178</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 173</span> <span class='kw'>def</span> <span class='id identifier rubyid_decode_url_segment'>decode_url_segment</span><span class='lparen'>(</span><span class='id identifier rubyid_segment'>segment</span><span class='rparen'>)</span> <span class='id identifier rubyid_decoded'>decoded</span> <span class='op'>=</span> <span class='const'>URI</span><span class='period'>.</span><span class='id identifier rubyid_decode_www_form_component'>decode_www_form_component</span><span class='lparen'>(</span><span class='id identifier rubyid_segment'>segment</span><span class='rparen'>)</span> <span class='lparen'>(</span><span class='id identifier rubyid_decoded'>decoded</span><span class='period'>.</span><span class='id identifier rubyid_valid_encoding?'>valid_encoding?</span> <span class='op'>?</span> <span class='id identifier rubyid_decoded'>decoded</span> <span class='op'>:</span> <span class='id identifier rubyid_segment'>segment</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_scrub'>scrub</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span> <span class='kw'>rescue</span> <span class='const'>ArgumentError</span> <span class='id identifier rubyid_segment'>segment</span><span class='period'>.</span><span class='id identifier rubyid_scrub'>scrub</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="fallback_slug-instance_method"> #<strong>fallback_slug</strong>(source_name, url) ⇒ <tt>Object</tt> </h3><div class="docstring"> <div class="discussion"> <p>Fallback slug built from the source name and the last URL segment. Only computed on the fallback path so the common (titled) case does no extra string work.</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 101 102 103</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 101</span> <span class='kw'>def</span> <span class='id identifier rubyid_fallback_slug'>fallback_slug</span><span class='lparen'>(</span><span class='id identifier rubyid_source_name'>source_name</span><span class='comma'>,</span> <span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_slugify'>slugify</span><span class='lparen'>(</span><span class='id identifier rubyid_source_name'>source_name</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>-</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_url'>url</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>/</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_last'>last</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="fetch_content_from_url-instance_method"> #<strong>fetch_content_from_url</strong>(url) ⇒ <tt>Object</tt> </h3><table class="source_code"> <tr> <td> <pre class="lines"> 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 234</span> <span class='kw'>def</span> <span class='id identifier rubyid_fetch_content_from_url'>fetch_content_from_url</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='id identifier rubyid_html'>html</span> <span class='op'>=</span> <span class='const'>HTTParty</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span> <span class='id identifier rubyid_parsed_html'>parsed_html</span> <span class='op'>=</span> <span class='const'>Nokogiri</span><span class='op'>::</span><span class='const'>HTML</span><span class='lparen'>(</span><span class='id identifier rubyid_html'>html</span><span class='rparen'>)</span> <span class='id identifier rubyid_title'>title</span> <span class='op'>=</span> <span class='id identifier rubyid_parsed_html'>parsed_html</span><span class='period'>.</span><span class='id identifier rubyid_at'>at</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>head title</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='op'>&.</span><span class='id identifier rubyid_text'>text</span><span class='op'>&.</span><span class='id identifier rubyid_strip'>strip</span> <span class='op'>||</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_end'>'</span></span> <span class='id identifier rubyid_description'>description</span> <span class='op'>=</span> <span class='id identifier rubyid_parsed_html'>parsed_html</span><span class='period'>.</span><span class='id identifier rubyid_at'>at</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>head meta[name="description"]</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='op'>&.</span><span class='id identifier rubyid_attr'>attr</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>content</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span> <span class='id identifier rubyid_description'>description</span> <span class='op'>||=</span> <span class='id identifier rubyid_parsed_html'>parsed_html</span><span class='period'>.</span><span class='id identifier rubyid_at'>at</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>head meta[name="og:description"]</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='op'>&.</span><span class='id identifier rubyid_attr'>attr</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>content</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span> <span class='id identifier rubyid_description'>description</span> <span class='op'>||=</span> <span class='id identifier rubyid_parsed_html'>parsed_html</span><span class='period'>.</span><span class='id identifier rubyid_at'>at</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>head meta[property="og:description"]</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='op'>&.</span><span class='id identifier rubyid_attr'>attr</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>content</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span> <span class='id identifier rubyid_body_content'>body_content</span> <span class='op'>=</span> <span class='id identifier rubyid_parsed_html'>parsed_html</span><span class='period'>.</span><span class='id identifier rubyid_search'>search</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>p</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_e'>e</span><span class='op'>|</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_text'>text</span> <span class='rbrace'>}</span> <span class='id identifier rubyid_body_content'>body_content</span> <span class='op'>=</span> <span class='id identifier rubyid_body_content'>body_content</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='rparen'>)</span> <span class='op'>||</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_end'>'</span></span> <span class='lbrace'>{</span> <span class='label'>title:</span> <span class='id identifier rubyid_title'>title</span><span class='comma'>,</span> <span class='label'>content:</span> <span class='id identifier rubyid_body_content'>body_content</span><span class='comma'>,</span> <span class='label'>summary:</span> <span class='id identifier rubyid_description'>description</span> <span class='comment'># Note: The published date is now added in the fetch_from_urls method. </span> <span class='rbrace'>}</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="fetch_from_rss-instance_method"> #<strong>fetch_from_rss</strong>(site, src) ⇒ <tt>Object</tt> </h3><table class="source_code"> <tr> <td> <pre class="lines"> 33 34 35 36 37 38 39 40 41 42 43</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 33</span> <span class='kw'>def</span> <span class='id identifier rubyid_fetch_from_rss'>fetch_from_rss</span><span class='lparen'>(</span><span class='id identifier rubyid_site'>site</span><span class='comma'>,</span> <span class='id identifier rubyid_src'>src</span><span class='rparen'>)</span> <span class='id identifier rubyid_xml'>xml</span> <span class='op'>=</span> <span class='const'>HTTParty</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span><span class='lparen'>(</span><span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>rss_url</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_body'>body</span> <span class='kw'>return</span> <span class='kw'>if</span> <span class='id identifier rubyid_xml'>xml</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span> <span class='kw'>begin</span> <span class='id identifier rubyid_feed'>feed</span> <span class='op'>=</span> <span class='const'>Feedjira</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_xml'>xml</span><span class='rparen'>)</span> <span class='kw'>rescue</span> <span class='const'>StandardError</span> <span class='op'>=></span> <span class='id identifier rubyid_e'>e</span> <span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Error parsing RSS feed from </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>rss_url</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='embexpr_end'>}</span><span class='tstring_content'> - </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span> <span class='kw'>return</span> <span class='kw'>end</span> <span class='id identifier rubyid_process_entries'>process_entries</span><span class='lparen'>(</span><span class='id identifier rubyid_site'>site</span><span class='comma'>,</span> <span class='id identifier rubyid_src'>src</span><span class='comma'>,</span> <span class='id identifier rubyid_feed'>feed</span><span class='period'>.</span><span class='id identifier rubyid_entries'>entries</span><span class='rparen'>)</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="fetch_from_urls-instance_method"> #<strong>fetch_from_urls</strong>(site, src) ⇒ <tt>Object</tt> </h3><table class="source_code"> <tr> <td> <pre class="lines"> 197 198 199 200 201 202 203 204</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 197</span> <span class='kw'>def</span> <span class='id identifier rubyid_fetch_from_urls'>fetch_from_urls</span><span class='lparen'>(</span><span class='id identifier rubyid_site'>site</span><span class='comma'>,</span> <span class='id identifier rubyid_src'>src</span><span class='rparen'>)</span> <span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>posts</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_post'>post</span><span class='op'>|</span> <span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>...fetching </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_post'>post</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>url</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span> <span class='id identifier rubyid_content'>content</span> <span class='op'>=</span> <span class='id identifier rubyid_fetch_content_from_url'>fetch_content_from_url</span><span class='lparen'>(</span><span class='id identifier rubyid_post'>post</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>url</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='id identifier rubyid_content'>content</span><span class='lbracket'>[</span><span class='symbol'>:published</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_parse_published_date'>parse_published_date</span><span class='lparen'>(</span><span class='id identifier rubyid_post'>post</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>published_date</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='id identifier rubyid_create_document'>create_document</span><span class='lparen'>(</span><span class='id identifier rubyid_site'>site</span><span class='comma'>,</span> <span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>name</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_post'>post</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>url</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_content'>content</span><span class='comma'>,</span> <span class='id identifier rubyid_metadata_for_post'>metadata_for_post</span><span class='lparen'>(</span><span class='id identifier rubyid_src'>src</span><span class='comma'>,</span> <span class='id identifier rubyid_post'>post</span><span class='rparen'>)</span><span class='rparen'>)</span> <span class='kw'>end</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="generate-instance_method"> #<strong>generate</strong>(site) ⇒ <tt>Object</tt> </h3><table class="source_code"> <tr> <td> <pre class="lines"> 20 21 22 23 24 25 26 27 28 29 30 31</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 20</span> <span class='kw'>def</span> <span class='id identifier rubyid_generate'>generate</span><span class='lparen'>(</span><span class='id identifier rubyid_site'>site</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_site'>site</span><span class='period'>.</span><span class='id identifier rubyid_config'>config</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>external_sources</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='op'>!=</span> <span class='kw'>nil</span> <span class='id identifier rubyid_site'>site</span><span class='period'>.</span><span class='id identifier rubyid_config'>config</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>external_sources</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_src'>src</span><span class='op'>|</span> <span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Fetching external posts from </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>name</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='embexpr_end'>}</span><span class='tstring_content'>:</span><span class='tstring_end'>"</span></span> <span class='kw'>if</span> <span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>rss_url</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='id identifier rubyid_fetch_from_rss'>fetch_from_rss</span><span class='lparen'>(</span><span class='id identifier rubyid_site'>site</span><span class='comma'>,</span> <span class='id identifier rubyid_src'>src</span><span class='rparen'>)</span> <span class='kw'>elsif</span> <span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>posts</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span> <span class='id identifier rubyid_fetch_from_urls'>fetch_from_urls</span><span class='lparen'>(</span><span class='id identifier rubyid_site'>site</span><span class='comma'>,</span> <span class='id identifier rubyid_src'>src</span><span class='rparen'>)</span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='kw'>end</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="humanize_segment-instance_method"> #<strong>humanize_segment</strong>(segment) ⇒ <tt>Object</tt> </h3><div class="docstring"> <div class="discussion"> <p>Split a URL segment on its separators and capitalize each word, leaving words that are already cased alone: "google-gemini-io-2024" becomes "Google Gemini Io 2024".</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 193 194 195</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 193</span> <span class='kw'>def</span> <span class='id identifier rubyid_humanize_segment'>humanize_segment</span><span class='lparen'>(</span><span class='id identifier rubyid_segment'>segment</span><span class='rparen'>)</span> <span class='id identifier rubyid_segment'>segment</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_gsub'>gsub</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>[^[:alnum:]]+</span><span class='regexp_end'>/</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'> </span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_word'>word</span><span class='op'>|</span> <span class='id identifier rubyid_word'>word</span><span class='period'>.</span><span class='id identifier rubyid_sub'>sub</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>\A[[:lower:]]</span><span class='regexp_end'>/</span></span><span class='comma'>,</span> <span class='op'>&</span><span class='symbol'>:upcase</span><span class='rparen'>)</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'> </span><span class='tstring_end'>'</span></span><span class='rparen'>)</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="metadata_for_post-instance_method"> #<strong>metadata_for_post</strong>(src, post) ⇒ <tt>Object</tt> </h3><table class="source_code"> <tr> <td> <pre class="lines"> 206 207 208 209 210 211 212 213</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 206</span> <span class='kw'>def</span> <span class='id identifier rubyid_metadata_for_post'>metadata_for_post</span><span class='lparen'>(</span><span class='id identifier rubyid_src'>src</span><span class='comma'>,</span> <span class='id identifier rubyid_post'>post</span><span class='rparen'>)</span> <span class='id identifier rubyid_metadata'>metadata</span> <span class='op'>=</span> <span class='id identifier rubyid_src'>src</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span> <span class='qwords_beg'>%w[</span><span class='tstring_content'>categories</span><span class='words_sep'> </span><span class='tstring_content'>tags</span><span class='tstring_end'>]</span></span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='op'>|</span> <span class='id identifier rubyid_value'>value</span> <span class='op'>=</span> <span class='id identifier rubyid_metadata_value'>metadata_value</span><span class='lparen'>(</span><span class='id identifier rubyid_post'>post</span><span class='comma'>,</span> <span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span> <span class='id identifier rubyid_metadata'>metadata</span><span class='lbracket'>[</span><span class='id identifier rubyid_key'>key</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span> <span class='kw'>if</span> <span class='id identifier rubyid_value'>value</span> <span class='op'>&&</span> <span class='op'>!</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='symbol'>:empty?</span><span class='rparen'>)</span> <span class='op'>&&</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span><span class='rparen'>)</span> <span class='kw'>end</span> <span class='id identifier rubyid_metadata'>metadata</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="metadata_value-instance_method"> #<strong>metadata_value</strong>(post, key) ⇒ <tt>Object</tt> </h3><table class="source_code"> <tr> <td> <pre class="lines"> 215 216 217 218 219 220 221</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 215</span> <span class='kw'>def</span> <span class='id identifier rubyid_metadata_value'>metadata_value</span><span class='lparen'>(</span><span class='id identifier rubyid_post'>post</span><span class='comma'>,</span> <span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_post'>post</span><span class='period'>.</span><span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='symbol'>:key?</span><span class='rparen'>)</span> <span class='id identifier rubyid_post'>post</span><span class='lbracket'>[</span><span class='id identifier rubyid_key'>key</span><span class='rbracket'>]</span> <span class='op'>||</span> <span class='id identifier rubyid_post'>post</span><span class='lbracket'>[</span><span class='id identifier rubyid_key'>key</span><span class='period'>.</span><span class='id identifier rubyid_to_sym'>to_sym</span><span class='rbracket'>]</span> <span class='kw'>elsif</span> <span class='id identifier rubyid_post'>post</span><span class='period'>.</span><span class='id identifier rubyid_respond_to?'>respond_to?</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span> <span class='id identifier rubyid_post'>post</span><span class='period'>.</span><span class='id identifier rubyid_public_send'>public_send</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span> <span class='kw'>end</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="parse_published_date-instance_method"> #<strong>parse_published_date</strong>(published_date) ⇒ <tt>Object</tt> </h3><table class="source_code"> <tr> <td> <pre class="lines"> 223 224 225 226 227 228 229 230 231 232</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 223</span> <span class='kw'>def</span> <span class='id identifier rubyid_parse_published_date'>parse_published_date</span><span class='lparen'>(</span><span class='id identifier rubyid_published_date'>published_date</span><span class='rparen'>)</span> <span class='kw'>case</span> <span class='id identifier rubyid_published_date'>published_date</span> <span class='kw'>when</span> <span class='const'>String</span> <span class='const'>Time</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_published_date'>published_date</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_utc'>utc</span> <span class='kw'>when</span> <span class='const'>Date</span> <span class='id identifier rubyid_published_date'>published_date</span><span class='period'>.</span><span class='id identifier rubyid_to_time'>to_time</span><span class='period'>.</span><span class='id identifier rubyid_utc'>utc</span> <span class='kw'>else</span> <span class='id identifier rubyid_raise'>raise</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>Invalid date format for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_published_date'>published_date</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span> <span class='kw'>end</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="process_entries-instance_method"> #<strong>process_entries</strong>(site, src, entries) ⇒ <tt>Object</tt> </h3><table class="source_code"> <tr> <td> <pre class="lines"> 45 46 47 48 49 50 51 52 53 54 55</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 45</span> <span class='kw'>def</span> <span class='id identifier rubyid_process_entries'>process_entries</span><span class='lparen'>(</span><span class='id identifier rubyid_site'>site</span><span class='comma'>,</span> <span class='id identifier rubyid_src'>src</span><span class='comma'>,</span> <span class='id identifier rubyid_entries'>entries</span><span class='rparen'>)</span> <span class='id identifier rubyid_entries'>entries</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_e'>e</span><span class='op'>|</span> <span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>...fetching </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_url'>url</span><span class='embexpr_end'>}</span><span class='tstring_end'>"</span></span> <span class='id identifier rubyid_create_document'>create_document</span><span class='lparen'>(</span><span class='id identifier rubyid_site'>site</span><span class='comma'>,</span> <span class='id identifier rubyid_src'>src</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>name</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_url'>url</span><span class='comma'>,</span> <span class='lbrace'>{</span> <span class='label'>title:</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_title'>title</span><span class='comma'>,</span> <span class='label'>content:</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_content'>content</span><span class='comma'>,</span> <span class='label'>summary:</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_summary'>summary</span><span class='comma'>,</span> <span class='label'>published:</span> <span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_published'>published</span> <span class='rbrace'>}</span><span class='comma'>,</span> <span class='id identifier rubyid_metadata_for_post'>metadata_for_post</span><span class='lparen'>(</span><span class='id identifier rubyid_src'>src</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='rparen'>)</span><span class='rparen'>)</span> <span class='kw'>end</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="resolve_title-instance_method"> #<strong>resolve_title</strong>(title, url) ⇒ <tt>Object</tt> </h3><div class="docstring"> <div class="discussion"> <p>Title to publish for an ingested item. Fetches degrade in ways that leave no title at all (an unreachable host, a page without <title>, an RSS item with a blank one), and publishing that empty string produced a blank but clickable row in the blog index plus a stream of Jekyll "Empty <code>slug</code> generated" warnings. The source is listed in _config.yml by the user, so the entry is kept: derive a readable title from the URL and warn that the fetch degraded.</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 120 121 122 123 124 125 126</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 120</span> <span class='kw'>def</span> <span class='id identifier rubyid_resolve_title'>resolve_title</span><span class='lparen'>(</span><span class='id identifier rubyid_title'>title</span><span class='comma'>,</span> <span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='id identifier rubyid_title'>title</span> <span class='kw'>if</span> <span class='id identifier rubyid_title'>title</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_match?'>match?</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>[[:word:]]</span><span class='regexp_end'>/</span></span><span class='rparen'>)</span> <span class='id identifier rubyid_derived'>derived</span> <span class='op'>=</span> <span class='id identifier rubyid_title_from_url'>title_from_url</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='const'>Jekyll</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_warn'>warn</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>ExternalPosts:</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>No title found for </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_url'>url</span><span class='embexpr_end'>}</span><span class='tstring_content'> - using </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_derived'>derived</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span><span class='embexpr_end'>}</span><span class='tstring_content'> derived from the URL.</span><span class='tstring_end'>"</span></span><span class='rparen'>)</span> <span class='id identifier rubyid_derived'>derived</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="slugify-instance_method"> #<strong>slugify</strong>(value) ⇒ <tt>Object</tt> </h3><div class="docstring"> <div class="discussion"> <p>Drop every character that is not a word character, space, or hyphen in a single pass, then translate the remaining spaces to hyphens. Equivalent to the previous <code>gsub(' ', '-').gsub(/[^\w-]/, '')</code> pair, but avoids the intermediate string and the second regexp scan.</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 109 110 111</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 109</span> <span class='kw'>def</span> <span class='id identifier rubyid_slugify'>slugify</span><span class='lparen'>(</span><span class='id identifier rubyid_value'>value</span><span class='rparen'>)</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span><span class='period'>.</span><span class='id identifier rubyid_strip'>strip</span><span class='period'>.</span><span class='id identifier rubyid_gsub'>gsub</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>[^\w -]</span><span class='regexp_end'>/</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_tr'>tr</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'> </span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>-</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="strip_page_extension-instance_method"> #<strong>strip_page_extension</strong>(segment) ⇒ <tt>Object</tt> </h3><div class="docstring"> <div class="discussion"> <p>Drop a trailing web-page extension, keeping the segment untouched when the extension is unknown (a version number, say) or is all there is.</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 182 183 184 185 186 187 188</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 182</span> <span class='kw'>def</span> <span class='id identifier rubyid_strip_page_extension'>strip_page_extension</span><span class='lparen'>(</span><span class='id identifier rubyid_segment'>segment</span><span class='rparen'>)</span> <span class='id identifier rubyid_extension'>extension</span> <span class='op'>=</span> <span class='const'>File</span><span class='period'>.</span><span class='id identifier rubyid_extname'>extname</span><span class='lparen'>(</span><span class='id identifier rubyid_segment'>segment</span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='id identifier rubyid_segment'>segment</span> <span class='kw'>unless</span> <span class='const'><span class='object_link'><a href="#PAGE_EXTENSIONS-constant" title="AlExtPosts::ExternalPostsGenerator::PAGE_EXTENSIONS (constant)">PAGE_EXTENSIONS</a></span></span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_extension'>extension</span><span class='period'>.</span><span class='id identifier rubyid_delete_prefix'>delete_prefix</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>.</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span><span class='rparen'>)</span> <span class='id identifier rubyid_stripped'>stripped</span> <span class='op'>=</span> <span class='id identifier rubyid_segment'>segment</span><span class='period'>.</span><span class='id identifier rubyid_chomp'>chomp</span><span class='lparen'>(</span><span class='id identifier rubyid_extension'>extension</span><span class='rparen'>)</span> <span class='id identifier rubyid_stripped'>stripped</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span> <span class='op'>?</span> <span class='id identifier rubyid_segment'>segment</span> <span class='op'>:</span> <span class='id identifier rubyid_stripped'>stripped</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="title_from_url-instance_method"> #<strong>title_from_url</strong>(url) ⇒ <tt>Object</tt> </h3><div class="docstring"> <div class="discussion"> <p>Turn the last meaningful path segment of a URL into a human-readable title: "<a href="https://blog.google/technology/ai/gemini-update-2024/&quot">https://blog.google/technology/ai/gemini-update-2024/&quot</a>; becomes "Gemini Update 2024". Trailing slashes, query strings and fragments are ignored, percent-escapes are decoded, and a page extension is dropped. Segments carrying no letters on their own (ids, /2024/05/ date parts) are skipped in favour of an earlier one, and a URL left with no wordy segment at all - a bare domain, an all-numeric path - falls back to its host. Never raises and never returns an empty string.</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 136 137 138 139 140 141 142 143 144 145</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 136</span> <span class='kw'>def</span> <span class='id identifier rubyid_title_from_url'>title_from_url</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='id identifier rubyid_segments'>segments</span> <span class='op'>=</span> <span class='id identifier rubyid_url_path_segments'>url_path_segments</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='id identifier rubyid_segments'>segments</span><span class='lbracket'>[</span><span class='op'>-</span><span class='int'>1</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_strip_page_extension'>strip_page_extension</span><span class='lparen'>(</span><span class='id identifier rubyid_segments'>segments</span><span class='lbracket'>[</span><span class='op'>-</span><span class='int'>1</span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='kw'>unless</span> <span class='id identifier rubyid_segments'>segments</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span> <span class='id identifier rubyid_title'>title</span> <span class='op'>=</span> <span class='id identifier rubyid_humanize_segment'>humanize_segment</span><span class='lparen'>(</span><span class='id identifier rubyid_segments'>segments</span><span class='period'>.</span><span class='id identifier rubyid_reverse'>reverse</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_segment'>segment</span><span class='op'>|</span> <span class='id identifier rubyid_segment'>segment</span><span class='period'>.</span><span class='id identifier rubyid_match?'>match?</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>[[:alpha:]]</span><span class='regexp_end'>/</span></span><span class='rparen'>)</span> <span class='rbrace'>}</span><span class='rparen'>)</span> <span class='kw'>return</span> <span class='id identifier rubyid_title'>title</span> <span class='kw'>unless</span> <span class='id identifier rubyid_title'>title</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span> <span class='id identifier rubyid_host'>host</span> <span class='op'>=</span> <span class='id identifier rubyid_url_host'>url_host</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='id identifier rubyid_host'>host</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span> <span class='op'>?</span> <span class='const'><span class='object_link'><a href="#FALLBACK_TITLE-constant" title="AlExtPosts::ExternalPostsGenerator::FALLBACK_TITLE (constant)">FALLBACK_TITLE</a></span></span> <span class='op'>:</span> <span class='id identifier rubyid_host'>host</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="url_host-instance_method"> #<strong>url_host</strong>(url) ⇒ <tt>Object</tt> </h3><div class="docstring"> <div class="discussion"> <p>Host of a URL, without a leading "www.". Empty when there is none.</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 160 161 162 163 164 165 166 167 168</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 160</span> <span class='kw'>def</span> <span class='id identifier rubyid_url_host'>url_host</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='id identifier rubyid_host'>host</span> <span class='op'>=</span> <span class='kw'>begin</span> <span class='const'>URI</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_host'>host</span> <span class='kw'>rescue</span> <span class='const'>URI</span><span class='op'>::</span><span class='const'>Error</span> <span class='kw'>nil</span> <span class='kw'>end</span> <span class='id identifier rubyid_host'>host</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_sub'>sub</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>\Awww\.</span><span class='regexp_end'>/i</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> <div class="method_details "> <h3 class="signature " id="url_path_segments-instance_method"> #<strong>url_path_segments</strong>(url) ⇒ <tt>Object</tt> </h3><div class="docstring"> <div class="discussion"> <p>Path segments of a URL, percent-decoded and stripped of blanks. Falls back to trimming the query/fragment by hand for inputs URI cannot parse.</p> </div> </div> <div class="tags"> </div><table class="source_code"> <tr> <td> <pre class="lines"> 149 150 151 152 153 154 155 156 157</pre> </td> <td> <pre class="code"><span class="info file"># File 'lib/al_ext_posts.rb', line 149</span> <span class='kw'>def</span> <span class='id identifier rubyid_url_path_segments'>url_path_segments</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='rparen'>)</span> <span class='id identifier rubyid_path'>path</span> <span class='op'>=</span> <span class='kw'>begin</span> <span class='const'>URI</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span><span class='id identifier rubyid_url'>url</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_path'>path</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span> <span class='kw'>rescue</span> <span class='const'>URI</span><span class='op'>::</span><span class='const'>Error</span> <span class='id identifier rubyid_url'>url</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_scrub'>scrub</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>#</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='int'>2</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_first'>first</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>?</span><span class='tstring_end'>'</span></span><span class='comma'>,</span> <span class='int'>2</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_first'>first</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span> <span class='kw'>end</span> <span class='id identifier rubyid_path'>path</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>/</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_segment'>segment</span><span class='op'>|</span> <span class='id identifier rubyid_decode_url_segment'>decode_url_segment</span><span class='lparen'>(</span><span class='id identifier rubyid_segment'>segment</span><span class='rparen'>)</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_reject'>reject</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_segment'>segment</span><span class='op'>|</span> <span class='id identifier rubyid_segment'>segment</span><span class='period'>.</span><span class='id identifier rubyid_strip'>strip</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span> <span class='rbrace'>}</span> <span class='kw'>end</span></pre> </td> </tr> </table> </div> </div> </div> <div id="footer"> Generated on Wed Jul 29 03:46:53 2026 by <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a> 0.9.45 (ruby-4.0.2). </div> </div> </body> </html>