view release on metacpan or search on metacpan
LICENSE
MANIFEST
META.json
META.yml
Makefile.PL
README
devdata/https_mojolicious.io_blog_2018_12_01_welcome-mojoconf-recap_
devdata/https_mojolicious.io_blog_2018_12_02_automatic-reload-for-rapid-development_
devdata/https_mojolicious.io_blog_2018_12_03_higher-order-promises_
devdata/https_mojolicious.io_blog_2018_12_04_testing-hooks-and-helpers_
devdata/https_mojolicious.io_blog_2018_12_05_compound-selectors_
devdata/https_mojolicious.io_blog_2018_12_06_making-a-list-with-yancy_
devdata/https_mojolicious.io_blog_2018_12_07_openapi_
devdata/https_mojolicious.io_blog_2018_12_08_authenticating-with-ldap_
devdata/https_mojolicious.io_blog_2018_12_09_add-a-theme-system-to-your-mojolicious-app_
devdata/https_mojolicious.io_blog_2018_12_10_minion-stands-alone_
devdata/https_mojolicious.io_blog_2018_12_11_who-watches-the-minions_
devdata/https_mojolicious.io_blog_2018_12_12_dancer-and-minion_
devdata/https_mojolicious.io_blog_2018_12_13_taking-on-roles_
devdata/https_mojolicious.io_blog_2018_12_14_a-practical-example-of-mojo-dom_
devdata/https_mojolicious.io_blog_2018_12_15_practical-web-content-munging_
devdata/https_mojolicious.io_blog_2018_12_04_testing-hooks-and-helpers_ view on Meta::CPAN
<h5>Doug Bell</h5>
<p>Doug (<a href="http://preaction.me">preaction</a>) is a long time Perl user.
He is the current maintainer of <a href="http://www.cpantesters.org/">CPAN Testers</a> and the author of many <a href="https://metacpan.org/author/PREACTION">CPAN modules</a> including the <a href="http://preaction.me/statocles/">Statocles</a> blog e...
</div>
</div>
<ul class="post-nav cf">
<li class="prev"><a href="/blog/2018/12/03/higher-order-promises/index.html" rel="prev"><strong>Previous Article</strong> Day 3: Higher Order Promises</a></li>
<li class="next"><a href="/blog/2018/12/05/compound-selectors/index.html" rel="next"><strong>Next Article</strong> Day 5: Compound Selectors are Easier than Regexes </a></li>
</ul>
</div>
</article>
</div>
<div class="four columns end" id="secondary">
devdata/https_mojolicious.io_blog_2018_12_05_compound-selectors_ view on Meta::CPAN
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<link href="/theme/css/default.css" rel="stylesheet">
<link href="/theme/css/layout.css" rel="stylesheet">
<link href="/theme/css/media-queries.css" rel="stylesheet">
<link href="/theme/css/statocles.css" rel="stylesheet">
<!-- twitter and opengraph -->
<meta content="summary" name="twitter:card">
<meta content="@briandfoy_perl" name="twitter:creator">
<meta content="https://mojolicious.io/blog/2018/12/05/compound-selectors/" property="og:url">
<meta content="Day 5: Compound Selectors are Easier than Regexes" property="og:title">
<meta content="Extract HTML quickly and easily with Mojo::DOM" property="og:description">
<meta content="https://mojolicious.io/blog/2018/12/05/compound-selectors/banner.jpg" property="og:image">
<meta content="summary_large_image" name="twitter:card">
<script src="/theme/js/modernizr.js"></script>
<link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">
<title>Day 5: Compound Selectors are Easier than Regexes - mojolicious.io</title>
<meta content="brian d foy" name="author">
<meta content="Statocles 0.093" name="generator">
<link href="/static/favicon.ico" rel="shortcut icon">
devdata/https_mojolicious.io_blog_2018_12_05_compound-selectors_ view on Meta::CPAN
<time class="date" datetime="2018-12-05">Dec 5, 2018</time>
</p>
</div>
<div class="post-thumb">
<!-- theme suggests 1300x500 -->
<img alt="Sled dogs waiting to run" src="/blog/2018/12/05/compound-selectors/banner.jpg">
</div>
<div class="post-content">
<section id="section-1">
<p>When people tell me that I can't (they mean shouldn't) parse HTML with a regex, I say "hold my beer". It isn't a matter of skill or attitude so much as convenience. Doing it the right way was not always so e...
</section>
<section id="section-2">
<p>The trick was always to isolate the interesting HTML. I could do that excising all of the data around the interesting parts:</p>
devdata/https_mojolicious.io_blog_2018_12_05_compound-selectors_ view on Meta::CPAN
<h2>Cascading Style Sheets</h2>
<p>You may know about Cascading Style Sheets (CSS) for making your web pages look beautiful (but not mine, really). You can add meta data to tags:</p>
<pre><code><img id="bender" class="robot" src="..." />
<img id="fry" class="human" src="..." />
<img id="leela" class="mutant" src="..." />
</code></pre>
<p>CSS rules can address these items by their ID or class to apply styles to them. This addressing is a "selector" and people with better skills than me use these to make the presentation pretty:</p>
<pre><code>img#fry { border: 1px; }
img.robot { margin: 20px; }
</code></pre>
<p>The HTML can be a bit more complicated. Perhaps those interesting tags are in a list. That wraps another layer of HTML structure around the data:</p>
<pre><code><ul class="employees">
<li><img id="bender" class="robot" src="..." /></li>
<li><img id="fry" class="human" src="..." /></li>
<li><img id="leela" class="mutant" src="..." /></li>
</ul>
</code></pre>
<p>If I'd like to affect only those images in that list but only the items in that list. I can specify the ancestry with a compound selector (two or more used together). With just a space between the selectors, this means that the second selector...
<pre><code>ul.employees img.human { border: 1px; }
ul.employees img.robot { margin: 20px; }
</code></pre>
<p>However, this article isn't about all the fancy things that you can do with selectors. You know that they exist and you can see the possibilities in <a href="https://mojolicious.org/perldoc/Mojo/DOM/CSS">Mojo::CSS::Selectors</a>. I'll show...
<h2>Using Selectors with Mojo</h2>
<p>But you can do much more with these. With <a href="https://mojolicious.org/perldoc/Mojo/DOM">Mojo::DOM</a>, which supports CSS Selectors <a href="https://www.w3.org/TR/2018/PR-selectors-3-20180911/">Level 3</a> (and some stuff from <a href="https:...
<p>Start with some HTML. Note the fancy new <a href="https://www.effectiveperlprogramming.com/2016/12/strip-leading-spaces-from-here-docs-with-v5-26/">indented here doc syntax introduced in Perl 5.26</a>:</p>
<pre><code>use v5.28;
use utf8;
use strict;
use warnings;
use Mojo::DOM;
my $selector = $ARGV[0] // 'img';
my $html =<<~'HTML';
<img id="farnworth " class="human" src="..." />
<ul class="employees">
<li><img id="bender" class="robot" src="..." /></li>
<li><img id="fry" class="human" src="..." /></li>
<li><img id="leela" class="mutant" src="..." /></li>
</ul>
HTML
my $dom = Mojo::DOM->new( $html );
say $dom->find( $selector )->join( "\n" );
</code></pre>
<p>Run this with no argument and I see all the <code>img</code> tags:</p>
<pre><code>$ perl html.pl
<img class="human" id="farnworth " src="...">
<img class="robot" id="bender" src="...">
<img class="human" id="fry" src="...">
<img class="mutant" id="leela" src="...">
</code></pre>
<p>With an argument I can choose any part that I like. Here I get the parts starting with the <code>li</code> tag:</p>
<pre><code>$ perl html.pl li
<li><img class="robot" id="bender" src="..."></li>
<li><img class="human" id="fry" src="..."></li>
<li><img class="mutant" id="leela" src="..."></li>
</code></pre>
<p>I can select all the images with a certain class:</p>
<pre><code>$ perl html.pl img.human
<img class="human" id="farnworth " src="...">
<img class="human" id="fry" src="...">
</code></pre>
<p>But what if I wanted just the human images in the list? I have to work a little bit harder. I specify a compound selector that notes that the <code>img</code> has to be in an <code>li</code> tag:</p>
<pre><code>$ perl html.pl "li img.human"
<img class="human" id="fry" src="...">
</code></pre>
<p>Imagine, then, more complicated HTML with other lists that also had images? I could add another selector to say it has to be in a certain sort of <code>ul</code> tag:</p>
<pre><code>$ perl html.pl "ul.employees li img.human"
<img class="human" id="fry" src="...">
</code></pre>
<p>If nothing should be between those tags. I can connect the selector with <code>></code> to mean those should be immediate children instead of descendants:</p>
<pre><code>$ perl html.pl "ul.employees > li > img.human"
<img class="human" id="fry" src="...">
</code></pre>
<p>Now, consider how much work I've done there. Almost nothing. I made a DOM object, applied a selector, and I've isolated parts of the data. This is the same thing I was doing the hard way before. This way is better and isn't more work. ...
<h2>How about those new emojis?</h2>
<p>While writing about the <a href="https://www.effectiveperlprogramming.com/2018/08/find-the-new-emojis-in-perls-unicode-support/">Unicode 9 updates in Perl v5.26</a>, I wondered what I could show that might be interesting. How about figuring out wh...
<p>My first attempt simply trawled through every character and compared the various Unicode properties to see which code numbers changed from <code>Unassigned</code> to <code>Present_In</code>. That was fine, but then I found that someone was already...
<p>I won't explain everything in this program. Trust me that it uses <a href="https://mojolicious.org/perldoc/Mojo/UserAgent">Mojo::UserAgent</a> to fetch the data, extracts the DOM, and finds the text I want by using the compound selector <code>...
<pre><code>use v5.28;
use utf8;
use strict;
use warnings;
use open qw(:std :utf8);
use charnames qw();
use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
devdata/https_mojolicious.io_blog_2018_12_05_compound-selectors_ view on Meta::CPAN
ðµ (U+1F6F5) MOTOR SCOOTER
ð¶ (U+1F6F6) CANOE
</code></pre>
<p>I used the same program to find <a href="https://www.effectiveperlprogramming.com/2018/08/use-unicode-10-in-perl-v5-28/">the Unicode 10 updates in v5.28</a> too.</p>
<h2>Extracting columns from a table</h2>
<p>Not impressed yet? How about slicing a table with CSS Selectors? Here's a short table that has ID, name, and score columns. I want to sum all of the scores.</p>
<p>I'm not afraid of doing with this with regexes (emphasize plural there!) but it's easier with <a href="https://mojolicious.org/perldoc/Mojo/DOM">Mojo::DOM</a>. The compound selector finds the table by its class, selects each row, and addre...
<pre><code>use v5.26;
use utf8;
use strict;
use warnings;
use List::Util qw(sum);
use Mojo::DOM;
my $html = <<~'HTML';
devdata/https_mojolicious.io_blog_2018_12_05_compound-selectors_ view on Meta::CPAN
my $grand = sum( @scores );
say "Grand total: $grand";
</code></pre>
<p><em style="font-size: 10px">
Editor's note: Unfortunately this example breaks our syntax highlighter. This is the site's fault not the author. We're trying to find a better way to render it short of rewriting the rendering engine.
</em></p>
<h2>Conclusion</h2>
<p>Even for an old programmer like me, dealing with HTML through CSS Selectors applied by Mojolicious is much easier than what I was doing before (which was dirty and much easier than doing it correctly). With a little skill creating compound selecto...
</section>
<small><p><a class="external text" href="https://www.flickr.com/photos/feuilllu/101083313/in/photolist-9W5xK-SWEcv6-qmMqBb-9W66e-umaBj-7Gkg2a-bnmWDf-jZPHK7-bAgNFi-bnmW3J-Hd8y3-dYNuYc-Hd9o9-22MW7qW-6qZWkL-7yzScF-24W5o6o-bBNUMi-5QPxcD-boz...
</small>
<p class="tags">
<span>Tagged in </span>:
<a href="/blog/tag/promises/">promises</a>,
<a href="/blog/tag/advent/">advent</a>
</p>
devdata/https_mojolicious.io_blog_2018_12_06_making-a-list-with-yancy_ view on Meta::CPAN
<div class="about">
<h5>Doug Bell</h5>
<p>Doug (<a href="http://preaction.me">preaction</a>) is a long time Perl user.
He is the current maintainer of <a href="http://www.cpantesters.org/">CPAN Testers</a> and the author of many <a href="https://metacpan.org/author/PREACTION">CPAN modules</a> including the <a href="http://preaction.me/statocles/">Statocles</a> blog e...
</div>
</div>
<ul class="post-nav cf">
<li class="prev"><a href="/blog/2018/12/05/compound-selectors/index.html" rel="prev"><strong>Previous Article</strong> Day 5: Compound Selectors are Easier than Regexes</a></li>
<li class="next"><a href="/blog/2018/12/07/openapi/index.html" rel="next"><strong>Next Article</strong> Day 7: MetaCPAN, Mojolicious and OpenAPI </a></li>
</ul>
</div>
</article>
</div>
devdata/https_mojolicious.io_blog_2018_12_14_a-practical-example-of-mojo-dom_ view on Meta::CPAN
<p><a href="https://mojolicious.org/perldoc/Mojo/File">Mojo::File</a> makes reading <code>pointclouds.xml</code> so I can parse it with Mojo::DOM simple:</p>
<pre><code>my $file = Mojo::File->new($path, 'pointclouds.xml');
my $dom = Mojo::DOM->new($file->slurp);
</code></pre>
<p>In the <a href="https://cgi-lib.berkeley.edu/2.18/cgi-lib.pl.txt">bad old days</a>, I probably hand wrote 15 lines of (horrible) code every time I wanted to read a file.</p>
<h2>Mojo::DOM - what can't it do?</h2>
<p>And of course, <a href="https://mojolicious.org/perldoc/Mojo/DOM">Mojo::DOM</a> makes finding the right values in the XML easy - it also handles HTML and CSS selectors. Basically, I just iterate through the contents of <code>PointCloudData</code>...
<pre><code>for my $e ($dom->find('PointCloudData')->each) {
$e->{Folder} = rename_files($e) and $e->{Hash} = '' if $e->{Hash};
}
</code></pre>
<p>I only run <code>rename_files</code> if <code>Hash</code> is populated, and if it is, I empty it so I don't try to rename them again. <code>rename_files</code> is about the only Perl code I had to write myself - almost everything else was cop...
<p>A substitution stores the desired file & folder name in <code>$newname</code> (non-destructive modifier <code>/r</code> allows me to work on a copy of <code>$e</code> without changing the original). Then I simply rename the point cloud folder...
devdata/https_mojolicious.io_blog_2018_12_15_practical-web-content-munging_ view on Meta::CPAN
</div>
<div class="post-thumb">
<!-- theme suggests 1300x500 -->
<img alt="An eyeball of alarming size" src="/blog/2018/12/15/practical-web-content-munging/banner.jpg">
</div>
<div class="post-content">
<section id="section-1">
<p>Following brian d foy's great <a href="https://mojolicious.io/blog/2018/12/05/compound-selectors/">write-up of using Mojo::DOM selectors from Day 5</a>, I thought it'd be fun to talk about some website migration scripts I...
<h2>From Static Site to Static Site Generator</h2>
<p>The problem I set out to solve was taking an old static website that was once hosted on SourceForge.net and migrating it to an exciting new...um...static website. But, this time, it'll be a modern take on a static website. Instead of editing H...
</section>
<section id="section-2">
<p>Hugo, like most modern static site generators, expects content to be in Markdown format with some metadata at the top of the file. I want to convert our crusty old HTML, as you'll see an example of below, into something that ...
<pre><code>---
devdata/https_mojolicious.io_blog_2018_12_15_practical-web-content-munging_ view on Meta::CPAN
<p>That's it! We just fetched a web page. You might be tempted to print out $tx to see what's in it (that's what I did, rather than reading the docs, at first). But, it's a <a href="https://mojolicious.org/perldoc/Mojo/Transaction/HTT...
<pre><code>print $tx->res->body();
</code></pre>
<p>This will display the response body with its HTML contents. But, that's not really very interesting. But, we can do much more interesting and powerful things very easily with a Mojo response.</p>
<h2>CSS Selectors</h2>
<p>The <code>res</code> response object provides a <code>dom</code> object, that gives the ability to select parts of an HTML document using CSS selectors. So, if I have a document with a <code>#main</code> div, I can retrieve just the contents of th...
<pre><code>my $main = $tx->res->dom->find("#main");
</code></pre>
<p>Of course, if you're familiar with CSS selectors, you know it can be more precise than that. So, let's talk about something concrete. In my case, I have a couple of different types of page. One is a page of news items, which is lots of sec...
<p>I want to divide those news items out into their own individual pages, which can then be aggregated in whatever way I like, such as having them available in a paginated list or having the most recent items included in a div on the front page of th...
<p>Those news items look something like this on the old site:</p>
<pre><code><h1>Latest News</h1>
<h3>Frobnitz 4.5 released</h3>
<p>
This release improves castigation of the widely formed sonterols.
devdata/https_mojolicious.io_blog_2018_12_15_practical-web-content-munging_ view on Meta::CPAN
<p>
This release is effulgent and wavering gently.
<br>
Becomes bees.
</p>
<p class="post-footer align-right">
<span class="date">November 30, 2018</span>
</p>
</code></pre>
<p>Notice that the structure of this is regular but not selectable with any one div or piece of markup. I can use the selector <code>h3</code> to get the headings, but the text of each news item is just a paragraph, and we also want to grab the date ...
<p>So, I want to grab all of the titles, and the paragraph following the title, and the date, and put them all into some sort of data structure so I can spit them out into pages of their own.</p>
<p>Let's start with the titles, as it'll show a neat trick Mojo has up its sleeves.</p>
<pre><code>my $main = $tx->res->dom->at('#main');
my @headers = $main->find('h3')->map('text')->each;
</code></pre>
<p>Do you see it? The <code>find</code> method here is returning a <a href="https://mojolicious.org/perldoc/Mojo/Collection">Mojo::Collection</a>. "Collection" is kind of a fancy way to say "list", but these lists have a bunch of ...
devdata/https_mojolicious.io_blog_2018_12_15_practical-web-content-munging_ view on Meta::CPAN
<p>After this, <code>@headers</code> will contain all of the titles. There's no way I could do that as simply with regexes (and, we could have chained all of this, including finding <code>#main</code>, into one line, but I'm re-using <code>#m...
<p>Now, an even trickier thing to do with regexes would be to find the immediately subsequent sibling of these headers. But, with Mojo::DOM, we can grab it with just a few more lines of code (there's probably a way to do it with even less code, b...
<pre><code>my @paras;
for my $header ($main->find('h3')->each) {
push (@paras, $header->next->content);
}
</code></pre>
<p>This, once again selects the <code>h3</code> elements, and iterates over the resulting collection of DOM objects, putting each one into <code>$header</code> as it loops. Then we pick out the <code>content</code> of the <code>next</code> element (w...
<p>So, now we've got an array of headers, an array of the following paragraphs, and we just need to get the dates. This one is actually very easy, because the HTML template marks the date using a <code>date</code> class.</p>
<pre><code>my @dates = $main->find('.date')->map('text')->each;
</code></pre>
<p>Pow! We're done. OK, not quite. We've yet to deliver on the "munging" part of the title of this post. We have the data from our crusty old HTML site, now let's do something with it.</p>
<h2>Munging the Dates</h2>
devdata/https_mojolicious.io_blog_2018_12_20_testing-dancer_ view on Meta::CPAN
->text_is('dl#data dt#hello + dd', 'world');
$t->post_ok('/html' => form => { name => 'grinch' })
->status_is(200)
->content_type_like(qr[text/html])
->text_is('dl#data dt#hello + dd', 'grinch');
done_testing;
</code></pre>
<p>In this year's Mojolicious advent calendar, we've already seen <a href="https://mojolicious.io/blog/2018/12/05/compound-selectors/">some</a> <a href="https://mojolicious.io/blog/2018/12/14/a-practical-example-of-mojo-dom/">great</a> <a hre...
The point remains however, testing HTML responses with CSS selectors allows you to make your tests targetd in a way that allows you to write more and better tests since you don't have to hack around extracting the bits you want.</p>
<h2>Testing WebSockets</h2>
<p>Ok so that's great and all, but of course now it comes to the point you've all been waiting for: can you test WebSockets?
As Jason Crome mentioned in his <a href="http://advent.perldancer.org/2018/13">Twelve Days of Dancer</a> "State of Dancer", you can now dance with WebSockets via <a href="https://metacpan.org/pod/Dancer2::Plugin::WebSocket">Dancer2::Plugin:...
<p>Well, so far not via the role I showed above.
It might be possible, but it would involve learning deep PSGI magick that I'm not sure I'm smart enough to do; patches welcome obviously :D.</p>
<p>Still I mentioned above that Test::Mojo can test anything it can access via an fully qualified URL, so let's just start up a server and test it!
devdata/https_mojolicious.io_blog_2018_12_23_mojolicious-and-angular_ view on Meta::CPAN
chunk {runtime} runtime.js, runtime.js.map (runtime) 6.08 kB [entry] [rendered]
chunk {styles} styles.js, styles.js.map (styles) 16.3 kB [initial] [rendered]
chunk {vendor} vendor.js, vendor.js.map (vendor) 3.67 MB [initial] [rendered]
ï½¢wdmï½£: Compiled successfully.
</code></pre>
<p>Open the browser to check Angular app:</p>
<p><img alt="basic angular app" src="angular_app.png"></p>
<p>Note that this page's content is coming from <code>NgDemo/src/index.html</code> where <code>app-root</code> selector html is content coming from <code>NgDemo/src/app/app.component.html</code>. Later we will be modifying <code>app.component.htm...
<h2>Make Mojolicious app serve an Angular app?</h2>
<p>First we'll compile the Angular app from <a href="https://www.typescriptlang.org/docs/home.html">TypeScript</a> to standard JavaScript.
<code>ng build</code> compiles an Angular app into an output directory named <code>dist</code> at the given output path.
Run <code>ng build</code> with <code>--base-href=./</code> so that base url inside the Angular app is set to the current directory for the application being built. This is very important so that later you do not waste time figuring out why Angular ro...
<pre><code>Sachin@02:06 PM[~/workspace/project/mojo_angular/NgDemo]$ ng build --base-href=./
Date: 2018-12-15T06:06:48.550Z
devdata/https_mojolicious.io_blog_2018_12_23_mojolicious-and-angular_ view on Meta::CPAN
<p>Where I have added two lines above: <code>import { HttpClientModule } from '@angular/common/http';</code>
and added <code>HttpClientModule</code> to the list of imports.</p>
<h4>Code app.component.ts to set MVC stage</h4>
<p>Components are the most basic UI building block of an Angular app. An Angular app contains a tree of Angular components.
Component basically creates a separate MVC world which makes code management granular and easy.
The <code>@Component</code> decorator can pass in many types of metadata to a class particularly following 3 metadata specifiers are significant:</p>
<ul>
<li><code>selector</code>: specifies which UI component it targets.</li>
<li><code>templateUrl</code>: html for that selector element and</li>
<li><code>styleUrl</code>: specifies one or more style files to be used for that html</li>
</ul>
<p><code>Component Class</code> sets up stage for two way data binding. In our case, it just makes an HTTP GET request to Mojo route we defined earlier, then binds the output to variable <code>adventDetail2018</code>. This is then available in the vi...
<pre><code>Sachin@12:33 AM[~/workspace/project/mojo_angular/NgDemo/src/app]$ cat app.component.ts
import { Component } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'Mojolicious Angular web app';
adventDetail2018;
// Inject HttpClient into your component
constructor(private http: HttpClient) {}
ngOnInit(): void {
// Make the HTTP get request to mojolicious route
devscripts/update view on Meta::CPAN
my %typos = (
#'Perl::PrereqScanner::NotSoLite' => 'Perl::PrereqScanner::NotQuiteLite',
);
my %daily_urls = (
"01" => "https://mojolicious.io/blog/2018/12/01/welcome-mojoconf-recap/",
"02" => "https://mojolicious.io/blog/2018/12/02/automatic-reload-for-rapid-development/",
"03" => "https://mojolicious.io/blog/2018/12/03/higher-order-promises/",
"04" => "https://mojolicious.io/blog/2018/12/04/testing-hooks-and-helpers/",
"05" => "https://mojolicious.io/blog/2018/12/05/compound-selectors/",
"06" => "https://mojolicious.io/blog/2018/12/06/making-a-list-with-yancy/",
"07" => "https://mojolicious.io/blog/2018/12/07/openapi/",
"08" => "https://mojolicious.io/blog/2018/12/08/authenticating-with-ldap/",
"09" => "https://mojolicious.io/blog/2018/12/09/add-a-theme-system-to-your-mojolicious-app/",
"10" => "https://mojolicious.io/blog/2018/12/10/minion-stands-alone/",
"11" => "https://mojolicious.io/blog/2018/12/11/who-watches-the-minions/",
"12" => "https://mojolicious.io/blog/2018/12/12/dancer-and-minion/",
"13" => "https://mojolicious.io/blog/2018/12/13/taking-on-roles/",
"14" => "https://mojolicious.io/blog/2018/12/14/a-practical-example-of-mojo-dom/",
"15" => "https://mojolicious.io/blog/2018/12/15/practical-web-content-munging/",
lib/Acme/CPANModules/Import/MojoliciousAdvent/2018_12_05.pm view on Meta::CPAN
package Acme::CPANModules::Import::MojoliciousAdvent::2018_12_05;
our $DATE = '2018-12-30'; # DATE
our $VERSION = '0.001'; # VERSION
our $LIST = {description=>"This list is generated by extracting module names mentioned in [https://mojolicious.io/blog/2018/12/05/compound-selectors/] (retrieved on 2018-12-30). Visit the URL for the full contents.",entries=>[{module=>"Mojo::Collecti...
1;
# ABSTRACT: Modules mentioned in Mojolicious Advent Calendar 2018 (day 05)
__END__
=pod
=encoding UTF-8
=head1 NAME
Acme::CPANModules::Import::MojoliciousAdvent::2018_12_05 - Modules mentioned in Mojolicious Advent Calendar 2018 (day 05)
=head1 VERSION
This document describes version 0.001 of Acme::CPANModules::Import::MojoliciousAdvent::2018_12_05 (from Perl distribution Acme-CPANModulesBundle-Import-MojoliciousAdvent-2018), released on 2018-12-30.
=head1 DESCRIPTION
This module is generated by extracting module names mentioned in L<https://mojolicious.io/blog/2018/12/05/compound-selectors/> (retrieved on 2018-12-30). Visit the URL for the full contents.
Modules mentioned in Mojolicious Advent Calendar 2018 (day 05).
This list is generated by extracting module names mentioned in [https://mojolicious.io/blog/2018/12/05/compound-selectors/] (retrieved on 2018-12-30). Visit the URL for the full contents.
=head1 INCLUDED MODULES
=over
=item * L<Mojo::Collection>
=item * L<Mojo::DOM>
=item * L<Mojo::DOM::CSS>