EBook-Generator

 view release on metacpan or  search on metacpan

lib/EBook/Generator/Exporter/PDF.pm  view on Meta::CPAN

			my ($self, $node) = @_;
			my ($type, $opts, @subnodes) = @{$node};
			my $name = ($opts->{'type'} eq 'ordered' ? 'enumerate' : 'itemize');
			return 
				"\n\n".'\begin{'.$name.'}'."\n".
				join('', map {'\item '.$self->transform_nodes($_)."\n\n"} @subnodes).
				'\end{'.$name.'}'."\n\n";
		},
		'preformatted' => sub {
			my ($self, $node) = @_;			
			my ($type, $opts, @subnodes) = @{$node};
			return 
				"\n\n".'{\footnotesize\begin{lstlisting}{Name}'.
				$self->transform_nodes(@subnodes).
				'\end{lstlisting}}'."\n\n";
		},
		'quote' => sub {
			my ($self, $node) = @_;			
			my ($type, $opts, @subnodes) = @{$node};
			return '\textit{'.$self->transform_nodes(@subnodes)."}";
		},
	};
	
	return $self;
}

sub writeEBook
{
	my ($self, $ebook, $options) = @_;

	$self->{'log'} = [];
	$self->{'url'} = $ebook->{'url'};
	$self->{'options'} = $options;

	# used while processing
	$self->{'has-section'} = 0;

	# convert to latex
	$self->{'meta'} = $ebook->{'meta'};
	my $converted = $self->transform_nodes($ebook->{'data'});
	
	my $tmpdir = File::Temp->newdir();

	# write tex file
	my $filename = $tmpdir->dirname()."/main.tex";
	unlink($filename) if -f $filename;
	my $fh = IO::File->new("> ".$filename);
	binmode($fh);
	print $fh $converted;
	
	# create pdf
	print "creating pdf...";

	my $cmd =
		# temporarily set path of local texmf tree to make
		# it able to find garamond files ;)
		'cd "'.$tmpdir->dirname().'"; '.
		"TEXMFHOME='".$self->{'options'}->{'local-tex-tree-path'}."' ".
		#EBook::Generator::Parser::getCommandPath('pdflatex').' '.
		(-f '/usr/bin/pdflatex' ? '/usr/bin/pdflatex' : '/usr/texbin/pdflatex ').' '.
		($ebook->{'options'}->{'debug'} == 1 ? () : '-interaction=batchmode').' '.
		'main.tex'.
		' 2>&1';
		#' > /dev/null 2>&1';
		
	my $output  = `$cmd`;
	   $output .= `$cmd` if $self->{'has-section'}; # second time for table-of-contents
		
	# copy pdf to final place
	my $pdf_filename   = $tmpdir->dirname().'/main.pdf';	
  my $final_filename = $self->{'final-dir'}.$ebook->{'meta'}->{'title'}.'.pdf';
	my $copy_result    = copy($pdf_filename, $final_filename);
	
	push @{$self->{'log'}},
		'dummy'
	#	'filename = '.$filename.' (exist: '.(-f $filename).')',
	#	'cmd = '.$cmd,
	#	'cmd-output = '.$output,
	#	'which-pdflatex = '.`which pdflatex`,
	#	'pdf-filename = '.$pdf_filename.' (exist: '.(-f $pdf_filename).')',
	#	'final-filename = '.$final_filename.' (exist: '.(-f $final_filename).')',
	#	'copy-result = '.$copy_result.' (error: '.$!.')',
		;
	
	return $final_filename;
}

sub transform_nodes
{
	my ($self, @nodes) = @_;	
	my $conv = '';
	foreach my $node (@nodes) {
		if (ref $node) {
			my $type = $node->[0];
			if (exists $self->{'handlers'}->{$type}) {
				$conv .= $self->{'handlers'}->{$type}->($self, $node);
			} else {
				my ($type, $opts, @subnodes) = @{$node};
				$conv .= $self->transform_nodes(@subnodes);
			}
		}
		else {
			$conv .= $self->transform_text($node);
		}
	}
	return $conv;
}

sub transform_text
{
	my ($self, $s) = @_;

	$s =~ s/([\.\;\?\!\:])/$1 /g;

	$s = decode_entities($s);
	$s = latex_encode($s);

	# make URLs shorter by adding split-marks
	#$s =~ s/\/(?!\/)/\\-\/\\-/g;
	
	return $s;



( run in 1.498 second using v1.01-cache-2.11-cpan-39bf76dae61 )