#!/usr/bin/perl use v5.14; use strict; use warnings; use JSON; use Clone 'clone'; use IO::Handle; # Send the header so that i3bar knows we want to use JSON: printf "%s", '{"version":1}'; # Begin the endless array. printf "%s", '['; # We send an empty first array of blocks to make the loop simpler: printf "%s",'[],'; open my $conky, "-|:encoding(utf8)", "conky -c $ENV{HOME}/.i3/conkyrc-perl"; STDOUT->autoflush(); my @data; my %in_progress; my $json = JSON->new; $json->ascii([1]); my %simple_mappings = ( "SHORTTEXT" => "shorttext", ); while (<$conky>) { chomp($_); next if m/^\s+$/; if (m/^END_BLOCK$/) { STDOUT->printf("%s,\n", $json->encode(\@data)); undef @data; next; } if (m/^COLOR: (#[a-zA-Z0-9]+)$/) { $in_progress{color} = $1; next; } for my $key (keys %simple_mappings) { if (m/^$key: (.*)$/) { $in_progress{$simple_mappings{$key}} = $1; next; } } if (m/^FULLTEXT: (.*)$/) { my $fulltext = $1; $in_progress{full_text} = $fulltext; push @data, clone \%in_progress; undef %in_progress; next; } printf STDERR "Got unexpected data: %s\n", $_; }