📄 document.pm
字号:
# vim:ts=4 sw=4# ----------------------------------------------------------------------------------------------------# Name : ETL::Pequel3::Type::Document.pm# Created : 21 September 2006# Author : Mario Gaffiero (gaffie)## Copyright 1999-2007 Mario Gaffiero.# # This file is part of Pequel(TM).# # Pequel is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; version 2 of the License.# # Pequel is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.# # You should have received a copy of the GNU General Public License# along with Pequel; if not, write to the Free Software# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA# ----------------------------------------------------------------------------------------------------# Modification History# When Version Who What# ----------------------------------------------------------------------------------------------------package ETL::Pequel3::Type::Document;require 5.005_62;use strict;use warnings;use stl;# ----------------------------------------------------------------------------------------------------# DOCUMENT TYPE# ----------------------------------------------------------------------------------------------------{ package ETL::Pequel3::Type::Document::Abstract; use base qw(Class::STL::Element); use Class::STL::ClassMembers qw( err catalogue properties document_name chapters user_prog doc_type doc_title doc_version doc_email doc_author doc_filename POM ), Class::STL::ClassMembers::DataMember->new(name => 'target_fmt', default => 'pdf', validate => '^(pod|pdf|docbook)$'), Class::STL::ClassMembers::DataMember->new(name => 'show_copyright', default => 0); use Class::STL::ClassMembers::Constructor; sub new_extra { my $self = shift; use ETL::Pequel3::Error; $self->err(ETL::Pequel3::Error->new()); use ETL::Pequel3::Type::Catalogue; $self->catalogue(ETL::Pequel3::Catalogue->new()); $self->properties($self->catalogue()->properties()); use Class::CodeStyler; $self->user_prog(Class::CodeStyler::Program::Pod->new( program_name => $self->POM()->makefilepath($self->doc_filename()) )); $self->chapters(ETL::Pequel3::Type::Document::Chapters->new(doc_ref => $self)); return $self; } sub build { my $self = shift; $self->chapters()->add(ETL::Pequel3::Type::Document::Chapter::Copyright->new()) if ($self->show_copyright() && !$self->chapters()->exists('copyright')); map ( do { $_->open_chapter() unless ($_->hidden()); $_->prepare(); }, $self->chapters()->to_array() ); $self->user_prog()->prepare(); $self->user_prog()->save(); } sub make_pdf { my $self = shift; use ETL::Pequel3::Pod2Pdf; return ETL::Pequel3::Pod2Pdf::pod2pdf( # return pdf file path-name; '--type' => $self->doc_type(), '--title' => $self->doc_title(), '--version' => $self->doc_version(), '--email' => $self->doc_email(), '--author' => $self->doc_author(), $self->user_prog()->program_name() ); }}# ----------------------------------------------------------------------------------------------------{ package ETL::Pequel3::Type::Document::Chapters; use base qw(ETL::Pequel3::Type::Catalogue); use Class::STL::ClassMembers qw( doc_ref ), Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'chapter_name'), Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::Document::Chapter::Abstract'); use Class::STL::ClassMembers::Constructor; sub add { my $self = shift; foreach (@_) { $self->push_back($_); my $ch = $self->back(); $ch->minor($self->size()); $ch->doc_ref($self->doc_ref()); $ch->POM($self->doc_ref()->POM()); $ch->user_prog($self->doc_ref()->user_prog()); } }}# ----------------------------------------------------------------------------------------------------# CHAPTER TYPE# ----------------------------------------------------------------------------------------------------{ package ETL::Pequel3::Type::Document::Chapter::Abstract; use base qw(Class::STL::Element); use Class::STL::ClassMembers qw( POM doc_ref err catalogue properties user_prog chapter_name chapter_name_sub chapter_name_desc major minor ), Class::STL::ClassMembers::DataMember->new(name => 'show_chapter_number', default => 1), Class::STL::ClassMembers::DataMember->new(name => 'hidden', default => 0), Class::STL::ClassMembers::DataMember->new(name => 'new_page', default => 1); use Class::STL::ClassMembers::Constructor; sub new_extra { my $self = shift; use ETL::Pequel3::Error; $self->err(ETL::Pequel3::Error->new()); # Singleton use ETL::Pequel3::Catalogue; $self->catalogue(ETL::Pequel3::Catalogue->new()); $self->properties($self->catalogue()->properties()); $self->chapter_name_desc( do{ my $n=$self->chapter_name(); $n=~s/[\W_]+/ /g; $n=~s/((^\w)|(\s\w))/\U$1/g; $n=~s/([\w]+)/\u\L$1/g; $n=~s/^\s+//; defined($self->chapter_name_sub()) ? $n . ' -- ' . $self->chapter_name_sub() : $n; } ) if (defined($self->chapter_name())); } sub open_chapter { my $self = shift; $self->user_prog()->divider(); $self->user_prog()->page() if ($self->new_page() && $self->doc_ref()->target_fmt() eq 'pdf'); $self->user_prog()->head1("@{[ $self->show_chapter_number() && defined($self->major()) && $self->major() ne '' ? ($self->major() . '. ') : '' ]}@{[ $self->show_chapter_number() && defined($self->minor()) ? ($self->minor() . ' ') : '' ]}@{[ $self->chapter_name_desc() ]}"); } sub prepare { my $self = shift; # virtual function }}# ----------------------------------------------------------------------------------------------------{ package ETL::Pequel3::Type::Document::Chapter::Copyright; use base qw(ETL::Pequel3::Type::Document::Chapter::Abstract); use Class::STL::ClassMembers Class::STL::ClassMembers::DataMember->new(name => 'show_chapter_number', default => 0), Class::STL::ClassMembers::DataMember->new(name => 'chapter_name', default => 'copyright'); use Class::STL::ClassMembers::Constructor; sub prepare { my $self = shift; $self->user_prog()->code("This document was generated by Pequel."); $self->user_prog()->code(); $self->user_prog()->code(); $self->user_prog()->code("L<@{[ $self->properties()->pequel_home_page() ]}>"); $self->user_prog()->code(); $self->user_prog()->code(); $self->user_prog()->code("Copyright E<copy>1999-2007, Mario Gaffiero. All Rights Reserved."); $self->user_prog()->code(); $self->user_prog()->code(); $self->user_prog()->code("'Pequel' TM Copyright E<copy>1999-2007, Mario Gaffiero. All Rights Reserved."); $self->user_prog()->code(); $self->user_prog()->code(); $self->user_prog()->code("This program and all its component contents is copyrighted free software by Mario Gaffiero and is released under the GNU General Public License (GPL), Version 2, a copy of which may be found at L<http://www.opensource.org/licenses/gpl-license.html>"); $self->user_prog()->code(); $self->user_prog()->code(); $self->user_prog()->code("Pequel is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License."); $self->user_prog()->code(); $self->user_prog()->code(); $self->user_prog()->code("Pequel is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details."); $self->user_prog()->code(); $self->user_prog()->code(); $self->user_prog()->code("You should have received a copy of the GNU General Public License along with Pequel; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA"); $self->user_prog()->code(); $self->user_prog()->code(); }}# ----------------------------------------------------------------------------------------------------# DOCUMENT TYPE CATALOGUE# ----------------------------------------------------------------------------------------------------{ package ETL::Pequel3::Type::Document::Catalogue; use base qw(ETL::Pequel3::Type::Catalogue); use Class::STL::ClassMembers Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'documents'), Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'document_name'), Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::Type::Document::Abstract'); use Class::STL::ClassMembers::SingletonConstructor; sub new_extra { my $self = shift; return $self; }}# ----------------------------------------------------------------------------------------------------1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -