Initial WebM release
This commit is contained in:
commit
0ea50ce9cb
18
.gitattributes
vendored
Normal file
18
.gitattributes
vendored
Normal 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
4
AUTHORS
Normal 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
3
CHANGELOG
Normal file
@ -0,0 +1,3 @@
|
||||
2010-05-18 v0.9.0
|
||||
- Initial open source release. Welcome to WebM and VP8!
|
||||
|
48
LICENSE
Normal file
48
LICENSE
Normal 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
106
README
Normal 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
215
args.c
Normal 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
43
args.h
Normal 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
1
build/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
x86*-win32-vs*
|
1
build/arm-wince-vs8/.gitattributes
vendored
Normal file
1
build/arm-wince-vs8/.gitattributes
vendored
Normal file
@ -0,0 +1 @@
|
||||
*.rules -crlf
|
20
build/arm-wince-vs8/armasmv5.rules
Normal file
20
build/arm-wince-vs8/armasmv5.rules
Normal 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 "$(IntDir)\$(InputName).obj" $(InputPath) -32 -ARCH 5
"
|
||||
Outputs="$(IntDir)\$(InputName).obj"
|
||||
FileExtensions="*.asm"
|
||||
ExecutionDescription="Assembling $(InputName).asm"
|
||||
ShowOnlyRuleProperties="false"
|
||||
>
|
||||
<Properties>
|
||||
</Properties>
|
||||
</CustomBuildRule>
|
||||
</Rules>
|
||||
</VisualStudioToolFile>
|
20
build/arm-wince-vs8/armasmv6.rules
Normal file
20
build/arm-wince-vs8/armasmv6.rules
Normal 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 "$(IntDir)\$(InputName).obj" $(InputPath) -32 -ARCH 6
"
|
||||
Outputs="$(IntDir)\$(InputName).obj"
|
||||
FileExtensions="*.asm"
|
||||
ExecutionDescription="Assembling $(InputName).asm"
|
||||
ShowOnlyRuleProperties="false"
|
||||
>
|
||||
<Properties>
|
||||
</Properties>
|
||||
</CustomBuildRule>
|
||||
</Rules>
|
||||
</VisualStudioToolFile>
|
20
build/arm-wince-vs8/armasmxscale.rules
Normal file
20
build/arm-wince-vs8/armasmxscale.rules
Normal 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 "$(IntDir)\$(InputName).obj" $(InputPath) -32 -cpu XSCALE
"
|
||||
Outputs="$(IntDir)\$(InputName).obj"
|
||||
FileExtensions="*.asm"
|
||||
ExecutionDescription="Assembling $(InputName).asm"
|
||||
ShowOnlyRuleProperties="false"
|
||||
>
|
||||
<Properties>
|
||||
</Properties>
|
||||
</CustomBuildRule>
|
||||
</Rules>
|
||||
</VisualStudioToolFile>
|
12
build/arm-wince-vs8/obj_int_extract.bat
Normal file
12
build/arm-wince-vs8/obj_int_extract.bat
Normal 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"
|
88
build/arm-wince-vs8/vpx_decoder.sln
Normal file
88
build/arm-wince-vs8/vpx_decoder.sln
Normal 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
341
build/make/Makefile
Executable 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
149
build/make/ads2gas.pl
Executable 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
194
build/make/ads2gas_apple.pl
Executable 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
51
build/make/armlink_adapter.sh
Executable 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
907
build/make/configure.sh
Executable 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
63
build/make/gen_asm_deps.sh
Executable 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
82
build/make/gen_msvs_def.sh
Executable 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
717
build/make/gen_msvs_proj.sh
Executable 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:+;}"${opt##-I}""
|
||||
yasmincs="${yasmincs} ${opt}"
|
||||
;;
|
||||
-D*) defines="${defines}${defines:+;}${opt##-D}"
|
||||
;;
|
||||
-L*) # fudge . to $(OutDir)
|
||||
if [ "${opt##-L}" == "." ]; then
|
||||
libdirs="${libdirs}${libdirs:+;}"\$(OutDir)""
|
||||
else
|
||||
# Also try directories for this platform/configuration
|
||||
libdirs="${libdirs}${libdirs:+;}"${opt##-L}""
|
||||
libdirs="${libdirs}${libdirs:+;}"${opt##-L}/\$(PlatformName)/\$(ConfigurationName)""
|
||||
libdirs="${libdirs}${libdirs:+;}"${opt##-L}/\$(PlatformName)""
|
||||
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};"..\lib/$plat_no_ws"" \
|
||||
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};"..\lib/$plat_no_ws"" \
|
||||
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
272
build/make/gen_msvs_sln.sh
Executable 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}
|
755
build/make/obj_int_extract.c
Normal file
755
build/make/obj_int_extract.c
Normal 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
75
build/make/version.sh
Executable 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
515
configure
vendored
Executable 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
54
docs.mk
Normal 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
213
example_xma.c
Normal 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
231
examples.mk
Normal 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 += $^" > $@
|
48
examples/decode_to_md5.txt
Normal file
48
examples/decode_to_md5.txt
Normal 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
|
73
examples/decode_with_drops.txt
Normal file
73
examples/decode_with_drops.txt
Normal 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
102
examples/decoder_tmpl.c
Normal 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
61
examples/decoder_tmpl.txt
Normal 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
189
examples/encoder_tmpl.c
Normal 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
73
examples/encoder_tmpl.txt
Normal 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
|
25
examples/error_resilient.txt
Normal file
25
examples/error_resilient.txt
Normal 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.
|
28
examples/force_keyframe.txt
Normal file
28
examples/force_keyframe.txt
Normal 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
84
examples/gen_example_code.sh
Executable 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
223
examples/gen_example_doxy.php
Executable 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 <\/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 ('|&|'
|
||||
,'|<|'
|
||||
,'|>|'
|
||||
);
|
||||
$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
83
examples/gen_example_text.sh
Executable 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}"
|
218
examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php
Normal file
218
examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.cfg.php
Normal 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' => array( 'input'=>'lt','tag'=>'mo', 'output'=>'<'), /* 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'=>'>'),
|
||||
'>=' => 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
|
||||
);
|
||||
|
||||
?>
|
1119
examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php
Normal file
1119
examples/includes/ASCIIMathPHP-2.0/ASCIIMathPHP-2.0.class.php
Normal file
File diff suppressed because it is too large
Load Diff
86
examples/includes/ASCIIMathPHP-2.0/htmlMathML.js
Normal file
86
examples/includes/ASCIIMathPHP-2.0/htmlMathML.js
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
1
examples/includes/HTML-Toc-0.91/.gitattributes
vendored
Normal file
1
examples/includes/HTML-Toc-0.91/.gitattributes
vendored
Normal file
@ -0,0 +1 @@
|
||||
* -crlf
|
26
examples/includes/HTML-Toc-0.91/Changes
Normal file
26
examples/includes/HTML-Toc-0.91/Changes
Normal 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.
|
26
examples/includes/HTML-Toc-0.91/MANIFEST
Normal file
26
examples/includes/HTML-Toc-0.91/MANIFEST
Normal 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
|
8
examples/includes/HTML-Toc-0.91/Makefile.PL
Normal file
8
examples/includes/HTML-Toc-0.91/Makefile.PL
Normal file
@ -0,0 +1,8 @@
|
||||
use ExtUtils::MakeMaker;
|
||||
|
||||
WriteMakefile(
|
||||
'NAME' => 'HTML::Toc',
|
||||
'VERSION_FROM' => 'Toc.pm',
|
||||
'PREREQ_PM' => {'HTML::Parser' => 0},
|
||||
'MAN3PODS' => {},
|
||||
);
|
549
examples/includes/HTML-Toc-0.91/Toc.pm
Normal file
549
examples/includes/HTML-Toc-0.91/Toc.pm
Normal 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 "';
|
||||
|
||||
# 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;
|
1710
examples/includes/HTML-Toc-0.91/Toc.pod
Normal file
1710
examples/includes/HTML-Toc-0.91/Toc.pod
Normal file
File diff suppressed because it is too large
Load Diff
1793
examples/includes/HTML-Toc-0.91/TocGenerator.pm
Normal file
1793
examples/includes/HTML-Toc-0.91/TocGenerator.pm
Normal file
File diff suppressed because it is too large
Load Diff
1066
examples/includes/HTML-Toc-0.91/TocInsertor.pm
Normal file
1066
examples/includes/HTML-Toc-0.91/TocInsertor.pm
Normal file
File diff suppressed because it is too large
Load Diff
693
examples/includes/HTML-Toc-0.91/TocUpdator.pm
Normal file
693
examples/includes/HTML-Toc-0.91/TocUpdator.pm
Normal 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;
|
92
examples/includes/HTML-Toc-0.91/t/ManualTest/manualTest1.htm
Normal file
92
examples/includes/HTML-Toc-0.91/t/ManualTest/manualTest1.htm
Normal 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>
|
@ -0,0 +1,5 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>SubSub1</title>
|
||||
</head>
|
||||
</html>
|
@ -0,0 +1,5 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Sub1</title>
|
||||
</head>
|
||||
</html>
|
@ -0,0 +1,5 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>SubSub1</title>
|
||||
</head>
|
||||
</html>
|
@ -0,0 +1,5 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>SubSub2</title>
|
||||
</head>
|
||||
</html>
|
@ -0,0 +1,5 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Sub2</title>
|
||||
</head>
|
||||
</html>
|
@ -0,0 +1,5 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Sub3</title>
|
||||
</head>
|
||||
</html>
|
5
examples/includes/HTML-Toc-0.91/t/SiteMap/index.htm
Normal file
5
examples/includes/HTML-Toc-0.91/t/SiteMap/index.htm
Normal file
@ -0,0 +1,5 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Main</title>
|
||||
</head>
|
||||
</html>
|
87
examples/includes/HTML-Toc-0.91/t/extend.t
Normal file
87
examples/includes/HTML-Toc-0.91/t/extend.t
Normal 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
|
157
examples/includes/HTML-Toc-0.91/t/format.t
Normal file
157
examples/includes/HTML-Toc-0.91/t/format.t
Normal 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()
|
200
examples/includes/HTML-Toc-0.91/t/generate.t
Normal file
200
examples/includes/HTML-Toc-0.91/t/generate.t
Normal 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
|
336
examples/includes/HTML-Toc-0.91/t/insert.t
Normal file
336
examples/includes/HTML-Toc-0.91/t/insert.t
Normal 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 Chapter</h1></a>
|
||||
<a name=h-a.A><h2>a.A Paragraph</h2></a>
|
||||
<a name=h-a.A.1><h3>a.A.1 Paragraph</h3></a>
|
||||
<a name=h-a.A.2><h3>a.A.2 Paragraph</h3></a>
|
||||
<a name=h-a.A.3><h3>a.A.3 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();
|
768
examples/includes/HTML-Toc-0.91/t/manualTest.t
Normal file
768
examples/includes/HTML-Toc-0.91/t/manualTest.t
Normal 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 $aText\n";
|
||||
last SWITCH;
|
||||
}
|
||||
if ($aGroupId eq "h") {
|
||||
$result = "<li>$aSequenceNr. $aText\n";
|
||||
last SWITCH;
|
||||
}
|
||||
else {
|
||||
$result = "<li>$aNode $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 ";
|
||||
last SWITCH;
|
||||
}
|
||||
else {
|
||||
$result = "$aNode ";
|
||||
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: "',
|
||||
'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: "',
|
||||
'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 <a href=#part-1>Disks</a>
|
||||
<ul class=toc_h1>
|
||||
<li>1. <a href=#h-1>Compiler Disk v1</a>
|
||||
<ul class=toc_h2>
|
||||
<li>1. <a href=#h-1.1>System</a>
|
||||
<li>2. <a href=#h-1.2>Standard Library</a>
|
||||
</ul>
|
||||
<li>2. <a href=#h-2>Compiler Disk v2</a>
|
||||
<ul class=toc_h2>
|
||||
<li>1. <a href=#h-2.1>System</a>
|
||||
<ul class=toc_h3>
|
||||
<li>1. <a href=#h-2.1.1>parser.com</a>
|
||||
<li>2. <a href=#h-2.1.2>compiler.com</a>
|
||||
<li>3. <a href=#h-2.1.3>linker.com</a>
|
||||
</ul>
|
||||
<li>2. <a href=#h-2.2>Standard Library</a>
|
||||
</ul>
|
||||
<li>3. <a href=#h-3>Library System Disk</a>
|
||||
</ul>
|
||||
<li>Part 2 <a href=#part-2>Personal</a>
|
||||
<ul class=toc_h1>
|
||||
<li>4. <a href=#h-4>Tips & Tricks</a>
|
||||
</ul>
|
||||
<li>Part 3 <a href=#part-3>Appendixes</a>
|
||||
<ul class=toc_appendix1>
|
||||
<li>A <a href=#appendix-A>Functions Standard Library v1</a>
|
||||
<li>B <a href=#appendix-B>Functions Standard Library v2</a>
|
||||
<li>C <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: Compile Steps</p></a>
|
||||
<ul><pre>
|
||||
Parser
|
||||
Compiler
|
||||
Linker
|
||||
</pre></ul>
|
||||
|
||||
<a name=part-1><h1 class=part>Part 1 Disks</h1></a>
|
||||
<a name=h-1><h1>1 Compiler Disk v1</h1></a>
|
||||
<img src=img.gif alt="Contents Compiler Disk v1">
|
||||
<a name=Figure-1><p class=captionFigure>Figure 1: Contents Compiler Disk v1</p></a>
|
||||
|
||||
<a name=h-1.1><h2>1.1 System</h2></a>
|
||||
<a name=h-1.2><h2>1.2 Standard Library</h2></a>
|
||||
|
||||
<a name=h-2><h1>2 Compiler Disk v2</h1></a>
|
||||
<img src=img.gif alt="Contents Compiler Disk v2">
|
||||
<a name=Figure-2><p class=captionFigure>Figure 2: Contents Compiler Disk v2</p></a>
|
||||
|
||||
<a name=h-2.1><h2>2.1 System</h2></a>
|
||||
<a name=h-2.1.1><h3>2.1.1 parser.com</h3></a>
|
||||
<a name=h-2.1.2><h3>2.1.2 compiler.com</h3></a>
|
||||
<a name=h-2.1.3><h3>2.1.3 linker.com</h3></a>
|
||||
<a name=h-2.2><h2>2.2 Standard Library</h2></a>
|
||||
|
||||
<a name=h-3><h1>3 Library System Disk</h1></a>
|
||||
<a name=part-2><h1 class=part>Part 2 Personal</h1></a>
|
||||
<a name=h-4><h1>4 Tips & Tricks</h1></a>
|
||||
<a name=part-3><h1 class=part>Part 3 Appendixes</h1></a>
|
||||
<a name=appendix-A><h1 class=appendix>A Functions Standard Library v1</h1></a>
|
||||
<a name=appendix-B><h1 class=appendix>B Functions Standard Library v2</h1></a>
|
||||
<a name=appendix-C><h1 class=appendix>C 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: "',
|
||||
'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: "',
|
||||
'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 <a href=#part-1>Disks</a>
|
||||
<ul class=toc_h1>
|
||||
<li>1. <a href=#h-1>Compiler Disk v1</a>
|
||||
<ul class=toc_h2>
|
||||
<li>1. <a href=#h-1.1>System</a>
|
||||
<li>2. <a href=#h-1.2>Standard Library</a>
|
||||
</ul>
|
||||
<li>2. <a href=#h-2>Compiler Disk v2</a>
|
||||
<ul class=toc_h2>
|
||||
<li>1. <a href=#h-2.1>System</a>
|
||||
<ul class=toc_h3>
|
||||
<li>1. <a href=#h-2.1.1>parser.com</a>
|
||||
<li>2. <a href=#h-2.1.2>compiler.com</a>
|
||||
<li>3. <a href=#h-2.1.3>linker.com</a>
|
||||
</ul>
|
||||
<li>2. <a href=#h-2.2>Standard Library</a>
|
||||
</ul>
|
||||
<li>3. <a href=#h-3>Library System Disk</a>
|
||||
</ul>
|
||||
<li>Part 2 <a href=#part-2>Personal</a>
|
||||
<ul class=toc_h1>
|
||||
<li>4. <a href=#h-4>Tips & Tricks</a>
|
||||
</ul>
|
||||
<li>Part 3 <a href=#part-3>Appendixes</a>
|
||||
<ul class=toc_appendix1>
|
||||
<li>A <a href=#appendix-A>Functions Standard Library v1</a>
|
||||
<li>B <a href=#appendix-B>Functions Standard Library v2</a>
|
||||
<li>C <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: <!-- #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 <!-- #EndTocNumber -->Disks</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-1><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->1 <!-- #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: <!-- #EndTocNumber -->Contents Compiler Disk v1</p><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-1.1><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->1.1 <!-- #EndTocNumber -->System</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-1.2><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->1.2 <!-- #EndTocNumber -->Standard Library</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->2 <!-- #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: <!-- #EndTocNumber -->Contents Compiler Disk v2</p><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->2.1 <!-- #EndTocNumber -->System</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.1><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.1 <!-- #EndTocNumber -->parser.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.2><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.2 <!-- #EndTocNumber -->compiler.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.3><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.3 <!-- #EndTocNumber -->linker.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2.2><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->2.2 <!-- #EndTocNumber -->Standard Library</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-3><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->3 <!-- #EndTocNumber -->Library System Disk</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=part-2><!-- #EndTocAnchorNameBegin --><h1 class=part><!-- #BeginTocNumber -->Part 2 <!-- #EndTocNumber -->Personal</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-4><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->4 <!-- #EndTocNumber -->Tips & Tricks</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=part-3><!-- #EndTocAnchorNameBegin --><h1 class=part><!-- #BeginTocNumber -->Part 3 <!-- #EndTocNumber -->Appendixes</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=appendix-A><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->A <!-- #EndTocNumber -->Functions Standard Library v1</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=appendix-B><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->B <!-- #EndTocNumber -->Functions Standard Library v2</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=appendix-C><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->C <!-- #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: "',
|
||||
'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: "',
|
||||
'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 <a href=#part-1>Disks</a>
|
||||
<ul class=toc_h1>
|
||||
<li>1. <a href=#h-1>Compiler Disk v1</a>
|
||||
<ul class=toc_h2>
|
||||
<li>1. <a href=#h-1.1>System</a>
|
||||
<li>2. <a href=#h-1.2>Standard Library</a>
|
||||
</ul>
|
||||
<li>2. <a href=#h-2>Compiler Disk v2</a>
|
||||
<ul class=toc_h2>
|
||||
<li>1. <a href=#h-2.1>System</a>
|
||||
<ul class=toc_h3>
|
||||
<li>1. <a href=#h-2.1.1>parser.com</a>
|
||||
<li>2. <a href=#h-2.1.2>compiler.com</a>
|
||||
<li>3. <a href=#h-2.1.3>linker.com</a>
|
||||
</ul>
|
||||
<li>2. <a href=#h-2.2>Standard Library</a>
|
||||
</ul>
|
||||
<li>3. <a href=#h-3>Library System Disk</a>
|
||||
</ul>
|
||||
<li>Part 2 <a href=#part-2>Personal</a>
|
||||
<ul class=toc_h1>
|
||||
<li>4. <a href=#h-4>Tips & Tricks</a>
|
||||
</ul>
|
||||
<li>Part 3 <a href=#part-3>Appendixes</a>
|
||||
<ul class=toc_appendix1>
|
||||
<li>A <a href=#appendix-A>Functions Standard Library v1</a>
|
||||
<li>B <a href=#appendix-B>Functions Standard Library v2</a>
|
||||
<li>C <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: <!-- #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 <!-- #EndTocNumber -->Disks</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-1><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->1 <!-- #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: <!-- #EndTocNumber -->Contents Compiler Disk v1</p><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-1.1><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->1.1 <!-- #EndTocNumber -->System</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-1.2><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->1.2 <!-- #EndTocNumber -->Standard Library</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->2 <!-- #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: <!-- #EndTocNumber -->Contents Compiler Disk v2</p><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->2.1 <!-- #EndTocNumber -->System</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.1><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.1 <!-- #EndTocNumber -->parser.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.2><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.2 <!-- #EndTocNumber -->compiler.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2.1.3><!-- #EndTocAnchorNameBegin --><h3><!-- #BeginTocNumber -->2.1.3 <!-- #EndTocNumber -->linker.com</h3><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-2.2><!-- #EndTocAnchorNameBegin --><h2><!-- #BeginTocNumber -->2.2 <!-- #EndTocNumber -->Standard Library</h2><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-3><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->3 <!-- #EndTocNumber -->Library System Disk</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=part-2><!-- #EndTocAnchorNameBegin --><h1 class=part><!-- #BeginTocNumber -->Part 2 <!-- #EndTocNumber -->Personal</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=h-4><!-- #EndTocAnchorNameBegin --><h1><!-- #BeginTocNumber -->4 <!-- #EndTocNumber -->Tips & Tricks</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=part-3><!-- #EndTocAnchorNameBegin --><h1 class=part><!-- #BeginTocNumber -->Part 3 <!-- #EndTocNumber -->Appendixes</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=appendix-A><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->A <!-- #EndTocNumber -->Functions Standard Library v1</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=appendix-B><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->B <!-- #EndTocNumber -->Functions Standard Library v2</h1><!-- #BeginTocAnchorNameEnd --></a><!-- #EndTocAnchorNameEnd -->
|
||||
<!-- #BeginTocAnchorNameBegin --><a name=appendix-C><!-- #EndTocAnchorNameBegin --><h1 class=appendix><!-- #BeginTocNumber -->C <!-- #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();
|
194
examples/includes/HTML-Toc-0.91/t/options.t
Normal file
194
examples/includes/HTML-Toc-0.91/t/options.t
Normal 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 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 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 Header</h1></a>
|
||||
EOT
|
||||
} # TestNumberingStyleUpperAlpha()
|
||||
|
||||
|
||||
# Test 'attributeToTocToken'
|
||||
TestAttributeToTocToken();
|
||||
# Test 'attributeToExcludeToken'
|
||||
TestAttributeToExcludeToken();
|
||||
# Test 'numberingStyleDecimal'
|
||||
TestNumberingStyleDecimal();
|
||||
# Test 'numberingStyleLowerAlpha'
|
||||
TestNumberingStyleLowerAlpha();
|
||||
# Test 'numberingStyleUpperAlpha'
|
||||
TestNumberingStyleUpperAlpha();
|
709
examples/includes/HTML-Toc-0.91/t/podExamples.t
Normal file
709
examples/includes/HTML-Toc-0.91/t/podExamples.t
Normal 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 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 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 Appendix</h1></a>
|
||||
<a name=appendix-A.1><h2>A.1 Appendix Paragraph</h2></a>
|
||||
<a name=appendix-B><h1>B Appendix</h1></a>
|
||||
<a name=appendix-B.1><h2>B.1 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();
|
176
examples/includes/HTML-Toc-0.91/t/propagate.t
Normal file
176
examples/includes/HTML-Toc-0.91/t/propagate.t
Normal 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 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 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>');
|
97
examples/includes/HTML-Toc-0.91/t/siteMap.t
Normal file
97
examples/includes/HTML-Toc-0.91/t/siteMap.t
Normal 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();
|
114
examples/includes/HTML-Toc-0.91/t/update.t
Normal file
114
examples/includes/HTML-Toc-0.91/t/update.t
Normal 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 <!-- #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 <!-- #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 <!-- #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 <!-- #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 <!-- #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 </tocNumber>Header</h1><tocAnchorNameEnd></a></tocAnchorNameEnd>
|
||||
EOT
|
36
examples/includes/PHP-Markdown-Extra-1.2.3/License.text
Normal file
36
examples/includes/PHP-Markdown-Extra-1.2.3/License.text
Normal 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.
|
@ -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 `<`.
|
||||
|
||||
* 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.
|
2909
examples/includes/PHP-Markdown-Extra-1.2.3/markdown.php
Normal file
2909
examples/includes/PHP-Markdown-Extra-1.2.3/markdown.php
Normal file
File diff suppressed because it is too large
Load Diff
2909
examples/includes/PHP-Markdown-Extra-1.2.3/markdown.php.orig
Normal file
2909
examples/includes/PHP-Markdown-Extra-1.2.3/markdown.php.orig
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
------ ----- ---------
|
||||
\\ \ \
|
||||
\" " "
|
||||
\' ' '
|
||||
\. . .
|
||||
\- - -
|
||||
\` ` `
|
||||
|
||||
|
||||
This is useful, for example, when you want to use straight quotes as
|
||||
foot and inch marks:
|
||||
|
||||
6\'2\" tall
|
||||
|
||||
translates into:
|
||||
|
||||
6'2" 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. `“` is turned into a simple double-quote
|
||||
(`"`), `—` 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 `"` 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
|
||||
`"` 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 (`’` or `’`) 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.
|
860
examples/includes/PHP-SmartyPants-1.5.1e/smartypants.php
Normal file
860
examples/includes/PHP-SmartyPants-1.5.1e/smartypants.php
Normal 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 “smart” 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 " 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 " 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('/"/', '"', $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 = "’";
|
||||
}
|
||||
else {
|
||||
$t = "‘";
|
||||
}
|
||||
}
|
||||
else if ($t == '"') {
|
||||
# Special case: single-character " token
|
||||
if (preg_match('/\S/', $prev_token_last_char)) {
|
||||
$t = "”";
|
||||
}
|
||||
else {
|
||||
$t = "“";
|
||||
}
|
||||
}
|
||||
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 = "’";
|
||||
}
|
||||
else {
|
||||
$t = "‘";
|
||||
}
|
||||
}
|
||||
else if ($t == '"') {
|
||||
# Special case: single-character " token
|
||||
if (preg_match('/\S/', $prev_token_last_char)) {
|
||||
$t = "”";
|
||||
}
|
||||
else {
|
||||
$t = "“";
|
||||
}
|
||||
}
|
||||
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: “Isn’t this fun?”
|
||||
#
|
||||
# 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('’', '”'), $_);
|
||||
|
||||
|
||||
# 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('“‘', '‘“'), $_);
|
||||
|
||||
# Special case for decade abbreviations (the '80s):
|
||||
$_ = preg_replace("/'(?=\\d{2}s)/", '’', $_);
|
||||
|
||||
$close_class = '[^\ \t\r\n\[\{\(\-]';
|
||||
$dec_dashes = '&\#8211;|&\#8212;';
|
||||
|
||||
# Get most opening single quotes:
|
||||
$_ = preg_replace("{
|
||||
(
|
||||
\\s | # a whitespace char, or
|
||||
| # 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‘', $_);
|
||||
# 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’', $_);
|
||||
|
||||
# Any remaining single quotes should be opening ones:
|
||||
$_ = str_replace("'", '‘', $_);
|
||||
|
||||
|
||||
# Get most opening double quotes:
|
||||
$_ = preg_replace("{
|
||||
(
|
||||
\\s | # a whitespace char, or
|
||||
| # 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“', $_);
|
||||
|
||||
# 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”', $_);
|
||||
|
||||
# Any remaining quotes should be opening ones.
|
||||
$_ = str_replace('"', '“', $_);
|
||||
|
||||
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: “Isn't this fun?”
|
||||
#
|
||||
|
||||
$_ = str_replace(array("``", "''",),
|
||||
array('“', '”'), $_);
|
||||
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: ‘Isn’t this fun?’
|
||||
#
|
||||
|
||||
$_ = str_replace(array("`", "'",),
|
||||
array('‘', '’'), $_);
|
||||
return $_;
|
||||
}
|
||||
|
||||
|
||||
function EducateDashes($_) {
|
||||
#
|
||||
# Parameter: String.
|
||||
#
|
||||
# Returns: The string, with each instance of "--" translated to
|
||||
# an em-dash HTML entity.
|
||||
#
|
||||
|
||||
$_ = str_replace('--', '—', $_);
|
||||
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('—', '–'), $_);
|
||||
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('–', '—'), $_);
|
||||
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…?
|
||||
#
|
||||
|
||||
$_ = str_replace(array("...", ". . .",), '…', $_);
|
||||
return $_;
|
||||
}
|
||||
|
||||
|
||||
function StupefyEntities($_) {
|
||||
#
|
||||
# Parameter: String.
|
||||
# Returns: The string, with each SmartyPants HTML entity translated to
|
||||
# its ASCII counterpart.
|
||||
#
|
||||
# Example input: “Hello — world.”
|
||||
# Example output: "Hello -- world."
|
||||
#
|
||||
|
||||
# en-dash em-dash
|
||||
$_ = str_replace(array('–', '—'),
|
||||
array('-', '--'), $_);
|
||||
|
||||
# single quote open close
|
||||
$_ = str_replace(array('‘', '’'), "'", $_);
|
||||
|
||||
# double quote open close
|
||||
$_ = str_replace(array('“', '”'), '"', $_);
|
||||
|
||||
$_ = str_replace('…', '...', $_); # 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
|
||||
# ------ -----
|
||||
# \\ \
|
||||
# \" "
|
||||
# \' '
|
||||
# \. .
|
||||
# \- -
|
||||
# \` `
|
||||
#
|
||||
$_ = str_replace(
|
||||
array('\\\\', '\"', "\'", '\.', '\-', '\`'),
|
||||
array('\', '"', ''', '.', '-', '`'), $_);
|
||||
|
||||
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
|
||||
------ ----- ---------
|
||||
\\ \ \
|
||||
\" " "
|
||||
\' ' '
|
||||
\. . .
|
||||
\- - -
|
||||
\` ` `
|
||||
|
||||
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 (`’`) 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.
|
||||
|
||||
*/
|
||||
?>
|
124
examples/includes/geshi/contrib/aliased.php
Normal file
124
examples/includes/geshi/contrib/aliased.php
Normal 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>
|
456
examples/includes/geshi/contrib/cssgen.php
Normal file
456
examples/includes/geshi/contrib/cssgen.php
Normal 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> © 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 "submit" 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\" /> $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();
|
||||
}
|
||||
|
||||
?>
|
59
examples/includes/geshi/contrib/cssgen2.php
Normal file
59
examples/includes/geshi/contrib/cssgen2.php
Normal 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);
|
||||
}
|
217
examples/includes/geshi/contrib/example.php
Normal file
217
examples/includes/geshi/contrib/example.php
Normal 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
|
||||
// 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  
|
||||
// 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 © 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 © 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>
|
666
examples/includes/geshi/contrib/langcheck.php
Normal file
666
examples/includes/geshi/contrib/langcheck.php
Normal 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 (&) 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 '<PIPE>' 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 '<PIPE>' 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 © 2004-2007 Nigel McNie, 2007-2008 Benny Baumann, released under the GNU GPL</div>
|
||||
</body>
|
||||
</html>
|
29
examples/includes/geshi/docs/BUGS
Normal file
29
examples/includes/geshi/docs/BUGS
Normal 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)
|
682
examples/includes/geshi/docs/CHANGES
Normal file
682
examples/includes/geshi/docs/CHANGES
Normal 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 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
|
340
examples/includes/geshi/docs/COPYING
Normal file
340
examples/includes/geshi/docs/COPYING
Normal 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.
|
33
examples/includes/geshi/docs/README
Normal file
33
examples/includes/geshi/docs/README
Normal 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 :)
|
163
examples/includes/geshi/docs/THANKS
Normal file
163
examples/includes/geshi/docs/THANKS
Normal 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!
|
71
examples/includes/geshi/docs/TODO
Normal file
71
examples/includes/geshi/docs/TODO
Normal 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
13
examples/includes/geshi/docs/api/blank.html
Normal file
13
examples/includes/geshi/docs/api/blank.html
Normal 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>
|
24
examples/includes/geshi/docs/api/classtrees_geshi.html
Normal file
24
examples/includes/geshi/docs/api/classtrees_geshi.html
Normal 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>
|
867
examples/includes/geshi/docs/api/elementindex.html
Normal file
867
examples/includes/geshi/docs/api/elementindex.html
Normal 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 "div" 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 "pre" 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 "table" 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->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->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>
|
864
examples/includes/geshi/docs/api/elementindex_geshi.html
Normal file
864
examples/includes/geshi/docs/api/elementindex_geshi.html
Normal 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 "div" 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 "pre" 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 "table" 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->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->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>
|
20
examples/includes/geshi/docs/api/errors.html
Normal file
20
examples/includes/geshi/docs/api/errors.html
Normal 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>
|
2676
examples/includes/geshi/docs/api/geshi/core/GeSHi.html
Normal file
2676
examples/includes/geshi/docs/api/geshi/core/GeSHi.html
Normal file
File diff suppressed because it is too large
Load Diff
478
examples/includes/geshi/docs/api/geshi/core/_geshi.php.html
Normal file
478
examples/includes/geshi/docs/api/geshi/core/_geshi.php.html
Normal 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 <<a href="mailto:nigel@geshi.org">nigel@geshi.org</a>>, Benny Baumann <BenBE@omorphia.de></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> = '<END GeSHi>'
|
||||
(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 "div" 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 "pre" 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 "table" to surround the source:</p>
|
||||
<p class="description"><p><table> <thead><tr><td colspan="2">$header</td></tr></thead> <tbody><tr><td><pre>$linenumbers</pre></td><td><pre>$code></pre></td></tr></tbody> <tfooter><tr><td colspan="2">$footer</td></tr></tfoot> </table></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> = '<BEGIN GeSHi>'
|
||||
(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> <span class="var-name">$string</span>, <span class="var-type">string</span> <span class="var-name">$language</span>, [<span class="var-type">string</span> <span class="var-name">$path</span> = <span class="var-default">null</span>], [<span class="var-type">boolean</span> <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>
|
24
examples/includes/geshi/docs/api/index.html
Normal file
24
examples/includes/geshi/docs/api/index.html
Normal 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>
|
46
examples/includes/geshi/docs/api/li_geshi.html
Normal file
46
examples/includes/geshi/docs/api/li_geshi.html
Normal 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>
|
33
examples/includes/geshi/docs/api/media/banner.css
Normal file
33
examples/includes/geshi/docs/api/media/banner.css
Normal 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;
|
||||
}
|
BIN
examples/includes/geshi/docs/api/media/images/AbstractClass.png
Normal file
BIN
examples/includes/geshi/docs/api/media/images/AbstractClass.png
Normal file
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
Loading…
Reference in New Issue
Block a user