📄 catgen.pm
字号:
# vim:ts=4 sw=4
# ----------------------------------------------------------------------------------------------------
# Name : ETL::Pequel3::CatGen.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::CatGen;
require 5.005_62;
use strict;
use warnings;
use stl;
use ETL::Pequel3::Type::Document;
# ----------------------------------------------------------------------------------------------------
# DOCUMENT TYPE
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::CatGen::MainProgram;
use base qw(ETL::Pequel3::Type::Document::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'doc_type', default => 'Pequel'),
Class::STL::ClassMembers::DataMember->new(name => 'doc_title', default => 'Pequel Type Catalogue'),
Class::STL::ClassMembers::DataMember->new(name => 'doc_version', default => '3'),
Class::STL::ClassMembers::DataMember->new(name => 'doc_email', default => 'http://sourceforge.net/projects/pequel'),
Class::STL::ClassMembers::DataMember->new(name => 'doc_author', default => ''),
Class::STL::ClassMembers::DataMember->new(name => 'doc_filename', default => 'pequel_catalogue.pod'),
Class::STL::ClassMembers::DataMember->new(name => 'show_xsd', default => 0),
Class::STL::ClassMembers::DataMember->new(name => 'document_name', default => 'pequel_catalogue'),
Class::STL::ClassMembers::DataMember->new(name => 'show_copyright', default => 1);
use Class::STL::ClassMembers::Constructor;
sub new_extra
{
my $self = shift;
$self->chapters()->add(
$self->catalogue()->cat_chapters()->section->new(),
$self->catalogue()->cat_chapters()->aggregate->new(),
);
foreach ($self->catalogue()->macro_categories()->to_array())
{
$self->chapters()->add(
$self->catalogue()->cat_chapters()->macro->new(
macro_category => $_->name(),
chapter_name => "@{[ $_->name() ]}_macros")
);
}
$self->chapters()->add(
$self->catalogue()->cat_chapters()->pequel_type->new(),
$self->catalogue()->cat_chapters()->date_type->new(),
$self->catalogue()->cat_chapters()->table->new(),
$self->catalogue()->cat_chapters()->input_dataset->new(),
$self->catalogue()->cat_chapters()->output_dataset->new(),
$self->catalogue()->cat_chapters()->input_datasource->new(),
$self->catalogue()->cat_chapters()->output_datasource->new(),
$self->catalogue()->cat_chapters()->configuration_property->new(),
$self->catalogue()->cat_chapters()->command_line_option->new(),
#? $self->catalogue()->cat_chapters()->document->new(),
#? $self->catalogue()->cat_chapters()->document_chapter->new(),
#? $self->catalogue()->cat_chapters()->generator->new(),
#? $self->catalogue()->cat_chapters()->generator_segment->new(),
);
return $self;
}
}
# ----------------------------------------------------------------------------------------------------
# DOCUMENT TYPE CATALOGUE
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::CatGen::Catalogue;
use base qw(ETL::Pequel3::Type::Catalogue);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'catalogue_name', default => 'cat_documents'),
Class::STL::ClassMembers::DataMember->new(name => 'target_mem_name', default => 'document_name'),
Class::STL::ClassMembers::DataMember->new(name => 'element_type', default => 'ETL::Pequel3::CatGen::Abstract');
use Class::STL::ClassMembers::SingletonConstructor;
sub new_extra
{
my $self = shift;
$self->push_back(
ETL::Pequel3::CatGen::MainProgram->_new(),
);
return $self;
}
}
# ----------------------------------------------------------------------------------------------------
# CHAPTER TYPE
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::CatGen::Chapter::Section;
use base qw(ETL::Pequel3::Type::Document::Chapter::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'chapter_name', default => 'section');
use Class::STL::ClassMembers::Constructor;
sub prepare
{
my $self = shift;
foreach (map($_->new(), $self->catalogue()->sections()->to_array()))
{
$self->user_prog()->code("@{[ $_->section_name() ]} -- I<@{[ $_->construction_type() ]}>");
$self->user_prog()->code();
}
$self->user_prog()->code();
$self->user_prog()->code();
foreach (map($_->new(), $self->catalogue()->sections()->to_array()))
{
$self->user_prog()->head2($_->section_name());
if (defined($_->description()) && $_->description() ne '') {
$self->user_prog()->code($_->description());
$self->user_prog()->code();
$self->user_prog()->code();
}
# Section Construction Type
$self->user_prog()->code("F<Section Construction Type>");
$self->user_prog()->code() if ($self->doc_ref()->target_fmt() ne 'pdf');
$self->user_prog()->over();
$self->user_prog()->code($_->construction_type());
$self->user_prog()->code();
$self->user_prog()->back();
# Section Properties:
$self->user_prog()->code("F<Section Properties>");
$self->user_prog()->code() if ($self->doc_ref()->target_fmt() ne 'pdf');
$self->user_prog()->over();
if ($_->attributes()->size() == 0) {
$self->user_prog()->code("I<N/A>");
$self->user_prog()->code();
}
foreach my $attr ($_->attributes()->to_array()) {
$self->user_prog()->code("B<@{[ $attr->name() ]}>");
$self->user_prog()->code() if ($self->doc_ref()->target_fmt() ne 'pdf');
$self->user_prog()->over();
if (defined($attr->description()) && $attr->description() ne '') {
$self->user_prog()->code("I<@{[ $attr->description() ]}>");
$self->user_prog()->code();
}
$self->user_prog()->code($attr->required() ? "-- required" : "-- optional");
$self->user_prog()->code();
$self->user_prog()->code("-- default: B<@{[ $attr->default() ]}>") if (defined($attr->default() ));
$self->user_prog()->code() if (defined($attr->default() ));
if (defined($attr->validate_catalogue()))
{
my $n = $self->POM()->catalogue->exists($attr->validate_catalogue())
->target_mem_name();
$self->user_prog()->code("-- validate: I<@{[ $attr->validate_catalogue() ]}>");
$self->user_prog()->over();
my $names;
my $pipe='';
foreach ($self->POM()->catalogue->exists($attr->validate_catalogue())->to_array())
{
$names .= ($pipe . $_->$n());
$pipe=' | ';
if (length($names) >= 60) {
$self->user_prog()->code("B<@{[ $names ]}>");
$names='';
$pipe='| ';
}
}
$self->user_prog()->code("B<@{[ $names ]}>") if (length($names));
$self->user_prog()->back();
}
elsif (defined($attr->validate()))
{
$self->user_prog()->code("-- validate: B<@{[ $attr->validate() ]}>");
$self->user_prog()->code();
}
$self->user_prog()->code();
$self->user_prog()->back();
}
$self->user_prog()->back();
# Item attributes
$self->user_prog()->code("F<Item Attributes>");
$self->user_prog()->code() if ($self->doc_ref()->target_fmt() ne 'pdf');
$self->user_prog()->over();
if ($_->items()->factory()->attributes()->to_array() == 0) {
$self->user_prog()->code("I<N/A>");
$self->user_prog()->code();
}
# attributes contains ETL::Pequel3::Type::Properties::Abstract type elements;
foreach my $attr ($_->items()->factory()->attributes()->to_array())
{
$self->user_prog()->code("B<@{[ $attr->name() ]}>");
$self->user_prog()->code() if ($self->doc_ref()->target_fmt() ne 'pdf');
$self->user_prog()->over();
if (defined($attr->description()) && $attr->description() ne '') {
$self->user_prog()->code("I<@{[ $attr->description() ]}>");
$self->user_prog()->code();
}
$self->user_prog()->code($attr->required() ? "-- required" : "-- optional");
$self->user_prog()->code();
$self->user_prog()->code("-- default: B<@{[ $attr->default() ]}>") if (defined($attr->default() ));
$self->user_prog()->code() if (defined($attr->default() ));
if (defined($attr->validate_catalogue()))
{
my $n = $self->POM()->catalogue->exists($attr->validate_catalogue())
->target_mem_name();
$self->user_prog()->code("-- validate: I<@{[ $attr->validate_catalogue() ]}>");
$self->user_prog()->over();
my $names;
my $pipe='';
foreach ($self->POM()->catalogue->exists($attr->validate_catalogue())->to_array())
{
$names .= ($pipe . $_->$n());
$pipe=' | ';
if (length($names) >= 60) {
$self->user_prog()->code("B<@{[ $names ]}>");
$names='';
$pipe='| ';
}
}
$self->user_prog()->code("B<@{[ $names ]}>") if (length($names));
$self->user_prog()->back();
}
elsif (defined($attr->validate()))
{
$self->user_prog()->code("-- validate: B<@{[ $attr->validate() ]}>");
}
$self->user_prog()->code() if (defined($attr->validate() ));
$self->user_prog()->code();
$self->user_prog()->back();
}
$self->user_prog()->back();
#$self->user_prog()->code("F<Related Section Types>");
# if can('on') then
# section_on_input
# section_on_output
# Pequel XSD Schema:
if ($self->doc_ref()->show_xsd()) {
my $xsd = $self->catalogue()->xml_schemas()->exists($self->properties()->xml_schema())
->new(POM => $self->POM());
$_->xml_schema($xsd, $xsd->schema_root());
$self->user_prog()->code("F<pequel xsd extract>");
$self->user_prog()->code() if ($self->doc_ref()->target_fmt() ne 'pdf');
$self->user_prog()->begin();
$self->user_prog()->code(' ' . $xsd->to_string());
$self->user_prog()->end();
}
#? $self->user_prog()->page(); #if ($self->doc_ref()->show_xsd() && $self->doc_ref()->target_fmt() eq 'pdf');
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -