#!/usr/bin/perl use strict; use warnings; use Time::Piece; use HTTP::Tiny; use JSON::MaybeXS; # For wrapping comment blocks. use Unicode::LineBreak; my $lb = Unicode::LineBreak->new(ColMax => 76); # Default is 76. # Printing UTF-8 to STDOUT. binmode(STDOUT, "encoding(UTF-8)"); die "usage: draco [-dhv] \n" unless scalar @ARGV; my $DEBUG; my $VERSION = "v0.3.2"; # Dispatch table to be parsed before url. my %dispatch = ( '-v' => sub { print "Draco $VERSION\n"; exit; }, '-d' => sub { $DEBUG = 1; print STDERR "draco: debug on.\n"; }, '-h' => sub { print qq{Draco $VERSION Options: -d Turn on debug messages. Debug messages will be printed to STDERR. -h Print this help. -v Print version. Environment Variables: FETCH_ALL Fetch all comments. This will make multiple HTTP calls to reddit. }; exit; }, ); if (exists $dispatch{$ARGV[0]}) { # shift @ARGV to get $url in next shift. $dispatch{shift @ARGV}->(); } # This is the start time. my $start_time = time; my $last_log = $start_time; # $url contains the reddit post. Raise the limit to 500 comments which # is the maximum reddit allows. my $url = shift @ARGV; my $json_url = "${url}.json?limit=500&sort=top"; my $http = HTTP::Tiny->new( verify_SSL => 1 ); # Fetch the post. print_time() if $DEBUG; print STDERR "fetching `$json_url'.\n" if $DEBUG; my $response = get_response($json_url); # Decode json. print STDERR "decoding json response.\n" if $DEBUG; my $json_data = decode_json($response->{content}); # $post contains post data my $post = $json_data->[0]->{data}->{children}->[0]->{data}; # $comments contains comment data. We are interested in: replies, # author, body, created_utc & permalink. my $comments = $json_data->[1]->{data}->{children}; # Start the Org document. print "#+", "STARTUP:content\n"; # Print the date. my $current_date = Time::Piece->new->strftime('%+'); print "#+", "DATE: $current_date\n"; print "\n"; # Print the post title & it's link. print "* ", "[[$post->{url}][$post->{title}]]\n"; # Add various details to :PROPERTIES:. print ":PROPERTIES:\n"; # Include the created date & archive date in properties. print ":CREATED_UTC: ", Time::Piece->strptime($post->{created_utc}, '%s') ->strftime('%+'), "\n"; print ":ARCHIVE_DATE: $current_date\n"; foreach my $detail (qw( subreddit created_utc author permalink upvote_ratio ups downs score )) { print ":${detail}: =$post->{$detail}=\n" if scalar $post->{$detail}; } print ":END:\n"; # Add selftext if present. print "\n#+BEGIN_SRC markdown\n", # Break the text at 76 column & add 2 space before every new line. " ", $lb->break($post->{selftext}) =~ s/\n/\n\ \ /gr, "\n", "#+END_SRC\n" if scalar $post->{selftext}; my (@http_calls, %counter); $counter{print_comment_chain_call} = 0; $counter{iterate_over_comments_call} = 0; print_time() if $DEBUG; print STDERR "iterating over top-level comments.\n" if $DEBUG; # We are going to put a dot after each HTTP call. Dot on first HTTP # call is skipped so we print this message only if user has set # `FETCH_ALL' because that'll be the reason Draco makes multiple HTTP # calls. print STDERR "each dot is a HTTP call.\n" if $DEBUG and $ENV{FETCH_ALL}; # Iterate over top-level comments. The second argument is level # (depth), it should be 0 for top-level comments. iterate_over_comments($comments, 0); # Seperate the dots with the rest by a "\n". print STDERR "\n" if $DEBUG and $ENV{FETCH_ALL}; print_time() if $DEBUG; # Print impo
{
  "scripts": {
    "prestart": "cp node_modules/purecss/build/pure-min.css public/pure.css",
    "prebuild": "npm run prestart",
    "start": "snowpack dev",
    "build": "snowpack build",
    "test": "echo \"This template does not include a test runner by default.\" && exit 1"
  },
  "devDependencies": {
    "@snowpack/plugin-svelte": "^3.7.0",
    "snowpack": "^3.3.7"
  },
  "dependencies": {
    "dayjs": "^1.10.6",
    "fast-csv": "^4.3.6",
    "minimist": "^1.2.5",
    "purecss": "^2.0.6",
    "svelte": "^3.42.1"
  }
}
t comment details. print ":PROPERTIES:\n"; print ":CREATED_UTC: ", Time::Piece->strptime($comment_data->{created_utc}, '%s') ->strftime('%+'), " (=$comment_data->{created_utc}=)\n"; foreach my $detail (qw( author permalink score edited stickied controversiality author_flair_text )) { print ":${detail}: =$comment_data->{$detail}=\n" if scalar $comment_data->{$detail}; } print ":END:\n"; print "\n#+BEGIN_SRC markdown\n", # Break the text at 76 column & add 2 space before every new # line. " ", $lb->break($comment_data->{body}) =~ s/\n/\n\ \ /gr, "\n", "#+END_SRC\n"; # If the comment has replies then iterate over those too. if (scalar $comment_data->{replies}) { iterate_over_comments($comment_data->{replies}->{data}->{children}, $level + 1); } }