Saturday, October 01, 2016

Run a server from Node.js

Step 1: Download and install Node.js from https://nodejs.org/en/

Step 2: Launch node from command prompt and verify it has installed correctly

Step 3: Create a new file server.js as follows:

var http = require('http');
var fs = require('fs');
var url = require('url');

http.createServer( function (request, response)
{
   var pathname = url.parse(request.url).pathname;
   fs.readFile(pathname.substr(1), function (err, data)
   {
      if (err)
      {
         console.log(err);
         response.writeHead(404, {'Content-Type': 'text/html'});
         response.write(err.toString());
      }

Create JSON from HTML in Perl

Assumption: Your HTML file is not pretty-encoded i.e. all content is contained in a single line.

Code:

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use JSON;
use autodie;

open my $fh1, '<files.html' or die "Cannot open files.html: $!\n";

my $html = <$fh1>;

$html =~ s/<html><head><title>JSON Viewer<\/title><\/head><body><table border="1"><thead><tr><th width="300">Keys<\/th><th width="500">Values<\/th><\/tr><\/thead><tbody>//g;
$html =~ s/<\/tbody><\/table><\/body><\/html>//g;

my @rows = split("<\/tr>", $html);

my %data;

foreach my $row (@rows)
{
    my @cols = split("<\/td>", $row);
    my $key;
   
    foreach my $col (@cols)
    {
        if (not $col =~ /<br\/>/)
        {
            $col =~ s/<tr><td>//g;
            $key = $col;
        }
        else
        {
            my @values = split("<br\/>", $col);
          
            foreach my $value (@values)
            {
                $value =~ s/<td>//g;
                push @{ $data{$key} }, $value;
            }
        }
    }
}

close($fh1) or die "Cannot close files.html: $!\n";

my $json = encode_json \%data;
open my $fh2,">files.json" or die "open failed <output: files.json>: $!\n";
print $fh2 $json or die "print failed <output: files.json>: $!\n";
close $fh2 or die "close failed <output: files.json>: $!\n";

Create HTML from JSON in Perl

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use JSON;
use autodie;
use HTML::TreeBuilder;

my $string;
{
    local $/;
    open my $fh1,"<files.json" or die "open failed <files.json>: $!\n";
    $string = <$fh1>;
    close $fh1 or die "close failed <files.json>: $!\n";
}

# Parse JSON in PERL
my $data = decode_json($string);

# Initialize HTML
my $html = "<html><head><title>JSON Viewer</title></head><body><table border=\"1\"><thead><tr><th width=\"300\">Keys</th><th width=\"500\">Values</th></tr></thead><tbody>";

# Update HTML
foreach my $key (keys(%$data))
{
    $html = $html."<tr><td>".$key."</td><td>";
    my $values = $data->{$key};
    foreach my $value (@{$values})
    {
        $html = $html.$value."<br/>";
    }
    $html = $html."</td></tr>";
}
   
# Generate HTML
$html = $html."</tbody></table></body></html>";
my $h = HTML::TreeBuilder->new_from_content($html);
open my $fh2,">files.html" or die "open failed <files.html>: $!\n";
print $fh2 $h->as_HTML('',"\t") or die "print failed <files.html>: $!\n";
close $fh2 or die "close failed <files.html>: $!\n";