Initial WebM release

This commit is contained in:
John Koleszar 2010-05-18 11:58:33 -04:00
commit 0ea50ce9cb
724 changed files with 210094 additions and 0 deletions

18
.gitattributes vendored Normal file
View File

@ -0,0 +1,18 @@
*.[chs] filter=fixtabswsp
*.[ch]pp filter=fixtabswsp
*.[ch]xx filter=fixtabswsp
*.asm filter=fixtabswsp
*.php filter=fixtabswsp
*.pl filter=fixtabswsp
*.sh filter=fixtabswsp
*.txt filter=fixwsp
[Mm]akefile filter=fixwsp
*.mk filter=fixwsp
*.rc -crlf
*.ds[pw] -crlf
*.bat -crlf
*.mmp -crlf
*.dpj -crlf
*.pjt -crlf
*.vcp -crlf
*.inf -crlf

4
AUTHORS Normal file
View File

@ -0,0 +1,4 @@
# Names should be added to this file like so:
# Name or Organization <email address>
Google Inc.

3
CHANGELOG Normal file
View File

@ -0,0 +1,3 @@
2010-05-18 v0.9.0
- Initial open source release. Welcome to WebM and VP8!

48
LICENSE Normal file
View File

@ -0,0 +1,48 @@
Copyright (c) 2010, Google, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
- Neither the name of Google nor the names of its contributors may
be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Subject to the terms and conditions of the above License, Google
hereby grants to You a perpetual, worldwide, non-exclusive,
no-charge, royalty-free, irrevocable (except as stated in this
section) patent license to make, have made, use, offer to sell, sell,
import, and otherwise transfer this implementation of VP8, where such
license applies only to those patent claims, both currently owned by
Google and acquired in the future, licensable by Google that are
necessarily infringed by this implementation of VP8. If You or your
agent or exclusive licensee institute or order or agree to the
institution of patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that this
implementation of VP8 or any code incorporated within this
implementation of VP8 constitutes direct or contributory patent
infringement, or inducement of patent infringement, then any rights
granted to You under this License for this implementation of VP8
shall terminate as of the date such litigation is filed.

106
README Normal file
View File

@ -0,0 +1,106 @@
vpx Multi-Format Codec SDK
README - 19 May 2010
Welcome to the WebM VP8 Codec SDK!
COMPILING THE APPLICATIONS/LIBRARIES:
The build system used is similar to autotools. Building generally consists of
"configuring" with your desired build options, then using GNU make to build
the application.
1. Prerequisites
* All x86 targets require the Yasm[1] assembler be installed.
* All Windows builds require that Cygwin[2] be installed.
* Building the documentation requires PHP[3] and Doxygen[4]. If you do not
have these packages, you must pass --disable-install-docs to the
configure script.
[1]: http://www.tortall.net/projects/yasm
[2]: http://www.cygwin.com
[3]: http://php.net
[4]: http://www.doxygen.org
2. Out-of-tree builds
Out of tree builds are a supported method of building the application. For
an out of tree build, the source tree is kept separate from the object
files produced during compilation. For instance:
$ mkdir build
$ cd build
$ ../libvpx/configure <options>
$ make
3. Configuration options
The 'configure' script supports a number of options. The --help option can be
used to get a list of supported options:
$ ../libvpx/configure --help
4. Cross development
For cross development, the most notable option is the --target option. The
most up-to-date list of supported targets can be found at the bottom of the
--help output of the configure script. As of this writing, the list of
available targets is:
armv5te-linux-rvct
armv5te-linux-gcc
armv5te-symbian-gcc
armv5te-wince-vs8
armv6-darwin-gcc
armv6-linux-rvct
armv6-linux-gcc
armv6-symbian-gcc
armv6-wince-vs8
iwmmxt-linux-rvct
iwmmxt-linux-gcc
iwmmxt-wince-vs8
iwmmxt2-linux-rvct
iwmmxt2-linux-gcc
iwmmxt2-wince-vs8
armv7-linux-rvct
armv7-linux-gcc
mips32-linux-gcc
ppc32-darwin8-gcc
ppc32-darwin9-gcc
ppc64-darwin8-gcc
ppc64-darwin9-gcc
ppc64-linux-gcc
x86-darwin8-gcc
x86-darwin8-icc
x86-darwin9-gcc
x86-darwin9-icc
x86-linux-gcc
x86-linux-icc
x86-solaris-gcc
x86-win32-vs7
x86-win32-vs8
x86_64-darwin9-gcc
x86_64-linux-gcc
x86_64-solaris-gcc
x86_64-win64-vs8
universal-darwin8-gcc
universal-darwin9-gcc
generic-gnu
The generic-gnu target, in conjunction with the CROSS environment variable,
can be used to cross compile architectures that aren't explicitly listed, if
the toolchain is a cross GNU (gcc/binutils) toolchain. Other POSIX toolchains
will likely work as well. For instance, to build using the mipsel-linux-uclibc
toolchain, the following command could be used (note, POSIX SH syntax, adapt
to your shell as necessary):
$ CROSS=mipsel-linux-uclibc- ../libvpx/src/configure
In addition, the executables to be invoked can be overridden by specifying the
environment variables: CC, AR, LD, AS, STRIP, NM. Additional flags can be
passed to these executables with CFLAGS, LDFLAGS, and ASFLAGS.
5. Configuration errors
If the configuration step fails, the first step is to look in the error log.
This defaults to config.err. This should give a good indication of what went
wrong. If not, contact us for support.
SUPPORT
This library is an open source project supported by its community. Please
please email webm-users@webmproject.org for help.

215
args.c Normal file
View File

@ -0,0 +1,215 @@
/*
* Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license and patent
* grant that can be found in the LICENSE file in the root of the source
* tree. All contributing project authors may be found in the AUTHORS
* file in the root of the source tree.
*/
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include "args.h"
#ifdef _MSC_VER
#define snprintf _snprintf
#endif
#if defined(__GNUC__) && __GNUC__
extern void die(const char *fmt, ...) __attribute__((noreturn));
#else
extern void die(const char *fmt, ...);
#endif
struct arg arg_init(char **argv)
{
struct arg a;
a.argv = argv;
a.argv_step = 1;
a.name = NULL;
a.val = NULL;
a.def = NULL;
return a;
}
int arg_match(struct arg *arg_, const struct arg_def *def, char **argv)
{
struct arg arg;
if (!argv[0] || argv[0][0] != '-')
return 0;
arg = arg_init(argv);
if (def->short_name
&& strlen(arg.argv[0]) == strlen(def->short_name) + 1
&& !strcmp(arg.argv[0] + 1, def->short_name))
{
arg.name = arg.argv[0] + 1;
arg.val = def->has_val ? arg.argv[1] : NULL;
arg.argv_step = def->has_val ? 2 : 1;
}
else if (def->long_name)
{
int name_len = strlen(def->long_name);
if (strlen(arg.argv[0]) >= name_len + 2
&& arg.argv[0][1] == '-'
&& !strncmp(arg.argv[0] + 2, def->long_name, name_len)
&& (arg.argv[0][name_len+2] == '='
|| arg.argv[0][name_len+2] == '\0'))
{
arg.name = arg.argv[0] + 2;
arg.val = arg.name[name_len] == '=' ? arg.name + name_len + 1 : NULL;
arg.argv_step = 1;
}
}
if (arg.name && !arg.val && def->has_val)
die("Error: option %s requires argument.\n", arg.name);
if (arg.name && arg.val && !def->has_val)
die("Error: option %s requires no argument.\n", arg.name);
if (arg.name
&& (arg.val || !def->has_val))
{
arg.def = def;
*arg_ = arg;
return 1;
}
return 0;
}
const char *arg_next(struct arg *arg)
{
if (arg->argv[0])
arg->argv += arg->argv_step;
return *arg->argv;
}
char **argv_dup(int argc, const char **argv)
{
char **new_argv = malloc((argc + 1) * sizeof(*argv));
memcpy(new_argv, argv, argc * sizeof(*argv));
new_argv[argc] = NULL;
return new_argv;
}
void arg_show_usage(FILE *fp, const struct arg_def *const *defs)
{
char option_text[40] = {0};
for (; *defs; defs++)
{
const struct arg_def *def = *defs;
char *short_val = def->has_val ? " <arg>" : "";
char *long_val = def->has_val ? "=<arg>" : "";
if (def->short_name && def->long_name)
snprintf(option_text, 37, "-%s%s, --%s%s",
def->short_name, short_val,
def->long_name, long_val);
else if (def->short_name)
snprintf(option_text, 37, "-%s%s",
def->short_name, short_val);
else if (def->long_name)
snprintf(option_text, 37, " --%s%s",
def->long_name, long_val);
fprintf(fp, " %-37s\t%s\n", option_text, def->desc);
}
}
unsigned int arg_parse_uint(const struct arg *arg)
{
long int rawval;
char *endptr;
rawval = strtol(arg->val, &endptr, 10);
if (arg->val[0] != '\0' && endptr[0] == '\0')
{
if (rawval >= 0 && rawval <= UINT_MAX)
return rawval;
die("Option %s: Value %ld out of range for unsigned int\n",
arg->name, rawval);
}
die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
return 0;
}
int arg_parse_int(const struct arg *arg)
{
long int rawval;
char *endptr;
rawval = strtol(arg->val, &endptr, 10);
if (arg->val[0] != '\0' && endptr[0] == '\0')
{
if (rawval >= INT_MIN && rawval <= INT_MAX)
return rawval;
die("Option %s: Value %ld out of range for signed int\n",
arg->name, rawval);
}
die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
return 0;
}
struct vpx_rational
{
int num; /**< fraction numerator */
int den; /**< fraction denominator */
};
struct vpx_rational arg_parse_rational(const struct arg *arg)
{
long int rawval;
char *endptr;
struct vpx_rational rat;
/* parse numerator */
rawval = strtol(arg->val, &endptr, 10);
if (arg->val[0] != '\0' && endptr[0] == '/')
{
if (rawval >= INT_MIN && rawval <= INT_MAX)
rat.num = rawval;
else die("Option %s: Value %ld out of range for signed int\n",
arg->name, rawval);
}
else die("Option %s: Expected / at '%c'\n", arg->name, *endptr);
/* parse denominator */
rawval = strtol(endptr + 1, &endptr, 10);
if (arg->val[0] != '\0' && endptr[0] == '\0')
{
if (rawval >= INT_MIN && rawval <= INT_MAX)
rat.den = rawval;
else die("Option %s: Value %ld out of range for signed int\n",
arg->name, rawval);
}
else die("Option %s: Invalid character '%c'\n", arg->name, *endptr);
return rat;
}

43
args.h Normal file
View File

@ -0,0 +1,43 @@
/*
* Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license and patent
* grant that can be found in the LICENSE file in the root of the source
* tree. All contributing project authors may be found in the AUTHORS
* file in the root of the source tree.
*/
#ifndef ARGS_H
#define ARGS_H
#include <stdio.h>
struct arg
{
char **argv;
const char *name;
const char *val;
unsigned int argv_step;
const struct arg_def *def;
};
typedef struct arg_def
{
const char *short_name;
const char *long_name;
int has_val;
const char *desc;
} arg_def_t;
#define ARG_DEF(s,l,v,d) {s,l,v,d}
#define ARG_DEF_LIST_END {0}
struct arg arg_init(char **argv);
int arg_match(struct arg *arg_, const struct arg_def *def, char **argv);
const char *arg_next(struct arg *arg);
void arg_show_usage(FILE *fp, const struct arg_def *const *defs);
char **argv_dup(int argc, const char **argv);
unsigned int arg_parse_uint(const struct arg *arg);
int arg_parse_int(const struct arg *arg);
struct vpx_rational arg_parse_rational(const struct arg *arg);
#endif

1
build/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
x86*-win32-vs*

1
build/arm-wince-vs8/.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
*.rules -crlf

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="armasm"
Version="8.00"
>
<Rules>
<CustomBuildRule
Name="ARMASM"
DisplayName="Armasm Assembler"
CommandLine="armasm -o &quot;$(IntDir)\$(InputName).obj&quot; $(InputPath) -32 -ARCH 5&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
FileExtensions="*.asm"
ExecutionDescription="Assembling $(InputName).asm"
ShowOnlyRuleProperties="false"
>
<Properties>
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="armasm"
Version="8.00"
>
<Rules>
<CustomBuildRule
Name="ARMASM"
DisplayName="Armasm Assembler"
CommandLine="armasm -o &quot;$(IntDir)\$(InputName).obj&quot; $(InputPath) -32 -ARCH 6&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
FileExtensions="*.asm"
ExecutionDescription="Assembling $(InputName).asm"
ShowOnlyRuleProperties="false"
>
<Properties>
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="armasm"
Version="8.00"
>
<Rules>
<CustomBuildRule
Name="ARMASM"
DisplayName="Armasm Assembler"
CommandLine="armasm -o &quot;$(IntDir)\$(InputName).obj&quot; $(InputPath) -32 -cpu XSCALE&#x0D;&#x0A;"
Outputs="$(IntDir)\$(InputName).obj"
FileExtensions="*.asm"
ExecutionDescription="Assembling $(InputName).asm"
ShowOnlyRuleProperties="false"
>
<Properties>
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>

View File

@ -0,0 +1,12 @@
@echo off
REM Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
REM
REM Use of this source code is governed by a BSD-style license and patent
REM grant that can be found in the LICENSE file in the root of the source
REM tree. All contributing project authors may be found in the AUTHORS
REM file in the root of the source tree.
echo on
cl /I ".\\" /I "..\vp6_decoder_sdk" /I "..\vp6_decoder_sdk\vpx_ports" /D "NDEBUG" /D "_WIN32_WCE=0x420" /D "UNDER_CE" /D "WIN32_PLATFORM_PSPC" /D "WINCE" /D "_LIB" /D "ARM" /D "_ARM_" /D "_UNICODE" /D "UNICODE" /D "HAVE_CONFIG_H" /FD /EHsc /MT /GS- /fp:fast /GR- /Fo"Pocket_PC_2003__ARMV4_\%1/" /Fd"Pocket_PC_2003__ARMV4_\%1/vc80.pdb" /W3 /nologo /c /TC ..\vp6_decoder_sdk\vp6_decoder\algo\common\arm\dec_asm_offsets_arm.c
obj_int_extract.exe rvds "Pocket_PC_2003__ARMV4_\%1/dec_asm_offsets_arm.obj"

View File

@ -0,0 +1,88 @@
Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example", "example.vcproj", "{BA5FE66F-38DD-E034-F542-B1578C5FB950}"
ProjectSection(ProjectDependencies) = postProject
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "obj_int_extract", "obj_int_extract.vcproj", "{E1360C65-D375-4335-8057-7ED99CC3F9B2}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vpx_decoder", "vpx_decoder.vcproj", "{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}"
ProjectSection(ProjectDependencies) = postProject
{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xma", "xma.vcproj", "{A955FC4A-73F1-44F7-135E-30D84D32F022}"
ProjectSection(ProjectDependencies) = postProject
{E1360C65-D375-4335-8057-7ED99CC3F9B2} = {E1360C65-D375-4335-8057-7ED99CC3F9B2}
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74} = {DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Mixed Platforms = Debug|Mixed Platforms
Debug|Pocket PC 2003 (ARMV4) = Debug|Pocket PC 2003 (ARMV4)
Debug|Win32 = Debug|Win32
Release|Mixed Platforms = Release|Mixed Platforms
Release|Pocket PC 2003 (ARMV4) = Release|Pocket PC 2003 (ARMV4)
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
{BA5FE66F-38DD-E034-F542-B1578C5FB950}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Mixed Platforms.ActiveCfg = Release|Win32
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Mixed Platforms.Build.0 = Release|Win32
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Win32
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Win32.ActiveCfg = Release|Win32
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Debug|Win32.Build.0 = Release|Win32
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Mixed Platforms.ActiveCfg = Release|Win32
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Mixed Platforms.Build.0 = Release|Win32
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Win32
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Win32.ActiveCfg = Release|Win32
{E1360C65-D375-4335-8057-7ED99CC3F9B2}.Release|Win32.Build.0 = Release|Win32
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
{DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.Build.0 = Debug|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Mixed Platforms.Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Debug|Win32.ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.Build.0 = Release|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Mixed Platforms.Deploy.0 = Release|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
{A955FC4A-73F1-44F7-135E-30D84D32F022}.Release|Win32.ActiveCfg = Release|Pocket PC 2003 (ARMV4)
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

341
build/make/Makefile Executable file
View File

@ -0,0 +1,341 @@
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
include config.mk
quiet?=true
ifeq ($(target),)
# If a target wasn't specified, invoke for all enabled targets.
.DEFAULT:
@for t in $(ALL_TARGETS); do \
$(MAKE) --no-print-directory target=$$t $(MAKECMDGOALS) || exit $$?;\
done
all: .DEFAULT
clean:: .DEFAULT
# Note: md5sum is not installed on OS X, but openssl is. Openssl may not be
# installed on cygwin, so we need to autodetect here.
md5sum := $(firstword $(wildcard \
$(foreach e,md5sum openssl,\
$(foreach p,$(subst :, ,$(PATH)),$(p)/$(e)*))\
))
md5sum := $(if $(filter %openssl,$(md5sum)),$(md5sum) dgst -md5,$(md5sum))
TGT_CC:=$(word 3, $(subst -, ,$(TOOLCHAIN)))
install:
@for t in $(ALL_TARGETS); do \
$(MAKE) --no-print-directory target=$$t $(MAKECMDGOALS) || exit $$?;\
done
# Run configure for the user with the current toolchain.
@if [ -d "$(DIST_DIR)/src" ]; then \
mkdir -p "$(DIST_DIR)/build"; \
cd "$(DIST_DIR)/build"; \
if [ $(TGT_CC) = "rvct" ] ; then \
echo "../src/configure --target=$(TOOLCHAIN) --libc=$(ALT_LIBC)"; \
../src/configure --target=$(TOOLCHAIN) --libc=$(ALT_LIBC); \
else \
echo "../src/configure --target=$(TOOLCHAIN)"; \
../src/configure --target=$(TOOLCHAIN); \
fi; \
$(if $(filter vs%,$(TGT_CC)),make NO_LAUNCH_DEVENV=1;) \
fi
@if [ -d "$(DIST_DIR)" ]; then \
echo " [MD5SUM] $(DIST_DIR)"; \
cd $(DIST_DIR) && \
$(md5sum) `find . -name md5sums.txt -prune -o -type f -print` \
| sed -e 's/MD5(\(.*\))= \([0-9a-f]\{32\}\)/\2 \1/' \
> md5sums.txt;\
fi
svnstat: ALL_TARGETS:=$(firstword $(ALL_TARGETS))
endif
ifneq ($(target),)
# Normally, we want to build the filename from the target and the toolchain.
# This disambiguates from the $(target).mk file that exists in the source tree.
# However, the toolchain is part of the target in universal builds, so we
# don't want to include TOOLCHAIN in that case. FAT_ARCHS is used to test
# if we're in the universal case.
include $(target)$(if $(FAT_ARCHS),,-$(TOOLCHAIN)).mk
endif
BUILD_ROOT?=.
VPATH=$(SRC_PATH_BARE)
CFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)
ASFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)
DIST_DIR?=dist
HOSTCC?=gcc
TGT_ISA:=$(word 1, $(subst -, ,$(TOOLCHAIN)))
TGT_OS:=$(word 2, $(subst -, ,$(TOOLCHAIN)))
TGT_CC:=$(word 3, $(subst -, ,$(TOOLCHAIN)))
quiet:=$(if $(verbose),,yes)
qexec=$(if $(quiet),@)
# Cancel built-in implicit rules
%: %.o
%.asm:
%.a:
#
# Common rules"
#
.PHONY: all-$(target)
all-$(target):
.PHONY: clean
clean::
rm -f $(OBJS-yes) $(OBJS-yes:.o=.d) $(OBJS-yes:.asm.s.o=.asm.s)
rm -f $(CLEAN-OBJS)
.PHONY: install
install:
.PHONY: install-helper
install-helper:
$(BUILD_PFX)%.c.d: %.c
$(if $(quiet),@echo " [DEP] $@")
$(qexec)mkdir -p $(dir $@)
$(qexec)$(CC) $(CFLAGS) -M $< | $(fmt_deps) > $@
$(BUILD_PFX)%.c.o: %.c
$(if $(quiet),@echo " [CC] $@")
$(qexec)$(CC) $(CFLAGS) -c -o $@ $<
$(BUILD_PFX)%.asm.d: %.asm
$(if $(quiet),@echo " [DEP] $@")
$(qexec)mkdir -p $(dir $@)
$(qexec)$(SRC_PATH_BARE)/build/make/gen_asm_deps.sh \
--build-pfx=$(BUILD_PFX) --depfile=$@ $(ASFLAGS) $< > $@
$(BUILD_PFX)%.asm.o: %.asm
$(if $(quiet),@echo " [AS] $@")
$(qexec)$(AS) $(ASFLAGS) -o $@ $<
$(BUILD_PFX)%.s.d: %.s
$(if $(quiet),@echo " [DEP] $@")
$(qexec)mkdir -p $(dir $@)
$(qexec)$(SRC_PATH_BARE)/build/make/gen_asm_deps.sh \
--build-pfx=$(BUILD_PFX) --depfile=$@ $(ASFLAGS) $< > $@
$(BUILD_PFX)%.s.o: %.s
$(if $(quiet),@echo " [AS] $@")
$(qexec)$(AS) $(ASFLAGS) -o $@ $<
.PRECIOUS: %.asm.s
$(BUILD_PFX)%.asm.s: %.asm
$(if $(quiet),@echo " [ASM CONVERSION] $@")
$(qexec)mkdir -p $(dir $@)
$(qexec)$(ASM_CONVERSION) <$< >$@
# If we're in debug mode, pretend we don't have GNU strip, to fall back to
# the copy implementation
HAVE_GNU_STRIP := $(if $(CONFIG_DEBUG),,$(HAVE_GNU_STRIP))
ifeq ($(HAVE_GNU_STRIP),yes)
# Older binutils strip global sybols not needed for relocation processing
# when given --strip-unneeded. Use nm and awk to identify globals and
# keep them.
%.a: %_g.a
$(if $(quiet),@echo " [STRIP] $@ < $<")
$(qexec)$(STRIP) --strip-unneeded \
`$(NM) $< | grep ' [A-TV-Z] ' | awk '{print "-K"$$3'}`\
-o $@ $<
else
%.a: %_g.a
$(if $(quiet),@echo " [CP] $@ < $<")
$(qexec)cp $< $@
endif
#
# Rule to extract assembly constants from C sources
#
obj_int_extract: build/make/obj_int_extract.c
$(if $(quiet),echo " [HOSTCC] $@")
$(qexec)$(HOSTCC) -I. -o $@ $<
CLEAN-OBJS += obj_int_extract
#
# Utility functions
#
pairmap=$(if $(strip $(2)),\
$(call $(1),$(word 1,$(2)),$(word 2,$(2)))\
$(call pairmap,$(1),$(wordlist 3,$(words $(2)),$(2)))\
)
enabled=$(filter-out $($(1)-no),$($(1)-yes))
cond_enabled=$(if $(filter yes,$($(1))), $(call enabled,$(2)))
find_file1=$(word 1,$(wildcard $(subst //,/,$(addsuffix /$(1),$(2)))))
find_file=$(foreach f,$(1),$(call find_file1,$(strip $(f)),$(strip $(2))) )
obj_pats=.c=.c.o $(AS_SFX)=$(AS_SFX).o
objs=$(addprefix $(BUILD_PFX),$(foreach p,$(obj_pats),$(filter %.o,$(1:$(p))) ))
install_map_templates=$(eval $(call install_map_template,$(1),$(2)))
not=$(subst yes,no,$(1))
ifeq ($(CONFIG_MSVS),yes)
lib_file_name=$(1).lib
else
lib_file_name=lib$(1).a
endif
#
# Rule Templates
#
define linker_template
$(1): $(filter-out -%,$(2))
$(1):
$(if $(quiet),@echo " [LD] $$@")
$(qexec)$$(LD) $$(strip $$(LDFLAGS) -o $$@ $(2) $(3) $$(extralibs))
endef
# make-3.80 has a bug with expanding large input strings to the eval function,
# which was triggered in some cases by the following component of
# linker_template:
# $(1): $$(call find_file, $(patsubst -l%,lib%.a,$(filter -l%,$(2))),\
# $$(patsubst -L%,%,$$(filter -L%,$$(LDFLAGS) $(2))))
# This may be useful to revisit in the future (it tries to locate libraries
# in a search path and add them as prerequisites
define install_map_template
$(DIST_DIR)/$(1): $(2)
$(if $(quiet),@echo " [INSTALL] $$@")
$(qexec)mkdir -p $$(dir $$@)
$(qexec)cp -p $$< $$@
endef
define archive_template
# Not using a pattern rule here because we don't want to generate empty
# archives when they are listed as a dependency in files not responsible
# for creating them.
$(1):
$(if $(quiet),@echo " [AR] $$@")
$(qexec)$$(AR) $$(ARFLAGS) $$@ $$?
endef
define lipo_lib_template
$(1): $(addsuffix /$(1),$(FAT_ARCHS))
$(if $(quiet),@echo " [LIPO] $$@")
$(qexec)libtool -static -o $$@ $$?
endef
define lipo_bin_template
$(1): $(addsuffix /$(1),$(FAT_ARCHS))
$(if $(quiet),@echo " [LIPO] $$@")
$(qexec)lipo -output $$@ -create $$?
endef
#
# Get current configuration
#
ifneq ($(target),)
include $(SRC_PATH_BARE)/$(target:-$(TOOLCHAIN)=).mk
endif
ifeq ($(filter clean,$(MAKECMDGOALS)),)
# Older versions of make don't like -include directives with no arguments
ifneq ($(filter %.d,$(OBJS-yes:.o=.d)),)
-include $(filter %.d,$(OBJS-yes:.o=.d))
endif
endif
#
# Configuration dependant rules
#
$(call pairmap,install_map_templates,$(INSTALL_MAPS))
DOCS=$(call cond_enabled,CONFIG_INSTALL_DOCS,DOCS)
.docs: $(DOCS)
@touch $@
INSTALL-DOCS=$(call cond_enabled,CONFIG_INSTALL_DOCS,INSTALL-DOCS)
.install-docs: .docs $(addprefix $(DIST_DIR)/,$(INSTALL-DOCS))
@touch $@
clean::
rm -f .docs .install-docs $(DOCS)
BINS=$(call enabled,BINS)
.bins: $(BINS)
@touch $@
INSTALL-BINS=$(call cond_enabled,CONFIG_INSTALL_BINS,INSTALL-BINS)
.install-bins: .bins $(addprefix $(DIST_DIR)/,$(INSTALL-BINS))
@touch $@
clean::
rm -f .bins .install-bins $(BINS)
LIBS=$(call enabled,LIBS)
.libs: $(LIBS)
@touch $@
$(foreach lib,$(filter %_g.a,$(LIBS)),$(eval $(call archive_template,$(lib))))
INSTALL-LIBS=$(call cond_enabled,CONFIG_INSTALL_LIBS,INSTALL-LIBS)
.install-libs: .libs $(addprefix $(DIST_DIR)/,$(INSTALL-LIBS))
@touch $@
clean::
rm -f .libs .install-libs $(LIBS)
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
PROJECTS=$(call enabled,PROJECTS)
.projects: $(PROJECTS)
@touch $@
INSTALL-PROJECTS=$(call cond_enabled,CONFIG_INSTALL_PROJECTS,INSTALL-PROJECTS)
.install-projects: .projects $(addprefix $(DIST_DIR)/,$(INSTALL-PROJECTS))
@touch $@
clean::
rm -f .projects .install-projects $(PROJECTS)
endif
# If there are any source files to be installed, then include the build
# system too.
ifneq ($(call enabled,INSTALL-SRCS),)
INSTALL-SRCS-yes += configure
INSTALL-SRCS-yes += build/make/configure.sh
INSTALL-SRCS-yes += build/make/gen_asm_deps.sh
INSTALL-SRCS-yes += build/make/Makefile
INSTALL-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_def.sh
INSTALL-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_proj.sh
INSTALL-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_sln.sh
INSTALL-SRCS-$(CONFIG_RVCT) += build/make/armlink_adapter.sh
#
# This isn't really ARCH_ARM dependent, it's dependant on whether we're
# using assembly code or not (CONFIG_OPTIMIZATIONS maybe). Just use
# this for now.
INSTALL-SRCS-$(ARCH_ARM) += build/make/obj_int_extract.c
INSTALL-SRCS-$(ARCH_ARM) += build/make/ads2gas.pl
INSTALL-SRCS-yes += $(target:-$(TOOLCHAIN)=).mk
endif
INSTALL-SRCS := $(call cond_enabled,CONFIG_INSTALL_SRCS,INSTALL-SRCS)
.install-srcs: $(addprefix $(DIST_DIR)/src/,$(INSTALL-SRCS))
@touch $@
clean::
rm -f .install-srcs
ifeq ($(CONFIG_EXTERNAL_BUILD),yes)
BUILD_TARGETS += .projects
INSTALL_TARGETS += .install-projects
endif
BUILD_TARGETS += .docs .libs .bins
INSTALL_TARGETS += .install-docs .install-srcs .install-libs .install-bins
all-$(target): $(BUILD_TARGETS)
install: $(INSTALL_TARGETS)
#
# Development helper targets
#
ifneq ($(SRC_PATH_BARE),)
.PHONY: svnstat
svnstat:
svn stat $(SRC_PATH_BARE)
endif

149
build/make/ads2gas.pl Executable file
View File

@ -0,0 +1,149 @@
#!/usr/bin/perl
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
# ads2gas.pl
# Author: Eric Fung (efung (at) acm.org)
#
# Convert ARM Developer Suite 1.0.1 syntax assembly source to GNU as format
#
# Usage: cat inputfile | perl ads2gas.pl > outputfile
#
print "@ This file was created from a .asm file\n";
print "@ using the ads2gas.pl script.\n";
print "\t.equ DO1STROUNDING, 0\n";
while (<STDIN>)
{
# Comment character
s/;/@/g;
# Hexadecimal constants prefaced by 0x
s/#&/#0x/g;
# Convert :OR: to |
s/:OR:/ | /g;
# Convert :AND: to &
s/:AND:/ & /g;
# Convert :NOT: to ~
s/:NOT:/ ~ /g;
# Convert :SHL: to <<
s/:SHL:/ << /g;
# Convert :SHR: to >>
s/:SHR:/ >> /g;
# Convert ELSE to .else
s/ELSE/.else/g;
# Convert ENDIF to .endif
s/ENDIF/.endif/g;
# Convert ELSEIF to .elseif
s/ELSEIF/.elseif/g;
# Convert LTORG to .ltorg
s/LTORG/.ltorg/g;
# Convert IF :DEF:to .if
# gcc doesn't have the ability to do a conditional
# if defined variable that is set by IF :DEF: on
# armasm, so convert it to a normal .if and then
# make sure to define a value elesewhere
if (s/\bIF :DEF:\b/.if /g)
{
s/=/==/g;
}
# Convert IF to .if
if (s/\bIF\b/.if/g)
{
s/=+/==/g;
}
# Convert INCLUDE to .INCLUDE "file"
s/INCLUDE(\s*)(.*)$/.include $1\"$2\"/;
# Code directive (ARM vs Thumb)
s/CODE([0-9][0-9])/.code $1/;
# No AREA required
s/^\s*AREA.*$/.text/;
# DCD to .word
# This one is for incoming symbols
s/DCD\s+\|(\w*)\|/.long $1/;
# DCW to .short
s/DCW\s+\|(\w*)\|/.short $1/;
s/DCW(.*)/.short $1/;
# Constants defined in scope
s/DCD(.*)/.long $1/;
s/DCB(.*)/.byte $1/;
# RN to .req
if (s/RN\s+([Rr]\d+|lr)/.req $1/)
{
print;
next;
}
# Make function visible to linker, and make additional symbol with
# prepended underscore
s/EXPORT\s+\|([\$\w]*)\|/.global $1 \n\t.type $1, function/;
s/IMPORT\s+\|([\$\w]*)\|/.global $1/;
# No vertical bars required; make additional symbol with prepended
# underscore
s/^\|(\$?\w+)\|/_$1\n\t$1:/g;
# Labels need trailing colon
# s/^(\w+)/$1:/ if !/EQU/;
# put the colon at the end of the line in the macro
s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
# Strip ALIGN
s/\sALIGN/@ ALIGN/g;
# Strip ARM
s/\sARM/@ ARM/g;
# Strip REQUIRE8
#s/\sREQUIRE8/@ REQUIRE8/g;
s/\sREQUIRE8/@ /g; #EQU cause problem
# Strip PRESERVE8
s/\sPRESERVE8/@ PRESERVE8/g;
# Strip PROC and ENDPROC
s/\sPROC/@/g;
s/\sENDP/@/g;
# EQU directive
s/(.*)EQU(.*)/.equ $1, $2/;
# Begin macro definition
if (/MACRO/) {
$_ = <STDIN>;
s/^/.macro/;
s/\$//g; # remove formal param reference
s/;/@/g; # change comment characters
}
# For macros, use \ to reference formal params
s/\$/\\/g; # End macro definition
s/MEND/.endm/; # No need to tell it where to stop assembling
next if /^\s*END\s*$/;
print;
}

194
build/make/ads2gas_apple.pl Executable file
View File

@ -0,0 +1,194 @@
#!/usr/bin/env perl
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
# ads2gas.pl
# Author: Eric Fung (efung (at) acm.org)
#
# Convert ARM Developer Suite 1.0.1 syntax assembly source to GNU as format
#
# Usage: cat inputfile | perl ads2gas.pl > outputfile
#
print "@ This file was created from a .asm file\n";
print "@ using the ads2gas_apple.pl script.\n\n";
print "\t.set WIDE_REFERENCE, 0\n";
print "\t.set ARCHITECTURE, 5\n";
print "\t.set DO1STROUNDING, 0\n";
my %register_aliases;
my %macro_aliases;
my @mapping_list = ("\$0", "\$1", "\$2", "\$3", "\$4", "\$5", "\$6", "\$7", "\$8", "\$9");
my @incoming_array;
# Perl trim function to remove whitespace from the start and end of the string
sub trim($)
{
my $string = shift;
$string =~ s/^\s+//;
$string =~ s/\s+$//;
return $string;
}
while (<STDIN>)
{
# Comment character
s/;/@/g;
# Hexadecimal constants prefaced by 0x
s/#&/#0x/g;
# Convert :OR: to |
s/:OR:/ | /g;
# Convert :AND: to &
s/:AND:/ & /g;
# Convert :NOT: to ~
s/:NOT:/ ~ /g;
# Convert :SHL: to <<
s/:SHL:/ << /g;
# Convert :SHR: to >>
s/:SHR:/ >> /g;
# Convert ELSE to .else
s/ELSE/.else/g;
# Convert ENDIF to .endif
s/ENDIF/.endif/g;
# Convert ELSEIF to .elseif
s/ELSEIF/.elseif/g;
# Convert LTORG to .ltorg
s/LTORG/.ltorg/g;
# Convert IF :DEF:to .if
# gcc doesn't have the ability to do a conditional
# if defined variable that is set by IF :DEF: on
# armasm, so convert it to a normal .if and then
# make sure to define a value elesewhere
if (s/\bIF :DEF:\b/.if /g)
{
s/=/==/g;
}
# Convert IF to .if
if (s/\bIF\b/.if/g)
{
s/=/==/g;
}
# Convert INCLUDE to .INCLUDE "file"
s/INCLUDE(\s*)(.*)$/.include $1\"$2\"/;
# Code directive (ARM vs Thumb)
s/CODE([0-9][0-9])/.code $1/;
# No AREA required
s/^\s*AREA.*$/.text/;
# DCD to .word
# This one is for incoming symbols
s/DCD\s+\|(\w*)\|/.long $1/;
# DCW to .short
s/DCW\s+\|(\w*)\|/.short $1/;
s/DCW(.*)/.short $1/;
# Constants defined in scope
s/DCD(.*)/.long $1/;
s/DCB(.*)/.byte $1/;
# Build a hash of all the register - alias pairs.
if (s/(.*)RN(.*)/$1 .req $2/g)
{
$register_aliases{trim($1)} = trim($2);
next;
}
while (($key, $value) = each(%register_aliases))
{
s/\b$key\b/$value/g;
}
# Make function visible to linker, and make additional symbol with
# prepended underscore
s/EXPORT\s+\|([\$\w]*)\|/.globl _$1\n\t.globl $1/;
s/IMPORT\s+\|([\$\w]*)\|/.globl $1/;
# No vertical bars required; make additional symbol with prepended
# underscore
s/^\|(\$?\w+)\|/_$1\n\t$1:/g;
# Labels need trailing colon
# s/^(\w+)/$1:/ if !/EQU/;
# put the colon at the end of the line in the macro
s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
# Strip ALIGN
s/\sALIGN/@ ALIGN/g;
# Strip ARM
s/\sARM/@ ARM/g;
# Strip REQUIRE8
#s/\sREQUIRE8/@ REQUIRE8/g;
s/\sREQUIRE8/@ /g;
# Strip PRESERVE8
s/\sPRESERVE8/@ PRESERVE8/g;
# Strip PROC and ENDPROC
s/PROC/@/g;
s/ENDP/@/g;
# EQU directive
s/(.*)EQU(.*)/.set $1, $2/;
# Begin macro definition
if (/MACRO/)
{
# Process next line down, which will be the macro definition
$_ = <STDIN>;
$trimmed = trim($_);
# remove commas that are separating list
$trimmed =~ s/,//g;
# string to array
@incoming_array = split(/ /, $trimmed);
print ".macro @incoming_array[0]\n";
# remove the first element, as that is the name of the macro
shift (@incoming_array);
@macro_aliases{@incoming_array} = @mapping_list;
next;
}
while (($key, $value) = each(%macro_aliases))
{
$key =~ s/\$/\\\$/;
s/$key\b/$value/g;
}
# For macros, use \ to reference formal params
# s/\$/\\/g; # End macro definition
s/MEND/.endm/; # No need to tell it where to stop assembling
next if /^\s*END\s*$/;
print;
}

51
build/make/armlink_adapter.sh Executable file
View File

@ -0,0 +1,51 @@
#!/bin/bash
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
verbose=0
set -- $*
for i; do
if [ "$i" == "-o" ]; then
on_of=1
elif [ "$i" == "-v" ]; then
verbose=1
elif [ "$on_of" == "1" ]; then
outfile=$i
on_of=0
elif [ -f "$i" ]; then
infiles="$infiles $i"
elif [ "${i:0:2}" == "-l" ]; then
libs="$libs ${i#-l}"
elif [ "${i:0:2}" == "-L" ]; then
libpaths="${libpaths} ${i#-L}"
else
args="${args} ${i}"
fi
shift
done
# Absolutize library file names
for f in $libs; do
found=0
for d in $libpaths; do
[ -f "$d/$f" ] && infiles="$infiles $d/$f" && found=1 && break
[ -f "$d/lib${f}.so" ] && infiles="$infiles $d/lib${f}.so" && found=1 && break
[ -f "$d/lib${f}.a" ] && infiles="$infiles $d/lib${f}.a" && found=1 && break
done
[ $found -eq 0 ] && infiles="$infiles $f"
done
for d in $libpaths; do
[ -n "$libsearchpath" ] && libsearchpath="${libsearchpath},"
libsearchpath="${libsearchpath}$d"
done
cmd="armlink $args --userlibpath=$libsearchpath --output=$outfile $infiles"
[ $verbose -eq 1 ] && echo $cmd
$cmd

907
build/make/configure.sh Executable file
View File

@ -0,0 +1,907 @@
#!/bin/bash
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
#
# Logging / Output Functions
#
die_unknown(){
echo "Unknown option \"$1\"."
echo "See $0 --help for available options."
clean_temp_files
exit 1
}
die() {
echo "$@"
echo
echo "Configuration failed. This could reflect a misconfiguration of your"
echo "toolchains, improper options selected, or another problem. If you"
echo "don't see any useful error messages above, the next step is to look"
echo "at the configure error log file ($logfile) to determine what"
echo "configure was trying to do when it died."
clean_temp_files
exit 1
}
log(){
echo "$@" >>$logfile
}
log_file(){
log BEGIN $1
pr -n -t $1 >>$logfile
log END $1
}
log_echo() {
echo "$@"
log "$@"
}
fwrite () {
outfile=$1
shift
echo "$@" >> ${outfile}
}
show_help_pre(){
for opt in ${CMDLINE_SELECT}; do
opt2=`echo $opt | sed -e 's;_;-;g'`
if enabled $opt; then
eval "toggle_${opt}=\"--disable-${opt2}\""
else
eval "toggle_${opt}=\"--enable-${opt2} \""
fi
done
cat <<EOF
Usage: configure [options]
Options:
Build options:
--help print this message
--log=yes|no|FILE file configure log is written to [config.err]
--target=TARGET target platform tuple [generic-gnu]
--cpu=CPU optimize for a specific cpu rather than a family
${toggle_extra_warnings} emit harmless warnings (always non-fatal)
${toggle_werror} treat warnings as errors, if possible
(not available with all compilers)
${toggle_optimizations} turn on/off compiler optimization flags
${toggle_pic} turn on/off Position Independant Code
${toggle_ccache} turn on/off compiler cache
${toggle_debug} enable/disable debug mode
${toggle_gprof} enable/disable gprof profiling instrumentation
${toggle_gcov} enable/disable gcov coverage instrumentation
Install options:
${toggle_install_docs} control whether docs are installed
${toggle_install_bins} control whether binaries are installed
${toggle_install_libs} control whether libraries are installed
${toggle_install_srcs} control whether sources are installed
EOF
}
show_help_post(){
cat <<EOF
NOTES:
Object files are built at the place where configure is launched.
All boolean options can be negated. The default value is the opposite
of that shown above. If the option --disable-foo is listed, then
the default value for foo is enabled.
Supported targets:
EOF
show_targets ${all_platforms}
echo
exit 1
}
show_targets() {
while [ -n "$*" ]; do
if [ "${1%%-*}" == "${2%%-*}" ]; then
if [ "${2%%-*}" == "${3%%-*}" ]; then
printf " %-24s %-24s %-24s\n" "$1" "$2" "$3"
shift; shift; shift
else
printf " %-24s %-24s\n" "$1" "$2"
shift; shift
fi
else
printf " %-24s\n" "$1"
shift
fi
done
}
show_help() {
show_help_pre
show_help_post
}
#
# List Processing Functions
#
set_all(){
value=$1
shift
for var in $*; do
eval $var=$value
done
}
is_in(){
value=$1
shift
for var in $*; do
[ $var = $value ] && return 0
done
return 1
}
add_cflags() {
CFLAGS="${CFLAGS} $@"
}
add_ldflags() {
LDFLAGS="${LDFLAGS} $@"
}
add_asflags() {
ASFLAGS="${ASFLAGS} $@"
}
add_extralibs() {
extralibs="${extralibs} $@"
}
#
# Boolean Manipulation Functions
#
enable(){
set_all yes $*
}
disable(){
set_all no $*
}
enabled(){
eval test "x\$$1" = "xyes"
}
disabled(){
eval test "x\$$1" = "xno"
}
soft_enable() {
for var in $*; do
if ! disabled $var; then
log_echo " enabling $var"
enable $var
fi
done
}
soft_disable() {
for var in $*; do
if ! enabled $var; then
log_echo " disabling $var"
disable $var
fi
done
}
#
# Text Processing Functions
#
toupper(){
echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
}
tolower(){
echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
}
#
# Temporary File Functions
#
source_path=${0%/*}
enable source_path_used
if test -z "$source_path" -o "$source_path" = "." ; then
source_path="`pwd`"
disable source_path_used
fi
if test ! -z "$TMPDIR" ; then
TMPDIRx="${TMPDIR}"
elif test ! -z "$TEMPDIR" ; then
TMPDIRx="${TEMPDIR}"
else
TMPDIRx="/tmp"
fi
TMP_H="${TMPDIRx}/vpx-conf-$$-${RANDOM}.h"
TMP_C="${TMPDIRx}/vpx-conf-$$-${RANDOM}.c"
TMP_O="${TMPDIRx}/vpx-conf-$$-${RANDOM}.o"
TMP_X="${TMPDIRx}/vpx-conf-$$-${RANDOM}.x"
clean_temp_files() {
rm -f ${TMP_C} ${TMP_H} ${TMP_O} ${TMP_X}
}
#
# Toolchain Check Functions
#
check_cmd() {
log "$@"
"$@" >>${logfile} 2>&1
}
check_cc() {
log check_cc "$@"
cat >${TMP_C}
log_file ${TMP_C}
check_cmd ${CC} ${CFLAGS} "$@" -c -o ${TMP_O} ${TMP_C}
}
check_cpp() {
log check_cpp "$@"
cat > ${TMP_C}
log_file ${TMP_C}
check_cmd ${CC} ${CFLAGS} "$@" -E -o ${TMP_O} ${TMP_C}
}
check_ld() {
log check_ld "$@"
check_cc $@ \
&& check_cmd ${LD} ${LDFLAGS} "$@" -o ${TMP_X} ${TMP_O} ${extralibs}
}
check_header(){
log check_header "$@"
header=$1
shift
var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
disable $var
check_cpp "$@" <<EOF && enable $var
#include "$header"
int x;
EOF
}
check_cflags() {
log check_cflags "$@"
check_cc "$@" <<EOF
int x;
EOF
}
check_add_cflags() {
check_cflags "$@" && add_cflags "$@"
}
check_add_asflags() {
log add_asflags "$@"
add_asflags "$@"
}
check_add_ldflags() {
log add_ldflags "$@"
add_ldflags "$@"
}
write_common_config_banner() {
echo '# This file automatically generated by configure. Do not edit!' > config.mk
echo "TOOLCHAIN := ${toolchain}" >> config.mk
case ${toolchain} in
*-linux-rvct)
echo "ALT_LIBC := ${alt_libc}" >> config.mk
;;
esac
}
write_common_config_targets() {
for t in ${all_targets}; do
if enabled ${t}; then
if enabled universal || enabled child; then
fwrite config.mk "ALL_TARGETS += ${t}-${toolchain}"
else
fwrite config.mk "ALL_TARGETS += ${t}"
fi
fi
true;
done
true
}
write_common_target_config_mk() {
[ -n "$2" ] && local have_config_h="-DHAVE_CONFIG_H=\"${2##*/}\""
local CC=${CC}
enabled ccache && CC="ccache ${CC}"
cat > $1 << EOF
# This file automatically generated by configure. Do not edit!
SRC_PATH="$source_path"
SRC_PATH_BARE=$source_path
BUILD_PFX=${BUILD_PFX}
TOOLCHAIN=${toolchain}
ASM_CONVERSION=${asm_conversion_cmd:-${source_path}/build/make/ads2gas.pl}
CC=${CC}
AR=${AR}
LD=${LD}
AS=${AS}
STRIP=${STRIP}
NM=${NM}
CFLAGS = ${CFLAGS} ${have_config_h}
ARFLAGS = -rus\$(if \$(quiet),c,v)
LDFLAGS = ${LDFLAGS}
ASFLAGS = ${ASFLAGS}
extralibs = ${extralibs}
AS_SFX = ${AS_SFX:-.asm}
EOF
if enabled rvct; then cat >> $1 << EOF
fmt_deps = sed -e 's;^__image.axf;\$(dir \$@)\$(notdir \$<).o \$@;' #hide
EOF
else cat >> $1 << EOF
fmt_deps = sed -e 's;^\(.*\)\.o;\$(dir \$@)\1\$(suffix \$<).o \$@;' #hide
EOF
fi
print_config_mk ARCH "${1}" ${ARCH_LIST}
print_config_mk HAVE "${1}" ${HAVE_LIST}
print_config_mk CONFIG "${1}" ${CONFIG_LIST}
print_config_mk HAVE "${1}" gnu_strip
enabled msvs && echo "CONFIG_VS_VERSION=${vs_version}" >> "${1}"
}
write_common_target_config_h() {
cat > ${TMP_H} << EOF
/* This file automatically generated by configure. Do not edit! */
#define INLINE ${INLINE}
#define FORCEINLINE ${FORCEINLINE:-${INLINE}}
#define RESTRICT ${RESTRICT}
EOF
print_config_h ARCH "${TMP_H}" ${ARCH_LIST}
print_config_h HAVE "${TMP_H}" ${HAVE_LIST}
print_config_h CONFIG "${TMP_H}" ${CONFIG_LIST}
mkdir -p `dirname "$1"`
cmp "$1" ${TMP_H} >/dev/null 2>&1 || mv ${TMP_H} "$1"
}
process_common_cmdline() {
for opt in "$@"; do
optval="${opt#*=}"
case "$opt" in
--child) enable child
;;
--log*)
logging="$optval"
if ! disabled logging ; then
enabled logging || logfile="$logging"
else
logfile=/dev/null
fi
;;
--target=*) toolchain="${toolchain:-${optval}}"
;;
--force-target=*) toolchain="${toolchain:-${optval}}"; enable force_toolchain
;;
--cpu)
;;
--cpu=*) tune_cpu="$optval"
;;
--enable-?*|--disable-?*)
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
echo "${CMDLINE_SELECT} ${ARCH_EXT_LIST}" | grep "^ *$option\$" >/dev/null || die_unknown $opt
$action $option
;;
--force-enable-?*|--force-disable-?*)
eval `echo "$opt" | sed 's/--force-/action=/;s/-/ option=/;s/-/_/g'`
$action $option
;;
--libc=*)
[ -d "${optval}" ] || die "Not a directory: ${optval}"
disable builtin_libc
alt_libc="${optval}"
;;
--libc)
die "Option ${opt} requires argument"
;;
--help|-h) show_help
;;
*) die_unknown $opt
;;
esac
done
}
process_cmdline() {
for opt do
optval="${opt#*=}"
case "$opt" in
*) process_common_cmdline $opt
;;
esac
done
}
post_process_cmdline() {
true;
}
setup_gnu_toolchain() {
CC=${CC:-${CROSS}gcc}
AR=${AR:-${CROSS}ar}
LD=${LD:-${CROSS}${link_with_cc:-ld}}
AS=${AS:-${CROSS}as}
STRIP=${STRIP:-${CROSS}strip}
NM=${NM:-${CROSS}nm}
AS_SFX=.s
}
process_common_toolchain() {
toolchain=${toolchain:-generic-gnu}
is_in ${toolchain} ${all_platforms} || enabled force_toolchain \
|| die "Unrecognized toolchain '${toolchain}'"
enabled child || log_echo "Configuring for target '${toolchain}'"
#
# Set up toolchain variables
#
tgt_isa=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $1}')
tgt_os=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $2}')
tgt_cc=$(echo ${toolchain} | awk 'BEGIN{FS="-"}{print $3}')
# Mark the specific ISA requested as enabled
soft_enable ${tgt_isa}
enable ${tgt_os}
enable ${tgt_cc}
# Enable the architecture family
case ${tgt_isa} in
arm*|iwmmxt*) enable arm;;
mips*) enable mips;;
esac
# Handle darwin variants
case ${toolchain} in
*-darwin8-gcc)
add_cflags "-isysroot /Developer/SDKs/MacOSX10.4u.sdk"
add_cflags "-mmacosx-version-min=10.4"
add_ldflags "-isysroot /Developer/SDKs/MacOSX10.4u.sdk"
add_ldflags "-mmacosx-version-min=10.4"
;;
*-darwin9-gcc)
add_cflags "-isysroot /Developer/SDKs/MacOSX10.5.sdk"
add_cflags "-mmacosx-version-min=10.5"
add_ldflags "-isysroot /Developer/SDKs/MacOSX10.5.sdk"
add_ldflags "-mmacosx-version-min=10.5"
;;
esac
# Process ARM architecture variants
case ${toolchain} in
arm*|iwmmxt*)
# on arm, isa versions are supersets
enabled armv7a && soft_enable armv7 ### DEBUG
enabled armv7 && soft_enable armv6
enabled armv6 && soft_enable armv5te
enabled armv6 && soft_enable fast_unaligned
enabled iwmmxt2 && soft_enable iwmmxt
enabled iwmmxt && soft_enable armv5te
asm_conversion_cmd="cat"
case ${tgt_cc} in
gcc)
if enabled iwmmxt || enabled iwmmxt2
then
CROSS=${CROSS:-arm-iwmmxt-linux-gnueabi-}
elif enabled symbian; then
CROSS=${CROSS:-arm-none-symbianelf-}
else
CROSS=${CROSS:-arm-none-linux-gnueabi-}
fi
link_with_cc=gcc
setup_gnu_toolchain
arch_int=${tgt_isa##armv}
arch_int=${arch_int%%te}
check_add_asflags --defsym ARCHITECTURE=${arch_int}
tune_cflags="-mtune="
if enabled iwmmxt || enabled iwmmxt2
then
check_add_asflags -mcpu=${tgt_isa}
elif enabled armv7
then
check_add_cflags -march=armv7-a -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-ftree-vectorize
check_add_asflags -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-march=armv7-a
else
check_add_cflags -march=${tgt_isa}
check_add_asflags -march=${tgt_isa}
fi
asm_conversion_cmd="${source_path}/build/make/ads2gas.pl"
;;
rvct)
CC=armcc
AR=armar
AS=armasm
LD=${source_path}/build/make/armlink_adapter.sh
STRIP=arm-none-linux-gnueabi-strip
NM=arm-none-linux-gnueabi-nm
tune_cflags="--cpu="
tune_asflags="--cpu="
if [ -z "${tune_cpu}" ]; then
if enabled armv7
then
check_add_cflags --cpu=Cortex-A8 --fpu=softvfp+vfpv3
check_add_asflags --cpu=Cortex-A8 --fpu=none
else
check_add_cflags --cpu=${tgt_isa##armv}
check_add_asflags --cpu=${tgt_isa##armv}
fi
fi
arch_int=${tgt_isa##armv}
arch_int=${arch_int%%te}
check_add_asflags --pd "\"ARCHITECTURE SETA ${arch_int}\""
;;
esac
case ${tgt_os} in
darwin*)
SDK_PATH=/Developer/Platforms/iPhoneOS.platform/Developer
TOOLCHAIN_PATH=${SDK_PATH}/usr/bin
CC=${TOOLCHAIN_PATH}/gcc
AR=${TOOLCHAIN_PATH}/ar
LD=${TOOLCHAIN_PATH}/arm-apple-darwin9-gcc-4.2.1
AS=${TOOLCHAIN_PATH}/as
STRIP=${TOOLCHAIN_PATH}/strip
NM=${TOOLCHAIN_PATH}/nm
AS_SFX=.s
# ASFLAGS is written here instead of using check_add_asflags
# because we need to overwrite all of ASFLAGS and purge the
# options that were put in above
ASFLAGS="-version -arch ${tgt_isa} -g"
add_cflags -arch ${tgt_isa}
add_ldflags -arch_only ${tgt_isa}
add_cflags "-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk"
# This should be overridable
alt_libc=${SDK_PATH}/SDKs/iPhoneOS3.1.sdk
# Add the paths for the alternate libc
# for d in usr/include usr/include/gcc/darwin/4.0/; do
for d in usr/include usr/include/gcc/darwin/4.0/ usr/lib/gcc/arm-apple-darwin9/4.0.1/include/; do
try_dir="${alt_libc}/${d}"
[ -d "${try_dir}" ] && add_cflags -I"${try_dir}"
done
for d in lib usr/lib; do
try_dir="${alt_libc}/${d}"
[ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
done
asm_conversion_cmd="${source_path}/build/make/ads2gas_apple.pl"
;;
linux*)
enable linux
if enabled rvct; then
# Compiling with RVCT requires an alternate libc (glibc) when
# targetting linux.
disabled builtin_libc \
|| die "Must supply --libc when targetting *-linux-rvct"
# Set up compiler
add_cflags --gnu
add_cflags --enum_is_int
add_cflags --library_interface=aeabi_glibc
add_cflags --no_hide_all
add_cflags --wchar32
add_cflags --dwarf2
add_cflags --gnu
# Set up linker
add_ldflags --sysv --no_startup --no_ref_cpp_init
add_ldflags --entry=_start
add_ldflags --keep '"*(.init)"' --keep '"*(.fini)"'
add_ldflags --keep '"*(.init_array)"' --keep '"*(.fini_array)"'
add_ldflags --dynamiclinker=/lib/ld-linux.so.3
add_extralibs libc.so.6 -lc_nonshared crt1.o crti.o crtn.o
# Add the paths for the alternate libc
for d in usr/include; do
try_dir="${alt_libc}/${d}"
[ -d "${try_dir}" ] && add_cflags -J"${try_dir}"
done
add_cflags -J"${RVCT31INC}"
for d in lib usr/lib; do
try_dir="${alt_libc}/${d}"
[ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
done
# glibc has some struct members named __align, which is a
# storage modifier in RVCT. If we need to use this modifier,
# we'll have to #undef it in our code. Note that this must
# happen AFTER all libc inclues.
add_cflags -D__align=x_align_x
fi
;;
symbian*)
enable symbian
# Add the paths for the alternate libc
for d in include/libc; do
try_dir="${alt_libc}/${d}"
[ -d "${try_dir}" ] && add_cflags -I"${try_dir}"
done
for d in release/armv5/urel; do
try_dir="${alt_libc}/${d}"
[ -d "${try_dir}" ] && add_ldflags -L"${try_dir}"
done
add_cflags -DIMPORT_C=
esac
;;
mips*)
CROSS=${CROSS:-mipsel-linux-uclibc-}
link_with_cc=gcc
setup_gnu_toolchain
tune_cflags="-mtune="
check_add_cflags -march=${tgt_isa}
check_add_asflags -march=${tgt_isa}
check_add_asflags -KPIC
;;
ppc*)
enable ppc
bits=${tgt_isa##ppc}
link_with_cc=gcc
setup_gnu_toolchain
add_asflags -force_cpusubtype_ALL -I"\$(dir \$<)darwin"
add_cflags -maltivec -faltivec
soft_enable altivec
case "$tgt_os" in
linux*)
add_asflags -maltivec -mregnames -I"\$(dir \$<)linux"
;;
darwin*)
darwin_arch="-arch ppc"
enabled ppc64 && darwin_arch="${darwin_arch}64"
add_cflags ${darwin_arch} -m${bits} -fasm-blocks
add_asflags ${darwin_arch} -force_cpusubtype_ALL -I"\$(dir \$<)darwin"
add_ldflags ${darwin_arch} -m${bits}
;;
esac
;;
x86*)
bits=32
enabled x86_64 && bits=64
soft_enable runtime_cpu_detect
soft_enable mmx
soft_enable sse
soft_enable sse2
soft_enable sse3
soft_enable ssse3
case ${tgt_os} in
solaris*)
CC=${CC:-${CROSS}gcc}
LD=${LD:-${CROSS}gcc}
CROSS=${CROSS:-g}
;;
esac
case ${tgt_cc} in
icc*)
CC=${CC:-icc}
LD=${LD:-icc}
setup_gnu_toolchain
add_cflags -use-msasm -use-asm
add_ldflags -i-static
;;
gcc*)
add_cflags -m${bits}
add_ldflags -m${bits}
link_with_cc=gcc
setup_gnu_toolchain
;;
esac
AS=yasm
AS_SFX=.asm
case ${tgt_os} in
win*)
add_asflags -f win${bits}
enabled debug && add_asflags -g dwarf2
;;
linux*|solaris*)
add_asflags -f elf${bits}
enabled debug && add_asflags -g dwarf2
;;
darwin*)
add_asflags -f macho${bits}
enabled x86 && darwin_arch="-arch i386" || darwin_arch="-arch x86_64"
add_cflags ${darwin_arch}
add_ldflags ${darwin_arch}
# -mdynamic-no-pic is still a bit of voodoo -- it was required at
# one time, but does not seem to be now, and it breaks some of the
# code that still relies on inline assembly.
# enabled icc && ! enabled pic && add_cflags -fno-pic -mdynamic-no-pic
enabled icc && ! enabled pic && add_cflags -fno-pic
;;
*) log "Warning: Unknown os $tgt_os while setting up yasm flags"
;;
esac
;;
universal*|*-gcc|generic-gnu)
link_with_cc=gcc
setup_gnu_toolchain
;;
esac
# Try to enable CPU specific tuning
if [ -n "${tune_cpu}" ]; then
if [ -n "${tune_cflags}" ]; then
check_add_cflags ${tune_cflags}${tune_cpu} || \
die "Requested CPU '${tune_cpu}' not supported by compiler"
fi
if [ -n "${tune_asflags}" ]; then
check_add_asflags ${tune_asflags}${tune_cpu} || \
die "Requested CPU '${tune_cpu}' not supported by assembler"
fi
if [ -z "${tune_cflags}${tune_asflags}" ]; then
log_echo "Warning: CPU tuning not supported by this toolchain"
fi
fi
enabled debug && check_add_cflags -g && check_add_ldflags -g
enabled gprof && check_add_cflags -pg && check_add_ldflags -pg
enabled gcov &&
check_add_cflags -fprofile-arcs -ftest-coverage &&
check_add_ldflags -fprofile-arcs -ftest-coverage
enabled optimizations && check_add_cflags -O3
if enabled rvct; then
enabled optimizations && check_add_cflags -Otime
fi
# Position Independant Code (PIC) support, for building relocatable
# shared objects
enabled gcc && enabled pic && check_add_cflags -fPIC
# Check for strip utility variant
${STRIP} -V 2>/dev/null | grep GNU >/dev/null && enable gnu_strip
# Try to determine target endianness
check_cc <<EOF
unsigned int e = 'O'<<24 | '2'<<16 | 'B'<<8 | 'E';
EOF
[ -f "${TMP_O}" ] && od -A n -t x1 "${TMP_O}" | tr -d '\n' |
grep '4f *32 *42 *45' >/dev/null 2>&1 && enable big_endian
# Almost every platform uses pthreads.
if enabled multithread; then
case ${toolchain} in
*-win*);;
*) check_header pthread.h && add_extralibs -lpthread
esac
fi
# glibc needs these
if enabled linux; then
add_cflags -D_LARGEFILE_SOURCE
add_cflags -D_FILE_OFFSET_BITS=64
fi
}
process_toolchain() {
process_common_toolchain
}
print_config_mk() {
prefix=$1
makefile=$2
shift 2
for cfg; do
upname="`toupper $cfg`"
if enabled $cfg; then
echo "${prefix}_${upname}=yes" >> $makefile
fi
done
}
print_config_h() {
prefix=$1
header=$2
shift 2
for cfg; do
upname="`toupper $cfg`"
if enabled $cfg; then
echo "#define ${prefix}_${upname} 1" >> $header
else
echo "#define ${prefix}_${upname} 0" >> $header
fi
done
}
process_targets() {
true;
}
process_detect() {
true;
}
enable logging
logfile="config.err"
self=$0
process() {
cmdline_args="$@"
process_cmdline "$@"
if enabled child; then
echo "# ${self} $@" >> ${logfile}
else
echo "# ${self} $@" > ${logfile}
fi
post_process_cmdline
process_toolchain
process_detect
process_targets
OOT_INSTALLS="${OOT_INSTALLS}"
if enabled source_path_used; then
# Prepare the PWD for building.
for f in ${OOT_INSTALLS}; do
install -D ${source_path}/$f $f
done
fi
cp ${source_path}/build/make/Makefile .
clean_temp_files
true
}

63
build/make/gen_asm_deps.sh Executable file
View File

@ -0,0 +1,63 @@
#!/bin/bash
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
self=$0
show_help() {
echo "usage: $self [options] <srcfile>"
echo
echo "Generate Makefile dependency information from assembly code source"
echo
exit 1
}
die_unknown(){
echo "Unknown option \"$1\"."
echo "See $0 --help for available options."
exit 1
}
for opt do
optval="${opt#*=}"
case "$opt" in
--build-pfx=*) pfx="${optval}"
;;
--depfile=*) out="${optval}"
;;
-I*) raw_inc_paths="${raw_inc_paths} ${opt}"
inc_path="${inc_path} ${opt#-I}"
;;
-h|--help) show_help
;;
*) [ -f "$opt" ] && srcfile="$opt"
;;
esac
done
[ -n "$srcfile" ] || show_help
sfx=${sfx:-asm}
includes=$(egrep -i "include +\"?+[a-z0-9_/]+\.${sfx}" $srcfile |
perl -p -e "s;.*?([a-z0-9_/]+.${sfx}).*;\1;")
#" restore editor state
for inc in ${includes}; do
found_inc_path=
for idir in ${inc_path}; do
[ -f "${idir}/${inc}" ] && found_inc_path="${idir}" && break
done
if [ -f `dirname $srcfile`/$inc ]; then
# Handle include files in the same directory as the source
$self --build-pfx=$pfx --depfile=$out ${raw_inc_paths} `dirname $srcfile`/$inc
elif [ -n "${found_inc_path}" ]; then
# Handle include files on the include path
$self --build-pfx=$pfx --depfile=$out ${raw_inc_paths} "${found_inc_path}/$inc"
else
# Handle generated includes in the build root (which may not exist yet)
echo ${out} ${out%d}o: "${pfx}${inc}"
fi
done
echo ${out} ${out%d}o: $srcfile

82
build/make/gen_msvs_def.sh Executable file
View File

@ -0,0 +1,82 @@
#!/bin/bash
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
self=$0
self_basename=${self##*/}
EOL=$'\n'
show_help() {
cat <<EOF
Usage: ${self_basename} [options] file1 [file2 ...]
This script generates a MSVC module definition file containing a list of symbols
to export from a DLL. Source files are technically bash scripts (and thus may
use #comment syntax) but in general, take the form of a list of symbols:
<kind> symbol1 [symbol2, symbol3, ...]
where <kind> is either 'text' or 'data'
Options:
--help Print this message
--out=filename Write output to a file [stdout]
--name=project_name Name of the library (required)
EOF
exit 1
}
die() {
echo "${self_basename}: $@"
exit 1
}
die_unknown(){
echo "Unknown option \"$1\"."
echo "See ${self_basename} --help for available options."
exit 1
}
text() {
for sym in "$@"; do
echo " $sym" >> ${outfile}
done
}
data() {
for sym in "$@"; do
printf " %-40s DATA\n" "$sym" >> ${outfile}
done
}
# Process command line
for opt in "$@"; do
optval="${opt#*=}"
case "$opt" in
--help|-h) show_help
;;
--out=*) outfile="$optval"
;;
--name=*) name="${optval}"
;;
-*) die_unknown $opt
;;
*) file_list[${#file_list[@]}]="$opt"
esac
done
outfile=${outfile:-/dev/stdout}
[ -n "$name" ] || die "Library name (--name) must be specified!"
echo "LIBRARY ${name}" > ${outfile}
echo "EXPORTS" >> ${outfile}
for f in "${file_list[@]}"; do
. $f
done

717
build/make/gen_msvs_proj.sh Executable file
View File

@ -0,0 +1,717 @@
#!/bin/bash
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
self=$0
self_basename=${self##*/}
EOL=$'\n'
show_help() {
cat <<EOF
Usage: ${self_basename} --name=projname [options] file1 [file2 ...]
This script generates a Visual Studio project file from a list of source
code files.
Options:
--help Print this message
--exe Generate a project for building an Application
--lib Generate a project for creating a static library
--static-crt Use the static C runtime (/MT)
--target=isa-os-cc Target specifier (required)
--out=filename Write output to a file [stdout]
--name=project_name Name of the project (required)
--proj-guid=GUID GUID to use for the project
--module-def=filename File containing export definitions (for DLLs)
--ver=version Version (7,8) of visual studio to generate for
-Ipath/to/include Additional include directories
-DFLAG[=value] Preprocessor macros to define
-Lpath/to/lib Additional library search paths
-llibname Library to link against
EOF
exit 1
}
die() {
echo "${self_basename}: $@" >&2
exit 1
}
die_unknown(){
echo "Unknown option \"$1\"." >&2
echo "See ${self_basename} --help for available options." >&2
exit 1
}
generate_uuid() {
local hex="0123456789ABCDEF"
local i
local uuid=""
local j
#93995380-89BD-4b04-88EB-625FBE52EBFB
for ((i=0; i<32; i++)); do
(( j = $RANDOM % 16 ))
uuid="${uuid}${hex:$j:1}"
done
echo "${uuid:0:8}-${uuid:8:4}-${uuid:12:4}-${uuid:16:4}-${uuid:20:12}"
}
indent1=" "
indent=""
indent_push() {
indent="${indent}${indent1}"
}
indent_pop() {
indent="${indent%${indent1}}"
}
tag_attributes() {
for opt in "$@"; do
optval="${opt#*=}"
[ -n "${optval}" ] ||
die "Missing attribute value in '$opt' while generating $tag tag"
echo "${indent}${opt%%=*}=\"${optval}\""
done
}
open_tag() {
local tag=$1
shift
if [ $# -ne 0 ]; then
echo "${indent}<${tag}"
indent_push
tag_attributes "$@"
echo "${indent}>"
else
echo "${indent}<${tag}>"
indent_push
fi
}
close_tag() {
local tag=$1
indent_pop
echo "${indent}</${tag}>"
}
tag() {
local tag=$1
shift
if [ $# -ne 0 ]; then
echo "${indent}<${tag}"
indent_push
tag_attributes "$@"
indent_pop
echo "${indent}/>"
else
echo "${indent}<${tag}/>"
fi
}
generate_filter() {
local var=$1
local name=$2
local pats=$3
local file_list_sz
local i
local f
local saveIFS="$IFS"
local pack
echo "generating filter '$name' from ${#file_list[@]} files" >&2
IFS=*
open_tag Filter \
Name=$name \
Filter=$pats \
UniqueIdentifier=`generate_uuid`
file_list_sz=${#file_list[@]}
for i in ${!file_list[@]}; do
f=${file_list[i]}
for pat in ${pats//;/$IFS}; do
if [ "${f##*.}" == "$pat" ]; then
unset file_list[i]
open_tag File RelativePath="./$f"
if [ "$pat" == "asm" ] && $asm_use_custom_step; then
for plat in "${platforms[@]}"; do
for cfg in Debug Release; do
open_tag FileConfiguration \
Name="${cfg}|${plat}"
tag Tool \
Name="VCCustomBuildTool" \
Description="Assembling \$(InputFileName)" \
CommandLine="$(eval echo \$asm_${cfg}_cmdline)"\
Outputs="\$(InputName).obj"
close_tag FileConfiguration
done
done
fi
if [ "${f##*.}" == "cpp" ]; then
for plat in "${platforms[@]}"; do
for cfg in Debug Release; do
open_tag FileConfiguration \
Name="${cfg}|${plat}"
tag Tool \
Name="VCCLCompilerTool" \
CompileAs="2"
close_tag FileConfiguration
done
done
fi
close_tag File
break
fi
done
done
close_tag Filter
IFS="$saveIFS"
}
# Process command line
unset target
for opt in "$@"; do
optval="${opt#*=}"
case "$opt" in
--help|-h) show_help
;;
--target=*) target="${optval}"
;;
--out=*) outfile="$optval"
;;
--name=*) name="${optval}"
;;
--proj-guid=*) guid="${optval}"
;;
--module-def=*)
link_opts="${link_opts} ModuleDefinitionFile=${optval}"
;;
--exe) proj_kind="exe"
;;
--lib) proj_kind="lib"
;;
--static-crt) use_static_runtime=true
;;
--ver=*) vs_ver="$optval"
case $optval in
[78])
;;
*) die Unrecognized Visual Studio Version in $opt
;;
esac
;;
-I*) opt="${opt%/}"
incs="${incs}${incs:+;}&quot;${opt##-I}&quot;"
yasmincs="${yasmincs} ${opt}"
;;
-D*) defines="${defines}${defines:+;}${opt##-D}"
;;
-L*) # fudge . to $(OutDir)
if [ "${opt##-L}" == "." ]; then
libdirs="${libdirs}${libdirs:+;}&quot;\$(OutDir)&quot;"
else
# Also try directories for this platform/configuration
libdirs="${libdirs}${libdirs:+;}&quot;${opt##-L}&quot;"
libdirs="${libdirs}${libdirs:+;}&quot;${opt##-L}/\$(PlatformName)/\$(ConfigurationName)&quot;"
libdirs="${libdirs}${libdirs:+;}&quot;${opt##-L}/\$(PlatformName)&quot;"
fi
;;
-l*) libs="${libs}${libs:+ }${opt##-l}.lib"
;;
-*) die_unknown $opt
;;
*) file_list[${#file_list[@]}]="$opt"
case "$opt" in
*.asm) uses_asm=true;;
esac
esac
done
outfile=${outfile:-/dev/stdout}
guid=${guid:-`generate_uuid`}
asm_use_custom_step=false
uses_asm=${uses_asm:-false}
case "${vs_ver:-8}" in
7) vs_ver_id="7.10"
asm_use_custom_step=$uses_asm
;;
8) vs_ver_id="8.00"
;;
esac
[ -n "$name" ] || die "Project name (--name) must be specified!"
[ -n "$target" ] || die "Target (--target) must be specified!"
if ${use_static_runtime:-false}; then
release_runtime=0
debug_runtime=1
lib_sfx=mt
else
release_runtime=2
debug_runtime=3
lib_sfx=md
fi
# Calculate debug lib names: If a lib ends in ${lib_sfx}.lib, then rename
# it to ${lib_sfx}d.lib. This precludes linking to release libs from a
# debug exe, so this may need to be refactored later.
for lib in ${libs}; do
if [ "$lib" != "${lib%${lib_sfx}.lib}" ]; then
lib=${lib%.lib}d.lib
fi
debug_libs="${debug_libs}${debug_libs:+ }${lib}"
done
# List Keyword for this target
case "$target" in
x86*)
keyword="ManagedCProj"
;;
arm*|iwmmx*)
keyword="Win32Proj"
;;
*) die "Unsupported target $target!"
esac
# List of all platforms supported for this target
case "$target" in
x86_64*)
platforms[0]="x64"
;;
x86*)
platforms[0]="Win32"
# these are only used by vs7
asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} \$(InputPath)"
asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} \$(InputPath)"
;;
arm*|iwmmx*)
case "${name}" in
obj_int_extract) platforms[0]="Win32"
;;
*) platforms[0]="Pocket PC 2003 (ARMV4)"
;;
esac
;;
*) die "Unsupported target $target!"
esac
# List Command-line Arguments for this target
case "$target" in
arm*|iwmmx*)
if [ "$name" == "example" ];then
ARGU="--codec vp6 --flipuv --progress _bnd.vp6"
fi
if [ "$name" == "xma" ];then
ARGU="--codec vp6 -h 240 -w 320 -v"
fi
;;
esac
generate_vcproj() {
case "$proj_kind" in
exe) vs_ConfigurationType=1
;;
*) vs_ConfigurationType=4
;;
esac
echo "<?xml version=\"1.0\" encoding=\"Windows-1252\"?>"
open_tag VisualStudioProject \
ProjectType="Visual C++" \
Version="${vs_ver_id}" \
Name="${name}" \
ProjectGUID="{${guid}}" \
RootNamespace="${name}" \
Keyword="${keyword}"
open_tag Platforms
for plat in "${platforms[@]}"; do
tag Platform Name="$plat"
done
close_tag Platforms
open_tag ToolFiles
case "$target" in
x86*) $uses_asm && tag DefaultToolFile FileName="yasm.rules"
;;
arm*|iwmmx*)
if [ "$name" == "vpx_decoder" ];then
case "$target" in
armv5*)
tag DefaultToolFile FileName="armasmv5.rules"
;;
armv6*)
tag DefaultToolFile FileName="armasmv6.rules"
;;
iwmmxt*)
tag DefaultToolFile FileName="armasmxscale.rules"
;;
esac
fi
;;
esac
close_tag ToolFiles
open_tag Configurations
for plat in "${platforms[@]}"; do
plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'`
open_tag Configuration \
Name="Debug|$plat" \
OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
ConfigurationType="$vs_ConfigurationType" \
CharacterSet="1"
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
case "$name" in
vpx_decoder) tag Tool \
Name="VCPreBuildEventTool" \
CommandLine="call obj_int_extract.bat \$(ConfigurationName)"
tag Tool \
Name="VCMIDLTool" \
TargetEnvironment="1"
tag Tool \
Name="VCCLCompilerTool" \
ExecutionBucket="7" \
Optimization="0" \
AdditionalIncludeDirectories="$incs" \
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;HAVE_CONFIG_H" \
MinimalRebuild="true" \
RuntimeLibrary="1" \
BufferSecurityCheck="false" \
UsePrecompiledHeader="0" \
WarningLevel="3" \
DebugInformationFormat="1" \
CompileAs="1"
tag Tool \
Name="VCResourceCompilerTool" \
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
Culture="1033" \
AdditionalIncludeDirectories="\$(IntDir)" \
;;
example|xma) tag Tool \
Name="VCCLCompilerTool" \
ExecutionBucket="7" \
Optimization="0" \
AdditionalIncludeDirectories="$incs" \
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;DEBUG;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;HAVE_CONFIG_H" \
MinimalRebuild="true" \
RuntimeLibrary="1" \
BufferSecurityCheck="false" \
UsePrecompiledHeader="0" \
WarningLevel="3" \
DebugInformationFormat="1" \
CompileAs="1"
tag Tool \
Name="VCResourceCompilerTool" \
PreprocessorDefinitions="_DEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
Culture="1033" \
AdditionalIncludeDirectories="\$(IntDir)" \
;;
obj_int_extract) tag Tool \
Name="VCCLCompilerTool" \
Optimization="0" \
AdditionalIncludeDirectories="$incs" \
PreprocessorDefinitions="WIN32;DEBUG;_CONSOLE" \
RuntimeLibrary="1" \
WarningLevel="3" \
DebugInformationFormat="1" \
;;
esac
fi
case "$target" in
x86*) tag Tool \
Name="VCCLCompilerTool" \
Optimization="0" \
AdditionalIncludeDirectories="$incs" \
PreprocessorDefinitions="WIN32;_DEBUG;_CRT_SECURE_NO_WARNINGS;$defines" \
RuntimeLibrary="$debug_runtime" \
UsePrecompiledHeader="0" \
WarningLevel="3" \
DebugInformationFormat="1" \
Detect64BitPortabilityProblems="true" \
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs" Debug="1"
;;
esac
case "$proj_kind" in
exe)
case "$target" in
x86*) tag Tool \
Name="VCLinkerTool" \
AdditionalDependencies="$debug_libs \$(NoInherit)" \
AdditionalLibraryDirectories="$libdirs" \
GenerateDebugInformation="true" \
ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
;;
arm*|iwmmx*)
case "$name" in
obj_int_extract) tag Tool \
Name="VCLinkerTool" \
OutputFile="${name}.exe" \
GenerateDebugInformation="true"
;;
*) tag Tool \
Name="VCLinkerTool" \
AdditionalDependencies="$debug_libs" \
OutputFile="\$(OutDir)/${name}.exe" \
LinkIncremental="2" \
AdditionalLibraryDirectories="${libdirs};&quot;..\lib/$plat_no_ws&quot;" \
DelayLoadDLLs="\$(NOINHERIT)" \
GenerateDebugInformation="true" \
ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
SubSystem="9" \
StackReserveSize="65536" \
StackCommitSize="4096" \
EntryPointSymbol="mainWCRTStartup" \
TargetMachine="3"
;;
esac
;;
esac
;;
lib)
case "$target" in
arm*|iwmmx*) tag Tool \
Name="VCLibrarianTool" \
AdditionalOptions=" /subsystem:windowsce,4.20 /machine:ARM" \
OutputFile="\$(OutDir)/${name}.lib" \
;;
*) tag Tool \
Name="VCLibrarianTool" \
OutputFile="\$(OutDir)/${name}${lib_sfx}d.lib" \
;;
esac
;;
dll) tag Tool \
Name="VCLinkerTool" \
AdditionalDependencies="\$(NoInherit)" \
LinkIncremental="2" \
GenerateDebugInformation="true" \
AssemblyDebug="1" \
TargetMachine="1" \
$link_opts
esac
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
case "$name" in
vpx_decoder) tag DeploymentTool \
ForceDirty="-1" \
RegisterOutput="0"
;;
example|xma) tag DeploymentTool \
ForceDirty="-1" \
RegisterOutput="0"
tag DebuggerTool \
Arguments="${ARGU}"
;;
esac
fi
close_tag Configuration
open_tag Configuration \
Name="Release|$plat" \
OutputDirectory="\$(SolutionDir)$plat_no_ws/\$(ConfigurationName)" \
IntermediateDirectory="$plat_no_ws/\$(ConfigurationName)/${name}" \
ConfigurationType="$vs_ConfigurationType" \
CharacterSet="1" \
WholeProgramOptimization="0"
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
case "$name" in
vpx_decoder) tag Tool \
Name="VCPreBuildEventTool" \
CommandLine="call obj_int_extract.bat \$(ConfigurationName)"
tag Tool \
Name="VCMIDLTool" \
TargetEnvironment="1"
tag Tool \
Name="VCCLCompilerTool" \
ExecutionBucket="7" \
Optimization="2" \
FavorSizeOrSpeed="1" \
AdditionalIncludeDirectories="$incs" \
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_LIB;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;HAVE_CONFIG_H" \
RuntimeLibrary="0" \
BufferSecurityCheck="false" \
UsePrecompiledHeader="0" \
WarningLevel="3" \
DebugInformationFormat="0" \
CompileAs="1"
tag Tool \
Name="VCResourceCompilerTool" \
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
Culture="1033" \
AdditionalIncludeDirectories="\$(IntDir)" \
;;
example|xma) tag Tool \
Name="VCCLCompilerTool" \
ExecutionBucket="7" \
Optimization="2" \
FavorSizeOrSpeed="1" \
AdditionalIncludeDirectories="$incs" \
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES);WINCE;_CONSOLE;\$(ARCHFAM);\$(_ARCHFAM_);_UNICODE;UNICODE;HAVE_CONFIG_H" \
RuntimeLibrary="0" \
BufferSecurityCheck="false" \
UsePrecompiledHeader="0" \
WarningLevel="3" \
DebugInformationFormat="0" \
CompileAs="1"
tag Tool \
Name="VCResourceCompilerTool" \
PreprocessorDefinitions="NDEBUG;_WIN32_WCE=\$(CEVER);UNDER_CE;\$(PLATFORMDEFINES)" \
Culture="1033" \
AdditionalIncludeDirectories="\$(IntDir)" \
;;
obj_int_extract) tag Tool \
Name="VCCLCompilerTool" \
AdditionalIncludeDirectories="$incs" \
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" \
RuntimeLibrary="0" \
UsePrecompiledHeader="0" \
WarningLevel="3" \
Detect64BitPortabilityProblems="true" \
DebugInformationFormat="0" \
;;
esac
fi
case "$target" in
x86*) tag Tool \
Name="VCCLCompilerTool" \
AdditionalIncludeDirectories="$incs" \
PreprocessorDefinitions="WIN32;NDEBUG;_CRT_SECURE_NO_WARNINGS;$defines" \
RuntimeLibrary="$release_runtime" \
UsePrecompiledHeader="0" \
WarningLevel="3" \
DebugInformationFormat="0" \
Detect64BitPortabilityProblems="true"
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs"
;;
esac
case "$proj_kind" in
exe)
case "$target" in
x86*) tag Tool \
Name="VCLinkerTool" \
AdditionalDependencies="$libs \$(NoInherit)" \
AdditionalLibraryDirectories="$libdirs" \
;;
arm*|iwmmx*)
case "$name" in
obj_int_extract) tag Tool \
Name="VCLinkerTool" \
OutputFile="${name}.exe" \
LinkIncremental="1" \
GenerateDebugInformation="false" \
SubSystem="0" \
OptimizeReferences="0" \
EnableCOMDATFolding="0" \
TargetMachine="0"
;;
*) tag Tool \
Name="VCLinkerTool" \
AdditionalDependencies="$libs" \
OutputFile="\$(OutDir)/${name}.exe" \
LinkIncremental="1" \
AdditionalLibraryDirectories="${libdirs};&quot;..\lib/$plat_no_ws&quot;" \
DelayLoadDLLs="\$(NOINHERIT)" \
GenerateDebugInformation="true" \
ProgramDatabaseFile="\$(OutDir)/${name}.pdb" \
SubSystem="9" \
StackReserveSize="65536" \
StackCommitSize="4096" \
OptimizeReferences="2" \
EnableCOMDATFolding="2" \
EntryPointSymbol="mainWCRTStartup" \
TargetMachine="3"
;;
esac
;;
esac
;;
lib)
case "$target" in
arm*|iwmmx*) tag Tool \
Name="VCLibrarianTool" \
AdditionalOptions=" /subsystem:windowsce,4.20 /machine:ARM" \
OutputFile="\$(OutDir)/${name}.lib" \
;;
*) tag Tool \
Name="VCLibrarianTool" \
OutputFile="\$(OutDir)/${name}${lib_sfx}.lib" \
;;
esac
;;
dll) # note differences to debug version: LinkIncremental, AssemblyDebug
tag Tool \
Name="VCLinkerTool" \
AdditionalDependencies="\$(NoInherit)" \
LinkIncremental="1" \
GenerateDebugInformation="true" \
TargetMachine="1" \
$link_opts
esac
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
case "$name" in
vpx_decoder) tag DeploymentTool \
ForceDirty="-1" \
RegisterOutput="0"
;;
example|xma) tag DeploymentTool \
ForceDirty="-1" \
RegisterOutput="0"
tag DebuggerTool \
Arguments="${ARGU}"
;;
esac
fi
close_tag Configuration
done
close_tag Configurations
open_tag Files
generate_filter srcs "Source Files" "cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
generate_filter hdrs "Header Files" "h;hpp;hxx;hm;inl;inc;xsd"
generate_filter resrcs "Resource Files" "rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
generate_filter resrcs "Build Files" "mk"
close_tag Files
tag Globals
close_tag VisualStudioProject
# This must be done from within the {} subshell
echo "Ignored files list (${#file_list[@]} items) is:" >&2
for f in "${file_list[@]}"; do
echo " $f" >&2
done
}
generate_vcproj |
sed -e '/"/s;\([^ "]\)/;\1\\;g' > ${outfile}
exit
<!--
TODO: Add any files not captured by filters.
<File
RelativePath=".\ReadMe.txt"
>
</File>
-->

272
build/make/gen_msvs_sln.sh Executable file
View File

@ -0,0 +1,272 @@
#!/bin/bash
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
self=$0
self_basename=${self##*/}
EOL=$'\n'
EOLDOS=$'\r'
show_help() {
cat <<EOF
Usage: ${self_basename} [options] file1 [file2 ...]
This script generates a Visual Studio 2005 solution file from a list of project
files.
Options:
--help Print this message
--out=outfile Redirect output to a file
--ver=version Version (7,8) of visual studio to generate for
--target=isa-os-cc Target specifier
EOF
exit 1
}
die() {
echo "${self_basename}: $@" >&2
[ -f "${outfile}" ] && rm -f ${outfile}{,.mk}
exit 1
}
die_unknown(){
echo "Unknown option \"$1\"." >&2
echo "See ${self_basename} --help for available options." >&2
[ -f "${outfile}" ] && rm -f ${outfile}{,.mk}
exit 1
}
indent1=$'\t'
indent=""
indent_push() {
indent="${indent}${indent1}"
}
indent_pop() {
indent="${indent%${indent1}}"
}
parse_project() {
local file=$1
local name=`grep Name "$file" | awk 'BEGIN {FS="\""}{if (NR==1) print $2}'`
local guid=`grep ProjectGUID "$file" | awk 'BEGIN {FS="\""}{if (NR==1) print $2}'`
# save the project GUID to a varaible, normalizing to the basename of the
# vcproj file without the extension
local var
var=${file##*/}
var=${var%%.vcproj}
eval "${var}_file=\"$1\""
eval "${var}_name=$name"
eval "${var}_guid=$guid"
# assume that all projects have the same list of possible configurations,
# so overwriting old config_lists is not a problem
config_list=`grep -A1 '<Configuration' $file |
grep Name | cut -d\" -f2`
proj_list="${proj_list} ${var}"
}
process_project() {
eval "local file=\${$1_file}"
eval "local name=\${$1_name}"
eval "local guid=\${$1_guid}"
# save the project GUID to a varaible, normalizing to the basename of the
# vcproj file without the extension
local var
var=${file##*/}
var=${var%%.vcproj}
eval "${var}_guid=$guid"
echo "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"$name\", \"$file\", \"$guid\""
indent_push
eval "local deps=\"\${${var}_deps}\""
if [ -n "$deps" ]; then
echo "${indent}ProjectSection(ProjectDependencies) = postProject"
indent_push
for dep in $deps; do
eval "local dep_guid=\${${dep}_guid}"
[ -z "${dep_guid}" ] && die "Unknown GUID for $dep (dependency of $var)"
echo "${indent}$dep_guid = $dep_guid"
done
indent_pop
echo "${indent}EndProjectSection"
fi
indent_pop
echo "EndProject"
}
process_global() {
echo "Global"
indent_push
#
# Solution Configuration Platforms
#
echo "${indent}GlobalSection(SolutionConfigurationPlatforms) = preSolution"
indent_push
IFS_bak=${IFS}
IFS=$'\r'$'\n'
for config in ${config_list}; do
echo "${indent}$config = $config"
done
IFS=${IFS_bak}
indent_pop
echo "${indent}EndGlobalSection"
#
# Project Configuration Platforms
#
echo "${indent}GlobalSection(ProjectConfigurationPlatforms) = postSolution"
indent_push
for proj in ${proj_list}; do
eval "local proj_guid=\${${proj}_guid}"
IFS=$'\r'$'\n'
for config in ${config_list}; do
echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}"
echo "${indent}${proj_guid}.${config}.Build.0 = ${config}"
if [ "$target" == "armv6-wince-vs8" ] || [ "$target" == "armv5te-wince-vs8" ] || [ "$target" == "iwmmxt-wince-vs8" ] || [ "$target" == "iwmmxt2-wince-vs8" ];then
echo "${indent}${proj_guid}.${config}.Deploy.0 = ${config}"
fi
done
IFS=${IFS_bak}
done
indent_pop
echo "${indent}EndGlobalSection"
#
# Solution Properties
#
echo "${indent}GlobalSection(SolutionProperties) = preSolution"
indent_push
echo "${indent}HideSolutionNode = FALSE"
indent_pop
echo "${indent}EndGlobalSection"
indent_pop
echo "EndGlobal"
}
process_makefile() {
IFS_bak=${IFS}
IFS=$'\r'$'\n'
local TAB=$'\t'
cat <<EOF
found_devenv := \$(shell which devenv.com >/dev/null 2>&1 && echo yes)
.nodevenv.once:
${TAB}@echo " * devenv.com not found in path."
${TAB}@echo " * "
${TAB}@echo " * You will have to build all configurations manually using the"
${TAB}@echo " * Visual Studio IDE. To allow make to build them automatically,"
${TAB}@echo " * add the Common7/IDE directory of your Visual Studio"
${TAB}@echo " * installation to your path, eg:"
${TAB}@echo " * C:\Program Files\Microsoft Visual Studio 8\Common7\IDE"
${TAB}@echo " * "
${TAB}@touch \$@
CLEAN-OBJS += \$(if \$(found_devenv),,.nodevenv.once)
EOF
for sln_config in ${config_list}; do
local config=${sln_config%%|*}
local platform=${sln_config##*|}
local nows_sln_config=`echo $sln_config | sed -e 's/[^a-zA-Z0-9]/_/g'`
cat <<EOF
BUILD_TARGETS += \$(if \$(NO_LAUNCH_DEVENV),,$nows_sln_config)
clean::
${TAB}rm -rf "$platform"/"$config"
.PHONY: $nows_sln_config
ifneq (\$(found_devenv),)
ifeq (\$(CONFIG_VS_VERSION),7)
$nows_sln_config: $outfile
${TAB}devenv.com $outfile /build "$config"
else
$nows_sln_config: $outfile
${TAB}devenv.com $outfile /build "$sln_config"
endif
else
$nows_sln_config: $outfile .nodevenv.once
${TAB}@echo " * Skipping build of $sln_config (devenv.com not in path)."
${TAB}@echo " * "
endif
EOF
done
IFS=${IFS_bak}
}
# Process command line
outfile=/dev/stdout
for opt in "$@"; do
optval="${opt#*=}"
case "$opt" in
--help|-h) show_help
;;
--out=*) outfile="${optval}"; mkoutfile="${optval}".mk
;;
--dep=*) eval "${optval%%:*}_deps=\"\${${optval%%:*}_deps} ${optval##*:}\""
;;
--ver=*) vs_ver="$optval"
case $optval in
[78])
;;
*) die Unrecognized Visual Studio Version in $opt
;;
esac
;;
--ver=*) vs_ver="$optval"
case $optval in
7) sln_vers="8.00"
sln_vers_str="Visual Studio .NET 2003"
;;
8)
;;
*) die "Unrecognized Visual Studio Version '$optval' in $opt"
;;
esac
;;
--target=*) target="${optval}"
;;
-*) die_unknown $opt
;;
*) file_list[${#file_list[@]}]="$opt"
esac
done
outfile=${outfile:-/dev/stdout}
mkoutfile=${mkoutfile:-/dev/stdout}
case "${vs_ver:-8}" in
7) sln_vers="8.00"
sln_vers_str="Visual Studio .NET 2003"
;;
8) sln_vers="9.00"
sln_vers_str="Visual Studio 2005"
;;
esac
for f in "${file_list[@]}"; do
parse_project $f
done
cat >${outfile} <<EOF
Microsoft Visual Studio Solution File, Format Version $sln_vers${EOLDOS}
# $sln_vers_str${EOLDOS}
EOF
for proj in ${proj_list}; do
process_project $proj >>${outfile}
done
process_global >>${outfile}
process_makefile >${mkoutfile}

View File

@ -0,0 +1,755 @@
/*
* Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license and patent
* grant that can be found in the LICENSE file in the root of the source
* tree. All contributing project authors may be found in the AUTHORS
* file in the root of the source tree.
*/
#include <stdio.h>
#include <stdlib.h>
#include "vpx_config.h"
#if defined(_MSC_VER)
#include <io.h>
#include <share.h>
#include "vpx_ports/vpx_integer.h"
#else
#include <stdint.h>
#include <unistd.h>
#endif
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdarg.h>
typedef enum
{
OUTPUT_FMT_PLAIN,
OUTPUT_FMT_RVDS,
OUTPUT_FMT_GAS,
} output_fmt_t;
int log_msg(const char *fmt, ...)
{
int res;
va_list ap;
va_start(ap, fmt);
res = vfprintf(stderr, fmt, ap);
va_end(ap);
return res;
}
#if defined(__GNUC__) && __GNUC__
#if defined(__MACH__)
#include <mach-o/loader.h>
#include <mach-o/nlist.h>
int parse_macho(uint8_t *base_buf, size_t sz)
{
int i, j;
struct mach_header header;
uint8_t *buf = base_buf;
int base_data_section = 0;
memcpy(&header, buf, sizeof(struct mach_header));
buf += sizeof(struct mach_header);
if (header.magic != MH_MAGIC)
{
log_msg("Bad magic number for object file. 0x%x expected, 0x%x found.\n",
header.magic, MH_MAGIC);
goto bail;
}
if (header.cputype != CPU_TYPE_ARM)
{
log_msg("Bad cputype for object file. Currently only tested for CPU_TYPE_ARM.\n");
goto bail;
}
if (header.filetype != MH_OBJECT)
{
log_msg("Bad filetype for object file. Currently only tested for MH_OBJECT.\n");
goto bail;
}
for (i = 0; i < header.ncmds; i++)
{
struct load_command lc;
struct symtab_command sc;
struct segment_command seg_c;
memcpy(&lc, buf, sizeof(struct load_command));
if (lc.cmd == LC_SEGMENT)
{
uint8_t *seg_buf = buf;
struct section s;
memcpy(&seg_c, buf, sizeof(struct segment_command));
seg_buf += sizeof(struct segment_command);
for (j = 0; j < seg_c.nsects; j++)
{
memcpy(&s, seg_buf + (j * sizeof(struct section)), sizeof(struct section));
// Need to get this offset which is the start of the symbol table
// before matching the strings up with symbols.
base_data_section = s.offset;
}
}
else if (lc.cmd == LC_SYMTAB)
{
uint8_t *sym_buf = base_buf;
uint8_t *str_buf = base_buf;
if (base_data_section != 0)
{
memcpy(&sc, buf, sizeof(struct symtab_command));
if (sc.cmdsize != sizeof(struct symtab_command))
log_msg("Can't find symbol table!\n");
sym_buf += sc.symoff;
str_buf += sc.stroff;
for (j = 0; j < sc.nsyms; j++)
{
struct nlist nl;
int val;
memcpy(&nl, sym_buf + (j * sizeof(struct nlist)), sizeof(struct nlist));
val = *((int *)(base_buf + base_data_section + nl.n_value));
// Location of string is cacluated each time from the
// start of the string buffer. On darwin the symbols
// are prefixed by "_". On other platforms it is not
// so it needs to be removed. That is the reason for
// the +1.
printf("%-40s EQU %5d\n", str_buf + nl.n_un.n_strx + 1, val);
}
}
}
buf += lc.cmdsize;
}
return 0;
bail:
return 1;
}
int main(int argc, char **argv)
{
int fd;
char *f;
struct stat stat_buf;
uint8_t *file_buf;
int res;
if (argc < 2 || argc > 3)
{
fprintf(stderr, "Usage: %s [output format] <obj file>\n\n", argv[0]);
fprintf(stderr, " <obj file>\tMachO format object file to parse\n");
fprintf(stderr, "Output Formats:\n");
fprintf(stderr, " gas - compatible with GNU assembler\n");
fprintf(stderr, " rvds - compatible with armasm\n");
goto bail;
}
f = argv[2];
if (!((!strcmp(argv[1], "rvds")) || (!strcmp(argv[1], "gas"))))
f = argv[1];
fd = open(f, O_RDONLY);
if (fd < 0)
{
perror("Unable to open file");
goto bail;
}
if (fstat(fd, &stat_buf))
{
perror("stat");
goto bail;
}
file_buf = malloc(stat_buf.st_size);
if (!file_buf)
{
perror("malloc");
goto bail;
}
if (read(fd, file_buf, stat_buf.st_size) != stat_buf.st_size)
{
perror("read");
goto bail;
}
if (close(fd))
{
perror("close");
goto bail;
}
res = parse_macho(file_buf, stat_buf.st_size);
free(file_buf);
if (!res)
return EXIT_SUCCESS;
bail:
return EXIT_FAILURE;
}
#else
#include "elf.h"
#define COPY_STRUCT(dst, buf, ofst, sz) do {\
if(ofst + sizeof((*(dst))) > sz) goto bail;\
memcpy(dst, buf+ofst, sizeof((*(dst))));\
} while(0)
#define ENDIAN_ASSIGN(val, memb) do {\
if(!elf->le_data) {log_msg("Big Endian data not supported yet!\n");goto bail;}\
(val) = (memb);\
} while(0)
#define ENDIAN_ASSIGN_IN_PLACE(memb) do {\
ENDIAN_ASSIGN(memb, memb);\
} while(0)
typedef struct
{
uint8_t *buf; /* Buffer containing ELF data */
size_t sz; /* Buffer size */
int le_data; /* Data is little-endian */
Elf32_Ehdr hdr;
} elf_obj_t;
int parse_elf32_header(elf_obj_t *elf)
{
int res;
/* Verify ELF32 header */
COPY_STRUCT(&elf->hdr, elf->buf, 0, elf->sz);
res = elf->hdr.e_ident[EI_MAG0] == ELFMAG0;
res &= elf->hdr.e_ident[EI_MAG1] == ELFMAG1;
res &= elf->hdr.e_ident[EI_MAG2] == ELFMAG2;
res &= elf->hdr.e_ident[EI_MAG3] == ELFMAG3;
res &= elf->hdr.e_ident[EI_CLASS] == ELFCLASS32;
res &= elf->hdr.e_ident[EI_DATA] == ELFDATA2LSB
|| elf->hdr.e_ident[EI_DATA] == ELFDATA2MSB;
if (!res) goto bail;
elf->le_data = elf->hdr.e_ident[EI_DATA] == ELFDATA2LSB;
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_type);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_machine);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_version);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_entry);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_phoff);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_shoff);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_flags);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_ehsize);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_phentsize);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_phnum);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_shentsize);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_shnum);
ENDIAN_ASSIGN_IN_PLACE(elf->hdr.e_shstrndx);
return 0;
bail:
return 1;
}
int parse_elf32_section(elf_obj_t *elf, int idx, Elf32_Shdr *hdr)
{
if (idx >= elf->hdr.e_shnum)
goto bail;
COPY_STRUCT(hdr, elf->buf, elf->hdr.e_shoff + idx * elf->hdr.e_shentsize,
elf->sz);
ENDIAN_ASSIGN_IN_PLACE(hdr->sh_name);
ENDIAN_ASSIGN_IN_PLACE(hdr->sh_type);
ENDIAN_ASSIGN_IN_PLACE(hdr->sh_flags);
ENDIAN_ASSIGN_IN_PLACE(hdr->sh_addr);
ENDIAN_ASSIGN_IN_PLACE(hdr->sh_offset);
ENDIAN_ASSIGN_IN_PLACE(hdr->sh_size);
ENDIAN_ASSIGN_IN_PLACE(hdr->sh_link);
ENDIAN_ASSIGN_IN_PLACE(hdr->sh_info);
ENDIAN_ASSIGN_IN_PLACE(hdr->sh_addralign);
ENDIAN_ASSIGN_IN_PLACE(hdr->sh_entsize);
return 0;
bail:
return 1;
}
char *parse_elf32_string_table(elf_obj_t *elf, int s_idx, int idx)
{
Elf32_Shdr shdr;
if (parse_elf32_section(elf, s_idx, &shdr))
{
log_msg("Failed to parse ELF string table: section %d, index %d\n",
s_idx, idx);
return "";
}
return (char *)(elf->buf + shdr.sh_offset + idx);
}
int parse_elf32_symbol(elf_obj_t *elf, unsigned int ofst, Elf32_Sym *sym)
{
COPY_STRUCT(sym, elf->buf, ofst, elf->sz);
ENDIAN_ASSIGN_IN_PLACE(sym->st_name);
ENDIAN_ASSIGN_IN_PLACE(sym->st_value);
ENDIAN_ASSIGN_IN_PLACE(sym->st_size);
ENDIAN_ASSIGN_IN_PLACE(sym->st_info);
ENDIAN_ASSIGN_IN_PLACE(sym->st_other);
ENDIAN_ASSIGN_IN_PLACE(sym->st_shndx);
return 0;
bail:
return 1;
}
int parse_elf32(uint8_t *buf, size_t sz, output_fmt_t mode)
{
elf_obj_t elf;
Elf32_Shdr shdr;
unsigned int ofst;
int i;
Elf32_Off strtab_off; /* save String Table offset for later use */
memset(&elf, 0, sizeof(elf));
elf.buf = buf;
elf.sz = sz;
/* Parse Header */
if (parse_elf32_header(&elf))
{
log_msg("Parse error: File does not appear to be valid ELF32\n");
return 1;
}
for (i = 0; i < elf.hdr.e_shnum; i++)
{
parse_elf32_section(&elf, i, &shdr);
if (shdr.sh_type == SHT_STRTAB)
{
char strtsb_name[128];
strcpy(strtsb_name, (char *)(elf.buf + shdr.sh_offset + shdr.sh_name));
if (!(strcmp(strtsb_name, ".shstrtab")))
{
log_msg("found section: %s\n", strtsb_name);
strtab_off = shdr.sh_offset;
break;
}
}
}
/* Parse all Symbol Tables */
for (i = 0; i < elf.hdr.e_shnum; i++)
{
parse_elf32_section(&elf, i, &shdr);
if (shdr.sh_type == SHT_SYMTAB)
{
for (ofst = shdr.sh_offset;
ofst < shdr.sh_offset + shdr.sh_size;
ofst += shdr.sh_entsize)
{
Elf32_Sym sym;
parse_elf32_symbol(&elf, ofst, &sym);
/* For all OBJECTS (data objects), extract the value from the
* proper data segment.
*/
if (ELF32_ST_TYPE(sym.st_info) == STT_OBJECT && sym.st_name)
log_msg("found data object %s\n",
parse_elf32_string_table(&elf,
shdr.sh_link,
sym.st_name));
if (ELF32_ST_TYPE(sym.st_info) == STT_OBJECT
&& sym.st_size == 4)
{
Elf32_Shdr dhdr;
int32_t val;
char section_name[128];
parse_elf32_section(&elf, sym.st_shndx, &dhdr);
/* For explanition - refer to _MSC_VER version of code */
strcpy(section_name, (char *)(elf.buf + strtab_off + dhdr.sh_name));
log_msg("Section_name: %s, Section_type: %d\n", section_name, dhdr.sh_type);
if (!(strcmp(section_name, ".bss")))
{
val = 0;
}
else
{
memcpy(&val,
elf.buf + dhdr.sh_offset + sym.st_value,
sizeof(val));
}
if (!elf.le_data)
{
log_msg("Big Endian data not supported yet!\n");
goto bail;
}\
switch (mode)
{
case OUTPUT_FMT_RVDS:
printf("%-40s EQU %5d\n",
parse_elf32_string_table(&elf,
shdr.sh_link,
sym.st_name),
val);
break;
case OUTPUT_FMT_GAS:
printf(".equ %-40s, %5d\n",
parse_elf32_string_table(&elf,
shdr.sh_link,
sym.st_name),
val);
break;
default:
printf("%s = %d\n",
parse_elf32_string_table(&elf,
shdr.sh_link,
sym.st_name),
val);
}
}
}
}
}
if (mode == OUTPUT_FMT_RVDS)
printf(" END\n");
return 0;
bail:
log_msg("Parse error: File does not appear to be valid ELF32\n");
return 1;
}
int main(int argc, char **argv)
{
int fd;
output_fmt_t mode;
char *f;
struct stat stat_buf;
uint8_t *file_buf;
int res;
if (argc < 2 || argc > 3)
{
fprintf(stderr, "Usage: %s [output format] <obj file>\n\n", argv[0]);
fprintf(stderr, " <obj file>\tELF format object file to parse\n");
fprintf(stderr, "Output Formats:\n");
fprintf(stderr, " gas - compatible with GNU assembler\n");
fprintf(stderr, " rvds - compatible with armasm\n");
goto bail;
}
f = argv[2];
if (!strcmp(argv[1], "rvds"))
mode = OUTPUT_FMT_RVDS;
else if (!strcmp(argv[1], "gas"))
mode = OUTPUT_FMT_GAS;
else
f = argv[1];
fd = open(f, O_RDONLY);
if (fd < 0)
{
perror("Unable to open file");
goto bail;
}
if (fstat(fd, &stat_buf))
{
perror("stat");
goto bail;
}
file_buf = malloc(stat_buf.st_size);
if (!file_buf)
{
perror("malloc");
goto bail;
}
if (read(fd, file_buf, stat_buf.st_size) != stat_buf.st_size)
{
perror("read");
goto bail;
}
if (close(fd))
{
perror("close");
goto bail;
}
res = parse_elf32(file_buf, stat_buf.st_size, mode);
//res = parse_coff(file_buf, stat_buf.st_size);
free(file_buf);
if (!res)
return EXIT_SUCCESS;
bail:
return EXIT_FAILURE;
}
#endif
#endif
#if defined(_MSC_VER)
/* See "Microsoft Portable Executable and Common Object File Format Specification"
for reference.
*/
#define get_le32(x) ((*(x)) | (*(x+1)) << 8 |(*(x+2)) << 16 | (*(x+3)) << 24 )
#define get_le16(x) ((*(x)) | (*(x+1)) << 8)
int parse_coff(unsigned __int8 *buf, size_t sz)
{
unsigned int nsections, symtab_ptr, symtab_sz, strtab_ptr;
unsigned int sectionrawdata_ptr;
unsigned int i;
unsigned __int8 *ptr;
unsigned __int32 symoffset;
FILE *fp;
char **sectionlist; //this array holds all section names in their correct order.
//it is used to check if the symbol is in .bss or .data section.
nsections = get_le16(buf + 2);
symtab_ptr = get_le32(buf + 8);
symtab_sz = get_le32(buf + 12);
strtab_ptr = symtab_ptr + symtab_sz * 18;
if (nsections > 96)
goto bail;
sectionlist = malloc(nsections * sizeof * sectionlist);
//log_msg("COFF: Found %u symbols in %u sections.\n", symtab_sz, nsections);
/*
The size of optional header is always zero for an obj file. So, the section header
follows the file header immediately.
*/
ptr = buf + 20; //section header
for (i = 0; i < nsections; i++)
{
char sectionname[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
strncpy(sectionname, ptr, 8);
//log_msg("COFF: Parsing section %s\n",sectionname);
sectionlist[i] = malloc(strlen(sectionname) + 1);
strcpy(sectionlist[i], sectionname);
if (!strcmp(sectionname, ".data")) sectionrawdata_ptr = get_le32(ptr + 20);
ptr += 40;
}
//log_msg("COFF: Symbol table at offset %u\n", symtab_ptr);
//log_msg("COFF: raw data pointer ofset for section .data is %u\n", sectionrawdata_ptr);
fp = fopen("vpx_asm_offsets.asm", "w");
if (fp == NULL)
{
perror("open file");
goto bail;
}
/* The compiler puts the data with non-zero offset in .data section, but puts the data with
zero offset in .bss section. So, if the data in in .bss section, set offset=0.
Note from Wiki: In an object module compiled from C, the bss section contains
the local variables (but not functions) that were declared with the static keyword,
except for those with non-zero initial values. (In C, static variables are initialized
to zero by default.) It also contains the non-local (both extern and static) variables
that are also initialized to zero (either explicitly or by default).
*/
//move to symbol table
/* COFF symbol table:
offset field
0 Name(*)
8 Value
12 SectionNumber
14 Type
16 StorageClass
17 NumberOfAuxSymbols
*/
ptr = buf + symtab_ptr;
for (i = 0; i < symtab_sz; i++)
{
__int16 section = get_le16(ptr + 12); //section number
if (section > 0 && ptr[16] == 2)
{
//if(section > 0 && ptr[16] == 3 && get_le32(ptr+8)) {
if (get_le32(ptr))
{
char name[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
strncpy(name, ptr, 8);
//log_msg("COFF: Parsing symbol %s\n",name);
fprintf(fp, "%-40s EQU ", name);
}
else
{
//log_msg("COFF: Parsing symbol %s\n",
// buf + strtab_ptr + get_le32(ptr+4));
fprintf(fp, "%-40s EQU ", buf + strtab_ptr + get_le32(ptr + 4));
}
if (!(strcmp(sectionlist[section-1], ".bss")))
{
symoffset = 0;
}
else
{
symoffset = get_le32(buf + sectionrawdata_ptr + get_le32(ptr + 8));
}
//log_msg(" Section: %d\n",section);
//log_msg(" Class: %d\n",ptr[16]);
//log_msg(" Address: %u\n",get_le32(ptr+8));
//log_msg(" Offset: %u\n", symoffset);
fprintf(fp, "%5d\n", symoffset);
}
ptr += 18;
}
fprintf(fp, " END\n");
fclose(fp);
for (i = 0; i < nsections; i++)
{
free(sectionlist[i]);
}
free(sectionlist);
return 0;
bail:
for (i = 0; i < nsections; i++)
{
free(sectionlist[i]);
}
free(sectionlist);
return 1;
}
int main(int argc, char **argv)
{
int fd;
output_fmt_t mode;
const char *f;
struct _stat stat_buf;
unsigned __int8 *file_buf;
int res;
if (argc < 2 || argc > 3)
{
fprintf(stderr, "Usage: %s [output format] <obj file>\n\n", argv[0]);
fprintf(stderr, " <obj file>\tELF format object file to parse\n");
fprintf(stderr, "Output Formats:\n");
fprintf(stderr, " gas - compatible with GNU assembler\n");
fprintf(stderr, " rvds - compatible with armasm\n");
goto bail;
}
f = argv[2];
if (!strcmp(argv[1], "rvds"))
mode = OUTPUT_FMT_RVDS;
else if (!strcmp(argv[1], "gas"))
mode = OUTPUT_FMT_GAS;
else
f = argv[1];
if (_sopen_s(&fd, f, _O_BINARY, _SH_DENYNO, _S_IREAD | _S_IWRITE))
{
perror("Unable to open file");
goto bail;
}
if (_fstat(fd, &stat_buf))
{
perror("stat");
goto bail;
}
file_buf = malloc(stat_buf.st_size);
if (!file_buf)
{
perror("malloc");
goto bail;
}
if (_read(fd, file_buf, stat_buf.st_size) != stat_buf.st_size)
{
perror("read");
goto bail;
}
if (_close(fd))
{
perror("close");
goto bail;
}
res = parse_coff(file_buf, stat_buf.st_size);
free(file_buf);
if (!res)
return EXIT_SUCCESS;
bail:
return EXIT_FAILURE;
}
#endif

75
build/make/version.sh Executable file
View File

@ -0,0 +1,75 @@
#!/bin/bash
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
for opt in "$@"; do
optval="${opt#*=}"
case "$opt" in
--bare) bare=true ;;
*) break ;;
esac
shift
done
source_path=${1:-.}
out_file=${2}
id=${3:-VERSION_STRING}
git_version_id=""
if [ -d ${source_path}/.git ]; then
# Source Path is a git working copy. Check for local modifications.
export GIT_DIR=${source_path}/.git
git_version_id=`git describe --match=v[0-9]* 2>/dev/null`
fi
changelog_version=""
for p in "${source_path}" "${source_path}/.."; do
if [ -z "$git_version_id" -a -f "${p}/CHANGELOG" ]; then
changelog_version=`head -n1 "${p}/CHANGELOG" | awk '{print $2}'`
changelog_version="${changelog_version}"
break
fi
done
version_str="${changelog_version}${git_version_id}"
bare_version=${version_str#v}
major_version=${bare_version%%.*}
bare_version=${bare_version#*.}
minor_version=${bare_version%%.*}
bare_version=${bare_version#*.}
patch_version=${bare_version%%-*}
bare_version=${bare_version#${patch_version}}
extra_version=${bare_version##-}
#since they'll be used as integers below make sure they are or force to 0
for v in major_version minor_version patch_version; do
if eval echo \$$v |grep -E -q '[^[:digit:]]'; then
eval $v=0
fi
done
if [ ${bare} ]; then
echo "${changelog_version}${git_version_id}" > $$.tmp
else
cat<<EOF>$$.tmp
#define VERSION_MAJOR $major_version
#define VERSION_MINOR $minor_version
#define VERSION_PATCH $patch_version
#define VERSION_EXTRA "$extra_version"
#define VERSION_PACKED ((VERSION_MAJOR<<16)|(VERSION_MINOR<<8)|(VERSION_PATCH))
#define ${id}_NOSP "${version_str}"
#define ${id} " ${version_str}"
EOF
fi
if [ -n "$out_file" ]; then
diff $$.tmp ${out_file} >/dev/null 2>&1 || cat $$.tmp > ${out_file}
else
cat $$.tmp
fi
rm $$.tmp

515
configure vendored Executable file
View File

@ -0,0 +1,515 @@
#!/bin/bash
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
#source_path="`dirname \"$0\"`"
source_path=${0%/*}
. "${source_path}/build/make/configure.sh"
show_help(){
show_help_pre
cat << EOF
Advanced options:
${toggle_libs} don't build libraries
${toggle_examples} don't build examples
--libc=PATH path to alternate libc
${toggle_fast_unaligned} don't use unaligned accesses, even when
supported by hardware [auto]
${toggle_codec_srcs} in/exclude codec library source code
${toggle_debug_libs} in/exclude debug version of libraries
${toggle_eval_limit} enable limited evaluation build
${toggle_md5} support for output of checksum data
${toggle_static_msvcrt} use static MSVCRT (VS builds only)
${toggle_vp8} VP8 codec support
${toggle_psnr} output of PSNR data, if supported (encoders)
${toggle_mem_tracker} track memory usage
${toggle_eval_limit} decoder limitted to 500 frames
${toggle_postproc} postprocessing
${toggle_multithread} multithreaded encoding and decoding.
${toggle_spatial_resampling} spatial sampling (scaling) support
${toggle_realtime_only} enable this option while building for real-time encoding
${toggle_runtime_cpu_detect} runtime cpu detection
Codecs:
Codecs can be selectively enabled or disabled individually, or by family:
--disable-<codec>
is equivalent to:
--disable-<codec>-encoder
--disable-<codec>-decoder
Codecs available in this distribution:
EOF
#restore editor state '
local family;
local last_family;
local c;
local str;
for c in ${CODECS}; do
family=${c%_*}
if [ "${family}" != "${last_family}" ]; then
[ -z "${str}" ] || echo "${str}"
str="$(printf ' %10s:' ${family})"
fi
str="${str} $(printf '%10s' ${c#*_})"
last_family=${family}
done
echo "${str}"
show_help_post
}
##
## BEGIN APPLICATION SPECIFIC CONFIGURATION
##
# all_platforms is a list of all supported target platforms. Maintain
# alphabetically by architecture, generic-gnu last.
all_platforms="${all_platforms} armv5te-linux-rvct"
all_platforms="${all_platforms} armv5te-linux-gcc"
all_platforms="${all_platforms} armv5te-symbian-gcc"
all_platforms="${all_platforms} armv5te-wince-vs8"
all_platforms="${all_platforms} armv6-darwin-gcc"
all_platforms="${all_platforms} armv6-linux-rvct"
all_platforms="${all_platforms} armv6-linux-gcc"
all_platforms="${all_platforms} armv6-symbian-gcc"
all_platforms="${all_platforms} armv6-wince-vs8"
all_platforms="${all_platforms} iwmmxt-linux-rvct"
all_platforms="${all_platforms} iwmmxt-linux-gcc"
all_platforms="${all_platforms} iwmmxt-wince-vs8"
all_platforms="${all_platforms} iwmmxt2-linux-rvct"
all_platforms="${all_platforms} iwmmxt2-linux-gcc"
all_platforms="${all_platforms} iwmmxt2-wince-vs8"
all_platforms="${all_platforms} armv7-darwin-gcc" #neon Cortex-A8
all_platforms="${all_platforms} armv7-linux-rvct" #neon Cortex-A8
all_platforms="${all_platforms} armv7-linux-gcc" #neon Cortex-A8
all_platforms="${all_platforms} mips32-linux-gcc"
all_platforms="${all_platforms} ppc32-darwin8-gcc"
all_platforms="${all_platforms} ppc32-darwin9-gcc"
all_platforms="${all_platforms} ppc64-darwin8-gcc"
all_platforms="${all_platforms} ppc64-darwin9-gcc"
all_platforms="${all_platforms} ppc64-linux-gcc"
all_platforms="${all_platforms} x86-darwin8-gcc"
all_platforms="${all_platforms} x86-darwin8-icc"
all_platforms="${all_platforms} x86-darwin9-gcc"
all_platforms="${all_platforms} x86-darwin9-icc"
all_platforms="${all_platforms} x86-linux-gcc"
all_platforms="${all_platforms} x86-linux-icc"
all_platforms="${all_platforms} x86-solaris-gcc"
all_platforms="${all_platforms} x86-win32-gcc"
all_platforms="${all_platforms} x86-win32-vs7"
all_platforms="${all_platforms} x86-win32-vs8"
all_platforms="${all_platforms} x86_64-darwin9-gcc"
all_platforms="${all_platforms} x86_64-linux-gcc"
all_platforms="${all_platforms} x86_64-solaris-gcc"
all_platforms="${all_platforms} x86_64-win64-vs8"
all_platforms="${all_platforms} universal-darwin8-gcc"
all_platforms="${all_platforms} universal-darwin9-gcc"
all_platforms="${all_platforms} generic-gnu"
# all_targets is a list of all targets that can be configured
# note that these should be in dependency order for now.
all_targets="libs examples docs"
# all targets available are enabled, by default.
for t in ${all_targets}; do
[ -f ${source_path}/${t}.mk ] && enable ${t}
done
# check installed doxygen version
doxy_version=$(doxygen --version 2>/dev/null)
doxy_major=${doxy_version%%.*}
if [ ${doxy_major:-0} -ge 1 ]; then
doxy_version=${doxy_version#*.}
doxy_minor=${doxy_version%%.*}
doxy_patch=${doxy_version##*.}
[ $doxy_major -gt 1 ] && enable doxygen
[ $doxy_minor -gt 5 ] && enable doxygen
[ $doxy_minor -eq 5 ] && [ $doxy_patch -ge 3 ] && enable doxygen
fi
# install everything, by default
enabled doxygen && php -v >/dev/null 2>&1 && enable install_docs
enable install_bins
enable install_libs
enable install_srcs
enable optimizations
enable fast_unaligned #allow unaligned accesses, if supported by hw
enable md5
enable spatial_resampling
enable multithread
[ -d ${source_path}/../include ] && enable alt_tree_layout
for d in vp8; do
[ -d ${source_path}/${d} ] && disable alt_tree_layout;
done
if ! enabled alt_tree_layout; then
# development environment
[ -d ${source_path}/vp8 ] && CODECS="${CODECS} vp8_encoder vp8_decoder"
else
# customer environment
[ -f ${source_path}/../include/vp8cx.h ] && CODECS="${CODECS} vp8_encoder"
[ -f ${source_path}/../include/vp8dx.h ] && CODECS="${CODECS} vp8_decoder"
[ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt
fi
CODECS="$(echo ${CODECS} | tr ' ' '\n')"
CODEC_FAMILIES="$(for c in ${CODECS}; do echo ${c%_*}; done | sort | uniq)"
ARCH_LIST="
arm
mips
x86
x86_64
ppc32
ppc64
"
ARCH_EXT_LIST="
armv5te
armv6
armv7
iwmmxt
iwmmxt2
mips32
mmx
sse
sse2
sse3
ssse3
altivec
"
HAVE_LIST="
${ARCH_EXT_LIST}
vpx_ports
stdint_h
alt_tree_layout
pthread_h
sys_mman_h
"
CONFIG_LIST="
external_build
install_docs
install_bins
install_libs
install_srcs
debug
gprof
gcov
rvct
gcc
msvs
pic
big_endian
codec_srcs
debug_libs
fast_unaligned
mem_manager
mem_tracker
mem_checks
md5
dequant_tokens
dc_recon
new_tokens
eval_limit
runtime_cpu_detect
postproc
postproc_generic
multithread
psnr
${CODECS}
${CODEC_FAMILIES}
encoders
decoders
static_msvcrt
spatial_resampling
realtime_only
"
CMDLINE_SELECT="
extra_warnings
werror
install_docs
install_bins
install_libs
install_srcs
debug
gprof
gcov
pic
optimizations
ccache
runtime_cpu_detect
libs
examples
libc
fast_unaligned
codec_srcs
debug_libs
md5
dequant_tokens
dc_recon
new_tokens
eval_limit
postproc
postproc_generic
multithread
psnr
${CODECS}
${CODEC_FAMILIES}
static_msvcrt
mem_tracker
spatial_resampling
realtime_only
"
process_cmdline() {
for opt do
optval="${opt#*=}"
case "$opt" in
--disable-codecs) for c in ${CODECS}; do disable $c; done ;;
*) process_common_cmdline $opt
;;
esac
done
}
post_process_cmdline() {
local c
# If the codec family is disabled, disable all components of that family.
# If the codec family is enabled, enable all components of that family.
log_echo "Configuring selected codecs"
for c in ${CODECS}; do
disabled ${c%%_*} && disable ${c}
enabled ${c%%_*} && enable ${c}
done
# Enable all detected codecs, if they haven't been disabled
for c in ${CODECS}; do soft_enable $c; done
# Enable the codec family if any component of that family is enabled
for c in ${CODECS}; do
enabled $c && enable ${c%_*}
done
# Set the {en,de}coders variable if any algorithm in that class is enabled
for c in ${CODECS}; do
enabled ${c} && enable ${c##*_}s
done
}
process_targets() {
enabled child || write_common_config_banner
enabled universal || write_common_target_config_h ${BUILD_PFX}vpx_config.h
# TODO: add host tools target (obj_int_extract, etc)
# For fat binaries, call configure recursively to configure for each
# binary architecture to be included.
if enabled universal; then
# Call configure (ourselves) for each subarchitecture
for arch in $fat_bin_archs; do
BUILD_PFX=${arch}/ toolchain=${arch} $self --child $cmdline_args || exit $?
done
fi
# The write_common_config (config.mk) logic is deferred until after the
# recursive calls to configure complete, becuase we want our universal
# targets to be executed last.
write_common_config_targets
enabled universal && echo "FAT_ARCHS=${fat_bin_archs}" >> config.mk
# Calculate the default distribution name, based on the enabled features
local cf
local DIST_DIR=vpx
for cf in $CODEC_FAMILIES; do
if enabled ${cf}_encoder && enabled ${cf}_decoder; then
DIST_DIR="${DIST_DIR}-${cf}"
elif enabled ${cf}_encoder; then
DIST_DIR="${DIST_DIR}-${cf}cx"
elif enabled ${cf}_decoder; then
DIST_DIR="${DIST_DIR}-${cf}dx"
fi
done
enabled debug_libs && DIST_DIR="${DIST_DIR}-debug"
enabled codec_srcs && DIST_DIR="${DIST_DIR}-src"
! enabled postproc && DIST_DIR="${DIST_DIR}-nopost"
! enabled multithread && DIST_DIR="${DIST_DIR}-nomt"
enabled eval_limit && DIST_DIR="${DIST_DIR}-eval"
! enabled install_docs && DIST_DIR="${DIST_DIR}-nodocs"
DIST_DIR="${DIST_DIR}-${tgt_isa}-${tgt_os}"
case "${tgt_os}" in
win*) enabled static_msvcrt && DIST_DIR="${DIST_DIR}mt" || DIST_DIR="${DIST_DIR}md"
DIST_DIR="${DIST_DIR}-${tgt_cc}"
;;
esac
if [ -f "${source_path}/build/make/version.sh" ]; then
local ver=`"$source_path/build/make/version.sh" --bare $source_path`
DIST_DIR="${DIST_DIR}-${ver}"
fi
enabled child || echo "DIST_DIR?=${DIST_DIR}" >> config.mk
enabled child || echo "CONFIGURE_ARGS?=${CONFIGURE_ARGS}" >> config.mk
#
# Write makefiles for all enabled targets
#
for tgt in libs examples docs solution; do
local tgt_fn="$tgt-$toolchain.mk"
if enabled $tgt; then
echo "Creating makefiles for ${toolchain} ${tgt}"
write_common_target_config_mk $tgt_fn ${BUILD_PFX}vpx_config.h
#write_${tgt}_config
fi
done
}
process_detect() {
if [ -z "$CC" ]; then
echo "Bypassing toolchain for environment detection."
enable external_build
check_header() {
log fake_check_header "$@"
header=$1
shift
var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
disable $var
case $header in
stdio.h)
true;
;;
*)
local result=false
for d in "$@"; do
[ -f "${d##-I}/$header" ] && result=true && break
done
${result:-true}
esac && enable $var
}
check_ld() {
true
}
fi
check_header stdio.h || die "Unable to invoke compiler: ${CC} ${CFLAGS}"
check_ld <<EOF || die "Toolchain is unable to link executables"
int main(void) {return 0;}
EOF
# check system headers
check_header stdint.h
check_header pthread.h
check_header sys/mman.h
check_header vpx_ports/vpx_integer.h -I${source_path} && enable vpx_ports
}
process_toolchain() {
process_common_toolchain
# Handle universal binaries for this architecture
case $toolchain in
universal-darwin*)
local darwin_ver=${tgt_os##darwin}
fat_bin_archs="$fat_bin_archs ppc32-${tgt_os}-gcc"
# Intel
fat_bin_archs="$fat_bin_archs x86-${tgt_os}-${tgt_cc}"
if [ $darwin_ver -gt 8 ]; then
fat_bin_archs="$fat_bin_archs x86_64-${tgt_os}-${tgt_cc}"
fi
;;
esac
# Enable some useful compiler flags
if enabled gcc; then
enabled werror && check_add_cflags -Werror
check_add_cflags -Wall
check_add_cflags -Wdeclaration-after-statement
check_add_cflags -Wdisabled-optimization
check_add_cflags -Wpointer-arith
check_add_cflags -Wtype-limits
check_add_cflags -Wcast-qual
enabled extra_warnings || check_add_cflags -Wno-unused
fi
if enabled icc; then
enabled werror && check_add_cflags -Werror
check_add_cflags -Wall
check_add_cflags -Wpointer-arith
# ICC has a number of floating point optimizations that we disable
# in favor of deterministic output WRT to other compilers
add_cflags -fp-model precise
fi
# Enable extra, harmless warnings. These might provide additional insight
# to what the compiler is doing and why, but in general, but they shouldn't
# be treated as fatal, even if we're treating warnings as errors.
GCC_EXTRA_WARNINGS="
-Wdisabled-optimization
-Winline
"
enabled gcc && EXTRA_WARNINGS="${GCC_EXTRA_WARNINGS}"
RVCT_EXTRA_WARNINGS="
--remarks
"
enabled rvct && EXTRA_WARNINGS="${RVCT_EXTRA_WARNINGS}"
if enabled extra_warnings; then
for w in ${EXTRA_WARNINGS}; do
check_add_cflags ${w}
enabled gcc && enabled werror && check_add_cflags -Wno-error=${w}
done
fi
# ccache only really works on gcc toolchains
enabled gcc || soft_disable ccache
if enabled mips; then
enable dequant_tokens
enable dc_recon
fi
# Enable the postbuild target if building for visual studio.
case "$tgt_cc" in
vs*) enable msvs
enable solution
vs_version=${tgt_cc##vs}
all_targets="${all_targets} solution"
INLINE=__inline
FORCEINLINE=__forceinline
;;
esac
# Other toolchain specific defaults
case $toolchain in x86*|ppc*|universal*) soft_enable postproc;; esac
}
##
## END APPLICATION SPECIFIC CONFIGURATION
##
CONFIGURE_ARGS="$@"
process "$@"
cat <<EOF > ${BUILD_PFX}vpx_config.c
static const char* const cfg = "$CONFIGURE_ARGS";
const char *vpx_codec_build_config(void) {return cfg;}
EOF

54
docs.mk Normal file
View File

@ -0,0 +1,54 @@
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
INSTALL_MAPS += docs/% docs/%
INSTALL_MAPS += src/% %
INSTALL_MAPS += % %
# Static documentation authored in doxygen
CODEC_DOX := mainpage.dox \
keywords.dox \
usage.dox \
usage_cx.dox \
usage_dx.dox \
# Other doxy files sourced in Markdown
TXT_DOX-$(CONFIG_VP8) += vp8_api1_migration.dox
vp8_api1_migration.dox.DESC = VP8 API 1.x Migration
TXT_DOX = $(call enabled,TXT_DOX)
%.dox: %.txt
@echo " [DOXY] $@"
@$(SRC_PATH_BARE)/examples/gen_example_doxy.php \
$(@:.dox=) "$($@.DESC)" > $@ < $<
EXAMPLE_PATH += $(SRC_PATH_BARE) #for CHANGELOG, README, etc
doxyfile: libs.doxy_template libs.doxy examples.doxy
@echo " [CREATE] $@"
@cat $^ > $@
@echo "STRIP_FROM_PATH += $(SRC_PATH_BARE) $(BUILD_ROOT)" >> $@
@echo "INPUT += $(addprefix $(SRC_PATH_BARE)/,$(CODEC_DOX))" >> $@;
@echo "INPUT += $(TXT_DOX)" >> $@;
@echo "EXAMPLE_PATH += $(EXAMPLE_PATH)" >> $@
CLEAN-OBJS += doxyfile $(wildcard docs/html/*)
docs/html/index.html: doxyfile $(CODEC_DOX) $(TXT_DOX)
@echo " [DOXYGEN] $<"
@doxygen $<
DOCS-yes += docs/html/index.html
INSTALL-DOCS-yes = $(wildcard docs/html/*)
INSTALL-DOCS-$(CONFIG_CODEC_SRCS) += $(addprefix src/,$(CODEC_DOX))
INSTALL-DOCS-$(CONFIG_CODEC_SRCS) += src/libs.doxy_template
INSTALL-DOCS-yes += CHANGELOG
INSTALL-DOCS-yes += README

213
example_xma.c Normal file
View File

@ -0,0 +1,213 @@
/*
* Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license and patent
* grant that can be found in the LICENSE file in the root of the source
* tree. All contributing project authors may be found in the AUTHORS
* file in the root of the source tree.
*/
/* This is a simple program showing how to initialize the decoder in XMA mode */
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#define VPX_CODEC_DISABLE_COMPAT 1
#include "vpx_config.h"
#include "vpx_decoder.h"
#include "vpx_integer.h"
#if CONFIG_VP8_DECODER
#include "vp8dx.h"
#endif
static char *exec_name;
static int verbose = 0;
static const struct
{
const char *name;
const vpx_codec_iface_t *iface;
} ifaces[] =
{
#if CONFIG_VP8_DECODER
{"vp8", &vpx_codec_vp8_dx_algo},
#endif
};
static void usage_exit(void)
{
int i;
printf("Usage: %s <options>\n\n"
"Options:\n"
"\t--codec <name>\tCodec to use (default=%s)\n"
"\t-h <height>\tHeight of the simulated video frame, in pixels\n"
"\t-w <width> \tWidth of the simulated video frame, in pixels\n"
"\t-v \tVerbose mode (show individual segment sizes)\n"
"\t--help \tShow this message\n"
"\n"
"Included decoders:\n"
"\n",
exec_name,
ifaces[0].name);
for (i = 0; i < sizeof(ifaces) / sizeof(ifaces[0]); i++)
printf(" %-6s - %s\n",
ifaces[i].name,
vpx_codec_iface_name(ifaces[i].iface));
exit(EXIT_FAILURE);
}
static void usage_error(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
printf("\n");
usage_exit();
}
void my_mem_dtor(vpx_codec_mmap_t *mmap)
{
if (verbose)
printf("freeing segment %d\n", mmap->id);
free(mmap->priv);
}
int main(int argc, char **argv)
{
vpx_codec_ctx_t decoder;
vpx_codec_iface_t *iface = ifaces[0].iface;
vpx_codec_iter_t iter;
vpx_codec_dec_cfg_t cfg;
vpx_codec_err_t res = VPX_CODEC_OK;
unsigned int alloc_sz = 0;
unsigned int w = 352;
unsigned int h = 288;
int i;
exec_name = argv[0];
for (i = 1; i < argc; i++)
{
if (!strcmp(argv[i], "--codec"))
{
if (i + 1 < argc)
{
int j, k = -1;
i++;
for (j = 0; j < sizeof(ifaces) / sizeof(ifaces[0]); j++)
if (!strcmp(ifaces[j].name, argv[i]))
k = j;
if (k >= 0)
iface = ifaces[k].iface;
else
usage_error("Error: Unrecognized argument (%s) to --codec\n",
argv[i]);
}
else
usage_error("Error: Option --codec requires argument.\n");
}
else if (!strcmp(argv[i], "-v"))
verbose = 1;
else if (!strcmp(argv[i], "-h"))
if (i + 1 < argc)
{
h = atoi(argv[++i]);
}
else
usage_error("Error: Option -h requires argument.\n");
else if (!strcmp(argv[i], "-w"))
if (i + 1 < argc)
{
w = atoi(argv[++i]);
}
else
usage_error("Error: Option -w requires argument.\n");
else if (!strcmp(argv[i], "--help"))
usage_exit();
else
usage_error("Error: Unrecognized option %s\n\n", argv[i]);
}
if (argc == 1)
printf("Using built-in defaults. For options, rerun with --help\n\n");
/* XMA mode is not supported on all decoders! */
if (!(vpx_codec_get_caps(iface) & VPX_CODEC_CAP_XMA))
{
printf("%s does not support XMA mode!\n", vpx_codec_iface_name(iface));
return EXIT_FAILURE;
}
/* The codec knows how much memory to allocate based on the size of the
* encoded frames. This data can be parsed from the bitstream with
* vpx_codec_peek_stream_info() if a bitstream is available. Otherwise,
* a fixed size can be used that will be the upper limit on the frame
* size the decoder can decode.
*/
cfg.w = w;
cfg.h = h;
/* Initialize the decoder in XMA mode. */
if (vpx_codec_dec_init(&decoder, iface, &cfg, VPX_CODEC_USE_XMA))
{
printf("Failed to initialize decoder in XMA mode: %s\n", vpx_codec_error(&decoder));
return EXIT_FAILURE;
}
/* Iterate through the list of memory maps, allocating them with the
* requested alignment.
*/
iter = NULL;
do
{
vpx_codec_mmap_t mmap;
unsigned int align;
res = vpx_codec_get_mem_map(&decoder, &mmap, &iter);
align = mmap.align ? mmap.align - 1 : 0;
if (!res)
{
if (verbose)
printf("Allocating segment %u, size %lu, align %u %s\n",
mmap.id, mmap.sz, mmap.align,
mmap.flags & VPX_CODEC_MEM_ZERO ? "(ZEROED)" : "");
if (mmap.flags & VPX_CODEC_MEM_ZERO)
mmap.priv = calloc(1, mmap.sz + align);
else
mmap.priv = malloc(mmap.sz + align);
mmap.base = (void *)((((uintptr_t)mmap.priv) + align) & ~(uintptr_t)align);
mmap.dtor = my_mem_dtor;
alloc_sz += mmap.sz + align;
if (vpx_codec_set_mem_map(&decoder, &mmap, 1))
{
printf("Failed to set mmap: %s\n", vpx_codec_error(&decoder));
return EXIT_FAILURE;
}
}
else if (res != VPX_CODEC_LIST_END)
{
printf("Failed to get mmap: %s\n", vpx_codec_error(&decoder));
return EXIT_FAILURE;
}
}
while (res != VPX_CODEC_LIST_END);
printf("%s\n %d bytes external memory required for %dx%d.\n",
decoder.name, alloc_sz, cfg.w, cfg.h);
vpx_codec_destroy(&decoder);
return EXIT_SUCCESS;
}

231
examples.mk Normal file
View File

@ -0,0 +1,231 @@
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
# List of examples to build. UTILS are files that are taken from the source
# tree directly, and GEN_EXAMPLES are files that are created from the
# examples folder.
UTILS-$(CONFIG_DECODERS) += ivfdec.c
ivfdec.SRCS += md5_utils.c md5_utils.h
ivfdec.SRCS += vpx_ports/vpx_timer.h
ivfdec.SRCS += vpx_ports/vpx_integer.h
ivfdec.SRCS += args.c args.h vpx_ports/config.h
ivfdec.GUID = BA5FE66F-38DD-E034-F542-B1578C5FB950
ivfdec.DESCRIPTION = Full featured decoder
UTILS-$(CONFIG_ENCODERS) += ivfenc.c
ivfenc.SRCS += args.c args.h vpx_ports/config.h
ivfenc.SRCS += vpx_ports/mem_ops.h vpx_ports/mem_ops_aligned.h
ivfenc.GUID = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1
ivfenc.DESCRIPTION = Full featured encoder
UTILS-$(CONFIG_DECODERS) += example_xma.c
example_xma.GUID = A955FC4A-73F1-44F7-135E-30D84D32F022
example_xma.DESCRIPTION = External Memory Allocation mode usage
GEN_EXAMPLES-$(CONFIG_DECODERS) += simple_decoder.c
simple_decoder.GUID = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC
simple_decoder.DESCRIPTION = Simplified decoder loop
GEN_EXAMPLES-$(CONFIG_DECODERS) += postproc.c
postproc.GUID = 65E33355-F35E-4088-884D-3FD4905881D7
postproc.DESCRIPTION = Decoder postprocessor control
GEN_EXAMPLES-$(CONFIG_DECODERS) += decode_to_md5.c
decode_to_md5.SRCS += md5_utils.h md5_utils.c
decode_to_md5.GUID = 59120B9B-2735-4BFE-B022-146CA340FE42
decode_to_md5.DESCRIPTION = Frame by frame MD5 checksum
GEN_EXAMPLES-$(CONFIG_ENCODERS) += simple_encoder.c
simple_encoder.GUID = 4607D299-8A71-4D2C-9B1D-071899B6FBFD
simple_encoder.DESCRIPTION = Simplified encoder loop
GEN_EXAMPLES-$(CONFIG_ENCODERS) += twopass_encoder.c
twopass_encoder.GUID = 73494FA6-4AF9-4763-8FBB-265C92402FD8
twopass_encoder.DESCRIPTION = Two-pass encoder loop
GEN_EXAMPLES-$(CONFIG_ENCODERS) += force_keyframe.c
force_keyframe.GUID = 3C67CADF-029F-4C86-81F5-D6D4F51177F0
force_keyframe.DESCRIPTION = Force generation of keyframes
ifeq ($(CONFIG_DECODERS),yes)
GEN_EXAMPLES-$(CONFIG_ENCODERS) += decode_with_drops.c
endif
decode_with_drops.GUID = CE5C53C4-8DDA-438A-86ED-0DDD3CDB8D26
decode_with_drops.DESCRIPTION = Drops frames while decoding
GEN_EXAMPLES-$(CONFIG_ENCODERS) += error_resilient.c
error_resilient.GUID = DF5837B9-4145-4F92-A031-44E4F832E00C
error_resilient.DESCRIPTION = Error Resiliency Feature
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8_scalable_patterns.c
vp8_scalable_patterns.GUID = 0D6A210B-F482-4D6F-8570-4A9C01ACC88C
vp8_scalable_patterns.DESCRIPTION = VP8 Scalable Bitstream Patterns
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8_set_maps.c
vp8_set_maps.GUID = ECB2D24D-98B8-4015-A465-A4AF3DCC145F
vp8_set_maps.DESCRIPTION = VP8 set active and ROI maps
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += vp8cx_set_ref.c
vp8cx_set_ref.GUID = C5E31F7F-96F6-48BD-BD3E-10EBF6E8057A
vp8cx_set_ref.DESCRIPTION = VP8 set encoder reference frame
# Handle extra library flags depending on codec configuration
CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m
#
# End of specified files. The rest of the build rules should happen
# automagically from here.
#
# Examples need different flags based on whether we're building
# from an installed tree or a version controlled tree. Determine
# the proper paths.
ifeq ($(HAVE_ALT_TREE_LAYOUT),yes)
LIB_PATH := $(SRC_PATH_BARE)/../lib
INC_PATH := $(SRC_PATH_BARE)/../include
else
LIB_PATH-yes += $(if $(BUILD_PFX),$(BUILD_PFX),.)
INC_PATH-yes += $(SRC_PATH_BARE)/vpx_codec
INC_PATH-yes += $(SRC_PATH_BARE)/vpx_ports
INC_PATH-$(CONFIG_VP8_DECODER) += $(SRC_PATH_BARE)/vp8
INC_PATH-$(CONFIG_VP8_ENCODER) += $(SRC_PATH_BARE)/vp8
LIB_PATH := $(call enabled,LIB_PATH)
INC_PATH := $(call enabled,INC_PATH)
endif
CFLAGS += $(addprefix -I,$(INC_PATH))
LDFLAGS += $(addprefix -L,$(LIB_PATH))
# Expand list of selected examples to build (as specified above)
UTILS = $(call enabled,UTILS)
GEN_EXAMPLES = $(call enabled,GEN_EXAMPLES)
ALL_EXAMPLES = $(UTILS) $(GEN_EXAMPLES)
ALL_SRCS = $(foreach ex,$(ALL_EXAMPLES),$($(ex:.c=).SRCS))
CODEC_EXTRA_LIBS=$(sort $(call enabled,CODEC_EXTRA_LIBS))
# Expand all example sources into a variable containing all sources
# for that example (not just them main one specified in UTILS/GEN_EXAMPLES)
# and add this file to the list (for MSVS workspace generation)
$(foreach ex,$(ALL_EXAMPLES),$(eval $(ex:.c=).SRCS += $(ex) examples.mk))
# If this is a universal (fat) binary, then all the subarchitectures have
# already been built and our job is to stitch them together. The
# BUILD_OBJS variable indicates whether we should be building
# (compiling, linking) the library. The LIPO_OBJS variable indicates
# that we're stitching.
$(eval $(if $(filter universal%,$(TOOLCHAIN)),LIPO_OBJS,BUILD_OBJS):=yes)
# Create build/install dependencies for all examples. The common case
# is handled here. The MSVS case is handled below.
NOT_MSVS = $(if $(CONFIG_MSVS),,yes)
INSTALL-BINS-$(NOT_MSVS) += $(addprefix bin/,$(ALL_EXAMPLES:.c=))
INSTALL-SRCS-yes += $(ALL_SRCS)
OBJS-$(NOT_MSVS) += $(if $(BUILD_OBJS),$(call objs,$(ALL_SRCS)))
BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=))
# Instantiate linker template for all examples.
CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx)
$(foreach bin,$(BINS-yes),\
$(if $(BUILD_OBJS),$(eval $(bin): $(LIB_PATH)/lib$(CODEC_LIB).a))\
$(if $(BUILD_OBJS),$(eval $(call linker_template,$(bin),\
$(call objs,$($(notdir $(bin)).SRCS)) \
-l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\
)))\
$(if $(LIPO_OBJS),$(eval $(call lipo_bin_template,$(bin))))\
)
# Rules to generate the GEN_EXAMPLES sources
.PRECIOUS: %.c
CLEAN-OBJS += $(GEN_EXAMPLES)
%.c: examples/%.txt
@echo " [EXAMPLE] $@"
@$(SRC_PATH_BARE)/examples/gen_example_code.sh $< > $@
# The following pairs define a mapping of locations in the distribution
# tree to locations in the source/build trees.
INSTALL_MAPS += src/%.c %.c
INSTALL_MAPS += src/% $(SRC_PATH_BARE)/%
INSTALL_MAPS += bin/% %
INSTALL_MAPS += % %
# Set up additional MSVS environment
ifeq ($(CONFIG_MSVS),yes)
CODEC_LIB=$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd)
# This variable uses deferred expansion intentionally, since the results of
# $(wildcard) may change during the course of the Make.
VS_PLATFORMS = $(foreach d,$(wildcard */Release/$(CODEC_LIB).lib),$(word 1,$(subst /, ,$(d))))
INSTALL_MAPS += $(foreach p,$(VS_PLATFORMS),bin/$(p)/% $(p)/Release/%)
endif
# Build Visual Studio Projects. We use a template here to instantiate
# explicit rules rather than using an implicit rule because we want to
# leverage make's VPATH searching rather than specifying the paths on
# each file in ALL_EXAMPLES. This has the unfortunate side effect that
# touching the source files trigger a rebuild of the project files
# even though there is no real dependency there (the dependency is on
# the makefiles). We may want to revisit this.
define vcproj_template
$(1): $($(1:.vcproj=).SRCS)
@echo " [vcproj] $$@"
$$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh\
--exe\
--target=$$(TOOLCHAIN)\
--name=$$(@:.vcproj=)\
--ver=$$(CONFIG_VS_VERSION)\
--proj-guid=$$($$(@:.vcproj=).GUID)\
$$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \
--out=$$@ $$(CFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) -lwinmm $$^
endef
PROJECTS-$(CONFIG_MSVS) += $(ALL_EXAMPLES:.c=.vcproj)
INSTALL-BINS-$(CONFIG_MSVS) += $(foreach p,$(VS_PLATFORMS),\
$(addprefix bin/$(p)/,$(ALL_EXAMPLES:.c=.exe)))
$(foreach proj,$(call enabled,PROJECTS),\
$(eval $(call vcproj_template,$(proj))))
#
# Documentation Rules
#
%.dox: examples/%.txt
@echo " [DOXY] $@"
@$(SRC_PATH_BARE)/examples/gen_example_text.sh $< | \
$(SRC_PATH_BARE)/examples/gen_example_doxy.php \
example_$(@:.dox=) $(@:.dox=.c) > $@
%.dox: %.c
@echo " [DOXY] $@"
@echo "/*!\page example_$(@:.dox=) $(@:.dox=)" > $@
@echo " \includelineno $(notdir $<)" >> $@
@echo "*/" >> $@
samples.dox: examples.mk
@echo " [DOXY] $@"
@echo "/*!\page samples Sample Code" > $@
@echo " This SDK includes a number of sample applications."\
"each sample documents a feature of the SDK in both prose"\
"and the associated C code. In general, later samples"\
"build upon prior samples, so it is best to work through the"\
"list in order. The following samples are included: ">>$@
@$(foreach ex,$(GEN_EXAMPLES:.c=),\
echo " - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;)
@echo >> $@
@echo " In addition, the SDK contains a number of utilities."\
"Since these utilities are built upon the concepts described"\
"in the sample code listed above, they are not documented in"\
"pieces like the samples are. Thir sourcre is included here"\
"for reference. The following utilities are included:" >> $@
@$(foreach ex,$(UTILS:.c=),\
echo " - \subpage example_$(ex) $($(ex).DESCRIPTION)" >> $@;)
@echo "*/" >> $@
CLEAN-OBJS += examples.doxy samples.dox $(ALL_EXAMPLES:.c=.dox)
DOCS-yes += examples.doxy samples.dox $(ALL_EXAMPLES:.c=.dox)
examples.doxy: samples.dox $(ALL_EXAMPLES:.c=.dox)
@echo "INPUT += $^" > $@

View File

@ -0,0 +1,48 @@
@TEMPLATE decoder_tmpl.c
Frame-by-frame MD5 Checksum
===========================
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
This example builds upon the simple decoder loop to show how checksums
of the decoded output can be generated. These are used for validating
decoder implementations against the reference implementation, for example.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
MD5 algorithm
-------------
The Message-Digest 5 (MD5) is a well known hash function. We have provided
an implementation derived from the RSA Data Security, Inc. MD5 Message-Digest
Algorithm for your use. Our implmentation only changes the interface of this
reference code. You must include the `md5_utils.h` header for access to these
functions.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
#include "md5_utils.h"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
Processing The Decoded Data
---------------------------
Each row of the image is passed to the MD5 accumulator. First the Y plane
is processed, then U, then V. It is important to honor the image's `stride`
values.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_DX
unsigned char md5_sum[16];
md5_ctx_t md5;
int i;
md5_init(&md5);
for(plane=0; plane < 3; plane++) {
unsigned char *buf =img->planes[plane];
for(y=0; y<img->d_h >> (plane?1:0); y++) {
md5_update(&md5, buf, img->d_w >> (plane?1:0));
buf += img->stride[plane];
}
}
md5_finalize(&md5, md5_sum);
for(i=0; i<16; i++)
fprintf(outfile, "%02x",md5_sum[i]);
fprintf(outfile, " img-%dx%d-%04d.i420\n", img->d_w, img->d_h,
frame_cnt);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_DX

View File

@ -0,0 +1,73 @@
@TEMPLATE decoder_tmpl.c
Decode With Drops Example
=========================
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
This is an example utility which drops a series of frames, as specified
on the command line. This is useful for observing the error recovery
features of the codec.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
Usage
-----
This example adds a single argument to the `simple_decoder` example,
which specifies the range or pattern of frames to drop. The parameter is
parsed as follows:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
if(argc!=4)
die("Usage: %s <infile> <outfile> <N-M|N/M>\n", argv[0]);
{
char *nptr;
n = strtol(argv[3], &nptr, 0);
m = strtol(nptr+1, NULL, 0);
is_range = *nptr == '-';
if(!n || !m || (*nptr != '-' && *nptr != '/'))
die("Couldn't parse pattern %s\n", argv[3]);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
Dropping A Range Of Frames
--------------------------
To drop a range of frames, specify the starting frame and the ending
frame to drop, separated by a dash. The following command will drop
frames 5 through 10 (base 1).
$ ./decode_with_drops in.ivf out.i420 5-10
Dropping A Pattern Of Frames
----------------------------
To drop a pattern of frames, specify the number of frames to drop and
the number of frames after which to repeat the pattern, separated by
a forward-slash. The following command will drop 3 of 7 frames.
Specifically, it will decode 4 frames, then drop 3 frames, and then
repeat.
$ ./decode_with_drops in.ivf out.i420 3/7
Extra Variables
---------------
This example maintains the pattern passed on the command line in the
`n`, `m`, and `is_range` variables:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
int n, m, is_range;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_VARS
Making The Drop Decision
------------------------
The example decides whether to drop the frame based on the current
frame number, immediately before decoding the frame.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
if((is_range && frame_cnt >= n && frame_cnt <= m)
||(!is_range && m - (frame_cnt-1)%m <= n)) {
putc('X', stdout);
continue;
}
putc('.', stdout);
fflush(stdout);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE

102
examples/decoder_tmpl.c Normal file
View File

@ -0,0 +1,102 @@
/*
* Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license and patent
* grant that can be found in the LICENSE file in the root of the source
* tree. All contributing project authors may be found in the AUTHORS
* file in the root of the source tree.
*/
/*
@*INTRODUCTION
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#define VPX_CODEC_DISABLE_COMPAT 1
#include "vpx_decoder.h"
#if CONFIG_VP8_DECODER && !defined(interface)
#include "vp8dx.h"
#define interface (&vpx_codec_vp8_dx_algo)
#endif
@EXTRA_INCLUDES
#define IVF_FILE_HDR_SZ (32)
#define IVF_FRAME_HDR_SZ (12)
static unsigned int mem_get_le32(const unsigned char *mem) {
return (mem[3] << 24)|(mem[2] << 16)|(mem[1] << 8)|(mem[0]);
}
static void die(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
if(fmt[strlen(fmt)-1] != '\n')
printf("\n");
exit(EXIT_FAILURE);
}
@DIE_CODEC
int main(int argc, char **argv) {
FILE *infile, *outfile;
vpx_codec_ctx_t codec;
int flags = 0, frame_cnt = 0;
unsigned char file_hdr[IVF_FILE_HDR_SZ];
unsigned char frame_hdr[IVF_FRAME_HDR_SZ];
unsigned char frame[256*1024];
vpx_codec_err_t res;
@@@@EXTRA_VARS
(void)res;
/* Open files */
@@@@USAGE
if(!(infile = fopen(argv[1], "rb")))
die("Failed to open %s for reading", argv[1]);
if(!(outfile = fopen(argv[2], "wb")))
die("Failed to open %s for writing", argv[2]);
/* Read file header */
fread(file_hdr, 1, IVF_FILE_HDR_SZ, infile);
if(!(file_hdr[0]=='D' && file_hdr[1]=='K' && file_hdr[2]=='I'
&& file_hdr[3]=='F'))
die("%s is not an IVF file.", argv[1]);
printf("Using %s\n",vpx_codec_iface_name(interface));
@@@@DEC_INIT
/* Read each frame */
while(fread(frame_hdr, 1, IVF_FRAME_HDR_SZ, infile) == IVF_FRAME_HDR_SZ) {
int frame_sz = mem_get_le32(frame_hdr);
vpx_codec_iter_t iter = NULL;
vpx_image_t *img;
frame_cnt++;
if(frame_sz > sizeof(frame))
die("Frame %d data too big for example code buffer", frame_sz);
if(fread(frame, 1, frame_sz, infile) != frame_sz)
die("Frame %d failed to read complete frame", frame_cnt);
@@@@@@@@PRE_DECODE
@@@@@@@@DECODE
/* Write decoded data to disk */
@@@@@@@@GET_FRAME
unsigned int plane, y;
@@@@@@@@@@@@PROCESS_DX
}
}
printf("Processed %d frames.\n",frame_cnt);
@@@@DESTROY
fclose(outfile);
fclose(infile);
return EXIT_SUCCESS;
}

61
examples/decoder_tmpl.txt Normal file
View File

@ -0,0 +1,61 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
#define VPX_CODEC_DISABLE_COMPAT 1
#include "vpx_decoder.h"
#include "vp8dx.h"
#define interface (&vpx_codec_vp8_dx_algo)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DIE_CODEC
static void die_codec(vpx_codec_ctx_t *ctx, const char *s) {
const char *detail = vpx_codec_error_detail(ctx);
printf("%s: %s\n", s, vpx_codec_error(ctx));
if(detail)
printf(" %s\n",detail);
exit(EXIT_FAILURE);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DIE_CODEC
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
if(argc!=3)
die("Usage: %s <infile> <outfile>\n", argv[0]);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
/* Initialize codec */
if(vpx_codec_dec_init(&codec, interface, NULL, flags))
die_codec(&codec, "Failed to initialize decoder");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECODE
/* Decode the frame */
if(vpx_codec_decode(&codec, frame, frame_sz, NULL, 0))
die_codec(&codec, "Failed to decode frame");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DECODE
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GET_FRAME
while((img = vpx_codec_get_frame(&codec, &iter))) {
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GET_FRAME
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_DX
for(plane=0; plane < 3; plane++) {
unsigned char *buf =img->planes[plane];
for(y=0; y<img->d_h >> (plane?1:0); y++) {
fwrite(buf, 1, img->d_w >> (plane?1:0), outfile);
buf += img->stride[plane];
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_DX
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
if(vpx_codec_destroy(&codec))
die_codec(&codec, "Failed to destroy codec");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY

189
examples/encoder_tmpl.c Normal file
View File

@ -0,0 +1,189 @@
/*
* Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license and patent
* grant that can be found in the LICENSE file in the root of the source
* tree. All contributing project authors may be found in the AUTHORS
* file in the root of the source tree.
*/
/*
@*INTRODUCTION
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#define VPX_CODEC_DISABLE_COMPAT 1
#include "vpx_encoder.h"
#if CONFIG_VP8_ENCODER && !defined(interface)
#include "vp8cx.h"
#define interface (&vpx_codec_vp8_cx_algo)
#define fourcc 0x30385056
#endif
@EXTRA_INCLUDES
#define IVF_FILE_HDR_SZ (32)
#define IVF_FRAME_HDR_SZ (12)
static void mem_put_le16(char *mem, unsigned int val) {
mem[0] = val;
mem[1] = val>>8;
}
static void mem_put_le32(char *mem, unsigned int val) {
mem[0] = val;
mem[1] = val>>8;
mem[2] = val>>16;
mem[3] = val>>24;
}
static void die(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
if(fmt[strlen(fmt)-1] != '\n')
printf("\n");
exit(EXIT_FAILURE);
}
@DIE_CODEC
static int read_frame(FILE *f, vpx_image_t *img) {
size_t nbytes, to_read;
int res = 1;
to_read = img->w*img->h*3/2;
nbytes = fread(img->planes[0], 1, to_read, f);
if(nbytes != to_read) {
res = 0;
if(nbytes > 0)
printf("Warning: Read partial frame. Check your width & height!\n");
}
return res;
}
static void write_ivf_file_header(FILE *outfile,
const vpx_codec_enc_cfg_t *cfg,
int frame_cnt) {
char header[32];
if(cfg->g_pass != VPX_RC_ONE_PASS && cfg->g_pass != VPX_RC_LAST_PASS)
return;
header[0] = 'D';
header[1] = 'K';
header[2] = 'I';
header[3] = 'F';
mem_put_le16(header+4, 0); /* version */
mem_put_le16(header+6, 32); /* headersize */
mem_put_le32(header+8, fourcc); /* headersize */
mem_put_le16(header+12, cfg->g_w); /* width */
mem_put_le16(header+14, cfg->g_h); /* height */
mem_put_le32(header+16, cfg->g_timebase.den); /* rate */
mem_put_le32(header+20, cfg->g_timebase.num); /* scale */
mem_put_le32(header+24, frame_cnt); /* length */
mem_put_le32(header+28, 0); /* unused */
fwrite(header, 1, 32, outfile);
}
static void write_ivf_frame_header(FILE *outfile,
const vpx_codec_cx_pkt_t *pkt)
{
char header[12];
vpx_codec_pts_t pts;
if(pkt->kind != VPX_CODEC_CX_FRAME_PKT)
return;
pts = pkt->data.frame.pts;
mem_put_le32(header, pkt->data.frame.sz);
mem_put_le32(header+4, pts&0xFFFFFFFF);
mem_put_le32(header+8, pts >> 32);
fwrite(header, 1, 12, outfile);
}
int main(int argc, char **argv) {
FILE *infile, *outfile;
vpx_codec_ctx_t codec;
vpx_codec_enc_cfg_t cfg;
int frame_cnt = 0;
unsigned char file_hdr[IVF_FILE_HDR_SZ];
unsigned char frame_hdr[IVF_FRAME_HDR_SZ];
vpx_image_t raw;
vpx_codec_err_t res;
long width;
long height;
int frame_avail;
int got_data;
int flags = 0;
@@@@TWOPASS_VARS
/* Open files */
@@@@USAGE
width = strtol(argv[1], NULL, 0);
height = strtol(argv[2], NULL, 0);
if(width < 16 || width%2 || height <16 || height%2)
die("Invalid resolution: %ldx%ld", width, height);
if(!vpx_img_alloc(&raw, IMG_FMT_YV12, width, height, 1))
die("Faile to allocate image", width, height);
if(!(outfile = fopen(argv[4], "wb")))
die("Failed to open %s for writing", argv[4]);
printf("Using %s\n",vpx_codec_iface_name(interface));
@@@@ENC_DEF_CFG
@@@@ENC_SET_CFG
@@@@ENC_SET_CFG2
write_ivf_file_header(outfile, &cfg, 0);
@@@@TWOPASS_LOOP_BEGIN
/* Open input file for this encoding pass */
if(!(infile = fopen(argv[3], "rb")))
die("Failed to open %s for reading", argv[3]);
@@@@@@@@ENC_INIT
frame_avail = 1;
got_data = 0;
while(frame_avail || got_data) {
vpx_codec_iter_t iter = NULL;
const vpx_codec_cx_pkt_t *pkt;
@@@@@@@@@@@@PER_FRAME_CFG
@@@@@@@@@@@@ENCODE_FRAME
got_data = 0;
while( (pkt = vpx_codec_get_cx_data(&codec, &iter)) ) {
got_data = 1;
switch(pkt->kind) {
@@@@@@@@@@@@@@@@PROCESS_FRAME
@@@@@@@@@@@@@@@@PROCESS_STATS
default:
break;
}
printf(pkt->kind == VPX_CODEC_CX_FRAME_PKT
&& (pkt->data.frame.flags & VPX_FRAME_IS_KEY)? "K":".");
fflush(stdout);
}
frame_cnt++;
}
printf("\n");
fclose(infile);
@@@@TWOPASS_LOOP_END
printf("Processed %d frames.\n",frame_cnt-1);
@@@@DESTROY
/* Try to rewrite the file header with the actual frame count */
if(!fseek(outfile, 0, SEEK_SET))
write_ivf_file_header(outfile, &cfg, frame_cnt-1);
fclose(outfile);
return EXIT_SUCCESS;
}

73
examples/encoder_tmpl.txt Normal file
View File

@ -0,0 +1,73 @@
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
#define VPX_CODEC_DISABLE_COMPAT 1
#include "vpx_encoder.h"
#include "vp8cx.h"
#define interface (&vpx_codec_vp8_cx_algo)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DIE_CODEC
static void die_codec(vpx_codec_ctx_t *ctx, const char *s) {
const char *detail = vpx_codec_error_detail(ctx);
printf("%s: %s\n", s, vpx_codec_error(ctx));
if(detail)
printf(" %s\n",detail);
exit(EXIT_FAILURE);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DIE_CODEC
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
if(argc!=5)
die("Usage: %s <width> <height> <infile> <outfile>\n", argv[0]);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ USAGE
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_DEF_CFG
/* Populate encoder configuration */
res = vpx_codec_enc_config_default(interface, &cfg, 0);
if(res) {
printf("Failed to get config: %s\n", vpx_codec_err_to_string(res));
return EXIT_FAILURE;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_DEF_CFG
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG
/* Update the default configuration with our settings */
cfg.rc_target_bitrate = width * height * cfg.rc_target_bitrate
/ cfg.g_w / cfg.g_h;
cfg.g_w = width;
cfg.g_h = height;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INIT
/* Initialize codec */
if(vpx_codec_enc_init(&codec, interface, &cfg, 0))
die_codec(&codec, "Failed to initialize encoder");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INIT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENCODE_FRAME
frame_avail = read_frame(infile, &raw);
if(vpx_codec_encode(&codec, frame_avail? &raw : NULL, frame_cnt,
1, flags, VPX_DL_REALTIME))
die_codec(&codec, "Failed to encode frame");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENCODE_FRAME
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
case VPX_CODEC_CX_FRAME_PKT:
write_ivf_frame_header(outfile, pkt);
fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz,
outfile);
break;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
if(vpx_codec_destroy(&codec))
die_codec(&codec, "Failed to destroy codec");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY

View File

@ -0,0 +1,25 @@
@TEMPLATE encoder_tmpl.c
Error Resiliency Features
=========================
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
This is an example demonstrating how to enable the error resiliency
features of the codec.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
Configuration
-------------
Error resiliency is controlled by the g_error_resilient member of the
configuration structure.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG2
/* Enable error resilient mode */
cfg.g_error_resilient = 1;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_SET_CFG2
Observing The Effects
---------------------
Use the `decode_with_drops` example to decode with frames 5-10 dropped.
Compare the output for a file encoded with this example versus one
encoded with the `simple_encoder` example.

View File

@ -0,0 +1,28 @@
@TEMPLATE encoder_tmpl.c
Forcing A Keyframe
==================
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
This is an example demonstrating how to control placement of keyframes
on a frame-by-frame basis.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
Configuration
-------------
Keyframes can be forced by setting the VPX_EFLAG_FORCE_KF bit of the
flags passed to `vpx_codec_control()`. In this example, we force a
keyframe every 8 frames.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PER_FRAME_CFG
if(!(frame_cnt & 7))
flags |= VPX_EFLAG_FORCE_KF;
else
flags &= ~VPX_EFLAG_FORCE_KF;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PER_FRAME_CFG
Observing The Effects
---------------------
The output of the encoder examples shows a 'K' rather than a dot '.'
when the encoder generates a keyframe. Note that every 8 frames a 'K'
is output.

84
examples/gen_example_code.sh Executable file
View File

@ -0,0 +1,84 @@
#!/bin/bash
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
# gen_example_code.sh
self=$0
die_usage() {
echo "Usage: $self <example.txt>"
exit 1
}
die() {
echo "$@"
exit 1
}
include_block() {
show_bar=$1
block_name=${line##*@}
indent=${line%%${block_name}}
indent=${#indent}
[ $indent -eq 1 ] && indent=0
local on_block
while IFS=$'\n' read -r t_line; do
case "$t_line" in
\~*\ ${block_name})
if [ "x$on_block" == "xyes" ]; then
return 0;
else
on_block=yes
fi
;;
@DEFAULT)
if [ "x$on_block" == "xyes" ]; then
include_block $show_bar < "${template%.c}.txt"
return 0
fi
;;
*)
if [ "x$on_block" == "xyes" ]; then
local rem
(( rem = 78 - indent ))
case "$block_name" in
\**) printf "%${indent}s * %s\n" "" "$t_line" ;;
*)
if [ "$show_bar" == "yes" ]; then
printf "%${indent}s%-${rem}s//\n" "" "$t_line"
else
printf "%${indent}s%s\n" "" "$t_line"
fi
;;
esac
fi
esac
done
return 1
}
txt=$1
[ -f "$txt" ] || die_usage
read -r template < "$txt"
case "$template" in
@TEMPLATE*) template=${txt%/*}/${template##@TEMPLATE } ;;
*) die "Failed to parse template name from '$template'" ;;
esac
while IFS=$'\n' read -r line; do
case "$line" in
@*) include_block yes < "$txt" \
|| include_block < "${template%.c}.txt" \
#|| echo "WARNING: failed to find text for block $block_name" >&2
;;
*) echo "$line" ;;
esac
done < "$template"

223
examples/gen_example_doxy.php Executable file
View File

@ -0,0 +1,223 @@
#!/usr/bin/env php
/*
* Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license and patent
* grant that can be found in the LICENSE file in the root of the source
* tree. All contributing project authors may be found in the AUTHORS
* file in the root of the source tree.
*/
<?php
/* This script converts markdown to doxygen htmlonly syntax, nesting the
* content inside a \page. It expects input on stdin and outputs on stdout.
*
* Usage: gen_example_doxy.php <page_identifier> "<page description>"
*/
$geshi_path = dirname($argv[0])."/includes/geshi/geshi/"; // Language files
$tmp_token = '<!-- I wanna rock you, Chaka Khan -->';
// Include prerequisites or exit
if(!include_once('includes/PHP-Markdown-Extra-1.2.3/markdown.php'))
die("Cannot load Markdown transformer.\n");
if(!include_once('includes/PHP-SmartyPants-1.5.1e/smartypants.php'))
die("Cannot load SmartyPants transformer.\n");
if(!include_once('includes/geshi/geshi.php'))
die("Cannot load GeSHi transformer.\n");
// ASCIIMathPHP?
// HTML::Toc?
// Tidy?
// Prince?
/**
* Generate XHTML body
*
*/
$page_body = file_get_contents('php://stdin');
// Transform any MathML expressions in the body text
$regexp = '/\[\[(.*?)\]\]/'; // Double square bracket delimiters
$page_body = preg_replace_callback($regexp, 'ASCIIMathPHPCallback', $page_body);
// Fix ASCIIMathPHP's output
$page_body = fix_asciiMath($page_body);
// Wrap block-style <math> elements in <p>, since Markdown doesn't.
$page_body = preg_replace('/\n(<math.*<\/math>)\n/', '<p class="eq_para">$1</p>', $page_body);
// Transform the body text to HTML
$page_body = Markdown($page_body);
// Preprocess code blocks
// Decode XML entities. GeSHi doesn't anticipate that
// Markdown has already done this.
$regexp = '|<pre><code>(.*?)<\/code><\/pre>|si';
while (preg_match($regexp, $page_body, $matches) > 0)
{
// Replace 1st match with token
$page_body = preg_replace($regexp, $tmp_token, $page_body, 1);
$block_new = $matches[1];
// Un-encode ampersand entities
$block_new = decode_markdown($block_new);
// Replace token with revised string
$page_body = preg_replace("|$tmp_token|", '<div class="codeblock">'.$block_new.'</div>', $page_body);
}
// Run GeSHi over code blocks
$regexp = '|<div class="codeblock">(.*?)<\/div>|si';
$language = 'c';
while (preg_match($regexp, $page_body, $matches))
{
$geshi = new GeSHi($matches[1], $language);
$geshi->set_language_path($geshi_path);
$block_new = $geshi->parse_code();
// Strip annoying final newline
$block_new = preg_replace('|\n&nbsp;<\/pre>|', '</pre>' , $block_new);
// Remove style attribute (TODO: Research this in GeSHi)
$block_new = preg_replace('| style="font-family:monospace;"|', '' , $block_new);
$page_body = preg_replace($regexp, $block_new, $page_body, 1);
unset($geshi); // Clean up
}
unset($block_new); // Clean up
// Apply typographic flourishes
$page_body = SmartyPants($page_body);
/**
* Generate Doxygen Body
*
*/
$page_id=(isset($argv[1]))?$argv[1]:"";
$page_desc=(isset($argv[2]))?$argv[2]:"";
print "/*!\\page ".$page_id." ".$page_desc."\n\\htmlonly\n";
print $page_body;
print "\\endhtmlonly\n*/\n";
// ---------------------------------------------------------
/**
* decode_markdown()
*
* Markdown encodes '&', '<' and '>' in detected code
* blocks, as a convenience. This will restore the
* encoded entities to ordinary characters, since a
* downstream transformer (like GeSHi) may not
* anticipate this.
*
**********************************************************/
function decode_markdown($input)
{
$out = FALSE;
$entities = array ('|&amp;|'
,'|&lt;|'
,'|&gt;|'
);
$characters = array ('&'
,'<'
,'>'
);
$input = preg_replace($entities, $characters, $input);
$out = $input;
return $out;
}
/**
* ASCIIMathML parser
* http://tinyurl.com/ASCIIMathPHP
*
* @PARAM mtch_arr array - Array of ASCIIMath expressions
* as returned by preg_replace_callback([pattern]). First
* dimension is the full matched string (with delimiter);
* 2nd dimension is the undelimited contents (typically
* a capture group).
*
**********************************************************/
function ASCIIMathPHPCallback($mtch_arr)
{
$txt = trim($mtch_arr[1]);
include('includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php');
require_once('includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php');
static $asciimath;
if (!isset($asciimath)) $asciimath = new ASCIIMathPHP($symbol_arr);
$math_attr_arr = array('displaystyle' => 'true');
$asciimath->setExpr($txt);
$asciimath->genMathML($math_attr_arr);
return($asciimath->getMathML());
}
/**
* fix_asciiMath()
*
* ASCIIMath pretty-prints its output, with linefeeds
* and tabs. Causes unexpected behavior in some renderers.
* This flattens <math> blocks.
*
* @PARAM page_body str - The <body> element of an
* XHTML page to transform.
*
**********************************************************/
function fix_asciiMath($page_body)
{
$out = FALSE;
// Remove linefeeds and whitespace in <math> elements
$tags_bad = array('/(<math.*?>)\n*\s*/'
, '/(<mstyle.*?>)\n*\s*/'
, '/(<\/mstyle>)\n*\s*/'
, '/(<mrow.*?>)\n*\s*/'
, '/(<\/mrow>)\n*\s*/'
, '/(<mo.*?>)\n*\s*/'
, '/(<\/mo>)\n*\s*/'
, '/(<mi.*?>)\n*\s*/'
, '/(<\/mi>)\n*\s*/'
, '/(<mn.*?>)\n*\s*/'
, '/(<\/mn>)\n*\s*/'
, '/(<mtext.*?>)\n*\s*/'
, '/(<\/mtext>)\n*\s*/'
, '/(<msqrt.*?>)\n*\s*/'
, '/(<\/msqrt>)\n*\s*/'
, '/(<mfrac.*?>)\n*\s*/'
, '/(<\/mfrac>)\n*\s*/'
);
$tags_good = array( '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
, '$1'
);
$out = preg_replace($tags_bad, $tags_good, $page_body);
return $out;
}

83
examples/gen_example_text.sh Executable file
View File

@ -0,0 +1,83 @@
#!/bin/bash
##
## Copyright (c) 2010 The VP8 project authors. All Rights Reserved.
##
## Use of this source code is governed by a BSD-style license and patent
## grant that can be found in the LICENSE file in the root of the source
## tree. All contributing project authors may be found in the AUTHORS
## file in the root of the source tree.
##
# gen_example_text.sh
self=$0
die_usage() {
echo "Usage: $self <example.txt>"
exit 1
}
die() {
echo "$@"
exit 1
}
include_block() {
local on_block
while IFS=$'\n' read -r t_line; do
case "$t_line" in
\~*\ ${block_name})
if [ "x$on_block" == "xyes" ]; then
return 0;
else
on_block=yes
fi
;;
*)
if [ "x$on_block" == "xyes" ]; then
echo "$t_line"
fi
;;
esac
done
echo "WARNING: failed to find text for block $block_name" >&2
return 1
}
txt=$1
[ -f "$txt" ] || die_usage
read -r template < "$txt"
case "$template" in
@TEMPLATE*) template=${txt%/*}/${template##@TEMPLATE } ;;
*) die "Failed to parse template name from '$template'" ;;
esac
fence="~~~~~~~~~"
fence="${fence}${fence}"
fence="${fence}${fence}"
fence="${fence}${fence}"
while IFS=$'\n' read -r line; do
case "$line" in
@TEMPLATE*)
template=${template##@TEMPLATE }
template=${template%.c}.txt
;;
@DEFAULT)
include_block < "$template"
;;
~~~*)
block_name=${line##~* }
[ "$block_name" == "INTRODUCTION" ] || echo "$fence"
;;
*) echo "$line"
;;
esac
done < "$txt"
echo
echo "Putting It All Together"
echo "======================="
echo "${fence}"
${self%/*}/gen_example_code.sh "${txt}"
echo "${fence}"

View File

@ -0,0 +1,218 @@
<?php
$symbol_arr = array(
// Greek symbols
'alpha' => array( 'input'=>'alpha','tag'=>'mi', 'output'=>'&#' . hexdec('03B1') . ';'),
'beta' => array( 'input'=>'beta','tag'=>'mi', 'output'=>'&#' . hexdec('03B2') . ';'),
'chi' => array( 'input'=>'chi','tag'=>'mi', 'output'=>'&#' . hexdec('03C7') . ';'),
'delta' => array( 'input'=>'delta','tag'=>'mi', 'output'=>'&#' . hexdec('03B4') . ';'),
'Delta' => array( 'input'=>'Delta','tag'=>'mo', 'output'=>'&#' . hexdec('0394') . ';'),
'epsi' => array( 'input'=>'epsi','tag'=>'mi', 'output'=>'&#' . hexdec('03B5') . ';'),
'varepsilon' => array( 'input'=>'varepsilon','tag'=>'mi', 'output'=>'&#' . hexdec('025B') . ';'),
'eta' => array( 'input'=>'eta','tag'=>'mi', 'output'=>'&#' . hexdec('03B7') . ';'),
'gamma' => array( 'input'=>'gamma','tag'=>'mi', 'output'=>'&#' . hexdec('03B3') . ';'),
'Gamma' => array( 'input'=>'Gamma','tag'=>'mi', 'output'=>'&#' . hexdec('0393') . ';'),
'iota' => array( 'input'=>'iota','tag'=>'mi', 'output'=>'&#' . hexdec('03B9') . ';'),
'kappa' => array( 'input'=>'kappa','tag'=>'mi', 'output'=>'&#' . hexdec('03BA') . ';'),
'lambda' => array( 'input'=>'lambda','tag'=>'mi', 'output'=>'&#' . hexdec('03BB') . ';'),
'Lambda' => array( 'input'=>'Lambda','tag'=>'mo', 'output'=>'&#' . hexdec('039B') . ';'),
'mu' => array( 'input'=>'mu','tag'=>'mi', 'output'=>'&#' . hexdec('03BC') . ';'),
'nu' => array( 'input'=>'nu','tag'=>'mi', 'output'=>'&#' . hexdec('03BD') . ';'),
'omega' => array( 'input'=>'omega','tag'=>'mi', 'output'=>'&#' . hexdec('03C9') . ';'),
'Omega' => array( 'input'=>'Omega','tag'=>'mo', 'output'=>'&#' . hexdec('03A9') . ';'),
'phi' => array( 'input'=>'phi','tag'=>'mi', 'output'=>'&#' . hexdec('03C6') . ';'),
'varphi' => array( 'input'=>'varphi','tag'=>'mi', 'output'=>'&#' . hexdec('03D5') . ';'),
'Phi' => array( 'input'=>'Phi','tag'=>'mo', 'output'=>'&#' . hexdec('03A6') . ';'),
'pi' => array( 'input'=>'pi','tag'=>'mi', 'output'=>'&#' . hexdec('03C0') . ';'),
'Pi' => array( 'input'=>'Pi','tag'=>'mo', 'output'=>'&#' . hexdec('03A0') . ';'),
'psi' => array( 'input'=>'psi','tag'=>'mi', 'output'=>'&#' . hexdec('03C8') . ';'),
'rho' => array( 'input'=>'rho','tag'=>'mi', 'output'=>'&#' . hexdec('03C1') . ';'),
'sigma' => array( 'input'=>'sigma','tag'=>'mi', 'output'=>'&#' . hexdec('03C3') . ';'),
'Sigma' => array( 'input'=>'Sigma','tag'=>'mo', 'output'=>'&#' . hexdec('03A3') . ';'),
'tau' => array( 'input'=>'tau','tag'=>'mi', 'output'=>'&#' . hexdec('03C4') . ';'),
'theta' => array( 'input'=>'theta','tag'=>'mi', 'output'=>'&#' . hexdec('03B8') . ';'),
'vartheta' => array( 'input'=>'vartheta','tag'=>'mi', 'output'=>'&#' . hexdec('03D1') . ';'),
'Theta' => array( 'input'=>'Theta','tag'=>'mo', 'output'=>'&#' . hexdec('0398') . ';'),
'upsilon' => array( 'input'=>'upsilon','tag'=>'mi', 'output'=>'&#' . hexdec('03C5') . ';'),
'xi' => array( 'input'=>'xi','tag'=>'mi', 'output'=>'&#' . hexdec('03BE') . ';'),
'Xi' => array( 'input'=>'alpha','tag'=>'mo', 'output'=>'&#' . hexdec('039E') . ';'),
'zeta' => array( 'input'=>'zeta','tag'=>'mi', 'output'=>'&#' . hexdec('03B6') . ';'),
// Binary operation symbols
'*' => array( 'input'=>'*','tag'=>'mo', 'output'=>'&#' . hexdec('22C5') . ';'),
'**' => array( 'input'=>'**','tag'=>'mo', 'output'=>'&#' . hexdec('22C6') . ';'),
'//' => array( 'input'=>'//','tag'=>'mo', 'output'=>'/'),
'\\\\' => array( 'input'=>'\\\\','tag'=>'mo', 'output'=>'\\'),
'xx' => array( 'input'=>'xx','tag'=>'mo', 'output'=>'&#' . hexdec('00D7') . ';'),
'-:' => array( 'input'=>'-:','tag'=>'mo', 'output'=>'&#' . hexdec('00F7') . ';'),
'@' => array( 'input'=>'@','tag'=>'mo', 'output'=>'&#' . hexdec('2218') . ';'),
'o+' => array( 'input'=>'o+','tag'=>'mo', 'output'=>'&#' . hexdec('2295') . ';'),
'ox' => array( 'input'=>'ox','tag'=>'mo', 'output'=>'&#' . hexdec('2297') . ';'),
'sum' => array( 'input'=>'sum','tag'=>'mo', 'output'=>'&#' . hexdec('2211') . ';', 'underover'=>TRUE),
'prod' => array( 'input'=>'prod','tag'=>'mo', 'output'=>'&#' . hexdec('220F') . ';', 'underover'=>TRUE),
'^^' => array( 'input'=>'^^','tag'=>'mo', 'output'=>'&#' . hexdec('2227') . ';'),
'^^^' => array( 'input'=>'^^^','tag'=>'mo', 'output'=>'&#' . hexdec('22C0') . ';', 'underover'=>TRUE),
'vv' => array( 'input'=>'vv','tag'=>'mo', 'output'=>'&#' . hexdec('2228') . ';'),
'vvv' => array( 'input'=>'vvv','tag'=>'mo', 'output'=>'&#' . hexdec('22C1') . ';', 'underover'=>TRUE),
'nn' => array( 'input'=>'nn','tag'=>'mo', 'output'=>'&#' . hexdec('2229') . ';'),
'nnn' => array( 'input'=>'nnn','tag'=>'mo', 'output'=>'&#' . hexdec('22C5') . ';', 'underover'=>TRUE),
'uu' => array( 'input'=>'uu','tag'=>'mo', 'output'=>'&#' . hexdec('222A') . ';'),
'uuu' => array( 'input'=>'uuu','tag'=>'mo', 'output'=>'&#' . hexdec('22C3') . ';', 'underover'=>TRUE),
// Binary relation symbols
'!=' => array( 'input'=>'!=','tag'=>'mo', 'output'=>'&#' . hexdec('2260') . ';'),
':=' => array( 'input'=>':=','tag'=>'mo', 'output'=>':=' ), /* 2005-06-05 wes */
'<' => array( 'input'=>'<','tag'=>'mo', 'output'=>'&lt;'),
'lt' => array( 'input'=>'lt','tag'=>'mo', 'output'=>'&lt;'), /* 2005-06-05 wes */
'<=' => array( 'input'=>'<=','tag'=>'mo', 'output'=>'&#' . hexdec('2264') . ';'),
'lt=' => array( 'input'=>'lt=','tag'=>'mo', 'output'=>'&#' . hexdec('2264') . ';'),
'le' => array( 'input'=>'le','tag'=>'mo', 'output'=>'&#' . hexdec('2264') . ';'), /* 2005-06-05 wes */
'>' => array( 'input'=>'>','tag'=>'mo', 'output'=>'&gt;'),
'>=' => array( 'input'=>'>=','tag'=>'mo', 'output'=>'&#' . hexdec('2265') . ';'),
'qeq' => array( 'input'=>'geq','tag'=>'mo', 'output'=>'&#' . hexdec('2265') . ';'),
'-<' => array( 'input'=>'-<','tag'=>'mo', 'output'=>'&#' . hexdec('227A') . ';'),
'-lt' => array( 'input'=>'-lt','tag'=>'mo', 'output'=>'&#' . hexdec('227A') . ';'),
'>-' => array( 'input'=>'>-','tag'=>'mo', 'output'=>'&#' . hexdec('227B') . ';'),
'in' => array( 'input'=>'in','tag'=>'mo', 'output'=>'&#' . hexdec('2208') . ';'),
'!in' => array( 'input'=>'!in','tag'=>'mo', 'output'=>'&#' . hexdec('2209') . ';'),
'sub' => array( 'input'=>'sub','tag'=>'mo', 'output'=>'&#' . hexdec('2282') . ';'),
'sup' => array( 'input'=>'sup','tag'=>'mo', 'output'=>'&#' . hexdec('2283') . ';'),
'sube' => array( 'input'=>'sube','tag'=>'mo', 'output'=>'&#' . hexdec('2286') . ';'),
'supe' => array( 'input'=>'supe','tag'=>'mo', 'output'=>'&#' . hexdec('2287') . ';'),
'-=' => array( 'input'=>'-=','tag'=>'mo', 'output'=>'&#' . hexdec('2261') . ';'),
'~=' => array( 'input'=>'~=','tag'=>'mo', 'output'=>'&#' . hexdec('2245') . ';'),
'~~' => array( 'input'=>'~~','tag'=>'mo', 'output'=>'&#' . hexdec('2248') . ';'),
'prop' => array( 'input'=>'prop','tag'=>'mo', 'output'=>'&#' . hexdec('221D') . ';'),
// Logical symbols
'and' => array( 'input'=>'and','tag'=>'mtext', 'output'=>'and', 'space'=>'1ex'),
'or' => array( 'input'=>'or','tag'=>'mtext', 'output'=>'or', 'space'=>'1ex'),
'not' => array( 'input'=>'not','tag'=>'mo', 'output'=>'&#' . hexdec('00AC') . ';'),
'=>' => array( 'input'=>'=>','tag'=>'mo', 'output'=>'&#' . hexdec('21D2') . ';'),
'if' => array( 'input'=>'if','tag'=>'mo', 'output'=>'if', 'space'=>'1ex'),
'iff' => array( 'input'=>'iff','tag'=>'mo', 'output'=>'&#' . hexdec('21D4') . ';'),
'<=>' => array( 'input'=>'iff','tag'=>'mo', 'output'=>'&#' . hexdec('21D4') . ';'), /* 2005-06-07 wes */
'AA' => array( 'input'=>'AA','tag'=>'mo', 'output'=>'&#' . hexdec('2200') . ';'),
'EE' => array( 'input'=>'EE','tag'=>'mo', 'output'=>'&#' . hexdec('2203') . ';'),
'_|_' => array( 'input'=>'_|_','tag'=>'mo', 'output'=>'&#' . hexdec('22A5') . ';'),
'TT' => array( 'input'=>'TT','tag'=>'mo', 'output'=>'&#' . hexdec('22A4') . ';'),
'|-' => array( 'input'=>'|-','tag'=>'mo', 'output'=>'&#' . hexdec('22A2') . ';'),
'|=' => array( 'input'=>'|=','tag'=>'mo', 'output'=>'&#' . hexdec('22A8') . ';'),
// Miscellaneous symbols
'ang' => array('input'=>'ang','tag'=>'mo','output'=>'&#' . hexdec('2220') . ';'),
'deg' => array('input'=>'deg','tag'=>'mo','output'=>'&#' . hexdec('00B0') . ';'),
'int' => array( 'input'=>'int','tag'=>'mo', 'output'=>'&#' . hexdec('222B') . ';'),
'dx' => array( 'input'=>'dx','tag'=>'mi', 'output'=>'{:d x:}', 'definition'=>TRUE), /* 2005-06-11 wes */
'dy' => array( 'input'=>'dy','tag'=>'mi', 'output'=>'{:d y:}', 'definition'=>TRUE), /* 2005-06-11 wes */
'dz' => array( 'input'=>'dz','tag'=>'mi', 'output'=>'{:d z:}', 'definition'=>TRUE), /* 2005-06-11 wes */
'dt' => array( 'input'=>'dt','tag'=>'mi', 'output'=>'{:d t:}', 'definition'=>TRUE), /* 2005-06-11 wes */
'oint' => array( 'input'=>'oint','tag'=>'mo', 'output'=>'&#' . hexdec('222E') . ';'),
'del' => array( 'input'=>'del','tag'=>'mo', 'output'=>'&#' . hexdec('2202') . ';'),
'grad' => array( 'input'=>'grad','tag'=>'mo', 'output'=>'&#' . hexdec('2207') . ';'),
'+-' => array( 'input'=>'+-','tag'=>'mo', 'output'=>'&#' . hexdec('00B1') . ';'),
'O/' => array( 'input'=>'0/','tag'=>'mo', 'output'=>'&#' . hexdec('2205') . ';'),
'oo' => array( 'input'=>'oo','tag'=>'mo', 'output'=>'&#' . hexdec('221E') . ';'),
'aleph' => array( 'input'=>'aleph','tag'=>'mo', 'output'=>'&#' . hexdec('2135') . ';'),
'...' => array( 'input'=>'int','tag'=>'mo', 'output'=>'...'),
'~' => array( 'input'=>'!~','tag'=>'mo', 'output'=>'&#' . hexdec('0020') . ';'),
'\\ ' => array( 'input'=>'~','tag'=>'mo', 'output'=>'&#' . hexdec('00A0') . ';'),
'quad' => array( 'input'=>'quad','tag'=>'mo', 'output'=>'&#' . hexdec('00A0') . ';&#' . hexdec('00A0') . ';'),
'qquad' => array( 'input'=>'qquad','tag'=>'mo', 'output'=> '&#' . hexdec('00A0') . ';&#' . hexdec('00A0') . ';&#' . hexdec('00A0') . ';'),
'cdots' => array( 'input'=>'cdots','tag'=>'mo', 'output'=>'&#' . hexdec('22EF') . ';'),
'vdots' => array( 'input'=>'vdots','tag'=>'mo', 'output'=>'&#' . hexdec('22EE') . ';'), /* 2005-06-11 wes */
'ddots' => array( 'input'=>'ddots','tag'=>'mo', 'output'=>'&#' . hexdec('22F1') . ';'), /* 2005-06-11 wes */
'diamond' => array( 'input'=>'diamond','tag'=>'mo', 'output'=>'&#' . hexdec('22C4') . ';'),
'square' => array( 'input'=>'square','tag'=>'mo', 'output'=>'&#' . hexdec('25A1') . ';'),
'|_' => array( 'input'=>'|_','tag'=>'mo', 'output'=>'&#' . hexdec('230A') . ';'),
'_|' => array( 'input'=>'_|','tag'=>'mo', 'output'=>'&#' . hexdec('230B') . ';'),
'|~' => array( 'input'=>'|~','tag'=>'mo', 'output'=>'&#' . hexdec('2308') . ';'),
'~|' => array( 'input'=>'~|','tag'=>'mo', 'output'=>'&#' . hexdec('2309') . ';'),
'CC' => array( 'input'=>'CC','tag'=>'mo', 'output'=>'&#' . hexdec('2102') . ';'),
'NN' => array( 'input'=>'NN','tag'=>'mo', 'output'=>'&#' . hexdec('2115') . ';'),
'QQ' => array( 'input'=>'QQ','tag'=>'mo', 'output'=>'&#' . hexdec('211A') . ';'),
'RR' => array( 'input'=>'RR','tag'=>'mo', 'output'=>'&#' . hexdec('211D') . ';'),
'ZZ' => array( 'input'=>'ZZ','tag'=>'mo', 'output'=>'&#' . hexdec('2124') . ';'),
// Standard functions
'lim' => array( 'input'=>'lim','tag'=>'mo', 'output'=>'lim', 'underover'=>TRUE),
'Lim' => array( 'input'=>'Lim','tag'=>'mo', 'output'=>'Lim', 'underover'=>TRUE), /* 2005-06-11 wes */
'sin' => array( 'input'=>'sin','tag'=>'mo', 'output'=>'sin', 'unary'=>TRUE, 'func'=>TRUE),
'cos' => array( 'input'=>'cos', 'tag'=>'mo', 'output'=>'cos', 'unary'=>TRUE, 'func'=>TRUE),
'tan' => array( 'input'=>'tan', 'tag'=>'mo', 'output'=>'tan', 'unary'=>TRUE, 'func'=>TRUE),
'arcsin' => array( 'input'=>'arcsin','tag'=>'mo', 'output'=>'arcsin', 'unary'=>TRUE, 'func'=>TRUE), //2006-9-7 DL
'arccos' => array( 'input'=>'arccos', 'tag'=>'mo', 'output'=>'arccos', 'unary'=>TRUE, 'func'=>TRUE), //2006-9-7 DL
'arctan' => array( 'input'=>'arctan', 'tag'=>'mo', 'output'=>'arctan', 'unary'=>TRUE, 'func'=>TRUE), //2006-9-7 DL
'sinh' => array( 'input'=>'sinh','tag'=>'mo', 'output'=>'sinh', 'unary'=>TRUE, 'func'=>TRUE),
'cosh' => array( 'input'=>'cosh', 'tag'=>'mo', 'output'=>'cosh', 'unary'=>TRUE, 'func'=>TRUE),
'tanh' => array( 'input'=>'tanh', 'tag'=>'mo', 'output'=>'tanh', 'unary'=>TRUE, 'func'=>TRUE),
'cot' => array( 'input'=>'cot','tag'=>'mo', 'output'=>'cot', 'unary'=>TRUE, 'func'=>TRUE),
'sec' => array( 'input'=>'sec', 'tag'=>'mo', 'output'=>'sec', 'unary'=>TRUE, 'func'=>TRUE),
'csc' => array( 'input'=>'csc', 'tag'=>'mo', 'output'=>'csc', 'unary'=>TRUE, 'func'=>TRUE),
'coth' => array( 'input'=>'coth','tag'=>'mo', 'output'=>'coth', 'unary'=>TRUE, 'func'=>TRUE),
'sech' => array( 'input'=>'sech', 'tag'=>'mo', 'output'=>'sech', 'unary'=>TRUE, 'func'=>TRUE),
'csch' => array( 'input'=>'csch', 'tag'=>'mo', 'output'=>'csch', 'unary'=>TRUE, 'func'=>TRUE),
'log' => array( 'input'=>'log', 'tag'=>'mo', 'output'=>'log', 'unary'=>TRUE, 'func'=>TRUE),
'ln' => array( 'input'=>'ln', 'tag'=>'mo', 'output'=>'ln', 'unary'=>TRUE, 'func'=>TRUE),
'det' => array( 'input'=>'det', 'tag'=>'mo', 'output'=>'det', 'unary'=>TRUE, 'func'=>TRUE),
'dim' => array( 'input'=>'dim', 'tag'=>'mo', 'output'=>'dim'),
'mod' => array( 'input'=>'mod', 'tag'=>'mo', 'output'=>'mod'),
'gcd' => array( 'input'=>'gcd', 'tag'=>'mo', 'output'=>'gcd', 'unary'=>TRUE, 'func'=>TRUE),
'lcm' => array( 'input'=>'lcm', 'tag'=>'mo', 'output'=>'lcm', 'unary'=>TRUE, 'func'=>TRUE),
'lub' => array( 'input'=>'lub', 'tag'=>'mo', 'output'=>'lub'), /* 2005-06-11 wes */
'glb' => array( 'input'=>'glb', 'tag'=>'mo', 'output'=>'glb'), /* 2005-06-11 wes */
'min' => array( 'input'=>'min', 'tag'=>'mo', 'output'=>'min', 'underover'=>TRUE), /* 2005-06-11 wes */
'max' => array( 'input'=>'max', 'tag'=>'mo', 'output'=>'max', 'underover'=>TRUE), /* 2005-06-11 wes */
'f' => array( 'input'=>'f','tag'=>'mi', 'output'=>'f', 'unary'=>TRUE, 'func'=>TRUE), //2006-9-7 DL
'g' => array( 'input'=>'g', 'tag'=>'mi', 'output'=>'g', 'unary'=>TRUE, 'func'=>TRUE), //2006-9-7 DL
// Arrows
'uarr' => array( 'input'=>'uarr', 'tag'=>'mo', 'output'=>'&#' . hexdec('2191') . ';'),
'darr' => array( 'input'=>'darr', 'tag'=>'mo', 'output'=>'&#' . hexdec('2193') . ';'),
'rarr' => array( 'input'=>'rarr', 'tag'=>'mo', 'output'=>'&#' . hexdec('2192') . ';'),
'->' => array( 'input'=>'->', 'tag'=>'mo', 'output'=>'&#' . hexdec('2192') . ';'),
'|->' => array( 'input'=>'|->', 'tag'=>'mo', 'output'=>'&#' . hexdec('21A6') . ';'), /* 2005-06-11 wes */
'larr' => array( 'input'=>'larr', 'tag'=>'mo', 'output'=>'&#' . hexdec('2190') . ';'),
'harr' => array( 'input'=>'harr', 'tag'=>'mo', 'output'=>'&#' . hexdec('2194') . ';'),
'rArr' => array( 'input'=>'rArr', 'tag'=>'mo', 'output'=>'&#' . hexdec('21D2') . ';'),
'lArr' => array( 'input'=>'lArr', 'tag'=>'mo', 'output'=>'&#' . hexdec('21D0') . ';'),
'hArr' => array( 'input'=>'hArr', 'tag'=>'mo', 'output'=>'&#' . hexdec('21D4') . ';'),
// Commands with argument
'sqrt' => array( 'input'=>'sqrt', 'tag'=>'msqrt', 'output'=>'sqrt', 'unary'=>TRUE ),
'root' => array( 'input'=>'root', 'tag'=>'mroot', 'output'=>'root', 'binary'=>TRUE ),
'frac' => array( 'input'=>'frac', 'tag'=>'mfrac', 'output'=>'/', 'binary'=>TRUE),
'/' => array( 'input'=>'/', 'tag'=>'mfrac', 'output'=>'/', 'infix'=>TRUE),
'_' => array( 'input'=>'_', 'tag'=>'msub', 'output'=>'_', 'infix'=>TRUE),
'^' => array( 'input'=>'^', 'tag'=>'msup', 'output'=>'^', 'infix'=>TRUE),
'hat' => array( 'input'=>'hat', 'tag'=>'mover', 'output'=>'&#' . hexdec('005E') . ';', 'unary'=>TRUE, 'acc'=>TRUE),
'bar' => array( 'input'=>'bar', 'tag'=>'mover', 'output'=>'&#' . hexdec('00AF') . ';', 'unary'=>TRUE, 'acc'=>TRUE),
'vec' => array( 'input'=>'vec', 'tag'=>'mover', 'output'=>'&#' . hexdec('2192') . ';', 'unary'=>TRUE, 'acc'=>TRUE),
'dot' => array( 'input'=>'dot', 'tag'=>'mover', 'output'=>'.', 'unary'=>TRUE, 'acc'=>TRUE),
'ddot' => array( 'input'=>'ddot', 'tag'=>'mover', 'output'=>'..', 'unary'=>TRUE, 'acc'=>TRUE),
'ul' => array( 'input'=>'ul', 'tag'=>'munder', 'output'=>'&#' . hexdec('0332') . ';', 'unary'=>TRUE, 'acc'=>TRUE),
'avec' => array( 'input'=>'avec', 'tag'=>'munder', 'output'=>'~', 'unary'=>TRUE, 'acc'=>TRUE),
'text' => array( 'input'=>'text', 'tag'=>'mtext', 'output'=>'text', 'unary'=>TRUE),
'mbox' => array( 'input'=>'mbox', 'tag'=>'mtext', 'output'=>'mbox', 'unary'=>TRUE),
'"' => array( 'input'=>'"', 'tag'=>'mtext','output'=>'mbox', 'unary'=>TRUE),
/* 2005-06-05 wes: added stackrel */
'stackrel' => array( 'input'=>'stackrel', 'tag'=>'mover', 'output'=>'stackrel', 'binary'=>TRUE),
// Grouping brackets
'(' => array( 'input'=>'(', 'tag'=>'mo', 'output'=>'(', 'left_bracket'=>TRUE),
')' => array( 'input'=>')', 'tag'=>'mo', 'output'=>')', 'right_bracket'=>TRUE),
'[' => array( 'input'=>'[', 'tag'=>'mo', 'output'=>'[', 'left_bracket'=>TRUE),
']' => array( 'input'=>']', 'tag'=>'mo', 'output'=>']', 'right_bracket'=>TRUE),
'{' => array( 'input'=>'{', 'tag'=>'mo', 'output'=>'{', 'left_bracket'=>TRUE),
'}' => array( 'input'=>'}', 'tag'=>'mo', 'output'=>'}', 'right_bracket'=>TRUE),
'(:' => array( 'input'=>'(:', 'tag'=>'mo', 'output'=>'&#' . hexdec('2329') . ';', 'left_bracket'=>TRUE),
':)' => array( 'input'=>':)', 'tag'=>'mo', 'output'=>'&#' . hexdec('232A') . ';', 'right_bracket'=>TRUE),
'{:' => array( 'input'=>'{:', 'tag'=>'mo', 'output'=>'{:', 'left_bracket'=>TRUE, 'invisible'=>TRUE),
':}' => array( 'input'=>':}', 'tag'=>'mo', 'output'=>':}', 'right_bracket'=>TRUE ,'invisible'=>TRUE),
'<<' => array( 'input'=>'<<', 'tag'=>'mo', 'output'=>'&#' . hexdec('2329') . ';', 'left_bracket'=>TRUE), // 2005-06-07 wes
'>>' => array( 'input'=>'>>', 'tag'=>'mo', 'output'=>'&#' . hexdec('232A') . ';', 'right_bracket'=>TRUE) // 2005-06-07 wes
);
?>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,86 @@
/* March 19, 2004 MathHTML (c) Peter Jipsen http://www.chapman.edu/~jipsen
This program 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; either version 2 of the License, or (at
your option) any later version.
This program 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
(at http://www.gnu.org/copyleft/gpl.html) for more details.*/
function convertMath(node) {// for Gecko
if (node.nodeType==1) {
var newnode =
document.createElementNS("http://www.w3.org/1998/Math/MathML",
node.nodeName.toLowerCase());
for(var i=0; i < node.attributes.length; i++) {
if (node.attributes[i].nodeName == 'displaystyle') {
newnode.setAttribute(node.attributes[i].nodeName,node.attributes[i].nodeValue);
}
}
for (var i=0; i<node.childNodes.length; i++) {
var st = node.childNodes[i].nodeValue;
if (st==null || st.slice(0,1)!=" " && st.slice(0,1)!="\n")
newnode.appendChild(convertMath(node.childNodes[i]));
}
return newnode;
}
else return node;
}
function convert() {
if (document.createElementNS) {
var mmlnode = document.getElementsByTagName("span");
for (var i=0; i<mmlnode.length; i++) {
var tmp_node = mmlnode[i];
if (tmp_node.className == 'asciimath') {
tmp_node.replaceChild(convertMath(tmp_node.firstChild),tmp_node.firstChild);
/*
for (var j=0;j<tmp_node.childNodes.length;j++) {
if (tmp_node.childNodes[j].nodeType != 3) {
}
}
*/
}
}
} else {
var st,node,newnode;
var mmlnode = document.getElementsByTagName("math");
for (var i=0; i<mmlnode.length; i++) {
var str = "";
node = mmlnode[i];
while (node.nodeName!="/MATH" && node.nextSibling) {
st = node.nodeName.toLowerCase();
if (st=="#text") {
str += node.nodeValue;
} else {
str += (st.slice(0,1)=="/" ? "</m:"+st.slice(1) : "<m:"+st);
if (st.slice(0,1)!="/") {
for(var j=0; j < node.attributes.length; j++) {
if (node.attributes[j].nodeValue!="italic" &&
node.attributes[j].nodeValue!="" &&
node.attributes[j].nodeValue!="inherit" &&
node.attributes[j].nodeValue!=undefined) {
str += " "+node.attributes[j].nodeName+"="+
"\""+node.attributes[j].nodeValue+"\"";
}
}
}
str += ">";
}
node = node.nextSibling;
node.parentNode.removeChild(node.previousSibling);
}
if (str != '') {
str += "</m:math>";
newnode = document.createElement("span");
node.parentNode.replaceChild(newnode,node);
newnode.innerHTML = str;
}
}
}
}

View File

@ -0,0 +1 @@
* -crlf

View File

@ -0,0 +1,26 @@
Revision history for Perl extension HTML::Toc.
2001-09-03 Freddy Vulto <fvu@fvu.myweb.nl>
Release 0.91
- Tested on Cygwin.
- Used Unix file type for source files.
- Updated documentation.
- Prohibited call with undefined parameter to HTML::Parser->parse() from
HTML::_tokenTocEndParser->parse() which caused havoc with version 3.25
of HTML::Parser.
- Specified 'HTML::Parser' as module that needs to be available in order
to use HTML::Toc.
- Added protected method HTML::TocGenerator::_setActiveAnchorName().
This method replaces the incongruous access of
'HTML::TocUpdator::_doDeleteTokens' by HTML::TocGenerator.
HTML::TocUpdator now overrides '_setActiveAnchorName()' to allow
the ancestor call to HTML::TocGenerator only when '_doDeleteTokens'
equals false.
2001-08-09 Freddy Vulto <fvu@fvu.myweb.nl>
Release 0.90
- First release.

View File

@ -0,0 +1,26 @@
Changes
Toc.pod
Toc.pm
TocGenerator.pm
TocInsertor.pm
TocUpdator.pm
Makefile.PL
MANIFEST
t/extend.t
t/format.t
t/generate.t
t/insert.t
t/manualTest.t
t/options.t
t/podExamples.t
t/propagate.t
t/siteMap.t
t/update.t
t/ManualTest/manualTest1.htm
t/SiteMap/index.htm
t/SiteMap/SubDir1/index.htm
t/SiteMap/SubDir1/SubSubDir1/index.htm
t/SiteMap/SubDir2/index.htm
t/SiteMap/SubDir2/SubSubDir1/index.htm
t/SiteMap/SubDir2/SubSubDir2/index.htm
t/SiteMap/SubDir3/index.htm

View File

@ -0,0 +1,8 @@
use ExtUtils::MakeMaker;
WriteMakefile(
'NAME' => 'HTML::Toc',
'VERSION_FROM' => 'Toc.pm',
'PREREQ_PM' => {'HTML::Parser' => 0},
'MAN3PODS' => {},
);

View File

@ -0,0 +1,549 @@
#=== HTML::Toc ================================================================
# function: HTML Table of Contents
package HTML::Toc;
use strict;
BEGIN {
use vars qw($VERSION);
$VERSION = '0.91';
}
use constant FILE_FILTER => '.*';
use constant GROUP_ID_H => 'h';
use constant LEVEL_1 => 1;
use constant NUMBERING_STYLE_DECIMAL => 'decimal';
# Templates
# Anchor templates
use constant TEMPLATE_ANCHOR_NAME => '$groupId."-".$node';
use constant TEMPLATE_ANCHOR_HREF_BEGIN =>
'"<a href=#$anchorName>"';
use constant TEMPLATE_ANCHOR_HREF_BEGIN_FILE =>
'"<a href=$file#$anchorName>"';
use constant TEMPLATE_ANCHOR_HREF_END => '"</a>"';
use constant TEMPLATE_ANCHOR_NAME_BEGIN =>
'"<a name=$anchorName>"';
use constant TEMPLATE_ANCHOR_NAME_END => '"</a>"';
use constant TOKEN_UPDATE_BEGIN_OF_ANCHOR_NAME_BEGIN =>
'<!-- #BeginTocAnchorNameBegin -->';
use constant TOKEN_UPDATE_END_OF_ANCHOR_NAME_BEGIN =>
'<!-- #EndTocAnchorNameBegin -->';
use constant TOKEN_UPDATE_BEGIN_OF_ANCHOR_NAME_END =>
'<!-- #BeginTocAnchorNameEnd -->';
use constant TOKEN_UPDATE_END_OF_ANCHOR_NAME_END =>
'<!-- #EndTocAnchorNameEnd -->';
use constant TOKEN_UPDATE_BEGIN_NUMBER =>
'<!-- #BeginTocNumber -->';
use constant TOKEN_UPDATE_END_NUMBER =>
'<!-- #EndTocNumber -->';
use constant TOKEN_UPDATE_BEGIN_TOC =>
'<!-- #BeginToc -->';
use constant TOKEN_UPDATE_END_TOC =>
'<!-- #EndToc -->';
use constant TEMPLATE_TOKEN_NUMBER => '"$node &nbsp;"';
# Level templates
use constant TEMPLATE_LEVEL => '"<li>$text\n"';
use constant TEMPLATE_LEVEL_BEGIN => '"<ul>\n"';
use constant TEMPLATE_LEVEL_END => '"</ul>\n"';
END {}
#--- HTML::Toc::new() ---------------------------------------------------------
# function: Constructor
sub new {
# Get arguments
my ($aType) = @_;
# Local variables
my $self;
$self = bless({}, $aType);
# Default to empty 'options' array
$self->{options} = {};
# Empty toc
$self->{_toc} = "";
# Hash reference to array for each groupId, each array element
# referring to the group of the level indicated by the array index.
# For example, with the default 'tokenGroups', '_levelGroups' would
# look like:
#
# {'h'} => [\$group1, \$group2, \$group3, \$group4, \$group5, \$group6];
#
$self->{_levelGroups} = undef;
# Set default options
$self->_setDefaults();
return $self;
} # new()
#--- HTML::Toc::_compareLevels() ----------------------------------------------
# function: Compare levels.
# args: - $aLevel: pointer to level
# - $aGroupLevel
# - $aPreviousLevel
# - $aPreviousGroupLevel
# returns: 0 if new level equals previous level, 1 if new level exceeds
# previous level, -1 if new level is smaller then previous level.
sub _compareLevels {
# Get arguments
my (
$self, $aLevel, $aPreviousLevel, $aGroupLevel, $aPreviousGroupLevel
) = @_;
# Local variables
my ($result);
# Levels equals?
if (
($aLevel == $aPreviousLevel) &&
($aGroupLevel == $aPreviousGroupLevel)
) {
# Yes, levels are equals;
# Indicate so
$result = 0;
}
else {
# No, levels differ;
# Bias to new level being smaller than previous level;
$result = -1;
# Must groups not be nested and do group levels differ?
if (
($self->{options}{'doNestGroup'} == 0) &&
($aGroupLevel != $aPreviousGroupLevel)
) {
# Yes, groups must be kept apart and the group levels differ;
# Level is greater than previous level?
if (
($aLevel > $aPreviousLevel)
) {
# Yes, level is greater than previous level;
# Indicate so
$result = 1;
}
}
else {
# No, group must be nested;
# Level is greater than previous level?
if (
($aLevel > $aPreviousLevel) ||
($aGroupLevel > $aPreviousGroupLevel)
) {
# Yes, level is greater than previous level;
# Indicate so
$result = 1;
}
}
}
# Return value
return $result;
} # _compareLevels()
#--- HTML::TocGenerator::_formatLevelIndent() ---------------------------------
# function: Format indent.
# args: - $aText: text to indent
# - $aLevel: Level.
# - $aGroupLevel: Group level.
# - $aAdd
# - $aGlobalLevel
sub _formatLevelIndent {
# Get arguments
my ($self, $aText, $aAdd, $aGlobalLevel) = @_;
# Local variables
my ($levelIndent, $indent, $nrOfIndents);
# Alias indentation option
$levelIndent = $self->{options}{'levelIndent'}; #=~ s/[0-9]+/&/;
# Calculate number of indents
$nrOfIndents = ($aGlobalLevel + $aAdd) * $levelIndent;
# Assemble indents
$indent = pack("A$nrOfIndents");
# Return value
return $indent . $aText;
} # _formatLevelIndent()
#--- HTML::Toc::_formatToc() --------------------------------------------------
# function: Format ToC.
# args: - aPreviousLevel
# - aPreviousGroupLevel
# - aToc: ToC to format.
# - aHeaderLines
# note: Recursive function this is.
sub _formatToc {
# Get arguments
my (
$self, $aPreviousLevel, $aPreviousGroupLevel, $aToc, $aHeaderLines,
$aGlobalLevel
) = @_;
# Local variables
my ($level, $groupLevel, $line, $groupId, $text, $compareStatus);
my ($anchorName, $globalLevel, $node, $sequenceNr);
LOOP: {
# Lines need processing?
while (scalar(@$aHeaderLines) > 0) {
# Yes, lines need processing;
# Get line
$line = shift @$aHeaderLines;
# Determine levels
($level, $groupLevel, $groupId, $node, $sequenceNr,
$anchorName, $text) = split(
/ /, $line, 7
);
# Must level and group be processed?
if (
($level =~ m/$self->{options}{'levelToToc'}/) &&
($groupId =~ m/$self->{options}{'groupToToc'}/)
) {
# Yes, level must be processed;
# Compare levels
$compareStatus = $self->_compareLevels(
$level, $aPreviousLevel, $groupLevel, $aPreviousGroupLevel
);
COMPARE_LEVELS: {
# Equals?
if ($compareStatus == 0) {
# Yes, levels are equal;
# Format level
$$aToc .= $self->_formatLevelIndent(
ref($self->{_templateLevel}) eq "CODE" ?
&{$self->{_templateLevel}}(
$level, $groupId, $node, $sequenceNr, $text
) :
eval($self->{_templateLevel}),
0, $aGlobalLevel
);
}
# Greater?
if ($compareStatus > 0) {
# Yes, new level is greater than previous level;
# Must level be single-stepped?
if (
$self->{options}{'doSingleStepLevel'} &&
($aPreviousLevel) &&
($level > $aPreviousLevel)
) {
# Yes, level must be single-stepped;
# Make sure, new level is increased one step only
$level = $aPreviousLevel + 1;
}
# Increase global level
$aGlobalLevel++;
# Format begin of level
$$aToc .= $self->_formatLevelIndent(
eval($self->{_templateLevelBegin}), -1, $aGlobalLevel
);
# Process line again
unshift @$aHeaderLines, $line;
# Assemble TOC (recursive) for next level
$self->_formatToc(
$level, $groupLevel, $aToc, $aHeaderLines, $aGlobalLevel
);
# Format end of level
$$aToc .= $self->_formatLevelIndent(
eval($self->{_templateLevelEnd}), -1, $aGlobalLevel
);
# Decrease global level
$aGlobalLevel--;
# Exit loop
last COMPARE_LEVELS;
}
# Smaller?
if ($compareStatus < 0) {
# Yes, new level is smaller than previous level;
# Process line again
unshift @$aHeaderLines, $line;
# End loop
last LOOP;
}
}
}
}
}
} # _formatToc()
#--- HTML::Toc::_parseTokenGroups() -------------------------------------------
# function: Parse token groups
sub _parseTokenGroups {
# Get arguments
my ($self) = @_;
# Local variables
my ($group, $levelGroups, $numberingStyle);
# Clear any previous 'levelGroups'
$self->{_levelGroups} = undef;
# Determine default 'numberingStyle'
$numberingStyle = defined($self->{options}{'numberingStyle'}) ?
$self->{options}{'numberingStyle'} : NUMBERING_STYLE_DECIMAL;
# Loop through groups
foreach $group (@{$self->{options}{'tokenToToc'}}) {
# 'groupId' is specified?
if (! defined($group->{'groupId'})) {
# No, 'groupId' isn't specified;
# Set default groupId
$group->{'groupId'} = GROUP_ID_H;
}
# 'level' is specified?
if (! defined($group->{'level'})) {
# No, 'level' isn't specified;
# Set default level
$group->{'level'} = LEVEL_1;
}
# 'numberingStyle' is specified?
if (! defined($group->{'numberingStyle'})) {
# No, 'numberingStyle' isn't specified;
# Set default numberingStyle
$group->{'numberingStyle'} = $numberingStyle;
}
# Add group to '_levelGroups' variabele
$self->{_levelGroups}{$group->{'groupId'}}[$group->{'level'} - 1] =
$group;
}
} # _parseTokenGroups()
#--- HTML::Toc::_setDefaults() ------------------------------------------------
# function: Set default options.
sub _setDefaults {
# Get arguments
my ($self) = @_;
# Set default options
$self->setOptions(
{
'attributeToExcludeToken' => '-',
'attributeToTocToken' => '@',
'insertionPoint' => 'after <body>',
'levelToToc' => '.*',
'groupToToc' => '.*',
'doNumberToken' => 0,
'doLinkToFile' => 0,
'doLinkToToken' => 1,
'doLinkToId' => 0,
'doSingleStepLevel' => 1,
'linkUri' => '',
'levelIndent' => 3,
'doNestGroup' => 0,
'doUseExistingAnchors' => 1,
'doUseExistingIds' => 1,
'tokenToToc' => [
{
'level' => 1,
'tokenBegin' => '<h1>'
}, {
'level' => 2,
'tokenBegin' => '<h2>'
}, {
'level' => 3,
'tokenBegin' => '<h3>'
}, {
'level' => 4,
'tokenBegin' => '<h4>'
}, {
'level' => 5,
'tokenBegin' => '<h5>'
}, {
'level' => 6,
'tokenBegin' => '<h6>'
}
],
'header' =>
"\n<!-- Table of Contents generated by Perl - HTML::Toc -->\n",
'footer' =>
"\n<!-- End of generated Table of Contents -->\n",
}
);
} # _setDefaults()
#--- HTML::Toc::clear() -------------------------------------------------------
# function: Clear ToC.
sub clear {
# Get arguments
my ($self) = @_;
# Clear ToC
$self->{_toc} = "";
$self->{toc} = "";
$self->{groupIdLevels} = undef;
$self->{levels} = undef;
} # clear()
#--- HTML::Toc::format() ------------------------------------------------------
# function: Format ToC.
# returns: Formatted ToC.
sub format {
# Get arguments
my ($self) = @_;
# Local variables;
my $toc = "";
my @tocLines = split(/\r\n|\n/, $self->{_toc});
# Format table of contents
$self->_formatToc("0", "0", \$toc, \@tocLines, 0);
# Remove last newline
$toc =~ s/\n$//m;
# Add header & footer
$toc = $self->{options}{'header'} . $toc . $self->{options}{'footer'};
# Return value
return $toc;
} # format()
#--- HTML::Toc::parseOptions() ------------------------------------------------
# function: Parse options.
sub parseOptions {
# Get arguments
my ($self) = @_;
# Alias options
my $options = $self->{options};
# Parse token groups
$self->_parseTokenGroups();
# Link ToC to tokens?
if ($self->{options}{'doLinkToToken'}) {
# Yes, link ToC to tokens;
# Determine anchor href template begin
$self->{_templateAnchorHrefBegin} =
defined($options->{'templateAnchorHrefBegin'}) ?
$options->{'templateAnchorHrefBegin'} :
$options->{'doLinkToFile'} ?
TEMPLATE_ANCHOR_HREF_BEGIN_FILE : TEMPLATE_ANCHOR_HREF_BEGIN;
# Determine anchor href template end
$self->{_templateAnchorHrefEnd} =
defined($options->{'templateAnchorHrefEnd'}) ?
$options->{'templateAnchorHrefEnd'} :
TEMPLATE_ANCHOR_HREF_END;
# Determine anchor name template
$self->{_templateAnchorName} =
defined($options->{'templateAnchorName'}) ?
$options->{'templateAnchorName'} :
TEMPLATE_ANCHOR_NAME;
# Determine anchor name template begin
$self->{_templateAnchorNameBegin} =
defined($options->{'templateAnchorNameBegin'}) ?
$options->{'templateAnchorNameBegin'} :
TEMPLATE_ANCHOR_NAME_BEGIN;
# Determine anchor name template end
$self->{_templateAnchorNameEnd} =
defined($options->{'templateAnchorNameEnd'}) ?
$options->{'templateAnchorNameEnd'} :
TEMPLATE_ANCHOR_NAME_END;
}
# Determine token number template
$self->{_templateTokenNumber} =
defined($options->{'templateTokenNumber'}) ?
$options->{'templateTokenNumber'} :
TEMPLATE_TOKEN_NUMBER;
# Determine level template
$self->{_templateLevel} =
defined($options->{'templateLevel'}) ?
$options->{'templateLevel'} :
TEMPLATE_LEVEL;
# Determine level begin template
$self->{_templateLevelBegin} =
defined($options->{'templateLevelBegin'}) ?
$options->{'templateLevelBegin'} :
TEMPLATE_LEVEL_BEGIN;
# Determine level end template
$self->{_templateLevelEnd} =
defined($options->{'templateLevelEnd'}) ?
$options->{'templateLevelEnd'} :
TEMPLATE_LEVEL_END;
# Determine 'anchor name begin' begin update token
$self->{_tokenUpdateBeginOfAnchorNameBegin} =
defined($options->{'tokenUpdateBeginOfAnchorNameBegin'}) ?
$options->{'tokenUpdateBeginOfAnchorNameBegin'} :
TOKEN_UPDATE_BEGIN_OF_ANCHOR_NAME_BEGIN;
# Determine 'anchor name begin' end update token
$self->{_tokenUpdateEndOfAnchorNameBegin} =
defined($options->{'tokenUpdateEndOfAnchorNameBegin'}) ?
$options->{'tokenUpdateEndOfAnchorNameBegin'} :
TOKEN_UPDATE_END_OF_ANCHOR_NAME_BEGIN;
# Determine 'anchor name end' begin update token
$self->{_tokenUpdateBeginOfAnchorNameEnd} =
defined($options->{'tokenUpdateBeginOfAnchorNameEnd'}) ?
$options->{'tokenUpdateBeginOfAnchorNameEnd'} :
TOKEN_UPDATE_BEGIN_OF_ANCHOR_NAME_END;
# Determine 'anchor name end' end update token
$self->{_tokenUpdateEndOfAnchorNameEnd} =
defined($options->{'tokenUpdateEndOfAnchorNameEnd'}) ?
$options->{'tokenUpdateEndOfAnchorNameEnd'} :
TOKEN_UPDATE_END_OF_ANCHOR_NAME_END;
# Determine number begin update token
$self->{_tokenUpdateBeginNumber} =
defined($options->{'tokenUpdateBeginNumber'}) ?
$options->{'tokenUpdateBeginNumber'} :
TOKEN_UPDATE_BEGIN_NUMBER;
# Determine number end update token
$self->{_tokenUpdateEndNumber} =
defined($options->{'tokenUpdateEndNumber'}) ?
$options->{'tokenUpdateEndNumber'} :
TOKEN_UPDATE_END_NUMBER;
# Determine toc begin update token
$self->{_tokenUpdateBeginToc} =
defined($options->{'tokenUpdateBeginToc'}) ?
$options->{'tokenUpdateBeginToc'} :
TOKEN_UPDATE_BEGIN_TOC;
# Determine toc end update token
$self->{_tokenUpdateEndToc} =
defined($options->{'tokenUpdateEndToc'}) ?
$options->{'tokenUpdateEndToc'} :
TOKEN_UPDATE_END_TOC;
} # parseOptions()
#--- HTML::Toc::setOptions() --------------------------------------------------
# function: Set options.
# args: - aOptions: Reference to hash containing options.
sub setOptions {
# Get arguments
my ($self, $aOptions) = @_;
# Add options
%{$self->{options}} = (%{$self->{options}}, %$aOptions);
} # setOptions()
1;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,693 @@
#==== HTML::TocUpdator ========================================================
# function: Update 'HTML::Toc' table of contents.
# note: - 'TUT' is an abbreviation of 'Toc Update Token'.
package HTML::TocUpdator;
use strict;
use HTML::TocInsertor;
BEGIN {
use vars qw(@ISA $VERSION);
$VERSION = '0.91';
@ISA = qw(HTML::TocInsertor);
}
use constant TUT_TOKENTYPE_START => 0;
use constant TUT_TOKENTYPE_END => 1;
use constant TUT_TOKENTYPE_TEXT => 2;
use constant TUT_TOKENTYPE_COMMENT => 3;
use constant MODE_DO_NOTHING => 0; # 0b00
use constant MODE_DO_INSERT => 1; # 0b01
use constant MODE_DO_UPDATE => 3; # 0b11
END {}
#--- HTML::TocUpdator::new() --------------------------------------------------
# function: Constructor.
sub new {
# Get arguments
my ($aType) = @_;
my $self = $aType->SUPER::new;
# Bias to not update ToC
$self->{htu__Mode} = MODE_DO_NOTHING;
# Bias to not delete tokens
$self->{_doDeleteTokens} = 0;
# Reset batch variables
#$self->_resetBatchVariables;
$self->{options} = {};
# TODO: Initialize output
return $self;
} # new()
#--- HTML::TocUpdator::_deinitializeUpdatorBatch() --------------------------
# function: Deinitialize updator batch.
# args: - $aTocs: Reference to array of tocs.
sub _deinitializeUpdatorBatch {
# Get arguments
my ($self, $aTocs) = @_;
# Indicate end of ToC updating
$self->{htu__Mode} = MODE_DO_NOTHING;
# Deinitialize insertor batch
$self->_deinitializeInsertorBatch();
} # _deinitializeUpdatorBatch()
#--- HTML::TokenUpdator::_doesHashEqualHash() ---------------------------------
# function: Determines whether hash1 equals hash2.
# args: - $aHash1
# - $aHash2
# returns: True (1) if hash1 equals hash2, 0 if not. For example, with the
# following hashes:
#
# %hash1 = { %hash2 = {
# 'class' => 'header', 'class' => 'header',
# 'id' => 'intro1' 'id' => 'intro2'
# } }
#
# the routine will return 0, cause the hash fields 'id' differ.
# note: Class function.
sub _doesHashEqualHash {
# Get arguments
my ($aHash1, $aHash2) = @_;
# Local variables
my ($key1, $value1, $key2, $value2, $result);
# Bias to success
$result = 1;
# Loop through hash1 while values available
HASH1: while (($key1, $value1) = each %$aHash1) {
# Yes, values are available;
# Value1 differs from value2?
if ($value1 ne $aHash2->{$key1}) {
# Yes, hashes differ;
# Indicate condition fails
$result = 0;
# Reset 'each' iterator which we're going to break
keys %$aHash2;
# Break loop
last HASH1;
}
}
# Return value
return $result;
} # _doesHashEqualHash()
#--- HTML::TokenUpdator::_doesTagExistInArray() -------------------------------
# function: Check whether tag & attributes matches any of the tags & attributes
# in the specified array. The array must consist of elements with
# format:
#
# [$tag, \%attributes]
#
# args: - $aTag: tag to search for
# - $aAttributes: tag attributes to search for
# - $aArray: Array to search in.
# returns: 1 if tag does exist in array, 0 if not.
# note: Class function.
sub _doesTagExistInArray {
# Get arguments
my ($aTag, $aAttributes, $aArray) = @_;
# Local variables
my ($tag, $result);
# Bias to non-existing tag
$result = 0;
# Loop through existing tags
TAG: foreach $tag (@{$aArray}) {
if (defined(@{$tag}[0])) {
# Does tag equals any existing tag?
if ($aTag eq @{$tag}[0]) {
# Yes, tag equals existing tag;
# Do hashes equal?
if (HTML::TocUpdator::_doesHashEqualHash(
$aAttributes, @{$tag}[1]
)) {
# Yes, hashes are the same;
# Indicate tag exists in array
$result = 1;
# Break loop
last TAG;
}
}
}
}
# Return value
return $result;
} # _doesTagExistInArray()
#--- HTML::TocUpdator::_initializeUpdatorBatch() ----------------------------
# function: Initialize insertor batch.
# args: - $aMode: Mode. Can be either MODE_DO_INSERT or MODE_DO_UPDATE
# - $aTocs: Reference to array of tocs.
# - $aOptions: optional options
# note: Updating actually means: deleting the old ToC and inserting a new
# ToC. That's why we're calling 'insertor' methods here.
sub _initializeUpdatorBatch {
# Get arguments
my ($self, $aMode, $aTocs, $aOptions) = @_;
# Initialize insertor batch
$self->_initializeInsertorBatch($aTocs, $aOptions);
# Parse ToC update templates
$self->_parseTocUpdateTokens();
# Indicate start of ToC updating
$self->{htu__Mode} = $aMode;
} # _initializeUpdatorBatch()
#--- HTML::TocUpdator::_parseTocUpdateTokens() --------------------------------
# function: Parse ToC insertion point specifier.
sub _parseTocUpdateTokens {
# Get arguments
my ($self) = @_;
# Local variables
my ($toc, $tokenType, $tokenPreposition, $token);
my ($tocInsertionPoint, $tocInsertionPointTokenAttributes);
# Create parser for update begin tokens
my $tokenUpdateBeginParser = HTML::_TokenUpdateParser->new(
$self->{_tokensUpdateBegin}
);
# Create parser for update end tokens
my $tokenUpdateEndParser = HTML::_TokenUpdateParser->new(
$self->{_tokensUpdateEnd}
);
# Loop through ToCs
foreach $toc (@{$self->{_tocs}}) {
# Parse update tokens
$tokenUpdateBeginParser->parse(
$toc->{_tokenUpdateBeginOfAnchorNameBegin}
);
$tokenUpdateBeginParser->parse($toc->{_tokenUpdateBeginOfAnchorNameEnd});
$tokenUpdateBeginParser->parse($toc->{_tokenUpdateBeginNumber});
$tokenUpdateBeginParser->parse($toc->{_tokenUpdateBeginToc});
$tokenUpdateEndParser->parse($toc->{_tokenUpdateEndOfAnchorNameBegin});
$tokenUpdateEndParser->parse($toc->{_tokenUpdateEndOfAnchorNameEnd});
$tokenUpdateEndParser->parse($toc->{_tokenUpdateEndNumber});
$tokenUpdateEndParser->parse($toc->{_tokenUpdateEndToc});
}
} # _parseTocUpdateTokens()
#--- HTML::TocUpdator::_resetBatchVariables() ---------------------------------
# function: Reset batch variables
sub _resetBatchVariables {
# Get arguments
my ($self) = @_;
# Call ancestor
$self->SUPER::_resetBatchVariables();
# Arrays containing start, end, comment & text tokens which indicate
# the begin of ToC tokens. The tokens are stored in keys of hashes to
# avoid storing duplicates as an array would.
$self->{_tokensUpdateBegin} = [
[], # ['<start tag>', <attributes>]
{}, # {'<end tag>' => ''}
{}, # {'<text>' => ''}
{} # {'<comment>' => ''}
];
# Arrays containing start, end, comment & text tokens which indicate
# the end of ToC tokens. The tokens are stored in keys of hashes to
# avoid storing duplicates as an array would.
$self->{_tokensUpdateEnd} = [
[], # ['<start tag>', <attributes>]
{}, # {'<end tag>' => ''}
{}, # {'<text>' => ''}
{} # {'<comment>' => ''}
];
} # _resetBatchVariables()
#--- HTML::TocUpdator::_setActiveAnchorName() ---------------------------------
# function: Set active anchor name.
# args: - aAnchorName: Name of anchor name to set active.
sub _setActiveAnchorName {
# Get arguments
my ($self, $aAnchorName) = @_;
# Are tokens being deleted?
if (! $self->{_doDeleteTokens}) {
# No, tokens aren't being deleted;
# Call ancestor to set anchor name
$self->SUPER::_setActiveAnchorName($aAnchorName);
}
} # _setActiveAnchorName()
#--- HTML::TocUpdator::_update() ----------------------------------------------
# function: Update ToC in string.
# args: - $aMode: Mode. Can be either MODE_DO_UPDATE or MODE_DO_INSERT.
# - $aToc: (reference to array of) ToC object to update
# - $aString: string to update ToC of
# - $aOptions: optional updator options
# note: Used internally.
sub _update {
# Get arguments
my ($self, $aMode, $aToc, $aString, $aOptions) = @_;
# Initialize TocUpdator batch
$self->_initializeUpdatorBatch($aMode, $aToc, $aOptions);
# Start updating ToC by starting ToC insertion
$self->_insert($aString);
# Deinitialize TocUpdator batch
$self->_deinitializeUpdatorBatch();
} # update()
#--- HTML::TocUpdator::_updateFile() ------------------------------------------
# function: Update ToCs in file.
# args: - $aMode: Mode. Can be either MODE_DO_UPDATE or MODE_DO_INSERT.
# - $aToc: (reference to array of) ToC object to update
# - $aFile: (reference to array of) file to parse for updating.
# - $aOptions: optional updator options
# note: Used internally.
sub _updateFile {
# Get arguments
my ($self, $aMode, $aToc, $aFile, $aOptions) = @_;
# Initialize TocUpdator batch
$self->_initializeUpdatorBatch($aMode, $aToc, $aOptions);
# Start updating ToC by starting ToC insertion
$self->_insertIntoFile($aFile);
# Deinitialize TocUpdator batch
$self->_deinitializeUpdatorBatch();
} # _updateFile()
#--- HTML::TocUpdator::_writeOrBufferOutput() ---------------------------------
# function: Write processed HTML to output device(s).
# args: - aOutput: scalar to write
sub _writeOrBufferOutput {
# Get arguments
my ($self, $aOutput) = @_;
# Delete output?
if (! $self->{_doDeleteTokens}) {
# No, don't delete output;
# Call ancestor
$self->SUPER::_writeOrBufferOutput($aOutput);
}
} # _writeOrBufferOutput()
#--- HTML::TocUpdator::anchorNameBegin() --------------------------------------
# function: Process 'anchor name begin' generated by HTML::Toc.
# args: - $aAnchorName: Anchor name begin tag to output.
# - $aToc: Reference to ToC to which anchorname belongs.
sub anchorNameBegin {
# Get arguments
my ($self, $aAnchorNameBegin, $aToc) = @_;
# Call ancestor
$self->SUPER::anchorNameBegin($aAnchorNameBegin);
# Must ToC be inserted or updated?
if ($self->{htu__Mode} != MODE_DO_NOTHING) {
# Yes, ToC must be inserted or updated;
# Surround anchor name with update tags
$self->{_outputPrefix} =
$aToc->{_tokenUpdateBeginOfAnchorNameBegin} .
$self->{_outputPrefix} .
$aToc->{_tokenUpdateEndOfAnchorNameBegin};
}
} # anchorNameBegin()
#--- HTML::TocUpdator::anchorNameEnd() ----------------------------------------
# function: Process 'anchor name end' generated by HTML::Toc.
# args: - $aAnchorNameEnd: Anchor name end tag to output.
# - $aToc: Reference to ToC to which anchorname belongs.
sub anchorNameEnd {
# Get arguments
my ($self, $aAnchorNameEnd, $aToc) = @_;
# Call ancestor
$self->SUPER::anchorNameEnd($aAnchorNameEnd);
# Must ToC be inserted or updated?
if ($self->{htu__Mode} != MODE_DO_NOTHING) {
# Yes, ToC must be inserted or updated;
# Surround anchor name with update tags
$self->{_outputSuffix} =
$aToc->{_tokenUpdateBeginOfAnchorNameEnd} .
$self->{_outputSuffix} .
$aToc->{_tokenUpdateEndOfAnchorNameEnd};
}
} # anchorNameEnd()
#--- HTML::TocUpdator::comment() ----------------------------------------------
# function: Process comment.
# args: - $aComment: comment text with '<!--' and '-->' tags stripped off.
sub comment {
# Get arguments
my ($self, $aComment) = @_;
# Must ToC be updated?
if ($self->{htu__Mode} == MODE_DO_UPDATE) {
# Yes, ToC must be updated;
# Updator is currently deleting tokens?
if ($self->{_doDeleteTokens}) {
# Yes, tokens must be deleted;
# Call ancestor
$self->SUPER::comment($aComment);
# Look for update end token
# Does comment matches update end token?
if (defined(
$self->{_tokensUpdateEnd}[TUT_TOKENTYPE_COMMENT]{$aComment}
)) {
# Yes, comment matches update end token;
# Indicate to stop deleting tokens
$self->{_doDeleteTokens} = 0;
}
}
else {
# No, tokens mustn't be deleted;
# Look for update begin token
# Does comment matches update begin token?
if (defined(
$self->{_tokensUpdateBegin}[TUT_TOKENTYPE_COMMENT]{$aComment}
)) {
# Yes, comment matches update begin token;
# Indicate to start deleting tokens
$self->{_doDeleteTokens} = 1;
}
# Call ancestor
$self->SUPER::comment($aComment);
}
}
else {
# No, ToC mustn't be updated;
# Call ancestor
$self->SUPER::comment($aComment);
}
} # comment()
#--- HTML::TocUpdator::end() --------------------------------------------------
# function: This function is called every time a closing tag is encountered.
# args: - $aTag: tag name (in lower case).
# - $aOrigText: tag name including brackets.
sub end {
# Get arguments
my ($self, $aTag, $aOrigText) = @_;
# Call ancestor
$self->SUPER::end($aTag, $aOrigText);
# Must ToC be updated?
if ($self->{htu__Mode} == MODE_DO_UPDATE) {
# Yes, ToC must be updated;
# Updator is currently deleting tokens?
if ($self->{_doDeleteTokens}) {
# Yes, tokens must be deleted;
# Does end tag matches update end token?
if (defined(
$self->{_tokensUpdateEnd}[TUT_TOKENTYPE_END]{$aTag}
)) {
# Yes, end tag matches update end token;
# Indicate to stop deleting tokens
$self->{_doDeleteTokens} = 0;
}
}
}
} # end()
#--- HTML::TocUpdator::insert() -----------------------------------------------
# function: Insert ToC in string.
# args: - $aToc: (reference to array of) ToC object to update
# - $aString: string to insert ToC in.
# - $aOptions: optional updator options
sub insert {
# Get arguments
my ($self, $aToc, $aString, $aOptions) = @_;
# Do start insert
$self->_update(MODE_DO_INSERT, $aToc, $aString, $aOptions);
} # insert()
#--- HTML::TocUpdator::insertIntoFile() --------------------------------------
# function: Insert ToC in file.
# args: - $aToc: (reference to array of) ToC object to update
# - $aFile: File to insert ToC in.
# - $aOptions: optional updator options
sub insertIntoFile {
# Get arguments
my ($self, $aToc, $aFile, $aOptions) = @_;
# Do start insert
$self->_updateFile(MODE_DO_INSERT, $aToc, $aFile, $aOptions);
} # insertIntoFile()
#--- HTML::TocUpdator::number() -----------------------------------------------
# function: Process heading number generated by HTML::Toc.
# args: - $aNumber
# - $aToc: Reference to ToC to which anchorname belongs.
sub number {
# Get arguments
my ($self, $aNumber, $aToc) = @_;
# Call ancestor
$self->SUPER::number($aNumber);
# Must ToC be inserted or updated?
if ($self->{htu__Mode} != MODE_DO_NOTHING) {
# Yes, ToC must be inserted or updated;
# Surround number with update tags
$self->{_outputSuffix} =
$aToc->{_tokenUpdateBeginNumber} .
$self->{_outputSuffix} .
$aToc->{_tokenUpdateEndNumber};
}
} # number()
#--- HTML::TocUpdator::start() ------------------------------------------------
# function: This function is called every time an opening tag is encountered.
# args: - $aTag: tag name (in lower case).
# - $aAttr: reference to hash containing all tag attributes (in lower
# case).
# - $aAttrSeq: reference to array containing all tag attributes (in
# lower case) in the original order
# - $aOrigText: the original HTML text
sub start {
# Get arguments
my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_;
# Must ToC be updated?
if ($self->{htu__Mode} == MODE_DO_UPDATE) {
# Yes, ToC must be updated;
# Does start tag matches token update begin tag?
if (HTML::TocUpdator::_doesTagExistInArray(
$aTag, $aAttr, $self->{_tokensUpdateBegin}[TUT_TOKENTYPE_START]
)) {
# Yes, start tag matches token update tag;
# Indicate to delete tokens
$self->{_doDeleteTokens} = 1;
}
}
# Let ancestor process the start tag
$self->SUPER::start($aTag, $aAttr, $aAttrSeq, $aOrigText);
} # start()
#--- HTML::TocUpdator::toc() --------------------------------------------------
# function: Toc processing method. Add toc reference to scenario.
# args: - $aScenario: Scenario to add ToC reference to.
# - $aToc: Reference to ToC to insert.
# note: The ToC hasn't been build yet; only a reference to the ToC to be
# build is inserted.
sub toc {
# Get arguments
my ($self, $aScenario, $aToc) = @_;
# Surround toc with update tokens
# Add update begin token
push(@$aScenario, \$aToc->{_tokenUpdateBeginToc});
# Call ancestor
$self->SUPER::toc($aScenario, $aToc);
# Add update end token
push(@$aScenario, \$aToc->{_tokenUpdateEndToc});
} # toc()
#--- HTML::TocUpdator::_processTocText() --------------------------------------
# function: Toc text processing function.
# args: - $aText: Text to add to ToC.
# - $aToc: ToC to add text to.
sub _processTocText {
# Get arguments
my ($self, $aText, $aToc) = @_;
# Delete output?
if (! $self->{_doDeleteTokens}) {
# No, don't delete output;
# Call ancestor
$self->SUPER::_processTocText($aText, $aToc);
}
} # _processTocText()
#--- HTML::TocUpdator::update() -----------------------------------------------
# function: Update ToC in string.
# args: - $aToc: (reference to array of) ToC object to update
# - $aString: string to update ToC of
# - $aOptions: optional updator options
sub update {
# Get arguments
my ($self, $aToc, $aString, $aOptions) = @_;
# Do start update
$self->_update(MODE_DO_UPDATE, $aToc, $aString, $aOptions);
} # update()
#--- HTML::TocUpdator::updateFile() -------------------------------------------
# function: Update ToC of file.
# args: - $aToc: (reference to array of) ToC object to update
# - $aFile: (reference to array of) file to parse for updating.
# - $aOptions: optional updator options
sub updateFile {
# Get arguments
my ($self, $aToc, $aFile, $aOptions) = @_;
# Do start update
$self->_updateFile(MODE_DO_UPDATE, $aToc, $aFile, $aOptions);
} # update()
#=== HTML::_TokenUpdateParser =================================================
# function: Parse 'update tokens'. 'Update tokens' mark HTML code which is
# inserted by 'HTML::TocInsertor'.
# note: Used internally.
package HTML::_TokenUpdateParser;
BEGIN {
use vars qw(@ISA);
@ISA = qw(HTML::Parser);
}
END {}
#--- HTML::_TokenUpdateParser::new() ------------------------------------------
# function: Constructor
sub new {
# Get arguments
my ($aType, $aTokenArray) = @_;
# Create instance
my $self = $aType->SUPER::new;
# Reference token array
$self->{tokens} = $aTokenArray;
# Return instance
return $self;
} # new()
#--- HTML::_TokenUpdateParser::comment() --------------------------------------
# function: Process comment.
# args: - $aComment: comment text with '<!--' and '-->' tags stripped off.
sub comment {
# Get arguments
my ($self, $aComment) = @_;
# Add token to array of update tokens
$self->{tokens}[HTML::TocUpdator::TUT_TOKENTYPE_COMMENT]{$aComment} = '';
} # comment()
#--- HTML::_TokenUpdateParser::end() ------------------------------------------
# function: This function is called every time a closing tag is encountered
# by HTML::Parser.
# args: - $aTag: tag name (in lower case).
sub end {
# Get arguments
my ($self, $aTag, $aOrigText) = @_;
# Add token to array of update tokens
$self->{tokens}[HTML::TocUpdator::TUT_TOKENTYPE_END]{$aTag} = '';
} # end()
#--- HTML::_TokenUpdateParser::parse() ----------------------------------------
# function: Parse token.
# args: - $aToken: 'update token' to parse
sub parse {
# Get arguments
my ($self, $aString) = @_;
# Call ancestor
$self->SUPER::parse($aString);
} # parse()
#--- HTML::_TokenUpdateParser::start() ----------------------------------------
# function: This function is called every time an opening tag is encountered.
# args: - $aTag: tag name (in lower case).
# - $aAttr: reference to hash containing all tag attributes (in lower
# case).
# - $aAttrSeq: reference to array containing all tag attributes (in
# lower case) in the original order
# - $aOrigText: the original HTML text
sub start {
# Get arguments
my ($self, $aTag, $aAttr, $aAttrSeq, $aOrigText) = @_;
# Does token exist in array?
if (! HTML::TocUpdator::_doesTagExistInArray(
$aTag, $aAttr, $self->{tokens}[HTML::TocUpdator::TUT_TOKENTYPE_START]
)) {
# No, token doesn't exist in array;
# Add token to array of update tokens
push(
@{$self->{tokens}[HTML::TocUpdator::TUT_TOKENTYPE_START]},
[$aTag, $aAttr]
);
}
} # start()
#--- HTML::_TokenUpdateParser::text() -----------------------------------------
# function: This function is called every time plain text is encountered.
# args: - @_: array containing data.
sub text {
# Get arguments
my ($self, $aText) = @_;
# Add token to array of update tokens
$self->{tokens}[HTML::TocUpdator::TUT_TOKENTYPE_TEXT]{$aText} = '';
} # text()
1;

View File

@ -0,0 +1,92 @@
<html>
<head>
<title>Manual</title>
<style type="text/css">
ul.toc_appendix1 {
list-style-type: none;
margin-left: 0;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_h1 {
list-style-type: none;
margin-left: 1;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_h2 {
list-style-type: none;
}
ul.toc_h3 {
list-style-type: none;
}
ul.toc_part1 {
list-style-type: none;
margin-left: 1;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_prelude1 {
list-style: none;
}
p.captionFigure {
font-style: italic;
font-weight: bold;
}
p.captionTable {
font-style: italic;
font-weight: bold;
}
</style>
</head>
<body>
<h1 class=prelude>Preface</h1>
Better C than never.
<h1 class=hidden>Table of Contents</h1>
<!-- Table of Contents -->
<h1 class=prelude>Table of Figures</h1>
<!-- Table of Figures -->
<h1 class=prelude>Table of Tables</h1>
<!-- Table of Tables -->
<h1 class=prelude>Introduction</h1>
Thanks to standardisation and the excellent work of the QWERTY corporation it is possible to learn C with almost any C manual.
<p class=captionTable>Compile Steps</p>
<ul><pre>
Parser
Compiler
Linker
</pre></ul>
<h1 class=part>Disks</h1>
<h1>Compiler Disk v1</h1>
<img src=img.gif alt="Contents Compiler Disk v1">
<p class=captionFigure>Contents Compiler Disk v1</p>
<h2>System</h2>
<h2>Standard Library</h2>
<h1>Compiler Disk v2</h1>
<img src=img.gif alt="Contents Compiler Disk v2">
<p class=captionFigure>Contents Compiler Disk v2</p>
<h2>System</h2>
<h3>parser.com</h3>
<h3>compiler.com</h3>
<h3>linker.com</h3>
<h2>Standard Library</h2>
<h1>Library System Disk</h1>
<h1 class=part>Personal</h1>
<h1>Tips & Tricks</h1>
<h1 class=part>Appendixes</h1>
<h1 class=appendix>Functions Standard Library v1</h1>
<h1 class=appendix>Functions Standard Library v2</h1>
<h1 class=appendix>Functions Graphic Library</h1>
<h1 class=prelude>Bibliography</h1>
</body>
</html>

View File

@ -0,0 +1,5 @@
<html>
<head>
<title>SubSub1</title>
</head>
</html>

View File

@ -0,0 +1,5 @@
<html>
<head>
<title>Sub1</title>
</head>
</html>

View File

@ -0,0 +1,5 @@
<html>
<head>
<title>SubSub1</title>
</head>
</html>

View File

@ -0,0 +1,5 @@
<html>
<head>
<title>SubSub2</title>
</head>
</html>

View File

@ -0,0 +1,5 @@
<html>
<head>
<title>Sub2</title>
</head>
</html>

View File

@ -0,0 +1,5 @@
<html>
<head>
<title>Sub3</title>
</head>
</html>

View File

@ -0,0 +1,5 @@
<html>
<head>
<title>Main</title>
</head>
</html>

View File

@ -0,0 +1,87 @@
#--- generate.t ---------------------------------------------------------------
# function: Test ToC generation.
use strict;
use Test;
BEGIN { plan tests => 4; }
use HTML::Toc;
use HTML::TocGenerator;
my ($filename);
my $toc = HTML::Toc->new;
my $tocGenerator = HTML::TocGenerator->new;
$toc->setOptions({
'doLinkToToken' => 0,
'levelIndent' => 0,
'header' => '',
'footer' => '',
});
BEGIN {
# Create test file
$filename = "file$$.htm";
die "$filename is already there" if -e $filename;
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT';
<h1>Header</h1>
EOT
close(FILE);
}
END {
# Remove test file
unlink($filename) or warn "Can't unlink $filename: $!";
}
#--- 1. extend ----------------------------------------------------------------
# Generate ToC
$tocGenerator->generate($toc, "<h1>Header</h1>");
# Extend ToC
$tocGenerator->extend($toc, "<h1>Header</h1>");
# Test ToC
ok($toc->format(), "<ul>\n<li>Header\n<li>Header\n</ul>");
#--- 2. extendFromFile --------------------------------------------------------
# Generate ToC
$tocGenerator->generateFromFile($toc, $filename);
# Extend ToC
$tocGenerator->extendFromFile($toc, $filename);
# Test ToC
ok($toc->format(), "<ul>\n<li>Header\n<li>Header\n</ul>");
#--- 3. extendFromFiles -------------------------------------------------------
# Generate ToC
$tocGenerator->generateFromFile($toc, $filename);
# Extend ToC
$tocGenerator->extendFromFile($toc, [$filename, $filename]);
# Test ToC
ok($toc->format(), "<ul>\n<li>Header\n<li>Header\n<li>Header\n</ul>");
#--- 4. linkTocToToken --------------------------------------------------------
$toc->setOptions({
'doLinkToToken' => 1,
});
# Generate ToC
$tocGenerator->generate($toc, "<h1>Header</h1>");
# Extend ToC
$tocGenerator->extend($toc, "<h1>Header</h1>");
# Test ToC
ok($toc->format() . "\n", <<'EOT');
<ul>
<li><a href=#h-1>Header</a>
<li><a href=#h-2>Header</a>
</ul>
EOT

View File

@ -0,0 +1,157 @@
#--- format.t -----------------------------------------------------------------
# function: Test ToC formatting.
use strict;
use Test;
BEGIN { plan tests => 6; }
use HTML::Toc;
use HTML::TocGenerator;
use HTML::TocInsertor;
my ($output, $content, $filename);
my $toc = HTML::Toc->new;
my $tocGenerator = HTML::TocGenerator->new;
my $tocInsertor = HTML::TocInsertor->new;
$toc->setOptions({
'doLinkToToken' => 0,
'levelIndent' => 0,
'insertionPoint' => 'before <h1>',
'header' => '',
'footer' => '',
});
BEGIN {
# Create test file
$filename = "file$$.htm";
die "$filename is already there" if -e $filename;
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<h1>Header</h1>
EOT
}
END {
# Remove test file
unlink($filename) or warn "Can't unlink $filename: $!";
}
#--- 1. templateLevelBegin ----------------------------------------------------
$toc->setOptions({
'templateLevelBegin' => '"<ul class=toc_$groupId$level>\n"'
});
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
ok($output, "<ul class=toc_h1>\n<li>Header\n</ul><h1>Header</h1>");
$toc->setOptions({'templateLevelBegin' => undef});
#--- 2. levelToToc -----------------------------------------------------------
$tocGenerator->generate($toc, "<h1>Header1</h1>\n<h2>Header2</h2>");
$toc->setOptions({'levelToToc' => '1'});
ok($toc->format(), "<ul>\n<li>Header1\n</ul>");
$toc->setOptions({'levelToToc' => '.*'});
#--- 3. groupToToc -----------------------------------------------------------
$toc->setOptions({
'tokenToToc' => [{
'level' => 1,
'tokenBegin' => '<h1 class=-foo>'
}, {
'groupId' => 'foo',
'level' => 1,
'tokenBegin' => '<h1 class=foo>'
}]
});
$tocGenerator->generate($toc, "<h1>Header1</h1>\n<h1 class=foo>Foo</h1>");
$toc->setOptions({'groupToToc' => 'foo'});
ok($toc->format(), "<ul>\n<li>Foo\n</ul>");
$toc->setOptions({'groupToToc' => '.*'});
#--- 4. header & footer -------------------------------------------------------
$toc->setOptions({
'tokenToToc' => [{
'level' => 1,
'tokenBegin' => '<h1>'
}],
'header' => '<!-- TocHeader -->',
'footer' => '<!-- TocFooter -->',
});
$tocInsertor->insert($toc, "<h1>Header1</h1>", {'output' => \$output});
ok("$output\n", <<EOT);
<!-- TocHeader --><ul>
<li>Header1
</ul><!-- TocFooter --><h1>Header1</h1>
EOT
# Test 'doSingleStepLevel' => 1
TestSingleStepLevel1();
# Test 'doSingleStepLevel' => 0
TestSingleStepLevel0();
#--- 5. TestSingleStepLevel1 --------------------------------------------------
sub TestSingleStepLevel1 {
my $toc = new HTML::Toc;
my $tocGenerator = new HTML::TocGenerator;
# Generate ToC
$tocGenerator->generate($toc, <<EOT);
<h1>Header 1</h1>
<h3>Header 3</h3>
EOT
# Compare output
ok($toc->format(), <<EOT);
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1>Header 1</a>
<ul>
<ul>
<li><a href=#h-1.0.1>Header 3</a>
</ul>
</ul>
</ul>
<!-- End of generated Table of Contents -->
EOT
} # TestSingleStepLevel1()
#--- 6. TestSingleStepLevel0 --------------------------------------------------
sub TestSingleStepLevel0 {
my $toc = new HTML::Toc;
my $tocGenerator = new HTML::TocGenerator;
# Set ToC options
$toc->setOptions({'doSingleStepLevel' => 0});
# Generate ToC
$tocGenerator->generate($toc, <<EOT);
<h1>Header 1</h1>
<h3>Header 3</h3>
EOT
# Compare output
ok($toc->format(), <<EOT);
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1>Header 1</a>
<ul>
<li><a href=#h-1.0.1>Header 3</a>
</ul>
</ul>
<!-- End of generated Table of Contents -->
EOT
} # TestSingleStepLevel0()

View File

@ -0,0 +1,200 @@
#--- generate.t ---------------------------------------------------------------
# function: Test ToC generation.
use strict;
use Test;
BEGIN { plan tests => 13; }
use HTML::Toc;
use HTML::TocGenerator;
my ($filename);
my $toc = HTML::Toc->new;
my $tocGenerator = HTML::TocGenerator->new;
$toc->setOptions({
'doLinkToToken' => 0,
'levelIndent' => 0,
'header' => '',
'footer' => '',
});
BEGIN {
# Create test file
$filename = "file$$.htm";
die "$filename is already there" if -e $filename;
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT';
<h1>Header</h1>
EOT
close(FILE);
}
END {
# Remove test file
unlink($filename) or warn "Can't unlink $filename: $!";
}
#--- 1. generate --------------------------------------------------------------
$tocGenerator->generate($toc, "<h1>Header</h1>");
ok($toc->format(), "<ul>\n<li>Header\n</ul>");
#--- 2. generateFromFile ------------------------------------------------------
$tocGenerator->generateFromFile($toc, $filename);
ok($toc->format(), "<ul>\n<li>Header\n</ul>");
#--- 3. generateFromFiles -----------------------------------------------------
$tocGenerator->generateFromFile($toc, [$filename, $filename]);
ok($toc->format(), "<ul>\n<li>Header\n<li>Header\n</ul>");
#--- 4. doLinkToToken -----------------------------------------------------
$toc->setOptions({'doLinkToToken' => 1});
$tocGenerator->generateFromFile($toc, $filename, {'globalGroups' => 1});
ok($toc->format(), "<ul>\n<li><a href=#h-1>Header</a>\n</ul>");
#--- 5. doLinkToFile -------------------------------------------------------
$toc->setOptions({'doLinkToFile' => 1});
$tocGenerator->generateFromFile($toc, $filename);
ok($toc->format(), "<ul>\n<li><a href=$filename#h-1>Header</a>\n</ul>");
#--- 6. templateAnchorHrefBegin -----------------------------------------------
# Set options
$toc->setOptions({'templateAnchorHrefBegin' => '"test-$file"'});
# Generate ToC
$tocGenerator->generateFromFile($toc, $filename);
# Test ToC
ok($toc->format(), "<ul>\n<li>test-".$filename."Header</a>\n</ul>");
# Reset options
$toc->setOptions({'templateAnchorHrefBegin' => undef});
#--- 7. templateAnchorHrefBegin function --------------------------------------
sub AssembleAnchorHrefBegin {
# Get arguments
my ($aFile, $aGroupId, $aLevel, $aNode) = @_;
# Return value
return $aFile . $aGroupId . $aLevel . $aNode;
} # AssembleAnchorHrefBegin()
# Set options
$toc->setOptions({'templateAnchorHrefBegin' => \&AssembleAnchorHrefBegin});
# Generate ToC
$tocGenerator->generateFromFile($toc, $filename);
# Test ToC
ok($toc->format(), "<ul>\n<li>".$filename."h11Header</a>\n</ul>");
# Reset options
$toc->setOptions({'templateAnchorHrefBegin' => undef});
#--- 8. levelToToc no levels available ---------------------------------------
$toc->setOptions({'levelToToc' => '2'});
$tocGenerator->generate($toc, "<h1>Header</h1>");
ok($toc->format(), "");
#--- 9. levelToToc level 1 ---------------------------------------------------
# Set options
$toc->setOptions({
'levelToToc' => '1',
'doLinkToToken' => 0,
});
$tocGenerator->generate($toc, "<h1>Header1</h1>\n<h2>Header2</h2>");
ok($toc->format(), "<ul>\n<li>Header1\n</ul>");
#--- 10. levelToToc level 2 --------------------------------------------------
# Set options
$toc->setOptions({
'levelToToc' => '2',
'doLinkToToken' => 0,
});
$tocGenerator->generate($toc, "<h1>Header1</h1>\n<h2>Header2</h2>");
ok($toc->format(), "<ul>\n<li>Header2\n</ul>");
# Restore options
$toc->setOptions({
'levelToToc' => '.*',
});
#--- 11. tokenToToc empty array ----------------------------------------------
# Set options
$toc->setOptions({'tokenToToc' => []});
$tocGenerator->generate($toc, "<h1>Header</h1>");
ok($toc->format(), "");
#--- 12. groups nested --------------------------------------------------------
$toc->setOptions({
'doNestGroup' => 1,
'tokenToToc' => [
{
'level' => 1,
'tokenBegin' => '<h1 class=-appendix>'
}, {
'groupId' => 'appendix',
'level' => 1,
'tokenBegin' => '<h1 class=appendix>'
}
]
});
$tocGenerator->generate(
$toc, "<h1>Header1</h1>\n<h1 class=appendix>Appendix</h1>"
);
ok($toc->format() . "\n", <<'EOT');
<ul>
<li>Header1
<ul>
<li>Appendix
</ul>
</ul>
EOT
#--- 13. groups not nested ----------------------------------------------------
$toc->setOptions({
'doNestGroup' => 0,
'tokenToToc' => [
{
'level' => 1,
'tokenBegin' => '<h1 class=-appendix>'
}, {
'groupId' => 'appendix',
'level' => 1,
'tokenBegin' => '<h1 class=appendix>'
}
]
});
$tocGenerator->generate(
$toc, "<h1>Header1</h1>\n<h1 class=appendix>Appendix</h1>"
);
ok($toc->format() . "\n", <<'EOT');
<ul>
<li>Header1
</ul>
<ul>
<li>Appendix
</ul>
EOT

View File

@ -0,0 +1,336 @@
#--- insert.t -----------------------------------------------------------------
# function: Test ToC insertion.
use strict;
use Test;
BEGIN { plan tests => 10; }
use HTML::Toc;
use HTML::TocGenerator;
use HTML::TocInsertor;
my ($output, $content, $filename);
my $toc = HTML::Toc->new;
my $tocGenerator = HTML::TocGenerator->new;
my $tocInsertor = HTML::TocInsertor->new;
$toc->setOptions({
'doLinkToToken' => 0,
'levelIndent' => 0,
'header' => "",
'footer' => "",
});
BEGIN {
# Create test file
$filename = "file$$.htm";
die "$filename is already there" if -e $filename;
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<h1>Header</h1>
EOT
}
END {
# Remove test file
unlink($filename) or warn "Can't unlink $filename: $!";
}
#--- 1. insert before start ---------------------------------------------------
$toc->setOptions({'insertionPoint' => 'before <h1>'});
# Generate ToC
$tocGenerator->generate($toc, "<h1>Header</h1>");
$tocInsertor->insert($toc, "<h1>Header</h1>", {
'output' => \$output,
'doGenerateToc' => 0
});
# Test ToC
ok($output, "<ul>\n<li>Header\n</ul><h1>Header</h1>");
#--- 2. insert after start ----------------------------------------------------
$toc->setOptions({'insertionPoint' => 'after <h1>'});
# Generate ToC
$tocGenerator->generate($toc, "<h1>Header</h1>");
$tocInsertor->insert($toc, "<h1>Header</h1>", {
'output' => \$output,
'doGenerateToc' => 0
});
# Test ToC
ok($output, "<h1><ul>\n<li>Header\n</ul>Header</h1>");
#--- 3. insert before end -----------------------------------------------------
$toc->setOptions({'insertionPoint' => 'before </h1>'});
# Generate ToC
$tocGenerator->generate($toc, "<h1>Header</h1>");
$tocInsertor->insert($toc, "<h1>Header</h1>", {
'output' => \$output,
'doGenerateToc' => 0
});
# Test ToC
ok($output, "<h1>Header<ul>\n<li>Header\n</ul></h1>");
#--- 4. insert after end ------------------------------------------------------
$toc->setOptions({'insertionPoint' => 'after </h1>'});
# Generate ToC
$tocGenerator->generate($toc, "<h1>Header</h1>");
$tocInsertor->insert($toc, "<h1>Header</h1>", {
'output' => \$output,
'doGenerateToc' => 0
});
# Test ToC
ok($output, "<h1>Header</h1><ul>\n<li>Header\n</ul>");
#--- 5. outputFile ------------------------------------------------------------
$toc->setOptions({'insertionPoint' => 'before <h1>'});
# Generate ToC
$tocGenerator->generate($toc, "<h1>Header</h1>");
# Insert ToC, output to file
$tocInsertor->insert($toc, "<h1>Header</h1>", {
'outputFile' => $filename,
'doGenerateToc' => 0
});
# Read outputfile
open(FILE, "<$filename") || die "Can't open $filename: $!";
$content = join('', <FILE>);
close(FILE);
# Test ToC
ok($output, "<ul>\n<li>Header\n</ul><h1>Header</h1>");
#--- 6. empty toc -------------------------------------------------------------
$tocGenerator->generate($toc, "");
$tocInsertor->insert($toc, "", {
'output' => \$output,
'doGenerateToc' => 0
});
ok($output, "");
#--- TestAfterDeclaration() ---------------------------------------------------
# function: Test putting HTML comment after declaration.
sub TestAfterDeclaration {
# Create objects
my $toc = HTML::Toc->new();
my $tocInsertor = HTML::TocInsertor->new();
my $output;
# Set ToC options
$toc->setOptions({
'insertionPoint' => "after <!ToC>",
});
# Generate ToC
$tocInsertor->insert($toc, <<EOT, {'output' => \$output});
<!ToC><body>
<h1>Appendix</h1>
<h2>Appendix Paragraph</h2>
<h1>Appendix</h1>
<h2>Appendix Paragraph</h2>
</body>
EOT
# Test ToC
ok($output, <<EOT);
<!ToC>
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1>Appendix</a>
<ul>
<li><a href=#h-1.1>Appendix Paragraph</a>
</ul>
<li><a href=#h-2>Appendix</a>
<ul>
<li><a href=#h-2.1>Appendix Paragraph</a>
</ul>
</ul>
<!-- End of generated Table of Contents -->
<body>
<a name=h-1><h1>Appendix</h1></a>
<a name=h-1.1><h2>Appendix Paragraph</h2></a>
<a name=h-2><h1>Appendix</h1></a>
<a name=h-2.1><h2>Appendix Paragraph</h2></a>
</body>
EOT
} # TestAfterDeclaration()
#--- TestNumberingStyle() -----------------------------------------------------
# function: Test numberingstyle.
sub TestNumberingStyle {
# Create objects
my $toc = HTML::Toc->new();
my $tocInsertor = HTML::TocInsertor->new();
my $output;
# Set ToC options
$toc->setOptions({
'numberingStyle' => 'lower-alpha',
'doNumberToken' => 1,
'tokenToToc' => [{
'tokenBegin' => '<h1>',
}, {
'tokenBegin' => '<h2>',
'level' => 2,
'numberingStyle' => 'upper-alpha'
}, {
'tokenBegin' => '<h3>',
'level' => 3,
'numberingStyle' => 'decimal'
}]
});
# Generate ToC
$tocInsertor->insert($toc, <<EOT, {'output' => \$output});
<body>
<h1>Chapter</h1>
<h2>Paragraph</h2>
<h3>Paragraph</h3>
<h3>Paragraph</h3>
<h3>Paragraph</h3>
</body>
EOT
# Test ToC
ok($output, <<EOT);
<body>
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-a>Chapter</a>
<ul>
<li><a href=#h-a.A>Paragraph</a>
<ul>
<li><a href=#h-a.A.1>Paragraph</a>
<li><a href=#h-a.A.2>Paragraph</a>
<li><a href=#h-a.A.3>Paragraph</a>
</ul>
</ul>
</ul>
<!-- End of generated Table of Contents -->
<a name=h-a><h1>a &nbsp;Chapter</h1></a>
<a name=h-a.A><h2>a.A &nbsp;Paragraph</h2></a>
<a name=h-a.A.1><h3>a.A.1 &nbsp;Paragraph</h3></a>
<a name=h-a.A.2><h3>a.A.2 &nbsp;Paragraph</h3></a>
<a name=h-a.A.3><h3>a.A.3 &nbsp;Paragraph</h3></a>
</body>
EOT
} # TestNumberingStyle()
#--- TestReplaceComment() -----------------------------------------------------
# function: Test replacing HTML comment with ToC.
sub TestReplaceComment {
# Create objects
my $toc = HTML::Toc->new();
my $tocInsertor = HTML::TocInsertor->new();
my $output;
# Set ToC options
$toc->setOptions({
'insertionPoint' => "replace <!-- ToC -->"
});
# Generate ToC
$tocInsertor->insert($toc, <<EOT, {'output' => \$output});
<!-- ToC -->
<body>
<h1>Appendix</h1>
<h2>Appendix Paragraph</h2>
<h1>Appendix</h1>
<h2>Appendix Paragraph</h2>
</body>
EOT
# Test ToC
ok($output, <<EOT);
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1>Appendix</a>
<ul>
<li><a href=#h-1.1>Appendix Paragraph</a>
</ul>
<li><a href=#h-2>Appendix</a>
<ul>
<li><a href=#h-2.1>Appendix Paragraph</a>
</ul>
</ul>
<!-- End of generated Table of Contents -->
<body>
<a name=h-1><h1>Appendix</h1></a>
<a name=h-1.1><h2>Appendix Paragraph</h2></a>
<a name=h-2><h1>Appendix</h1></a>
<a name=h-2.1><h2>Appendix Paragraph</h2></a>
</body>
EOT
} # TestReplaceComment()
#--- TestReplaceText() -----------------------------------------------------
# function: Test replacing HTML comment with ToC.
sub TestReplaceText {
# Create objects
my $toc = HTML::Toc->new();
my $tocInsertor = HTML::TocInsertor->new();
my $output;
# Set ToC options
$toc->setOptions({
'insertionPoint' => "replace ToC will be placed here[,]"
});
# Generate ToC
$tocInsertor->insert($toc, <<EOT, {'output' => \$output});
The ToC will be placed here, overnight.
<body>
<h1>Appendix</h1>
<h2>Appendix Paragraph</h2>
<h1>Appendix</h1>
<h2>Appendix Paragraph</h2>
</body>
EOT
# Test ToC
ok($output, <<EOT);
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1>Appendix</a>
<ul>
<li><a href=#h-1.1>Appendix Paragraph</a>
</ul>
<li><a href=#h-2>Appendix</a>
<ul>
<li><a href=#h-2.1>Appendix Paragraph</a>
</ul>
</ul>
<!-- End of generated Table of Contents -->
<body>
<a name=h-1><h1>Appendix</h1></a>
<a name=h-1.1><h2>Appendix Paragraph</h2></a>
<a name=h-2><h1>Appendix</h1></a>
<a name=h-2.1><h2>Appendix Paragraph</h2></a>
</body>
EOT
} # TestReplaceText()
# 7. Test 'numberingStyle'
TestNumberingStyle();
# 8. Test replace comment
TestReplaceComment();
# 9. Test after declaration
TestAfterDeclaration();
# 10. Test replace text
TestReplaceText();

View File

@ -0,0 +1,768 @@
#--- manual.t -----------------------------------------------------------------
# function: Test HTML::ToC generating a manual.
use strict;
use Test;
BEGIN { plan tests => 3; }
use HTML::Toc;
use HTML::TocGenerator;
use HTML::TocInsertor;
use HTML::TocUpdator;
#--- AssembleTocLine() --------------------------------------------------------
# function: Assemble ToC line.
sub AssembleTocLine {
# Get arguments
my ($aLevel, $aGroupId, $aNode, $aSequenceNr, $aText) = @_;
# Local variables
my ($result);
# Assemble ToC line
SWITCH: {
if ($aGroupId eq "prelude") {
$result = "<li>$aText\n";
last SWITCH;
}
if ($aGroupId eq "part") {
$result = "<li>Part $aNode &nbsp;$aText\n";
last SWITCH;
}
if ($aGroupId eq "h") {
$result = "<li>$aSequenceNr. &nbsp;$aText\n";
last SWITCH;
}
else {
$result = "<li>$aNode &nbsp;$aText\n";
last SWITCH;
}
}
# Return value
return $result;
} # AssembleTocLine()
#--- AssembleTokenNumber() ----------------------------------------------------
# function: Assemble token number.
sub AssembleTokenNumber {
# Get arguments
my ($aNode, $aGroupId, $aFile, $aGroupLevel, $aLevel, $aToc) = @_;
# Local variables
my ($result);
# Assemble token number
SWITCH: {
if ($aGroupId eq "part") {
$result = "Part $aNode &nbsp;";
last SWITCH;
}
else {
$result = "$aNode &nbsp;";
last SWITCH;
}
}
# Return value
return $result;
} # AssembleTokenNumber()
#--- TestInsertManualToc ------------------------------------------------------
# function: Test inserting ToC into manual.
sub TestInsertManualToc {
my $output;
# Create objects
my $toc = new HTML::Toc;
my $tocOfFigures = new HTML::Toc;
my $tocOfTables = new HTML::Toc;
my $tocInsertor = new HTML::TocInsertor;
# Set ToC options
$toc->setOptions({
'doNestGroup' => 1,
'doNumberToken' => 1,
'insertionPoint' => "replace <!-- Table of Contents -->",
'templateLevel' => \&AssembleTocLine,
'templateLevelBegin' => '"<ul class=toc_$groupId$level>\n"',
'templateLevelEnd' => '"</ul>\n"',
'templateTokenNumber' => \&AssembleTokenNumber,
'tokenToToc' => [{
'groupId' => 'part',
'doNumberToken' => 1,
'level' => 1,
'tokenBegin' => '<h1 class=part>',
}, {
'tokenBegin' => '<h1 class=-[appendix|prelude|hidden|part]>'
}, {
'tokenBegin' => '<h2>',
'level' => 2
}, {
'tokenBegin' => '<h3>',
'level' => 3
}, {
'groupId' => 'appendix',
'tokenBegin' => '<h1 class=appendix>',
'numberingStyle' => 'upper-alpha',
}, {
'groupId' => 'appendix',
'tokenBegin' => '<h2 class=appendix>',
'level' => 2
}, {
'groupId' => 'prelude',
'tokenBegin' => '<h1 class=prelude>',
'level' => 1,
'doNumberToken' => 0,
}],
});
$tocOfFigures->setOptions({
'doNumberToken' => 1,
'insertionPoint' => "replace <!-- Table of Figures -->",
'templateLevelBegin' => '"<ol>\n"',
'templateLevelEnd' => '"</ol>\n"',
'templateTokenNumber' => '"Figure $node: &nbsp;"',
'tokenToToc' => [{
'groupId' => 'Figure',
'tokenBegin' => '<p class=captionFigure>'
}]
});
$tocOfTables->setOptions({
'doNumberToken' => 1,
'insertionPoint' => "replace <!-- Table of Tables -->",
'templateLevelBegin' => '"<ol>\n"',
'templateLevelEnd' => '"</ol>\n"',
'templateTokenNumber' => '"Table $node: &nbsp;"',
'tokenToToc' => [{
'groupId' => 'Table',
'tokenBegin' => '<p class=captionTable>'
}]
});
# Insert ToC
$tocInsertor->insertIntoFile(
[$toc, $tocOfFigures, $tocOfTables],
't/ManualTest/manualTest1.htm', {
'doUseGroupsGlobal' => 1,
'output' => \$output,
'outputFile' => 't/ManualTest/manualTest2.htm'
}
);
ok($output, <<EOT);
<html>
<head>
<title>Manual</title>
<style type="text/css">
ul.toc_appendix1 {
list-style-type: none;
margin-left: 0;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_h1 {
list-style-type: none;
margin-left: 1;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_h2 {
list-style-type: none;
}
ul.toc_h3 {
list-style-type: none;
}
ul.toc_part1 {
list-style-type: none;
margin-left: 1;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_prelude1 {
list-style: none;
}
p.captionFigure {
font-style: italic;
font-weight: bold;
}
p.captionTable {
font-style: italic;
font-weight: bold;
}
</style>
</head>
<body>
<a name=prelude-1><h1 class=prelude>Preface</h1></a>
Better C than never.
<h1 class=hidden>Table of Contents</h1>
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul class=toc_prelude1>
<li><a href=#prelude-1>Preface</a>
<li><a href=#prelude-2>Table of Figures</a>
<li><a href=#prelude-3>Table of Tables</a>
<li><a href=#prelude-4>Introduction</a>
<ul class=toc_part1>
<li>Part 1 &nbsp;<a href=#part-1>Disks</a>
<ul class=toc_h1>
<li>1. &nbsp;<a href=#h-1>Compiler Disk v1</a>
<ul class=toc_h2>
<li>1. &nbsp;<a href=#h-1.1>System</a>
<li>2. &nbsp;<a href=#h-1.2>Standard Library</a>
</ul>
<li>2. &nbsp;<a href=#h-2>Compiler Disk v2</a>
<ul class=toc_h2>
<li>1. &nbsp;<a href=#h-2.1>System</a>
<ul class=toc_h3>
<li>1. &nbsp;<a href=#h-2.1.1>parser.com</a>
<li>2. &nbsp;<a href=#h-2.1.2>compiler.com</a>
<li>3. &nbsp;<a href=#h-2.1.3>linker.com</a>
</ul>
<li>2. &nbsp;<a href=#h-2.2>Standard Library</a>
</ul>
<li>3. &nbsp;<a href=#h-3>Library System Disk</a>
</ul>
<li>Part 2 &nbsp;<a href=#part-2>Personal</a>
<ul class=toc_h1>
<li>4. &nbsp;<a href=#h-4>Tips & Tricks</a>
</ul>
<li>Part 3 &nbsp;<a href=#part-3>Appendixes</a>
<ul class=toc_appendix1>
<li>A &nbsp;<a href=#appendix-A>Functions Standard Library v1</a>
<li>B &nbsp;<a href=#appendix-B>Functions Standard Library v2</a>
<li>C &nbsp;<a href=#appendix-C>Functions Graphic Library</a>
</ul>
</ul>
<li><a href=#prelude-5>Bibliography</a>
</ul>
<!-- End of generated Table of Contents -->
<a name=prelude-2><h1 class=prelude>Table of Figures</h1></a>
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ol>
<li><a href=#Figure-1>Contents Compiler Disk v1</a>
<li><a href=#Figure-2>Contents Compiler Disk v2</a>
</ol>
<!-- End of generated Table of Contents -->
<a name=prelude-3><h1 class=prelude>Table of Tables</h1></a>
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ol>
<li><a href=#Table-1>Compile Steps</a>
</ol>
<!-- End of generated Table of Contents -->
<a name=prelude-4><h1 class=prelude>Introduction</h1></a>
Thanks to standardisation and the excellent work of the QWERTY corporation it is possible to learn C with almost any C manual.
<a name=Table-1><p class=captionTable>Table 1: &nbsp;Compile Steps</p></a>
<ul><pre>
Parser
Compiler
Linker
</pre></ul>
<a name=part-1><h1 class=part>Part 1 &nbsp;Disks</h1></a>
<a name=h-1><h1>1 &nbsp;Compiler Disk v1</h1></a>
<img src=img.gif alt="Contents Compiler Disk v1">
<a name=Figure-1><p class=captionFigure>Figure 1: &nbsp;Contents Compiler Disk v1</p></a>
<a name=h-1.1><h2>1.1 &nbsp;System</h2></a>
<a name=h-1.2><h2>1.2 &nbsp;Standard Library</h2></a>
<a name=h-2><h1>2 &nbsp;Compiler Disk v2</h1></a>
<img src=img.gif alt="Contents Compiler Disk v2">
<a name=Figure-2><p class=captionFigure>Figure 2: &nbsp;Contents Compiler Disk v2</p></a>
<a name=h-2.1><h2>2.1 &nbsp;System</h2></a>
<a name=h-2.1.1><h3>2.1.1 &nbsp;parser.com</h3></a>
<a name=h-2.1.2><h3>2.1.2 &nbsp;compiler.com</h3></a>
<a name=h-2.1.3><h3>2.1.3 &nbsp;linker.com</h3></a>
<a name=h-2.2><h2>2.2 &nbsp;Standard Library</h2></a>
<a name=h-3><h1>3 &nbsp;Library System Disk</h1></a>
<a name=part-2><h1 class=part>Part 2 &nbsp;Personal</h1></a>
<a name=h-4><h1>4 &nbsp;Tips & Tricks</h1></a>
<a name=part-3><h1 class=part>Part 3 &nbsp;Appendixes</h1></a>
<a name=appendix-A><h1 class=appendix>A &nbsp;Functions Standard Library v1</h1></a>
<a name=appendix-B><h1 class=appendix>B &nbsp;Functions Standard Library v2</h1></a>
<a name=appendix-C><h1 class=appendix>C &nbsp;Functions Graphic Library</h1></a>
<a name=prelude-5><h1 class=prelude>Bibliography</h1></a>
</body>
</html>
EOT
} # TestInsertManualToc()
#--- TestInsertManualForUpdating() --------------------------------------------
# function: Test inserting ToC into manual.
sub TestInsertManualForUpdating {
my $output;
# Create objects
my $toc = new HTML::Toc;
my $tocOfFigures = new HTML::Toc;
my $tocOfTables = new HTML::Toc;
my $tocUpdator = new HTML::TocUpdator;
# Set ToC options
$toc->setOptions({
'doNestGroup' => 1,
'doNumberToken' => 1,
'insertionPoint' => "after <!-- Table of Contents -->",
'templateLevel' => \&AssembleTocLine,
'templateLevelBegin' => '"<ul class=toc_$groupId$level>\n"',
'templateLevelEnd' => '"</ul>\n"',
'templateTokenNumber' => \&AssembleTokenNumber,
'tokenToToc' => [{
'groupId' => 'part',
'doNumberToken' => 1,
'level' => 1,
'tokenBegin' => '<h1 class=part>',
}, {
'tokenBegin' => '<h1 class=-[appendix|prelude|hidden|part]>'
}, {
'tokenBegin' => '<h2>',
'level' => 2
}, {
'tokenBegin' => '<h3>',
'level' => 3
}, {
'groupId' => 'appendix',
'tokenBegin' => '<h1 class=appendix>',
'numberingStyle' => 'upper-alpha',
}, {
'groupId' => 'appendix',
'tokenBegin' => '<h2 class=appendix>',
'level' => 2
}, {
'groupId' => 'prelude',
'tokenBegin' => '<h1 class=prelude>',
'level' => 1,
'doNumberToken' => 0,
}],
});
$tocOfFigures->setOptions({
'doNumberToken' => 1,
'insertionPoint' => "after <!-- Table of Figures -->",
'templateLevelBegin' => '"<ol>\n"',
'templateLevelEnd' => '"</ol>\n"',
'templateTokenNumber' => '"Figure $node: &nbsp;"',
'tokenToToc' => [{
'groupId' => 'Figure',
'tokenBegin' => '<p class=captionFigure>'
}]
});
$tocOfTables->setOptions({
'doNumberToken' => 1,
'insertionPoint' => "after <!-- Table of Tables -->",
'templateLevelBegin' => '"<ol>\n"',
'templateLevelEnd' => '"</ol>\n"',
'templateTokenNumber' => '"Table $node: &nbsp;"',
'tokenToToc' => [{
'groupId' => 'Table',
'tokenBegin' => '<p class=captionTable>'
}]
});
# Insert ToC
$tocUpdator->updateFile(
[$toc, $tocOfFigures, $tocOfTables],
't/ManualTest/manualTest1.htm', {
'doUseGroupsGlobal' => 1,
'output' => \$output,
'outputFile' => 't/ManualTest/manualTest3.htm'
}
);
ok($output, <<EOT);
<html>
<head>
<title>Manual</title>
<style type="text/css">
ul.toc_appendix1 {
list-style-type: none;
margin-left: 0;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_h1 {
list-style-type: none;
margin-left: 1;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_h2 {
list-style-type: none;
}
ul.toc_h3 {
list-style-type: none;
}
ul.toc_part1 {
list-style-type: none;
margin-left: 1;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_prelude1 {
list-style: none;
}
p.captionFigure {
font-style: italic;
font-weight: bold;
}
p.captionTable {
font-style: italic;
font-weight: bold;
}
</style>
</head>
<body>
<!-- #BeginTocAnchorNameBegin --><a name=prelude-1><!-- #EndTocAnchorNameBegin --><h1 class=prelude>Preface</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
Better C than never.
<h1 class=hidden>Table of Contents</h1>
<!-- Table of Contents --><!-- #BeginToc -->
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul class=toc_prelude1>
<li><a href=#prelude-1>Preface</a>
<li><a href=#prelude-2>Table of Figures</a>
<li><a href=#prelude-3>Table of Tables</a>
<li><a href=#prelude-4>Introduction</a>
<ul class=toc_part1>
<li>Part 1 &nbsp;<a href=#part-1>Disks</a>
<ul class=toc_h1>
<li>1. &nbsp;<a href=#h-1>Compiler Disk v1</a>
<ul class=toc_h2>
<li>1. &nbsp;<a href=#h-1.1>System</a>
<li>2. &nbsp;<a href=#h-1.2>Standard Library</a>
</ul>
<li>2. &nbsp;<a href=#h-2>Compiler Disk v2</a>
<ul class=toc_h2>
<li>1. &nbsp;<a href=#h-2.1>System</a>
<ul class=toc_h3>
<li>1. &nbsp;<a href=#h-2.1.1>parser.com</a>
<li>2. &nbsp;<a href=#h-2.1.2>compiler.com</a>
<li>3. &nbsp;<a href=#h-2.1.3>linker.com</a>
</ul>
<li>2. &nbsp;<a href=#h-2.2>Standard Library</a>
</ul>
<li>3. &nbsp;<a href=#h-3>Library System Disk</a>
</ul>
<li>Part 2 &nbsp;<a href=#part-2>Personal</a>
<ul class=toc_h1>
<li>4. &nbsp;<a href=#h-4>Tips & Tricks</a>
</ul>
<li>Part 3 &nbsp;<a href=#part-3>Appendixes</a>
<ul class=toc_appendix1>
<li>A &nbsp;<a href=#appendix-A>Functions Standard Library v1</a>
<li>B &nbsp;<a href=#appendix-B>Functions Standard Library v2</a>
<li>C &nbsp;<a href=#appendix-C>Functions Graphic Library</a>
</ul>
</ul>
<li><a href=#prelude-5>Bibliography</a>
</ul>
<!-- End of generated Table of Contents -->
<!-- #EndToc -->
<!-- #BeginTocAnchorNameBegin --><a name=prelude-2><!-- #EndTocAnchorNameBegin --><h1 class=prelude>Table of Figures</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- Table of Figures --><!-- #BeginToc -->
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ol>
<li><a href=#Figure-1>Contents Compiler Disk v1</a>
<li><a href=#Figure-2>Contents Compiler Disk v2</a>
</ol>
<!-- End of generated Table of Contents -->
<!-- #EndToc -->
<!-- #BeginTocAnchorNameBegin --><a name=prelude-3><!-- #EndTocAnchorNameBegin --><h1 class=prelude>Table of Tables</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- Table of Tables --><!-- #BeginToc -->
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ol>
<li><a href=#Table-1>Compile Steps</a>
</ol>
<!-- End of generated Table of Contents -->
<!-- #EndToc -->
<!-- #BeginTocAnchorNameBegin --><a name=prelude-4><!-- #EndTocAnchorNameBegin --><h1 class=prelude>Introduction</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
Thanks to standardisation and the excellent work of the QWERTY corporation it is possible to learn C with almost any C manual.
<!-- #BeginTocAnchorNameBegin --><a name=Table-1><!-- #EndTocAnchorNameBegin --><p class=captionTable><!-- #BeginTocNumber -->Table 1: &nbsp;<!-- #EndTocNumber -->Compile Steps</p><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<ul><pre>
Parser
Compiler
Linker
</pre></ul>
<!-- #BeginTocAnchorNameBegin --><a name=part-1><!-- #EndTocAnchorNameBegin --><h1 class=part><!-- #BeginTocNumber -->Part 1 &nbsp;<!-- #EndTocNumber -->Disks</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-1><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->1 &nbsp;<!-- #EndTocNumber -->Compiler Disk v1</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<img src=img.gif alt="Contents Compiler Disk v1">
<!-- #BeginTocAnchorNameBegin --><a name=Figure-1><!-- #EndTocAnchorNameBegin --><p class=captionFigure><!-- #BeginTocNumber -->Figure 1: &nbsp;<!-- #EndTocNumber -->Contents Compiler Disk v1</p><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-1.1><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->1.1 &nbsp;<!-- #EndTocNumber -->System</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-1.2><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->1.2 &nbsp;<!-- #EndTocNumber -->Standard Library</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->2 &nbsp;<!-- #EndTocNumber -->Compiler Disk v2</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<img src=img.gif alt="Contents Compiler Disk v2">
<!-- #BeginTocAnchorNameBegin --><a name=Figure-2><!-- #EndTocAnchorNameBegin --><p class=captionFigure><!-- #BeginTocNumber -->Figure 2: &nbsp;<!-- #EndTocNumber -->Contents Compiler Disk v2</p><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->2.1 &nbsp;<!-- #EndTocNumber -->System</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.1><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.1 &nbsp;<!-- #EndTocNumber -->parser.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.2><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.2 &nbsp;<!-- #EndTocNumber -->compiler.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.3><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.3 &nbsp;<!-- #EndTocNumber -->linker.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2.2><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->2.2 &nbsp;<!-- #EndTocNumber -->Standard Library</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-3><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->3 &nbsp;<!-- #EndTocNumber -->Library System Disk</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=part-2><!-- #EndTocAnchorNameBegin --><h1 class=part><!-- #BeginTocNumber -->Part 2 &nbsp;<!-- #EndTocNumber -->Personal</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-4><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->4 &nbsp;<!-- #EndTocNumber -->Tips & Tricks</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=part-3><!-- #EndTocAnchorNameBegin --><h1 class=part><!-- #BeginTocNumber -->Part 3 &nbsp;<!-- #EndTocNumber -->Appendixes</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=appendix-A><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->A &nbsp;<!-- #EndTocNumber -->Functions Standard Library v1</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=appendix-B><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->B &nbsp;<!-- #EndTocNumber -->Functions Standard Library v2</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=appendix-C><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->C &nbsp;<!-- #EndTocNumber -->Functions Graphic Library</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=prelude-5><!-- #EndTocAnchorNameBegin --><h1 class=prelude>Bibliography</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
</body>
</html>
EOT
} # TestInsertManualForUpdating()
#--- TestUpdateManual() -------------------------------------------------------
# function: Test inserting ToC into manual.
sub TestUpdateManual {
my $output;
# Create objects
my $toc = new HTML::Toc;
my $tocOfFigures = new HTML::Toc;
my $tocOfTables = new HTML::Toc;
my $tocUpdator = new HTML::TocUpdator;
# Set ToC options
$toc->setOptions({
'doNestGroup' => 1,
'doNumberToken' => 1,
'insertionPoint' => "after <!-- Table of Contents -->",
'templateLevel' => \&AssembleTocLine,
'templateLevelBegin' => '"<ul class=toc_$groupId$level>\n"',
'templateLevelEnd' => '"</ul>\n"',
'templateTokenNumber' => \&AssembleTokenNumber,
'tokenToToc' => [{
'groupId' => 'part',
'doNumberToken' => 1,
'level' => 1,
'tokenBegin' => '<h1 class=part>',
}, {
'tokenBegin' => '<h1 class=-[appendix|prelude|hidden|part]>'
}, {
'tokenBegin' => '<h2>',
'level' => 2
}, {
'tokenBegin' => '<h3>',
'level' => 3
}, {
'groupId' => 'appendix',
'tokenBegin' => '<h1 class=appendix>',
'numberingStyle' => 'upper-alpha',
}, {
'groupId' => 'appendix',
'tokenBegin' => '<h2 class=appendix>',
'level' => 2
}, {
'groupId' => 'prelude',
'tokenBegin' => '<h1 class=prelude>',
'level' => 1,
'doNumberToken' => 0,
}],
});
$tocOfFigures->setOptions({
'doNumberToken' => 1,
'insertionPoint' => "after <!-- Table of Figures -->",
'templateLevelBegin' => '"<ol>\n"',
'templateLevelEnd' => '"</ol>\n"',
'templateTokenNumber' => '"Figure $node: &nbsp;"',
'tokenToToc' => [{
'groupId' => 'Figure',
'tokenBegin' => '<p class=captionFigure>'
}]
});
$tocOfTables->setOptions({
'doNumberToken' => 1,
'insertionPoint' => "after <!-- Table of Tables -->",
'templateLevelBegin' => '"<ol>\n"',
'templateLevelEnd' => '"</ol>\n"',
'templateTokenNumber' => '"Table $node: &nbsp;"',
'tokenToToc' => [{
'groupId' => 'Table',
'tokenBegin' => '<p class=captionTable>'
}]
});
# Insert ToC
$tocUpdator->updateFile(
[$toc, $tocOfFigures, $tocOfTables],
't/ManualTest/manualTest3.htm', {
'doUseGroupsGlobal' => 1,
'output' => \$output,
'outputFile' => 't/ManualTest/manualTest4.htm'
}
);
ok($output, <<EOT);
<html>
<head>
<title>Manual</title>
<style type="text/css">
ul.toc_appendix1 {
list-style-type: none;
margin-left: 0;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_h1 {
list-style-type: none;
margin-left: 1;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_h2 {
list-style-type: none;
}
ul.toc_h3 {
list-style-type: none;
}
ul.toc_part1 {
list-style-type: none;
margin-left: 1;
margin-top: 1em;
margin-bottom: 1em;
}
ul.toc_prelude1 {
list-style: none;
}
p.captionFigure {
font-style: italic;
font-weight: bold;
}
p.captionTable {
font-style: italic;
font-weight: bold;
}
</style>
</head>
<body>
<!-- #BeginTocAnchorNameBegin --><a name=prelude-1><!-- #EndTocAnchorNameBegin --><h1 class=prelude>Preface</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
Better C than never.
<h1 class=hidden>Table of Contents</h1>
<!-- Table of Contents --><!-- #BeginToc -->
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul class=toc_prelude1>
<li><a href=#prelude-1>Preface</a>
<li><a href=#prelude-2>Table of Figures</a>
<li><a href=#prelude-3>Table of Tables</a>
<li><a href=#prelude-4>Introduction</a>
<ul class=toc_part1>
<li>Part 1 &nbsp;<a href=#part-1>Disks</a>
<ul class=toc_h1>
<li>1. &nbsp;<a href=#h-1>Compiler Disk v1</a>
<ul class=toc_h2>
<li>1. &nbsp;<a href=#h-1.1>System</a>
<li>2. &nbsp;<a href=#h-1.2>Standard Library</a>
</ul>
<li>2. &nbsp;<a href=#h-2>Compiler Disk v2</a>
<ul class=toc_h2>
<li>1. &nbsp;<a href=#h-2.1>System</a>
<ul class=toc_h3>
<li>1. &nbsp;<a href=#h-2.1.1>parser.com</a>
<li>2. &nbsp;<a href=#h-2.1.2>compiler.com</a>
<li>3. &nbsp;<a href=#h-2.1.3>linker.com</a>
</ul>
<li>2. &nbsp;<a href=#h-2.2>Standard Library</a>
</ul>
<li>3. &nbsp;<a href=#h-3>Library System Disk</a>
</ul>
<li>Part 2 &nbsp;<a href=#part-2>Personal</a>
<ul class=toc_h1>
<li>4. &nbsp;<a href=#h-4>Tips & Tricks</a>
</ul>
<li>Part 3 &nbsp;<a href=#part-3>Appendixes</a>
<ul class=toc_appendix1>
<li>A &nbsp;<a href=#appendix-A>Functions Standard Library v1</a>
<li>B &nbsp;<a href=#appendix-B>Functions Standard Library v2</a>
<li>C &nbsp;<a href=#appendix-C>Functions Graphic Library</a>
</ul>
</ul>
<li><a href=#prelude-5>Bibliography</a>
</ul>
<!-- End of generated Table of Contents -->
<!-- #EndToc -->
<!-- #BeginTocAnchorNameBegin --><a name=prelude-2><!-- #EndTocAnchorNameBegin --><h1 class=prelude>Table of Figures</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- Table of Figures --><!-- #BeginToc -->
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ol>
<li><a href=#Figure-1>Contents Compiler Disk v1</a>
<li><a href=#Figure-2>Contents Compiler Disk v2</a>
</ol>
<!-- End of generated Table of Contents -->
<!-- #EndToc -->
<!-- #BeginTocAnchorNameBegin --><a name=prelude-3><!-- #EndTocAnchorNameBegin --><h1 class=prelude>Table of Tables</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- Table of Tables --><!-- #BeginToc -->
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ol>
<li><a href=#Table-1>Compile Steps</a>
</ol>
<!-- End of generated Table of Contents -->
<!-- #EndToc -->
<!-- #BeginTocAnchorNameBegin --><a name=prelude-4><!-- #EndTocAnchorNameBegin --><h1 class=prelude>Introduction</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
Thanks to standardisation and the excellent work of the QWERTY corporation it is possible to learn C with almost any C manual.
<!-- #BeginTocAnchorNameBegin --><a name=Table-1><!-- #EndTocAnchorNameBegin --><p class=captionTable><!-- #BeginTocNumber -->Table 1: &nbsp;<!-- #EndTocNumber -->Compile Steps</p><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<ul><pre>
Parser
Compiler
Linker
</pre></ul>
<!-- #BeginTocAnchorNameBegin --><a name=part-1><!-- #EndTocAnchorNameBegin --><h1 class=part><!-- #BeginTocNumber -->Part 1 &nbsp;<!-- #EndTocNumber -->Disks</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-1><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->1 &nbsp;<!-- #EndTocNumber -->Compiler Disk v1</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<img src=img.gif alt="Contents Compiler Disk v1">
<!-- #BeginTocAnchorNameBegin --><a name=Figure-1><!-- #EndTocAnchorNameBegin --><p class=captionFigure><!-- #BeginTocNumber -->Figure 1: &nbsp;<!-- #EndTocNumber -->Contents Compiler Disk v1</p><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-1.1><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->1.1 &nbsp;<!-- #EndTocNumber -->System</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-1.2><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->1.2 &nbsp;<!-- #EndTocNumber -->Standard Library</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->2 &nbsp;<!-- #EndTocNumber -->Compiler Disk v2</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<img src=img.gif alt="Contents Compiler Disk v2">
<!-- #BeginTocAnchorNameBegin --><a name=Figure-2><!-- #EndTocAnchorNameBegin --><p class=captionFigure><!-- #BeginTocNumber -->Figure 2: &nbsp;<!-- #EndTocNumber -->Contents Compiler Disk v2</p><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->2.1 &nbsp;<!-- #EndTocNumber -->System</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.1><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.1 &nbsp;<!-- #EndTocNumber -->parser.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.2><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.2 &nbsp;<!-- #EndTocNumber -->compiler.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.3><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.3 &nbsp;<!-- #EndTocNumber -->linker.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-2.2><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->2.2 &nbsp;<!-- #EndTocNumber -->Standard Library</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-3><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->3 &nbsp;<!-- #EndTocNumber -->Library System Disk</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=part-2><!-- #EndTocAnchorNameBegin --><h1 class=part><!-- #BeginTocNumber -->Part 2 &nbsp;<!-- #EndTocNumber -->Personal</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=h-4><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->4 &nbsp;<!-- #EndTocNumber -->Tips & Tricks</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=part-3><!-- #EndTocAnchorNameBegin --><h1 class=part><!-- #BeginTocNumber -->Part 3 &nbsp;<!-- #EndTocNumber -->Appendixes</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=appendix-A><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->A &nbsp;<!-- #EndTocNumber -->Functions Standard Library v1</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=appendix-B><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->B &nbsp;<!-- #EndTocNumber -->Functions Standard Library v2</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=appendix-C><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->C &nbsp;<!-- #EndTocNumber -->Functions Graphic Library</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
<!-- #BeginTocAnchorNameBegin --><a name=prelude-5><!-- #EndTocAnchorNameBegin --><h1 class=prelude>Bibliography</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
</body>
</html>
EOT
} # TestUpdateManual()
# Test inserting ToC into manual
TestInsertManualToc();
# Test inserting ToC with update tokens into manual
TestInsertManualForUpdating();
# Test updating ToC
TestUpdateManual();

View File

@ -0,0 +1,194 @@
#--- options.t ----------------------------------------------------------------
# function: Test HTML::ToC. In particular test the available options.
use strict;
use Test;
BEGIN { plan tests => 5; }
use HTML::Toc;
use HTML::TocGenerator;
use HTML::TocInsertor;
use HTML::TocUpdator;
my ($filename);
BEGIN {
# Create test file
$filename = "file$$.htm";
die "$filename is already there" if -e $filename;
}
END {
# Remove test file
unlink($filename) or warn "Can't unlink $filename: $!";
}
#--- TestAttributeToExcludeToken() --------------------------------------------
# function: Test 'HTML::Toc' option 'attributeToExcludeToken'
sub TestAttributeToExcludeToken {
# Assemble test file
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<body>
<h1>Chapter 1</h1>
<h1 class=appendix>Appendix</h1>
</body>
EOT
# Create objects
my $toc = HTML::Toc->new();
my $tocGenerator = HTML::TocGenerator->new();
$toc->setOptions({
'attributeToExcludeToken' => 'foo',
'tokenToToc' => [{
'tokenBegin' => '<h1 class=foodix>'
}]
});
# Generate ToC
$tocGenerator->generateFromFile($toc, $filename);
# Test ToC
ok($toc->format(), <<EOT);
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1>Chapter 1</a>
</ul>
<!-- End of generated Table of Contents -->
EOT
} # TestAttributeToExcludeToken()
#--- TestAttributeToTocToken() ------------------------------------------------
# function: Test 'HTML::Toc' option 'attributeToTocToken'
sub TestAttributeToTocToken {
# Assemble test file
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<body>
<img src=test.gif alt=Picture>
</body>
</html>
EOT
# Create objects
my $toc = HTML::Toc->new();
my $tocGenerator = HTML::TocGenerator->new();
$toc->setOptions({
'attributeToTocToken' => 'foo',
'tokenToToc' => [{
'groupId' => 'image',
'tokenBegin' => '<img alt=foo>'
}],
});
# Generate ToC
$tocGenerator->generateFromFile($toc, $filename);
# Test ToC
ok($toc->format(), <<EOT);
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#image-1>Picture</a>
</ul>
<!-- End of generated Table of Contents -->
EOT
} # TestAttributeToTocToken()
#--- TestNumberingStyleDecimal ------------------------------------------------
# function: Test 'decimal' numbering style.
sub TestNumberingStyleDecimal {
# Local variables
my $output;
# Create objects
my $toc = HTML::Toc->new();
my $tocInsertor = HTML::TocInsertor->new();
$toc->setOptions({
'doNumberToken' => 1,
'tokenToToc' => [{
'level' => 1,
'tokenBegin' => '<h1>',
'numberingStyle' => 'decimal'
}],
});
# Generate ToC
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
# Test ToC
ok("$output\n", <<EOT);
<a name=h-1><h1>1 &nbsp;Header</h1></a>
EOT
} # TestNumberingStyleDecimal()
#--- TestNumberingStyleLowerAlpha ---------------------------------------------
# function: Test 'lower-alpha' numbering style.
sub TestNumberingStyleLowerAlpha {
# Local variables
my $output;
# Create objects
my $toc = HTML::Toc->new();
my $tocInsertor = HTML::TocInsertor->new();
$toc->setOptions({
'doNumberToken' => 1,
'tokenToToc' => [{
'level' => 1,
'tokenBegin' => '<h1>',
'numberingStyle' => 'lower-alpha'
}],
});
# Generate ToC
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
# Test ToC
ok("$output\n", <<EOT);
<a name=h-a><h1>a &nbsp;Header</h1></a>
EOT
} # TestNumberingStyleLowerAlpha()
#--- TestNumberingStyleUpperAlpha ---------------------------------------------
# function: Test 'upper-alpha' numbering style.
sub TestNumberingStyleUpperAlpha {
# Local variables
my $output;
# Create objects
my $toc = HTML::Toc->new();
my $tocInsertor = HTML::TocInsertor->new();
$toc->setOptions({
'doNumberToken' => 1,
'tokenToToc' => [{
'level' => 1,
'tokenBegin' => '<h1>',
'numberingStyle' => 'upper-alpha'
}],
});
# Generate ToC
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
# Test ToC
ok("$output\n", <<EOT);
<a name=h-A><h1>A &nbsp;Header</h1></a>
EOT
} # TestNumberingStyleUpperAlpha()
# Test 'attributeToTocToken'
TestAttributeToTocToken();
# Test 'attributeToExcludeToken'
TestAttributeToExcludeToken();
# Test 'numberingStyleDecimal'
TestNumberingStyleDecimal();
# Test 'numberingStyleLowerAlpha'
TestNumberingStyleLowerAlpha();
# Test 'numberingStyleUpperAlpha'
TestNumberingStyleUpperAlpha();

View File

@ -0,0 +1,709 @@
#--- podExamples.t ------------------------------------------------------------
# function: Test HTML::ToC. In particular test the examples as described in
# the POD documentation.
use strict;
use Test;
BEGIN { plan tests => 13; }
use HTML::Toc;
use HTML::TocGenerator;
use HTML::TocInsertor;
use HTML::TocUpdator;
my ($filename, $filename2);
BEGIN {
# Create test file
$filename = "tmp.htm";
die "$filename is already there" if -e $filename;
# Create test file 2
$filename2 = "tmp2.htm";
die "$filename2 is already there" if -e $filename2;
}
END {
# Remove test file
unlink($filename) or warn "Can't unlink $filename: $!";
# Remove test file 2
unlink($filename2) or warn "Can't unlink $filename2: $!";
}
#--- TestExtendFromFile() --------------------------------------------------
# function: Test 'HTML::TocGenerator->extendFromFile()
sub TestExtendFromFile {
# Assemble test file
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<body>
<h1>Chapter of document 1</h1>
</body>
EOT
# Assemble test file 2
open(FILE, ">$filename2") || die "Can't create $filename2: $!";
print FILE <<'EOT'; close(FILE);
<html>
<body>
<h1>Chapter of document 2</h1>
</body>
</html>
EOT
# Create objects
my $toc = HTML::Toc->new();
my $tocGenerator = HTML::TocGenerator->new();
# Set ToC options
$toc->setOptions({'doLinkToFile' => 1});
# Generate ToC
$tocGenerator->generateFromFile($toc, $filename);
$tocGenerator->extendFromFile($toc, $filename2);
# Test ToC
ok($toc->format(), <<EOT);
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=tmp.htm#h-1>Chapter of document 1</a>
<li><a href=tmp2.htm#h-2>Chapter of document 2</a>
</ul>
<!-- End of generated Table of Contents -->
EOT
} # TestExtendFromFile()
#--- TestGenerateFromFiles() --------------------------------------------------
# function: Test 'HTML::TocGenerator->generateFromFile()
sub TestGenerateFromFiles {
# Assemble test file
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<body>
<h1>Chapter of document 1</h1>
</body>
EOT
# Assemble test file 2
open(FILE, ">$filename2") || die "Can't create $filename2: $!";
print FILE <<'EOT'; close(FILE);
<html>
<body>
<h1>Chapter of document 2</h1>
</body>
</html>
EOT
# Create objects
my $toc = HTML::Toc->new();
my $tocGenerator = HTML::TocGenerator->new();
# Set ToC options
$toc->setOptions({'doLinkToFile' => 1});
# Generate ToC
$tocGenerator->generateFromFile($toc, [$filename, $filename2]);
# Test ToC
ok($toc->format(), <<EOT);
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=tmp.htm#h-1>Chapter of document 1</a>
<li><a href=tmp2.htm#h-2>Chapter of document 2</a>
</ul>
<!-- End of generated Table of Contents -->
EOT
} # TestGenerateFromFiles()
#--- TestGenerateFromFiles() --------------------------------------------------
# function: Test 'HTML::TocGenerator->generateFromFile() using multiple files.
sub TestGenerateFromFile {
# Assemble test file 1
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<html>
<body>
<h1>Chapter</h1>
</body>
</html>
EOT
# Create objects
my $toc = HTML::Toc->new();
my $tocGenerator = HTML::TocGenerator->new();
# Generate ToC
$tocGenerator->generateFromFile($toc, $filename);
# Test ToC
ok($toc->format(), <<EOT);
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1>Chapter</a>
</ul>
<!-- End of generated Table of Contents -->
EOT
} # TestGenerateFromFile()
#--- TestInsertIntoFile() -----------------------------------------------------
# function: Test 'HTML::TocInsertor->insertIntoFile()
sub TestInsertIntoFile {
# Assemble test file
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<html>
<body>
<h1>Chapter</h1>
</body>
</html>
EOT
# Create objects
my $toc = HTML::Toc->new();
my $tocInsertor = HTML::TocInsertor->new();
my $output;
# Generate ToC
$tocInsertor->insertIntoFile($toc, $filename, {'output' => \$output});
# Test ToC
ok($output, <<EOT);
<html>
<body>
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1>Chapter</a>
</ul>
<!-- End of generated Table of Contents -->
<a name=h-1><h1>Chapter</h1></a>
</body>
</html>
EOT
} # TestInsertIntoFile()
#--- TestInsertIntoFileUsingTocUpdator() --------------------------------------
# function: Test 'HTML::TocUpdator->insertIntoFile()
sub TestInsertIntoFileUsingTocUpdator {
# Assemble test file
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<html>
<body>
<h1>
Chapter
</h1>
</body>
</html>
EOT
# Create objects
my $toc = HTML::Toc->new();
my $tocUpdator = HTML::TocUpdator->new();
my $output;
# Generate ToC
$tocUpdator->insertIntoFile($toc, $filename, {'output' => \$output});
# Test ToC
ok($output, <<EOT);
<html>
<body><!-- #BeginToc -->
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1> Chapter </a>
</ul>
<!-- End of generated Table of Contents -->
<!-- #EndToc -->
<!-- #BeginTocAnchorNameBegin --><a name=h-1><!-- #EndTocAnchorNameBegin --><h1>
Chapter
</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
</body>
</html>
EOT
} # TestInsertIntoFileUsingTocUpdator()
#--- TestGlobalGroups0() ------------------------------------------------------
# function: Test 'HTML::TocGenerator' option 'doUseGroupsGlobal = 0'.
sub TestGlobalGroups0 {
# Assemble test file
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<h1>Chapter</h1>
<h2>Paragraph</h2>
EOT
# Create objects
my $toc1 = HTML::Toc->new();
my $toc2 = HTML::Toc->new();
my $tocGenerator = HTML::TocGenerator->new();
# Set options
$toc1->setOptions({
'header' => '',
'footer' => '',
'tokenToToc' => [{'tokenBegin' => '<h1>'}]
});
$toc2->setOptions({
'header' => '',
'footer' => '',
'tokenToToc' => [{'tokenBegin' => '<h2>'}]
});
# Generate ToC
$tocGenerator->generateFromFile([$toc1, $toc2], $filename);
# Test ToC
ok($toc1->format() . $toc2->format() . "\n", <<'EOT');
<ul>
<li><a href=#h-1>Chapter</a>
</ul><ul>
<li><a href=#h-1>Paragraph</a>
</ul>
EOT
} # TestGlobalGroups0()
#--- TestGlobalGroups1() ------------------------------------------------------
# function: Test 'HTML::TocGenerator' option 'doUseGroupsGlobal = 0'.
sub TestGlobalGroups1 {
# Assemble test file
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT';
<h1>Chapter</h1>
<h2>Paragraph</h2>
EOT
close(FILE);
# Create objects
my $toc1 = HTML::Toc->new();
my $toc2 = HTML::Toc->new();
my $tocGenerator = HTML::TocGenerator->new();
# Set options
$toc1->setOptions({
'header' => '',
'footer' => '',
'tokenToToc' => [{'tokenBegin' => '<h1>'}]
});
$toc2->setOptions({
'header' => '',
'footer' => '',
'tokenToToc' => [{'tokenBegin' => '<h2>'}]
});
# Generate ToC
$tocGenerator->generateFromFile(
[$toc1, $toc2], $filename, {'doUseGroupsGlobal' => 1}
);
# Test ToC
ok($toc1->format() . $toc2->format() . "\n", <<'EOT');
<ul>
<li><a href=#h-1>Chapter</a>
</ul><ul>
<li><a href=#h-2>Paragraph</a>
</ul>
EOT
} # TestGlobalGroups1()
#--- TestMultipleGroupsAppendix() ---------------------------------------------
# function: Test multiple ToCs
sub TestMultipleGroupsAppendix() {
# Create objects
my $toc = HTML::Toc->new();
my $tocInsertor = HTML::TocInsertor->new();
my $output;
# Set ToC options
$toc->setOptions({
'tokenToToc' => [{
'tokenBegin' => '<h1 class=-appendix>'
}, {
'tokenBegin' => '<h2 class=-appendix>',
'level' => 2
}, {
'groupId' => 'appendix',
'tokenBegin' => '<h1 class=appendix>',
}, {
'groupId' => 'appendix',
'tokenBegin' => '<h2 class=appendix>',
'level' => 2
}],
});
# Generate ToC
$tocInsertor->insert($toc, <<EOT, {'output' => \$output});
<body>
<h1>Chapter</h1>
<h2>Paragraph</h2>
<h3>Subparagraph</h3>
<h1>Chapter</h1>
<h1 class=appendix>Appendix Chapter</h1>
<h2 class=appendix>Appendix Paragraph</h2>
</body>
EOT
# Test ToC
ok($output, <<EOT);
<body>
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1>Chapter</a>
<ul>
<li><a href=#h-1.1>Paragraph</a>
</ul>
<li><a href=#h-2>Chapter</a>
</ul>
<ul>
<li><a href=#appendix-1>Appendix Chapter</a>
<ul>
<li><a href=#appendix-1.1>Appendix Paragraph</a>
</ul>
</ul>
<!-- End of generated Table of Contents -->
<a name=h-1><h1>Chapter</h1></a>
<a name=h-1.1><h2>Paragraph</h2></a>
<h3>Subparagraph</h3>
<a name=h-2><h1>Chapter</h1></a>
<a name=appendix-1><h1 class=appendix>Appendix Chapter</h1></a>
<a name=appendix-1.1><h2 class=appendix>Appendix Paragraph</h2></a>
</body>
EOT
} # TestMultipleGroupsAppendix()
#--- TestMultipleGroupsPart() -------------------------------------------------
# function: Test multiple ToCs
sub TestMultipleGroupsPart() {
# Create objects
my $toc = HTML::Toc->new();
my $tocInsertor = HTML::TocInsertor->new();
my $output;
# Set ToC options
$toc->setOptions({
'tokenToToc' => [{
'tokenBegin' => '<h1 class=-part>'
}, {
'tokenBegin' => '<h2 class=-part>',
'level' => 2,
}, {
'groupId' => 'part',
'tokenBegin' => '<h1 class=part>',
'level' => 1,
'doNumberToken' => 1,
'numberingStyle' => 'upper-alpha'
}]
});
# Generate ToC
$tocInsertor->insert($toc, <<EOT, {'output' => \$output});
<body>
<h1 class=part>First Part</h1>
<h1>Chapter</h1>
<h2>Paragraph</h2>
<h1 class=part>Second Part</h1>
<h1>Chapter</h1>
<h2>Paragraph</h2>
</body>
EOT
# Test ToC
ok($output, <<EOT);
<body>
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#part-A>First Part</a>
</ul>
<ul>
<li><a href=#h-1>Chapter</a>
<ul>
<li><a href=#h-1.1>Paragraph</a>
</ul>
</ul>
<ul>
<li><a href=#part-B>Second Part</a>
</ul>
<ul>
<li><a href=#h-2>Chapter</a>
<ul>
<li><a href=#h-2.1>Paragraph</a>
</ul>
</ul>
<!-- End of generated Table of Contents -->
<a name=part-A><h1 class=part>A &nbsp;First Part</h1></a>
<a name=h-1><h1>Chapter</h1></a>
<a name=h-1.1><h2>Paragraph</h2></a>
<a name=part-B><h1 class=part>B &nbsp;Second Part</h1></a>
<a name=h-2><h1>Chapter</h1></a>
<a name=h-2.1><h2>Paragraph</h2></a>
</body>
EOT
} # TestMultipleGroupsPart()
#--- TestMultipleTocs() -------------------------------------------------------
# function: Test multiple ToCs
sub TestMultipleTocs() {
# Assemble test file
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<body>
<h1>Header One</h1>
<img src=test1.gif alt="First picture">
<h2>Paragraph One</h2>
<img src=test2.gif alt="Second picture">
</body>
EOT
# Create objects
my $toc1 = HTML::Toc->new();
my $toc2 = HTML::Toc->new();
my $tocInsertor = HTML::TocInsertor->new();
my $output;
# Set ToC options
$toc2->setOptions({
'tokenToToc' => [{
'groupId' => 'image',
'tokenBegin' => '<img alt=@>'
}],
});
# Generate ToC
$tocInsertor->insertIntoFile(
[$toc1, $toc2], $filename, {'output' => \$output}
);
# Test ToC
ok($output, <<EOT);
<body>
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1>Header One</a>
<ul>
<li><a href=#h-1.1>Paragraph One</a>
</ul>
</ul>
<!-- End of generated Table of Contents -->
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#image-1>First picture</a>
<li><a href=#image-2>Second picture</a>
</ul>
<!-- End of generated Table of Contents -->
<a name=h-1><h1>Header One</h1></a>
<a name=image-1><img src=test1.gif alt="First picture"></a>
<a name=h-1.1><h2>Paragraph One</h2></a>
<a name=image-2><img src=test2.gif alt="Second picture"></a>
</body>
EOT
} # TestMultipleTocs()
#--- TestSpecifyNumberedList() ------------------------------------------------
# function: Test specifying numbered list.
sub TestSpecifyNumberedList {
# Assemble test file
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<body>
<h1>Chapter</h1>
<h2>Paragraph</h2>
</body>
EOT
# Create objects
my $toc = HTML::Toc->new();
my $tocGenerator = HTML::TocGenerator->new();
# Set ToC options
$toc->setOptions({
'templateLevelBegin' => '"<ol>\n"',
'templateLevelEnd' => '"</ol>\n"',
});
# Generate ToC
$tocGenerator->generateFromFile($toc, $filename);
# Test ToC
ok($toc->format(), <<EOT);
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ol>
<li><a href=#h-1>Chapter</a>
<ol>
<li><a href=#h-1.1>Paragraph</a>
</ol>
</ol>
<!-- End of generated Table of Contents -->
EOT
} # TestSpecifyNumberedList()
#--- TestUpdateFile() ---------------------------------------------------------
# function: Test 'HTML::TocUpdator->updateFile()'
sub TestUpdateFile {
# Assemble test file
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<html>
<body><!-- #BeginToc -->
foo
<!-- #EndToc -->
<!-- #BeginTocAnchorNameBegin -->bar<!-- #EndTocAnchorNameBegin --><h1>
Chapter
</h1><!-- #BeginTocAnchorNameEnd -->foo<!-- #EndTocAnchorNameEnd -->
</body>
</html>
EOT
# Create objects
my $toc = HTML::Toc->new();
my $tocUpdator = HTML::TocUpdator->new();
my $output;
# Generate ToC
$tocUpdator->updateFile($toc, $filename, {'output' => \$output});
# Test ToC
ok($output, <<EOT);
<html>
<body><!-- #BeginToc -->
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=#h-1> Chapter </a>
</ul>
<!-- End of generated Table of Contents -->
<!-- #EndToc -->
<!-- #BeginTocAnchorNameBegin --><a name=h-1><!-- #EndTocAnchorNameBegin --><h1>
Chapter
</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
</body>
</html>
EOT
} # TestUpdateFile()
#--- TestUsingCSS() -----------------------------------------------------------
# function: Test multiple ToCs
sub TestUsingCSS() {
# Create objects
my $toc = new HTML::Toc;
my $tocInsertor = new HTML::TocInsertor;
my $output;
$toc->setOptions({
'templateLevelBegin' => '"<ol class=toc_$groupId$level>\n"',
'templateLevelEnd' => '"</ol>\n"',
'doNumberToken' => 1,
'tokenToToc' => [{
'groupId' => 'appendix',
'tokenBegin' => '<h1>',
'numberingStyle' => 'upper-alpha'
}, {
'groupId' => 'appendix',
'tokenBegin' => '<h2>',
'level' => 2,
}]
});
$tocInsertor->insert($toc, <<EOT);
<html>
<head>
<style type="text/css">
ol.toc_appendix1 { list-style-type: upper-alpha }
</style>
</head>
<body>
<h1>Appendix</h1>
<h2>Appendix Paragraph</h2>
<h1>Appendix</h1>
<h2>Appendix Paragraph</h2>
</body>
</html>
EOT
# Insert ToC
$tocInsertor->insert($toc, <<EOT, {'output' => \$output});
<html>
<head>
<style type="text/css">
ol.toc_appendix1 { list-style-type: upper-alpha }
</style>
</head>
<body>
<h1>Appendix</h1>
<h2>Appendix Paragraph</h2>
<h1>Appendix</h1>
<h2>Appendix Paragraph</h2>
</body>
</html>
EOT
# Test ToC
ok($output, <<EOT);
<html>
<head>
<style type="text/css">
ol.toc_appendix1 { list-style-type: upper-alpha }
</style>
</head>
<body>
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ol class=toc_appendix1>
<li><a href=#appendix-A>Appendix</a>
<ol class=toc_appendix2>
<li><a href=#appendix-A.1>Appendix Paragraph</a>
</ol>
<li><a href=#appendix-B>Appendix</a>
<ol class=toc_appendix2>
<li><a href=#appendix-B.1>Appendix Paragraph</a>
</ol>
</ol>
<!-- End of generated Table of Contents -->
<a name=appendix-A><h1>A &nbsp;Appendix</h1></a>
<a name=appendix-A.1><h2>A.1 &nbsp;Appendix Paragraph</h2></a>
<a name=appendix-B><h1>B &nbsp;Appendix</h1></a>
<a name=appendix-B.1><h2>B.1 &nbsp;Appendix Paragraph</h2></a>
</body>
</html>
EOT
} # TestUsingCSS()
# Test 'extendFromFile()'
TestExtendFromFile();
# Test 'generateFromFile()'
TestGenerateFromFile();
# Test 'generateFromFiles()'
TestGenerateFromFiles();
# Test 'doUseGroupsGlobal = 0'
TestGlobalGroups0();
# Test 'doUseGroupsGlobal = 1'
TestGlobalGroups1();
# Test 'tocInsertor->insertIntoFile'
TestInsertIntoFile();
# Test 'tocUpdator->insertIntoFile'
TestInsertIntoFileUsingTocUpdator();
# Test additional 'appendix' group
TestMultipleGroupsAppendix();
# Test additional 'part' group
TestMultipleGroupsPart();
# Test multiple ToCs
TestMultipleTocs();
# Test specifying numbered list
TestSpecifyNumberedList();
# Test 'updateFile()'
TestUpdateFile();
# Test using CSS
TestUsingCSS();

View File

@ -0,0 +1,176 @@
#--- propagate.t --------------------------------------------------------------
# function: Test ToC propagation.
use strict;
use Test;
BEGIN { plan tests => 10; }
use HTML::Toc;
use HTML::TocGenerator;
use HTML::TocInsertor;
my ($output, $content, $filename);
my $toc = HTML::Toc->new;
my $tocGenerator = HTML::TocGenerator->new;
my $tocInsertor = HTML::TocInsertor->new;
$toc->setOptions({
'doLinkToToken' => 0,
'levelIndent' => 0,
'insertionPoint' => 'before <h1>',
'header' => '',
'footer' => '',
});
BEGIN {
# Create test file
$filename = "file$$.htm";
die "$filename is already there" if -e $filename;
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<h1>Header</h1>
EOT
}
END {
# Remove test file
unlink($filename) or warn "Can't unlink $filename: $!";
}
#--- 1. propagate -------------------------------------------------------------
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
ok($output, "<ul>\n<li>Header\n</ul><h1>Header</h1>");
#--- 2. propagateFile ---------------------------------------------------------
$tocInsertor->insertIntoFile($toc, $filename, {'output' => \$output});
ok($output, "<ul>\n<li>Header\n</ul><h1>Header</h1>\n");
#--- 3. doLinkToToken -----------------------------------------------------
$toc->setOptions({'doLinkToToken' => 1});
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
ok("$output\n", <<'EOT');
<ul>
<li><a href=#h-1>Header</a>
</ul><a name=h-1><h1>Header</h1></a>
EOT
#--- 4. templateAnchorHrefBegin -----------------------------------------------
$toc->setOptions(
{'templateAnchorHrefBegin' => '"<$node${file}test${groupId}>"'}
);
$tocInsertor->insertIntoFile($toc, $filename, {'output' => \$output});
ok($output, "<ul>\n<li><1${filename}testh>Header</a>\n</ul><a name=h-1><h1>Header</h1></a>\n");
$toc->setOptions({'templateAnchorHrefBegin' => undef});
#--- 5. templateAnchorNameBegin -----------------------------------------------
$toc->setOptions({
'templateAnchorName' => '"$node$groupId"',
'templateAnchorNameBegin' => '"<$anchorName>"'
});
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
ok($output, "<ul>\n<li><a href=#1h>Header</a>\n</ul><1h><h1>Header</h1></a>");
$toc->setOptions({'templateAnchorName' => undef});
#--- 6. templateAnchorName function -------------------------------------------
sub AssembleAnchorName {
# Get arguments
my ($aFile, $aGroupId, $aLevel, $aNode) = @_;
# Return value
return $aFile . $aGroupId . $aLevel . $aNode;
} # AssembleAnchorName()
# Set options
$toc->setOptions({'templateAnchorNameBegin' => \&AssembleAnchorName});
# Propagate ToC
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
# Test ToC
ok($output, "<ul>\n<li><a href=#h-1>Header</a>\n</ul>h11<h1>Header</h1></a>");
# Restore options
$toc->setOptions({'templateAnchorNameBegin' => undef});
#--- 7. doNumberToken --------------------------------------------------------
# Set options
$toc->setOptions({'doNumberToken' => 1});
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
ok("$output\n", <<'EOT');
<ul>
<li><a href=#h-1>Header</a>
</ul><a name=h-1><h1>1 &nbsp;Header</h1></a>
EOT
# Reset options
$toc->setOptions({
'templateTokenNumber' => undef,
'doNumberToken' => 0
});
#--- 8. templateTokenNumber ---------------------------------------------------
# Set options
$toc->setOptions({
'templateTokenNumber' => '"-$node-"',
'doNumberToken' => 1
});
# Propagate ToC
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
# Test ToC
ok("$output\n", <<'EOT');
<ul>
<li><a href=#h-1>Header</a>
</ul><a name=h-1><h1>-1-Header</h1></a>
EOT
# Reset options
$toc->setOptions({
'doNumberToken' => 0,
'templateTokenNumber' => undef
});
#--- 9. numberingStyle --------------------------------------------------------
# Set options
$toc->setOptions({
'doNumberToken' => 1,
'tokenToToc' => [{
'level' => 1,
'tokenBegin' => '<h1>',
'numberingStyle' => 'lower-alpha'
}]
});
# Propagate ToC
$tocInsertor->insert($toc, "<h1>Header</h1>", {'output' => \$output});
# Test ToC
ok("$output\n", <<'EOT');
<ul>
<li><a href=#h-a>Header</a>
</ul><a name=h-a><h1>a &nbsp;Header</h1></a>
EOT
# Reset options
$toc->setOptions({
'doNumberToken' => 0,
'tokenToToc' => undef,
});
#--- 10. declaration pass through ---------------------------------------------
$tocInsertor->insert($toc, '<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><h1>Header</h1>', {'output' => \$output});
# Test ToC
ok($output, '<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><h1>Header</h1>');

View File

@ -0,0 +1,97 @@
#--- manual.t -----------------------------------------------------------------
# function: Test HTML::ToC generating a manual.
use strict;
use Test;
BEGIN { plan tests => 1; }
use Data::Dumper;
use File::Find;
use HTML::Toc;
use HTML::TocGenerator;
use HTML::TocInsertor;
use HTML::TocUpdator;
# Create objects
my $toc = HTML::Toc->new();
my $tocGenerator = HTML::TocGenerator->new();
my @fileList;
#--- TestSiteMap() ------------------------------------------------------------
# function: Test specifying numbered list.
sub TestSiteMap {
# Set ToC options
$toc->setOptions({
'doLinkToFile' => 1,
'templateAnchorName' => '""',
'templateAnchorHref' => '"<a href=$file"."#".$groupId.$level.">"',
'doLinkTocToToken' => 1,
'tokenToToc' => [{
'groupId' => 'dir',
'level' => 1,
'tokenBegin' => '<title>',
'tokenEnd' => '</title>',
'fileSpec' => '\./[^/]+$'
}, {
'groupId' => 'dir',
'level' => 2,
'tokenBegin' => '<title>',
'tokenEnd' => '</title>',
'fileSpec' => '\./[^/]+?/[^/]+$'
}, {
'groupId' => 'dir',
'level' => 3,
'tokenBegin' => '<title>',
'tokenEnd' => '</title>',
'fileSpec' => '\./[^/]+?/[^/]+?/[^/]+$'
}]
});
# Change current directory
chdir("t/SiteMap");
# Find files, filling 'fileList'
find({wanted => \&WantedSiteMap, no_chdir => 1}, '.');
# Generate ToC of case-insensitively sorted file list
$tocGenerator->extendFromFile(
$toc, [sort {uc($a) cmp uc($b)} @fileList]
);
# Restore current directory
chdir("../..");
# Test ToC
ok($toc->format(), <<EOT);
<!-- Table of Contents generated by Perl - HTML::Toc -->
<ul>
<li><a href=./index.htm#>Main</a>
<ul>
<li><a href=./SubDir1/index.htm#>Sub1</a>
<ul>
<li><a href=./SubDir1/SubSubDir1/index.htm#>SubSub1</a>
</ul>
<li><a href=./SubDir2/index.htm#>Sub2</a>
<ul>
<li><a href=./SubDir2/SubSubDir1/index.htm#>SubSub1</a>
<li><a href=./SubDir2/SubSubDir2/index.htm#>SubSub2</a>
</ul>
<li><a href=./SubDir3/index.htm#>Sub3</a>
</ul>
</ul>
<!-- End of generated Table of Contents -->
EOT
} # TestSiteMap()
#--- WantedSiteMap() ----------------------------------------------------------
# function: 'Wanted' function, used by File::Find of 'TestSiteMap()'.
sub WantedSiteMap {
# Add file to 'fileList' if extension matches '.htm'
push (@fileList, $File::Find::name) if (m/\.htm$/);
} # WantedSiteMap()
# Test site map
TestSiteMap();

View File

@ -0,0 +1,114 @@
#--- update.t -----------------------------------------------------------------
# function: Test ToC updating.
use strict;
use Test;
BEGIN { plan tests => 6; }
use HTML::Toc;
use HTML::TocUpdator;
my ($output, $output2, $content, $filename);
my $toc = HTML::Toc->new;
my $tocUpdator = HTML::TocUpdator->new;
$toc->setOptions({
'doLinkToToken' => 1,
'doNumberToken' => 1,
'levelIndent' => 0,
'insertionPoint' => 'before <h1>',
'header' => '',
'footer' => '',
});
BEGIN {
# Create test file
$filename = "file$$.htm";
die "$filename is already there" if -e $filename;
open(FILE, ">$filename") || die "Can't create $filename: $!";
print FILE <<'EOT'; close(FILE);
<h1>Header</h1>
EOT
}
END {
# Remove test file
unlink($filename) or warn "Can't unlink $filename: $!";
}
#--- 1. update ----------------------------------------------------------------
$tocUpdator->update($toc, "<h1>Header</h1>", {'output' => \$output});
ok("$output\n", <<'EOT');
<!-- #BeginToc --><ul>
<li><a href=#h-1>Header</a>
</ul><!-- #EndToc --><!-- #BeginTocAnchorNameBegin --><a name=h-1><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->1 &nbsp;<!-- #EndTocNumber -->Header</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
EOT
#--- 2. updateFile ------------------------------------------------------------
$tocUpdator->updateFile($toc, $filename, {'output' => \$output});
open(FILE, ">a.out1") || die "Can't create a.out1: $!";
print FILE $output; close(FILE);
$output2 = <<'EOT';
<!-- #BeginToc --><ul>
<li><a href=#h-1>Header</a>
</ul><!-- #EndToc --><!-- #BeginTocAnchorNameBegin --><a name=h-1><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->1 &nbsp;<!-- #EndTocNumber -->Header</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
EOT
open(FILE, ">a.out2") || die "Can't create a.out2: $!";
print FILE $output2; close(FILE);
ok($output, $output2);
#--- 3. insert ----------------------------------------------------------------
$tocUpdator->insert($toc, "<h1>Header</h1>", {'output' => \$output});
ok("$output\n", <<'EOT');
<!-- #BeginToc --><ul>
<li><a href=#h-1>Header</a>
</ul><!-- #EndToc --><!-- #BeginTocAnchorNameBegin --><a name=h-1><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->1 &nbsp;<!-- #EndTocNumber -->Header</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
EOT
#--- 4. insertIntoFile --------------------------------------------------------
$tocUpdator->insertIntoFile($toc, $filename, {'output' => \$output});
ok($output, <<'EOT');
<!-- #BeginToc --><ul>
<li><a href=#h-1>Header</a>
</ul><!-- #EndToc --><!-- #BeginTocAnchorNameBegin --><a name=h-1><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->1 &nbsp;<!-- #EndTocNumber -->Header</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
EOT
#--- 5. update twice ----------------------------------------------------------
$tocUpdator->update($toc, "<h1>Header</h1>", {'output' => \$output});
$tocUpdator->update($toc, $output, {'output' => \$output2});
ok("$output\n", <<'EOT');
<!-- #BeginToc --><ul>
<li><a href=#h-1>Header</a>
</ul><!-- #EndToc --><!-- #BeginTocAnchorNameBegin --><a name=h-1><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->1 &nbsp;<!-- #EndTocNumber -->Header</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
EOT
#--- 6. tokens update begin & end ---------------------------------------------
$toc->setOptions({
'tokenUpdateBeginOfAnchorNameBegin' => '<tocAnchorNameBegin>',
'tokenUpdateEndOfAnchorNameBegin' => '</tocAnchorNameBegin>',
'tokenUpdateBeginOfAnchorNameEnd' => '<tocAnchorNameEnd>',
'tokenUpdateEndOfAnchorNameEnd' => '</tocAnchorNameEnd>',
'tokenUpdateBeginNumber' => '<tocNumber>',
'tokenUpdateEndNumber' => '</tocNumber>',
'tokenUpdateBeginToc' => '<toc>',
'tokenUpdateEndToc', => '</toc>'
});
$tocUpdator->update($toc, "<h1>Header</h1>", {'output' => \$output});
ok("$output\n", <<'EOT');
<toc><ul>
<li><a href=#h-1>Header</a>
</ul></toc><tocAnchorNameBegin><a name=h-1></tocAnchorNameBegin><h1><tocNumber>1 &nbsp;</tocNumber>Header</h1><tocAnchorNameEnd></a></tocAnchorNameEnd>
EOT

View File

@ -0,0 +1,36 @@
PHP Markdown & Extra
Copyright (c) 2004-2008 Michel Fortin
<http://www.michelf.com/>
All rights reserved.
Based on Markdown
Copyright (c) 2003-2006 John Gruber
<http://daringfireball.net/>
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name "Markdown" nor the names of its contributors may
be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as
is" and any express or implied warranties, including, but not limited
to, the implied warranties of merchantability and fitness for a
particular purpose are disclaimed. In no event shall the copyright owner
or contributors be liable for any direct, indirect, incidental, special,
exemplary, or consequential damages (including, but not limited to,
procurement of substitute goods or services; loss of use, data, or
profits; or business interruption) however caused and on any theory of
liability, whether in contract, strict liability, or tort (including
negligence or otherwise) arising in any way out of the use of this
software, even if advised of the possibility of such damage.

View File

@ -0,0 +1,731 @@
PHP Markdown Extra
==================
Version 1.2.3 - Wed 31 Dec 2008
by Michel Fortin
<http://www.michelf.com/>
based on Markdown by John Gruber
<http://daringfireball.net/>
Introduction
------------
This is a special version of PHP Markdown with extra features. See
<http://www.michelf.com/projects/php-markdown/extra/> for details.
Markdown is a text-to-HTML conversion tool for web writers. Markdown
allows you to write using an easy-to-read, easy-to-write plain text
format, then convert it to structurally valid XHTML (or HTML).
"Markdown" is two things: a plain text markup syntax, and a software
tool, written in Perl, that converts the plain text markup to HTML.
PHP Markdown is a port to PHP of the original Markdown program by
John Gruber.
PHP Markdown can work as a plug-in for WordPress and bBlog, as a
modifier for the Smarty templating engine, or as a remplacement for
textile formatting in any software that support textile.
Full documentation of Markdown's syntax is available on John's
Markdown page: <http://daringfireball.net/projects/markdown/>
Installation and Requirement
----------------------------
PHP Markdown requires PHP version 4.0.5 or later.
### WordPress ###
PHP Markdown works with [WordPress][wp], version 1.2 or later.
[wp]: http://wordpress.org/
1. To use PHP Markdown with WordPress, place the "makrdown.php" file
in the "plugins" folder. This folder is located inside
"wp-content" at the root of your site:
(site home)/wp-content/plugins/
2. Activate the plugin with the administrative interface of
WordPress. In the "Plugins" section you will now find Markdown.
To activate the plugin, click on the "Activate" button on the
same line than Markdown. Your entries will now be formatted by
PHP Markdown.
3. To post Markdown content, you'll first have to disable the
"visual" editor in the User section of WordPress.
You can configure PHP Markdown to not apply to the comments on your
WordPress weblog. See the "Configuration" section below.
It is not possible at this time to apply a different set of
filters to different entries. All your entries will be formated by
PHP Markdown. This is a limitation of WordPress. If your old entries
are written in HTML (as opposed to another formatting syntax, like
Textile), they'll probably stay fine after installing Markdown.
### bBlog ###
PHP Markdown also works with [bBlog][bb].
[bb]: http://www.bblog.com/
To use PHP Markdown with bBlog, rename "markdown.php" to
"modifier.markdown.php" and place the file in the "bBlog_plugins"
folder. This folder is located inside the "bblog" directory of
your site, like this:
(site home)/bblog/bBlog_plugins/modifier.markdown.php
Select "Markdown" as the "Entry Modifier" when you post a new
entry. This setting will only apply to the entry you are editing.
### Replacing Textile in TextPattern ###
[TextPattern][tp] use [Textile][tx] to format your text. You can
replace Textile by Markdown in TextPattern without having to change
any code by using the *Texitle Compatibility Mode*. This may work
with other software that expect Textile too.
[tx]: http://www.textism.com/tools/textile/
[tp]: http://www.textpattern.com/
1. Rename the "markdown.php" file to "classTextile.php". This will
make PHP Markdown behave as if it was the actual Textile parser.
2. Replace the "classTextile.php" file TextPattern installed in your
web directory. It can be found in the "lib" directory:
(site home)/textpattern/lib/
Contrary to Textile, Markdown does not convert quotes to curly ones
and does not convert multiple hyphens (`--` and `---`) into en- and
em-dashes. If you use PHP Markdown in Textile Compatibility Mode, you
can solve this problem by installing the "smartypants.php" file from
[PHP SmartyPants][psp] beside the "classTextile.php" file. The Textile
Compatibility Mode function will use SmartyPants automatically without
further modification.
[psp]: http://www.michelf.com/projects/php-smartypants/
### In Your Own Programs ###
You can use PHP Markdown easily in your current PHP program. Simply
include the file and then call the Markdown function on the text you
want to convert:
include_once "markdown.php";
$my_html = Markdown($my_text);
If you wish to use PHP Markdown with another text filter function
built to parse HTML, you should filter the text *after* the Markdown
function call. This is an example with [PHP SmartyPants][psp]:
$my_html = SmartyPants(Markdown($my_text));
### With Smarty ###
If your program use the [Smarty][sm] template engine, PHP Markdown
can now be used as a modifier for your templates. Rename "markdown.php"
to "modifier.markdown.php" and put it in your smarty plugins folder.
[sm]: http://smarty.php.net/
If you are using MovableType 3.1 or later, the Smarty plugin folder is
located at `(MT CGI root)/php/extlib/smarty/plugins`. This will allow
Markdown to work on dynamic pages.
### Updating Markdown in Other Programs ###
Many web applications now ship with PHP Markdown, or have plugins to
perform the conversion to HTML. You can update PHP Markdown -- or
replace it with PHP Markdown Extra -- in many of these programs by
swapping the old "markdown.php" file for the new one.
Here is a short non-exhaustive list of some programs and where they
hide the "markdown.php" file.
| Program | Path to Markdown
| ------- | ----------------
| [Pivot][] | `(site home)/pivot/includes/markdown/`
If you're unsure if you can do this with your application, ask the
developer, or wait for the developer to update his application or
plugin with the new version of PHP Markdown.
[Pivot]: http://pivotlog.net/
Configuration
-------------
By default, PHP Markdown produces XHTML output for tags with empty
elements. E.g.:
<br />
Markdown can be configured to produce HTML-style tags; e.g.:
<br>
To do this, you must edit the "MARKDOWN_EMPTY_ELEMENT_SUFFIX"
definition below the "Global default settings" header at the start of
the "markdown.php" file.
### WordPress-Specific Settings ###
By default, the Markdown plugin applies to both posts and comments on
your WordPress weblog. To deactivate one or the other, edit the
`MARKDOWN_WP_POSTS` or `MARKDOWN_WP_COMMENTS` definitions under the
"WordPress settings" header at the start of the "markdown.php" file.
Bugs
----
To file bug reports please send email to:
<michel.fortin@michelf.com>
Please include with your report: (1) the example input; (2) the output you
expected; (3) the output PHP Markdown actually produced.
Version History
---------------
Extra 1.2.3 (31 Dec 2008):
* In WordPress pages featuring more than one post, footnote id prefixes are
now automatically applied with the current post ID to avoid clashes
between footnotes belonging to different posts.
* Fix for a bug introduced in Extra 1.2 where block-level HTML tags where
not detected correctly, thus the addition of erroneous `<p>` tags and
interpretation of their content as Markdown-formatted instead of
HTML-formatted.
Extra 1.2.2 (21 Jun 2008):
* Fixed a problem where abbreviation definitions, footnote
definitions and link references were stripped inside
fenced code blocks.
* Fixed a bug where characters such as `"` in abbreviation
definitions weren't properly encoded to HTML entities.
* Fixed a bug where double quotes `"` were not correctly encoded
as HTML entities when used inside a footnote reference id.
1.0.1m (21 Jun 2008):
* Lists can now have empty items.
* Rewrote the emphasis and strong emphasis parser to fix some issues
with odly placed and overlong markers.
Extra 1.2.1 (27 May 2008):
* Fixed a problem where Markdown headers and horizontal rules were
transformed into their HTML equivalent inside fenced code blocks.
Extra 1.2 (11 May 2008):
* Added fenced code block syntax which don't require indentation
and can start and end with blank lines. A fenced code block
starts with a line of consecutive tilde (~) and ends on the
next line with the same number of consecutive tilde. Here's an
example:
~~~~~~~~~~~~
Hello World!
~~~~~~~~~~~~
* Rewrote parts of the HTML block parser to better accomodate
fenced code blocks.
* Footnotes may now be referenced from within another footnote.
* Added programatically-settable parser property `predef_attr` for
predefined attribute definitions.
* Fixed an issue where an indented code block preceded by a blank
line containing some other whitespace would confuse the HTML
block parser into creating an HTML block when it should have
been code.
1.0.1l (11 May 2008):
* Now removing the UTF-8 BOM at the start of a document, if present.
* Now accepting capitalized URI schemes (such as HTTP:) in automatic
links, such as `<HTTP://EXAMPLE.COM/>`.
* Fixed a problem where `<hr@example.com>` was seen as a horizontal
rule instead of an automatic link.
* Fixed an issue where some characters in Markdown-generated HTML
attributes weren't properly escaped with entities.
* Fix for code blocks as first element of a list item. Previously,
this didn't create any code block for item 2:
* Item 1 (regular paragraph)
* Item 2 (code block)
* A code block starting on the second line of a document wasn't seen
as a code block. This has been fixed.
* Added programatically-settable parser properties `predef_urls` and
`predef_titles` for predefined URLs and titles for reference-style
links. To use this, your PHP code must call the parser this way:
$parser = new Markdwon_Parser;
$parser->predef_urls = array('linkref' => 'http://example.com');
$html = $parser->transform($text);
You can then use the URL as a normal link reference:
[my link][linkref]
[my link][linkRef]
Reference names in the parser properties *must* be lowercase.
Reference names in the Markdown source may have any case.
* Added `setup` and `teardown` methods which can be used by subclassers
as hook points to arrange the state of some parser variables before and
after parsing.
Extra 1.1.7 (26 Sep 2007):
1.0.1k (26 Sep 2007):
* Fixed a problem introduced in 1.0.1i where three or more identical
uppercase letters, as well as a few other symbols, would trigger
a horizontal line.
Extra 1.1.6 (4 Sep 2007):
1.0.1j (4 Sep 2007):
* Fixed a problem introduced in 1.0.1i where the closing `code` and
`pre` tags at the end of a code block were appearing in the wrong
order.
* Overriding configuration settings by defining constants from an
external before markdown.php is included is now possible without
producing a PHP warning.
Extra 1.1.5 (31 Aug 2007):
1.0.1i (31 Aug 2007):
* Fixed a problem where an escaped backslash before a code span
would prevent the code span from being created. This should now
work as expected:
Litteral backslash: \\`code span`
* Overall speed improvements, especially with long documents.
Extra 1.1.4 (3 Aug 2007):
1.0.1h (3 Aug 2007):
* Added two properties (`no_markup` and `no_entities`) to the parser
allowing HTML tags and entities to be disabled.
* Fix for a problem introduced in 1.0.1g where posting comments in
WordPress would trigger PHP warnings and cause some markup to be
incorrectly filtered by the kses filter in WordPress.
Extra 1.1.3 (3 Jul 2007):
* Fixed a performance problem when parsing some invalid HTML as an HTML
block which was resulting in too much recusion and a segmentation fault
for long documents.
* The markdown="" attribute now accepts unquoted values.
* Fixed an issue where underscore-emphasis didn't work when applied on the
first or the last word of an element having the markdown="1" or
markdown="span" attribute set unless there was some surrounding whitespace.
This didn't work:
<p markdown="1">_Hello_ _world_</p>
Now it does produce emphasis as expected.
* Fixed an issue preventing footnotes from working when the parser's
footnote id prefix variable (fn_id_prefix) is not empty.
* Fixed a performance problem where the regular expression for strong
emphasis introduced in version 1.1 could sometime be long to process,
give slightly wrong results, and in some circumstances could remove
entirely the content for a whole paragraph.
* Fixed an issue were abbreviations tags could be incorrectly added
inside URLs and title of links.
* Placing footnote markers inside a link, resulting in two nested links, is
no longer allowed.
1.0.1g (3 Jul 2007):
* Fix for PHP 5 compiled without the mbstring module. Previous fix to
calculate the length of UTF-8 strings in `detab` when `mb_strlen` is
not available was only working with PHP 4.
* Fixed a problem with WordPress 2.x where full-content posts in RSS feeds
were not processed correctly by Markdown.
* Now supports URLs containing literal parentheses for inline links
and images, such as:
[WIMP](http://en.wikipedia.org/wiki/WIMP_(computing))
Such parentheses may be arbitrarily nested, but must be
balanced. Unbalenced parentheses are allowed however when the URL
when escaped or when the URL is enclosed in angle brakets `<>`.
* Fixed a performance problem where the regular expression for strong
emphasis introduced in version 1.0.1d could sometime be long to process,
give slightly wrong results, and in some circumstances could remove
entirely the content for a whole paragraph.
* Some change in version 1.0.1d made possible the incorrect nesting of
anchors within each other. This is now fixed.
* Fixed a rare issue where certain MD5 hashes in the content could
be changed to their corresponding text. For instance, this:
The MD5 value for "+" is "26b17225b626fb9238849fd60eabdf60".
was incorrectly changed to this in previous versions of PHP Markdown:
<p>The MD5 value for "+" is "+".</p>
* Now convert escaped characters to their numeric character
references equivalent.
This fix an integration issue with SmartyPants and backslash escapes.
Since Markdown and SmartyPants have some escapable characters in common,
it was sometime necessary to escape them twice. Previously, two
backslashes were sometime required to prevent Markdown from "eating" the
backslash before SmartyPants sees it:
Here are two hyphens: \\--
Now, only one backslash will do:
Here are two hyphens: \--
Extra 1.1.2 (7 Feb 2007)
* Fixed an issue where headers preceded too closely by a paragraph
(with no blank line separating them) where put inside the paragraph.
* Added the missing TextileRestricted method that was added to regular
PHP Markdown since 1.0.1d but which I forgot to add to Extra.
1.0.1f (7 Feb 2007):
* Fixed an issue with WordPress where manually-entered excerpts, but
not the auto-generated ones, would contain nested paragraphs.
* Fixed an issue introduced in 1.0.1d where headers and blockquotes
preceded too closely by a paragraph (not separated by a blank line)
where incorrectly put inside the paragraph.
* Fixed an issue introduced in 1.0.1d in the tokenizeHTML method where
two consecutive code spans would be merged into one when together they
form a valid tag in a multiline paragraph.
* Fixed an long-prevailing issue where blank lines in code blocks would
be doubled when the code block is in a list item.
This was due to the list processing functions relying on artificially
doubled blank lines to correctly determine when list items should
contain block-level content. The list item processing model was thus
changed to avoid the need for double blank lines.
* Fixed an issue with `<% asp-style %>` instructions used as inline
content where the opening `<` was encoded as `&lt;`.
* Fixed a parse error occuring when PHP is configured to accept
ASP-style delimiters as boundaries for PHP scripts.
* Fixed a bug introduced in 1.0.1d where underscores in automatic links
got swapped with emphasis tags.
Extra 1.1.1 (28 Dec 2006)
* Fixed a problem where whitespace at the end of the line of an atx-style
header would cause tailing `#` to appear as part of the header's content.
This was caused by a small error in the regex that handles the definition
for the id attribute in PHP Markdown Extra.
* Fixed a problem where empty abbreviations definitions would eat the
following line as its definition.
* Fixed an issue with calling the Markdown parser repetitivly with text
containing footnotes. The footnote hashes were not reinitialized properly.
1.0.1e (28 Dec 2006)
* Added support for internationalized domain names for email addresses in
automatic link. Improved the speed at which email addresses are converted
to entities. Thanks to Milian Wolff for his optimisations.
* Made deterministic the conversion to entities of email addresses in
automatic links. This means that a given email address will always be
encoded the same way.
* PHP Markdown will now use its own function to calculate the length of an
UTF-8 string in `detab` when `mb_strlen` is not available instead of
giving a fatal error.
Extra 1.1 (1 Dec 2006)
* Added a syntax for footnotes.
* Added an experimental syntax to define abbreviations.
1.0.1d (1 Dec 2006)
* Fixed a bug where inline images always had an empty title attribute. The
title attribute is now present only when explicitly defined.
* Link references definitions can now have an empty title, previously if the
title was defined but left empty the link definition was ignored. This can
be useful if you want an empty title attribute in images to hide the
tooltip in Internet Explorer.
* Made `detab` aware of UTF-8 characters. UTF-8 multi-byte sequences are now
correctly mapped to one character instead of the number of bytes.
* Fixed a small bug with WordPress where WordPress' default filter `wpautop`
was not properly deactivated on comment text, resulting in hard line breaks
where Markdown do not prescribes them.
* Added a `TextileRestrited` method to the textile compatibility mode. There
is no restriction however, as Markdown does not have a restricted mode at
this point. This should make PHP Markdown work again in the latest
versions of TextPattern.
* Converted PHP Markdown to a object-oriented design.
* Changed span and block gamut methods so that they loop over a
customizable list of methods. This makes subclassing the parser a more
interesting option for creating syntax extensions.
* Also added a "document" gamut loop which can be used to hook document-level
methods (like for striping link definitions).
* Changed all methods which were inserting HTML code so that they now return
a hashed representation of the code. New methods `hashSpan` and `hashBlock`
are used to hash respectivly span- and block-level generated content. This
has a couple of significant effects:
1. It prevents invalid nesting of Markdown-generated elements which
could occur occuring with constructs like `*something [link*][1]`.
2. It prevents problems occuring with deeply nested lists on which
paragraphs were ill-formed.
3. It removes the need to call `hashHTMLBlocks` twice during the the
block gamut.
Hashes are turned back to HTML prior output.
* Made the block-level HTML parser smarter using a specially-crafted regular
expression capable of handling nested tags.
* Solved backtick issues in tag attributes by rewriting the HTML tokenizer to
be aware of code spans. All these lines should work correctly now:
<span attr='`ticks`'>bar</span>
<span attr='``double ticks``'>bar</span>
`<test a="` content of attribute `">`
* Changed the parsing of HTML comments to match simply from `<!--` to `-->`
instead using of the more complicated SGML-style rule with paired `--`.
This is how most browsers parse comments and how XML defines them too.
* `<address>` has been added to the list of block-level elements and is now
treated as an HTML block instead of being wrapped within paragraph tags.
* Now only trim trailing newlines from code blocks, instead of trimming
all trailing whitespace characters.
* Fixed bug where this:
[text](http://m.com "title" )
wasn't working as expected, because the parser wasn't allowing for spaces
before the closing paren.
* Filthy hack to support markdown='1' in div tags.
* _DoAutoLinks() now supports the 'dict://' URL scheme.
* PHP- and ASP-style processor instructions are now protected as
raw HTML blocks.
<? ... ?>
<% ... %>
* Fix for escaped backticks still triggering code spans:
There are two raw backticks here: \` and here: \`, not a code span
Extra 1.0 - 5 September 2005
* Added support for setting the id attributes for headers like this:
Header 1 {#header1}
========
## Header 2 ## {#header2}
This only work only for headers for now.
* Tables will now work correctly as the first element of a definition
list. For example, this input:
Term
: Header | Header
------- | -------
Cell | Cell
used to produce no definition list and a table where the first
header was named ": Header". This is now fixed.
* Fix for a problem where a paragraph following a table was not
placed between `<p>` tags.
Extra 1.0b4 - 1 August 2005
* Fixed some issues where whitespace around HTML blocks were trigging
empty paragraph tags.
* Fixed an HTML block parsing issue that would cause a block element
following a code span or block with unmatched opening bracket to be
placed inside a paragraph.
* Removed some PHP notices that could appear when parsing definition
lists and tables with PHP notice reporting flag set.
Extra 1.0b3 - 29 July 2005
* Definition lists now require a blank line before each term. Solves
an ambiguity where the last line of lazy-indented definitions could
be mistaken by PHP Markdown as a new term in the list.
* Definition lists now support multiple terms per definition.
* Some special tags were replaced in the output by their md5 hash
key. Things such as this now work as expected:
## Header <?php echo $number ?> ##
Extra 1.0b2 - 26 July 2005
* Definition lists can now take two or more definitions for one term.
This should have been the case before, but a bug prevented this
from working right.
* Fixed a problem where single column table with a pipe only at the
end where not parsed as table. Here is such a table:
| header
| ------
| cell
* Fixed problems with empty cells in the first column of a table with
no leading pipe, like this one:
header | header
------ | ------
| cell
* Code spans containing pipes did not within a table. This is now
fixed by parsing code spans before splitting rows into cells.
* Added the pipe character to the backlash escape character lists.
Extra 1.0b1 (25 Jun 2005)
* First public release of PHP Markdown Extra.
Copyright and License
---------------------
Copyright (c) 2004-2005 Michel Fortin
<http://www.michelf.com/>
All rights reserved.
Based on Markdown
Copyright (c) 2003-2005 John Gruber
<http://daringfireball.net/>
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the
distribution.
* Neither the name "Markdown" nor the names of its contributors may
be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as
is" and any express or implied warranties, including, but not limited
to, the implied warranties of merchantability and fitness for a
particular purpose are disclaimed. In no event shall the copyright owner
or contributors be liable for any direct, indirect, incidental, special,
exemplary, or consequential damages (including, but not limited to,
procurement of substitute goods or services; loss of use, data, or
profits; or business interruption) however caused and on any theory of
liability, whether in contract, strict liability, or tort (including
negligence or otherwise) arising in any way out of the use of this
software, even if advised of the possibility of such damage.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,394 @@
PHP SmartyPants
===============
Version 1.5.1e - Fri 9 Dec 2005
by Michel Fortin
<http://www.michelf.com/>
based on work by John Gruber
<http://daringfireball.net/>
Introduction
------------
PHP SmartyPants is a port to PHP of the original SmartyPants written
in Perl by John Gruber.
PHP SmartyPants is a free web publishing plug-in for WordPress and
Smarty template engine that easily translates plain ASCII punctuation
characters into "smart" typographic punctuation HTML entities.
SmartyPants can also be invoked as a standalone PHP function.
SmartyPants can perform the following transformations:
* Straight quotes (`"` and `'`) into "curly" quote HTML entities
* Backtick-style quotes (` ``like this'' `) into "curly" quote HTML
entities
* Dashes (`--` and `---`) into en- and em-dash entities
* Three consecutive dots (`...`) into an ellipsis entity
This means you can write, edit, and save using plain old ASCII straight
quotes, plain dashes, and plain dots, but your published posts (and
final HTML output) will appear with smart quotes, em-dashes, and proper
ellipses.
SmartyPants does not modify characters within `<pre>`, `<code>`,
`<kbd>`, or `<script>` tag blocks. Typically, these tags are used to
display text where smart quotes and other "smart punctuation" would not
be appropriate, such as source code or example markup.
### Backslash Escapes ###
If you need to use literal straight quotes (or plain hyphens and
periods), SmartyPants accepts the following backslash escape sequences
to force non-smart punctuation. It does so by transforming the escape
sequence into a decimal-encoded HTML entity:
Escape Value Character
------ ----- ---------
\\ &#92; \
\" &#34; "
\' &#39; '
\. &#46; .
\- &#45; -
\` &#96; `
This is useful, for example, when you want to use straight quotes as
foot and inch marks:
6\'2\" tall
translates into:
6&#39;2&#34; tall
in SmartyPants's HTML output. Which, when rendered by a web browser,
looks like:
6'2" tall
Installation and Requirement
----------------------------
PHP SmartyPants require PHP version 4.0.5 or later.
### WordPress ###
WordPress already include a filter called "Texturize" with the same
goal as SmartyPants. You could still find some usefulness to
PHP SmartyPants if you are not happy enough with the standard algorithm.
PHP SmartyPants works with [WordPress][wp], version 1.2 or later.
[wp]: http://wordpress.org/
1. To use PHP SmartyPants with WordPress, place the "smartypants.php"
file in the "plugins" folder. This folder is hidden inside
"wp-content" at the root of your site:
(site home)/wp-content/plugins/smartypants.php
2. Activate the plugin with the administrative interface of WordPress.
In the "Plugins" section you will now find SmartyPants. To activate
the plugin, click on the "Activate" button on the same line than
SmartyPants. Your entries will now be filtered by PHP SmartyPants.
Note: It is not possible at this time to apply a different set of
filters to different entries. All your entries will be filtered by
PHP SmartyPants if the plugin is active. This is currently a limitation
of WordPress.
### Blosxom ###
SmartyPants works with Blosxom version 2.0 or later.
1. Rename the "SmartyPants.pl" plug-in to "SmartyPants" (case is
important). Movable Type requires plug-ins to have a ".pl"
extension; Blosxom forbids it (at least as of this writing).
2. Copy the "SmartyPants" plug-in file to your Blosxom plug-ins folder.
If you're not sure where your Blosxom plug-ins folder is, see the
Blosxom documentation for information.
3. That's it. The entries in your weblog should now automatically have
SmartyPants's default transformations applied.
4. If you wish to configure SmartyPants's behavior, open the
"SmartyPants" plug-in, and edit the value of the `$smartypants_attr`
configuration variable, located near the top of the script. The
default value is 1; see "Options", below, for the full list of
supported values.
### In your programs ###
You can use PHP SmartyPants easily in your current PHP program. Simply
include the file and then call the `SmartyPants` function on the text
you want to convert:
include_once "smartypants.php";
$my_text = SmartyPants($my_text);
### With Smarty ###
If your program use the [Smarty][sm] template engine, PHP SmartyPants
can now be used as a modifier for your templates. Rename
"smartypants.php" to "modifier.smartypants.php" and put it in your
smarty plugins folder.
[sm]: http://smarty.php.net/
Options and Configuration
-------------------------
Settings are specified by editing the value of the `$smartypants_attr`
variable in the "smartypants.php" file. For users of the Smarty template
engine, the "smartypants" modifier also takes an optional attribute where
you can specify configuration options, like this:
`{$var|smartypants:1}` (where "1" is the configuration option).
Numeric values are the easiest way to configure SmartyPants's behavior:
"0"
Suppress all transformations. (Do nothing.)
"1"
Performs default SmartyPants transformations: quotes (including
backticks-style), em-dashes, and ellipses. `--` (dash dash) is
used to signify an em-dash; there is no support for en-dashes.
"2"
Same as smarty_pants="1", except that it uses the old-school
typewriter shorthand for dashes: `--` (dash dash) for en-dashes,
`---` (dash dash dash) for em-dashes.
"3"
Same as smarty_pants="2", but inverts the shorthand for dashes: `--`
(dash dash) for em-dashes, and `---` (dash dash dash) for en-dashes.
"-1"
Stupefy mode. Reverses the SmartyPants transformation process,
turning the HTML entities produced by SmartyPants into their ASCII
equivalents. E.g. `&#8220;` is turned into a simple double-quote
(`"`), `&#8212;` is turned into two dashes, etc. This is useful if you
wish to suppress smart punctuation in specific pages, such as
RSS feeds.
The following single-character attribute values can be combined to
toggle individual transformations from within the smarty_pants
attribute. For example, to educate normal quotes and em-dashes, but not
ellipses or backticks-style quotes:
$smartypants_attr = "qd";
Or inside a Smarty template:
{$var|smartypants:"qd"}
"q"
Educates normal quote characters: (`"`) and (`'`).
"b"
Educates ` ``backticks'' ` double quotes.
"B"
Educates backticks-style double quotes and ` `single' ` quotes.
"d"
Educates em-dashes.
"D"
Educates em-dashes and en-dashes, using old-school typewriter
shorthand: (dash dash) for en-dashes, (dash dash dash) for
em-dashes.
"i"
Educates em-dashes and en-dashes, using inverted old-school
typewriter shorthand: (dash dash) for em-dashes, (dash dash dash)
for en-dashes.
"e"
Educates ellipses.
"w"
Translates any instance of `&quot;` into a normal double-quote
character. This should be of no interest to most people, but of
particular interest to anyone who writes their posts using
Dreamweaver, as Dreamweaver inexplicably uses this entity to
represent a literal double-quote character. SmartyPants only
educates normal quotes, not entities (because ordinarily, entities
are used for the explicit purpose of representing the specific
character they represent). The "w" option must be used in
conjunction with one (or both) of the other quote options ("q" or
"b"). Thus, if you wish to apply all SmartyPants transformations
(quotes, en- and em-dashes, and ellipses) and also translate
`&quot;` entities into regular quotes so SmartyPants can educate
them, you should pass the following to the smarty_pants attribute:
$smartypants_attr = "qDew";
Inside a Smarty template, this will be:
{$var|smartypants:"qDew"}
Caveats
-------
### Why You Might Not Want to Use Smart Quotes in Your Weblog ###
For one thing, you might not care.
Most normal, mentally stable individuals do not take notice of proper
typographic punctuation. Many design and typography nerds, however,
break out in a nasty rash when they encounter, say, a restaurant sign
that uses a straight apostrophe to spell "Joe's".
If you're the sort of person who just doesn't care, you might well want
to continue not caring. Using straight quotes -- and sticking to the
7-bit ASCII character set in general -- is certainly a simpler way to
live.
Even if you *do* care about accurate typography, you still might want to
think twice before educating the quote characters in your weblog. One
side effect of publishing curly quote HTML entities is that it makes
your weblog a bit harder for others to quote from using copy-and-paste.
What happens is that when someone copies text from your blog, the copied
text contains the 8-bit curly quote characters (as well as the 8-bit
characters for em-dashes and ellipses, if you use these options). These
characters are not standard across different text encoding methods,
which is why they need to be encoded as HTML entities.
People copying text from your weblog, however, may not notice that
you're using curly quotes, and they'll go ahead and paste the unencoded
8-bit characters copied from their browser into an email message or
their own weblog. When pasted as raw "smart quotes", these characters
are likely to get mangled beyond recognition.
That said, my own opinion is that any decent text editor or email client
makes it easy to stupefy smart quote characters into their 7-bit
equivalents, and I don't consider it my problem if you're using an
indecent text editor or email client.
### Algorithmic Shortcomings ###
One situation in which quotes will get curled the wrong way is when
apostrophes are used at the start of leading contractions. For example:
'Twas the night before Christmas.
In the case above, SmartyPants will turn the apostrophe into an opening
single-quote, when in fact it should be a closing one. I don't think
this problem can be solved in the general case -- every word processor
I've tried gets this wrong as well. In such cases, it's best to use the
proper HTML entity for closing single-quotes (`&#8217;` or `&rsquo;`) by
hand.
Bugs
----
To file bug reports or feature requests (other than topics listed in the
Caveats section above) please send email to:
<michel.fortin@michelf.com>
If the bug involves quotes being curled the wrong way, please send
example text to illustrate.
Version History
---------------
1.5.1e (9 Dec 2005)
* Corrected a bug that prevented special characters from being
escaped.
1.5.1d (6 Jun 2005)
* Correct a small bug in `_TokenizeHTML` where a Doctype declaration
was not seen as HTML, making curly quotes inside it.
1.5.1c (13 Dec 2004)
* Changed a regular expression in `_TokenizeHTML` that could lead
to a segmentation fault with PHP 4.3.8 on Linux.
1.5.1b (6 Sep 2004)
* Corrected a problem with quotes immediately following a dash
with no space between: `Text--"quoted text"--text.`
* PHP SmartyPants can now be used as a modifier by the Smarty
template engine. Rename the file to "modifier.smartypants.php"
and put it in your smarty plugins folder.
* Replaced a lot of spaces characters by tabs, saving about 4 KB.
1.5.1a (30 Jun 2004)
* PHP Markdown and PHP Smartypants now share the same `_TokenizeHTML`
function when loaded simultanously.
* Changed the internals of `_TokenizeHTML` to lower the PHP version
requirement to PHP 4.0.5.
1.5.1 (6 Jun 2004)
* Initial release of PHP SmartyPants, based on version 1.5.1 of the
original SmartyPants written in Perl.
Copyright and License
---------------------
Copyright (c) 2005 Michel Fortin
<http://www.michelf.com/>
All rights reserved.
Copyright (c) 2003-2004 John Gruber
<http://daringfireball.net/>
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name "SmartyPants" nor the names of its contributors may
be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as
is" and any express or implied warranties, including, but not limited
to, the implied warranties of merchantability and fitness for a
particular purpose are disclaimed. In no event shall the copyright owner
or contributors be liable for any direct, indirect, incidental, special,
exemplary, or consequential damages (including, but not limited to,
procurement of substitute goods or services; loss of use, data, or
profits; or business interruption) however caused and on any theory of
liability, whether in contract, strict liability, or tort (including
negligence or otherwise) arising in any way out of the use of this
software, even if advised of the possibility of such damage.

View File

@ -0,0 +1,860 @@
<?php
#
# SmartyPants - Smart punctuation for web sites
#
# by John Gruber
# <http://daringfireball.net>
#
# PHP port by Michel Fortin
# <http://www.michelf.com/>
#
# Copyright (c) 2003-2004 John Gruber
# Copyright (c) 2004-2005 Michel Fortin
#
global $SmartyPantsPHPVersion, $SmartyPantsSyntaxVersion,
$smartypants_attr, $sp_tags_to_skip;
$SmartyPantsPHPVersion = '1.5.1e'; # Fru 9 Dec 2005
$SmartyPantsSyntaxVersion = '1.5.1'; # Fri 12 Mar 2004
# Configurable variables:
$smartypants_attr = "1"; # Change this to configure.
# 1 => "--" for em-dashes; no en-dash support
# 2 => "---" for em-dashes; "--" for en-dashes
# 3 => "--" for em-dashes; "---" for en-dashes
# See docs for more configuration options.
# Globals:
$sp_tags_to_skip = '<(/?)(?:pre|code|kbd|script|math)[\s>]';
# -- WordPress plugin interface -----------------------------------------------
/*
Plugin Name: SmartyPants
Plugin URI: http://www.michelf.com/projects/php-smartypants/
Description: SmartyPants is a web publishing utility that translates plain ASCII punctuation characters into &#8220;smart&#8221; typographic punctuation HTML entities. This plugin <strong>replace the default WordPress Texturize algorithm</strong> for the content and the title of your posts, the comments body and author name, and everywhere else Texturize normally apply. Based on the original Perl version by <a href="http://daringfireball.net/">John Gruber</a>.
Version: 1.5.1e
Author: Michel Fortin
Author URI: http://www.michelf.com/
*/
if (isset($wp_version)) {
# Remove default Texturize filter that would conflict with SmartyPants.
remove_filter('category_description', 'wptexturize');
remove_filter('list_cats', 'wptexturize');
remove_filter('comment_author', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
remove_filter('single_post_title', 'wptexturize');
remove_filter('the_title', 'wptexturize');
remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
# Add SmartyPants filter with priority 10 (same as Texturize).
add_filter('category_description', 'SmartyPants', 10);
add_filter('list_cats', 'SmartyPants', 10);
add_filter('comment_author', 'SmartyPants', 10);
add_filter('comment_text', 'SmartyPants', 10);
add_filter('single_post_title', 'SmartyPants', 10);
add_filter('the_title', 'SmartyPants', 10);
add_filter('the_content', 'SmartyPants', 10);
add_filter('the_excerpt', 'SmartyPants', 10);
}
# -- Smarty Modifier Interface ------------------------------------------------
function smarty_modifier_smartypants($text, $attr = NULL) {
return SmartyPants($text, $attr);
}
function SmartyPants($text, $attr = NULL, $ctx = NULL) {
global $smartypants_attr, $sp_tags_to_skip;
# Paramaters:
$text; # text to be parsed
$attr; # value of the smart_quotes="" attribute
$ctx; # MT context object (unused)
if ($attr == NULL) $attr = $smartypants_attr;
# Options to specify which transformations to make:
$do_stupefy = FALSE;
$convert_quot = 0; # should we translate &quot; entities into normal quotes?
# Parse attributes:
# 0 : do nothing
# 1 : set all
# 2 : set all, using old school en- and em- dash shortcuts
# 3 : set all, using inverted old school en and em- dash shortcuts
#
# q : quotes
# b : backtick quotes (``double'' only)
# B : backtick quotes (``double'' and `single')
# d : dashes
# D : old school dashes
# i : inverted old school dashes
# e : ellipses
# w : convert &quot; entities to " for Dreamweaver users
if ($attr == "0") {
# Do nothing.
return $text;
}
else if ($attr == "1") {
# Do everything, turn all options on.
$do_quotes = 1;
$do_backticks = 1;
$do_dashes = 1;
$do_ellipses = 1;
}
else if ($attr == "2") {
# Do everything, turn all options on, use old school dash shorthand.
$do_quotes = 1;
$do_backticks = 1;
$do_dashes = 2;
$do_ellipses = 1;
}
else if ($attr == "3") {
# Do everything, turn all options on, use inverted old school dash shorthand.
$do_quotes = 1;
$do_backticks = 1;
$do_dashes = 3;
$do_ellipses = 1;
}
else if ($attr == "-1") {
# Special "stupefy" mode.
$do_stupefy = 1;
}
else {
$chars = preg_split('//', $attr);
foreach ($chars as $c){
if ($c == "q") { $do_quotes = 1; }
else if ($c == "b") { $do_backticks = 1; }
else if ($c == "B") { $do_backticks = 2; }
else if ($c == "d") { $do_dashes = 1; }
else if ($c == "D") { $do_dashes = 2; }
else if ($c == "i") { $do_dashes = 3; }
else if ($c == "e") { $do_ellipses = 1; }
else if ($c == "w") { $convert_quot = 1; }
else {
# Unknown attribute option, ignore.
}
}
}
$tokens = _TokenizeHTML($text);
$result = '';
$in_pre = 0; # Keep track of when we're inside <pre> or <code> tags.
$prev_token_last_char = ""; # This is a cheat, used to get some context
# for one-character tokens that consist of
# just a quote char. What we do is remember
# the last character of the previous text
# token, to use as context to curl single-
# character quote tokens correctly.
foreach ($tokens as $cur_token) {
if ($cur_token[0] == "tag") {
# Don't mess with quotes inside tags.
$result .= $cur_token[1];
if (preg_match("@$sp_tags_to_skip@", $cur_token[1], $matches)) {
$in_pre = isset($matches[1]) && $matches[1] == '/' ? 0 : 1;
}
} else {
$t = $cur_token[1];
$last_char = substr($t, -1); # Remember last char of this token before processing.
if (! $in_pre) {
$t = ProcessEscapes($t);
if ($convert_quot) {
$t = preg_replace('/&quot;/', '"', $t);
}
if ($do_dashes) {
if ($do_dashes == 1) $t = EducateDashes($t);
if ($do_dashes == 2) $t = EducateDashesOldSchool($t);
if ($do_dashes == 3) $t = EducateDashesOldSchoolInverted($t);
}
if ($do_ellipses) $t = EducateEllipses($t);
# Note: backticks need to be processed before quotes.
if ($do_backticks) {
$t = EducateBackticks($t);
if ($do_backticks == 2) $t = EducateSingleBackticks($t);
}
if ($do_quotes) {
if ($t == "'") {
# Special case: single-character ' token
if (preg_match('/\S/', $prev_token_last_char)) {
$t = "&#8217;";
}
else {
$t = "&#8216;";
}
}
else if ($t == '"') {
# Special case: single-character " token
if (preg_match('/\S/', $prev_token_last_char)) {
$t = "&#8221;";
}
else {
$t = "&#8220;";
}
}
else {
# Normal case:
$t = EducateQuotes($t);
}
}
if ($do_stupefy) $t = StupefyEntities($t);
}
$prev_token_last_char = $last_char;
$result .= $t;
}
}
return $result;
}
function SmartQuotes($text, $attr = NULL, $ctx = NULL) {
global $smartypants_attr, $sp_tags_to_skip;
# Paramaters:
$text; # text to be parsed
$attr; # value of the smart_quotes="" attribute
$ctx; # MT context object (unused)
if ($attr == NULL) $attr = $smartypants_attr;
$do_backticks; # should we educate ``backticks'' -style quotes?
if ($attr == 0) {
# do nothing;
return $text;
}
else if ($attr == 2) {
# smarten ``backticks'' -style quotes
$do_backticks = 1;
}
else {
$do_backticks = 0;
}
# Special case to handle quotes at the very end of $text when preceded by
# an HTML tag. Add a space to give the quote education algorithm a bit of
# context, so that it can guess correctly that it's a closing quote:
$add_extra_space = 0;
if (preg_match("/>['\"]\\z/", $text)) {
$add_extra_space = 1; # Remember, so we can trim the extra space later.
$text .= " ";
}
$tokens = _TokenizeHTML($text);
$result = '';
$in_pre = 0; # Keep track of when we're inside <pre> or <code> tags
$prev_token_last_char = ""; # This is a cheat, used to get some context
# for one-character tokens that consist of
# just a quote char. What we do is remember
# the last character of the previous text
# token, to use as context to curl single-
# character quote tokens correctly.
foreach ($tokens as $cur_token) {
if ($cur_token[0] == "tag") {
# Don't mess with quotes inside tags
$result .= $cur_token[1];
if (preg_match("@$sp_tags_to_skip@", $cur_token[1], $matches)) {
$in_pre = isset($matches[1]) && $matches[1] == '/' ? 0 : 1;
}
} else {
$t = $cur_token[1];
$last_char = substr($t, -1); # Remember last char of this token before processing.
if (! $in_pre) {
$t = ProcessEscapes($t);
if ($do_backticks) {
$t = EducateBackticks($t);
}
if ($t == "'") {
# Special case: single-character ' token
if (preg_match('/\S/', $prev_token_last_char)) {
$t = "&#8217;";
}
else {
$t = "&#8216;";
}
}
else if ($t == '"') {
# Special case: single-character " token
if (preg_match('/\S/', $prev_token_last_char)) {
$t = "&#8221;";
}
else {
$t = "&#8220;";
}
}
else {
# Normal case:
$t = EducateQuotes($t);
}
}
$prev_token_last_char = $last_char;
$result .= $t;
}
}
if ($add_extra_space) {
preg_replace('/ \z/', '', $result); # Trim trailing space if we added one earlier.
}
return $result;
}
function SmartDashes($text, $attr = NULL, $ctx = NULL) {
global $smartypants_attr, $sp_tags_to_skip;
# Paramaters:
$text; # text to be parsed
$attr; # value of the smart_dashes="" attribute
$ctx; # MT context object (unused)
if ($attr == NULL) $attr = $smartypants_attr;
# reference to the subroutine to use for dash education, default to EducateDashes:
$dash_sub_ref = 'EducateDashes';
if ($attr == 0) {
# do nothing;
return $text;
}
else if ($attr == 2) {
# use old smart dash shortcuts, "--" for en, "---" for em
$dash_sub_ref = 'EducateDashesOldSchool';
}
else if ($attr == 3) {
# inverse of 2, "--" for em, "---" for en
$dash_sub_ref = 'EducateDashesOldSchoolInverted';
}
$tokens;
$tokens = _TokenizeHTML($text);
$result = '';
$in_pre = 0; # Keep track of when we're inside <pre> or <code> tags
foreach ($tokens as $cur_token) {
if ($cur_token[0] == "tag") {
# Don't mess with quotes inside tags
$result .= $cur_token[1];
if (preg_match("@$sp_tags_to_skip@", $cur_token[1], $matches)) {
$in_pre = isset($matches[1]) && $matches[1] == '/' ? 0 : 1;
}
} else {
$t = $cur_token[1];
if (! $in_pre) {
$t = ProcessEscapes($t);
$t = $dash_sub_ref($t);
}
$result .= $t;
}
}
return $result;
}
function SmartEllipses($text, $attr = NULL, $ctx = NULL) {
# Paramaters:
$text; # text to be parsed
$attr; # value of the smart_ellipses="" attribute
$ctx; # MT context object (unused)
if ($attr == NULL) $attr = $smartypants_attr;
if ($attr == 0) {
# do nothing;
return $text;
}
$tokens;
$tokens = _TokenizeHTML($text);
$result = '';
$in_pre = 0; # Keep track of when we're inside <pre> or <code> tags
foreach ($tokens as $cur_token) {
if ($cur_token[0] == "tag") {
# Don't mess with quotes inside tags
$result .= $cur_token[1];
if (preg_match("@$sp_tags_to_skip@", $cur_token[1], $matches)) {
$in_pre = isset($matches[1]) && $matches[1] == '/' ? 0 : 1;
}
} else {
$t = $cur_token[1];
if (! $in_pre) {
$t = ProcessEscapes($t);
$t = EducateEllipses($t);
}
$result .= $t;
}
}
return $result;
}
function EducateQuotes($_) {
#
# Parameter: String.
#
# Returns: The string, with "educated" curly quote HTML entities.
#
# Example input: "Isn't this fun?"
# Example output: &#8220;Isn&#8217;t this fun?&#8221;
#
# Make our own "punctuation" character class, because the POSIX-style
# [:PUNCT:] is only available in Perl 5.6 or later:
$punct_class = "[!\"#\\$\\%'()*+,-.\\/:;<=>?\\@\\[\\\\\]\\^_`{|}~]";
# Special case if the very first character is a quote
# followed by punctuation at a non-word-break. Close the quotes by brute force:
$_ = preg_replace(
array("/^'(?=$punct_class\\B)/", "/^\"(?=$punct_class\\B)/"),
array('&#8217;', '&#8221;'), $_);
# Special case for double sets of quotes, e.g.:
# <p>He said, "'Quoted' words in a larger quote."</p>
$_ = preg_replace(
array("/\"'(?=\w)/", "/'\"(?=\w)/"),
array('&#8220;&#8216;', '&#8216;&#8220;'), $_);
# Special case for decade abbreviations (the '80s):
$_ = preg_replace("/'(?=\\d{2}s)/", '&#8217;', $_);
$close_class = '[^\ \t\r\n\[\{\(\-]';
$dec_dashes = '&\#8211;|&\#8212;';
# Get most opening single quotes:
$_ = preg_replace("{
(
\\s | # a whitespace char, or
&nbsp; | # a non-breaking space entity, or
-- | # dashes, or
&[mn]dash; | # named dash entities
$dec_dashes | # or decimal entities
&\\#x201[34]; # or hex
)
' # the quote
(?=\\w) # followed by a word character
}x", '\1&#8216;', $_);
# Single closing quotes:
$_ = preg_replace("{
($close_class)?
'
(?(1)| # If $1 captured, then do nothing;
(?=\\s | s\\b) # otherwise, positive lookahead for a whitespace
) # char or an 's' at a word ending position. This
# is a special case to handle something like:
# \"<i>Custer</i>'s Last Stand.\"
}xi", '\1&#8217;', $_);
# Any remaining single quotes should be opening ones:
$_ = str_replace("'", '&#8216;', $_);
# Get most opening double quotes:
$_ = preg_replace("{
(
\\s | # a whitespace char, or
&nbsp; | # a non-breaking space entity, or
-- | # dashes, or
&[mn]dash; | # named dash entities
$dec_dashes | # or decimal entities
&\\#x201[34]; # or hex
)
\" # the quote
(?=\\w) # followed by a word character
}x", '\1&#8220;', $_);
# Double closing quotes:
$_ = preg_replace("{
($close_class)?
\"
(?(1)|(?=\\s)) # If $1 captured, then do nothing;
# if not, then make sure the next char is whitespace.
}x", '\1&#8221;', $_);
# Any remaining quotes should be opening ones.
$_ = str_replace('"', '&#8220;', $_);
return $_;
}
function EducateBackticks($_) {
#
# Parameter: String.
# Returns: The string, with ``backticks'' -style double quotes
# translated into HTML curly quote entities.
#
# Example input: ``Isn't this fun?''
# Example output: &#8220;Isn't this fun?&#8221;
#
$_ = str_replace(array("``", "''",),
array('&#8220;', '&#8221;'), $_);
return $_;
}
function EducateSingleBackticks($_) {
#
# Parameter: String.
# Returns: The string, with `backticks' -style single quotes
# translated into HTML curly quote entities.
#
# Example input: `Isn't this fun?'
# Example output: &#8216;Isn&#8217;t this fun?&#8217;
#
$_ = str_replace(array("`", "'",),
array('&#8216;', '&#8217;'), $_);
return $_;
}
function EducateDashes($_) {
#
# Parameter: String.
#
# Returns: The string, with each instance of "--" translated to
# an em-dash HTML entity.
#
$_ = str_replace('--', '&#8212;', $_);
return $_;
}
function EducateDashesOldSchool($_) {
#
# Parameter: String.
#
# Returns: The string, with each instance of "--" translated to
# an en-dash HTML entity, and each "---" translated to
# an em-dash HTML entity.
#
# em en
$_ = str_replace(array("---", "--",),
array('&#8212;', '&#8211;'), $_);
return $_;
}
function EducateDashesOldSchoolInverted($_) {
#
# Parameter: String.
#
# Returns: The string, with each instance of "--" translated to
# an em-dash HTML entity, and each "---" translated to
# an en-dash HTML entity. Two reasons why: First, unlike the
# en- and em-dash syntax supported by
# EducateDashesOldSchool(), it's compatible with existing
# entries written before SmartyPants 1.1, back when "--" was
# only used for em-dashes. Second, em-dashes are more
# common than en-dashes, and so it sort of makes sense that
# the shortcut should be shorter to type. (Thanks to Aaron
# Swartz for the idea.)
#
# en em
$_ = str_replace(array("---", "--",),
array('&#8211;', '&#8212;'), $_);
return $_;
}
function EducateEllipses($_) {
#
# Parameter: String.
# Returns: The string, with each instance of "..." translated to
# an ellipsis HTML entity. Also converts the case where
# there are spaces between the dots.
#
# Example input: Huh...?
# Example output: Huh&#8230;?
#
$_ = str_replace(array("...", ". . .",), '&#8230;', $_);
return $_;
}
function StupefyEntities($_) {
#
# Parameter: String.
# Returns: The string, with each SmartyPants HTML entity translated to
# its ASCII counterpart.
#
# Example input: &#8220;Hello &#8212; world.&#8221;
# Example output: "Hello -- world."
#
# en-dash em-dash
$_ = str_replace(array('&#8211;', '&#8212;'),
array('-', '--'), $_);
# single quote open close
$_ = str_replace(array('&#8216;', '&#8217;'), "'", $_);
# double quote open close
$_ = str_replace(array('&#8220;', '&#8221;'), '"', $_);
$_ = str_replace('&#8230;', '...', $_); # ellipsis
return $_;
}
function ProcessEscapes($_) {
#
# Parameter: String.
# Returns: The string, with after processing the following backslash
# escape sequences. This is useful if you want to force a "dumb"
# quote or other character to appear.
#
# Escape Value
# ------ -----
# \\ &#92;
# \" &#34;
# \' &#39;
# \. &#46;
# \- &#45;
# \` &#96;
#
$_ = str_replace(
array('\\\\', '\"', "\'", '\.', '\-', '\`'),
array('&#92;', '&#34;', '&#39;', '&#46;', '&#45;', '&#96;'), $_);
return $_;
}
# _TokenizeHTML is shared between PHP SmartyPants and PHP Markdown.
# We only define it if it is not already defined.
if (!function_exists('_TokenizeHTML')) :
function _TokenizeHTML($str) {
#
# Parameter: String containing HTML markup.
# Returns: An array of the tokens comprising the input
# string. Each token is either a tag (possibly with nested,
# tags contained therein, such as <a href="<MTFoo>">, or a
# run of text between tags. Each element of the array is a
# two-element array; the first is either 'tag' or 'text';
# the second is the actual value.
#
#
# Regular expression derived from the _tokenize() subroutine in
# Brad Choate's MTRegex plugin.
# <http://www.bradchoate.com/past/mtregex.php>
#
$index = 0;
$tokens = array();
$match = '(?s:<!(?:--.*?--\s*)+>)|'. # comment
'(?s:<\?.*?\?>)|'. # processing instruction
# regular tags
'(?:<[/!$]?[-a-zA-Z0-9:]+\b(?>[^"\'>]+|"[^"]*"|\'[^\']*\')*>)';
$parts = preg_split("{($match)}", $str, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach ($parts as $part) {
if (++$index % 2 && $part != '')
$tokens[] = array('text', $part);
else
$tokens[] = array('tag', $part);
}
return $tokens;
}
endif;
/*
PHP SmartyPants
===============
Description
-----------
This is a PHP translation of the original SmartyPants quote educator written in
Perl by John Gruber.
SmartyPants is a web publishing utility that translates plain ASCII
punctuation characters into "smart" typographic punctuation HTML
entities. SmartyPants can perform the following transformations:
* Straight quotes (`"` and `'`) into "curly" quote HTML entities
* Backticks-style quotes (` ``like this'' `) into "curly" quote HTML
entities
* Dashes (`--` and `---`) into en- and em-dash entities
* Three consecutive dots (`...`) into an ellipsis entity
SmartyPants does not modify characters within `<pre>`, `<code>`, `<kbd>`,
`<script>`, or `<math>` tag blocks. Typically, these tags are used to
display text where smart quotes and other "smart punctuation" would not
be appropriate, such as source code or example markup.
### Backslash Escapes ###
If you need to use literal straight quotes (or plain hyphens and
periods), SmartyPants accepts the following backslash escape sequences
to force non-smart punctuation. It does so by transforming the escape
sequence into a decimal-encoded HTML entity:
Escape Value Character
------ ----- ---------
\\ &#92; \
\" &#34; "
\' &#39; '
\. &#46; .
\- &#45; -
\` &#96; `
This is useful, for example, when you want to use straight quotes as
foot and inch marks: 6'2" tall; a 17" iMac.
Bugs
----
To file bug reports or feature requests (other than topics listed in the
Caveats section above) please send email to:
<michel.fortin@michelf.com>
If the bug involves quotes being curled the wrong way, please send example
text to illustrate.
### Algorithmic Shortcomings ###
One situation in which quotes will get curled the wrong way is when
apostrophes are used at the start of leading contractions. For example:
'Twas the night before Christmas.
In the case above, SmartyPants will turn the apostrophe into an opening
single-quote, when in fact it should be a closing one. I don't think
this problem can be solved in the general case -- every word processor
I've tried gets this wrong as well. In such cases, it's best to use the
proper HTML entity for closing single-quotes (`&#8217;`) by hand.
Version History
---------------
1.5.1e (9 Dec 2005)
* Corrected a bug that prevented special characters from being
escaped.
1.5.1d (25 May 2005)
* Corrected a small bug in `_TokenizeHTML` where a Doctype declaration
was not seen as HTML (smart quotes where applied inside).
1.5.1c (13 Dec 2004)
* Changed a regular expression in `_TokenizeHTML` that could lead to
a segmentation fault with PHP 4.3.8 on Linux.
1.5.1b (6 Sep 2004)
* Corrected a problem with quotes immediately following a dash
with no space between: `Text--"quoted text"--text.`
* PHP SmartyPants can now be used as a modifier by the Smarty
template engine. Rename the file to "modifier.smartypants.php"
and put it in your smarty plugins folder.
* Replaced a lot of space characters by tabs, saving about 4 KB.
1.5.1a (30 Jun 2004)
* PHP Markdown and PHP Smartypants now share the same `_TokenizeHTML`
function when loaded simultanously.
* Changed the internals of `_TokenizeHTML` to lower the PHP version
requirement to PHP 4.0.5.
1.5.1 (6 Jun 2004)
* Initial release of PHP SmartyPants, based on version 1.5.1 of the
original SmartyPants written in Perl.
Author
------
John Gruber
<http://daringfireball.net/>
Ported to PHP by Michel Fortin
<http://www.michelf.com/>
Additional Credits
------------------
Portions of this plug-in are based on Brad Choate's nifty MTRegex plug-in.
Brad Choate also contributed a few bits of source code to this plug-in.
Brad Choate is a fine hacker indeed. (<http://bradchoate.com/>)
Jeremy Hedley (<http://antipixel.com/>) and Charles Wiltgen
(<http://playbacktime.com/>) deserve mention for exemplary beta testing.
Copyright and License
---------------------
Copyright (c) 2003 John Gruber
<http://daringfireball.net/>
All rights reserved.
Copyright (c) 2004-2005 Michel Fortin
<http://www.michelf.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name "SmartyPants" nor the names of its contributors may
be used to endorse or promote products derived from this software
without specific prior written permission.
This software is provided by the copyright holders and contributors "as is"
and any express or implied warranties, including, but not limited to, the
implied warranties of merchantability and fitness for a particular purpose
are disclaimed. In no event shall the copyright owner or contributors be
liable for any direct, indirect, incidental, special, exemplary, or
consequential damages (including, but not limited to, procurement of
substitute goods or services; loss of use, data, or profits; or business
interruption) however caused and on any theory of liability, whether in
contract, strict liability, or tort (including negligence or otherwise)
arising in any way out of the use of this software, even if advised of the
possibility of such damage.
*/
?>

View File

@ -0,0 +1,124 @@
<?php
/**
* Another GeSHi example script
*
* Configure your Apache server with 'AcceptPathInfo true' and something like
* 'Alias /viewmysource /var/www/geshi/contrib/aliased.php'. Don't forget
* to protect this alias as necessary.
*
* Usage - visit /viewmysource/file.name.ext to see that file with syntax
* highlighting, where "viewmysource" is the name of the alias you set up.
* You can use this without an alias too, just by visiting
* aliased.php/file.name.ext.
*
* @author Ross Golder <ross@golder.org>
* @version $Id: aliased.php 785 2006-07-19 10:09:45Z oracleshinoda $
*/
// Your config here
define("SOURCE_ROOT", "/var/www/your/source/root/");
// Assume you've put geshi in the include_path already
require_once("geshi.php");
// Get path info
$path = SOURCE_ROOT.$_SERVER['PATH_INFO'];
// Check for dickheads trying to use '../' to get to sensitive areas
$base_path_len = strlen(SOURCE_ROOT);
$real_path = realpath($path);
if(strncmp($real_path, SOURCE_ROOT, $base_path_len)) {
exit("Stop that.");
}
// Check file exists
if(!file_exists($path)) {
exit("File not found ($path).");
}
// Gather contents
$contents = file_get_contents($path);
// Prepare GeSHi instance
$geshi =& new GeSHi($contents, "PHP");
$geshi->set_header_type(GESHI_HEADER_PRE);
$geshi->enable_classes();
$geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS, 10);
$geshi->set_overall_style('color: #000066; border: 1px solid #d0d0d0; background-color: #f0f0f0;', true);
$geshi->set_line_style('font: normal normal 95% \'Courier New\', Courier, monospace; color: #003030;', 'font-weight: bold; color: #006060;', true);
$geshi->set_code_style('color: #000020;', 'color: #000020;');
$geshi->set_link_styles(GESHI_LINK, 'color: #000060;');
$geshi->set_link_styles(GESHI_HOVER, 'background-color: #f0f000;');
$geshi->set_header_content('Source code viewer');
$geshi->set_header_content_style('font-family: Verdana, Arial, sans-serif; color: #808080; font-size: 70%; font-weight: bold; background-color: #f0f0ff; border-bottom: 1px solid #d0d0d0; padding: 2px;');
$geshi->set_footer_content('Parsed in <TIME> seconds, using GeSHi <VERSION>');
$geshi->set_footer_content_style('font-family: Verdana, Arial, sans-serif; color: #808080; font-size: 70%; font-weight: bold; background-color: #f0f0ff; border-top: 1px solid #d0d0d0; padding: 2px;');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Source code viewer - <?php echo $path; ?></title>
<style type="text/css">
<!--
<?php
// Output the stylesheet. Note it doesn't output the <style> tag
echo $geshi->get_stylesheet();
?>
html {
background-color: #f0f0f0;
}
body {
font-family: Verdana, Arial, sans-serif;
margin: 10px;
border: 2px solid #e0e0e0;
background-color: #fcfcfc;
padding: 5px;
}
h2 {
margin: .1em 0 .2em .5em;
border-bottom: 1px solid #b0b0b0;
color: #b0b0b0;
font-weight: normal;
font-size: 150%;
}
h3 {
margin: .1em 0 .2em .5em;
color: #b0b0b0;
font-weight: normal;
font-size: 120%;
}
#footer {
text-align: center;
font-size: 80%;
color: #a9a9a9;
}
#footer a {
color: #9999ff;
}
textarea {
border: 1px solid #b0b0b0;
font-size: 90%;
color: #333;
margin-left: 20px;
}
select, input {
margin-left: 20px;
}
p {
font-size: 90%;
margin-left: .5em;
}
-->
</style>
</head>
<body>
<?php
// The fun part :)
echo $geshi->parse_code();
?>
<hr/>
</body>
</html>

View File

@ -0,0 +1,456 @@
<?php
/*************************************************************************************
* cssgen.php
* ----------
* Author: Nigel McNie (nigel@geshi.org)
* Copyright: (c) 2004 Nigel McNie
* Release Version: 1.0.8.1
* Date Started: 2004/05/20
*
* Application to generate custom CSS files for GeSHi (based on an idea by Andreas
* Gohr)
*
*************************************************************************************
*
* This file is part of GeSHi.
*
* GeSHi 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; either version 2 of the License, or
* (at your option) any later version.
*
* GeSHi 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 GeSHi; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
************************************************************************************/
set_magic_quotes_runtime(0);
//
// Functions
//
function make_header ( $title )
{
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>GeSHi CSS Generator :: ' . $title . ' </title>
<style type="text/css" media="screen">
<!--
html {
font-family: Verdana, Arial, sans-serif;
font-size: 80%;
background-color: #d0d0d0;
}
body {
margin: 10px;
padding: 5px;
border: 1px solid #f0f0f0;
background-color: #f6f6f6;
}
h1 {
border-bottom: 2px solid #e0e0e0;
font-weight: normal;
font-size: 150%;
color: #c0c0c0;
}
input, textarea {
border: 1px solid #d0d0d0;
}
th {
text-align: right;
font-weight: normal;
}
pre {
font-size: 110%;
color: #202020;
}
#footer {
color: #b0b0b0;
text-align: center;
font-size: 90%;
margin: 0 auto;
border-top: 1px solid #e0e0e0;
}
#footer a {
color: #c0c0c0;
}
-->
</style>
<script type="text/javascript">
function select (state)
{
var cboxes = document.getElementsByTagName(\'input\');
for (var i = 0; i < cboxes.length; i++) {
if (cboxes[i].type == "checkbox") {
if (state == "true") {
cboxes[i].checked = true;
} else if (state == "false") {
cboxes[i].checked = false;
} else if (state == "invert") {
cboxes[i].checked = !cboxes[i].checked;
}
}
}
}
</script>
</head>
<body>
<h1>' . $title . '</h1>
';
}
function make_footer ()
{
echo '<div id="footer"><a href="http://qbnz.com/highlighter/">GeSHi</a> &copy; Nigel McNie, 2004, released under the GPL</div></body>
</html>';
}
function get_var ( $var_name )
{
if ( isset($_GET[$var_name]) )
{
return str_replace("\'", "'", $_GET[$var_name]);
}
elseif ( isset($_POST[$var_name]) )
{
return str_replace("\'", "'", $_POST[$var_name]);
}
return null;
}
//
// Unset everything
//
foreach ( $_REQUEST as $var )
{
unset($$var);
}
foreach ( array(
'_POST' => 'HTTP_POST_VARS',
'_GET' => 'HTTP_GET_VARS',
'_COOKIE' => 'HTTP_COOKIE_VARS',
'_SERVER' => 'HTTP_SERVER_VARS',
'_ENV' => 'HTTP_ENV_VARS',
'_FILES' => 'HTTP_POST_FILES') as $array => $other )
{
if ( !isset($$array) )
{
$$array = $$other;
}
unset($$other);
}
// Get what step we're up to
$step = get_var('step');
if ( !$step || $step == 1 )
{
$errors = 0;
make_header('Step 1');
echo "Welcome to the GeSHi CSS generator.<br /><pre>Searching for GeSHi... ";
// Find GeSHi
$geshi_path = get_var('geshi-path');
$geshi_lang_path = get_var('geshi-lang-path');
if ( !$geshi_path )
{
$geshi_path = '../geshi.php';
}
if ( !$geshi_lang_path )
{
$geshi_lang_path = '../geshi/';
}
if ( is_file($geshi_path) && is_readable($geshi_path) )
{
// Get file contents and see if GeSHi is in here
$file = @file($geshi_path);
$contents = '';
foreach ( $file as $line )
{
$contents .= $line;
}
if ( strpos($contents, '<?php
/**
* GeSHi - Generic Syntax Highlighter') !== false )
{
echo '<span style="color: green;">Found at ' . realpath($geshi_path) . '</span>';
}
else
{
++$errors;
$no_geshi_dot_php_error = true;
echo '<span style="color: red;">Not found</span>';
}
}
else
{
++$errors;
$no_geshi_dot_php_error = true;
echo '<span style="color: red;">Not found</span>';
}
// Find language files
echo "\nSearching for language files... ";
if ( is_readable($geshi_lang_path . 'css-gen.cfg') )
{
echo '<span style="color: green;">Found at ' . realpath($geshi_lang_path) . '</span>';
}
else
{
++$errors;
$no_lang_dir_error = true;
echo '<span style="color: red;">Not found</span>';
}
echo "</pre>\n";
if ( $errors > 0 )
{
// We're gonna have to ask for the paths...
echo 'Unfortunately CSSGen could not detect the following paths. Please input them and press &quot;submit&quot; to try again.';
echo "
<form action=\"cssgen.php\" method=\"post\">";
if ( $no_geshi_dot_php_error )
{
echo "
<br />geshi.php: <input type=\"text\" name=\"geshi-path\" value=\"" . realpath('../geshi.php') . "\" size=\"50\" />";
}
else
{
echo '<input type="hidden" name="geshi-path" value="' . htmlspecialchars($geshi_path) . '" />';
}
if ( $no_lang_dir_error )
{
echo "
<br />language files directory: <input type=\"text\" name=\"geshi-lang-path\" value=\"" . realpath('../geshi/') . "/\" size=\"50\" /> (should have a trailing slash)";
}
else
{
echo '<input type="hidden" name="geshi-lang-path" value="' . $geshi_lang_path . '" />';
}
echo "
<br /><input type=\"submit\" value=\"Search\" /></form>";
}
else
{
// no errors - echo continue form
echo 'Everything seems to be detected successfully. Use the button to continue.
<br /><br /><form action="cssgen.php?step=2" method="post">
<input type="hidden" name="geshi-path" value="' . realpath($geshi_path) . '" /><input type="hidden" name="geshi-lang-path" value="' . realpath($geshi_lang_path) . '" />
<input type="submit" value="Step 2" />';
}
make_footer();
}
// Step 2
elseif ( $step == 2 )
{
make_header('Step 2');
$geshi_path = get_var('geshi-path');
$geshi_lang_path = get_var('geshi-lang-path');
$dh = opendir($geshi_lang_path);
$lang_files = array();
$file = readdir($dh);
while ( $file !== false )
{
if ( $file == '.' || $file == '..' || $file == 'CVS' || $file == 'css-gen.cfg' )
{
$file = readdir($dh);
continue;
}
$lang_files[] = $file;
$file = readdir($dh);
}
closedir($dh);
sort($lang_files);
// Now installed languages are in $lang_files
echo '<form action="cssgen.php?step=3" method="post" id="step2">
What languages are you wanting to make this stylesheet for?<br /><br />
Detected languages:<br />';
foreach ( $lang_files as $lang )
{
$lang = substr($lang, 0, strpos($lang, '.'));
if ($lang) {
echo "<input type=\"checkbox\" name=\"langs[$lang]\" checked=\"checked\" />&nbsp;$lang<br />\n";
}
}
echo "Select: <a href=\"javascript:select('true')\">All</a>, <a href=\"javascript:select('false')\">None</a>, <a href=\"javascript:select('invert')\">Invert</a><br />\n";
echo 'If you\'d like any other languages not detected here to be supported, please enter
them here, one per line:<br /><textarea rows="4" cols="20" name="extra-langs"></textarea><br />
';
echo '<br />Styles:
<table>
<tr><th>Style for the overall code block:</th><td><input type="text" name="overall" value="border: 1px dotted #a0a0a0; font-family: \'Courier New\', Courier, monospace; background-color: #f0f0f0; color: #0000bb;" /></td></tr>
<tr><th>Default Styles</th><td><input type="text" name="default-styles" value="font-weight:normal;background:transparent;color:#000; padding-left: 5px;" /></td></tr>
<tr><th>Keywords I (if, do, while etc)</th><td><input type="text" name="keywords-1" value="color: #a1a100;" /></td></tr>
<tr><th>Keywords II (null, true, false etc)</th><td><input type="text" name="keywords-2" value="color: #000; font-weight: bold;" /></td></tr>
<tr><th>Inbuilt Functions (echo, print etc)</th><td><input type="text" name="keywords-3" value="color: #000066;" /></td></tr>
<tr><th>Data Types (int, boolean etc)</th><td><input type="text" name="keywords-4" value="color: #f63333;" /></td></tr>
<tr><th>Comments (//, <!-- --> etc)</th><td><input type="text" name="comments" value="color: #808080;" /></td></tr>
<tr><th>Escaped Characters (\n, \t etc)</th><td><input type="text" name="escaped-chars" value="color: #000033; font-weight: bold;" /></td></tr>
<tr><th>Brackets ( ([{}]) etc)</th><td><input type="text" name="brackets" value="color: #66cc66;" /></td></tr>
<tr><th>Strings ("foo" etc)</th><td><input type="text" name="strings" value="color: #ff0000;" /></td></tr>
<tr><th>Numbers (1, -54, 2.5 etc)</th><td><input type="text" name="numbers" value="color: #ff33ff;" /></td></tr>
<tr><th>Methods (Foo.bar() etc)</th><td><input type="text" name="methods" value="color: #006600;" /></td></tr>
</table>';
echo '<input type="hidden" name="geshi-path" value="' . realpath($geshi_path) . '" /><input type="hidden" name="geshi-lang-path" value="' . realpath($geshi_lang_path) . '" />
<input type="submit" value="Step 3" /></form>';
make_footer();
}
// Step 3
elseif ( $step == 3 )
{
make_header('Step 3');
echo '<p>Here is your completed stylesheet. Note that it may not be perfect - no regular expression styles are included for one thing,
you\'ll have to add those yourself (php and xml are just two languages that use them), and line numbers are not included, however
it includes most of the basic information.</p>';
// Make the stylesheet
$part_selector_1 = '';
$part_selector_2 = '';
$part_selector_3 = '';
$langs = get_var('langs');
$extra_langs = trim(get_var('extra-langs'));
if ( $extra_langs != '' )
{
$l = explode("\r\n", $extra_langs);
foreach ( $l as $lng )
{
$langs[$lng] = true;
}
}
foreach ( $langs as $lang => $dummy )
{
$part_selector_1 .= ".$lang {PART}, ";
$part_selector_2 .= ".$lang {PART1}, .$lang {PART2}, ";
$part_selector_3 .= ".$lang {PART1}, .$lang {PART2}, .$lang {PART3}, ";
}
$part_selector_1 = substr($part_selector_1, 0, -2);
$part_selector_2 = substr($part_selector_2, 0, -2);
$part_selector_3 = substr($part_selector_3, 0, -2);
$default_styles = get_var('default-styles');
$ol_selector = str_replace('{PART}', 'ol', $part_selector_1);
$overall_styles = get_var('overall');
$overall_selector = str_replace('{PART}', '', $part_selector_1);
$stylesheet = "/* GeSHi (c) Nigel McNie 2004 (http://qbnz.com/highlighter) */";
if ( $overall != '' )
{
$stylesheet .= "\n$overall_selector {{$overall_styles}}";
}
if ( $default_styles != '' )
{
$default_selector = str_replace(array('{PART1}', '{PART2}'), array('.de1', '.de2'), $part_selector_2);
$stylesheet .= "\n$default_selector {{$default_styles}}";
}
// Do keywords
$keywords_1 = get_var('keywords-1');
$keyword_selector_1 = str_replace('{PART}', '.kw1', $part_selector_1);
if ( $keywords_1 != '' )
{
$stylesheet .= "\n$keyword_selector_1 {{$keywords_1}}";
}
$keywords_2 = get_var('keywords-2');
$keyword_selector_2 = str_replace('{PART}', '.kw2', $part_selector_1);
if ( $keywords_2 != '' )
{
$stylesheet .= "\n$keyword_selector_2 {{$keywords_2}}";
}
$keywords_3 = get_var('keywords-3');
$keyword_selector_3 = str_replace('{PART}', '.kw3', $part_selector_1);
if ( $keywords_3 != '' )
{
$stylesheet .= "\n$keyword_selector_3 {{$keywords_3}}";
}
$keywords_4 = get_var('keywords-4');
$keyword_selector_4 = str_replace('{PART}', '.kw4', $part_selector_1);
if ( $keywords_4 != '' )
{
$stylesheet .= "\n$keyword_selector_4 {{$keywords_4}}";
}
// Do other lexics
$comments = get_var('comments');
$comment_selector = str_replace(array('{PART1}', '{PART2}', '{PART3}'), array('.co1', '.co2', '.coMULTI'), $part_selector_3);
if ( $comments != '' )
{
$stylesheet .= "\n$comment_selector {{$comments}}";
}
$esc = get_var('escaped-chars');
$esc_selector = str_replace('{PART}', '.es0', $part_selector_1);
if ( $esc != '' )
{
$stylesheet .= "\n$esc_selector {{$esc}}";
}
$brackets = get_var('brackets');
$brk_selector = str_replace('{PART}', '.br0', $part_selector_1);
if ( $brackets != '' )
{
$stylesheet .= "\n$brk_selector {{$brackets}}";
}
$strings = get_var('strings');
$string_selector = str_replace('{PART}', '.st0', $part_selector_1);
if ( $strings != '' )
{
$stylesheet .= "\n$string_selector {{$strings}}";
}
$numbers = get_var('numbers');
$num_selector = str_replace('{PART}', '.nu0', $part_selector_1);
if ( $numbers != '' )
{
$stylesheet .= "\n$num_selector {{$numbers}}";
}
$methods = get_var('methods');
$method_selector = str_replace('{PART}', '.me0', $part_selector_1);
if ( $methods != '' )
{
$stylesheet .= "\n$method_selector {{$methods}}";
}
echo "<pre>$stylesheet</pre>";
make_footer();
}
?>

View File

@ -0,0 +1,59 @@
<?php
/**
* A simple script which outputs the CSS classes for all languages
* supported by GeSHi. You can access it directly to download
* the CSS file. On *NIX you can also do a simple `php cssgen.php > geshi.css`.
*
* This file is part of GeSHi.
*
* GeSHi 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; either version 2 of the License, or
* (at your option) any later version.
*
* GeSHi 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 GeSHi; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* @package geshi
* @subpackage contrib
* @author revulo <revulon@gmail.com>
* @copyright 2008 revulo
* @license http://gnu.org/copyleft/gpl.html GNU GPL
*
*/
require dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'geshi.php';
$geshi = new GeSHi;
$languages = array();
if ($handle = opendir($geshi->language_path)) {
while (($file = readdir($handle)) !== false) {
$pos = strpos($file, '.');
if ($pos > 0 && substr($file, $pos) == '.php') {
$languages[] = substr($file, 0, $pos);
}
}
closedir($handle);
}
sort($languages);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="geshi.css"');
echo "/**\n".
" * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann\n" .
" * (http://qbnz.com/highlighter/ and http://geshi.org/)\n".
" */\n";
foreach ($languages as $language) {
$geshi->set_language($language);
// note: the false argument is required for stylesheet generators, see API documentation
$css = $geshi->get_stylesheet(false);
echo preg_replace('/^\/\*\*.*?\*\//s', '', $css);
}

View File

@ -0,0 +1,217 @@
<?php
/**
* GeSHi example script
*
* Just point your browser at this script (with geshi.php in the parent directory,
* and the language files in subdirectory "../geshi/")
*
* @author Nigel McNie
* @version $Id: example.php 1512 2008-07-21 21:05:40Z benbe $
*/
header('Content-Type: text/html; charset=utf-8');
error_reporting(E_ALL);
// Rudimentary checking of where GeSHi is. In a default install it will be in ../, but
// it could be in the current directory if the include_path is set. There's nowhere else
// we can reasonably guess.
if (is_readable('../geshi.php')) {
$path = '../';
} elseif (is_readable('geshi.php')) {
$path = './';
} else {
die('Could not find geshi.php - make sure it is in your include path!');
}
require $path . 'geshi.php';
$fill_source = false;
if (isset($_POST['submit'])) {
if (get_magic_quotes_gpc()) {
$_POST['source'] = stripslashes($_POST['source']);
}
if (!strlen(trim($_POST['source']))) {
$_POST['language'] = preg_replace('#[^a-zA-Z0-9\-_]#', '', $_POST['language']);
$_POST['source'] = implode('', @file($path . 'geshi/' . $_POST['language'] . '.php'));
$_POST['language'] = 'php';
} else {
$fill_source = true;
}
// Here's a free demo of how GeSHi works.
// First the initialisation: source code to highlight and the language to use. Make sure
// you sanitise correctly if you use $_POST of course - this very script has had a security
// advisory against it in the past because of this. Please try not to use this script on a
// live site.
$geshi = new GeSHi($_POST['source'], $_POST['language']);
// Use the PRE_VALID header. This means less output source since we don't have to output &nbsp;
// everywhere. Of course it also means you can't set the tab width.
// HEADER_PRE_VALID puts the <pre> tag inside the list items (<li>) thus producing valid HTML markup.
// HEADER_PRE puts the <pre> tag around the list (<ol>) which is invalid in HTML 4 and XHTML 1
// HEADER_DIV puts a <div> tag arount the list (valid!) but needs to replace whitespaces with &nbsp
// thus producing much larger overhead. You can set the tab width though.
$geshi->set_header_type(GESHI_HEADER_PRE_VALID);
// Enable CSS classes. You can use get_stylesheet() to output a stylesheet for your code. Using
// CSS classes results in much less output source.
$geshi->enable_classes();
// Enable line numbers. We want fancy line numbers, and we want every 5th line number to be fancy
$geshi->enable_line_numbers(GESHI_FANCY_LINE_NUMBERS, 5);
// Set the style for the PRE around the code. The line numbers are contained within this box (not
// XHTML compliant btw, but if you are liberally minded about these things then you'll appreciate
// the reduced source output).
$geshi->set_overall_style('font: normal normal 90% monospace; color: #000066; border: 1px solid #d0d0d0; background-color: #f0f0f0;', false);
// Set the style for line numbers. In order to get style for line numbers working, the <li> element
// is being styled. This means that the code on the line will also be styled, and most of the time
// you don't want this. So the set_code_style reverts styles for the line (by using a <div> on the line).
// So the source output looks like this:
//
// <pre style="[set_overall_style styles]"><ol>
// <li style="[set_line_style styles]"><div style="[set_code_style styles]>...</div></li>
// ...
// </ol></pre>
$geshi->set_line_style('color: #003030;', 'font-weight: bold; color: #006060;', true);
$geshi->set_code_style('color: #000020;', true);
// Styles for hyperlinks in the code. GESHI_LINK for default styles, GESHI_HOVER for hover style etc...
// note that classes must be enabled for this to work.
$geshi->set_link_styles(GESHI_LINK, 'color: #000060;');
$geshi->set_link_styles(GESHI_HOVER, 'background-color: #f0f000;');
// Use the header/footer functionality. This puts a div with content within the PRE element, so it is
// affected by the styles set by set_overall_style. So if the PRE has a border then the header/footer will
// appear inside it.
$geshi->set_header_content('<SPEED> <TIME> GeSHi &copy; 2004-2007, Nigel McNie, 2007-2008 Benny Baumann. View source of example.php for example of using GeSHi');
$geshi->set_header_content_style('font-family: sans-serif; color: #808080; font-size: 70%; font-weight: bold; background-color: #f0f0ff; border-bottom: 1px solid #d0d0d0; padding: 2px;');
// You can use <TIME> and <VERSION> as placeholders
$geshi->set_footer_content('Parsed in <TIME> seconds at <SPEED>, using GeSHi <VERSION>');
$geshi->set_footer_content_style('font-family: sans-serif; color: #808080; font-size: 70%; font-weight: bold; background-color: #f0f0ff; border-top: 1px solid #d0d0d0; padding: 2px;');
} else {
// make sure we don't preselect any language
$_POST['language'] = null;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>GeSHi examples</title>
<style type="text/css">
<!--
<?php
if (isset($_POST['submit'])) {
// Output the stylesheet. Note it doesn't output the <style> tag
echo $geshi->get_stylesheet(true);
}
?>
html {
background-color: #f0f0f0;
}
body {
font-family: Verdana, Arial, sans-serif;
margin: 10px;
border: 2px solid #e0e0e0;
background-color: #fcfcfc;
padding: 5px;
}
h2 {
margin: .1em 0 .2em .5em;
border-bottom: 1px solid #b0b0b0;
color: #b0b0b0;
font-weight: normal;
font-size: 150%;
}
h3 {
margin: .1em 0 .2em .5em;
color: #b0b0b0;
font-weight: normal;
font-size: 120%;
}
#footer {
text-align: center;
font-size: 80%;
color: #a9a9a9;
}
#footer a {
color: #9999ff;
}
textarea {
border: 1px solid #b0b0b0;
font-size: 90%;
color: #333;
margin-left: 20px;
}
select, input {
margin-left: 20px;
}
p {
font-size: 90%;
margin-left: .5em;
}
-->
</style>
</head>
<body>
<h2>GeSHi Example Script</h2>
<p>To use this script, make sure that <strong>geshi.php</strong> is in the parent directory or in your
include_path, and that the language files are in a subdirectory of GeSHi's directory called <strong>geshi/</strong>.</p>
<p>Enter your source and a language to highlight the source in and submit, or just choose a language to
have that language file highlighted in PHP.</p>
<?php
if (isset($_POST['submit'])) {
// The fun part :)
echo $geshi->parse_code();
echo '<hr />';
}
?>
<form action="<?php echo basename($_SERVER['PHP_SELF']); ?>" method="post">
<h3>Source to highlight</h3>
<p>
<textarea rows="10" cols="60" name="source" id="source"><?php echo $fill_source ? htmlspecialchars($_POST['source']) : '' ?></textarea>
</p>
<h3>Choose a language</h3>
<p>
<select name="language" id="language">
<?php
if (!($dir = @opendir(dirname(__FILE__) . '/geshi'))) {
if (!($dir = @opendir(dirname(__FILE__) . '/../geshi'))) {
echo '<option>No languages available!</option>';
}
}
$languages = array();
while ($file = readdir($dir)) {
if ( $file[0] == '.' || strpos($file, '.', 1) === false) {
continue;
}
$lang = substr($file, 0, strpos($file, '.'));
$languages[] = $lang;
}
closedir($dir);
sort($languages);
foreach ($languages as $lang) {
if (isset($_POST['language']) && $_POST['language'] == $lang) {
$selected = 'selected="selected"';
} else {
$selected = '';
}
echo '<option value="' . $lang . '" '. $selected .'>' . $lang . "</option>\n";
}
?>
</select>
</p>
<p>
<input type="submit" name="submit" value="Highlight Source" />
<input type="submit" name="clear" onclick="document.getElementById('source').value='';document.getElementById('language').value='';return false" value="clear" />
</p>
</form>
<div id="footer">GeSHi &copy; Nigel McNie, 2004, released under the GNU GPL<br />
For a better demonstration, check out the <a href="http://qbnz.com/highlighter/demo.php">online demo</a>
</div>
</body>
</html>

View File

@ -0,0 +1,666 @@
<?php
/**
* GeSHi example script
*
* Just point your browser at this script (with geshi.php in the parent directory,
* and the language files in subdirectory "../geshi/")
*
* @author Nigel McNie
* @version $Id: langcheck.php 1971 2008-12-25 15:14:14Z benbe $
*/
header('Content-Type: text/html; charset=utf-8');
set_time_limit(0);
error_reporting(E_ALL);
$time_start = explode(' ', microtime());
define ('TYPE_NOTICE', 0);
define ('TYPE_WARNING', 1);
define ('TYPE_ERROR', 2);
$error_abort = false;
$error_cache = array();
function output_error_cache(){
global $error_cache, $error_abort;
if(count($error_cache)) {
echo "<span style=\"color: #F00; font-weight: bold;\">Failed</span><br />";
echo "<ol>\n";
foreach($error_cache as $error_msg) {
echo "<li>";
switch($error_msg['t']) {
case TYPE_NOTICE:
echo "<span style=\"color: #080; font-weight: bold;\">NOTICE:</span>";
break;
case TYPE_WARNING:
echo "<span style=\"color: #CC0; font-weight: bold;\">WARNING:</span>";
break;
case TYPE_ERROR:
echo "<span style=\"color: #F00; font-weight: bold;\">ERROR:</span>";
break;
}
echo " " . $error_msg['m'] . "</li>";
}
echo "</ol>\n";
} else {
echo "<span style=\"color: #080; font-weight: bold;\">OK</span><br />";
}
echo "\n";
$error_cache = array();
}
function report_error($type, $message) {
global $error_cache, $error_abort;
$error_cache[] = array('t' => $type, 'm' => $message);
if(TYPE_ERROR == $type) {
$error_abort = true;
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>GeSHi Language File Validation Script</title>
<style type="text/css">
<!--
html {
background-color: #f0f0f0;
}
body {
font-family: Verdana, Arial, sans-serif;
margin: 10px;
border: 2px solid #e0e0e0;
background-color: #fcfcfc;
padding: 5px;
font-size: 10pt;
}
h2 {
margin: .1em 0 .2em .5em;
border-bottom: 1px solid #b0b0b0;
color: #b0b0b0;
font-weight: normal;
font-size: 150%;
}
h3 {
margin: .1em 0 .2em .5em;
color: #b0b0b0;
font-weight: normal;
font-size: 120%;
}
#footer {
text-align: center;
font-size: 80%;
color: #a9a9a9;
}
#footer a {
color: #9999ff;
}
textarea {
border: 1px solid #b0b0b0;
font-size: 90%;
color: #333;
margin-left: 20px;
}
select, input {
margin-left: 20px;
}
p {
font-size: 90%;
margin-left: .5em;
}
-->
</style>
</head>
<body>
<h2>GeSHi Language File Validation Script</h2>
<p>To use this script, make sure that <strong>geshi.php</strong> is in the
parent directory or in your include_path, and that the language files are in a
subdirectory of GeSHi's directory called <strong>geshi/</strong>.</p>
<p>Everything else will be done by this script automatically. After the script
finished you should see messages of what could cause trouble with GeSHi or where
your language files can be improved. Please be patient, as this might take some time.</p>
<ol>
<li>Checking where to find GeSHi installation ... <?php
// Rudimentary checking of where GeSHi is. In a default install it will be in ../, but
// it could be in the current directory if the include_path is set. There's nowhere else
// we can reasonably guess.
if (is_readable('../geshi.php')) {
$path = '../';
} elseif (is_readable('geshi.php')) {
$path = './';
} else {
report_error(TYPE_ERROR, 'Could not find geshi.php - make sure it is in your include path!');
}
if(!$error_abort) {
require $path . 'geshi.php';
if(!class_exists('GeSHi')) {
report_error(TYPE_ERROR, 'The GeSHi class was not found, although it seemed we loaded the correct file!');
}
}
if(!$error_abort) {
if(!defined('GESHI_LANG_ROOT')) {
report_error(TYPE_ERROR, 'There\'s no information present on where to find the language files!');
} else if(!is_dir(GESHI_LANG_ROOT)) {
report_error(TYPE_ERROR, 'The path "'.GESHI_LANG_ROOT.'" given, does not ressemble a directory!');
} else if(!is_readable(GESHI_LANG_ROOT)) {
report_error(TYPE_ERROR, 'The path "'.GESHI_LANG_ROOT.'" is not readable to this script!');
}
}
output_error_cache();
if(!$error_abort) {
echo "</li>\n<li>Listing available language files ... ";
if (!($dir = @opendir(GESHI_LANG_ROOT))) {
report_error(TYPE_ERROR, 'Error requesting listing for available language files!');
}
$languages = array();
if(!$error_abort) {
while ($file = readdir($dir)) {
if (!$file || $file[0] == '.' || strpos($file, '.') === false) {
continue;
}
$lang = substr($file, 0, strpos($file, '.'));
$languages[] = $lang;
}
closedir($dir);
}
$languages = array_unique($languages);
sort($languages);
if(!count($languages)) {
report_error(TYPE_WARNING, 'Unable to locate any usable language files in "'.GESHI_LANG_ROOT.'"!');
}
output_error_cache();
}
if (isset($_REQUEST['show']) && in_array($_REQUEST['show'], $languages)) {
$languages = array($_REQUEST['show']);
}
if(!$error_abort) {
foreach ($languages as $lang) {
echo "</li>\n<li>Validating language file for '$lang' ... ";
$langfile = GESHI_LANG_ROOT . $lang . '.php';
unset($language_data);
if(!is_file($langfile)) {
report_error(TYPE_ERROR, 'The path "' .$langfile. '" does not ressemble a regular file!');
} else if(!is_readable($langfile)) {
report_error(TYPE_ERROR, 'Cannot read file "' .$langfile. '"!');
} else {
$langfile_content = file_get_contents($langfile);
if(preg_match("/\?>(?:\r?\n|\r(?!\n)){2,}\Z/", $langfile_content)) {
report_error(TYPE_ERROR, 'Language file contains trailing empty lines at EOF!');
}
if(!preg_match("/\?>(?:\r?\n|\r(?!\n))?\Z/", $langfile_content)) {
report_error(TYPE_ERROR, 'Language file contains no PHP end marker at EOF!');
}
if(preg_match("/\t/", $langfile_content)) {
report_error(TYPE_NOTICE, 'Language file contains unescaped tabulator chars (probably for indentation)!');
}
if(preg_match('/^(?: )*(?! )(?! \*) /m', $langfile_content)) {
report_error(TYPE_NOTICE, 'Language file contains irregular indentation (other than 4 spaces per indentation level)!');
}
if(!preg_match("/\/\*\*((?!\*\/).)*?Author:((?!\*\/).)*?\*\//s", $langfile_content)) {
report_error(TYPE_WARNING, 'Language file does not contain a specification of an author!');
}
if(!preg_match("/\/\*\*((?!\*\/).)*?Copyright:((?!\*\/).)*?\*\//s", $langfile_content)) {
report_error(TYPE_WARNING, 'Language file does not contain a specification of the copyright!');
}
if(!preg_match("/\/\*\*((?!\*\/).)*?Release Version:((?!\*\/).)*?\*\//s", $langfile_content)) {
report_error(TYPE_WARNING, 'Language file does not contain a specification of the release version!');
}
if(!preg_match("/\/\*\*((?!\*\/).)*?Date Started:((?!\*\/).)*?\*\//s", $langfile_content)) {
report_error(TYPE_WARNING, 'Language file does not contain a specification of the date it was started!');
}
if(!preg_match("/\/\*\*((?!\*\/).)*?This file is part of GeSHi\.((?!\*\/).)*?\*\//s", $langfile_content)) {
report_error(TYPE_WARNING, 'Language file does not state that it belongs to GeSHi!');
}
if(!preg_match("/\/\*\*((?!\*\/).)*?language file for GeSHi\.((?!\*\/).)*?\*\//s", $langfile_content)) {
report_error(TYPE_WARNING, 'Language file does not state that it is a language file for GeSHi!');
}
if(!preg_match("/\/\*\*((?!\*\/).)*?GNU General Public License((?!\*\/).)*?\*\//s", $langfile_content)) {
report_error(TYPE_WARNING, 'Language file does not state that it is provided under the terms of the GNU GPL!');
}
unset($langfile_content);
include $langfile;
if(!isset($language_data)) {
report_error(TYPE_ERROR, 'Language file does not contain a $language_data structure to check!');
} else if (!is_array($language_data)) {
report_error(TYPE_ERROR, 'Language file contains a $language_data structure which is not an array!');
}
}
if(!$error_abort) {
if(!isset($language_data['LANG_NAME'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'LANG_NAME\'] specification!');
} else if (!is_string($language_data['LANG_NAME'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'LANG_NAME\'] specification which is not a string!');
}
if(!isset($language_data['COMMENT_SINGLE'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'COMMENT_SIGNLE\'] structure to check!');
} else if (!is_array($language_data['COMMENT_SINGLE'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'COMMENT_SINGLE\'] structure which is not an array!');
}
if(!isset($language_data['COMMENT_MULTI'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'COMMENT_MULTI\'] structure to check!');
} else if (!is_array($language_data['COMMENT_MULTI'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'COMMENT_MULTI\'] structure which is not an array!');
}
if(isset($language_data['COMMENT_REGEXP'])) {
if (!is_array($language_data['COMMENT_REGEXP'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'COMMENT_REGEXP\'] structure which is not an array!');
}
}
if(!isset($language_data['QUOTEMARKS'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'QUOTEMARKS\'] structure to check!');
} else if (!is_array($language_data['QUOTEMARKS'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'QUOTEMARKS\'] structure which is not an array!');
}
if(isset($language_data['HARDQUOTE'])) {
if (!is_array($language_data['HARDQUOTE'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'HARDQUOTE\'] structure which is not an array!');
}
}
if(!isset($language_data['ESCAPE_CHAR'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'ESCAPE_CHAR\'] specification to check!');
} else if (!is_string($language_data['ESCAPE_CHAR'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'ESCAPE_CHAR\'] specification which is not a string!');
} else if (1 < strlen($language_data['ESCAPE_CHAR'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'ESCAPE_CHAR\'] specification is not empty or exactly one char!');
}
if(!isset($language_data['CASE_KEYWORDS'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'CASE_KEYWORDS\'] specification!');
} else if (!is_int($language_data['CASE_KEYWORDS'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'CASE_KEYWORDS\'] specification which is not an integer!');
} else if (GESHI_CAPS_NO_CHANGE != $language_data['CASE_KEYWORDS'] &&
GESHI_CAPS_LOWER != $language_data['CASE_KEYWORDS'] &&
GESHI_CAPS_UPPER != $language_data['CASE_KEYWORDS']) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'CASE_KEYWORDS\'] specification which is neither of GESHI_CAPS_NO_CHANGE, GESHI_CAPS_LOWER nor GESHI_CAPS_UPPER!');
}
if(!isset($language_data['KEYWORDS'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'KEYWORDS\'] structure to check!');
} else if (!is_array($language_data['KEYWORDS'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'KEYWORDS\'] structure which is not an array!');
} else {
foreach($language_data['KEYWORDS'] as $kw_key => $kw_value) {
if(!is_integer($kw_key)) {
report_error(TYPE_WARNING, "Language file contains an key '$kw_key' in \$language_data['KEYWORDS'] that is not integer!");
} else if (!is_array($kw_value)) {
report_error(TYPE_ERROR, "Language file contains a \$language_data['CASE_SENSITIVE']['$kw_value'] structure which is not an array!");
}
}
}
if(!isset($language_data['SYMBOLS'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'SYMBOLS\'] structure to check!');
} else if (!is_array($language_data['SYMBOLS'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'SYMBOLS\'] structure which is not an array!');
}
if(!isset($language_data['CASE_SENSITIVE'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'CASE_SENSITIVE\'] structure to check!');
} else if (!is_array($language_data['CASE_SENSITIVE'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'CASE_SENSITIVE\'] structure which is not an array!');
} else {
foreach($language_data['CASE_SENSITIVE'] as $cs_key => $cs_value) {
if(!is_integer($cs_key)) {
report_error(TYPE_WARNING, "Language file contains an key '$cs_key' in \$language_data['CASE_SENSITIVE'] that is not integer!");
} else if (!is_bool($cs_value)) {
report_error(TYPE_ERROR, "Language file contains a Case Sensitivity specification for \$language_data['CASE_SENSITIVE']['$cs_value'] which is not a boolean!");
}
}
}
if(!isset($language_data['URLS'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'URLS\'] structure to check!');
} else if (!is_array($language_data['URLS'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'URLS\'] structure which is not an array!');
} else {
foreach($language_data['URLS'] as $url_key => $url_value) {
if(!is_integer($url_key)) {
report_error(TYPE_WARNING, "Language file contains an key '$url_key' in \$language_data['URLS'] that is not integer!");
} else if (!is_string($url_value)) {
report_error(TYPE_ERROR, "Language file contains a Documentation URL specification for \$language_data['URLS']['$url_value'] which is not a string!");
} else if (preg_match('#&([^;]*(=|$))#U', $url_value)) {
report_error(TYPE_ERROR, "Language file contains unescaped ampersands (&amp;) in \$language_data['URLS']!");
}
}
}
if(!isset($language_data['OOLANG'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'OOLANG\'] specification!');
} else if (!is_int($language_data['OOLANG']) && !is_bool($language_data['OOLANG'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'OOLANG\'] specification which is neither boolean nor integer!');
} else if (false !== $language_data['OOLANG'] &&
true !== $language_data['OOLANG'] &&
2 !== $language_data['OOLANG']) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'OOLANG\'] specification which is neither of false, true or 2!');
}
if(!isset($language_data['OBJECT_SPLITTERS'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'OBJECT_SPLITTERS\'] structure to check!');
} else if (!is_array($language_data['OBJECT_SPLITTERS'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'OBJECT_SPLITTERS\'] structure which is not an array!');
}
if(!isset($language_data['REGEXPS'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'REGEXPS\'] structure to check!');
} else if (!is_array($language_data['REGEXPS'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'REGEXPS\'] structure which is not an array!');
}
if(!isset($language_data['STRICT_MODE_APPLIES'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'STRICT_MODE_APPLIES\'] specification!');
} else if (!is_int($language_data['STRICT_MODE_APPLIES'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'STRICT_MODE_APPLIES\'] specification which is not an integer!');
} else if (GESHI_MAYBE != $language_data['STRICT_MODE_APPLIES'] &&
GESHI_ALWAYS != $language_data['STRICT_MODE_APPLIES'] &&
GESHI_NEVER != $language_data['STRICT_MODE_APPLIES']) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'STRICT_MODE_APPLIES\'] specification which is neither of GESHI_MAYBE, GESHI_ALWAYS nor GESHI_NEVER!');
}
if(!isset($language_data['SCRIPT_DELIMITERS'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'SCRIPT_DELIMITERS\'] structure to check!');
} else if (!is_array($language_data['SCRIPT_DELIMITERS'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'SCRIPT_DELIMITERS\'] structure which is not an array!');
}
if(!isset($language_data['HIGHLIGHT_STRICT_BLOCK'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'HIGHLIGHT_STRICT_BLOCK\'] structure to check!');
} else if (!is_array($language_data['HIGHLIGHT_STRICT_BLOCK'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'HIGHLIGHT_STRICT_BLOCK\'] structure which is not an array!');
}
if(isset($language_data['TAB_WIDTH'])) {
if (!is_int($language_data['TAB_WIDTH'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'TAB_WIDTH\'] specification which is not an integer!');
} else if (1 > $language_data['TAB_WIDTH']) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'TAB_WIDTH\'] specification which is less than 1!');
}
}
if(isset($language_data['PARSER_CONTROL'])) {
if (!is_array($language_data['PARSER_CONTROL'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'PARSER_CONTROL\'] structure which is not an array!');
}
}
if(!isset($language_data['STYLES'])) {
report_error(TYPE_ERROR, 'Language file contains no $language_data[\'STYLES\'] structure to check!');
} else if (!is_array($language_data['STYLES'])) {
report_error(TYPE_ERROR, 'Language file contains a $language_data[\'STYLES\'] structure which is not an array!');
} else {
$style_arrays = array('KEYWORDS', 'COMMENTS', 'ESCAPE_CHAR',
'BRACKETS', 'STRINGS', 'NUMBERS', 'METHODS', 'SYMBOLS',
'REGEXPS', 'SCRIPT');
foreach($style_arrays as $style_kind) {
if(!isset($language_data['STYLES'][$style_kind])) {
report_error(TYPE_ERROR, "Language file contains no \$language_data['STYLES']['$style_kind'] structure to check!");
} else if (!is_array($language_data['STYLES'][$style_kind])) {
report_error(TYPE_ERROR, "Language file contains a \$language_data['STYLES\']['$style_kind'] structure which is not an array!");
} else {
foreach($language_data['STYLES'][$style_kind] as $sk_key => $sk_value) {
if(!is_int($sk_key) && ('COMMENTS' != $style_kind && 'MULTI' != $sk_key)
&& !(('STRINGS' == $style_kind || 'ESCAPE_CHAR' == $style_kind) && 'HARD' == $sk_key)) {
report_error(TYPE_WARNING, "Language file contains an key '$sk_key' in \$language_data['STYLES']['$style_kind'] that is not integer!");
} else if (!is_string($sk_value)) {
report_error(TYPE_WARNING, "Language file contains a CSS specification for \$language_data['STYLES']['$style_kind'][$key] which is not a string!");
}
}
}
}
unset($style_arrays);
}
}
if(!$error_abort) {
//Initial sanity checks survived? --> Let's dig deeper!
foreach($language_data['KEYWORDS'] as $key => $keywords) {
if(!isset($language_data['CASE_SENSITIVE'][$key])) {
report_error(TYPE_ERROR, "Language file contains no \$language_data['CASE_SENSITIVE'] specification for keyword group $key!");
}
if(!isset($language_data['URLS'][$key])) {
report_error(TYPE_ERROR, "Language file contains no \$language_data['URLS'] specification for keyword group $key!");
}
if(empty($keywords)) {
report_error(TYPE_WARNING, "Language file contains an empty keyword list in \$language_data['KEYWORDS'] for group $key!");
}
foreach($keywords as $id => $kw) {
if(!is_string($kw)) {
report_error(TYPE_WARNING, "Language file contains an non-string entry at \$language_data['KEYWORDS'][$key][$id]!");
} else if (!strlen($kw)) {
report_error(TYPE_ERROR, "Language file contains an empty string entry at \$language_data['KEYWORDS'][$key][$id]!");
} else if (preg_match('/^([\(\)\{\}\[\]\^=.,:;\-+\*\/%\$\"\'\?]|&[\w#]\w*;)+$/i', $kw)) {
report_error(TYPE_NOTICE, "Language file contains an keyword ('$kw') at \$language_data['KEYWORDS'][$key][$id] which seems to be better suited for the symbols section!");
}
}
if(count($keywords) != count(array_unique($keywords))) {
$kw_diffs = array_count_values($keywords);
foreach($kw_diffs as $kw => $kw_count) {
if($kw_count > 1) {
report_error(TYPE_WARNING, "Language file contains per-group duplicate keyword '$kw' in \$language_data['KEYWORDS'][$key]!");
}
}
}
}
$disallowed_before = "(?<![a-zA-Z0-9\$_\|\#;>|^&";
$disallowed_after = "(?![a-zA-Z0-9_\|%\\-&;";
foreach($language_data['KEYWORDS'] as $key => $keywords) {
foreach($language_data['KEYWORDS'] as $key2 => $keywords2) {
if($key2 <= $key) {
continue;
}
$kw_diffs = array_intersect($keywords, $keywords2);
foreach($kw_diffs as $kw) {
if(isset($language_data['PARSER_CONTROL']['KEYWORDS'])) {
//Check the precondition\post-cindition for the involved keyword groups
$g1_pre = $disallowed_before;
$g2_pre = $disallowed_before;
$g1_post = $disallowed_after;
$g2_post = $disallowed_after;
if(isset($language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_BEFORE'])) {
$g1_pre = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_BEFORE'];
$g2_pre = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_BEFORE'];
}
if(isset($language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_AFTER'])) {
$g1_post = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_AFTER'];
$g2_post = $language_data['PARSER_CONTROL']['KEYWORDS']['DISALLOWED_AFTER'];
}
if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_BEFORE'])) {
$g1_pre = $language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_BEFORE'];
}
if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_AFTER'])) {
$g1_post = $language_data['PARSER_CONTROL']['KEYWORDS'][$key]['DISALLOWED_AFTER'];
}
if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_BEFORE'])) {
$g2_pre = $language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_BEFORE'];
}
if(isset($language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_AFTER'])) {
$g2_post = $language_data['PARSER_CONTROL']['KEYWORDS'][$key2]['DISALLOWED_AFTER'];
}
if($g1_pre != $g2_pre || $g1_post != $g2_post) {
continue;
}
}
report_error(TYPE_WARNING, "Language file contains cross-group duplicate keyword '$kw' in \$language_data['KEYWORDS'][$key] and \$language_data['KEYWORDS'][$key2]!");
}
}
}
foreach($language_data['CASE_SENSITIVE'] as $key => $keywords) {
if(!isset($language_data['KEYWORDS'][$key]) && $key != GESHI_COMMENTS) {
report_error(TYPE_WARNING, "Language file contains an superfluous \$language_data['CASE_SENSITIVE'] specification for non-existing keyword group $key!");
}
}
foreach($language_data['URLS'] as $key => $keywords) {
if(!isset($language_data['KEYWORDS'][$key])) {
report_error(TYPE_WARNING, "Language file contains an superfluous \$language_data['URLS'] specification for non-existing keyword group $key!");
}
}
foreach($language_data['STYLES']['KEYWORDS'] as $key => $keywords) {
if(!isset($language_data['KEYWORDS'][$key])) {
report_error(TYPE_WARNING, "Language file contains an superfluous \$language_data['STYLES']['KEYWORDS'] specification for non-existing keyword group $key!");
}
}
foreach($language_data['COMMENT_SINGLE'] as $ck => $cv) {
if(!is_int($ck)) {
report_error(TYPE_WARNING, "Language file contains an key '$ck' in \$language_data['COMMENT_SINGLE'] that is not integer!");
}
if(!is_string($cv)) {
report_error(TYPE_WARNING, "Language file contains an non-string entry at \$language_data['COMMENT_SINGLE'][$ck]!");
}
if(!isset($language_data['STYLES']['COMMENTS'][$ck])) {
report_error(TYPE_WARNING, "Language file contains no \$language_data['STYLES']['COMMENTS'] specification for comment group $ck!");
}
}
if(isset($language_data['COMMENT_REGEXP'])) {
foreach($language_data['COMMENT_REGEXP'] as $ck => $cv) {
if(!is_int($ck)) {
report_error(TYPE_WARNING, "Language file contains an key '$ck' in \$language_data['COMMENT_REGEXP'] that is not integer!");
}
if(!is_string($cv)) {
report_error(TYPE_WARNING, "Language file contains an non-string entry at \$language_data['COMMENT_REGEXP'][$ck]!");
}
if(!isset($language_data['STYLES']['COMMENTS'][$ck])) {
report_error(TYPE_WARNING, "Language file contains no \$language_data['STYLES']['COMMENTS'] specification for comment group $ck!");
}
}
}
foreach($language_data['STYLES']['COMMENTS'] as $ck => $cv) {
if($ck != 'MULTI' && !isset($language_data['COMMENT_SINGLE'][$ck]) &&
!isset($language_data['COMMENT_REGEXP'][$ck])) {
report_error(TYPE_NOTICE, "Language file contains an superfluous \$language_data['STYLES']['COMMENTS'] specification for Single Line or Regular-Expression Comment key $ck!");
}
}
if (isset($language_data['STYLES']['STRINGS']['HARD'])) {
if (empty($language_data['HARDQUOTE'])) {
report_error(TYPE_NOTICE, "Language file contains superfluous \$language_data['STYLES']['STRINGS'] specification for key 'HARD', but no 'HARDQUOTE's are defined!");
}
unset($language_data['STYLES']['STRINGS']['HARD']);
}
foreach($language_data['STYLES']['STRINGS'] as $sk => $sv) {
if($sk && !isset($language_data['QUOTEMARKS'][$sk])) {
report_error(TYPE_NOTICE, "Language file contains an superfluous \$language_data['STYLES']['STRINGS'] specification for non-existing quotemark key $sk!");
}
}
foreach($language_data['REGEXPS'] as $rk => $rv) {
if(!is_int($rk)) {
report_error(TYPE_WARNING, "Language file contains an key '$rk' in \$language_data['REGEXPS'] that is not integer!");
}
if(is_string($rv)) {
//Check for unmasked / in regular expressions ...
if(empty($rv)) {
report_error(TYPE_WARNING, "Language file contains an empty regular expression at \$language_data['REGEXPS'][$rk]!");
} else {
if(preg_match("/(?<!\\\\)\//s", $rv)) {
report_error(TYPE_WARNING, "Language file contains a regular expression with an unmasked / character at \$language_data['REGEXPS'][$rk]!");
} elseif (preg_match("/(?<!<)(\\\\\\\\)*\\\\\|(?!>)/s", $rv)) {
report_error(TYPE_WARNING, "Language file contains a regular expression with an unescaped match for a pipe character '|' which needs escaping as '&lt;PIPE&gt;' instead at \$language_data['REGEXPS'][$rk]!");
}
}
} elseif(is_array($rv)) {
if(!isset($rv[GESHI_SEARCH])) {
report_error(TYPE_ERROR, "Language file contains no GESHI_SEARCH entry in extended regular expression at \$language_data['REGEXPS'][$rk]!");
} elseif(!is_string($rv[GESHI_SEARCH])) {
report_error(TYPE_ERROR, "Language file contains a GESHI_SEARCH entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!");
} else {
if(preg_match("/(?<!\\\\)\//s", $rv[GESHI_SEARCH])) {
report_error(TYPE_WARNING, "Language file contains a regular expression with an unmasked / character at \$language_data['REGEXPS'][$rk]!");
} elseif (preg_match("/(?<!<)(\\\\\\\\)*\\\\\|(?!>)/s", $rv[GESHI_SEARCH])) {
report_error(TYPE_WARNING, "Language file contains a regular expression with an unescaped match for a pipe character '|' which needs escaping as '&lt;PIPE&gt;' instead at \$language_data['REGEXPS'][$rk]!");
}
}
if(!isset($rv[GESHI_REPLACE])) {
report_error(TYPE_WARNING, "Language file contains no GESHI_REPLACE entry in extended regular expression at \$language_data['REGEXPS'][$rk]!");
} elseif(!is_string($rv[GESHI_REPLACE])) {
report_error(TYPE_ERROR, "Language file contains a GESHI_REPLACE entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!");
}
if(!isset($rv[GESHI_MODIFIERS])) {
report_error(TYPE_WARNING, "Language file contains no GESHI_MODIFIERS entry in extended regular expression at \$language_data['REGEXPS'][$rk]!");
} elseif(!is_string($rv[GESHI_MODIFIERS])) {
report_error(TYPE_ERROR, "Language file contains a GESHI_MODIFIERS entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!");
}
if(!isset($rv[GESHI_BEFORE])) {
report_error(TYPE_WARNING, "Language file contains no GESHI_BEFORE entry in extended regular expression at \$language_data['REGEXPS'][$rk]!");
} elseif(!is_string($rv[GESHI_BEFORE])) {
report_error(TYPE_ERROR, "Language file contains a GESHI_BEFORE entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!");
}
if(!isset($rv[GESHI_AFTER])) {
report_error(TYPE_WARNING, "Language file contains no GESHI_AFTER entry in extended regular expression at \$language_data['REGEXPS'][$rk]!");
} elseif(!is_string($rv[GESHI_AFTER])) {
report_error(TYPE_ERROR, "Language file contains a GESHI_AFTER entry in extended regular expression at \$language_data['REGEXPS'][$rk] which is not a string!");
}
} else {
report_error(TYPE_WARNING, "Language file contains an non-string and non-array entry at \$language_data['REGEXPS'][$rk]!");
}
if(!isset($language_data['STYLES']['REGEXPS'][$rk])) {
report_error(TYPE_WARNING, "Language file contains no \$language_data['STYLES']['REGEXPS'] specification for regexp group $rk!");
}
}
foreach($language_data['STYLES']['REGEXPS'] as $rk => $rv) {
if(!isset($language_data['REGEXPS'][$rk])) {
report_error(TYPE_NOTICE, "Language file contains an superfluous \$language_data['STYLES']['REGEXPS'] specification for regexp key $rk!");
}
}
}
output_error_cache();
flush();
if($error_abort) {
break;
}
}
}
?></li>
</ol>
<p>Validation process completed in <?
$time_end = explode(' ', microtime());
$time_diff = $time_end[0] + $time_end[1] - $time_start[0] - $time_start[1];
echo sprintf("%.2f", $time_diff);
?> seconds.</p>
<div id="footer">GeSHi &copy; 2004-2007 Nigel McNie, 2007-2008 Benny Baumann, released under the GNU GPL</div>
</body>
</html>

View File

@ -0,0 +1,29 @@
BUGS - list of known bugs in GeSHi
Version 1.0.8
- Number highlighting is quite poor [possibly better now]
- I'm not happy with URLS - there still could be extra bugs, and it's rather unflexible
(see TODO for a possible fix)
- "Important" sections for some reason seem to have their spans added after every
newline up until the next lexic, instead of stopping at the <END GeSHi> part. In fact,
context sensitiveness is quite poor...
- Using the extra line number highlighting feature without actually using line numbers
will result in malformed XHTML (not sure about this one though...)
- Slow!!! Especially for source with lots of strings in it. GeSHi will work acceptably
for sourcecode under 5K (for simple language files like SQL, a 100K file can be
highlighted in just 6 seconds), but above about 25K things get a little slow... If
you're using this as part of some larger software, you may want to think about
making some sort of "cache" effect to speed things up and reduce server load.
- The result is built by string replacement instead of by building another string based
on the source, that would be much safer. The focus of releases beyond 1.0.7 will be on
changing this behaviour, which may well fix some of the other bugs mentioned above.
- As of 1.0.7.1, dots (.) are allowed before keywords. This may change highlighting of some
things slightly, if you notice anything odd about the highlighting then please report
it to me.
- Perl/Javascript /.../ regex syntax is only supported basically and there's no
guarantee it is working all the time.
- The <pre> header output is not XHTML compliant. Please use the <div> header instead.
Send any bug reports to BenBE@omorphia.de, or submit them via the bug tracker at
sourceforge (http://sourceforge.net/tracker/?group_id=114997&atid=670231)

View File

@ -0,0 +1,682 @@
CHANGES - Changelog for GeSHi (geshi.php only)
Changes to the code are listed under the version they occured in, with who suggested
it by each one (if there's nobody listed as suggesting it I dreamed it up :)). Users
who suggested an idea often also provided the code that was used as a basis for the
changes - thanks to all who suggested these ideas and gave me the code to show me how!
Language files listed under each version were made by the author beside them, and then
modified by me for consistency/bug fixing.
Please send any bug reports to BenBE@omorphia.de, or use the bug report tracker
at sourceforge (http://sourceforge.net/tracker/?group_id=114997&atid=670231)
Version 1.0.8.3
- Added language files
* DCS (Stelio Passaris)
* Locomotive Basic (Nacho Cabanes)
* LSL2 (Linden Scripting Language) (William Fry)
* Modula-3 (Martin Bishop)
* Oberon-2 (Mike Mol)
* Rebol (Lecanu Guillaume)
- Fixed a problem where HardEscapes weren't working when no escape char was given (BenBE)
- Added a PARSER_CONTROL setting to treat whitespace inside of keywords in
the language file as "any whitespace" in the source (i.e. "CREATE TABLE"
in SQL will match "CREATE\s+TABLE" instead of literally matching) (BenBE)
- Added a possibility to allow setting the style for escape characters (BenBE)
- Improvements to language files (BenBE)
* Added some missing Perl keywords and obscure default variables (BenBE)
* Allow for escaped colons to appear in CSS names (BenBE, simon)
* Added multiline continuation suppoert of preprocessor defines for
C, C for Mac, C++ and CC++ with Qt support (BenBE)
* keywords for C-based languages are case-sensitive (BenBE)
* Broken AutoIt highlighting (BenBE)
* Problem with escaped backslash in PHP and D (BenBE)
* Added some more functions for PHP (BenBE)
* Some changes for AppleScript (Stefan Klieme)
* Forbid highlighting keywords followed by / in bash (BenBE)
* Updated the LaTeX file to link some keywords (BenBE)
* Additional text rendered when matching special variables for PowerShell (BenBE)
* Added some more keywords for ABAP (BenBE, Sandra Rossi, Jacob Laursen)
Version 1.0.8.2
- Added language files
* Brainfuck \ Brainfork (Benny Baumann)
* HQ9+ (Benny Baumann)
* INTERCAL (Benny Baumann)
* LOLcode (Benny Baumann)
* LScript (Beau McGuigan)
* Pixel Bender (Richard Olsson)
* ProvideX (Jeff Wilder)
* VIM Script (Swaroop C H)
* Visual Prolog (Thomas Linder Puls)
* Whitespace (Benny Baumann)
- Changed priority for COMMENT_REGEXP compared to String highlighting (BenBE)
- Fixed correct escaping of spaces inside of URLs (BenBE)
- Updated the list of common file extensions (BenBE)
- Updated the language file check script in contrib/ (BenBE)
- Fixed a problem with link targets resulting in unclickable links (SF#2379120, BenBE)
- Fixed an undefined variable issue in langcheck.php (BenBE)
- Improvements to language files (BenBE)
* eMail Header highlighting now uses the correct delimiters for keywords (BenBE)
* eMail (RFC822\mbox) highlighting now highlights IPs, MIME types and
subfield assignments correctly (BenBE)
* Minor style changes in COBOL to improve loading performance (BenBE)
* Added some missing keywords for D (BenBE)
* Removed duplicate keywords from Progres, SAS and TSQL (BenBE)
* Fixed Heredoc Syntax for Bash (SF#2185319, BenBE)
* Moved symbol-lookalike sequences from keyword groups to separate symbol group
for languages asp, klonec, klonecpp, php, php-brief (BenBE)
* Fixed a lot of duplicate keyword warnings (BenBE)
* Added missing keywords to the Python language file,
introducing support for Python 3.0. (SF#2441839, milian)
* Updated documentation links for TypoScript (SF#2014276, BenBE)
* Fixed a problem with tag and attribute names in XML highlighting (SF#2276119, BenBE)
* Improved MySQL language file (BenBE, JavaWoman)
* Some commentss accidentially mistaken for DocComments (SF#2454897, BenBE)
* Added improved Escape Char handling for c, c_mac, cpp and cpp_qt (SF#2458743, BenBE)
Version 1.0.8.1
- Added language files
* AviSynth (Ryan Jones)
* eMail \ mbox (Benny Baumann)
* GNU Make (Neil Bird)
* Oracle 11i support (Simon Redhead)
* Prolog (Benny Baumann)
* SciLab (Christophe David)
* TeraTerm macro language (Boris Maisuradze)
- Added support for Escape Regular Expressions (BenBE)
* Implemented C-style Escapes in PHP (BenBE)
* Introduced support for \xAB and \007 style Char Escapes in PHP (BenBE)
* Implemented Variable Highlighting in PHP (BenBE)
* Implemented Variable Highlighting in Bash (milian)
- Fixed a problem with PCRE patterns for Keyword matching sometimes producing
very large strings, that could not be handled by some versions of PCRE lib,
causing broken highlighting an Regexp Compile errors (BenBE, milian)
- Fixed broken highlighting of bash commands like `dbus-send --dest=org.....`,
i.e. the dest was highlighted as variable declaration (milian)
- Fixed broken highlighting of some symbols in their escaped form (BenBE)
(<SEMI> and <PIPE> were accidentially filtered even though they are valid)
- Fixed a "memory leak" in the *_regexp_caches (milian)
- Fixed broken Escape chars if classes were disabled
- start_line_numbers_at() was ignored when GESHI_HEADER_PRE_TABLE was set (revulo)
- Fixed a problem allowing Remote Code Inclusion under certain circumstances (BenBE)
- Changes to default CSS in order to make the GESHI_HEADER_PRE_TABLE align properly,
even on Windows / Mac systems with strange fonts (milian, revulo, ^RT)
- Minor style changes to the following languages:
* cpp-qt (milian)
* MySQL (BenBE)
* PHP (BenBE)
- Improvements to language files (BenBE, milian)
* Added MinSpareThread\MaxSpareThreads to Apache highlighter (BenBE)
* Added new Keyword group for APT sources.list highlighter (BenBE)
* Fixed highlighting in LaTeX for \begin{} and \end{}, i.e. the stuff inside
the curly braces. (milian, thanks for the report go to Matthias Pospiech)
* Improved String support for D (BenBE)
* MySQL was seriously broken (BenBE)
* Reworked Keyword groups for MySQL to allow for more configuration (BenBE)
* Improved Mirc script language file (milian)
* Improved C++ Qt language file (milian)
* Minor bug with Transpose Operator in Matlab (BenBE, Daniele de Rigo)
* Highlighting of Batch Files for Windows (BenBE)
* Updated AutoIt to include latest changes for AutoIt v3.2.12.1 (BenBE, Thierry)
* Fixed duplicate keyword warnings for Perl, Tcl and Typoscript (BenBE)
* Fixed Doc-URL getting reparsed by highlighted keywords of other groups (BenBE, Jordi Boggiano)
Version 1.0.8
- Added language files
* APT sources.list (milian)
* Boo (Marcus Griep)
* CIL (Common Intermediate Language, .NET Assembly) (Marcus Griep)
* COBOL (Benny Baumann)
* Gnuplot (milian)
* KLoneC (Mickael Auger)
* KLoneC++ (Mickael Auger)
* PIC16xxx assembler (Phil Mattison)
* POV-Ray (Carl Fürstenberg)
* PowerShell (Frode Aarebrot)
* Progress (Marco Aurelio de Pasqual)
* TypoScript (Jan-Philipp Halle)
* Xorg configuration (milian)
- Make GeSHi's constructor arguments optional, so something like `$foo = new GeSHi;` is possible. (milian)
- Added an optimizer for lists to regular expressions. Using these cached lists results in a speedup of approx. 50%.
The slightly increased memory consumption (~150KB for PHP language file) is more than worth it! (milian)
- Some more memory & speed optimizations all over GeSHi (milian)
* Reduced memory overhead when highlighting keywords (BenBE)
* Keyword Linking now uses considerably less strtolower calls (milian)
* Cache Symbol Search Regexp and make Symbol Highlighting faster (milian)
* Use more native functions like substr_replace and strcasecmp to speed things up (milian)
* Use considerably less strlen() calls on various points by caching the results (milian)
* Properly set comments to be case insensitive where appropriate to increase performance (milian)
* Improve the performance of the strict mode tokenizer, making highlighting of languages like
HTML, ColdFusion or XML faster (milian)
* Setup caches for parsing on demand to make stylesheet generators fast (milian)
- Various improvements to Strict Block Handling (BenBE, milian)
* Added support for RegExp-based Strict Blocks (BenBE)
* Fixed highlighting incorrectly stopping at ?> in PHP (SF#1330968, BenBE)
* Languages with STRICT_MODE_APPLIES = GESHI_MAYBE default to strict mode now. When no highlightable
code is found in this mode, we fallback to the same setting as if GESHI_NEVER was set. That way it
should not be needed to call enable_strictmode() manually. (milian)
- Added new GESHI_HEADER_PRE_VALID type which uses the following markup: (milian)
* With line numbers: <div>header<ol><li><pre>...</pre></li>...</ol></div>
* Without line numbers: <pre>header...CODE...</pre>
=> valid HTML and no need for &nbsp; indentation
- Added new GESHI_HEADER_PRE_TABLE type which can be used to prevent linenumber-selection in Firefox
on copy'n'paste. (milian)
- set_language will not reset any language settings by default anymore.
* Added $force_reset param for to force full reload of a language. (milian)
* Make sure strict_mode is set properly when doing repeated set_language calls (milian)
- Fixed some problems with old PHP versions (SF#1975625, milian, BenBE)
- Fixed broken use with Suhosin Patch when /e modifier was disabled (SF#2021800, BenBE)
- Added support for external style information files to override language defaults without modifying language files (BenBE)
- The overall_class is now up to the user, and the language-code is _always_ added as a class (milian)
- Fixed Economy Mode for GeSHi::get_stylesheet() - now it just makes so much more sense! (milian)
- Fixed Economy Mode when COMMENT_REGEXP are used (BenBE)
- Changed the default encoding to use UTF-8, due to SF#2037598, BenBE)
- Improved overall string support:
* Added support for multichar string delimiters (SF#1932083, BenBE)
* Fixed problems of unfinished strings and comments producing invalid XHTML (SF#1996353, BenBE)
* Multichar Quotemarks sometimes had inconsistent behaviour (BenBE)
* Support for multiple styles of strings depending on the starter (BenBE)
* Properly handle escapes in strings, i.e. '\\' was not working properly before (milian)
* Fixed escape char support when an escape char is followed by multi-byte chars (SF#2037598, BenBE)
- Improved flexibility in language files (BenBE, milian)
* Added PARSER_CONTROL for OOLANG method highlighting (SF#1923060, BenBE)
* Added possibility to define strict blocks using an Regexp (BenBE)
* Removed explicit escaping of / in Regular Expressions (BenBE)
* Ignoring empty keyword groups when highlighting (milian)
* Make language_permissions configurable in language files via ['PARSER_CONTROL']['ENABLE_FLAGS']
this makes is_a calls unneeded and thus prevents PHP notices in PHP 5.x (milian)
* Extended support for number formats now covering the most common formats (SF#1923058, BenBE)
* Lifted a limitation that keywords had to have at least 2 subsequent letters (BenBE)
* Changed behaviour of PARSER_CONTROL now allowing to provide the full Lookahead and Lookbehind
expressions used as delimiters inside keywords instead of a simple char group (BenBE)
* Fixed improper handling of newlines in REGEXPS so this does not produce invalid html anylonger (milian)
- Some typos and mistakes in the documentation (BenBE)
- Added a script to contrib/ to verify language files are correct (BenBE)
- Fixed loads of compliancy warnings detected with that automated compliance testing script (BenBE)
- Many other improvements to various language files (BenBE, milian)
* Reduce strict errors & notices for language files (milian)
* Fixed symbol highlighting with C++ sometimes missing keywords after ; and comments (BenBE)
* Improved comment handling with TCL (Lars Hellström, BenBE)
* Fixed broken handling with XML comments (BenBE, SF#1849233)
* Fixed HTML comments spawning multiple lines producing invalid XHTML output (SF#1738173, BenBE)
* Added support for parameters beginning with dash in BASH language (BenBE)
* Support Apache's configuration sections, see http://httpd.apache.org/docs/2.2/sections.html (milian)
* Minor issue with PHP Heredoc and Nowdoc syntax sometimes not getting highlighted (BenBE)
* Updated Objective-C language file (SF#2013961, Quinn Taylor, BenBE)
* Added some keywords for VHDL (beshig, BenBE)
* Fixed severly broken ColdFusion language file (milian)
* Fixed some incorrectly highlighted things with the CSS language file (milian, BenBE)
* Improved Smarty language file (milian)
* Improved CSS language file (milian)
* Improved Pascal language file (milian)
* Improved LaTeX language file (Андрей Парамонов, BenBE)
* Fixed a regular expression in mIRC language file that caused a warning message to be issued (BenBE)
* Removed <, > and / from HTML names, now only containing the real tag names (BenBE)
* Use spaces instead of tabs for indendation in language files to have a consistent
coding standard accross geshi files (milian)
* Added some comment styles, keywords and added index highlighting (Chusslove Illich, Часлав Илић)
- Removed some private methods which were only called at exactly one place (milian)
* format_header_content
* format_footer_content
* get_attributes
- Second part of default style changes. Affected in this release:
* C++
* C++ (QT)
* CSS
* VHDL
Version 1.0.7.22
- Added language files
* glSlang (BenBE)
* KiXtart (Riley McArdle)
* Lotus Notes @Formulas (Richard Civil)
* LotusScript (Richard Civil)
* MXML (David Spurr)
* Scala (Franco Lombardo)
* ActionScript 3 (Jordi Boggiano)
* GNU Gettext .po/.pot (Milian Wolff)
* Verilog (Günter Dannoritzer)
- Fixed a problem not yet addressed in 1.0.7.21 regarding highlighting of
symbols that caused some extra characters to be added in the output or
broke highlighting and standard compliance due to missing escaping of
internally used characters (SF#192320 and SF#1926259, BenBE)
- Fixed missing style information for ocaml language file (The_PHP_Jedi)
- Fixed a bug causing masses of warnings in rendered output if language file
miss style information (The_PHP_Jedi, BenBE)
- Missing tab width information could lead to warnings (BenBE)
- Missing symbol information for ASP (SF#1952038, nfsupport, BenBE)
- Empty delimiter message with OOoBasic (BenBE, Ccornell)
- Escaping of comments in LaTeX ignored (SF#1749806, BenBE)
- Modified Math environment $$ in LaTeX to be non-greedy (BenBE)
- Added possibility to match a regexp as comment (SF#1914640, SF#1945301, SF#1934832, BenBE)
- Introduced C-Style multiline continuation comments (SF#1914640, SF#1945301, BenBE)
- Introduced Fortran Comments (SF#1914640, SF#1934832, BenBE)
- Implemented Heredoc and Nowdoc Syntax for PHP and Perl (SF#1914640, BenBE)
- Implemented Compiler Directives for Delphi (SF#1914640, BenBE)
- Implemented minimalistic support for JavaScript \ Perl Regular Expressions (SF#1786665, SF#1754333, SF#1956631, BenBE)
- Fixed Strings in Matlab to be handled as comments instead of regexps, to prevent keywords being linked (BenBE)
- Applied PARSER_CONTROL fix of CPP for CPP-QT-Derivative (BenBE)
- Fixed incorrect treatment of unequally long multiline comment separators (related to SF #1891630, BenBE)
- Added PARSER_CONTROL settings for keywords in ASM language file (SF#1835148, BenBE)
- Fixed missing CASSE_SENSITIVE entry for DOS language file (SF#1956314, BenBE)
- Fixed accidential highlighting of keywords in argument names (SF#1956456, Milian Wolff, BenBE)
- Fixed yet again some #-related bash problem (SF#1956459, Milian Wolff, BenBE)
- Added backticks as symbols (Milian Wolff)
- Example script remembers selections and source submitted (Milian Wolff)
- Example script allows remembered source and preselected language to be cleared (Milian Wolff)
- Example script now properly includes geshi and doesn't suppress error messages anylonger. (Milian Wolff)
- Code cleanup by using direct string indexing instead of substr with length 1 (Milian Wolff)
- Optimized generation of code parts in strict mode (Milian Wolff)
- Optimized COMMENT_REGEXP by using an incremental regexp cache (Milian Wolff, BenBE)
- Fixed a problem that rarely skipped highlighting of escaped chars which usually should have gotten highlighted (BenBE)
- Optimized generation of highlighted strings to use fast skip forward while highlighting them (Milian Wolff, BenBE)
- Optimization using basic rework of indent function improving tab expansion performance (BenBE)
- Lots of other minor optimizations based on coding style improvements (Milian Wolff)
- Implemented setting to force spans to be closed before newlines, see SF#1727398 (Milian Wolff)
- Added missing credits for D language file to THANKS file (SF#1720899, BenBE)
- Optimization to prevent loading the current language file twice (Milian Wolff)
- Optimization: Use file_get_contents() to load sourcecode from files.
Even if GeSHi worked with PHP 4.1 before, it doesn't now. (Milian Wolff)
- Added description of extra language features (SF#1970248, BenBE)
- Added support for highlighting the C# using and namespace directives (SF #1395677, BenBE)
- Added support for highlighting the Java import and package directives (SF #1395677, BenBE)
- Fixed minor problem in Haskell cuasing accidential start of comment (SF#1987221, BenBE)
- Fixed minor issue causing loads of warnings if a language files defines no symbols (BenBE)
- Updated some aspects of the documentation and included further hints (BenBE)
- First of series of color scheme changes. Affected languages (sofar):
* Assembler (x86)
* Bash
* C
* C#
* Delphi
* Fortran77
* glSlang
* Java & Java 5
* JavaScript
* OCaml
* OpenOffice.org Basic
* Pascal
* Perl
* PHP and PHP-Brief
Version 1.0.7.21
- Added language files
* Basic4GL (Matthew Webb)
- Fixed problem with mIRC language highlighting spaces only (BenBE)
- Language files can now specify a function to be called to decide the
colour of a regular expression match
- Added single quote to Lua (Darrin Roenfanz)
- Compare comments case insensitively (fixes AutoIT comments somewhat)
(Daniel Gordon)
- Fixed symbols not being highlighted at all (SF #1767953, BenBE)
- Fixed brackets not correctly managed (SF #1767954, BenBE)
- Changed default languages for some extensions
- Included color and character information for symbol highlighting in some languages (BenBE)
- Fixed a problem with extension detection if default was used (BenBE)
- Fixed a highlighting problem with the LaTeX language (SF #1776182, BenBE)
- Added a new parameter for enable_highlighting to reduce source duplication (SF #1786104, BenBE)
- Updated doxygen documentation to include since tags and some missing parameters
- Disabled symbol highlighting by default (doesn't affect brackets, cf. documentation) (BenBE)
- Added a check for set_case_keywords for the given param to be supported (BenBE)
- Minor rework of the HTML documentation layout \ W3C compliance (BenBE)
- Fixed highlighting error in bash language avoiding keywords in comments (SF #1786314, SF #1564839, BenBE)
- Fixed template params for C++ and C# not being highlighted (SF #1772919, BenBE)
- Fixed more reported problems about mirc highlighting
- Added some missing keywords for VB.NET
- Fixed some warnings in DOS language file (Florian Angehrn)
- Add possibility to handle more than one extra line style (SF #1698255, German Rumm, BenBE)
- Fixed handling of URLs when output case differs from URL case (SF #1815504, Tom Samstag, BenBE)
- Fixed POD (Plain Old Documentation) format problems breaking highlighting of Perl (SF #1891630, Shannon Wynter, BenBE)
- Fixed a problem with mIRC when & was used for identifiers (SF #1875552, BenBE)
Version 1.0.7.20
- Added language files
* Genero (logic) and Per (forms) (FOURJ's Genero 4GL) (Lars Gersmann)
* Haskell (Dagit)
* ABAP (Andres Picazo)
* Motorola 68k Assembler (for MC68HC908GP32 Microcontroller) (BenBE)
* Dot (Adrien Friggeri)
- Fixed java documentation search for keywords to actually go to the
documentation (spaze)
- Applied fix for bug 1688864 (bad regexes) (Tim Starling)
- Fixed comment CSS rule in visualfoxpro
- ThinBASIC language update (Eros Olmi)
- mIRC language update (BenBE)
- Fixed outdated documentation URL of Perl language file (RuralMoon by BenBE)
- Fixed tab replacement code not generating the correct number of spaces in
some cases (Guillermo Calvo)
- Fixed two typos in Z80 language file
- Applied fix for bug 1730168 (Daniel Naber)
- Applied fix for bug 1705482 (Jason Frame)
* Configurable line endings (Replace \n by custom string)
* per-language tab-widths (Adjustable for width>=1)
* Included defaults for ASM (x86, m68k, z80), C, C (Mac), C++, C++ (QT), C#,
Delphi, CSS,, HTML, PHP, PHP (Brief), QBasic, Ruby, XML
- Added a possibility to force generation of a surrounding tag around
the highlighted source
- Applied fix for additional keywords for the bash language
(cf. http://bash.thefreebizhost.com/bash_geshi.php, BenBE / Jan G)
- Fix bad colour definition in GML language (Andreas Gohr)
- Fixed phpdoc comments not being indented one space if they should be (Andy
Hassall)
Version 1.0.7.19
- Added language files
* X++ (Simon Butcher)
* Rails (Moises Deniz)
- Fixed invalid HTML being generated and doctypes not being highlighted over
multiple lines properly when line numbers are on (Validome)
- Improved the ruby syntax highlighting by basing it off the Rails file
- Changed some regular expressions to possibly help with badly performing
regex support in PHP (Tim Starling)
- Allow {TIME}, {LANGUAGE} and {VERSION} to be used in the header as well as
the normal <TIME>/<LANGUAGE>/<VERSION> (AthanD)
- Changed comment regex in bash to prevent malformed XHTML (rv1971)
Version 1.0.7.18
- Added language files
* ZiLOG Z80 Assembly (BenBE)
- Fixed incorrect highlighting when the starter of a multiline comment is
longer than the ender (Robert Anthony).
- Fixed "</span" generated if a multiline comment is the last thing in the
source (related to the above).
- Added #cs => #ce comment markers to AutoIT (Robert Anthony)
- Fixed spelling mistake for keyword in Python (wd3)
- Added a method to enable/disable keyword linking (Ian McKellar)
- Improved empty line detection for HTML output (BenBE)
- Changed code style of geshi.php, and removed tabs
Version 1.0.7.17
- Fixed up ends of files having too many newlines (binarygroop)
- Removed background colour on keyword group in eiffel (Julian Tschannen)
- Removed GESHI_DIR_SEPARATOR constant usage, it's unnecessary (Aleksey Zapparov)
- Added /* ... */ comments to coldfusion (Jeff Howden)
Version 1.0.7.16
- Added language files
* ActionScript (Steffen Krause)
* C++/QT (Iulian M)
* PL/SQL (Victor Engmark)
- Fixed up my e-mail address everywhere
- Fixed notice with "error" property (IZIU Zielona Góra)
- Added some entries to the get_language_name_from_extension table
(Stebastian Schuberth)
Version 1.0.7.15
- Added language files
* BNF (Rowan Rodrik van der Molen)
* IO (me, thanks to Johnathan Wright)
* mIRC (Alberto de Areba Sánchez)
- Fixed use of colon in XML (Grigory Rubtsov)
- Fixed notices in text.php, reg.php and latex.php when $this is not
available (Clemens Weiß)
- Made third parameter of geshi_highlight optional (Gaetano Giunta)
- Fix incorrect highlighting of the $# variable in bash (Michael Knight)
- Fixed single line comment mistake in thinbasic.php (Eros Olmi)
Version 1.0.7.14
- Added language files
* thinBasic (Eros Olmi)
* LaTeX (Matthais Pospiech)
- Removed extra newlines at the end of some files
- Fixed SF bug 1556404 - check before using $this in language files
(Clemens Weiß)
Version 1.0.7.13
- Added language files
* Uno IDL (Cedric Bosdonnat)
- Fixed add_ids causing odd XHTML (RyanJ)
- Fixed extra newline being added to end of result (Andreas Gohr)
Version 1.0.7.12
- Fixed lines being collapsed when they contain just a space (artlover)
- Allowed matching for regexes using start/end matchers at the start/end
of the code (Sheri)
- Added (dubious) fix for google "I'm feeling lucky" search for java keywords
(dubious in that it doesn't work for me)
- mysql - Made the symbols into their own keyword group as the symbol group
isn't used. Added a style for multiline comments.
- Added a couple of php5 keywords to the php language files.
- Allow XML tags to have dashes.
- Changed LANG_NAME for many languages to be more sensible/correct case
(Matthias Mohr)
- Added case-sensitivity indices to python
Version 1.0.7.11
- Added language files
* Smalltalk (Bananeweizen)
- Minor style improvements to matlab
- Moved a couple of functions to the correct group in smarty (arwan)
Version 1.0.7.10
- Added language files
* TCL (Reid van Melle)
* Winbatch (Craig Storey)
* Groovy (Ivan F. Villanueva B.)
* Text (SmokingRope)
* Reg (SmokingRope)
- Removed \ as an escape character in T-SQL (Dave Jackson)
- Reset extra lines to highlight if source is changed (Diogo Resende)
- Allow setting of lexic permissions in language files (SmokingRope)
- Allow regexes to set a CSS class name (SmokingRope)
- Added URL support to DOS language (mastrboy)
Version 1.0.7.9
- Added language files
* Fortran (Cedric Arrabie)
* SAS (Galen Johnson)
* CFDG (John Horigan)
- Fixed & in URL in java5 (Clemens Weiß)
- Added MD5 and SHA1 to mysql keywords (polarina)
- Fixes for highlight_lines_extra with line numbers (ithcy)
- Fixed backslash characters being removed (ArTourter)
Version 1.0.7.8
- Fixed blank at start of MySQL file (W. Tasin)
- Fixed smarty functions being broken (ultrabob)
- Changed keyword and regexp detection and parsing
slightly to allow more "meta characters" (like #) in
keywords
- Minor fixes for XML and GML
Version 1.0.7.7
- Added language files
* T-SQL (Duncan Lock)
* Robots.txt (Christian Lescuyer)
* AutoIT (mastrboy)
* Java 5 (Clemens Bruckmann)
* ColdFusion (Diego)
- A few keyword changes in java, removed :: object splitter (amphi)
- Now using a simpler regular expression for numbers (Brice Bernard)
- Fixed ah, bh etc. regs being highlighted as numbers (Unknown)
Version 1.0.7.6
- Fix backtick-string highlighting in ruby (Juan J. Martínez)
- Add =begin multiline comments in ruby (Juan J. Martínez)
- Added support for :keywords and ::access in lisp (Denis Mashkevich)
- Prevented number highlighting if they are just after underscores (Joce)
- Removed escape characters for strings in XML and HTML (floele)
- Added instanceof keyword to java (jgottschling)
- Fixed comments in ASP (SBD)
- Removed unnecessary keyword style index from ini
- Added support for " strings in ini
- Removed unnecessary regex style index from blitzbasic
- Keyword case of URL-ed keywords should be defined by language file (Benny Baumann)
- Added "Hardquote" feature, provides more accurate string highlighting (Cliff Stanford)
- Used hardquote support for @"..." strings in C# (Cliff Stanford)
- Used hardquote support for ' strings in perl (Cliff Stanford)
- Fixed setting of language path (Cliff Stanford)
- Display source correctly formatted with line numbers (if requested) if an error
has occured (several people)
- Having no source to highlight is not an error condition anymore
- Delphi language updated to include more keywords and types (BenBE)
- Updated NSIS to version 2.11 (deguix)
Version 1.0.7.5
- Fix for using escape characters to escape newlines breaking XHTML compliance (Yves Goergen)
- Fixed method highlighting in VB (Matt Beale)
- Fixed multiline comment highlighting in SQL (MrBaseball34)
- Fixed two ">" symbols being outputted when using a footer but not CSS classes (MrBaseball34)
- Marked important block stuff as deprecated
- Some documentation tidyup
- Updated GML language file (Jos? Jorge Enr?quez Rodr?guez)
- THANKS file tidied up
- Fixed double </a> for elements in HTML (Yves Goergen)
- Added some keywords for ASM (Dreuzzo)
Version 1.0.7.4
- Added language files
* MySQL (Carl Fürstenberg)
* BlitzBasic (Pàdraig O`Connel)
- Fixed up geshi_highlight function: it now correctly uses <code> instead of <div> (Remi Faure)
- When using GESHI_HEADER_NONE, remove the <ol> if line numbering is not enabled
- Commented example.php so people can use it as a guide better
- Fixed extra newline being generated if a comment is at the end
of the source (many people, including Yves Goergen)
- Fixed up some documentation issues
- Some minor language file fixes (C++, Lua) (Lua fixes by chromix)
- Fixed up no </span> in XML and other strict languages (regression from 1.0.7.3 fix: removed
unnecessary </span> when using strict mode) (Daniel Ecer, drskrud),
Version 1.0.7.3
- Added language files
* Scheme (Jon Raphaelson)
* Ocaml and Ocaml-brief (Flaie)
* Ruby (Amit Gupta)
- Make urls generated for java highlighting XHTML compliant (Tim Van Wassenhove)
- Removed unnecessary </span> when using strict mode (Tim Van Wassenhove)
- Fixed warning in dos.php about undefined constant (Tim Van Wassenhove)
- Fixed security hole in contrib/example.php - able to view any file if source
not set and language is set to wierd value (Maksymilian Arciemowicz)
Version 1.0.7.2
- Added language files
* Inno (Thomas Klinger)
* Ini (Deguix)
* DOS (Batchfile) (Alessandro Staltali)
* Applescript (Stephan Klimek)
* Freebasic (Roberto Rossi)
* SDLBasic (Roberto Rossi)
* ActionScript (links to French documentation) (NikO)
- NSIS language file updated (deguix)
- Lua language file updated (Roberto Rossi)
- Bugfix: Styles incorrectly overriding default styles instead of being merged
in set_*_styles methods (Stebastian Werner)
- Added GESHI_HEADER_NONE as valid header type. This still allows header content.
Version 1.0.7.1
- Added language files:
* Div (Gabriel Lorenzo)
* GML (José Jorge Enríquez Rodríguez)
* Eiffel (Zoran Simic)
- Minor change to rules regarding when keywords can appear - now dots (.) are
allowed before keywords. (NikO)
- Bugfix: the line style for non-fancy lines when fancy highlighting is enabled
is now applied (Amit Gupta)
Version 1.0.7
- Added language files:
* Diff (Conny Brunnkvist)
* VHDL (Alexander Krause)
* D (Thomas Kuehne)
* Matlab (Florian Knorn)
- Python highlighting improved (thither, Federico Quagliata)
- Changed file comments to use phpdoc syntax, and changed code style to be more
like PEAR
- Fixed bug in set_code_style: Second parameter is now optional
- The $_GESHI_ERRORS array is gone, error messages are internal to the GeSHi class
- Changed name of XML language to XML from HTML
- Removed min and max tab width checks
- Backported GeSHi 1.1.X's automatic language file path detection so you no longer
need to use the third parameter of the constructor or set_language_path except for
special circumstances.
- Source is checked to make sure it is not empty else an error occurs
- Removed excess characters after ?> in ada.php, apache.php and cpp.php that caused
http headers to be sent (psichron)
- Removed second "foreach" keyword for smarty language file that was causing
duplication (Iss)
- Added underscore to allowed characters in match for XML tags (anonymous)
- Added some missing java keywords like "abstract" and "transient"
- Added "list" and "continue" PHP keywords
- set_language resets error status and strict mode (Andrew Black)
- Removed margin:0 declaration from cssgen.php (Andrzej Kubaszek)
- Fixed multiline comment selector in cssgen.php (Andrzej Kubaszek)
Version 1.0.6
- Added support for smart tabs - tabs that behave just like normal tabs when in
GESHI_HEADER_DIV mode.
- Partial patch for UTF-8 encoding applied (doesn't quite work however...)
Version 1.0.5
- Added language files:
* MPASM (Bakalex)
* Oracle 8 (Guy Wicks)
- Fixed bug where not using an encoding type would sometime result in warnings (although
there still seems to be issues with encoding in general that I'm trying to gather more
data on) (Alexander Spennemann)
- Removed "margin: 0" from <ol> in an attempt to make line numbers visible in IE again
by default (untested, but I don't really care if it works... get firefox! ;))
- Added note on php5 support (Karim Scheik)
- Added two new methods: load_from_file and get_language_name_from_extension, that can
help automate file highlighting (though the extension array at this time is quite bare)
(David Gartner, Brian Cheesman)
Version 1.0.4
- Fixed many version-reporting bugs (Jack Lloyd)
- Fixed bug where methods were not having the correct CSS generated for them
by get_stylesheet() (Jack Lloyd)
- Added new keywords to C and C++ files (Jack Lloyd)
- Added section on case sensitivity to documentation that wasn't in the other versions
Version 1.0.3
- Added language files:
* Smarty (Alan Juden)
* C# (Alan Juden)
* VB.NET (Alan Juden)
* C for Macs (M. Uli Kusterer)
* Objective C (M. Uli Kusterer)
- Links can have a target attribute (Andreas Gohr)
- Fixed multiline string bug if not using classes
- Added method set_encoding that allows you to set the character
set used by calls to htmlentities() in GeSHi
- You can now specify an array of object splitters, and each
type of method separated by each object splitter can be highlighted
differently
- If a language uses a case sensitive keyword group and that group
has a URL associated with it, the keyword will not be lowercased
in the URL (M. Uli Kusterer)
Version 1.0.2
- Added language files:
* Actionscript (Steffen Krause)
* ASP (Amit Gupta)
* Bash (Andreas Gohr)
* CADDCL (Roberto Rossi)
* CadLisp (Roberto Rossi)
* C++ (Dennis Bayer)
* Delphi (Járja Norbert)
* Javascript (Ben Keen)
* Lisp (Roberto Rossi)
* OpenOffice.org BASIC (Roberto Rossi)
* Perl (Andreas Gohr and Ben Keen)
* Python (Roberto Rossi)
* VisualFoxPro (Roberto Armellin)
* XML (Nigel McNie, from an idea/file by Christian Weiske)
- Added contrib/ directory with script to create one external stylesheet
from many languages(base script by Andreas Gohr, modified by Nigel McNie),
and an example script (needs lotsa work...)
- Code lines can have their own unique ID (for use with javascript)
(suggested by Andreas von Oettingen)
- Certain rows can be specified to be highlighted differently (suggested by
Andreas von Oettingen)
- Getter available for human-readable language name (suggested by Simon Patterson)
- Line numbers aren't highlighted when a user selects the code
- Contextual highlighting with <BEGIN GeSHi> ... <END GeSHi> in the code (which
can be disabled)
- Functions can be made into URLs to appropriate documentation (suggested
by cybot_tm). Also thanks to Marcin Gryszkalis for the links for C, Java
and Perl.
- Code can have a header and footer
- Time taken to parse the code is recorded and made available with the get_time()
method
- error() now returns a human-readable error message
- Function geshi_highlight added to make it even easier to highlight on the fly
- Advanced regular expression handling
- Bug fixes to lexic_permission handling
Version 1.0.1
- Added methods set_symbols_style() and set_symbols_highlighting(). These should be used
instead of set_brackets_style and set_brackets_highlighting respectively.
- Added a new field - language_path - that can be set either when the constructor is
called, or by the new method set_language_path(), that specifies a path to the directory
containing the language files (bug reported by bbspliff)
- Added a new method set_case_keywords(), that allows the auto-casing feature to be
changed on the fly instead of simply being specified in the language file
- If there is an error the source that is outputted is now handled much better
- Lines are broken in the source only by \n now, not by \r\n (to save on output source)
- Indentation moved into its own method
- Method header() modified to allow the user to choose whether the code is surrounded in
a <div> or a <pre> (see documentation for benefits of both). Method footer() likewise
modified.
- Method get_stylesheet() modified so that a smaller comment is outputted in economy mode,
and bugs with when line number classes are outputted in economy mode have been fixed
- Bug where spans had two quotes at the end of the attributes fixed (ie. <span style=".."">)
- Added language files:
* Ada (Tux)
* Apache log file (Tux)
* ASM (Tux)
* NSIS (Tux)
* Pascal (Tux)
Version 1.0.0
- Initial Release

View File

@ -0,0 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program 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; either version 2 of the License, or
(at your option) any later version.
This program 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 this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View File

@ -0,0 +1,33 @@
GeSHi - GEneric Syntax HIghlighter
----------------------------------
Version 1.0.8
Author: Nigel McNie, Benny Baumann
Email: nigel@geshi.org, BenBE@omorphia.de
GeSHi Website: http://qbnz.com/highlighter
GeSHi is a generic syntax highlighter, written in PHP. You simply
input the source code you wish to highlight with the language you
wish to use, and the output will be a file syntax highlighted to
XHTML standards.
For more information on how to use GeSHi, please consult the
documentation. If you got this readme from a GeSHi package, then
the documentation is available in the docs/ directory. Documentation
is also available at http://qbnz.com/highlighter/documentation.php
If you think you've found a bug in GeSHi, contact me with a bug
report at BenBE@omorphia.de, or submit it to the bug tracker at
http://sourceforge.net/tracker/?group_id=114997&atid=670231. Be
aware that minor highlighting errors may well just be incorrect
language files, but if you do find something major please contact me.
And if you're using GeSHi as a plugin/mod for some other software,
please tell me about it! It's worth a link to you, and I can give
you specialist help if you need it.
GeSHi is free software, released under the GNU GPL. Please see the
COPYING file for more information. If you do modify this program,
please tell me about it! Perhaps you've made a good improvement that
I can learn from :)

View File

@ -0,0 +1,163 @@
THANKS - List of credits for GeSHi
I owe these people/groups my thanks for help with GeSHi. Thanks, guys!
- Amit Gupta - Thanks for all that constructive criticism - it's
a great help for making GeSHi even better. And
thanks for the Wordpress plugin! (Anyone who is
interested in the plugin can visit:
http://blog.igeek.info/still-fresh/category/wp-plugins/igsyntax-hiliter/)
- Andreas Gohr - Thanks for language files and for using GeSHi for DokuWiki
(http://www.splitbrain.org/dokuwiki/wiki:dokuwiki). And thanks
for all your criticisms and for that stylesheet-maker code :).
Also, thanks for the UTF-8 patch.
- Andreas von Oettingen - Thanks for those great ideas! :)
- bbspliff - Thanks for pointing out that bug (pity I already
found it though ;))
- Benny Baumann - Thanks for your innumerable suggestions for improvements, and your
work on Delphi support :)
- Ben Keen - Thanks for the language files and pointing out some
ideas for future releases. Lookin' forward to seeing that
software soon! ;)
- Brian Cheesman - Thanks for using GeSHi in phpCvsView, and for the suggestion about
extension => language lookup
- Christian Weiske - Thanks for the inspiration for creating advanced regexp
highlighting :D
- Cliff Stanford - Thanks for the hardquote support for C# and Perl (can be used elsewhere
I'm sure)
- David Gartner - Thanks for using GeSHi in net2ftp, and for the idea about a load_from_file
method
- forum.qbasicnews.com - Thanks for putting up with the crappy versions
that I "forced" on you guys before ;)
- Jack Lloyd - Thanks for pointing out the versioning and method CSS bugs, and giving
me the extra C/C++ keywords
- Karim Scheik - Thanks for the php5 support report
- Marcin Gryszkalis - Thanks for those links for C, Java, Perl
- M. Uli Kusterer - Thanks for the idea about URL case conversion
- Milian Wolff - Thanks for the loads of optimizations
- Thanks for helping with implementation of various features
- Roberto Armellin - Thanks for pointing out some flaws in GeSHi (that will be solved
in 1.2 guaranteed)
- Sterling Christensen - Thanks for those links to language specs
- Tux - Thanks for making all those language files :D
- zbw - Thanks for proving a phpBB port was possible
PEOPE WHO MADE LANGUAGE FILES
- ABAP Andres Picazo
- Actionscript Steffen Krause (french translation by NikO)
- ActionScript 3 Jordi Boggiano (version for ActionScript3 and MXML)
- Ada Tux
- Apache Tux
- Applescript Stephan Klimek
- Apt sources.list Milian Wolff
- ASM Tux
- ASP Amit Gupta
- AutoIT mastrboy
- AviSynth Ryan Jones
- Bash Andreas Gohr
- Basic4GL Matthew Webb
- BlitzBasic P<>draig O`Connel
- BNF Rowan Rodrik van der Molen
- Boo Marcus Griep
- Brainfuck \ Brainfork Benny Baumann
- C++ Dennis Bayer, M. Uli Kusterer
- C++/QT Iulian M
- C# Alan Juden
- C for Macs M. Uli Kusterer
- CADDCL Roberto Rossi
- CadLisp Roberto Rossi
- CDFG John Horigan
- CIL Marcus Griep
- COBOL Benny Baumann
- ColdFusion Diego
- D Thomas Kuehne
- DCS Stelio Passaris
- Delphi Járja Norbert, Benny Baumann
- Div Gabriel Lorenzo
- DOS Alessandro Staltari
- Eiffel Zoran Simic
- eMail \ mbox Benny Baumann
- FreeBasic Roberto Rossi
- Fortran Cedric Arrabie
- glSlang Benny Baumann
- Gettext Milian Wolff
- GNU make Neil Bird
- Gnuplot Milian Wolff
- GML José Jorge Enríquez Rodríguez
- Groovy Ivan F. Villanueva B.
- Haskell Dagit
- HQ9+ Benny Baumann
- Ini Deguix
- Inno Thomas Klinger
- INTERCAL Benny Baumann
- Java 5 Clemens Bruckmann
- Javascript Ben Keen
- KiXtart Riley McArdle
- KLone C Mickael Auger
- KLone C++ Mickael Auger
- LaTeX Matthais Pospiech
- Lisp Roberto Rossi
- Locomotive Basic Nacho Cabanes
- LOLcode Benny Baumann
- LScript Beau McGuigan
- LSL2 William Fry
- Lua Roberto Rossi
- m86k Benny Baumann
- mIRC Alberto de Areba Sánchez
- Modula-3 Martin Bishop
- MPASM Bakalex
- MXML David Spurr
- MySQL Carl Fürstenberg, Marjolein Katsma
- NSIS Tux, Deguix
- Oberon-2 Mike Mol
- Objective C M. Uli Kusterer
- Ocaml Flaie
- Ocaml-brief Flaie
- OpenOffice.org BASIC Roberto Rossi
- Oracle 8 Guy Wicks
- Oracle 11i Simon Redhead
- Pascal Tux
- Perl Andreas Gohr, Ben Keen
- PIC16xxx assembler Phil Mattison
- Pixel Bender Richard Olsson
- PL/SQL Victor Engmark
- POV-Ray Carl Fürstenberg
- PowerShell Frode Aarebrot
- Progress Marco Aurelio de Pasqual
- Prolog Benny Baumann
- ProvideX Jeff Wilder
- Python Roberto Rossi
- Rails Moises Deniz
- Rebol Lecanu Guillaume
- Reg SmokingRope
- Robots Christian Lescuyer
- Ruby Amit Gupta, Moises Deniz
- SAS Galen Johnson
- SDLBasic Roberto Rossi
- Scheme Jon Raphaelson
- SciLab Christophe David
- Smalltalk Bananeweizen
- Smarty Alan Juden
- T-SQL Duncan Lock
- TeraTerm Boris Maisuradze
- Text SmokingRope
- TCL Reid van Melle
- thinBasic Eros Olmi
- TypoScript Jan-Philipp Halle
- Uno IDL Cedric Bosdonnat
- VB Roberto Rossi
- VB.NET Alan Juden
- Verilog Günter Dannoritzer
- VIM Script Swaroop C H
- Visual FoxPro Roberto Armellin
- Visual Prolog Thomas Linder Puls
- Whitespace Benny Baumann
- Winbatch Craig Storey
- X++ Simon Butcher
- Xorg config Milian Wolff
- Z80 Assembler Benny Baumann
Do you want your name in here? Help me out! Make a language file, or suggest a new
feature, or make a plugin for GeSHi for some other software, then tell me about it!

View File

@ -0,0 +1,71 @@
TODO - List of things to do as of 2005/01/29
Suggestions for things to add are welcome, if you have a feature request you
can either post it to the forums:
http://qbnz.com/highlighter/forum.php
Or to the feature request tracker:
http://sourceforge.net/tracker/?group_id=114997&atid=670234
TODO for version 1.0.8.x
- Rework the load_from_file method and the one for getting a file extension,
as documented in the source.
- use analogous vars to $next_comment_regexp_pos for more GeSHi structures,
should reduce number of functions called and hence improve performance
- make a set of default colours which can be used in the language files.
this way we can give languages a uniform look and maybe even add "themes"
- Get better coverage in our coderepo
- README / INSTALL / ... file for phpdoc integration => take geshi-doc.*?
- rework HARDQUOTE + styles, currently this is a bit of a mess imo (milian)
- Allow per-keywordgroup AutoCaps/NoCaps
- Complete API to support latest features
set_number_style ($key missing)
set_string_style ($key missing)
set_case_keywords (support for per_keywordgroup AutoCaps)
TODO for version 1.2.0
- Rewrite engine to use remove/replace method (will hopefully almost
eliminate the need for regular expressions except for numbers/methods
etc). This will also assist for making different output formats [DONE]
- "Intelligent" output format - eg if the user doesn't want lines to
wrap and wants line numbers don't use <ol>, use the <table> method
instead. (This saves on output)
- Clear split between "public" and "private" methods [DONE]
- PHP5 version
- "Themes" for styles - basically pre-made stylesheets that can be used
to highlight code of any language in a similar manner [DONE]
- "Dialects" for languages - eg php4, php5. One master language definition
file, and a bunch of "specialised" dialect files for each language
Ability to specify a "specialised" dialect as default? [DONE]
- Look at load/memory usage and try to reduce
- Make tabs into tab-stops like a normal editor [DONE]
- Ability to add more than one multiline comment or string [DONE]
- Ability to specify that strings cannot be multiline [DONE]
- Create a "wrapper" class for ultra-easy use
- Code written in a style that conforms to a phpdoc utility [DONE, PEAR]
- Dig functions/methods out of code and where they are called make an internal
link back to their definition
TODO for version 2.0.0
- Support for multiple output formats (XHTML, XML, PDF, RTF etc) [DONE IN 1.2]
- Support for auto-indent/code "beautifing"
- Option for "Lite" highlighting - aims for speed and low server load
- "Intelligent" highlighting inside comments, and ability to highlight
source in multiple languages at once (eg PHP+HTML) [DONE IN 1.2]
- Perhaps a script on the GeSHi site that would map urls to appropriate
definitions and relocate the user? (eg, java documentation is
structured in such a way that urls are not able to be used with GeSHi.
Instead the URL could become:
http://qbnz.com/highlighter/redirect.php?lang=java&kw=KeyWord
and that script would redirect to the correct location.
[BETTER FIX IN 1.2]
$Id: TODO 1727 2008-08-08 13:36:52Z benbe $

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,13 @@
<html>
<head>
<title>GeSHi 1.0.8</title>
<link rel="stylesheet" href="media/stylesheet.css" />
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
</head>
<body>
<div align="center"><h1>GeSHi 1.0.8</h1></div>
<b>Welcome to geshi!</b><br />
<br />
This documentation was generated by <a href="http://www.phpdoc.org">phpDocumentor v1.4.2</a><br />
</body>
</html>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- template designed by Marco Von Ballmoos -->
<title></title>
<link rel="stylesheet" href="media/stylesheet.css" />
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
</head>
<body>
<!-- Start of Class Data -->
<H2>
</H2>
<h2>Root class GeSHi</h2>
<ul>
<li><a href="geshi/core/GeSHi.html">GeSHi</a></li></ul>
<p class="notes" id="credit">
Documentation generated on Thu, 25 Dec 2008 14:34:34 +0100 by <a href="http://www.phpdoc.org" target="_blank">phpDocumentor 1.4.2</a>
</p>
</body>
</html>

View File

@ -0,0 +1,867 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- template designed by Marco Von Ballmoos -->
<title></title>
<link rel="stylesheet" href="media/stylesheet.css" />
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
</head>
<body>
<a name="top"></a>
<h2>Full index</h2>
<h3>Package indexes</h3>
<ul>
<li><a href="elementindex_geshi.html">geshi</a></li>
</ul>
<br />
<div class="index-letter-menu">
<a class="index-letter" href="elementindex.html#a">a</a>
<a class="index-letter" href="elementindex.html#d">d</a>
<a class="index-letter" href="elementindex.html#e">e</a>
<a class="index-letter" href="elementindex.html#g">g</a>
<a class="index-letter" href="elementindex.html#h">h</a>
<a class="index-letter" href="elementindex.html#l">l</a>
<a class="index-letter" href="elementindex.html#o">o</a>
<a class="index-letter" href="elementindex.html#p">p</a>
<a class="index-letter" href="elementindex.html#r">r</a>
<a class="index-letter" href="elementindex.html#s">s</a>
</div>
<a name="a"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">a</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">add_keyword</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodadd_keyword">GeSHi::add_keyword()</a> in geshi.php</div>
<div class="index-item-description">Adds a keyword to a keyword group for highlighting</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">add_keyword_group</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodadd_keyword_group">GeSHi::add_keyword_group()</a> in geshi.php</div>
<div class="index-item-description">Creates a new keyword group</div>
</dd>
</dl>
<a name="d"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">d</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">disable_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methoddisable_highlighting">GeSHi::disable_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Disables all highlighting</div>
</dd>
</dl>
<a name="e"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">e</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_classes</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_classes">GeSHi::enable_classes()</a> in geshi.php</div>
<div class="index-item-description">Sets whether CSS classes should be used to highlight the source. Default is off, calling this method with no arguments will turn it on</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_highlighting">GeSHi::enable_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Enables all highlighting</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_ids</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_ids">GeSHi::enable_ids()</a> in geshi.php</div>
<div class="index-item-description">Whether CSS IDs should be added to each line</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_important_blocks</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_important_blocks">GeSHi::enable_important_blocks()</a> in geshi.php</div>
<div class="index-item-description">Sets whether context-important blocks are highlighted</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_inner_code_block</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_inner_code_block">GeSHi::enable_inner_code_block()</a> in geshi.php</div>
<div class="index-item-description">Sets whether to force a surrounding block around the highlighted code or not</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_keyword_links</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_keyword_links">GeSHi::enable_keyword_links()</a> in geshi.php</div>
<div class="index-item-description">Turns linking of keywords on or off.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_line_numbers</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_line_numbers">GeSHi::enable_line_numbers()</a> in geshi.php</div>
<div class="index-item-description">Sets whether line numbers should be displayed.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_multiline_span</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_multiline_span">GeSHi::enable_multiline_span()</a> in geshi.php</div>
<div class="index-item-description">Sets wether spans and other HTML markup generated by GeSHi can span over multiple lines or not. Defaults to true to reduce overhead.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_strict_mode</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_strict_mode">GeSHi::enable_strict_mode()</a> in geshi.php</div>
<div class="index-item-description">Enables/disables strict highlighting. Default is off, calling this method without parameters will turn it on. See documentation for more details on strict mode and where to use it.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">error</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methoderror">GeSHi::error()</a> in geshi.php</div>
<div class="index-item-description">Returns an error message associated with the last GeSHi operation, or false if no error has occured</div>
</dd>
</dl>
<a name="g"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">g</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Constructor.png" alt="Method" title="Method" /></title>
<span class="method-title">GeSHi</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodGeSHi">GeSHi::GeSHi()</a> in geshi.php</div>
<div class="index-item-description">Creates a new GeSHi object, with source and language</div>
</dd>
<dt class="field">
<img src="media/images/Class.png" alt="Class" title="Class" /></title>
GeSHi
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html">GeSHi</a> in geshi.php</div>
<div class="index-item-description">The GeSHi Class.</div>
</dd>
<dt class="field">
<img src="media/images/Page.png" alt="Page" title="Page" /></title>
<span class="include-title">geshi.php</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html">geshi.php</a> in geshi.php</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_ACTIVE</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_ACTIVE">GESHI_ACTIVE</a> in geshi.php</div>
<div class="index-item-description">Links in the source in the :active state</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_CAPS_LOWER</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_LOWER">GESHI_CAPS_LOWER</a> in geshi.php</div>
<div class="index-item-description">Leave keywords found as the case that they are</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_CAPS_NO_CHANGE</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_NO_CHANGE">GESHI_CAPS_NO_CHANGE</a> in geshi.php</div>
<div class="index-item-description">Lowercase keywords found</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_CAPS_UPPER</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_UPPER">GESHI_CAPS_UPPER</a> in geshi.php</div>
<div class="index-item-description">Uppercase keywords found</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_END_IMPORTANT</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_END_IMPORTANT">GESHI_END_IMPORTANT</a> in geshi.php</div>
<div class="index-item-description">The ender for important parts of the source</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_FANCY_LINE_NUMBERS</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_FANCY_LINE_NUMBERS">GESHI_FANCY_LINE_NUMBERS</a> in geshi.php</div>
<div class="index-item-description">Use fancy line numbers when building the result</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HEADER_DIV</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_DIV">GESHI_HEADER_DIV</a> in geshi.php</div>
<div class="index-item-description">Use a &quot;div&quot; to surround the source</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HEADER_NONE</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_NONE">GESHI_HEADER_NONE</a> in geshi.php</div>
<div class="index-item-description">Use nothing to surround the source</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HEADER_PRE</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE">GESHI_HEADER_PRE</a> in geshi.php</div>
<div class="index-item-description">Use a &quot;pre&quot; to surround the source</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HEADER_PRE_TABLE</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_TABLE">GESHI_HEADER_PRE_TABLE</a> in geshi.php</div>
<div class="index-item-description">Use a &quot;table&quot; to surround the source:</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HEADER_PRE_VALID</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID">GESHI_HEADER_PRE_VALID</a> in geshi.php</div>
<div class="index-item-description">Use a pre to wrap lines when line numbers are enabled or to wrap the whole code.</div>
</dd>
<dt class="field">
<img src="media/images/Function.png" alt="Function" title="Function" /></title>
<span class="method-title">geshi_highlight</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#functiongeshi_highlight">geshi_highlight()</a> in geshi.php</div>
<div class="index-item-description">Easy way to highlight stuff. Behaves just like highlight_string</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HOVER</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HOVER">GESHI_HOVER</a> in geshi.php</div>
<div class="index-item-description">Links in the source in the :hover state</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_LANG_ROOT</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_LANG_ROOT">GESHI_LANG_ROOT</a> in geshi.php</div>
<div class="index-item-description">The language file directory for GeSHi</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_LINK</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_LINK">GESHI_LINK</a> in geshi.php</div>
<div class="index-item-description">Links in the source in the :link state</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_NORMAL_LINE_NUMBERS</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_NORMAL_LINE_NUMBERS">GESHI_NORMAL_LINE_NUMBERS</a> in geshi.php</div>
<div class="index-item-description">Use normal line numbers when building the result</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_NO_LINE_NUMBERS</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS">GESHI_NO_LINE_NUMBERS</a> in geshi.php</div>
<div class="index-item-description">Use no line numbers when building the result</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_ROOT</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_ROOT">GESHI_ROOT</a> in geshi.php</div>
<div class="index-item-description">The root directory for GeSHi</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_SECURITY_PARANOID</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_SECURITY_PARANOID">GESHI_SECURITY_PARANOID</a> in geshi.php</div>
<div class="index-item-description">Tells GeSHi to be paranoid about security settings</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_START_IMPORTANT</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_START_IMPORTANT">GESHI_START_IMPORTANT</a> in geshi.php</div>
<div class="index-item-description">The starter for important parts of the source</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_VERSION</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_VERSION">GESHI_VERSION</a> in geshi.php</div>
<div class="index-item-description">The version of this GeSHi file</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_VISITED</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_VISITED">GESHI_VISITED</a> in geshi.php</div>
<div class="index-item-description">Links in the source in the :visited state</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_language_name</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_language_name">GeSHi::get_language_name()</a> in geshi.php</div>
<div class="index-item-description">Gets a human-readable language name (thanks to Simon Patterson for the idea :))</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_language_name_from_extension</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_language_name_from_extension">GeSHi::get_language_name_from_extension()</a> in geshi.php</div>
<div class="index-item-description">Given a file extension, this method returns either a valid geshi language name, or the empty string if it couldn't be found</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_multiline_span</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_multiline_span">GeSHi::get_multiline_span()</a> in geshi.php</div>
<div class="index-item-description">Get current setting for multiline spans, see GeSHi-&gt;enable_multiline_span().</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_real_tab_width</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_real_tab_width">GeSHi::get_real_tab_width()</a> in geshi.php</div>
<div class="index-item-description">Returns the tab width to use, based on the current language and user preference</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_stylesheet</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_stylesheet">GeSHi::get_stylesheet()</a> in geshi.php</div>
<div class="index-item-description">Returns a stylesheet for the highlighted code. If $economy mode is true, we only return the stylesheet declarations that matter for this code block instead of the whole thing</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_time</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_time">GeSHi::get_time()</a> in geshi.php</div>
<div class="index-item-description">Gets the time taken to parse the code</div>
</dd>
</dl>
<a name="h"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">h</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">highlight_lines_extra</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodhighlight_lines_extra">GeSHi::highlight_lines_extra()</a> in geshi.php</div>
<div class="index-item-description">Specifies which lines to highlight extra</div>
</dd>
</dl>
<a name="l"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">l</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">load_from_file</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodload_from_file">GeSHi::load_from_file()</a> in geshi.php</div>
<div class="index-item-description">Given a file name, this method loads its contents in, and attempts</div>
</dd>
</dl>
<a name="o"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">o</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">optimize_keyword_group</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodoptimize_keyword_group">GeSHi::optimize_keyword_group()</a> in geshi.php</div>
<div class="index-item-description">compile optimized regexp list for keyword group</div>
</dd>
</dl>
<a name="p"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">p</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">parse_code</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodparse_code">GeSHi::parse_code()</a> in geshi.php</div>
<div class="index-item-description">Returns the code in $this-&gt;source, highlighted and surrounded by the nessecary HTML.</div>
</dd>
</dl>
<a name="r"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">r</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">remove_keyword</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodremove_keyword">GeSHi::remove_keyword()</a> in geshi.php</div>
<div class="index-item-description">Removes a keyword from a keyword group</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">remove_keyword_group</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodremove_keyword_group">GeSHi::remove_keyword_group()</a> in geshi.php</div>
<div class="index-item-description">Removes a keyword group</div>
</dd>
</dl>
<a name="s"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">s</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_brackets_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_brackets_highlighting">GeSHi::set_brackets_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for brackets</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_brackets_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_brackets_style">GeSHi::set_brackets_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for brackets. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_case_keywords</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_case_keywords">GeSHi::set_case_keywords()</a> in geshi.php</div>
<div class="index-item-description">Sets the case that keywords should use when found. Use the constants:</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_case_sensitivity</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_case_sensitivity">GeSHi::set_case_sensitivity()</a> in geshi.php</div>
<div class="index-item-description">Sets whether a set of keywords are checked for in a case sensitive manner</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_code_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_code_style">GeSHi::set_code_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the style for the actual code. This should be a string</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_comments_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_comments_highlighting">GeSHi::set_comments_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for comment groups</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_comments_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_comments_style">GeSHi::set_comments_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for comment groups. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_encoding</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_encoding">GeSHi::set_encoding()</a> in geshi.php</div>
<div class="index-item-description">Sets the encoding used for htmlspecialchars(), for international support.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_escape_characters_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_escape_characters_highlighting">GeSHi::set_escape_characters_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for escaped characters</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_escape_characters_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_escape_characters_style">GeSHi::set_escape_characters_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for escaped characters. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_footer_content</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_footer_content">GeSHi::set_footer_content()</a> in geshi.php</div>
<div class="index-item-description">Sets the content of the footer block</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_footer_content_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_footer_content_style">GeSHi::set_footer_content_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the style for the footer content</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_header_content</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_content">GeSHi::set_header_content()</a> in geshi.php</div>
<div class="index-item-description">Sets the content of the header block</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_header_content_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_content_style">GeSHi::set_header_content_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the style for the header content</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_header_type</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_type">GeSHi::set_header_type()</a> in geshi.php</div>
<div class="index-item-description">Sets the type of header to be used.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_highlight_lines_extra_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_highlight_lines_extra_style">GeSHi::set_highlight_lines_extra_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the style for extra-highlighted lines</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_important_styles</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_important_styles">GeSHi::set_important_styles()</a> in geshi.php</div>
<div class="index-item-description">Sets styles for important parts of the code</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_keyword_group_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_keyword_group_highlighting">GeSHi::set_keyword_group_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for a keyword group</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_keyword_group_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_keyword_group_style">GeSHi::set_keyword_group_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the style for a keyword group. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_language</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_language">GeSHi::set_language()</a> in geshi.php</div>
<div class="index-item-description">Sets the language for this object</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_language_path</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_language_path">GeSHi::set_language_path()</a> in geshi.php</div>
<div class="index-item-description">Sets the path to the directory containing the language files. Note that this path is relative to the directory of the script that included geshi.php, NOT geshi.php itself.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_line_ending</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_line_ending">GeSHi::set_line_ending()</a> in geshi.php</div>
<div class="index-item-description">Sets the line-ending</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_line_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_line_style">GeSHi::set_line_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for the line numbers.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_link_styles</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_link_styles">GeSHi::set_link_styles()</a> in geshi.php</div>
<div class="index-item-description">Sets styles for links in code</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_link_target</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_link_target">GeSHi::set_link_target()</a> in geshi.php</div>
<div class="index-item-description">Sets the target for links in code</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_methods_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_methods_highlighting">GeSHi::set_methods_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for methods</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_methods_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_methods_style">GeSHi::set_methods_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for methods. $key is a number that references the</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_numbers_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_numbers_highlighting">GeSHi::set_numbers_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for numbers</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_numbers_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_numbers_style">GeSHi::set_numbers_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for numbers. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_overall_class</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_class">GeSHi::set_overall_class()</a> in geshi.php</div>
<div class="index-item-description">Sets the overall classname for this block of code. This class can then be used in a stylesheet to style this object's output</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_overall_id</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_id">GeSHi::set_overall_id()</a> in geshi.php</div>
<div class="index-item-description">Sets the overall id for this block of code. This id can then be used in a stylesheet to style this object's output</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_overall_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_style">GeSHi::set_overall_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for the code that will be outputted when this object is parsed. The style should be a string of valid stylesheet declarations</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_regexps_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_regexps_highlighting">GeSHi::set_regexps_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for regexps</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_regexps_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_regexps_style">GeSHi::set_regexps_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for regexps. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_source</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_source">GeSHi::set_source()</a> in geshi.php</div>
<div class="index-item-description">Sets the source code for this object</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_strings_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_strings_highlighting">GeSHi::set_strings_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for strings</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_strings_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_strings_style">GeSHi::set_strings_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for strings. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_symbols_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_symbols_highlighting">GeSHi::set_symbols_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for symbols</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_symbols_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_symbols_style">GeSHi::set_symbols_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for symbols. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_tab_width</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_tab_width">GeSHi::set_tab_width()</a> in geshi.php</div>
<div class="index-item-description">Sets how many spaces a tab is substituted for</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_url_for_keyword_group</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_url_for_keyword_group">GeSHi::set_url_for_keyword_group()</a> in geshi.php</div>
<div class="index-item-description">Sets the base URL to be used for keywords</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_use_language_tab_width</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_use_language_tab_width">GeSHi::set_use_language_tab_width()</a> in geshi.php</div>
<div class="index-item-description">Sets whether or not to use tab-stop width specifed by language</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">start_line_numbers_at</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodstart_line_numbers_at">GeSHi::start_line_numbers_at()</a> in geshi.php</div>
<div class="index-item-description">Sets what number line numbers should start at. Should be a positive integer, and will be converted to one.</div>
</dd>
</dl>
<div class="index-letter-menu">
<a class="index-letter" href="elementindex.html#a">a</a>
<a class="index-letter" href="elementindex.html#d">d</a>
<a class="index-letter" href="elementindex.html#e">e</a>
<a class="index-letter" href="elementindex.html#g">g</a>
<a class="index-letter" href="elementindex.html#h">h</a>
<a class="index-letter" href="elementindex.html#l">l</a>
<a class="index-letter" href="elementindex.html#o">o</a>
<a class="index-letter" href="elementindex.html#p">p</a>
<a class="index-letter" href="elementindex.html#r">r</a>
<a class="index-letter" href="elementindex.html#s">s</a>
</div> </body>
</html>

View File

@ -0,0 +1,864 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- template designed by Marco Von Ballmoos -->
<title></title>
<link rel="stylesheet" href="media/stylesheet.css" />
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
</head>
<body>
<a name="top"></a>
<h2>[geshi] element index</h2>
<a href="elementindex.html">All elements</a>
<br />
<div class="index-letter-menu">
<a class="index-letter" href="elementindex_geshi.html#a">a</a>
<a class="index-letter" href="elementindex_geshi.html#d">d</a>
<a class="index-letter" href="elementindex_geshi.html#e">e</a>
<a class="index-letter" href="elementindex_geshi.html#g">g</a>
<a class="index-letter" href="elementindex_geshi.html#h">h</a>
<a class="index-letter" href="elementindex_geshi.html#l">l</a>
<a class="index-letter" href="elementindex_geshi.html#o">o</a>
<a class="index-letter" href="elementindex_geshi.html#p">p</a>
<a class="index-letter" href="elementindex_geshi.html#r">r</a>
<a class="index-letter" href="elementindex_geshi.html#s">s</a>
</div>
<a name="a"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">a</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">add_keyword</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodadd_keyword">GeSHi::add_keyword()</a> in geshi.php</div>
<div class="index-item-description">Adds a keyword to a keyword group for highlighting</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">add_keyword_group</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodadd_keyword_group">GeSHi::add_keyword_group()</a> in geshi.php</div>
<div class="index-item-description">Creates a new keyword group</div>
</dd>
</dl>
<a name="d"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">d</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">disable_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methoddisable_highlighting">GeSHi::disable_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Disables all highlighting</div>
</dd>
</dl>
<a name="e"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">e</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_classes</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_classes">GeSHi::enable_classes()</a> in geshi.php</div>
<div class="index-item-description">Sets whether CSS classes should be used to highlight the source. Default is off, calling this method with no arguments will turn it on</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_highlighting">GeSHi::enable_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Enables all highlighting</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_ids</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_ids">GeSHi::enable_ids()</a> in geshi.php</div>
<div class="index-item-description">Whether CSS IDs should be added to each line</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_important_blocks</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_important_blocks">GeSHi::enable_important_blocks()</a> in geshi.php</div>
<div class="index-item-description">Sets whether context-important blocks are highlighted</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_inner_code_block</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_inner_code_block">GeSHi::enable_inner_code_block()</a> in geshi.php</div>
<div class="index-item-description">Sets whether to force a surrounding block around the highlighted code or not</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_keyword_links</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_keyword_links">GeSHi::enable_keyword_links()</a> in geshi.php</div>
<div class="index-item-description">Turns linking of keywords on or off.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_line_numbers</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_line_numbers">GeSHi::enable_line_numbers()</a> in geshi.php</div>
<div class="index-item-description">Sets whether line numbers should be displayed.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_multiline_span</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_multiline_span">GeSHi::enable_multiline_span()</a> in geshi.php</div>
<div class="index-item-description">Sets wether spans and other HTML markup generated by GeSHi can span over multiple lines or not. Defaults to true to reduce overhead.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">enable_strict_mode</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodenable_strict_mode">GeSHi::enable_strict_mode()</a> in geshi.php</div>
<div class="index-item-description">Enables/disables strict highlighting. Default is off, calling this method without parameters will turn it on. See documentation for more details on strict mode and where to use it.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">error</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methoderror">GeSHi::error()</a> in geshi.php</div>
<div class="index-item-description">Returns an error message associated with the last GeSHi operation, or false if no error has occured</div>
</dd>
</dl>
<a name="g"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">g</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Constructor.png" alt="Method" title="Method" /></title>
<span class="method-title">GeSHi</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodGeSHi">GeSHi::GeSHi()</a> in geshi.php</div>
<div class="index-item-description">Creates a new GeSHi object, with source and language</div>
</dd>
<dt class="field">
<img src="media/images/Class.png" alt="Class" title="Class" /></title>
GeSHi
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html">GeSHi</a> in geshi.php</div>
<div class="index-item-description">The GeSHi Class.</div>
</dd>
<dt class="field">
<img src="media/images/Page.png" alt="Page" title="Page" /></title>
<span class="include-title">geshi.php</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html">geshi.php</a> in geshi.php</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_ACTIVE</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_ACTIVE">GESHI_ACTIVE</a> in geshi.php</div>
<div class="index-item-description">Links in the source in the :active state</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_CAPS_LOWER</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_LOWER">GESHI_CAPS_LOWER</a> in geshi.php</div>
<div class="index-item-description">Leave keywords found as the case that they are</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_CAPS_NO_CHANGE</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_NO_CHANGE">GESHI_CAPS_NO_CHANGE</a> in geshi.php</div>
<div class="index-item-description">Lowercase keywords found</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_CAPS_UPPER</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_CAPS_UPPER">GESHI_CAPS_UPPER</a> in geshi.php</div>
<div class="index-item-description">Uppercase keywords found</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_END_IMPORTANT</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_END_IMPORTANT">GESHI_END_IMPORTANT</a> in geshi.php</div>
<div class="index-item-description">The ender for important parts of the source</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_FANCY_LINE_NUMBERS</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_FANCY_LINE_NUMBERS">GESHI_FANCY_LINE_NUMBERS</a> in geshi.php</div>
<div class="index-item-description">Use fancy line numbers when building the result</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HEADER_DIV</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_DIV">GESHI_HEADER_DIV</a> in geshi.php</div>
<div class="index-item-description">Use a &quot;div&quot; to surround the source</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HEADER_NONE</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_NONE">GESHI_HEADER_NONE</a> in geshi.php</div>
<div class="index-item-description">Use nothing to surround the source</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HEADER_PRE</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE">GESHI_HEADER_PRE</a> in geshi.php</div>
<div class="index-item-description">Use a &quot;pre&quot; to surround the source</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HEADER_PRE_TABLE</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_TABLE">GESHI_HEADER_PRE_TABLE</a> in geshi.php</div>
<div class="index-item-description">Use a &quot;table&quot; to surround the source:</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HEADER_PRE_VALID</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HEADER_PRE_VALID">GESHI_HEADER_PRE_VALID</a> in geshi.php</div>
<div class="index-item-description">Use a pre to wrap lines when line numbers are enabled or to wrap the whole code.</div>
</dd>
<dt class="field">
<img src="media/images/Function.png" alt="Function" title="Function" /></title>
<span class="method-title">geshi_highlight</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#functiongeshi_highlight">geshi_highlight()</a> in geshi.php</div>
<div class="index-item-description">Easy way to highlight stuff. Behaves just like highlight_string</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_HOVER</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_HOVER">GESHI_HOVER</a> in geshi.php</div>
<div class="index-item-description">Links in the source in the :hover state</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_LANG_ROOT</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_LANG_ROOT">GESHI_LANG_ROOT</a> in geshi.php</div>
<div class="index-item-description">The language file directory for GeSHi</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_LINK</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_LINK">GESHI_LINK</a> in geshi.php</div>
<div class="index-item-description">Links in the source in the :link state</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_NORMAL_LINE_NUMBERS</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_NORMAL_LINE_NUMBERS">GESHI_NORMAL_LINE_NUMBERS</a> in geshi.php</div>
<div class="index-item-description">Use normal line numbers when building the result</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_NO_LINE_NUMBERS</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_NO_LINE_NUMBERS">GESHI_NO_LINE_NUMBERS</a> in geshi.php</div>
<div class="index-item-description">Use no line numbers when building the result</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_ROOT</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_ROOT">GESHI_ROOT</a> in geshi.php</div>
<div class="index-item-description">The root directory for GeSHi</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_SECURITY_PARANOID</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_SECURITY_PARANOID">GESHI_SECURITY_PARANOID</a> in geshi.php</div>
<div class="index-item-description">Tells GeSHi to be paranoid about security settings</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_START_IMPORTANT</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_START_IMPORTANT">GESHI_START_IMPORTANT</a> in geshi.php</div>
<div class="index-item-description">The starter for important parts of the source</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_VERSION</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_VERSION">GESHI_VERSION</a> in geshi.php</div>
<div class="index-item-description">The version of this GeSHi file</div>
</dd>
<dt class="field">
<img src="media/images/Constant.png" alt="Constant" title="Constant" /></title>
<span class="const-title">GESHI_VISITED</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/_geshi.php.html#defineGESHI_VISITED">GESHI_VISITED</a> in geshi.php</div>
<div class="index-item-description">Links in the source in the :visited state</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_language_name</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_language_name">GeSHi::get_language_name()</a> in geshi.php</div>
<div class="index-item-description">Gets a human-readable language name (thanks to Simon Patterson for the idea :))</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_language_name_from_extension</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_language_name_from_extension">GeSHi::get_language_name_from_extension()</a> in geshi.php</div>
<div class="index-item-description">Given a file extension, this method returns either a valid geshi language name, or the empty string if it couldn't be found</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_multiline_span</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_multiline_span">GeSHi::get_multiline_span()</a> in geshi.php</div>
<div class="index-item-description">Get current setting for multiline spans, see GeSHi-&gt;enable_multiline_span().</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_real_tab_width</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_real_tab_width">GeSHi::get_real_tab_width()</a> in geshi.php</div>
<div class="index-item-description">Returns the tab width to use, based on the current language and user preference</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_stylesheet</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_stylesheet">GeSHi::get_stylesheet()</a> in geshi.php</div>
<div class="index-item-description">Returns a stylesheet for the highlighted code. If $economy mode is true, we only return the stylesheet declarations that matter for this code block instead of the whole thing</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">get_time</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodget_time">GeSHi::get_time()</a> in geshi.php</div>
<div class="index-item-description">Gets the time taken to parse the code</div>
</dd>
</dl>
<a name="h"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">h</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">highlight_lines_extra</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodhighlight_lines_extra">GeSHi::highlight_lines_extra()</a> in geshi.php</div>
<div class="index-item-description">Specifies which lines to highlight extra</div>
</dd>
</dl>
<a name="l"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">l</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">load_from_file</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodload_from_file">GeSHi::load_from_file()</a> in geshi.php</div>
<div class="index-item-description">Given a file name, this method loads its contents in, and attempts</div>
</dd>
</dl>
<a name="o"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">o</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">optimize_keyword_group</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodoptimize_keyword_group">GeSHi::optimize_keyword_group()</a> in geshi.php</div>
<div class="index-item-description">compile optimized regexp list for keyword group</div>
</dd>
</dl>
<a name="p"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">p</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">parse_code</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodparse_code">GeSHi::parse_code()</a> in geshi.php</div>
<div class="index-item-description">Returns the code in $this-&gt;source, highlighted and surrounded by the nessecary HTML.</div>
</dd>
</dl>
<a name="r"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">r</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">remove_keyword</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodremove_keyword">GeSHi::remove_keyword()</a> in geshi.php</div>
<div class="index-item-description">Removes a keyword from a keyword group</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">remove_keyword_group</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodremove_keyword_group">GeSHi::remove_keyword_group()</a> in geshi.php</div>
<div class="index-item-description">Removes a keyword group</div>
</dd>
</dl>
<a name="s"></a>
<div class="index-letter-section">
<div style="float: left" class="index-letter-title">s</div>
<div style="float: right"><a href="#top">top</a></div>
<div style="clear: both"></div>
</div>
<dl>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_brackets_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_brackets_highlighting">GeSHi::set_brackets_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for brackets</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_brackets_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_brackets_style">GeSHi::set_brackets_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for brackets. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_case_keywords</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_case_keywords">GeSHi::set_case_keywords()</a> in geshi.php</div>
<div class="index-item-description">Sets the case that keywords should use when found. Use the constants:</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_case_sensitivity</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_case_sensitivity">GeSHi::set_case_sensitivity()</a> in geshi.php</div>
<div class="index-item-description">Sets whether a set of keywords are checked for in a case sensitive manner</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_code_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_code_style">GeSHi::set_code_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the style for the actual code. This should be a string</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_comments_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_comments_highlighting">GeSHi::set_comments_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for comment groups</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_comments_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_comments_style">GeSHi::set_comments_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for comment groups. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_encoding</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_encoding">GeSHi::set_encoding()</a> in geshi.php</div>
<div class="index-item-description">Sets the encoding used for htmlspecialchars(), for international support.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_escape_characters_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_escape_characters_highlighting">GeSHi::set_escape_characters_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for escaped characters</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_escape_characters_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_escape_characters_style">GeSHi::set_escape_characters_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for escaped characters. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_footer_content</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_footer_content">GeSHi::set_footer_content()</a> in geshi.php</div>
<div class="index-item-description">Sets the content of the footer block</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_footer_content_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_footer_content_style">GeSHi::set_footer_content_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the style for the footer content</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_header_content</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_content">GeSHi::set_header_content()</a> in geshi.php</div>
<div class="index-item-description">Sets the content of the header block</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_header_content_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_content_style">GeSHi::set_header_content_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the style for the header content</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_header_type</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_header_type">GeSHi::set_header_type()</a> in geshi.php</div>
<div class="index-item-description">Sets the type of header to be used.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_highlight_lines_extra_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_highlight_lines_extra_style">GeSHi::set_highlight_lines_extra_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the style for extra-highlighted lines</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_important_styles</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_important_styles">GeSHi::set_important_styles()</a> in geshi.php</div>
<div class="index-item-description">Sets styles for important parts of the code</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_keyword_group_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_keyword_group_highlighting">GeSHi::set_keyword_group_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for a keyword group</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_keyword_group_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_keyword_group_style">GeSHi::set_keyword_group_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the style for a keyword group. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_language</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_language">GeSHi::set_language()</a> in geshi.php</div>
<div class="index-item-description">Sets the language for this object</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_language_path</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_language_path">GeSHi::set_language_path()</a> in geshi.php</div>
<div class="index-item-description">Sets the path to the directory containing the language files. Note that this path is relative to the directory of the script that included geshi.php, NOT geshi.php itself.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_line_ending</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_line_ending">GeSHi::set_line_ending()</a> in geshi.php</div>
<div class="index-item-description">Sets the line-ending</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_line_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_line_style">GeSHi::set_line_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for the line numbers.</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_link_styles</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_link_styles">GeSHi::set_link_styles()</a> in geshi.php</div>
<div class="index-item-description">Sets styles for links in code</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_link_target</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_link_target">GeSHi::set_link_target()</a> in geshi.php</div>
<div class="index-item-description">Sets the target for links in code</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_methods_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_methods_highlighting">GeSHi::set_methods_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for methods</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_methods_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_methods_style">GeSHi::set_methods_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for methods. $key is a number that references the</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_numbers_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_numbers_highlighting">GeSHi::set_numbers_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for numbers</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_numbers_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_numbers_style">GeSHi::set_numbers_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for numbers. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_overall_class</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_class">GeSHi::set_overall_class()</a> in geshi.php</div>
<div class="index-item-description">Sets the overall classname for this block of code. This class can then be used in a stylesheet to style this object's output</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_overall_id</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_id">GeSHi::set_overall_id()</a> in geshi.php</div>
<div class="index-item-description">Sets the overall id for this block of code. This id can then be used in a stylesheet to style this object's output</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_overall_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_overall_style">GeSHi::set_overall_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for the code that will be outputted when this object is parsed. The style should be a string of valid stylesheet declarations</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_regexps_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_regexps_highlighting">GeSHi::set_regexps_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for regexps</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_regexps_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_regexps_style">GeSHi::set_regexps_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for regexps. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_source</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_source">GeSHi::set_source()</a> in geshi.php</div>
<div class="index-item-description">Sets the source code for this object</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_strings_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_strings_highlighting">GeSHi::set_strings_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for strings</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_strings_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_strings_style">GeSHi::set_strings_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for strings. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_symbols_highlighting</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_symbols_highlighting">GeSHi::set_symbols_highlighting()</a> in geshi.php</div>
<div class="index-item-description">Turns highlighting on/off for symbols</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_symbols_style</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_symbols_style">GeSHi::set_symbols_style()</a> in geshi.php</div>
<div class="index-item-description">Sets the styles for symbols. If $preserve_defaults is true, then styles are merged with the default styles, with the user defined styles having priority</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_tab_width</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_tab_width">GeSHi::set_tab_width()</a> in geshi.php</div>
<div class="index-item-description">Sets how many spaces a tab is substituted for</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_url_for_keyword_group</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_url_for_keyword_group">GeSHi::set_url_for_keyword_group()</a> in geshi.php</div>
<div class="index-item-description">Sets the base URL to be used for keywords</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">set_use_language_tab_width</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodset_use_language_tab_width">GeSHi::set_use_language_tab_width()</a> in geshi.php</div>
<div class="index-item-description">Sets whether or not to use tab-stop width specifed by language</div>
</dd>
<dt class="field">
<img src="media/images/Method.png" alt="Method" title="Method" /></title>
<span class="method-title">start_line_numbers_at</span>
</dt>
<dd class="index-item-body">
<div class="index-item-details"><a href="geshi/core/GeSHi.html#methodstart_line_numbers_at">GeSHi::start_line_numbers_at()</a> in geshi.php</div>
<div class="index-item-description">Sets what number line numbers should start at. Should be a positive integer, and will be converted to one.</div>
</dd>
</dl>
<div class="index-letter-menu">
<a class="index-letter" href="elementindex_geshi.html#a">a</a>
<a class="index-letter" href="elementindex_geshi.html#d">d</a>
<a class="index-letter" href="elementindex_geshi.html#e">e</a>
<a class="index-letter" href="elementindex_geshi.html#g">g</a>
<a class="index-letter" href="elementindex_geshi.html#h">h</a>
<a class="index-letter" href="elementindex_geshi.html#l">l</a>
<a class="index-letter" href="elementindex_geshi.html#o">o</a>
<a class="index-letter" href="elementindex_geshi.html#p">p</a>
<a class="index-letter" href="elementindex_geshi.html#r">r</a>
<a class="index-letter" href="elementindex_geshi.html#s">s</a>
</div> </body>
</html>

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- template designed by Marco Von Ballmoos -->
<title>phpDocumentor Parser Errors and Warnings</title>
<link rel="stylesheet" href="media/stylesheet.css" />
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
</head>
<body>
<a href="#Post-parsing">Post-parsing</a><br>
<a name="geshi.php"></a>
<h1>geshi.php</h1>
<h2>Errors:</h2><br>
<b>Error on line 569</b> - DocBlock has multiple @access tags, illegal. ignoring additional tag "@access private"<br>
<p class="notes" id="credit">
Documentation generated on Thu, 25 Dec 2008 14:34:53 +0100 by <a href="http://www.phpdoc.org" target="_blank">phpDocumentor 1.4.2</a>
</p>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,478 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- template designed by Marco Von Ballmoos -->
<title>Docs for page geshi.php</title>
<link rel="stylesheet" href="../../media/stylesheet.css" />
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
</head>
<body>
<div class="page-body">
<h2 class="file-name"><img src="../../media/images/Page_logo.png" alt="File" style="vertical-align: middle">/geshi.php</h2>
<a name="sec-description"></a>
<div class="info-box">
<div class="info-box-title">Description</div>
<div class="nav-bar">
<span class="disabled">Description</span> |
<a href="#sec-classes">Classes</a>
| <a href="#sec-constants">Constants</a>
| <a href="#sec-functions">Functions</a>
</div>
<div class="info-box-body">
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">GeSHi - Generic Syntax Highlighter</p>
<p class="description"><p>The GeSHi class for Generic Syntax Highlighting. Please refer to the documentation at http://qbnz.com/highlighter/documentation.php for more information about how to use this class.</p><p>For changes, release notes, TODOs etc, see the relevant files in the docs/ directory.</p><p>This file is part of GeSHi.</p><p>GeSHi 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; either version 2 of the License, or (at your option) any later version.</p><p>GeSHi 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.</p><p>You should have received a copy of the GNU General Public License along with GeSHi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</p></p>
<ul class="tags">
<li><span class="field">author:</span> Nigel McNie &lt;<a href="mailto:nigel@geshi.org">nigel@geshi.org</a>&gt;, Benny Baumann &lt;BenBE@omorphia.de&gt;</li>
<li><span class="field">copyright:</span> (C) 2004 - 2007 Nigel McNie, (C) 2007 - 2008 Benny Baumann</li>
<li><span class="field">filesource:</span> <a href="../../__filesource/fsource_geshi_core_geshi.php.html">Source Code for this file</a></li>
<li><span class="field">license:</span> <a href="http://gnu.org/copyleft/gpl.html">GNU GPL</a></li>
</ul>
</div>
</div>
<a name="sec-classes"></a>
<div class="info-box">
<div class="info-box-title">Classes</div>
<div class="nav-bar">
<a href="#sec-description">Description</a> |
<span class="disabled">Classes</span>
| <a href="#sec-constants">Constants</a>
| <a href="#sec-functions">Functions</a>
</div>
<div class="info-box-body">
<table cellpadding="2" cellspacing="0" class="class-table">
<tr>
<th class="class-table-header">Class</th>
<th class="class-table-header">Description</th>
</tr>
<tr>
<td style="padding-right: 2em; vertical-align: top; white-space: nowrap">
<img src="../../media/images/Class.png"
alt=" class"
title=" class"/>
<a href="../../geshi/core/GeSHi.html">GeSHi</a>
</td>
<td>
The GeSHi Class.
</td>
</tr>
</table>
</div>
</div>
<a name="sec-constants"></a>
<div class="info-box">
<div class="info-box-title">Constants</div>
<div class="nav-bar">
<a href="#sec-description">Description</a> |
<a href="#sec-classes">Classes</a>
| <span class="disabled">Constants</span>
| <a href="#sec-functions">Functions</a>
</div>
<div class="info-box-body">
<a name="defineGESHI_ACTIVE"><!-- --></a>
<div class="oddrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_ACTIVE</span> = 2
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a107">107</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Links in the source in the :active state</p>
</div>
<a name="defineGESHI_CAPS_LOWER"><!-- --></a>
<div class="evenrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_CAPS_LOWER</span> = 2
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a99">99</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Leave keywords found as the case that they are</p>
</div>
<a name="defineGESHI_CAPS_NO_CHANGE"><!-- --></a>
<div class="oddrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_CAPS_NO_CHANGE</span> = 0
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a95">95</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Lowercase keywords found</p>
</div>
<a name="defineGESHI_CAPS_UPPER"><!-- --></a>
<div class="evenrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_CAPS_UPPER</span> = 1
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a97">97</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Uppercase keywords found</p>
</div>
<a name="defineGESHI_END_IMPORTANT"><!-- --></a>
<div class="oddrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_END_IMPORTANT</span> = '&lt;END GeSHi&gt;'
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a117">117</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">The ender for important parts of the source</p>
</div>
<a name="defineGESHI_FANCY_LINE_NUMBERS"><!-- --></a>
<div class="evenrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_FANCY_LINE_NUMBERS</span> = 2
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a67">67</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Use fancy line numbers when building the result</p>
</div>
<a name="defineGESHI_HEADER_DIV"><!-- --></a>
<div class="oddrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_HEADER_DIV</span> = 1
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a73">73</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Use a &quot;div&quot; to surround the source</p>
</div>
<a name="defineGESHI_HEADER_NONE"><!-- --></a>
<div class="evenrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_HEADER_NONE</span> = 0
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a71">71</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Use nothing to surround the source</p>
</div>
<a name="defineGESHI_HEADER_PRE"><!-- --></a>
<div class="oddrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_HEADER_PRE</span> = 2
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a75">75</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Use a &quot;pre&quot; to surround the source</p>
</div>
<a name="defineGESHI_HEADER_PRE_TABLE"><!-- --></a>
<div class="evenrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_HEADER_PRE_TABLE</span> = 4
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a91">91</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Use a &quot;table&quot; to surround the source:</p>
<p class="description"><p>&lt;table&gt; &lt;thead&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;$header&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;<pre>$linenumbers</pre>&lt;/td&gt;&lt;td&gt;<pre>$code></pre>&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;tfooter&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;$footer&lt;/td&gt;&lt;/tr&gt;&lt;/tfoot&gt; &lt;/table&gt;</p><p>this is essentially only a workaround for Firefox, see sf#1651996 or take a look at https://bugzilla.mozilla.org/show_bug.cgi?id=365805</p></p>
<ul class="tags">
<li><span class="field">note:</span> when linenumbers are disabled this is essentially the same as GESHI_HEADER_PRE</li>
</ul>
</div>
<a name="defineGESHI_HEADER_PRE_VALID"><!-- --></a>
<div class="oddrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_HEADER_PRE_VALID</span> = 3
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a77">77</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Use a pre to wrap lines when line numbers are enabled or to wrap the whole code.</p>
</div>
<a name="defineGESHI_HOVER"><!-- --></a>
<div class="evenrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_HOVER</span> = 1
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a105">105</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Links in the source in the :hover state</p>
</div>
<a name="defineGESHI_LANG_ROOT"><!-- --></a>
<div class="oddrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_LANG_ROOT</span> = GESHI_ROOT.'geshi'.DIRECTORY_SEPARATOR
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a53">53</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">The language file directory for GeSHi</p>
</div>
<a name="defineGESHI_LINK"><!-- --></a>
<div class="evenrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_LINK</span> = 0
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a103">103</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Links in the source in the :link state</p>
</div>
<a name="defineGESHI_NORMAL_LINE_NUMBERS"><!-- --></a>
<div class="oddrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_NORMAL_LINE_NUMBERS</span> = 1
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a65">65</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Use normal line numbers when building the result</p>
</div>
<a name="defineGESHI_NO_LINE_NUMBERS"><!-- --></a>
<div class="evenrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_NO_LINE_NUMBERS</span> = 0
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a63">63</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Use no line numbers when building the result</p>
</div>
<a name="defineGESHI_ROOT"><!-- --></a>
<div class="oddrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_ROOT</span> = dirname(__FILE__).DIRECTORY_SEPARATOR
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a49">49</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">The root directory for GeSHi</p>
</div>
<a name="defineGESHI_SECURITY_PARANOID"><!-- --></a>
<div class="evenrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_SECURITY_PARANOID</span> = false
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a58">58</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Tells GeSHi to be paranoid about security settings</p>
</div>
<a name="defineGESHI_START_IMPORTANT"><!-- --></a>
<div class="oddrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_START_IMPORTANT</span> = '&lt;BEGIN GeSHi&gt;'
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a115">115</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">The starter for important parts of the source</p>
</div>
<a name="defineGESHI_VERSION"><!-- --></a>
<div class="evenrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_VERSION</span> = '1.0.8.2',
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a44">44</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">The version of this GeSHi file</p>
</div>
<a name="defineGESHI_VISITED"><!-- --></a>
<div class="oddrow">
<div>
<img src="../../media/images/Constant.png" />
<span class="const-title">
<span class="const-name">GESHI_VISITED</span> = 3
(line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a109">109</a></span>)
</span>
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Links in the source in the :visited state</p>
</div>
</div>
</div>
<a name="sec-functions"></a>
<div class="info-box">
<div class="info-box-title">Functions</div>
<div class="nav-bar">
<a href="#sec-description">Description</a> |
<a href="#sec-classes">Classes</a>
| <a href="#sec-constants">Constants</a>
| <span class="disabled">Functions</span>
</div>
<div class="info-box-body">
<a name="functiongeshi_highlight" id="functiongeshi_highlight"><!-- --></a>
<div class="evenrow">
<div>
<img src="../../media/images/Function.png" />
<span class="method-title">geshi_highlight</span> (line <span class="line-number"><a href="../../__filesource/fsource_geshi_core_geshi.php.html#a4577">4577</a></span>)
</div>
<!-- ========== Info from phpDoc block ========= -->
<p class="short-description">Easy way to highlight stuff. Behaves just like highlight_string</p>
<ul class="tags">
<li><span class="field">return:</span> The code highlighted (if $return is true)</li>
<li><span class="field">since:</span> 1.0.2</li>
</ul>
<div class="method-signature">
<span class="method-result">string</span>
<span class="method-name">
geshi_highlight
</span>
(<span class="var-type">string</span>&nbsp;<span class="var-name">$string</span>, <span class="var-type">string</span>&nbsp;<span class="var-name">$language</span>, [<span class="var-type">string</span>&nbsp;<span class="var-name">$path</span> = <span class="var-default">null</span>], [<span class="var-type">boolean</span>&nbsp;<span class="var-name">$return</span> = <span class="var-default">false</span>])
</div>
<ul class="parameters">
<li>
<span class="var-type">string</span>
<span class="var-name">$string</span><span class="var-description">: The code to highlight</span> </li>
<li>
<span class="var-type">string</span>
<span class="var-name">$language</span><span class="var-description">: The language to highlight the code in</span> </li>
<li>
<span class="var-type">string</span>
<span class="var-name">$path</span><span class="var-description">: The path to the language files. You can leave this blank if you need as from version 1.0.7 the path should be automatically detected</span> </li>
<li>
<span class="var-type">boolean</span>
<span class="var-name">$return</span><span class="var-description">: Whether to return the result or to echo</span> </li>
</ul>
</div>
</div>
</div>
<p class="notes" id="credit">
Documentation generated on Thu, 25 Dec 2008 14:34:34 +0100 by <a href="http://www.phpdoc.org" target="_blank">phpDocumentor 1.4.2</a>
</p>
</div></body>
</html>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//FR"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- Generated by phpDocumentor on Thu, 25 Dec 2008 14:34:34 +0100 -->
<title>GeSHi 1.0.8</title>
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
</head>
<FRAMESET rows='120,*'>
<FRAME src='packages.html' name='left_top' frameborder="1" bordercolor="#999999">
<FRAMESET cols='25%,*'>
<FRAME src='li_geshi.html' name='left_bottom' frameborder="1" bordercolor="#999999">
<FRAME src='blank.html' name='right' frameborder="1" bordercolor="#999999">
</FRAMESET>
<NOFRAMES>
<H2>Frame Alert</H2>
<P>This document is designed to be viewed using the frames feature.
If you see this message, you are using a non-frame-capable web client.</P>
</NOFRAMES>
</FRAMESET>
</HTML>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!-- template designed by Marco Von Ballmoos -->
<title></title>
<link rel="stylesheet" href="media/stylesheet.css" />
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
</head>
<body>
<div class="package-title">geshi</div>
<div class="package-details">
<dl class="tree">
<dt class="folder-title">Description</dt>
<dd>
<a href='classtrees_geshi.html' target='right'>Class trees</a><br />
<a href='elementindex_geshi.html' target='right'>Index of elements</a><br />
<a href="todolist.html" target="right">Todo List</a><br />
</dd>
<dt class="sub-package"><img class="tree-icon" src="media/images/package.png" alt="Sub-package">core</dt>
<dd>
<dl class="tree">
<dt class="folder-title"><img class="tree-icon" src="media/images/class_folder.png" alt=" ">Classes</dt>
<dd><img class="tree-icon" src="media/images/Class.png" alt="Class"><a href='geshi/core/GeSHi.html' target='right'>GeSHi</a></dd>
<dt class="folder-title"><img class="tree-icon" src="media/images/function_folder.png" alt=" ">Functions</dt>
<dd><img class="tree-icon" src="media/images/Function.png" alt="Function"><a href='geshi/core/_geshi.php.html#functiongeshi_highlight' target='right'>geshi_highlight</a></dd>
<dt class="folder-title"><img class="tree-icon" src="media/images/folder.png" alt=" ">Files</dt>
<dd><img class="tree-icon" src="media/images/Page.png" alt="File"><a href='geshi/core/_geshi.php.html' target='right'>geshi.php</a></dd>
</dl>
</dd>
</dl>
</div>
<p class="notes"><a href="http://www.phpdoc.org" target="_blank">phpDocumentor v <span class="field">1.4.2</span></a></p>
</BODY>
</HTML>

View File

@ -0,0 +1,33 @@
body
{
background-color: #EEEEEE;
margin: 0px;
padding: 0px;
}
/* Banner (top bar) classes */
.banner { }
.banner-menu
{
text-align: right;
clear: both;
padding: .5em;
border-top: 2px solid #AAAAAA;
}
.banner-title
{
text-align: right;
font-size: 20pt;
font-weight: bold;
margin: .2em;
}
.package-selector
{
background-color: #DDDDDD;
border: 1px solid #AAAAAA;
color: #000090;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Some files were not shown because too many files have changed in this diff Show More