⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 catgen.pm

📁 普通的ETL工具
💻 PM
📖 第 1 页 / 共 3 页
字号:
# 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 + -