#!/usr/bin/perl
#
# Basic script for generating XML markup for the major sections of the Oracle Documentation, and XSLT templates (and meta-templates, for both output formats) for transforming it.
#
# To do:
# This is a link to the root page of the documentation, not a URL prefix.
$oracle_documentation_root = 'https://docs.oracle.com/cd/E11882_01/index.html';
# Here's the raw data.
# Each entry has a name (marked up as XML), a unique, short, space-less code name for it, and the actual URL.
# It makes more sense to have the full URL here, rather than prefixing the Oracle document root, because it's easier to copy the entire URL from the Web browser when updating.
%references =
(
Docs => { name => 'Database Documentation Library',
url => 'https://docs.oracle.com/cd/E11882_01/nav/portal_booklist.htm' },
Admin => { name => 'Database Administrator<apostrophe />s Guide',
url => 'https://docs.oracle.com/cd/E11882_01/server.112/e25494/toc.htm' },
# AppDev2Day => { name => 'Database 2 Day Developer<apostrophe />s Guide',
# url => 'https://docs.oracle.com/cd/E11882_01/appdev.112/b28843/toc.htm' },
AppDevAdv => { name => 'Database Advanced Application Developer<apostrophe />s Guide',
url => 'https://docs.oracle.com/cd/E11882_01/appdev.112/e41502/toc.htm' },
AppDevOR => { name => 'Object-Relational Developer<apostrophe />s Guide',
url => 'https://docs.oracle.com/cd/E11882_01/appdev.112/e11822/toc.htm' },
Concepts => { name => 'Database Concepts',
url => 'https://docs.oracle.com/cd/E11882_01/server.112/e40540/toc.htm' },
DataWarehousing => { name => 'Database Data Warehousing Guide',
url => 'https://docs.oracle.com/cd/E11882_01/server.112/e25554/toc.htm' },
Errors => { name => 'Database Error Messages',
url => 'https://docs.oracle.com/cd/E11882_01/server.112/e17766/toc.htm' },
SQL => { name => 'Database SQL Language Reference',
url => 'https://docs.oracle.com/cd/E11882_01/server.112/e41084/toc.htm' },
Java => { name => 'Database Java Developer<apostrophe />s Guide',
url => 'https://docs.oracle.com/cd/E11882_01/java.112/e10588/toc.htm' },
JDBC => { name => 'Database JDBC Developer<apostrophe />s Guide',
url => 'https://docs.oracle.com/cd/E11882_01/java.112/e16548/toc.htm' },
JDBCRef => { name => 'Database JDBC Java API Reference (Javadoc)',
url => 'https://docs.oracle.com/cd/E11882_01/Database JDBC Java API Reference (Javadoc)' },
# Glossary => { name => 'Database Master Glossary',
# url => 'https://docs.oracle.com/cd/E11882_01/mix.112/b14388/toc.htm' },
Tuning => { name => 'Database Performance Tuning Guide',
url => 'https://docs.oracle.com/cd/E11882_01/e41573/toc.htm' },
PLSQL => { name => 'Database PL/SQL Language Reference',
url => 'https://docs.oracle.com/cd/E11882_01/e25519/toc.htm' },
PLSQLPkgTyp => { name => 'Database PL/SQL Packages and Types Reference',
url => 'https://docs.oracle.com/cd/E11882_01/e40758/toc.htm' },
# Index => { name => 'Database Master Index',
# url => 'https://docs.oracle.com/cd/E11882_01/mix.112/b14387/toc.htm' },
Reference => { name => 'Database Reference',
url => 'https://docs.oracle.com/cd/E11882_01/e40402/toc.htm' },
);
# Prefix to use in the generated template names:
$oracle_prefix = "Ora";
if ($#ARGV != 1)
{
warn "usage: oracle-docs <section-code-regexp> (xml | xslt | xslt_html | xslt_latex | link | all)\n";
exit;
}
$section_code = $ARGV[0];
$output_type = $ARGV[1];
if ($output_type eq "xslt") {
print <<END_OF_HEADER
<?xml version="1.0"?>
<!-- Do not edit! Automatically generated by oracle-docs.perl! -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
END_OF_HEADER
;
}
# One-off hard-coded template for a link to the root of the documentation set, using the URL as the anchor text.
# This is used in several places in the course book and updating them is more of a pain than implementing this!
if ($output_type eq "xslt") {
print <<END_OF_TEMPLATE
<xsl:template name="OraDocsURL" match="OraDocsURL">
<xsl:variable name="OracleURL">
<xsl:element name="hyperlink">
<xsl:attribute name="url">
<xsl:text>${oracle_documentation_root}</xsl:text>
</xsl:attribute>
</xsl:element>
</xsl:variable>
<xsl:apply-templates select="\$OracleURL" />
</xsl:template>
END_OF_TEMPLATE
;
}
foreach $doccode (keys %references) {
$docname = $references{$doccode}{'name'};
$docurl = $references{$doccode}{'url'};
if ($doccode =~ /$section_code/) {
# Print the requested stuff:
if ($output_type eq "xml") {
print generate_xml($doccode) . "\n";
} elsif ($output_type eq "xslt") {
print generate_xsl_template($docname, $doccode, $docurl) . "\n";
} elsif ($output_type eq "all") {
print generate_xsl_template($docname, $doccode, $docurl) . "\n";
} else {
warn "Sorry - I don't know anything about a \"$output_type\" format.\n";
exit;
}
}
}
if ($output_type eq "xslt") {
print "</xsl:stylesheet>\n";
}
# Generate an XSLT template for generating a hyperlink to the specified Oracle document.
# Arguments: (<descriptive-label>, <entry-code>, <url>)
sub generate_xsl_template {
return <<END_OF_TEMPLATE
<xsl:template name="${oracle_prefix}${_[1]}" match="${oracle_prefix}${_[1]}">
<xsl:variable name="OracleURL">
<xsl:element name="hyperlink">
<xsl:attribute name="url">
<xsl:text>${_[2]}</xsl:text>
</xsl:attribute>
<xsl:call-template name="OracleServer" />
<xsl:text> </xsl:text>
${_[0]}
</xsl:element>
</xsl:variable>
<xsl:apply-templates select="\$OracleURL" />
</xsl:template>
END_OF_TEMPLATE
;
}
# Produce the actual XML markup to be used in authoring (just to provide a handy list of them all):
# Arguments: (<entry-code>)
sub generate_xml {
return "<" . $oracle_prefix . $_[0]. " />";
}