#!/usr/bin/perl use strict; use warnings; use FindBin qw( $RealBin ); use lib $RealBin; use Journalizer; use Gtk2 '-init'; use Gtk2::GladeXML; use Gtk2::Spell; use constant XMLPATH => "$RealBin/journalizer.glade"; use constant TEMPFILE => $ARGV[0] || "/tmp/journalizer.$$.txt"; ######################################################################## # INIT ######################################################################## die "we need gtk+ version 2.4 or later -- you have version " . join( '.', Gtk2->GET_VERSION_INFO ) . "\n" unless Gtk2->CHECK_VERSION( 2, 4, 0 ); my $g = Gtk2::GladeXML->new(XMLPATH); $g->signal_autoconnect_from_package('main'); my $main = $g->get_widget('main'); my $title = $g->get_widget('title'); my $input = $g->get_widget('input'); my $output = $g->get_widget('output'); my $status = $g->get_widget('status'); my $spell = Gtk2::Spell->new_attach($input); $spell->set_language('en'); my $starttext = -t STDIN ? '' : do { local $/; }; if (@ARGV) { die "usage: $0 [filename]\n" if @ARGV > 1; my $io = io(TEMPFILE); $starttext .= $io->slurp if $io->exists; } $starttext =~ s/^(.+?)(\n|\z)//s; my $starttitle = defined $1 ? $1 : ''; $input->get_buffer->set_text($starttext); $title->set_text($starttitle); $output->modify_font( Gtk2::Pango::FontDescription->from_string('Monospace 7') ); Gtk2->main; exit 0; ######################################################################## # HELPER FUNCTIONS ######################################################################### sub get_text_from_view { my $buffer = shift->get_buffer; $buffer->get_text( $buffer->get_start_iter, $buffer->get_end_iter, 1 ); } sub output_text { get_text_from_view($output); } sub input_text { get_text_from_view($input); } sub status { $status->pop(0); $status->push( 0, shift ); } sub error { my $dialog = Gtk2::MessageDialog->new( $main, [qw/modal destroy-with-parent/], 'error', 'ok', @_ ); $dialog->run; $dialog->destroy; } sub process { status("Processing..."); $output->get_buffer->set_text( Journalizer::Formatter::format( input_text() ) ); status("Done processing."); } sub save { status("Saving..."); my $t = io(TEMPFILE); $t->println( $title->get_text ); $t->print( input_text() ); chmod 0600, TEMPFILE; status( "Saved to " . TEMPFILE ); } sub quit { Gtk2->main_quit; } sub post { process(); status("Attempting to post...."); unless ( $title->get_text ) { error("No title!"); return; } unless ( output_text() ) { error("No body!"); return; } my $newid = eval { Journalizer->add_entry( { title => $title->get_text, body => output_text(), } ); }; if ($@) { error("An error occurred posting: $@"); status("An error occurred."); } else { status("Entry has been successfully posted as $newid"); } } ######################################################################## # CALLBACKS ######################################################################### sub on_quit_activate { quit() } sub on_main_delete_event { quit() } sub on_save_activate { save() } sub on_process_activate { process() } sub on_post_activate { post() }