App-BookmarkFeed

 view release on metacpan or  search on metacpan

META.json  view on Meta::CPAN

         }
      },
      "configure" : {
         "requires" : {
            "ExtUtils::MakeMaker" : "6.52"
         }
      },
      "runtime" : {
         "requires" : {
            "CommonMark" : "0",
            "DateTime" : "0",
            "DateTime::Format::ISO8601" : "0",
            "File::Slurper" : "0",
            "Mojo::SQLite" : "0",
            "Mojolicious" : "0",
            "perl" : "5.036000"
         }
      },
      "test" : {
         "requires" : {
            "XML::RSS" : "0"
         }

META.yml  view on Meta::CPAN

meta-spec:
  url: http://module-build.sourceforge.net/META-spec-v1.4.html
  version: '1.4'
name: App-BookmarkFeed
no_index:
  directory:
    - t
    - inc
requires:
  CommonMark: '0'
  DateTime: '0'
  DateTime::Format::ISO8601: '0'
  File::Slurper: '0'
  Mojo::SQLite: '0'
  Mojolicious: '0'
  perl: '5.036000'
resources:
  repository: https://src.alexschroeder.ch/bookmark-feed.git
version: 1.01
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'

Makefile.PL  view on Meta::CPAN

  AUTHOR           => 'Alex Schroeder',
  LICENSE          => 'agpl_3',
  MIN_PERL_VERSION => '5.36.0',
  EXE_FILES        => [
    'script/bookmark-feed',
  ],
  PREREQ_PM => {
    'Mojolicious' => 0, # for Mojo::Template
    'Mojo::SQLite' => 0,
    'File::Slurper' => 0,
    'DateTime' => 0,
    'DateTime::Format::ISO8601' => 0,
    'CommonMark' => 0,
  },
  TEST_REQUIRES => {
    'XML::RSS' => 0,
  },
  CONFIGURE_REQUIRES => {
    'ExtUtils::MakeMaker' => '6.52',
  },
  META_MERGE => {
    'meta-spec' => { version => 2 },

lib/App/BookmarkFeed.pm  view on Meta::CPAN


our $VERSION = 1.01;

use v5.36;
use File::Basename;
use File::Spec;
use Mojo::SQLite;
use Mojo::Template;
use File::Slurper qw(read_text write_text);
use CommonMark qw(:node :event);
use DateTime;
use DateTime::Format::ISO8601;

sub main (@files) {
  my $feed_file = pop(@files);
  die "Usage:\nbookmark-feed markdown-files... feed-file\n" unless @files;
  my ($filename, $dirs, $suffix) = fileparse($feed_file, ".rss", ".xml");
  my $db_file = File::Spec->catfile($dirs, $filename . ".db");
  my $sql = Mojo::SQLite->new("sqlite:$db_file");
  $sql->migrations->from_data->migrate;
  my $db = $sql->db;
  for (@files) { die "$_ is not readable\n" unless -r $_ }
  my @items;
  for my $file (@files) {
    my $dt = DateTime->from_epoch(epoch => (stat($file))[9]);
    my $md = read_text($file);
    my $parser = CommonMark::Parser->new;
    $parser->feed($md);
    my $doc = $parser->finish;
    push(@items, to_items($doc, $dt));
  }
  update($db, @items);
  write_feed($db, $feed_file);
}

lib/App/BookmarkFeed.pm  view on Meta::CPAN


sub write_feed ($db, $feed_file) {
  my $mt = Mojo::Template->new(vars => 1);
  my $items = $db->select('items',
                          [qw(date url title description)],
                          { },
                          {
                            order_by => {-desc => 'date'},
                            limit => 40,
                          })->hashes;
  $_->{date} = DateTime::Format::ISO8601
      ->parse_datetime($_->{date})
      ->strftime("%a, %d %b %Y %H:%M:%S %z")
      for @$items;
  my $feed = $mt->render(<<'EOT', { items => $items});
<rss version="2.0">
  <channel>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <title>Bookmarks</title>
% for my $item (@$items) {
    <item>



( run in 0.331 second using v1.01-cache-2.11-cpan-05444aca049 )