Compare commits
2 Commits
mcw2
...
sandbox/jk
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4e132e2e45 | ||
|
|
3392c96aea |
16
.gitignore
vendored
16
.gitignore
vendored
@@ -1,12 +1,8 @@
|
||||
*.a
|
||||
*.asm.s
|
||||
*.d
|
||||
*.gcno
|
||||
*.gcda
|
||||
*.o
|
||||
*~
|
||||
/*.ivf
|
||||
/*.ivf.md5
|
||||
/*-*.mk
|
||||
/*.asm
|
||||
/*.doxy
|
||||
@@ -16,7 +12,7 @@
|
||||
/.install-*
|
||||
/.libs
|
||||
/Makefile
|
||||
/config.log
|
||||
/config.err
|
||||
/config.mk
|
||||
/decode_to_md5
|
||||
/decode_to_md5.c
|
||||
@@ -36,8 +32,6 @@
|
||||
/ivfdec.dox
|
||||
/ivfenc
|
||||
/ivfenc.dox
|
||||
/libvpx.so*
|
||||
/libvpx.ver
|
||||
/obj_int_extract
|
||||
/postproc
|
||||
/postproc.c
|
||||
@@ -49,7 +43,6 @@
|
||||
/simple_encoder
|
||||
/simple_encoder.c
|
||||
/simple_encoder.dox
|
||||
/test_libvpx
|
||||
/twopass_encoder
|
||||
/twopass_encoder.c
|
||||
/twopass_encoder.dox
|
||||
@@ -62,14 +55,7 @@
|
||||
/vp8cx_set_ref
|
||||
/vp8cx_set_ref.c
|
||||
/vp8cx_set_ref.dox
|
||||
/vpx.pc
|
||||
/vpx_config.c
|
||||
/vpx_config.h
|
||||
/vpx_rtcd.h
|
||||
/vpx_version.h
|
||||
/vpxdec
|
||||
/vpxenc
|
||||
TAGS
|
||||
.cproject
|
||||
.project
|
||||
.settings
|
||||
|
||||
13
.mailmap
13
.mailmap
@@ -1,18 +1,5 @@
|
||||
Adrian Grange <agrange@google.com>
|
||||
Alexis Ballier <aballier@gentoo.org> <alexis.ballier@gmail.com>
|
||||
Hangyu Kuang <hkuang@google.com>
|
||||
Jim Bankoski <jimbankoski@google.com>
|
||||
John Koleszar <jkoleszar@google.com>
|
||||
Johann Koenig <johannkoenig@google.com>
|
||||
Johann Koenig <johannkoenig@google.com> <johann.koenig@duck.com>
|
||||
Johann Koenig <johannkoenig@google.com> <johannkoenig@dhcp-172-19-7-52.mtv.corp.google.com>
|
||||
Pascal Massimino <pascal.massimino@gmail.com>
|
||||
Sami Pietilä <samipietila@google.com>
|
||||
Tero Rintaluoma <teror@google.com> <tero.rintaluoma@on2.com>
|
||||
Timothy B. Terriberry <tterribe@xiph.org> Tim Terriberry <tterriberry@mozilla.com>
|
||||
Tom Finegan <tomfinegan@google.com>
|
||||
Ralph Giles <giles@xiph.org> <giles@entropywave.com>
|
||||
Ralph Giles <giles@xiph.org> <giles@mozilla.com>
|
||||
Alpha Lam <hclam@google.com> <hclam@chromium.org>
|
||||
Deb Mukherjee <debargha@google.com>
|
||||
Yaowu Xu <yaowu@google.com> <yaowu@xuyaowu.com>
|
||||
|
||||
43
AUTHORS
43
AUTHORS
@@ -2,97 +2,54 @@
|
||||
# by tools/gen_authors.sh.
|
||||
|
||||
Aaron Watry <awatry@gmail.com>
|
||||
Abo Talib Mahfoodh <ab.mahfoodh@gmail.com>
|
||||
Adrian Grange <agrange@google.com>
|
||||
Ahmad Sharif <asharif@google.com>
|
||||
Alexander Voronov <avoronov@graphics.cs.msu.ru>
|
||||
Alex Converse <alex.converse@gmail.com>
|
||||
Alexis Ballier <aballier@gentoo.org>
|
||||
Alok Ahuja <waveletcoeff@gmail.com>
|
||||
Alpha Lam <hclam@google.com>
|
||||
A.Mahfoodh <ab.mahfoodh@gmail.com>
|
||||
Ami Fischman <fischman@chromium.org>
|
||||
Andoni Morales Alastruey <ylatuya@gmail.com>
|
||||
Andres Mejia <mcitadel@gmail.com>
|
||||
Aron Rosenberg <arosenberg@logitech.com>
|
||||
Attila Nagy <attilanagy@google.com>
|
||||
changjun.yang <changjun.yang@intel.com>
|
||||
chm <chm@rock-chips.com>
|
||||
Christian Duvivier <cduvivier@google.com>
|
||||
Daniel Kang <ddkang@google.com>
|
||||
Deb Mukherjee <debargha@google.com>
|
||||
Dmitry Kovalev <dkovalev@google.com>
|
||||
Dragan Mrdjan <dmrdjan@mips.com>
|
||||
Erik Niemeyer <erik.a.niemeyer@gmail.com>
|
||||
Fabio Pedretti <fabio.ped@libero.it>
|
||||
Frank Galligan <fgalligan@google.com>
|
||||
Fredrik Söderquist <fs@opera.com>
|
||||
Fritz Koenig <frkoenig@google.com>
|
||||
Gaute Strokkenes <gaute.strokkenes@broadcom.com>
|
||||
Giuseppe Scrivano <gscrivano@gnu.org>
|
||||
Guillaume Martres <gmartres@google.com>
|
||||
Guillermo Ballester Valor <gbvalor@gmail.com>
|
||||
Hangyu Kuang <hkuang@google.com>
|
||||
Henrik Lundin <hlundin@google.com>
|
||||
Hui Su <huisu@google.com>
|
||||
Ivan Maltz <ivanmaltz@google.com>
|
||||
James Berry <jamesberry@google.com>
|
||||
James Zern <jzern@google.com>
|
||||
Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
Janne Salonen <jsalonen@google.com>
|
||||
Jeff Faust <jfaust@google.com>
|
||||
Jeff Muizelaar <jmuizelaar@mozilla.com>
|
||||
Jeff Petkau <jpet@chromium.org>
|
||||
Jim Bankoski <jimbankoski@google.com>
|
||||
Jingning Han <jingning@google.com>
|
||||
Johann Koenig <johannkoenig@google.com>
|
||||
John Koleszar <jkoleszar@google.com>
|
||||
Joshua Bleecher Snyder <josh@treelinelabs.com>
|
||||
Joshua Litt <joshualitt@google.com>
|
||||
Justin Clift <justin@salasaga.org>
|
||||
Justin Lebar <justin.lebar@gmail.com>
|
||||
KO Myung-Hun <komh@chollian.net>
|
||||
Lou Quillio <louquillio@google.com>
|
||||
Luca Barbato <lu_zero@gentoo.org>
|
||||
Makoto Kato <makoto.kt@gmail.com>
|
||||
Mans Rullgard <mans@mansr.com>
|
||||
Marco Paniconi <marpan@google.com>
|
||||
Mark Mentovai <mark@chromium.org>
|
||||
Martin Ettl <ettl.martin78@googlemail.com>
|
||||
Martin Storsjo <martin@martin.st>
|
||||
Matthew Heaney <matthewjheaney@chromium.org>
|
||||
Michael Kohler <michaelkohler@live.com>
|
||||
Mike Frysinger <vapier@chromium.org>
|
||||
Mike Hommey <mhommey@mozilla.com>
|
||||
Mikhal Shemer <mikhal@google.com>
|
||||
Morton Jonuschat <yabawock@gmail.com>
|
||||
Parag Salasakar <img.mips1@gmail.com>
|
||||
Pascal Massimino <pascal.massimino@gmail.com>
|
||||
Patrik Westin <patrik.westin@gmail.com>
|
||||
Paul Wilkins <paulwilkins@google.com>
|
||||
Pavol Rusnak <stick@gk2.sk>
|
||||
Paweł Hajdan <phajdan@google.com>
|
||||
Philip Jägenstedt <philipj@opera.com>
|
||||
Priit Laes <plaes@plaes.org>
|
||||
Rafael Ávila de Espíndola <rafael.espindola@gmail.com>
|
||||
Rafaël Carré <funman@videolan.org>
|
||||
Ralph Giles <giles@xiph.org>
|
||||
Rob Bradford <rob@linux.intel.com>
|
||||
Ronald S. Bultje <rbultje@google.com>
|
||||
Sami Pietilä <samipietila@google.com>
|
||||
Scott Graham <scottmg@chromium.org>
|
||||
Scott LaVarnway <slavarnway@google.com>
|
||||
Shimon Doodkin <helpmepro1@gmail.com>
|
||||
Stefan Holmer <holmer@google.com>
|
||||
Suman Sunkara <sunkaras@google.com>
|
||||
Taekhyun Kim <takim@nvidia.com>
|
||||
Takanori MATSUURA <t.matsuu@gmail.com>
|
||||
Tamar Levy <tamar.levy@intel.com>
|
||||
Tero Rintaluoma <teror@google.com>
|
||||
Thijs Vermeir <thijsvermeir@gmail.com>
|
||||
Timothy B. Terriberry <tterribe@xiph.org>
|
||||
Tom Finegan <tomfinegan@google.com>
|
||||
Vignesh Venkatasubramanian <vigneshv@google.com>
|
||||
Yaowu Xu <yaowu@google.com>
|
||||
Yunqing Wang <yunqingwang@google.com>
|
||||
Google Inc.
|
||||
|
||||
219
CHANGELOG
219
CHANGELOG
@@ -1,222 +1,3 @@
|
||||
2013-11-15 v1.3.0 "Forest"
|
||||
This release introduces the VP9 codec in a backward-compatible way.
|
||||
All existing users of VP8 can continue to use the library without
|
||||
modification. However, some VP8 options do not map to VP9 in the same manner.
|
||||
|
||||
The VP9 encoder in this release is not feature complete. Users interested in
|
||||
the encoder are advised to use the git master branch and discuss issues on
|
||||
libvpx mailing lists.
|
||||
|
||||
- Upgrading:
|
||||
This release is ABI and API compatible with Duclair (v1.0.0). Users
|
||||
of older releases should refer to the Upgrading notes in this document
|
||||
for that release.
|
||||
|
||||
- Enhancements:
|
||||
Get rid of bashisms in the main build scripts
|
||||
Added usage info on command line options
|
||||
Add lossless compression mode
|
||||
Dll build of libvpx
|
||||
Add additional Mac OS X targets: 10.7, 10.8 and 10.9 (darwin11-13)
|
||||
Add option to disable documentation
|
||||
configure: add --enable-external-build support
|
||||
make: support V=1 as short form of verbose=yes
|
||||
configure: support mingw-w64
|
||||
configure: support hardfloat armv7 CHOSTS
|
||||
configure: add support for android x86
|
||||
Add estimated completion time to vpxenc
|
||||
Don't exit on decode errors in vpxenc
|
||||
vpxenc: support scaling prior to encoding
|
||||
vpxdec: support scaling output
|
||||
vpxenc: improve progress indicators with --skip
|
||||
msvs: Don't link to winmm.lib
|
||||
Add a new script for producing vcxproj files
|
||||
Produce Visual Studio 10 and 11 project files
|
||||
Produce Windows Phone project files
|
||||
msvs-build: use msbuild for vs >= 2005
|
||||
configure: default configure log to config.log
|
||||
Add encoding option --static-thresh
|
||||
|
||||
- Speed:
|
||||
Miscellaneous speed optimizations for VP8 and VP9.
|
||||
|
||||
- Quality:
|
||||
In general, quality is consistent with the Eider release.
|
||||
|
||||
- Bug Fixes:
|
||||
This release represents approximately a year of engineering effort,
|
||||
and contains multiple bug fixes. Please refer to git history for details.
|
||||
|
||||
|
||||
2012-12-21 v1.2.0
|
||||
This release acts as a checkpoint for a large amount of internal refactoring
|
||||
and testing. It also contains a number of small bugfixes, so all users are
|
||||
encouraged to upgrade.
|
||||
|
||||
- Upgrading:
|
||||
This release is ABI and API compatible with Duclair (v1.0.0). Users
|
||||
of older releases should refer to the Upgrading notes in this
|
||||
document for that release.
|
||||
|
||||
- Enhancements:
|
||||
VP8 optimizations for MIPS dspr2
|
||||
vpxenc: add -quiet option
|
||||
|
||||
- Speed:
|
||||
Encoder and decoder speed is consistent with the Eider release.
|
||||
|
||||
- Quality:
|
||||
In general, quality is consistent with the Eider release.
|
||||
|
||||
Minor tweaks to ARNR filtering
|
||||
Minor improvements to real time encoding with multiple temporal layers
|
||||
|
||||
- Bug Fixes:
|
||||
Fixes multithreaded encoder race condition in loopfilter
|
||||
Fixes multi-resolution threaded encoding
|
||||
Fix potential encoder dead-lock after picture resize
|
||||
|
||||
|
||||
2012-05-09 v1.1.0 "Eider"
|
||||
This introduces a number of enhancements, mostly focused on real-time
|
||||
encoding. In addition, it fixes a decoder bug (first introduced in
|
||||
Duclair) so all users of that release are encouraged to upgrade.
|
||||
|
||||
- Upgrading:
|
||||
This release is ABI and API compatible with Duclair (v1.0.0). Users
|
||||
of older releases should refer to the Upgrading notes in this
|
||||
document for that release.
|
||||
|
||||
This release introduces a new temporal denoiser, controlled by the
|
||||
VP8E_SET_NOISE_SENSITIVITY control. The temporal denoiser does not
|
||||
currently take a strength parameter, so the control is effectively
|
||||
a boolean - zero (off) or non-zero (on). For compatibility with
|
||||
existing applications, the values accepted are the same as those
|
||||
for the spatial denoiser (0-6). The temporal denoiser is enabled
|
||||
by default, and the older spatial denoiser may be restored by
|
||||
configuring with --disable-temporal-denoising. The temporal denoiser
|
||||
is more computationally intensive than the spatial one.
|
||||
|
||||
This release removes support for a legacy, decode only API that was
|
||||
supported, but deprecated, at the initial release of libvpx
|
||||
(v0.9.0). This is not expected to have any impact. If you are
|
||||
impacted, you can apply a reversion to commit 2bf8fb58 locally.
|
||||
Please update to the latest libvpx API if you are affected.
|
||||
|
||||
- Enhancements:
|
||||
Adds a motion compensated temporal denoiser to the encoder, which
|
||||
gives higher quality than the older spatial denoiser. (See above
|
||||
for notes on upgrading).
|
||||
|
||||
In addition, support for new compilers and platforms were added,
|
||||
including:
|
||||
improved support for XCode
|
||||
Android x86 NDK build
|
||||
OS/2 support
|
||||
SunCC support
|
||||
|
||||
Changing resolution with vpx_codec_enc_config_set() is now
|
||||
supported. Previously, reinitializing the codec was required to
|
||||
change the input resolution.
|
||||
|
||||
The vpxenc application has initial support for producing multiple
|
||||
encodes from the same input in one call. Resizing is not yet
|
||||
supported, but varying other codec parameters is. Use -- to
|
||||
delineate output streams. Options persist from one stream to the
|
||||
next.
|
||||
|
||||
Also, the vpxenc application will now use a keyframe interval of
|
||||
5 seconds by default. Use the --kf-max-dist option to override.
|
||||
|
||||
- Speed:
|
||||
Decoder performance improved 2.5% versus Duclair. Encoder speed is
|
||||
consistent with Duclair for most material. Two pass encoding of
|
||||
slideshow-like material will see significant improvements.
|
||||
|
||||
Large realtime encoding speed gains at a small quality expense are
|
||||
possible by configuring the on-the-fly bitpacking experiment with
|
||||
--enable-onthefly-bitpacking. Realtime encoder can be up to 13%
|
||||
faster (ARM) depending on the number of threads and bitrate
|
||||
settings. This technique sees constant gain over the 5-16 speed
|
||||
range. For VC style input the loss seen is up to 0.2dB. See commit
|
||||
52cf4dca for further details.
|
||||
|
||||
- Quality:
|
||||
On the whole, quality is consistent with the Duclair release. Some
|
||||
tweaks:
|
||||
|
||||
Reduced blockiness in easy sections by applying a penalty to
|
||||
intra modes.
|
||||
|
||||
Improved quality of static sections (like slideshows) with
|
||||
two pass encoding.
|
||||
|
||||
Improved keyframe sizing with multiple temporal layers
|
||||
|
||||
- Bug Fixes:
|
||||
Corrected alt-ref contribution to frame rate for visible updates
|
||||
to the alt-ref buffer. This affected applications making manual
|
||||
usage of the frame reference flags, or temporal layers.
|
||||
|
||||
Additional constraints were added to disable multi-frame quality
|
||||
enhancement (MFQE) in sections of the frame where there is motion.
|
||||
(#392)
|
||||
|
||||
Fixed corruption issues when vpx_codec_enc_config_set() was called
|
||||
with spatial resampling enabled.
|
||||
|
||||
Fixed a decoder error introduced in Duclair where the segmentation
|
||||
map was not being reinitialized on keyframes (#378)
|
||||
|
||||
|
||||
2012-01-27 v1.0.0 "Duclair"
|
||||
Our fourth named release, focused on performance and features related to
|
||||
real-time encoding. It also fixes a decoder crash bug introduced in
|
||||
v0.9.7, so all users of that release are encouraged to upgrade.
|
||||
|
||||
- Upgrading:
|
||||
This release is ABI incompatible with prior releases of libvpx, so the
|
||||
"major" version number has been bumped to 1. You must recompile your
|
||||
applications against the latest version of the libvpx headers. The
|
||||
API remains compatible, and this should not require code changes in most
|
||||
applications.
|
||||
|
||||
- Enhancements:
|
||||
This release introduces several substantial new features to the encoder,
|
||||
of particular interest to real time streaming applications.
|
||||
|
||||
Temporal scalability allows the encoder to produce a stream that can
|
||||
be decimated to different frame rates, with independent rate targetting
|
||||
for each substream.
|
||||
|
||||
Multiframe quality enhancement postprocessing can make visual quality
|
||||
more consistent in the presence of frames that are substantially
|
||||
different quality than the surrounding frames, as in the temporal
|
||||
scalability case and in some forced keyframe scenarios.
|
||||
|
||||
Multiple-resolution encoding support allows the encoding of the
|
||||
same content at different resolutions faster than encoding them
|
||||
separately.
|
||||
|
||||
- Speed:
|
||||
Optimization targets for this release included the decoder and the real-
|
||||
time modes of the encoder. Decoder speed on x86 has improved 10.5% with
|
||||
this release. Encoder improvements followed a curve where speeds 1-3
|
||||
improved 4.0%-1.5%, speeds 4-8 improved <1%, and speeds 9-16 improved
|
||||
1.5% to 10.5%, respectively. "Best" mode speed is consistent with the
|
||||
Cayuga release.
|
||||
|
||||
- Quality:
|
||||
Encoder quality in the single stream case is consistent with the Cayuga
|
||||
release.
|
||||
|
||||
- Bug Fixes:
|
||||
This release fixes an OOB read decoder crash bug present in v0.9.7
|
||||
related to the clamping of motion vectors in SPLITMV blocks. This
|
||||
behavior could be triggered by corrupt input or by starting
|
||||
decoding from a P-frame.
|
||||
|
||||
|
||||
2011-08-15 v0.9.7-p1 "Cayuga" patch 1
|
||||
This is an incremental bugfix release against Cayuga. All users of that
|
||||
release are strongly encouraged to upgrade.
|
||||
|
||||
57
README
57
README
@@ -1,7 +1,7 @@
|
||||
vpx Multi-Format Codec SDK
|
||||
README - 1 August 2013
|
||||
README - 19 May 2010
|
||||
|
||||
Welcome to the WebM VP8/VP9 Codec SDK!
|
||||
Welcome to the WebM VP8 Codec SDK!
|
||||
|
||||
COMPILING THE APPLICATIONS/LIBRARIES:
|
||||
The build system used is similar to autotools. Building generally consists of
|
||||
@@ -15,19 +15,11 @@ COMPILING THE APPLICATIONS/LIBRARIES:
|
||||
* 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.
|
||||
* Downloading the data for the unit tests requires curl[5] and sha1sum.
|
||||
sha1sum is provided via the GNU coreutils, installed by default on
|
||||
many *nix platforms, as well as MinGW and Cygwin. If coreutils is not
|
||||
available, a compatible version of sha1sum can be built from
|
||||
source[6]. These requirements are optional if not running the unit
|
||||
tests.
|
||||
|
||||
[1]: http://www.tortall.net/projects/yasm
|
||||
[2]: http://www.cygwin.com
|
||||
[3]: http://php.net
|
||||
[4]: http://www.doxygen.org
|
||||
[5]: http://curl.haxx.se
|
||||
[6]: http://www.microbrew.org/tools/md5sha1sum/
|
||||
|
||||
2. Out-of-tree builds
|
||||
Out of tree builds are a supported method of building the application. For
|
||||
@@ -50,69 +42,40 @@ COMPILING THE APPLICATIONS/LIBRARIES:
|
||||
--help output of the configure script. As of this writing, the list of
|
||||
available targets is:
|
||||
|
||||
armv5te-android-gcc
|
||||
armv5te-linux-rvct
|
||||
armv5te-linux-gcc
|
||||
armv5te-none-rvct
|
||||
armv5te-symbian-gcc
|
||||
armv6-darwin-gcc
|
||||
armv6-linux-rvct
|
||||
armv6-linux-gcc
|
||||
armv6-none-rvct
|
||||
armv7-android-gcc
|
||||
armv7-darwin-gcc
|
||||
armv6-symbian-gcc
|
||||
iwmmxt-linux-rvct
|
||||
iwmmxt-linux-gcc
|
||||
iwmmxt2-linux-rvct
|
||||
iwmmxt2-linux-gcc
|
||||
armv7-linux-rvct
|
||||
armv7-linux-gcc
|
||||
armv7-none-rvct
|
||||
armv7-win32-vs11
|
||||
armv7-win32-vs12
|
||||
mips32-linux-gcc
|
||||
ppc32-darwin8-gcc
|
||||
ppc32-darwin9-gcc
|
||||
ppc32-linux-gcc
|
||||
ppc64-darwin8-gcc
|
||||
ppc64-darwin9-gcc
|
||||
ppc64-linux-gcc
|
||||
sparc-solaris-gcc
|
||||
x86-android-gcc
|
||||
x86-darwin8-gcc
|
||||
x86-darwin8-icc
|
||||
x86-darwin9-gcc
|
||||
x86-darwin9-icc
|
||||
x86-darwin10-gcc
|
||||
x86-darwin11-gcc
|
||||
x86-darwin12-gcc
|
||||
x86-darwin13-gcc
|
||||
x86-linux-gcc
|
||||
x86-linux-icc
|
||||
x86-os2-gcc
|
||||
x86-solaris-gcc
|
||||
x86-win32-gcc
|
||||
x86-win32-vs7
|
||||
x86-win32-vs8
|
||||
x86-win32-vs9
|
||||
x86-win32-vs10
|
||||
x86-win32-vs11
|
||||
x86-win32-vs12
|
||||
x86_64-darwin9-gcc
|
||||
x86_64-darwin10-gcc
|
||||
x86_64-darwin11-gcc
|
||||
x86_64-darwin12-gcc
|
||||
x86_64-darwin13-gcc
|
||||
x86_64-linux-gcc
|
||||
x86_64-linux-icc
|
||||
x86_64-solaris-gcc
|
||||
x86_64-win64-gcc
|
||||
x86_64-win64-vs8
|
||||
x86_64-win64-vs9
|
||||
x86_64-win64-vs10
|
||||
x86_64-win64-vs11
|
||||
x86_64-win64-vs12
|
||||
universal-darwin8-gcc
|
||||
universal-darwin9-gcc
|
||||
universal-darwin10-gcc
|
||||
universal-darwin11-gcc
|
||||
universal-darwin12-gcc
|
||||
universal-darwin13-gcc
|
||||
generic-gnu
|
||||
|
||||
The generic-gnu target, in conjunction with the CROSS environment variable,
|
||||
@@ -130,10 +93,10 @@ COMPILING THE APPLICATIONS/LIBRARIES:
|
||||
|
||||
5. Configuration errors
|
||||
If the configuration step fails, the first step is to look in the error log.
|
||||
This defaults to config.log. This should give a good indication of what went
|
||||
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-discuss@webmproject.org for help.
|
||||
please email webm-users@webmproject.org for help.
|
||||
|
||||
|
||||
371
args.c
371
args.c
@@ -25,214 +25,241 @@ extern void die(const char *fmt, ...);
|
||||
#endif
|
||||
|
||||
|
||||
struct arg arg_init(char **argv) {
|
||||
struct arg a;
|
||||
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;
|
||||
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;
|
||||
int arg_match(struct arg *arg_, const struct arg_def *def, char **argv)
|
||||
{
|
||||
struct arg arg;
|
||||
|
||||
if (!argv[0] || argv[0][0] != '-')
|
||||
return 0;
|
||||
if (!argv[0] || argv[0][0] != '-')
|
||||
return 0;
|
||||
|
||||
arg = arg_init(argv);
|
||||
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)) {
|
||||
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) {
|
||||
const size_t 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;
|
||||
arg.name = arg.argv[0] + 1;
|
||||
arg.val = def->has_val ? arg.argv[1] : NULL;
|
||||
arg.argv_step = def->has_val ? 2 : 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) {
|
||||
char *comma = def->has_val ? "," : ", ";
|
||||
|
||||
snprintf(option_text, 37, "-%s%s%s --%s%6s",
|
||||
def->short_name, short_val, comma,
|
||||
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);
|
||||
{
|
||||
int name_len = strlen(def->long_name);
|
||||
|
||||
fprintf(fp, " %-37s\t%s\n", option_text, def->desc);
|
||||
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'))
|
||||
{
|
||||
|
||||
if (def->enums) {
|
||||
const struct arg_enum_list *listptr;
|
||||
|
||||
fprintf(fp, " %-37s\t ", "");
|
||||
|
||||
for (listptr = def->enums; listptr->name; listptr++)
|
||||
fprintf(fp, "%s%s", listptr->name,
|
||||
listptr[1].name ? ", " : "\n");
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
unsigned int arg_parse_uint(const struct arg *arg) {
|
||||
long int rawval;
|
||||
char *endptr;
|
||||
const char *arg_next(struct arg *arg)
|
||||
{
|
||||
if (arg->argv[0])
|
||||
arg->argv += arg->argv_step;
|
||||
|
||||
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;
|
||||
return *arg->argv;
|
||||
}
|
||||
|
||||
|
||||
int arg_parse_int(const struct arg *arg) {
|
||||
long int rawval;
|
||||
char *endptr;
|
||||
char **argv_dup(int argc, const char **argv)
|
||||
{
|
||||
char **new_argv = malloc((argc + 1) * sizeof(*argv));
|
||||
|
||||
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;
|
||||
memcpy(new_argv, argv, argc * sizeof(*argv));
|
||||
new_argv[argc] = NULL;
|
||||
return new_argv;
|
||||
}
|
||||
|
||||
|
||||
struct vpx_rational {
|
||||
int num; /**< fraction numerator */
|
||||
int den; /**< fraction denominator */
|
||||
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)
|
||||
{
|
||||
char *comma = def->has_val ? "," : ", ";
|
||||
|
||||
snprintf(option_text, 37, "-%s%s%s --%s%6s",
|
||||
def->short_name, short_val, comma,
|
||||
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);
|
||||
|
||||
if(def->enums)
|
||||
{
|
||||
const struct arg_enum_list *listptr;
|
||||
|
||||
fprintf(fp, " %-37s\t ", "");
|
||||
|
||||
for(listptr = def->enums; listptr->name; listptr++)
|
||||
fprintf(fp, "%s%s", listptr->name,
|
||||
listptr[1].name ? ", " : "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
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);
|
||||
/* 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);
|
||||
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);
|
||||
/* 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);
|
||||
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;
|
||||
return rat;
|
||||
}
|
||||
|
||||
|
||||
int arg_parse_enum(const struct arg *arg) {
|
||||
const struct arg_enum_list *listptr;
|
||||
long int rawval;
|
||||
char *endptr;
|
||||
int arg_parse_enum(const struct arg *arg)
|
||||
{
|
||||
const struct arg_enum_list *listptr;
|
||||
long int rawval;
|
||||
char *endptr;
|
||||
|
||||
/* First see if the value can be parsed as a raw value */
|
||||
rawval = strtol(arg->val, &endptr, 10);
|
||||
if (arg->val[0] != '\0' && endptr[0] == '\0') {
|
||||
/* Got a raw value, make sure it's valid */
|
||||
for (listptr = arg->def->enums; listptr->name; listptr++)
|
||||
if (listptr->val == rawval)
|
||||
return rawval;
|
||||
}
|
||||
/* First see if the value can be parsed as a raw value */
|
||||
rawval = strtol(arg->val, &endptr, 10);
|
||||
if (arg->val[0] != '\0' && endptr[0] == '\0')
|
||||
{
|
||||
/* Got a raw value, make sure it's valid */
|
||||
for(listptr = arg->def->enums; listptr->name; listptr++)
|
||||
if(listptr->val == rawval)
|
||||
return rawval;
|
||||
}
|
||||
|
||||
/* Next see if it can be parsed as a string */
|
||||
for (listptr = arg->def->enums; listptr->name; listptr++)
|
||||
if (!strcmp(arg->val, listptr->name))
|
||||
return listptr->val;
|
||||
/* Next see if it can be parsed as a string */
|
||||
for(listptr = arg->def->enums; listptr->name; listptr++)
|
||||
if(!strcmp(arg->val, listptr->name))
|
||||
return listptr->val;
|
||||
|
||||
die("Option %s: Invalid value '%s'\n", arg->name, arg->val);
|
||||
return 0;
|
||||
die("Option %s: Invalid value '%s'\n", arg->name, arg->val);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int arg_parse_enum_or_int(const struct arg *arg) {
|
||||
if (arg->def->enums)
|
||||
return arg_parse_enum(arg);
|
||||
return arg_parse_int(arg);
|
||||
int arg_parse_enum_or_int(const struct arg *arg)
|
||||
{
|
||||
if(arg->def->enums)
|
||||
return arg_parse_enum(arg);
|
||||
return arg_parse_int(arg);
|
||||
}
|
||||
|
||||
39
args.h
39
args.h
@@ -9,30 +9,33 @@
|
||||
*/
|
||||
|
||||
|
||||
#ifndef ARGS_H_
|
||||
#define ARGS_H_
|
||||
#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;
|
||||
struct arg
|
||||
{
|
||||
char **argv;
|
||||
const char *name;
|
||||
const char *val;
|
||||
unsigned int argv_step;
|
||||
const struct arg_def *def;
|
||||
};
|
||||
|
||||
struct arg_enum_list {
|
||||
const char *name;
|
||||
int val;
|
||||
struct arg_enum_list
|
||||
{
|
||||
const char *name;
|
||||
int val;
|
||||
};
|
||||
#define ARG_ENUM_LIST_END {0}
|
||||
|
||||
typedef struct arg_def {
|
||||
const char *short_name;
|
||||
const char *long_name;
|
||||
int has_val;
|
||||
const char *desc;
|
||||
const struct arg_enum_list *enums;
|
||||
typedef struct arg_def
|
||||
{
|
||||
const char *short_name;
|
||||
const char *long_name;
|
||||
int has_val;
|
||||
const char *desc;
|
||||
const struct arg_enum_list *enums;
|
||||
} arg_def_t;
|
||||
#define ARG_DEF(s,l,v,d) {s,l,v,d, NULL}
|
||||
#define ARG_DEF_ENUM(s,l,v,d,e) {s,l,v,d,e}
|
||||
@@ -48,4 +51,4 @@ 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);
|
||||
int arg_parse_enum_or_int(const struct arg *arg);
|
||||
#endif // ARGS_H_
|
||||
#endif
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
REM Copyright (c) 2013 The WebM project authors. All Rights Reserved.
|
||||
REM
|
||||
REM Use of this source code is governed by a BSD-style license
|
||||
REM that can be found in the LICENSE file in the root of the source
|
||||
REM tree. An additional intellectual property rights grant can be found
|
||||
REM in the file PATENTS. All contributing project authors may
|
||||
REM be found in the AUTHORS file in the root of the source tree.
|
||||
echo on
|
||||
|
||||
cl /I "./" /I "%1" /nologo /c /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP "%1/vp8/encoder/vp8_asm_enc_offsets.c"
|
||||
obj_int_extract.exe rvds "vp8_asm_enc_offsets.obj" > "vp8_asm_enc_offsets.asm"
|
||||
|
||||
cl /I "./" /I "%1" /nologo /c /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP "%1/vpx_scale/vpx_scale_asm_offsets.c"
|
||||
obj_int_extract.exe rvds "vpx_scale_asm_offsets.obj" > "vpx_scale_asm_offsets.asm"
|
||||
@@ -1,216 +0,0 @@
|
||||
##
|
||||
## Copyright (c) 2012 The WebM project authors. All Rights Reserved.
|
||||
##
|
||||
## Use of this source code is governed by a BSD-style license
|
||||
## that can be found in the LICENSE file in the root of the source
|
||||
## tree. An additional intellectual property rights grant can be found
|
||||
## in the file PATENTS. All contributing project authors may
|
||||
## be found in the AUTHORS file in the root of the source tree.
|
||||
##
|
||||
|
||||
#
|
||||
# This file is to be used for compiling libvpx for Android using the NDK.
|
||||
# In an Android project place a libvpx checkout in the jni directory.
|
||||
# Run the configure script from the jni directory. Base libvpx
|
||||
# encoder/decoder configuration will look similar to:
|
||||
# ./libvpx/configure --target=armv7-android-gcc --disable-examples \
|
||||
# --sdk-path=/opt/android-ndk-r6b/
|
||||
#
|
||||
# When targeting Android, realtime-only is enabled by default. This can
|
||||
# be overridden by adding the command line flag:
|
||||
# --disable-realtime-only
|
||||
#
|
||||
# This will create .mk files that contain variables that contain the
|
||||
# source files to compile.
|
||||
#
|
||||
# Place an Android.mk file in the jni directory that references the
|
||||
# Android.mk file in the libvpx directory:
|
||||
# LOCAL_PATH := $(call my-dir)
|
||||
# include $(CLEAR_VARS)
|
||||
# include jni/libvpx/build/make/Android.mk
|
||||
#
|
||||
# There are currently two TARGET_ARCH_ABI targets for ARM.
|
||||
# armeabi and armeabi-v7a. armeabi-v7a is selected by creating an
|
||||
# Application.mk in the jni directory that contains:
|
||||
# APP_ABI := armeabi-v7a
|
||||
#
|
||||
# By default libvpx will detect at runtime the existance of NEON extension.
|
||||
# For this we import the 'cpufeatures' module from the NDK sources.
|
||||
# libvpx can also be configured without this runtime detection method.
|
||||
# Configuring with --disable-runtime-cpu-detect will assume presence of NEON.
|
||||
# Configuring with --disable-runtime-cpu-detect --disable-neon will remove any
|
||||
# NEON dependency.
|
||||
|
||||
# To change to building armeabi, run ./libvpx/configure again, but with
|
||||
# --target=arm5te-android-gcc and modify the Application.mk file to
|
||||
# set APP_ABI := armeabi
|
||||
#
|
||||
# Running ndk-build will build libvpx and include it in your project.
|
||||
#
|
||||
|
||||
CONFIG_DIR := $(LOCAL_PATH)/
|
||||
LIBVPX_PATH := $(LOCAL_PATH)/libvpx
|
||||
ASM_CNV_PATH_LOCAL := $(TARGET_ARCH_ABI)/ads2gas
|
||||
ASM_CNV_PATH := $(LOCAL_PATH)/$(ASM_CNV_PATH_LOCAL)
|
||||
|
||||
# Makefiles created by the libvpx configure process
|
||||
# This will need to be fixed to handle x86.
|
||||
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
|
||||
include $(CONFIG_DIR)libs-armv7-android-gcc.mk
|
||||
else
|
||||
include $(CONFIG_DIR)libs-armv5te-android-gcc.mk
|
||||
endif
|
||||
|
||||
# Rule that is normally in Makefile created by libvpx
|
||||
# configure. Used to filter out source files based on configuration.
|
||||
enabled=$(filter-out $($(1)-no),$($(1)-yes))
|
||||
|
||||
# Override the relative path that is defined by the libvpx
|
||||
# configure process
|
||||
SRC_PATH_BARE := $(LIBVPX_PATH)
|
||||
|
||||
# Include the list of files to be built
|
||||
include $(LIBVPX_PATH)/libs.mk
|
||||
|
||||
# Want arm, not thumb, optimized
|
||||
LOCAL_ARM_MODE := arm
|
||||
LOCAL_CFLAGS := -O3
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Template : asm_offsets_template
|
||||
# Arguments : 1: assembly offsets file to be created
|
||||
# 2: c file to base assembly offsets on
|
||||
# Returns : None
|
||||
# Usage : $(eval $(call asm_offsets_template,<asmfile>, <srcfile>
|
||||
# Rationale : Create offsets at compile time using for structures that are
|
||||
# defined in c, but used in assembly functions.
|
||||
# -----------------------------------------------------------------------------
|
||||
define asm_offsets_template
|
||||
|
||||
_SRC:=$(2)
|
||||
_OBJ:=$(ASM_CNV_PATH)/$$(notdir $(2)).S
|
||||
|
||||
_FLAGS = $$($$(my)CFLAGS) \
|
||||
$$(call get-src-file-target-cflags,$(2)) \
|
||||
$$(call host-c-includes,$$(LOCAL_C_INCLUDES) $$(CONFIG_DIR)) \
|
||||
$$(LOCAL_CFLAGS) \
|
||||
$$(NDK_APP_CFLAGS) \
|
||||
$$(call host-c-includes,$$($(my)C_INCLUDES)) \
|
||||
-DINLINE_ASM \
|
||||
-S \
|
||||
|
||||
_TEXT = "Compile $$(call get-src-file-text,$(2))"
|
||||
_CC = $$(TARGET_CC)
|
||||
|
||||
$$(eval $$(call ev-build-file))
|
||||
|
||||
$(1) : $$(_OBJ) $(2)
|
||||
@mkdir -p $$(dir $$@)
|
||||
@grep $(OFFSET_PATTERN) $$< | tr -d '\#' | $(CONFIG_DIR)$(ASM_CONVERSION) > $$@
|
||||
endef
|
||||
|
||||
# Use ads2gas script to convert from RVCT format to GAS format. This passes
|
||||
# puts the processed file under $(ASM_CNV_PATH). Local clean rule
|
||||
# to handle removing these
|
||||
ifeq ($(CONFIG_VP8_ENCODER), yes)
|
||||
ASM_CNV_OFFSETS_DEPEND += $(ASM_CNV_PATH)/vp8_asm_enc_offsets.asm
|
||||
endif
|
||||
ifeq ($(HAVE_NEON), yes)
|
||||
ASM_CNV_OFFSETS_DEPEND += $(ASM_CNV_PATH)/vpx_scale_asm_offsets.asm
|
||||
endif
|
||||
|
||||
.PRECIOUS: %.asm.s
|
||||
$(ASM_CNV_PATH)/libvpx/%.asm.s: $(LIBVPX_PATH)/%.asm $(ASM_CNV_OFFSETS_DEPEND)
|
||||
@mkdir -p $(dir $@)
|
||||
@$(CONFIG_DIR)$(ASM_CONVERSION) <$< > $@
|
||||
|
||||
# For building *_rtcd.h, which have rules in libs.mk
|
||||
TGT_ISA:=$(word 1, $(subst -, ,$(TOOLCHAIN)))
|
||||
target := libs
|
||||
|
||||
LOCAL_SRC_FILES += vpx_config.c
|
||||
|
||||
# Remove duplicate entries
|
||||
CODEC_SRCS_UNIQUE = $(sort $(CODEC_SRCS))
|
||||
|
||||
# Pull out C files. vpx_config.c is in the immediate directory and
|
||||
# so it does not need libvpx/ prefixed like the rest of the source files.
|
||||
# The neon files with intrinsics need to have .neon appended so the proper
|
||||
# flags are applied.
|
||||
CODEC_SRCS_C = $(filter %.c, $(CODEC_SRCS_UNIQUE))
|
||||
LOCAL_NEON_SRCS_C = $(filter %_neon.c, $(CODEC_SRCS_C))
|
||||
LOCAL_CODEC_SRCS_C = $(filter-out vpx_config.c %_neon.c, $(CODEC_SRCS_C))
|
||||
|
||||
LOCAL_SRC_FILES += $(foreach file, $(LOCAL_CODEC_SRCS_C), libvpx/$(file))
|
||||
LOCAL_SRC_FILES += $(foreach file, $(LOCAL_NEON_SRCS_C), libvpx/$(file).neon)
|
||||
|
||||
# Pull out assembly files, splitting NEON from the rest. This is
|
||||
# done to specify that the NEON assembly files use NEON assembler flags.
|
||||
CODEC_SRCS_ASM_ALL = $(filter %.asm.s, $(CODEC_SRCS_UNIQUE))
|
||||
CODEC_SRCS_ASM = $(foreach v, \
|
||||
$(CODEC_SRCS_ASM_ALL), \
|
||||
$(if $(findstring neon,$(v)),,$(v)))
|
||||
CODEC_SRCS_ASM_ADS2GAS = $(patsubst %.s, \
|
||||
$(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \
|
||||
$(CODEC_SRCS_ASM))
|
||||
LOCAL_SRC_FILES += $(CODEC_SRCS_ASM_ADS2GAS)
|
||||
|
||||
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
|
||||
CODEC_SRCS_ASM_NEON = $(foreach v, \
|
||||
$(CODEC_SRCS_ASM_ALL),\
|
||||
$(if $(findstring neon,$(v)),$(v),))
|
||||
CODEC_SRCS_ASM_NEON_ADS2GAS = $(patsubst %.s, \
|
||||
$(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \
|
||||
$(CODEC_SRCS_ASM_NEON))
|
||||
LOCAL_SRC_FILES += $(patsubst %.s, \
|
||||
%.s.neon, \
|
||||
$(CODEC_SRCS_ASM_NEON_ADS2GAS))
|
||||
endif
|
||||
|
||||
LOCAL_CFLAGS += \
|
||||
-DHAVE_CONFIG_H=vpx_config.h \
|
||||
-I$(LIBVPX_PATH) \
|
||||
-I$(ASM_CNV_PATH)
|
||||
|
||||
LOCAL_MODULE := libvpx
|
||||
|
||||
LOCAL_LDLIBS := -llog
|
||||
|
||||
ifeq ($(CONFIG_RUNTIME_CPU_DETECT),yes)
|
||||
LOCAL_STATIC_LIBRARIES := cpufeatures
|
||||
endif
|
||||
|
||||
# Add a dependency to force generation of the RTCD files.
|
||||
ifeq ($(CONFIG_VP8), yes)
|
||||
$(foreach file, $(LOCAL_SRC_FILES), $(LOCAL_PATH)/$(file)): vp8_rtcd.h
|
||||
endif
|
||||
ifeq ($(CONFIG_VP9), yes)
|
||||
$(foreach file, $(LOCAL_SRC_FILES), $(LOCAL_PATH)/$(file)): vp9_rtcd.h
|
||||
endif
|
||||
$(foreach file, $(LOCAL_SRC_FILES), $(LOCAL_PATH)/$(file)): vpx_scale_rtcd.h
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@echo "Clean: ads2gas files [$(TARGET_ARCH_ABI)]"
|
||||
@$(RM) $(CODEC_SRCS_ASM_ADS2GAS) $(CODEC_SRCS_ASM_NEON_ADS2GAS)
|
||||
@$(RM) $(patsubst %.asm, %.*, $(ASM_CNV_OFFSETS_DEPEND))
|
||||
@$(RM) -r $(ASM_CNV_PATH)
|
||||
@$(RM) $(CLEAN-OBJS)
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
ifeq ($(HAVE_NEON), yes)
|
||||
$(eval $(call asm_offsets_template,\
|
||||
$(ASM_CNV_PATH)/vpx_scale_asm_offsets.asm, \
|
||||
$(LIBVPX_PATH)/vpx_scale/vpx_scale_asm_offsets.c))
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_VP8_ENCODER), yes)
|
||||
$(eval $(call asm_offsets_template,\
|
||||
$(ASM_CNV_PATH)/vp8_asm_enc_offsets.asm, \
|
||||
$(LIBVPX_PATH)/vp8/encoder/vp8_asm_enc_offsets.c))
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_RUNTIME_CPU_DETECT),yes)
|
||||
$(call import-module,cpufeatures)
|
||||
endif
|
||||
@@ -21,7 +21,6 @@ all: .DEFAULT
|
||||
clean:: .DEFAULT
|
||||
install:: .DEFAULT
|
||||
test:: .DEFAULT
|
||||
testdata:: .DEFAULT
|
||||
|
||||
|
||||
# Note: md5sum is not installed on OS X, but openssl is. Openssl may not be
|
||||
@@ -67,14 +66,13 @@ endif
|
||||
BUILD_ROOT?=.
|
||||
VPATH=$(SRC_PATH_BARE)
|
||||
CFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH)
|
||||
CXXFLAGS+=-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 $(or $(verbose), $(V)),, yes)
|
||||
quiet:=$(if $(verbose),,yes)
|
||||
qexec=$(if $(quiet),@)
|
||||
|
||||
# Cancel built-in implicit rules
|
||||
@@ -100,24 +98,6 @@ dist:
|
||||
install::
|
||||
.PHONY: test
|
||||
test::
|
||||
.PHONY: testdata
|
||||
testdata::
|
||||
|
||||
# Add compiler flags for intrinsic files
|
||||
$(BUILD_PFX)%_mmx.c.d: CFLAGS += -mmmx
|
||||
$(BUILD_PFX)%_mmx.c.o: CFLAGS += -mmmx
|
||||
$(BUILD_PFX)%_sse2.c.d: CFLAGS += -msse2
|
||||
$(BUILD_PFX)%_sse2.c.o: CFLAGS += -msse2
|
||||
$(BUILD_PFX)%_sse3.c.d: CFLAGS += -msse3
|
||||
$(BUILD_PFX)%_sse3.c.o: CFLAGS += -msse3
|
||||
$(BUILD_PFX)%_ssse3.c.d: CFLAGS += -mssse3
|
||||
$(BUILD_PFX)%_ssse3.c.o: CFLAGS += -mssse3
|
||||
$(BUILD_PFX)%_sse4.c.d: CFLAGS += -msse4.1
|
||||
$(BUILD_PFX)%_sse4.c.o: CFLAGS += -msse4.1
|
||||
$(BUILD_PFX)%_avx.c.d: CFLAGS += -mavx
|
||||
$(BUILD_PFX)%_avx.c.o: CFLAGS += -mavx
|
||||
$(BUILD_PFX)%_avx2.c.d: CFLAGS += -mavx2
|
||||
$(BUILD_PFX)%_avx2.c.o: CFLAGS += -mavx2
|
||||
|
||||
$(BUILD_PFX)%.c.d: %.c
|
||||
$(if $(quiet),@echo " [DEP] $@")
|
||||
@@ -131,11 +111,11 @@ $(BUILD_PFX)%.c.o: %.c
|
||||
$(BUILD_PFX)%.cc.d: %.cc
|
||||
$(if $(quiet),@echo " [DEP] $@")
|
||||
$(qexec)mkdir -p $(dir $@)
|
||||
$(qexec)$(CXX) $(INTERNAL_CFLAGS) $(CXXFLAGS) -M $< | $(fmt_deps) > $@
|
||||
$(qexec)g++ $(INTERNAL_CFLAGS) $(CFLAGS) -M $< | $(fmt_deps) > $@
|
||||
|
||||
$(BUILD_PFX)%.cc.o: %.cc
|
||||
$(if $(quiet),@echo " [CXX] $@")
|
||||
$(qexec)$(CXX) $(INTERNAL_CFLAGS) $(CXXFLAGS) -c -o $@ $<
|
||||
$(qexec)g++ $(INTERNAL_CFLAGS) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
$(BUILD_PFX)%.asm.d: %.asm
|
||||
$(if $(quiet),@echo " [DEP] $@")
|
||||
@@ -233,7 +213,7 @@ define linkerxx_template
|
||||
$(1): $(filter-out -%,$(2))
|
||||
$(1):
|
||||
$(if $(quiet),@echo " [LD] $$@")
|
||||
$(qexec)$$(CXX) $$(strip $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -o $$@ $(2) $(3) $$(extralibs))
|
||||
$(qexec)g++ $$(strip $$(INTERNAL_LDFLAGS) $$(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
|
||||
@@ -269,25 +249,10 @@ $(1):
|
||||
$(if $(quiet),@echo " [LD] $$@")
|
||||
$(qexec)$$(LD) -shared $$(LDFLAGS) \
|
||||
-Wl,--no-undefined -Wl,-soname,$$(SONAME) \
|
||||
-Wl,--version-script,$$(EXPORTS_FILE) -o $$@ \
|
||||
$$(filter %.o,$$^) $$(extralibs)
|
||||
-Wl,--version-script,$$(SO_VERSION_SCRIPT) -o $$@ \
|
||||
$$(filter %.o,$$?) $$(extralibs)
|
||||
endef
|
||||
|
||||
define dl_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 " [LD] $$@")
|
||||
$(qexec)$$(LD) -dynamiclib $$(LDFLAGS) \
|
||||
-exported_symbols_list $$(EXPORTS_FILE) \
|
||||
-Wl,-headerpad_max_install_names,-compatibility_version,1.0,-current_version,$$(VERSION_MAJOR) \
|
||||
-o $$@ \
|
||||
$$(filter %.o,$$^) $$(extralibs)
|
||||
endef
|
||||
|
||||
|
||||
|
||||
define lipo_lib_template
|
||||
$(1): $(addsuffix /$(1),$(FAT_ARCHS))
|
||||
$(if $(quiet),@echo " [LIPO] $$@")
|
||||
@@ -352,7 +317,6 @@ LIBS=$(call enabled,LIBS)
|
||||
@touch $@
|
||||
$(foreach lib,$(filter %_g.a,$(LIBS)),$(eval $(call archive_template,$(lib))))
|
||||
$(foreach lib,$(filter %so.$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH),$(LIBS)),$(eval $(call so_template,$(lib))))
|
||||
$(foreach lib,$(filter %$(VERSION_MAJOR).dylib,$(LIBS)),$(eval $(call dl_template,$(lib))))
|
||||
|
||||
INSTALL-LIBS=$(call cond_enabled,CONFIG_INSTALL_LIBS,INSTALL-LIBS)
|
||||
ifeq ($(MAKECMDGOALS),dist)
|
||||
@@ -390,16 +354,12 @@ ifneq ($(call enabled,DIST-SRCS),)
|
||||
DIST-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_def.sh
|
||||
DIST-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_proj.sh
|
||||
DIST-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_sln.sh
|
||||
DIST-SRCS-$(CONFIG_MSVS) += build/make/gen_msvs_vcxproj.sh
|
||||
DIST-SRCS-$(CONFIG_MSVS) += build/x86-msvs/yasm.rules
|
||||
DIST-SRCS-$(CONFIG_MSVS) += build/x86-msvs/obj_int_extract.bat
|
||||
DIST-SRCS-$(CONFIG_MSVS) += build/arm-msvs/obj_int_extract.bat
|
||||
DIST-SRCS-$(CONFIG_RVCT) += build/make/armlink_adapter.sh
|
||||
# Include obj_int_extract if we use offsets from *_asm_*_offsets
|
||||
# Include obj_int_extract if we use offsets from asm_*_offsets
|
||||
DIST-SRCS-$(ARCH_ARM)$(ARCH_X86)$(ARCH_X86_64) += build/make/obj_int_extract.c
|
||||
DIST-SRCS-$(ARCH_ARM) += build/make/ads2gas.pl
|
||||
DIST-SRCS-$(ARCH_ARM) += build/make/ads2gas_apple.pl
|
||||
DIST-SRCS-$(ARCH_ARM) += build/make/ads2armasm_ms.pl
|
||||
DIST-SRCS-$(ARCH_ARM) += build/make/thumb.pm
|
||||
DIST-SRCS-yes += $(target:-$(TOOLCHAIN)=).mk
|
||||
endif
|
||||
INSTALL-SRCS := $(call cond_enabled,CONFIG_INSTALL_SRCS,INSTALL-SRCS)
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
##
|
||||
## Copyright (c) 2013 The WebM project authors. All Rights Reserved.
|
||||
##
|
||||
## Use of this source code is governed by a BSD-style license
|
||||
## that can be found in the LICENSE file in the root of the source
|
||||
## tree. An additional intellectual property rights grant can be found
|
||||
## in the file PATENTS. All contributing project authors may
|
||||
## be found in the AUTHORS file in the root of the source tree.
|
||||
##
|
||||
|
||||
use FindBin;
|
||||
use lib $FindBin::Bin;
|
||||
use thumb;
|
||||
|
||||
print "; This file was created from a .asm file\n";
|
||||
print "; using the ads2armasm_ms.pl script.\n";
|
||||
|
||||
while (<STDIN>)
|
||||
{
|
||||
undef $comment;
|
||||
undef $line;
|
||||
|
||||
s/REQUIRE8//;
|
||||
s/PRESERVE8//;
|
||||
s/^\s*ARM\s*$//;
|
||||
s/AREA\s+\|\|(.*)\|\|/AREA |$1|/;
|
||||
s/qsubaddx/qsax/i;
|
||||
s/qaddsubx/qasx/i;
|
||||
|
||||
thumb::FixThumbInstructions($_, 1);
|
||||
|
||||
s/ldrneb/ldrbne/i;
|
||||
s/ldrneh/ldrhne/i;
|
||||
|
||||
print;
|
||||
}
|
||||
|
||||
@@ -17,46 +17,21 @@
|
||||
#
|
||||
# Usage: cat inputfile | perl ads2gas.pl > outputfile
|
||||
#
|
||||
|
||||
use FindBin;
|
||||
use lib $FindBin::Bin;
|
||||
use thumb;
|
||||
|
||||
my $thumb = 0;
|
||||
|
||||
foreach my $arg (@ARGV) {
|
||||
$thumb = 1 if ($arg eq "-thumb");
|
||||
}
|
||||
|
||||
print "@ This file was created from a .asm file\n";
|
||||
print "@ using the ads2gas.pl script.\n";
|
||||
print "\t.equ DO1STROUNDING, 0\n";
|
||||
if ($thumb) {
|
||||
print "\t.syntax unified\n";
|
||||
print "\t.thumb\n";
|
||||
}
|
||||
|
||||
# Stack of procedure names.
|
||||
@proc_stack = ();
|
||||
|
||||
while (<STDIN>)
|
||||
{
|
||||
undef $comment;
|
||||
undef $line;
|
||||
$comment_char = ";";
|
||||
$comment_sub = "@";
|
||||
|
||||
# Handle comments.
|
||||
if (/$comment_char/)
|
||||
{
|
||||
$comment = "";
|
||||
($line, $comment) = /(.*?)$comment_char(.*)/;
|
||||
$_ = $line;
|
||||
}
|
||||
|
||||
# Load and store alignment
|
||||
s/@/,:/g;
|
||||
|
||||
# Comment character
|
||||
s/;/@/g;
|
||||
|
||||
# Hexadecimal constants prefaced by 0x
|
||||
s/#&/#0x/g;
|
||||
|
||||
@@ -76,27 +51,16 @@ while (<STDIN>)
|
||||
s/:SHR:/ >> /g;
|
||||
|
||||
# Convert ELSE to .else
|
||||
s/\bELSE\b/.else/g;
|
||||
s/ELSE/.else/g;
|
||||
|
||||
# Convert ENDIF to .endif
|
||||
s/\bENDIF\b/.endif/g;
|
||||
s/ENDIF/.endif/g;
|
||||
|
||||
# Convert ELSEIF to .elseif
|
||||
s/\bELSEIF\b/.elseif/g;
|
||||
s/ELSEIF/.elseif/g;
|
||||
|
||||
# Convert LTORG to .ltorg
|
||||
s/\bLTORG\b/.ltorg/g;
|
||||
|
||||
# Convert endfunc to nothing.
|
||||
s/\bendfunc\b//ig;
|
||||
|
||||
# Convert FUNCTION to nothing.
|
||||
s/\bFUNCTION\b//g;
|
||||
s/\bfunction\b//g;
|
||||
|
||||
s/\bENTRY\b//g;
|
||||
s/\bMSARMASM\b/0/g;
|
||||
s/^\s+end\s+$//g;
|
||||
s/LTORG/.ltorg/g;
|
||||
|
||||
# Convert IF :DEF:to .if
|
||||
# gcc doesn't have the ability to do a conditional
|
||||
@@ -142,7 +106,6 @@ while (<STDIN>)
|
||||
if (s/RN\s+([Rr]\d+|lr)/.req $1/)
|
||||
{
|
||||
print;
|
||||
print "$comment_sub$comment\n" if defined $comment;
|
||||
next;
|
||||
}
|
||||
|
||||
@@ -151,9 +114,6 @@ while (<STDIN>)
|
||||
s/EXPORT\s+\|([\$\w]*)\|/.global $1 \n\t.type $1, function/;
|
||||
s/IMPORT\s+\|([\$\w]*)\|/.global $1/;
|
||||
|
||||
s/EXPORT\s+([\$\w]*)/.global $1/;
|
||||
s/export\s+([\$\w]*)/.global $1/;
|
||||
|
||||
# No vertical bars required; make additional symbol with prepended
|
||||
# underscore
|
||||
s/^\|(\$?\w+)\|/_$1\n\t$1:/g;
|
||||
@@ -164,36 +124,16 @@ while (<STDIN>)
|
||||
s/^([a-zA-Z_0-9\$]+)/$1:/ if !/EQU/;
|
||||
|
||||
# ALIGN directive
|
||||
s/\bALIGN\b/.balign/g;
|
||||
s/ALIGN/.balign/g;
|
||||
|
||||
if ($thumb) {
|
||||
# ARM code - we force everything to thumb with the declaration in the header
|
||||
s/\sARM//g;
|
||||
} else {
|
||||
# ARM code
|
||||
s/\sARM/.arm/g;
|
||||
}
|
||||
|
||||
# push/pop
|
||||
s/(push\s+)(r\d+)/stmdb sp\!, \{$2\}/g;
|
||||
s/(pop\s+)(r\d+)/ldmia sp\!, \{$2\}/g;
|
||||
|
||||
# NEON code
|
||||
s/(vld1.\d+\s+)(q\d+)/$1\{$2\}/g;
|
||||
s/(vtbl.\d+\s+[^,]+),([^,]+)/$1,\{$2\}/g;
|
||||
|
||||
if ($thumb) {
|
||||
thumb::FixThumbInstructions($_, 0);
|
||||
}
|
||||
|
||||
# eabi_attributes numerical equivalents can be found in the
|
||||
# "ARM IHI 0045C" document.
|
||||
# ARM code
|
||||
s/\sARM/.arm/g;
|
||||
|
||||
# REQUIRE8 Stack is required to be 8-byte aligned
|
||||
s/\sREQUIRE8/.eabi_attribute 24, 1 \@Tag_ABI_align_needed/g;
|
||||
s/\sREQUIRE8/.eabi_attribute Tag_ABI_align_needed, 1/g;
|
||||
|
||||
# PRESERVE8 Stack 8-byte align is preserved
|
||||
s/\sPRESERVE8/.eabi_attribute 25, 1 \@Tag_ABI_align_preserved/g;
|
||||
s/\sPRESERVE8/.eabi_attribute Tag_ABI_align_preserved, 1/g;
|
||||
|
||||
# Use PROC and ENDP to give the symbols a .size directive.
|
||||
# This makes them show up properly in debugging tools like gdb and valgrind.
|
||||
@@ -214,10 +154,10 @@ while (<STDIN>)
|
||||
}
|
||||
|
||||
# EQU directive
|
||||
s/(\S+\s+)EQU(\s+\S+)/.equ $1, $2/;
|
||||
s/(.*)EQU(.*)/.equ $1, $2/;
|
||||
|
||||
# Begin macro definition
|
||||
if (/\bMACRO\b/) {
|
||||
if (/MACRO/) {
|
||||
$_ = <STDIN>;
|
||||
s/^/.macro/;
|
||||
s/\$//g; # remove formal param reference
|
||||
@@ -226,10 +166,9 @@ while (<STDIN>)
|
||||
|
||||
# For macros, use \ to reference formal params
|
||||
s/\$/\\/g; # End macro definition
|
||||
s/\bMEND\b/.endm/; # No need to tell it where to stop assembling
|
||||
s/MEND/.endm/; # No need to tell it where to stop assembling
|
||||
next if /^\s*END\s*$/;
|
||||
print;
|
||||
print "$comment_sub$comment\n" if defined $comment;
|
||||
}
|
||||
|
||||
# Mark that this object doesn't need an executable stack.
|
||||
|
||||
@@ -10,20 +10,13 @@
|
||||
##
|
||||
|
||||
|
||||
# ads2gas_apple.pl
|
||||
# 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_apple.pl > outputfile
|
||||
# Usage: cat inputfile | perl ads2gas.pl > outputfile
|
||||
#
|
||||
|
||||
my $chromium = 0;
|
||||
|
||||
foreach my $arg (@ARGV) {
|
||||
$chromium = 1 if ($arg eq "-chromium");
|
||||
}
|
||||
|
||||
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";
|
||||
@@ -37,8 +30,6 @@ my @mapping_list = ("\$0", "\$1", "\$2", "\$3", "\$4", "\$5", "\$6", "\$7", "\$8
|
||||
|
||||
my @incoming_array;
|
||||
|
||||
my @imported_functions;
|
||||
|
||||
# Perl trim function to remove whitespace from the start and end of the string
|
||||
sub trim($)
|
||||
{
|
||||
@@ -54,7 +45,7 @@ while (<STDIN>)
|
||||
s/@/,:/g;
|
||||
|
||||
# Comment character
|
||||
s/;/ @/g;
|
||||
s/;/@/g;
|
||||
|
||||
# Hexadecimal constants prefaced by 0x
|
||||
s/#&/#0x/g;
|
||||
@@ -141,18 +132,7 @@ while (<STDIN>)
|
||||
# Make function visible to linker, and make additional symbol with
|
||||
# prepended underscore
|
||||
s/EXPORT\s+\|([\$\w]*)\|/.globl _$1\n\t.globl $1/;
|
||||
|
||||
# Prepend imported functions with _
|
||||
if (s/IMPORT\s+\|([\$\w]*)\|/.globl $1/)
|
||||
{
|
||||
$function = trim($1);
|
||||
push(@imported_functions, $function);
|
||||
}
|
||||
|
||||
foreach $function (@imported_functions)
|
||||
{
|
||||
s/$function/_$function/;
|
||||
}
|
||||
s/IMPORT\s+\|([\$\w]*)\|/.globl $1/;
|
||||
|
||||
# No vertical bars required; make additional symbol with prepended
|
||||
# underscore
|
||||
@@ -177,8 +157,8 @@ while (<STDIN>)
|
||||
s/\sPRESERVE8/@ PRESERVE8/g;
|
||||
|
||||
# Strip PROC and ENDPROC
|
||||
s/\bPROC\b/@/g;
|
||||
s/\bENDP\b/@/g;
|
||||
s/PROC/@/g;
|
||||
s/ENDP/@/g;
|
||||
|
||||
# EQU directive
|
||||
s/(.*)EQU(.*)/.set $1, $2/;
|
||||
@@ -195,7 +175,7 @@ while (<STDIN>)
|
||||
$trimmed =~ s/,//g;
|
||||
|
||||
# string to array
|
||||
@incoming_array = split(/\s+/, $trimmed);
|
||||
@incoming_array = split(/ /, $trimmed);
|
||||
|
||||
print ".macro @incoming_array[0]\n";
|
||||
|
||||
@@ -217,19 +197,5 @@ while (<STDIN>)
|
||||
# s/\$/\\/g; # End macro definition
|
||||
s/MEND/.endm/; # No need to tell it where to stop assembling
|
||||
next if /^\s*END\s*$/;
|
||||
|
||||
# Clang used by Chromium differs slightly from clang in XCode in what it
|
||||
# will accept in the assembly.
|
||||
if ($chromium) {
|
||||
s/qsubaddx/qsax/i;
|
||||
s/qaddsubx/qasx/i;
|
||||
s/ldrneb/ldrbne/i;
|
||||
s/ldrneh/ldrhne/i;
|
||||
s/(vqshrun\.s16 .*, \#)0$/${1}8/i;
|
||||
|
||||
# http://llvm.org/bugs/show_bug.cgi?id=16022
|
||||
s/\.include/#include/;
|
||||
}
|
||||
|
||||
print;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
##
|
||||
## Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
##
|
||||
@@ -13,20 +13,20 @@
|
||||
verbose=0
|
||||
set -- $*
|
||||
for i; do
|
||||
if [ "$i" = "-o" ]; then
|
||||
if [ "$i" == "-o" ]; then
|
||||
on_of=1
|
||||
elif [ "$i" = "-v" ]; then
|
||||
elif [ "$i" == "-v" ]; then
|
||||
verbose=1
|
||||
elif [ "$i" = "-g" ]; then
|
||||
elif [ "$i" == "-g" ]; then
|
||||
args="${args} --debug"
|
||||
elif [ "$on_of" = "1" ]; then
|
||||
elif [ "$on_of" == "1" ]; then
|
||||
outfile=$i
|
||||
on_of=0
|
||||
elif [ -f "$i" ]; then
|
||||
infiles="$infiles $i"
|
||||
elif [ "${i#-l}" != "$i" ]; then
|
||||
elif [ "${i:0:2}" == "-l" ]; then
|
||||
libs="$libs ${i#-l}"
|
||||
elif [ "${i#-L}" != "$i" ]; then
|
||||
elif [ "${i:0:2}" == "-L" ]; then
|
||||
libpaths="${libpaths} ${i#-L}"
|
||||
else
|
||||
args="${args} ${i}"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
##
|
||||
## configure.sh
|
||||
##
|
||||
@@ -75,7 +75,7 @@ Options:
|
||||
|
||||
Build options:
|
||||
--help print this message
|
||||
--log=yes|no|FILE file configure log is written to [config.log]
|
||||
--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
|
||||
--extra-cflags=ECFLAGS add ECFLAGS to CFLAGS [$CFLAGS]
|
||||
@@ -88,7 +88,6 @@ Build options:
|
||||
${toggle_debug} enable/disable debug mode
|
||||
${toggle_gprof} enable/disable gprof profiling instrumentation
|
||||
${toggle_gcov} enable/disable gcov coverage instrumentation
|
||||
${toggle_thumb} enable/disable building arm assembly in thumb mode
|
||||
|
||||
Install options:
|
||||
${toggle_install_docs} control whether docs are installed
|
||||
@@ -167,17 +166,6 @@ is_in(){
|
||||
|
||||
add_cflags() {
|
||||
CFLAGS="${CFLAGS} $@"
|
||||
CXXFLAGS="${CXXFLAGS} $@"
|
||||
}
|
||||
|
||||
|
||||
add_cflags_only() {
|
||||
CFLAGS="${CFLAGS} $@"
|
||||
}
|
||||
|
||||
|
||||
add_cxxflags_only() {
|
||||
CXXFLAGS="${CXXFLAGS} $@"
|
||||
}
|
||||
|
||||
|
||||
@@ -198,11 +186,11 @@ add_extralibs() {
|
||||
#
|
||||
# Boolean Manipulation Functions
|
||||
#
|
||||
enable_feature(){
|
||||
enable(){
|
||||
set_all yes $*
|
||||
}
|
||||
|
||||
disable_feature(){
|
||||
disable(){
|
||||
set_all no $*
|
||||
}
|
||||
|
||||
@@ -219,7 +207,7 @@ soft_enable() {
|
||||
for var in $*; do
|
||||
if ! disabled $var; then
|
||||
log_echo " enabling $var"
|
||||
enable_feature $var
|
||||
enable $var
|
||||
fi
|
||||
done
|
||||
}
|
||||
@@ -228,7 +216,7 @@ soft_disable() {
|
||||
for var in $*; do
|
||||
if ! enabled $var; then
|
||||
log_echo " disabling $var"
|
||||
disable_feature $var
|
||||
disable $var
|
||||
fi
|
||||
done
|
||||
}
|
||||
@@ -251,10 +239,10 @@ tolower(){
|
||||
# Temporary File Functions
|
||||
#
|
||||
source_path=${0%/*}
|
||||
enable_feature source_path_used
|
||||
enable source_path_used
|
||||
if test -z "$source_path" -o "$source_path" = "." ; then
|
||||
source_path="`pwd`"
|
||||
disable_feature source_path_used
|
||||
disable source_path_used
|
||||
fi
|
||||
|
||||
if test ! -z "$TMPDIR" ; then
|
||||
@@ -264,23 +252,20 @@ elif test ! -z "$TEMPDIR" ; then
|
||||
else
|
||||
TMPDIRx="/tmp"
|
||||
fi
|
||||
RAND=$(awk 'BEGIN { srand(); printf "%d\n",(rand() * 32768)}')
|
||||
TMP_H="${TMPDIRx}/vpx-conf-$$-${RAND}.h"
|
||||
TMP_C="${TMPDIRx}/vpx-conf-$$-${RAND}.c"
|
||||
TMP_CC="${TMPDIRx}/vpx-conf-$$-${RAND}.cc"
|
||||
TMP_O="${TMPDIRx}/vpx-conf-$$-${RAND}.o"
|
||||
TMP_X="${TMPDIRx}/vpx-conf-$$-${RAND}.x"
|
||||
TMP_ASM="${TMPDIRx}/vpx-conf-$$-${RAND}.asm"
|
||||
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"
|
||||
TMP_ASM="${TMPDIRx}/vpx-conf-$$-${RANDOM}.asm"
|
||||
|
||||
clean_temp_files() {
|
||||
rm -f ${TMP_C} ${TMP_CC} ${TMP_H} ${TMP_O} ${TMP_X} ${TMP_ASM}
|
||||
rm -f ${TMP_C} ${TMP_H} ${TMP_O} ${TMP_X} ${TMP_ASM}
|
||||
}
|
||||
|
||||
#
|
||||
# Toolchain Check Functions
|
||||
#
|
||||
check_cmd() {
|
||||
enabled external_build && return
|
||||
log "$@"
|
||||
"$@" >>${logfile} 2>&1
|
||||
}
|
||||
@@ -292,13 +277,6 @@ check_cc() {
|
||||
check_cmd ${CC} ${CFLAGS} "$@" -c -o ${TMP_O} ${TMP_C}
|
||||
}
|
||||
|
||||
check_cxx() {
|
||||
log check_cxx "$@"
|
||||
cat >${TMP_CC}
|
||||
log_file ${TMP_CC}
|
||||
check_cmd ${CXX} ${CXXFLAGS} "$@" -c -o ${TMP_O} ${TMP_CC}
|
||||
}
|
||||
|
||||
check_cpp() {
|
||||
log check_cpp "$@"
|
||||
cat > ${TMP_C}
|
||||
@@ -317,8 +295,8 @@ check_header(){
|
||||
header=$1
|
||||
shift
|
||||
var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
|
||||
disable_feature $var
|
||||
check_cpp "$@" <<EOF && enable_feature $var
|
||||
disable $var
|
||||
check_cpp "$@" <<EOF && enable $var
|
||||
#include "$header"
|
||||
int x;
|
||||
EOF
|
||||
@@ -332,25 +310,8 @@ int x;
|
||||
EOF
|
||||
}
|
||||
|
||||
check_cxxflags() {
|
||||
log check_cxxflags "$@"
|
||||
|
||||
# Catch CFLAGS that trigger CXX warnings
|
||||
case "$CXX" in
|
||||
*g++*) check_cxx -Werror "$@" <<EOF
|
||||
int x;
|
||||
EOF
|
||||
;;
|
||||
*) check_cxx "$@" <<EOF
|
||||
int x;
|
||||
EOF
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
check_add_cflags() {
|
||||
check_cxxflags "$@" && add_cxxflags_only "$@"
|
||||
check_cflags "$@" && add_cflags_only "$@"
|
||||
check_cflags "$@" && add_cflags "$@"
|
||||
}
|
||||
|
||||
check_add_asflags() {
|
||||
@@ -406,9 +367,7 @@ true
|
||||
|
||||
write_common_target_config_mk() {
|
||||
local CC=${CC}
|
||||
local CXX=${CXX}
|
||||
enabled ccache && CC="ccache ${CC}"
|
||||
enabled ccache && CXX="ccache ${CXX}"
|
||||
print_webm_license $1 "##" ""
|
||||
|
||||
cat >> $1 << EOF
|
||||
@@ -418,11 +377,8 @@ SRC_PATH_BARE=$source_path
|
||||
BUILD_PFX=${BUILD_PFX}
|
||||
TOOLCHAIN=${toolchain}
|
||||
ASM_CONVERSION=${asm_conversion_cmd:-${source_path}/build/make/ads2gas.pl}
|
||||
GEN_VCPROJ=${gen_vcproj_cmd}
|
||||
MSVS_ARCH_DIR=${msvs_arch_dir}
|
||||
|
||||
CC=${CC}
|
||||
CXX=${CXX}
|
||||
AR=${AR}
|
||||
LD=${LD}
|
||||
AS=${AS}
|
||||
@@ -430,22 +386,18 @@ STRIP=${STRIP}
|
||||
NM=${NM}
|
||||
|
||||
CFLAGS = ${CFLAGS}
|
||||
CXXFLAGS = ${CXXFLAGS}
|
||||
ARFLAGS = -rus\$(if \$(quiet),c,v)
|
||||
LDFLAGS = ${LDFLAGS}
|
||||
ASFLAGS = ${ASFLAGS}
|
||||
extralibs = ${extralibs}
|
||||
AS_SFX = ${AS_SFX:-.asm}
|
||||
EXE_SFX = ${EXE_SFX}
|
||||
VCPROJ_SFX = ${VCPROJ_SFX}
|
||||
RTCD_OPTIONS = ${RTCD_OPTIONS}
|
||||
EOF
|
||||
|
||||
if enabled rvct; then cat >> $1 << EOF
|
||||
fmt_deps = sed -e 's;^__image.axf;\${@:.d=.o} \$@;' #hide
|
||||
fmt_deps = sed -e 's;^__image.axf;\$(dir \$@)\$(notdir \$<).o \$@;' #hide
|
||||
EOF
|
||||
else cat >> $1 << EOF
|
||||
fmt_deps = sed -e 's;^\([a-zA-Z0-9_]*\)\.o;\${@:.d=.o} \$@;'
|
||||
fmt_deps = sed -e 's;^\([a-zA-Z0-9_]*\)\.o;\$(dir \$@)\1\$(suffix \$<).o \$@;'
|
||||
EOF
|
||||
fi
|
||||
|
||||
@@ -466,7 +418,6 @@ write_common_target_config_h() {
|
||||
#ifndef VPX_CONFIG_H
|
||||
#define VPX_CONFIG_H
|
||||
#define RESTRICT ${RESTRICT}
|
||||
#define INLINE ${INLINE}
|
||||
EOF
|
||||
print_config_h ARCH "${TMP_H}" ${ARCH_LIST}
|
||||
print_config_h HAVE "${TMP_H}" ${HAVE_LIST}
|
||||
@@ -480,7 +431,7 @@ process_common_cmdline() {
|
||||
for opt in "$@"; do
|
||||
optval="${opt#*=}"
|
||||
case "$opt" in
|
||||
--child) enable_feature child
|
||||
--child) enable child
|
||||
;;
|
||||
--log*)
|
||||
logging="$optval"
|
||||
@@ -492,7 +443,7 @@ process_common_cmdline() {
|
||||
;;
|
||||
--target=*) toolchain="${toolchain:-${optval}}"
|
||||
;;
|
||||
--force-target=*) toolchain="${toolchain:-${optval}}"; enable_feature force_toolchain
|
||||
--force-target=*) toolchain="${toolchain:-${optval}}"; enable force_toolchain
|
||||
;;
|
||||
--cpu)
|
||||
;;
|
||||
@@ -503,32 +454,16 @@ process_common_cmdline() {
|
||||
;;
|
||||
--enable-?*|--disable-?*)
|
||||
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
|
||||
if echo "${ARCH_EXT_LIST}" | grep "^ *$option\$" >/dev/null; then
|
||||
[ $action = "disable" ] && RTCD_OPTIONS="${RTCD_OPTIONS}${opt} "
|
||||
elif [ $action = "disable" ] && ! disabled $option ; then
|
||||
echo "${CMDLINE_SELECT}" | grep "^ *$option\$" >/dev/null ||
|
||||
die_unknown $opt
|
||||
elif [ $action = "enable" ] && ! enabled $option ; then
|
||||
echo "${CMDLINE_SELECT}" | grep "^ *$option\$" >/dev/null ||
|
||||
die_unknown $opt
|
||||
fi
|
||||
${action}_feature $option
|
||||
;;
|
||||
--require-?*)
|
||||
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
|
||||
if echo "${ARCH_EXT_LIST}" none | grep "^ *$option\$" >/dev/null; then
|
||||
RTCD_OPTIONS="${RTCD_OPTIONS}${opt} "
|
||||
else
|
||||
die_unknown $opt
|
||||
fi
|
||||
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}_feature $option
|
||||
$action $option
|
||||
;;
|
||||
--libc=*)
|
||||
[ -d "${optval}" ] || die "Not a directory: ${optval}"
|
||||
disable_feature builtin_libc
|
||||
disable builtin_libc
|
||||
alt_libc="${optval}"
|
||||
;;
|
||||
--as=*)
|
||||
@@ -542,11 +477,7 @@ process_common_cmdline() {
|
||||
--libdir=*)
|
||||
libdir="${optval}"
|
||||
;;
|
||||
--sdk-path=*)
|
||||
[ -d "${optval}" ] || die "Not a directory: ${optval}"
|
||||
sdk_path="${optval}"
|
||||
;;
|
||||
--libc|--as|--prefix|--libdir|--sdk-path)
|
||||
--libc|--as|--prefix|--libdir)
|
||||
die "Option ${opt} requires argument"
|
||||
;;
|
||||
--help|-h) show_help
|
||||
@@ -585,36 +516,20 @@ post_process_cmdline() {
|
||||
|
||||
setup_gnu_toolchain() {
|
||||
CC=${CC:-${CROSS}gcc}
|
||||
CXX=${CXX:-${CROSS}g++}
|
||||
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
|
||||
EXE_SFX=
|
||||
}
|
||||
|
||||
process_common_toolchain() {
|
||||
if [ -z "$toolchain" ]; then
|
||||
gcctarget="${CHOST:-$(gcc -dumpmachine 2> /dev/null)}"
|
||||
gcctarget="$(gcc -dumpmachine 2> /dev/null)"
|
||||
|
||||
# detect tgt_isa
|
||||
case "$gcctarget" in
|
||||
armv6*)
|
||||
tgt_isa=armv6
|
||||
;;
|
||||
armv7*-hardfloat*)
|
||||
tgt_isa=armv7
|
||||
float_abi=hard
|
||||
;;
|
||||
armv7*)
|
||||
tgt_isa=armv7
|
||||
float_abi=softfp
|
||||
;;
|
||||
armv5te*)
|
||||
tgt_isa=armv5te
|
||||
;;
|
||||
*x86_64*|*amd64*)
|
||||
tgt_isa=x86_64
|
||||
;;
|
||||
@@ -646,21 +561,6 @@ process_common_toolchain() {
|
||||
tgt_isa=x86_64
|
||||
tgt_os=darwin10
|
||||
;;
|
||||
*darwin11*)
|
||||
tgt_isa=x86_64
|
||||
tgt_os=darwin11
|
||||
;;
|
||||
*darwin12*)
|
||||
tgt_isa=x86_64
|
||||
tgt_os=darwin12
|
||||
;;
|
||||
*darwin13*)
|
||||
tgt_isa=x86_64
|
||||
tgt_os=darwin13
|
||||
;;
|
||||
x86_64*mingw32*)
|
||||
tgt_os=win64
|
||||
;;
|
||||
*mingw32*|*cygwin*)
|
||||
[ -z "$tgt_isa" ] && tgt_isa=x86
|
||||
tgt_os=win32
|
||||
@@ -671,9 +571,6 @@ process_common_toolchain() {
|
||||
*solaris2.10)
|
||||
tgt_os=solaris
|
||||
;;
|
||||
*os2*)
|
||||
tgt_os=os2
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -n "$tgt_isa" ] && [ -n "$tgt_os" ]; then
|
||||
@@ -697,13 +594,13 @@ process_common_toolchain() {
|
||||
|
||||
# Mark the specific ISA requested as enabled
|
||||
soft_enable ${tgt_isa}
|
||||
enable_feature ${tgt_os}
|
||||
enable_feature ${tgt_cc}
|
||||
enable ${tgt_os}
|
||||
enable ${tgt_cc}
|
||||
|
||||
# Enable the architecture family
|
||||
case ${tgt_isa} in
|
||||
arm*) enable_feature arm;;
|
||||
mips*) enable_feature mips;;
|
||||
arm*|iwmmxt*) enable arm;;
|
||||
mips*) enable mips;;
|
||||
esac
|
||||
|
||||
# PIC is probably what we want when building shared libs
|
||||
@@ -711,62 +608,42 @@ process_common_toolchain() {
|
||||
|
||||
# Handle darwin variants. Newer SDKs allow targeting older
|
||||
# platforms, so find the newest SDK available.
|
||||
case ${toolchain} in
|
||||
*-darwin*)
|
||||
if [ -z "${DEVELOPER_DIR}" ]; then
|
||||
DEVELOPER_DIR=`xcode-select -print-path 2> /dev/null`
|
||||
[ $? -ne 0 ] && OSX_SKIP_DIR_CHECK=1
|
||||
fi
|
||||
if [ -z "${OSX_SKIP_DIR_CHECK}" ]; then
|
||||
OSX_SDK_ROOTS="${DEVELOPER_DIR}/SDKs"
|
||||
OSX_SDK_VERSIONS="MacOSX10.4u.sdk MacOSX10.5.sdk MacOSX10.6.sdk"
|
||||
OSX_SDK_VERSIONS="${OSX_SDK_VERSIONS} MacOSX10.7.sdk"
|
||||
for v in ${OSX_SDK_VERSIONS}; do
|
||||
if [ -d "${OSX_SDK_ROOTS}/${v}" ]; then
|
||||
osx_sdk_dir="${OSX_SDK_ROOTS}/${v}"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -d "${osx_sdk_dir}" ]; then
|
||||
add_cflags "-isysroot ${osx_sdk_dir}"
|
||||
add_ldflags "-isysroot ${osx_sdk_dir}"
|
||||
if [ -d "/Developer/SDKs/MacOSX10.4u.sdk" ]; then
|
||||
osx_sdk_dir="/Developer/SDKs/MacOSX10.4u.sdk"
|
||||
fi
|
||||
if [ -d "/Developer/SDKs/MacOSX10.5.sdk" ]; then
|
||||
osx_sdk_dir="/Developer/SDKs/MacOSX10.5.sdk"
|
||||
fi
|
||||
if [ -d "/Developer/SDKs/MacOSX10.6.sdk" ]; then
|
||||
osx_sdk_dir="/Developer/SDKs/MacOSX10.6.sdk"
|
||||
fi
|
||||
|
||||
case ${toolchain} in
|
||||
*-darwin8-*)
|
||||
add_cflags "-isysroot ${osx_sdk_dir}"
|
||||
add_cflags "-mmacosx-version-min=10.4"
|
||||
add_ldflags "-isysroot ${osx_sdk_dir}"
|
||||
add_ldflags "-mmacosx-version-min=10.4"
|
||||
;;
|
||||
*-darwin9-*)
|
||||
add_cflags "-isysroot ${osx_sdk_dir}"
|
||||
add_cflags "-mmacosx-version-min=10.5"
|
||||
add_ldflags "-isysroot ${osx_sdk_dir}"
|
||||
add_ldflags "-mmacosx-version-min=10.5"
|
||||
;;
|
||||
*-darwin10-*)
|
||||
add_cflags "-isysroot ${osx_sdk_dir}"
|
||||
add_cflags "-mmacosx-version-min=10.6"
|
||||
add_ldflags "-isysroot ${osx_sdk_dir}"
|
||||
add_ldflags "-mmacosx-version-min=10.6"
|
||||
;;
|
||||
*-darwin11-*)
|
||||
add_cflags "-mmacosx-version-min=10.7"
|
||||
add_ldflags "-mmacosx-version-min=10.7"
|
||||
;;
|
||||
*-darwin12-*)
|
||||
add_cflags "-mmacosx-version-min=10.8"
|
||||
add_ldflags "-mmacosx-version-min=10.8"
|
||||
;;
|
||||
*-darwin13-*)
|
||||
add_cflags "-mmacosx-version-min=10.9"
|
||||
add_ldflags "-mmacosx-version-min=10.9"
|
||||
;;
|
||||
esac
|
||||
|
||||
# Handle Solaris variants. Solaris 10 needs -lposix4
|
||||
case ${toolchain} in
|
||||
sparc-solaris-*)
|
||||
add_extralibs -lposix4
|
||||
disable_feature fast_unaligned
|
||||
disable fast_unaligned
|
||||
;;
|
||||
*-solaris-*)
|
||||
add_extralibs -lposix4
|
||||
@@ -775,76 +652,46 @@ process_common_toolchain() {
|
||||
|
||||
# Process ARM architecture variants
|
||||
case ${toolchain} in
|
||||
arm*)
|
||||
# on arm, isa versions are supersets
|
||||
case ${tgt_isa} in
|
||||
armv7)
|
||||
soft_enable neon
|
||||
soft_enable media
|
||||
soft_enable edsp
|
||||
soft_enable fast_unaligned
|
||||
;;
|
||||
armv6)
|
||||
soft_enable media
|
||||
soft_enable edsp
|
||||
soft_enable fast_unaligned
|
||||
;;
|
||||
armv5te)
|
||||
soft_enable edsp
|
||||
disable_feature fast_unaligned
|
||||
;;
|
||||
esac
|
||||
arm*|iwmmxt*)
|
||||
# on arm, isa versions are supersets
|
||||
enabled armv7a && soft_enable armv7 ### DEBUG
|
||||
enabled armv7 && soft_enable armv6
|
||||
enabled armv7 || enabled armv6 && soft_enable armv5te
|
||||
enabled armv7 || enabled armv6 && soft_enable fast_unaligned
|
||||
enabled iwmmxt2 && soft_enable iwmmxt
|
||||
enabled iwmmxt && soft_enable armv5te
|
||||
|
||||
asm_conversion_cmd="cat"
|
||||
asm_conversion_cmd="cat"
|
||||
|
||||
case ${tgt_cc} in
|
||||
gcc)
|
||||
CROSS=${CROSS:-arm-none-linux-gnueabi-}
|
||||
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 [ ${tgt_isa} = "armv7" ]; then
|
||||
if [ -z "${float_abi}" ]; then
|
||||
check_cpp <<EOF && float_abi=hard || float_abi=softfp
|
||||
#ifndef __ARM_PCS_VFP
|
||||
#error "not hardfp"
|
||||
#endif
|
||||
EOF
|
||||
fi
|
||||
check_add_cflags -march=armv7-a -mfloat-abi=${float_abi}
|
||||
check_add_asflags -march=armv7-a -mfloat-abi=${float_abi}
|
||||
|
||||
if enabled neon
|
||||
then
|
||||
check_add_cflags -mfpu=neon #-ftree-vectorize
|
||||
check_add_asflags -mfpu=neon
|
||||
fi
|
||||
|
||||
if [ -z "${tune_cpu}" ]; then
|
||||
tune_cpu=cortex-a8
|
||||
fi
|
||||
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
|
||||
|
||||
enabled debug && add_asflags -g
|
||||
asm_conversion_cmd="${source_path}/build/make/ads2gas.pl"
|
||||
if enabled thumb; then
|
||||
asm_conversion_cmd="$asm_conversion_cmd -thumb"
|
||||
check_add_cflags -mthumb
|
||||
check_add_asflags -mthumb -mimplicit-it=always
|
||||
fi
|
||||
;;
|
||||
vs*)
|
||||
asm_conversion_cmd="${source_path}/build/make/ads2armasm_ms.pl"
|
||||
AS_SFX=.s
|
||||
msvs_arch_dir=arm-msvs
|
||||
disable_feature multithread
|
||||
disable_feature unit_tests
|
||||
;;
|
||||
rvct)
|
||||
CC=armcc
|
||||
@@ -856,14 +703,10 @@ EOF
|
||||
tune_cflags="--cpu="
|
||||
tune_asflags="--cpu="
|
||||
if [ -z "${tune_cpu}" ]; then
|
||||
if [ ${tgt_isa} = "armv7" ]; then
|
||||
if enabled neon
|
||||
then
|
||||
check_add_cflags --fpu=softvfp+vfpv3
|
||||
check_add_asflags --fpu=softvfp+vfpv3
|
||||
fi
|
||||
check_add_cflags --cpu=Cortex-A8
|
||||
check_add_asflags --cpu=Cortex-A8
|
||||
if enabled armv7
|
||||
then
|
||||
check_add_cflags --cpu=Cortex-A8 --fpu=softvfp+vfpv3
|
||||
check_add_asflags --cpu=Cortex-A8 --fpu=softvfp+vfpv3
|
||||
else
|
||||
check_add_cflags --cpu=${tgt_isa##armv}
|
||||
check_add_asflags --cpu=${tgt_isa##armv}
|
||||
@@ -881,70 +724,38 @@ EOF
|
||||
|
||||
case ${tgt_os} in
|
||||
none*)
|
||||
disable_feature multithread
|
||||
disable_feature os_support
|
||||
disable multithread
|
||||
disable os_support
|
||||
;;
|
||||
|
||||
android*)
|
||||
SDK_PATH=${sdk_path}
|
||||
COMPILER_LOCATION=`find "${SDK_PATH}" \
|
||||
-name "arm-linux-androideabi-gcc*" -print -quit`
|
||||
TOOLCHAIN_PATH=${COMPILER_LOCATION%/*}/arm-linux-androideabi-
|
||||
CC=${TOOLCHAIN_PATH}gcc
|
||||
CXX=${TOOLCHAIN_PATH}g++
|
||||
AR=${TOOLCHAIN_PATH}ar
|
||||
LD=${TOOLCHAIN_PATH}gcc
|
||||
AS=${TOOLCHAIN_PATH}as
|
||||
STRIP=${TOOLCHAIN_PATH}strip
|
||||
NM=${TOOLCHAIN_PATH}nm
|
||||
|
||||
if [ -z "${alt_libc}" ]; then
|
||||
alt_libc=`find "${SDK_PATH}" -name arch-arm -print | \
|
||||
awk '{n = split($0,a,"/"); \
|
||||
split(a[n-1],b,"-"); \
|
||||
print $0 " " b[2]}' | \
|
||||
sort -g -k 2 | \
|
||||
awk '{ print $1 }' | tail -1`
|
||||
fi
|
||||
|
||||
add_cflags "--sysroot=${alt_libc}"
|
||||
add_ldflags "--sysroot=${alt_libc}"
|
||||
|
||||
# linker flag that routes around a CPU bug in some
|
||||
# Cortex-A8 implementations (NDK Dev Guide)
|
||||
add_ldflags "-Wl,--fix-cortex-a8"
|
||||
|
||||
enable_feature pic
|
||||
soft_enable realtime_only
|
||||
if [ ${tgt_isa} = "armv7" ]; then
|
||||
soft_enable runtime_cpu_detect
|
||||
fi
|
||||
if enabled runtime_cpu_detect; then
|
||||
add_cflags "-I${SDK_PATH}/sources/android/cpufeatures"
|
||||
fi
|
||||
;;
|
||||
|
||||
darwin*)
|
||||
|
||||
XCRUN_FIND="xcrun --sdk iphoneos -find"
|
||||
CXX="$(${XCRUN_FIND} clang++)"
|
||||
CC="$(${XCRUN_FIND} clang)"
|
||||
AR="$(${XCRUN_FIND} ar)"
|
||||
LD="$(${XCRUN_FIND} ld)"
|
||||
AS="$(${XCRUN_FIND} as)"
|
||||
STRIP="$(${XCRUN_FIND} strip)"
|
||||
NM="$(${XCRUN_FIND} nm)"
|
||||
RANLIB="$(${XCRUN_FIND} ranlib)"
|
||||
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-darwin10-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="-arch ${tgt_isa} -g"
|
||||
ASFLAGS="-version -arch ${tgt_isa} -g"
|
||||
|
||||
alt_libc="$(xcrun --sdk iphoneos --show-sdk-path)"
|
||||
add_cflags -arch ${tgt_isa} -isysroot ${alt_libc}
|
||||
add_ldflags -arch ${tgt_isa} -ios_version_min 7.0
|
||||
add_cflags -arch ${tgt_isa}
|
||||
add_ldflags -arch_only ${tgt_isa}
|
||||
|
||||
add_cflags "-isysroot ${SDK_PATH}/SDKs/iPhoneOS4.3.sdk"
|
||||
|
||||
# This should be overridable
|
||||
alt_libc=${SDK_PATH}/SDKs/iPhoneOS4.3.sdk
|
||||
|
||||
# Add the paths for the alternate libc
|
||||
for d in usr/include usr/include/gcc/darwin/4.2/ usr/lib/gcc/arm-apple-darwin10/4.2.1/include/; do
|
||||
try_dir="${alt_libc}/${d}"
|
||||
[ -d "${try_dir}" ] && add_cflags -I"${try_dir}"
|
||||
done
|
||||
|
||||
for d in lib usr/lib usr/lib/system; do
|
||||
try_dir="${alt_libc}/${d}"
|
||||
@@ -955,7 +766,7 @@ EOF
|
||||
;;
|
||||
|
||||
linux*)
|
||||
enable_feature linux
|
||||
enable linux
|
||||
if enabled rvct; then
|
||||
# Check if we have CodeSourcery GCC in PATH. Needed for
|
||||
# libraries
|
||||
@@ -978,22 +789,32 @@ EOF
|
||||
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="
|
||||
if enabled dspr2; then
|
||||
check_add_cflags -mips32r2 -mdspr2
|
||||
disable_feature fast_unaligned
|
||||
fi
|
||||
check_add_cflags -march=${tgt_isa}
|
||||
check_add_asflags -march=${tgt_isa}
|
||||
check_add_asflags -KPIC
|
||||
check_add_asflags -march=${tgt_isa}
|
||||
check_add_asflags -KPIC
|
||||
;;
|
||||
ppc*)
|
||||
enable_feature ppc
|
||||
enable ppc
|
||||
bits=${tgt_isa##ppc}
|
||||
link_with_cc=gcc
|
||||
setup_gnu_toolchain
|
||||
@@ -1018,11 +839,13 @@ EOF
|
||||
x86*)
|
||||
bits=32
|
||||
enabled x86_64 && bits=64
|
||||
check_cpp <<EOF && bits=x32
|
||||
#ifndef __ILP32__
|
||||
#error "not x32"
|
||||
#endif
|
||||
EOF
|
||||
soft_enable runtime_cpu_detect
|
||||
soft_enable mmx
|
||||
soft_enable sse
|
||||
soft_enable sse2
|
||||
soft_enable sse3
|
||||
soft_enable ssse3
|
||||
soft_enable sse4_1
|
||||
|
||||
case ${tgt_os} in
|
||||
win*)
|
||||
@@ -1030,13 +853,9 @@ EOF
|
||||
;;
|
||||
solaris*)
|
||||
CC=${CC:-${CROSS}gcc}
|
||||
CXX=${CXX:-${CROSS}g++}
|
||||
LD=${LD:-${CROSS}gcc}
|
||||
CROSS=${CROSS:-g}
|
||||
;;
|
||||
os2)
|
||||
AS=${AS:-nasm}
|
||||
;;
|
||||
esac
|
||||
|
||||
AS="${alt_as:-${AS:-auto}}"
|
||||
@@ -1045,11 +864,9 @@ EOF
|
||||
CC=${CC:-icc}
|
||||
LD=${LD:-icc}
|
||||
setup_gnu_toolchain
|
||||
add_cflags -use-msasm # remove -use-msasm too?
|
||||
# add -no-intel-extensions to suppress warning #10237
|
||||
# refer to http://software.intel.com/en-us/forums/topic/280199
|
||||
add_ldflags -i-static -no-intel-extensions
|
||||
enabled x86_64 && add_cflags -ipo -static -O3 -no-prec-div
|
||||
add_cflags -use-msasm -use-asm
|
||||
add_ldflags -i-static
|
||||
enabled x86_64 && add_cflags -ipo -no-prec-div -static -xSSE2 -axSSE2
|
||||
enabled x86_64 && AR=xiar
|
||||
case ${tune_cpu} in
|
||||
atom*)
|
||||
@@ -1060,67 +877,25 @@ EOF
|
||||
tune_cflags="-march="
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
;;
|
||||
gcc*)
|
||||
add_cflags -m${bits}
|
||||
add_cflags -m${bits}
|
||||
add_ldflags -m${bits}
|
||||
link_with_cc=gcc
|
||||
tune_cflags="-march="
|
||||
setup_gnu_toolchain
|
||||
setup_gnu_toolchain
|
||||
#for 32 bit x86 builds, -O3 did not turn on this flag
|
||||
enabled optimizations && disabled gprof && check_add_cflags -fomit-frame-pointer
|
||||
;;
|
||||
vs*)
|
||||
# When building with Microsoft Visual Studio the assembler is
|
||||
# invoked directly. Checking at configure time is unnecessary.
|
||||
# Skip the check by setting AS arbitrarily
|
||||
AS=msvs
|
||||
msvs_arch_dir=x86-msvs
|
||||
vc_version=${tgt_cc##vs}
|
||||
case $vc_version in
|
||||
7|8|9|10)
|
||||
echo "${tgt_cc} does not support avx/avx2, disabling....."
|
||||
RTCD_OPTIONS="${RTCD_OPTIONS}--disable-avx --disable-avx2 "
|
||||
soft_disable avx
|
||||
soft_disable avx2
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
enabled optimizations && check_add_cflags -fomit-frame-pointer
|
||||
;;
|
||||
esac
|
||||
|
||||
soft_enable runtime_cpu_detect
|
||||
soft_enable mmx
|
||||
soft_enable sse
|
||||
soft_enable sse2
|
||||
soft_enable sse3
|
||||
soft_enable ssse3
|
||||
# We can't use 'check_cflags' until the compiler is configured and CC is
|
||||
# populated.
|
||||
if enabled gcc && ! disabled sse4_1 && ! check_cflags -msse4; then
|
||||
RTCD_OPTIONS="${RTCD_OPTIONS}--disable-sse4_1 "
|
||||
else
|
||||
soft_enable sse4_1
|
||||
fi
|
||||
|
||||
if enabled gcc && ! disabled avx && ! check_cflags -mavx; then
|
||||
RTCD_OPTIONS="${RTCD_OPTIONS}--disable-avx "
|
||||
else
|
||||
soft_enable avx
|
||||
fi
|
||||
|
||||
if enabled gcc && ! disabled avx2 && ! check_cflags -mavx2; then
|
||||
RTCD_OPTIONS="${RTCD_OPTIONS}--disable-avx2 "
|
||||
else
|
||||
soft_enable avx2
|
||||
fi
|
||||
|
||||
case "${AS}" in
|
||||
auto|"")
|
||||
which nasm >/dev/null 2>&1 && AS=nasm
|
||||
which yasm >/dev/null 2>&1 && AS=yasm
|
||||
[ "${AS}" = auto -o -z "${AS}" ] \
|
||||
&& die "Neither yasm nor nasm have been found"
|
||||
;;
|
||||
;;
|
||||
esac
|
||||
log_echo " using $AS"
|
||||
[ "${AS##*/}" = nasm ] && add_asflags -Ox
|
||||
@@ -1129,14 +904,12 @@ EOF
|
||||
win32)
|
||||
add_asflags -f win32
|
||||
enabled debug && add_asflags -g cv8
|
||||
EXE_SFX=.exe
|
||||
;;
|
||||
win64)
|
||||
add_asflags -f x64
|
||||
enabled debug && add_asflags -g cv8
|
||||
EXE_SFX=.exe
|
||||
;;
|
||||
linux*|solaris*|android*)
|
||||
linux*|solaris*)
|
||||
add_asflags -f elf${bits}
|
||||
enabled debug && [ "${AS}" = yasm ] && add_asflags -g dwarf2
|
||||
enabled debug && [ "${AS}" = nasm ] && add_asflags -g
|
||||
@@ -1153,18 +926,13 @@ EOF
|
||||
# enabled icc && ! enabled pic && add_cflags -fno-pic -mdynamic-no-pic
|
||||
enabled icc && ! enabled pic && add_cflags -fno-pic
|
||||
;;
|
||||
os2)
|
||||
add_asflags -f aout
|
||||
enabled debug && add_asflags -g
|
||||
EXE_SFX=.exe
|
||||
;;
|
||||
*) log "Warning: Unknown os $tgt_os while setting up $AS flags"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
universal*|*-gcc|generic-gnu)
|
||||
link_with_cc=gcc
|
||||
enable_feature gcc
|
||||
enable gcc
|
||||
setup_gnu_toolchain
|
||||
;;
|
||||
esac
|
||||
@@ -1198,58 +966,34 @@ EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
# default use_x86inc to yes if pic is no or 64bit or we are not on darwin
|
||||
echo " checking here for x86inc \"${tgt_isa}\" \"$pic\" "
|
||||
if [ ${tgt_isa} = x86_64 -o ! "$pic" = "yes" -o "${tgt_os#darwin}" = "${tgt_os}" ]; then
|
||||
soft_enable use_x86inc
|
||||
fi
|
||||
|
||||
# Position Independent Code (PIC) support, for building relocatable
|
||||
# shared objects
|
||||
enabled gcc && enabled pic && check_add_cflags -fPIC
|
||||
|
||||
# Work around longjmp interception on glibc >= 2.11, to improve binary
|
||||
# compatibility. See http://code.google.com/p/webm/issues/detail?id=166
|
||||
enabled linux && check_add_cflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
|
||||
enabled linux && check_add_cflags -D_FORTIFY_SOURCE=0
|
||||
|
||||
# Check for strip utility variant
|
||||
${STRIP} -V 2>/dev/null | grep GNU >/dev/null && enable_feature gnu_strip
|
||||
${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_feature big_endian
|
||||
|
||||
# Try to find which inline keywords are supported
|
||||
check_cc <<EOF && INLINE="inline"
|
||||
static inline function() {}
|
||||
EOF
|
||||
check_cc <<EOF && INLINE="__inline__ __attribute__((always_inline))"
|
||||
static __attribute__((always_inline)) function() {}
|
||||
EOF
|
||||
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*-vs*);;
|
||||
*-android-gcc);;
|
||||
*-win*);;
|
||||
*) check_header pthread.h && add_extralibs -lpthread
|
||||
esac
|
||||
fi
|
||||
|
||||
# only for MIPS platforms
|
||||
case ${toolchain} in
|
||||
mips*)
|
||||
if enabled dspr2; then
|
||||
if enabled big_endian; then
|
||||
echo "dspr2 optimizations are available only for little endian platforms"
|
||||
disable_feature dspr2
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
# for sysconf(3) and friends.
|
||||
check_header unistd.h
|
||||
|
||||
# glibc needs these
|
||||
if enabled linux; then
|
||||
@@ -1296,8 +1040,8 @@ print_config_h() {
|
||||
|
||||
print_webm_license() {
|
||||
local destination=$1
|
||||
local prefix="$2"
|
||||
local suffix="$3"
|
||||
local prefix=$2
|
||||
local suffix=$3
|
||||
shift 3
|
||||
cat <<EOF > ${destination}
|
||||
${prefix} Copyright (c) 2011 The WebM project authors. All Rights Reserved.${suffix}
|
||||
@@ -1318,8 +1062,8 @@ process_detect() {
|
||||
true;
|
||||
}
|
||||
|
||||
enable_feature logging
|
||||
logfile="config.log"
|
||||
enable logging
|
||||
logfile="config.err"
|
||||
self=$0
|
||||
process() {
|
||||
cmdline_args="$@"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
##
|
||||
## Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
##
|
||||
@@ -42,7 +42,7 @@ done
|
||||
|
||||
[ -n "$srcfile" ] || show_help
|
||||
sfx=${sfx:-asm}
|
||||
includes=$(LC_ALL=C egrep -i "include +\"?[a-z0-9_/]+\.${sfx}" $srcfile |
|
||||
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
|
||||
|
||||
@@ -26,7 +26,6 @@ Options:
|
||||
--help Print this message
|
||||
--exe Generate a project for building an Application
|
||||
--lib Generate a project for creating a static library
|
||||
--dll Generate a project for creating a dll
|
||||
--static-crt Use the static C runtime (/MT)
|
||||
--target=isa-os-cc Target specifier (required)
|
||||
--out=filename Write output to a file [stdout]
|
||||
@@ -143,9 +142,7 @@ generate_filter() {
|
||||
if [ "${f##*.}" == "$pat" ]; then
|
||||
unset file_list[i]
|
||||
|
||||
objf=$(echo ${f%.*}.obj | sed -e 's/^[\./]\+//g' -e 's,/,_,g')
|
||||
open_tag File RelativePath="./$f"
|
||||
|
||||
if [ "$pat" == "asm" ] && $asm_use_custom_step; then
|
||||
for plat in "${platforms[@]}"; do
|
||||
for cfg in Debug Release; do
|
||||
@@ -155,27 +152,14 @@ generate_filter() {
|
||||
tag Tool \
|
||||
Name="VCCustomBuildTool" \
|
||||
Description="Assembling \$(InputFileName)" \
|
||||
CommandLine="$(eval echo \$asm_${cfg}_cmdline) -o \$(IntDir)$objf" \
|
||||
Outputs="\$(IntDir)$objf" \
|
||||
CommandLine="$(eval echo \$asm_${cfg}_cmdline)" \
|
||||
Outputs="\$(InputName).obj" \
|
||||
|
||||
close_tag FileConfiguration
|
||||
done
|
||||
done
|
||||
fi
|
||||
if [ "$pat" == "c" ] || [ "$pat" == "cc" ] ; then
|
||||
for plat in "${platforms[@]}"; do
|
||||
for cfg in Debug Release; do
|
||||
open_tag FileConfiguration \
|
||||
Name="${cfg}|${plat}" \
|
||||
|
||||
tag Tool \
|
||||
Name="VCCLCompilerTool" \
|
||||
ObjectFile="\$(IntDir)$objf" \
|
||||
|
||||
close_tag FileConfiguration
|
||||
done
|
||||
done
|
||||
fi
|
||||
close_tag File
|
||||
|
||||
break
|
||||
@@ -206,8 +190,6 @@ for opt in "$@"; do
|
||||
;;
|
||||
--exe) proj_kind="exe"
|
||||
;;
|
||||
--dll) proj_kind="dll"
|
||||
;;
|
||||
--lib) proj_kind="lib"
|
||||
;;
|
||||
--src-path-bare=*) src_path_bare="$optval"
|
||||
@@ -260,15 +242,10 @@ uses_asm=${uses_asm:-false}
|
||||
case "${vs_ver:-8}" in
|
||||
7) vs_ver_id="7.10"
|
||||
asm_use_custom_step=$uses_asm
|
||||
warn_64bit='Detect64BitPortabilityProblems=true'
|
||||
;;
|
||||
8) vs_ver_id="8.00"
|
||||
asm_use_custom_step=$uses_asm
|
||||
warn_64bit='Detect64BitPortabilityProblems=true'
|
||||
;;
|
||||
9) vs_ver_id="9.00"
|
||||
asm_use_custom_step=$uses_asm
|
||||
warn_64bit='Detect64BitPortabilityProblems=false'
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -307,11 +284,10 @@ esac
|
||||
case "$target" in
|
||||
x86_64*)
|
||||
platforms[0]="x64"
|
||||
asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
|
||||
asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "\$(InputPath)""
|
||||
;;
|
||||
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)""
|
||||
;;
|
||||
@@ -323,8 +299,6 @@ generate_vcproj() {
|
||||
case "$proj_kind" in
|
||||
exe) vs_ConfigurationType=1
|
||||
;;
|
||||
dll) vs_ConfigurationType=2
|
||||
;;
|
||||
*) vs_ConfigurationType=4
|
||||
;;
|
||||
esac
|
||||
@@ -344,6 +318,13 @@ generate_vcproj() {
|
||||
done
|
||||
close_tag Platforms
|
||||
|
||||
open_tag ToolFiles
|
||||
case "$target" in
|
||||
x86*) $uses_asm && tag ToolFile RelativePath="$self_dirname/../x86-msvs/yasm.rules"
|
||||
;;
|
||||
esac
|
||||
close_tag ToolFiles
|
||||
|
||||
open_tag Configurations
|
||||
for plat in "${platforms[@]}"; do
|
||||
plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'`
|
||||
@@ -365,8 +346,8 @@ generate_vcproj() {
|
||||
PreprocessorDefinitions="WIN32;DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE" \
|
||||
RuntimeLibrary="$debug_runtime" \
|
||||
WarningLevel="3" \
|
||||
Detect64BitPortabilityProblems="true" \
|
||||
DebugInformationFormat="1" \
|
||||
$warn_64bit \
|
||||
;;
|
||||
vpx)
|
||||
tag Tool \
|
||||
@@ -381,8 +362,8 @@ generate_vcproj() {
|
||||
RuntimeLibrary="$debug_runtime" \
|
||||
UsePrecompiledHeader="0" \
|
||||
WarningLevel="3" \
|
||||
DebugInformationFormat="2" \
|
||||
$warn_64bit \
|
||||
DebugInformationFormat="1" \
|
||||
Detect64BitPortabilityProblems="true" \
|
||||
|
||||
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs" Debug="true"
|
||||
;;
|
||||
@@ -395,8 +376,8 @@ generate_vcproj() {
|
||||
RuntimeLibrary="$debug_runtime" \
|
||||
UsePrecompiledHeader="0" \
|
||||
WarningLevel="3" \
|
||||
DebugInformationFormat="2" \
|
||||
$warn_64bit \
|
||||
DebugInformationFormat="1" \
|
||||
Detect64BitPortabilityProblems="true" \
|
||||
|
||||
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs" Debug="true"
|
||||
;;
|
||||
@@ -473,8 +454,8 @@ generate_vcproj() {
|
||||
RuntimeLibrary="$release_runtime" \
|
||||
UsePrecompiledHeader="0" \
|
||||
WarningLevel="3" \
|
||||
Detect64BitPortabilityProblems="true" \
|
||||
DebugInformationFormat="0" \
|
||||
$warn_64bit \
|
||||
;;
|
||||
vpx)
|
||||
tag Tool \
|
||||
@@ -491,7 +472,7 @@ generate_vcproj() {
|
||||
UsePrecompiledHeader="0" \
|
||||
WarningLevel="3" \
|
||||
DebugInformationFormat="0" \
|
||||
$warn_64bit \
|
||||
Detect64BitPortabilityProblems="true" \
|
||||
|
||||
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs"
|
||||
;;
|
||||
@@ -506,7 +487,7 @@ generate_vcproj() {
|
||||
UsePrecompiledHeader="0" \
|
||||
WarningLevel="3" \
|
||||
DebugInformationFormat="0" \
|
||||
$warn_64bit \
|
||||
Detect64BitPortabilityProblems="true" \
|
||||
|
||||
$uses_asm && tag Tool Name="YASM" IncludePaths="$incs"
|
||||
;;
|
||||
|
||||
@@ -25,7 +25,7 @@ files.
|
||||
Options:
|
||||
--help Print this message
|
||||
--out=outfile Redirect output to a file
|
||||
--ver=version Version (7,8,9,10,11) of visual studio to generate for
|
||||
--ver=version Version (7,8,9) of visual studio to generate for
|
||||
--target=isa-os-cc Target specifier
|
||||
EOF
|
||||
exit 1
|
||||
@@ -55,38 +55,22 @@ indent_pop() {
|
||||
|
||||
parse_project() {
|
||||
local file=$1
|
||||
if [ "$sfx" = "vcproj" ]; then
|
||||
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}'`
|
||||
else
|
||||
local name=`grep RootNamespace "$file" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'`
|
||||
local guid=`grep ProjectGuid "$file" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'`
|
||||
fi
|
||||
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%%.${sfx}}
|
||||
var=${var%%.vcproj}
|
||||
eval "${var}_file=\"$1\""
|
||||
eval "${var}_name=$name"
|
||||
eval "${var}_guid=$guid"
|
||||
|
||||
if [ "$sfx" = "vcproj" ]; then
|
||||
cur_config_list=`grep -A1 '<Configuration' $file |
|
||||
grep Name | cut -d\" -f2`
|
||||
else
|
||||
cur_config_list=`grep -B1 'Label="Configuration"' $file |
|
||||
grep Condition | cut -d\' -f4`
|
||||
fi
|
||||
new_config_list=$(for i in $config_list $cur_config_list; do
|
||||
echo $i
|
||||
done | sort | uniq)
|
||||
if [ "$config_list" != "" ] && [ "$config_list" != "$new_config_list" ]; then
|
||||
mixed_platforms=1
|
||||
fi
|
||||
config_list="$new_config_list"
|
||||
eval "${var}_config_list=\"$cur_config_list\""
|
||||
# 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}"
|
||||
}
|
||||
|
||||
@@ -99,14 +83,14 @@ process_project() {
|
||||
# vcproj file without the extension
|
||||
local var
|
||||
var=${file##*/}
|
||||
var=${var%%.${sfx}}
|
||||
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" ] && [ "$sfx" = "vcproj" ]; then
|
||||
if [ -n "$deps" ]; then
|
||||
echo "${indent}ProjectSection(ProjectDependencies) = postProject"
|
||||
indent_push
|
||||
|
||||
@@ -136,11 +120,6 @@ process_global() {
|
||||
indent_push
|
||||
IFS_bak=${IFS}
|
||||
IFS=$'\r'$'\n'
|
||||
if [ "$mixed_platforms" != "" ]; then
|
||||
config_list="
|
||||
Release|Mixed Platforms
|
||||
Debug|Mixed Platforms"
|
||||
fi
|
||||
for config in ${config_list}; do
|
||||
echo "${indent}$config = $config"
|
||||
done
|
||||
@@ -155,17 +134,10 @@ Debug|Mixed Platforms"
|
||||
indent_push
|
||||
for proj in ${proj_list}; do
|
||||
eval "local proj_guid=\${${proj}_guid}"
|
||||
eval "local proj_config_list=\${${proj}_config_list}"
|
||||
IFS=$'\r'$'\n'
|
||||
for config in ${proj_config_list}; do
|
||||
if [ "$mixed_platforms" != "" ]; then
|
||||
local c=${config%%|*}
|
||||
echo "${indent}${proj_guid}.${c}|Mixed Platforms.ActiveCfg = ${config}"
|
||||
echo "${indent}${proj_guid}.${c}|Mixed Platforms.Build.0 = ${config}"
|
||||
else
|
||||
echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}"
|
||||
echo "${indent}${proj_guid}.${config}.Build.0 = ${config}"
|
||||
fi
|
||||
for config in ${config_list}; do
|
||||
echo "${indent}${proj_guid}.${config}.ActiveCfg = ${config}"
|
||||
echo "${indent}${proj_guid}.${config}.Build.0 = ${config}"
|
||||
|
||||
done
|
||||
IFS=${IFS_bak}
|
||||
@@ -191,14 +163,9 @@ process_makefile() {
|
||||
IFS=$'\r'$'\n'
|
||||
local TAB=$'\t'
|
||||
cat <<EOF
|
||||
ifeq (\$(CONFIG_VS_VERSION),7)
|
||||
MSBUILD_TOOL := devenv.com
|
||||
else
|
||||
MSBUILD_TOOL := msbuild.exe
|
||||
endif
|
||||
found_devenv := \$(shell which \$(MSBUILD_TOOL) >/dev/null 2>&1 && echo yes)
|
||||
found_devenv := \$(shell which devenv.com >/dev/null 2>&1 && echo yes)
|
||||
.nodevenv.once:
|
||||
${TAB}@echo " * \$(MSBUILD_TOOL) not found in path."
|
||||
${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,"
|
||||
@@ -223,17 +190,16 @@ ${TAB}rm -rf "$platform"/"$config"
|
||||
ifneq (\$(found_devenv),)
|
||||
ifeq (\$(CONFIG_VS_VERSION),7)
|
||||
$nows_sln_config: $outfile
|
||||
${TAB}\$(MSBUILD_TOOL) $outfile -build "$config"
|
||||
${TAB}devenv.com $outfile -build "$config"
|
||||
|
||||
else
|
||||
$nows_sln_config: $outfile
|
||||
${TAB}\$(MSBUILD_TOOL) $outfile -m -t:Build \\
|
||||
${TAB}${TAB}-p:Configuration="$config" -p:Platform="$platform"
|
||||
${TAB}devenv.com $outfile -build "$sln_config"
|
||||
|
||||
endif
|
||||
else
|
||||
$nows_sln_config: $outfile .nodevenv.once
|
||||
${TAB}@echo " * Skipping build of $sln_config (\$(MSBUILD_TOOL) not in path)."
|
||||
${TAB}@echo " * Skipping build of $sln_config (devenv.com not in path)."
|
||||
${TAB}@echo " * "
|
||||
endif
|
||||
|
||||
@@ -255,7 +221,7 @@ for opt in "$@"; do
|
||||
;;
|
||||
--ver=*) vs_ver="$optval"
|
||||
case $optval in
|
||||
[789]|10|11|12)
|
||||
[789])
|
||||
;;
|
||||
*) die Unrecognized Visual Studio Version in $opt
|
||||
;;
|
||||
@@ -291,23 +257,6 @@ case "${vs_ver:-8}" in
|
||||
9) sln_vers="10.00"
|
||||
sln_vers_str="Visual Studio 2008"
|
||||
;;
|
||||
10) sln_vers="11.00"
|
||||
sln_vers_str="Visual Studio 2010"
|
||||
;;
|
||||
11) sln_vers="12.00"
|
||||
sln_vers_str="Visual Studio 2012"
|
||||
;;
|
||||
12) sln_vers="12.00"
|
||||
sln_vers_str="Visual Studio 2013"
|
||||
;;
|
||||
esac
|
||||
case "${vs_ver:-8}" in
|
||||
[789])
|
||||
sfx=vcproj
|
||||
;;
|
||||
10|11|12)
|
||||
sfx=vcxproj
|
||||
;;
|
||||
esac
|
||||
|
||||
for f in "${file_list[@]}"; do
|
||||
|
||||
@@ -1,544 +0,0 @@
|
||||
#!/bin/bash
|
||||
##
|
||||
## Copyright (c) 2013 The WebM project authors. All Rights Reserved.
|
||||
##
|
||||
## Use of this source code is governed by a BSD-style license
|
||||
## that can be found in the LICENSE file in the root of the source
|
||||
## tree. An additional intellectual property rights grant can be found
|
||||
## in the file PATENTS. All contributing project authors may
|
||||
## be found in the AUTHORS file in the root of the source tree.
|
||||
##
|
||||
|
||||
|
||||
self=$0
|
||||
self_basename=${self##*/}
|
||||
self_dirname=$(dirname "$0")
|
||||
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
|
||||
--dll Generate a project for creating a dll
|
||||
--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 (10,11,12) of visual studio to generate for
|
||||
--src-path-bare=dir Path to root of source tree
|
||||
-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
|
||||
}
|
||||
|
||||
tag_content() {
|
||||
local tag=$1
|
||||
local content=$2
|
||||
shift
|
||||
shift
|
||||
if [ $# -ne 0 ]; then
|
||||
echo "${indent}<${tag}"
|
||||
indent_push
|
||||
tag_attributes "$@"
|
||||
echo "${indent}>${content}</${tag}>"
|
||||
indent_pop
|
||||
else
|
||||
echo "${indent}<${tag}>${content}</${tag}>"
|
||||
fi
|
||||
}
|
||||
|
||||
generate_filter() {
|
||||
local name=$1
|
||||
local pats=$2
|
||||
local file_list_sz
|
||||
local i
|
||||
local f
|
||||
local saveIFS="$IFS"
|
||||
local pack
|
||||
echo "generating filter '$name' from ${#file_list[@]} files" >&2
|
||||
IFS=*
|
||||
|
||||
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]
|
||||
|
||||
objf=$(echo ${f%.*}.obj | sed -e 's/^[\./]\+//g' -e 's,/,_,g')
|
||||
|
||||
if ([ "$pat" == "asm" ] || [ "$pat" == "s" ]) && $asm_use_custom_step; then
|
||||
open_tag CustomBuild \
|
||||
Include=".\\$f"
|
||||
for plat in "${platforms[@]}"; do
|
||||
for cfg in Debug Release; do
|
||||
tag_content Message "Assembling %(Filename)%(Extension)" \
|
||||
Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
|
||||
tag_content Command "$(eval echo \$asm_${cfg}_cmdline) -o \$(IntDir)$objf" \
|
||||
Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
|
||||
tag_content Outputs "\$(IntDir)$objf" \
|
||||
Condition="'\$(Configuration)|\$(Platform)'=='$cfg|$plat'"
|
||||
done
|
||||
done
|
||||
close_tag CustomBuild
|
||||
elif [ "$pat" == "c" ] || [ "$pat" == "cc" ] ; then
|
||||
open_tag ClCompile \
|
||||
Include=".\\$f"
|
||||
# Separate file names with Condition?
|
||||
tag_content ObjectFileName "\$(IntDir)$objf"
|
||||
close_tag ClCompile
|
||||
elif [ "$pat" == "h" ] ; then
|
||||
tag ClInclude \
|
||||
Include=".\\$f"
|
||||
elif [ "$pat" == "vcxproj" ] ; then
|
||||
open_tag ProjectReference \
|
||||
Include="$f"
|
||||
depguid=`grep ProjectGuid "$f" | sed 's,.*<.*>\(.*\)</.*>.*,\1,'`
|
||||
tag_content Project "$depguid"
|
||||
tag_content ReferenceOutputAssembly false
|
||||
close_tag ProjectReference
|
||||
else
|
||||
tag None \
|
||||
Include=".\\$f"
|
||||
fi
|
||||
|
||||
break
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
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=*) module_def="${optval}"
|
||||
;;
|
||||
--exe) proj_kind="exe"
|
||||
;;
|
||||
--dll) proj_kind="dll"
|
||||
;;
|
||||
--lib) proj_kind="lib"
|
||||
;;
|
||||
--src-path-bare=*) src_path_bare="$optval"
|
||||
;;
|
||||
--static-crt) use_static_runtime=true
|
||||
;;
|
||||
--ver=*)
|
||||
vs_ver="$optval"
|
||||
case "$optval" in
|
||||
10|11|12)
|
||||
;;
|
||||
*) 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)/\$(Configuration)"
|
||||
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|*.s) 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:-11}" in
|
||||
10|11|12)
|
||||
asm_use_custom_step=$uses_asm
|
||||
;;
|
||||
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=MultiThreaded
|
||||
debug_runtime=MultiThreadedDebug
|
||||
lib_sfx=mt
|
||||
else
|
||||
release_runtime=MultiThreadedDLL
|
||||
debug_runtime=MultiThreadedDebugDLL
|
||||
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
|
||||
debug_libs=${debug_libs// /;}
|
||||
libs=${libs// /;}
|
||||
|
||||
|
||||
# List of all platforms supported for this target
|
||||
case "$target" in
|
||||
x86_64*)
|
||||
platforms[0]="x64"
|
||||
asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "%(FullPath)""
|
||||
asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "%(FullPath)""
|
||||
;;
|
||||
x86*)
|
||||
platforms[0]="Win32"
|
||||
asm_Debug_cmdline="yasm -Xvc -g cv8 -f \$(PlatformName) ${yasmincs} "%(FullPath)""
|
||||
asm_Release_cmdline="yasm -Xvc -f \$(PlatformName) ${yasmincs} "%(FullPath)""
|
||||
;;
|
||||
arm*)
|
||||
asm_Debug_cmdline="armasm -nologo "%(FullPath)""
|
||||
asm_Release_cmdline="armasm -nologo "%(FullPath)""
|
||||
if [ "$name" = "obj_int_extract" ]; then
|
||||
# We don't want to build this tool for the target architecture,
|
||||
# but for an architecture we can run locally during the build.
|
||||
platforms[0]="Win32"
|
||||
else
|
||||
platforms[0]="ARM"
|
||||
fi
|
||||
;;
|
||||
*) die "Unsupported target $target!"
|
||||
;;
|
||||
esac
|
||||
|
||||
generate_vcxproj() {
|
||||
echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
|
||||
open_tag Project \
|
||||
DefaultTargets="Build" \
|
||||
ToolsVersion="4.0" \
|
||||
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" \
|
||||
|
||||
open_tag ItemGroup \
|
||||
Label="ProjectConfigurations"
|
||||
for plat in "${platforms[@]}"; do
|
||||
for config in Debug Release; do
|
||||
open_tag ProjectConfiguration \
|
||||
Include="$config|$plat"
|
||||
tag_content Configuration $config
|
||||
tag_content Platform $plat
|
||||
close_tag ProjectConfiguration
|
||||
done
|
||||
done
|
||||
close_tag ItemGroup
|
||||
|
||||
open_tag PropertyGroup \
|
||||
Label="Globals"
|
||||
tag_content ProjectGuid "{${guid}}"
|
||||
tag_content RootNamespace ${name}
|
||||
tag_content Keyword ManagedCProj
|
||||
close_tag PropertyGroup
|
||||
|
||||
tag Import \
|
||||
Project="\$(VCTargetsPath)\\Microsoft.Cpp.Default.props"
|
||||
|
||||
for plat in "${platforms[@]}"; do
|
||||
for config in Release Debug; do
|
||||
open_tag PropertyGroup \
|
||||
Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'" \
|
||||
Label="Configuration"
|
||||
if [ "$proj_kind" = "exe" ]; then
|
||||
tag_content ConfigurationType Application
|
||||
elif [ "$proj_kind" = "dll" ]; then
|
||||
tag_content ConfigurationType DynamicLibrary
|
||||
else
|
||||
tag_content ConfigurationType StaticLibrary
|
||||
fi
|
||||
if [ "$vs_ver" = "11" ]; then
|
||||
if [ "$plat" = "ARM" ]; then
|
||||
# Setting the wp80 toolchain automatically sets the
|
||||
# WINAPI_FAMILY define, which is required for building
|
||||
# code for arm with the windows headers. Alternatively,
|
||||
# one could add AppContainerApplication=true in the Globals
|
||||
# section and add PrecompiledHeader=NotUsing and
|
||||
# CompileAsWinRT=false in ClCompile and SubSystem=Console
|
||||
# in Link.
|
||||
tag_content PlatformToolset v110_wp80
|
||||
else
|
||||
tag_content PlatformToolset v110
|
||||
fi
|
||||
fi
|
||||
if [ "$vs_ver" = "12" ]; then
|
||||
if [ "$plat" = "ARM" ]; then
|
||||
# Setting the wp80 toolchain automatically sets the
|
||||
# WINAPI_FAMILY define, which is required for building
|
||||
# code for arm with the windows headers. Alternatively,
|
||||
# one could add AppContainerApplication=true in the Globals
|
||||
# section and add PrecompiledHeader=NotUsing and
|
||||
# CompileAsWinRT=false in ClCompile and SubSystem=Console
|
||||
# in Link.
|
||||
tag_content PlatformToolset v120_wp80
|
||||
else
|
||||
tag_content PlatformToolset v120
|
||||
fi
|
||||
fi
|
||||
tag_content CharacterSet Unicode
|
||||
if [ "$config" = "Release" ]; then
|
||||
tag_content WholeProgramOptimization true
|
||||
fi
|
||||
close_tag PropertyGroup
|
||||
done
|
||||
done
|
||||
|
||||
tag Import \
|
||||
Project="\$(VCTargetsPath)\\Microsoft.Cpp.props"
|
||||
|
||||
open_tag ImportGroup \
|
||||
Label="PropertySheets"
|
||||
tag Import \
|
||||
Project="\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props" \
|
||||
Condition="exists('\$(UserRootDir)\\Microsoft.Cpp.\$(Platform).user.props')" \
|
||||
Label="LocalAppDataPlatform"
|
||||
close_tag ImportGroup
|
||||
|
||||
tag PropertyGroup \
|
||||
Label="UserMacros"
|
||||
|
||||
for plat in "${platforms[@]}"; do
|
||||
plat_no_ws=`echo $plat | sed 's/[^A-Za-z0-9_]/_/g'`
|
||||
for config in Debug Release; do
|
||||
open_tag PropertyGroup \
|
||||
Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'"
|
||||
tag_content OutDir "\$(SolutionDir)$plat_no_ws\\\$(Configuration)\\"
|
||||
tag_content IntDir "$plat_no_ws\\\$(Configuration)\\${name}\\"
|
||||
close_tag PropertyGroup
|
||||
done
|
||||
done
|
||||
|
||||
for plat in "${platforms[@]}"; do
|
||||
for config in Debug Release; do
|
||||
open_tag ItemDefinitionGroup \
|
||||
Condition="'\$(Configuration)|\$(Platform)'=='$config|$plat'"
|
||||
if [ "$name" = "vpx" ]; then
|
||||
open_tag PreBuildEvent
|
||||
tag_content Command "call obj_int_extract.bat $src_path_bare"
|
||||
close_tag PreBuildEvent
|
||||
fi
|
||||
open_tag ClCompile
|
||||
if [ "$config" = "Debug" ]; then
|
||||
opt=Disabled
|
||||
runtime=$debug_runtime
|
||||
curlibs=$debug_libs
|
||||
confsuffix=d
|
||||
case "$name" in
|
||||
obj_int_extract)
|
||||
debug=DEBUG
|
||||
;;
|
||||
*)
|
||||
debug=_DEBUG
|
||||
;;
|
||||
esac
|
||||
else
|
||||
opt=MaxSpeed
|
||||
runtime=$release_runtime
|
||||
curlibs=$libs
|
||||
confsuffix=""
|
||||
tag_content FavorSizeOrSpeed Speed
|
||||
debug=NDEBUG
|
||||
fi
|
||||
case "$name" in
|
||||
obj_int_extract)
|
||||
extradefines=";_CONSOLE"
|
||||
;;
|
||||
*)
|
||||
extradefines=";$defines"
|
||||
;;
|
||||
esac
|
||||
tag_content Optimization $opt
|
||||
tag_content AdditionalIncludeDirectories "$incs;%(AdditionalIncludeDirectories)"
|
||||
tag_content PreprocessorDefinitions "WIN32;$debug;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE$extradefines;%(PreprocessorDefinitions)"
|
||||
tag_content RuntimeLibrary $runtime
|
||||
tag_content WarningLevel Level3
|
||||
# DebugInformationFormat
|
||||
close_tag ClCompile
|
||||
case "$proj_kind" in
|
||||
exe)
|
||||
open_tag Link
|
||||
if [ "$name" = "obj_int_extract" ]; then
|
||||
tag_content OutputFile "${name}.exe"
|
||||
else
|
||||
tag_content AdditionalDependencies "$curlibs"
|
||||
tag_content AdditionalLibraryDirectories "$libdirs;%(AdditionalLibraryDirectories)"
|
||||
fi
|
||||
tag_content GenerateDebugInformation true
|
||||
close_tag Link
|
||||
;;
|
||||
dll)
|
||||
open_tag Link
|
||||
tag_content GenerateDebugInformation true
|
||||
tag_content ModuleDefinitionFile $module_def
|
||||
close_tag Link
|
||||
;;
|
||||
lib)
|
||||
open_tag Lib
|
||||
tag_content OutputFile "\$(OutDir)${name}${lib_sfx}${confsuffix}.lib"
|
||||
close_tag Lib
|
||||
;;
|
||||
esac
|
||||
close_tag ItemDefinitionGroup
|
||||
done
|
||||
|
||||
done
|
||||
|
||||
open_tag ItemGroup
|
||||
generate_filter "Source Files" "c;cc;def;odl;idl;hpj;bat;asm;asmx;s"
|
||||
close_tag ItemGroup
|
||||
open_tag ItemGroup
|
||||
generate_filter "Header Files" "h;hm;inl;inc;xsd"
|
||||
close_tag ItemGroup
|
||||
open_tag ItemGroup
|
||||
generate_filter "Build Files" "mk"
|
||||
close_tag ItemGroup
|
||||
open_tag ItemGroup
|
||||
generate_filter "References" "vcxproj"
|
||||
close_tag ItemGroup
|
||||
|
||||
tag Import \
|
||||
Project="\$(VCTargetsPath)\\Microsoft.Cpp.targets"
|
||||
|
||||
open_tag ImportGroup \
|
||||
Label="ExtensionTargets"
|
||||
close_tag ImportGroup
|
||||
|
||||
close_tag Project
|
||||
|
||||
# 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
|
||||
}
|
||||
|
||||
# This regexp doesn't catch most of the strings in the vcxproj format,
|
||||
# since they're like <tag>path</tag> instead of <tag attr="path" />
|
||||
# as previously. It still seems to work ok despite this.
|
||||
generate_vcxproj |
|
||||
sed -e '/"/s;\([^ "]\)/;\1\\;g' |
|
||||
sed -e '/xmlns/s;\\;/;g' > ${outfile}
|
||||
|
||||
exit
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,363 +0,0 @@
|
||||
#!/bin/sh
|
||||
self=$0
|
||||
|
||||
usage() {
|
||||
cat <<EOF >&2
|
||||
Usage: $self [options] FILE
|
||||
|
||||
Reads the Run Time CPU Detections definitions from FILE and generates a
|
||||
C header file on stdout.
|
||||
|
||||
Options:
|
||||
--arch=ARCH Architecture to generate defs for (required)
|
||||
--disable-EXT Disable support for EXT extensions
|
||||
--require-EXT Require support for EXT extensions
|
||||
--sym=SYMBOL Unique symbol to use for RTCD initialization function
|
||||
--config=FILE File with CONFIG_FOO=yes lines to parse
|
||||
EOF
|
||||
exit 1
|
||||
}
|
||||
|
||||
die() {
|
||||
echo "$@" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
die_argument_required() {
|
||||
die "Option $opt requires argument"
|
||||
}
|
||||
|
||||
for opt; do
|
||||
optval="${opt#*=}"
|
||||
case "$opt" in
|
||||
--arch) die_argument_required;;
|
||||
--arch=*) arch=${optval};;
|
||||
--disable-*) eval "disable_${opt#--disable-}=true";;
|
||||
--require-*) REQUIRES="${REQUIRES}${opt#--require-} ";;
|
||||
--sym) die_argument_required;;
|
||||
--sym=*) symbol=${optval};;
|
||||
--config=*) config_file=${optval};;
|
||||
-h|--help)
|
||||
usage
|
||||
;;
|
||||
-*)
|
||||
die "Unrecognized option: ${opt%%=*}"
|
||||
;;
|
||||
*)
|
||||
defs_file="$defs_file $opt"
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
for f in $defs_file; do [ -f "$f" ] || usage; done
|
||||
[ -n "$arch" ] || usage
|
||||
|
||||
# Import the configuration
|
||||
[ -f "$config_file" ] && eval $(grep CONFIG_ "$config_file")
|
||||
|
||||
#
|
||||
# Routines for the RTCD DSL to call
|
||||
#
|
||||
prototype() {
|
||||
rtyp=""
|
||||
case "$1" in
|
||||
unsigned) rtyp="$1 "; shift;;
|
||||
esac
|
||||
rtyp="${rtyp}$1"
|
||||
fn="$2"
|
||||
args="$3"
|
||||
|
||||
eval "${2}_rtyp='$rtyp'"
|
||||
eval "${2}_args='$3'"
|
||||
ALL_FUNCS="$ALL_FUNCS $fn"
|
||||
specialize $fn c
|
||||
}
|
||||
|
||||
specialize() {
|
||||
fn="$1"
|
||||
shift
|
||||
for opt in "$@"; do
|
||||
eval "${fn}_${opt}=${fn}_${opt}"
|
||||
done
|
||||
}
|
||||
|
||||
require() {
|
||||
for fn in $ALL_FUNCS; do
|
||||
for opt in "$@"; do
|
||||
ofn=$(eval "echo \$${fn}_${opt}")
|
||||
[ -z "$ofn" ] && continue
|
||||
|
||||
# if we already have a default, then we can disable it, as we know
|
||||
# we can do better.
|
||||
best=$(eval "echo \$${fn}_default")
|
||||
best_ofn=$(eval "echo \$${best}")
|
||||
[ -n "$best" ] && [ "$best_ofn" != "$ofn" ] && eval "${best}_link=false"
|
||||
eval "${fn}_default=${fn}_${opt}"
|
||||
eval "${fn}_${opt}_link=true"
|
||||
done
|
||||
done
|
||||
}
|
||||
|
||||
forward_decls() {
|
||||
ALL_FORWARD_DECLS="$ALL_FORWARD_DECLS $1"
|
||||
}
|
||||
|
||||
#
|
||||
# Include the user's directives
|
||||
#
|
||||
for f in $defs_file; do
|
||||
. $f
|
||||
done
|
||||
|
||||
#
|
||||
# Process the directives according to the command line
|
||||
#
|
||||
process_forward_decls() {
|
||||
for fn in $ALL_FORWARD_DECLS; do
|
||||
eval $fn
|
||||
done
|
||||
}
|
||||
|
||||
determine_indirection() {
|
||||
[ "$CONFIG_RUNTIME_CPU_DETECT" = "yes" ] || require $ALL_ARCHS
|
||||
for fn in $ALL_FUNCS; do
|
||||
n=""
|
||||
rtyp="$(eval "echo \$${fn}_rtyp")"
|
||||
args="$(eval "echo \"\$${fn}_args\"")"
|
||||
dfn="$(eval "echo \$${fn}_default")"
|
||||
dfn=$(eval "echo \$${dfn}")
|
||||
for opt in "$@"; do
|
||||
ofn=$(eval "echo \$${fn}_${opt}")
|
||||
[ -z "$ofn" ] && continue
|
||||
link=$(eval "echo \$${fn}_${opt}_link")
|
||||
[ "$link" = "false" ] && continue
|
||||
n="${n}x"
|
||||
done
|
||||
if [ "$n" = "x" ]; then
|
||||
eval "${fn}_indirect=false"
|
||||
else
|
||||
eval "${fn}_indirect=true"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
declare_function_pointers() {
|
||||
for fn in $ALL_FUNCS; do
|
||||
rtyp="$(eval "echo \$${fn}_rtyp")"
|
||||
args="$(eval "echo \"\$${fn}_args\"")"
|
||||
dfn="$(eval "echo \$${fn}_default")"
|
||||
dfn=$(eval "echo \$${dfn}")
|
||||
for opt in "$@"; do
|
||||
ofn=$(eval "echo \$${fn}_${opt}")
|
||||
[ -z "$ofn" ] && continue
|
||||
echo "$rtyp ${ofn}($args);"
|
||||
done
|
||||
if [ "$(eval "echo \$${fn}_indirect")" = "false" ]; then
|
||||
echo "#define ${fn} ${dfn}"
|
||||
else
|
||||
echo "RTCD_EXTERN $rtyp (*${fn})($args);"
|
||||
fi
|
||||
echo
|
||||
done
|
||||
}
|
||||
|
||||
set_function_pointers() {
|
||||
for fn in $ALL_FUNCS; do
|
||||
n=""
|
||||
rtyp="$(eval "echo \$${fn}_rtyp")"
|
||||
args="$(eval "echo \"\$${fn}_args\"")"
|
||||
dfn="$(eval "echo \$${fn}_default")"
|
||||
dfn=$(eval "echo \$${dfn}")
|
||||
if $(eval "echo \$${fn}_indirect"); then
|
||||
echo " $fn = $dfn;"
|
||||
for opt in "$@"; do
|
||||
ofn=$(eval "echo \$${fn}_${opt}")
|
||||
[ -z "$ofn" ] && continue
|
||||
[ "$ofn" = "$dfn" ] && continue;
|
||||
link=$(eval "echo \$${fn}_${opt}_link")
|
||||
[ "$link" = "false" ] && continue
|
||||
cond="$(eval "echo \$have_${opt}")"
|
||||
echo " if (${cond}) $fn = $ofn;"
|
||||
done
|
||||
fi
|
||||
echo
|
||||
done
|
||||
}
|
||||
|
||||
filter() {
|
||||
filtered=""
|
||||
for opt in "$@"; do
|
||||
[ -z $(eval "echo \$disable_${opt}") ] && filtered="$filtered $opt"
|
||||
done
|
||||
echo $filtered
|
||||
}
|
||||
|
||||
#
|
||||
# Helper functions for generating the arch specific RTCD files
|
||||
#
|
||||
common_top() {
|
||||
outfile_basename=$(basename ${symbol:-rtcd})
|
||||
include_guard=$(echo $outfile_basename | tr '[a-z]' '[A-Z]' | \
|
||||
tr -c '[A-Z0-9]' _)H_
|
||||
cat <<EOF
|
||||
#ifndef ${include_guard}
|
||||
#define ${include_guard}
|
||||
|
||||
#ifdef RTCD_C
|
||||
#define RTCD_EXTERN
|
||||
#else
|
||||
#define RTCD_EXTERN extern
|
||||
#endif
|
||||
|
||||
$(process_forward_decls)
|
||||
|
||||
$(declare_function_pointers c $ALL_ARCHS)
|
||||
|
||||
void ${symbol:-rtcd}(void);
|
||||
EOF
|
||||
}
|
||||
|
||||
common_bottom() {
|
||||
cat <<EOF
|
||||
#endif
|
||||
EOF
|
||||
}
|
||||
|
||||
x86() {
|
||||
determine_indirection c $ALL_ARCHS
|
||||
|
||||
# Assign the helper variable for each enabled extension
|
||||
for opt in $ALL_ARCHS; do
|
||||
uc=$(echo $opt | tr '[a-z]' '[A-Z]')
|
||||
eval "have_${opt}=\"flags & HAS_${uc}\""
|
||||
done
|
||||
|
||||
cat <<EOF
|
||||
$(common_top)
|
||||
|
||||
#ifdef RTCD_C
|
||||
#include "vpx_ports/x86.h"
|
||||
static void setup_rtcd_internal(void)
|
||||
{
|
||||
int flags = x86_simd_caps();
|
||||
|
||||
(void)flags;
|
||||
|
||||
$(set_function_pointers c $ALL_ARCHS)
|
||||
}
|
||||
#endif
|
||||
$(common_bottom)
|
||||
EOF
|
||||
}
|
||||
|
||||
arm() {
|
||||
determine_indirection c $ALL_ARCHS
|
||||
|
||||
# Assign the helper variable for each enabled extension
|
||||
for opt in $ALL_ARCHS; do
|
||||
uc=$(echo $opt | tr '[a-z]' '[A-Z]')
|
||||
eval "have_${opt}=\"flags & HAS_${uc}\""
|
||||
done
|
||||
|
||||
cat <<EOF
|
||||
$(common_top)
|
||||
#include "vpx_config.h"
|
||||
|
||||
#ifdef RTCD_C
|
||||
#include "vpx_ports/arm.h"
|
||||
static void setup_rtcd_internal(void)
|
||||
{
|
||||
int flags = arm_cpu_caps();
|
||||
|
||||
(void)flags;
|
||||
|
||||
$(set_function_pointers c $ALL_ARCHS)
|
||||
}
|
||||
#endif
|
||||
$(common_bottom)
|
||||
EOF
|
||||
}
|
||||
|
||||
|
||||
mips() {
|
||||
determine_indirection c $ALL_ARCHS
|
||||
cat <<EOF
|
||||
$(common_top)
|
||||
#include "vpx_config.h"
|
||||
|
||||
#ifdef RTCD_C
|
||||
static void setup_rtcd_internal(void)
|
||||
{
|
||||
$(set_function_pointers c $ALL_ARCHS)
|
||||
#if HAVE_DSPR2
|
||||
#if CONFIG_VP8
|
||||
void dsputil_static_init();
|
||||
dsputil_static_init();
|
||||
#endif
|
||||
#if CONFIG_VP9
|
||||
void vp9_dsputil_static_init();
|
||||
vp9_dsputil_static_init();
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
$(common_bottom)
|
||||
EOF
|
||||
}
|
||||
|
||||
unoptimized() {
|
||||
determine_indirection c
|
||||
cat <<EOF
|
||||
$(common_top)
|
||||
#include "vpx_config.h"
|
||||
|
||||
#ifdef RTCD_C
|
||||
static void setup_rtcd_internal(void)
|
||||
{
|
||||
$(set_function_pointers c)
|
||||
}
|
||||
#endif
|
||||
$(common_bottom)
|
||||
EOF
|
||||
|
||||
}
|
||||
#
|
||||
# Main Driver
|
||||
#
|
||||
require c
|
||||
case $arch in
|
||||
x86)
|
||||
ALL_ARCHS=$(filter mmx sse sse2 sse3 ssse3 sse4_1 avx avx2)
|
||||
x86
|
||||
;;
|
||||
x86_64)
|
||||
ALL_ARCHS=$(filter mmx sse sse2 sse3 ssse3 sse4_1 avx avx2)
|
||||
REQUIRES=${REQUIRES:-mmx sse sse2}
|
||||
require $(filter $REQUIRES)
|
||||
x86
|
||||
;;
|
||||
mips32)
|
||||
ALL_ARCHS=$(filter mips32)
|
||||
dspr2=$([ -f "$config_file" ] && eval echo $(grep HAVE_DSPR2 "$config_file"))
|
||||
HAVE_DSPR2="${dspr2#*=}"
|
||||
if [ "$HAVE_DSPR2" = "yes" ]; then
|
||||
ALL_ARCHS=$(filter mips32 dspr2)
|
||||
fi
|
||||
mips
|
||||
;;
|
||||
armv5te)
|
||||
ALL_ARCHS=$(filter edsp)
|
||||
arm
|
||||
;;
|
||||
armv6)
|
||||
ALL_ARCHS=$(filter edsp media)
|
||||
arm
|
||||
;;
|
||||
armv7)
|
||||
ALL_ARCHS=$(filter edsp media neon)
|
||||
arm
|
||||
;;
|
||||
*)
|
||||
unoptimized
|
||||
;;
|
||||
esac
|
||||
@@ -1,70 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
##
|
||||
## Copyright (c) 2013 The WebM project authors. All Rights Reserved.
|
||||
##
|
||||
## Use of this source code is governed by a BSD-style license
|
||||
## that can be found in the LICENSE file in the root of the source
|
||||
## tree. An additional intellectual property rights grant can be found
|
||||
## in the file PATENTS. All contributing project authors may
|
||||
## be found in the AUTHORS file in the root of the source tree.
|
||||
##
|
||||
|
||||
package thumb;
|
||||
|
||||
sub FixThumbInstructions($$)
|
||||
{
|
||||
my $short_branches = $_[1];
|
||||
my $branch_shift_offset = $short_branches ? 1 : 0;
|
||||
|
||||
# Write additions with shifts, such as "add r10, r11, lsl #8",
|
||||
# in three operand form, "add r10, r10, r11, lsl #8".
|
||||
s/(add\s+)(r\d+),\s*(r\d+),\s*(lsl #\d+)/$1$2, $2, $3, $4/g;
|
||||
|
||||
# Convert additions with a non-constant shift into a sequence
|
||||
# with left shift, addition and a right shift (to restore the
|
||||
# register to the original value). Currently the right shift
|
||||
# isn't necessary in the code base since the values in these
|
||||
# registers aren't used, but doing the shift for consistency.
|
||||
# This converts instructions such as "add r12, r12, r5, lsl r4"
|
||||
# into the sequence "lsl r5, r4", "add r12, r12, r5", "lsr r5, r4".
|
||||
s/^(\s*)(add)(\s+)(r\d+),\s*(r\d+),\s*(r\d+),\s*lsl (r\d+)/$1lsl$3$6, $7\n$1$2$3$4, $5, $6\n$1lsr$3$6, $7/g;
|
||||
|
||||
# Convert loads with right shifts in the indexing into a
|
||||
# sequence of an add, load and sub. This converts
|
||||
# "ldrb r4, [r9, lr, asr #1]" into "add r9, r9, lr, asr #1",
|
||||
# "ldrb r9, [r9]", "sub r9, r9, lr, asr #1".
|
||||
s/^(\s*)(ldrb)(\s+)(r\d+),\s*\[(\w+),\s*(\w+),\s*(asr #\d+)\]/$1add $3$5, $5, $6, $7\n$1$2$3$4, [$5]\n$1sub $3$5, $5, $6, $7/g;
|
||||
|
||||
# Convert register indexing with writeback into a separate add
|
||||
# instruction. This converts "ldrb r12, [r1, r2]!" into
|
||||
# "ldrb r12, [r1, r2]", "add r1, r1, r2".
|
||||
s/^(\s*)(ldrb)(\s+)(r\d+),\s*\[(\w+),\s*(\w+)\]!/$1$2$3$4, [$5, $6]\n$1add $3$5, $6/g;
|
||||
|
||||
# Convert negative register indexing into separate sub/add instructions.
|
||||
# This converts "ldrne r4, [src, -pstep, lsl #1]" into
|
||||
# "subne src, src, pstep, lsl #1", "ldrne r4, [src]",
|
||||
# "addne src, src, pstep, lsl #1". In a couple of cases where
|
||||
# this is used, it's used for two subsequent load instructions,
|
||||
# where a hand-written version of it could merge two subsequent
|
||||
# add and sub instructions.
|
||||
s/^(\s*)((ldr|str|pld)(ne)?)(\s+)(r\d+,\s*)?\[(\w+), -([^\]]+)\]/$1sub$4$5$7, $7, $8\n$1$2$5$6\[$7\]\n$1add$4$5$7, $7, $8/g;
|
||||
|
||||
# Convert register post indexing to a separate add instruction.
|
||||
# This converts "ldrneb r9, [r0], r2" into "ldrneb r9, [r0]",
|
||||
# "add r0, r2".
|
||||
s/^(\s*)((ldr|str)(ne)?[bhd]?)(\s+)(\w+),(\s*\w+,)?\s*\[(\w+)\],\s*(\w+)/$1$2$5$6,$7 [$8]\n$1add$4$5$8, $8, $9/g;
|
||||
|
||||
# Convert a conditional addition to the pc register into a series of
|
||||
# instructions. This converts "addlt pc, pc, r3, lsl #2" into
|
||||
# "itttt lt", "movlt.n r12, pc", "addlt.w r12, #12",
|
||||
# "addlt.w r12, r12, r3, lsl #2", "movlt.n pc, r12".
|
||||
# This assumes that r12 is free at this point.
|
||||
s/^(\s*)addlt(\s+)pc,\s*pc,\s*(\w+),\s*lsl\s*#(\d+)/$1itttt$2lt\n$1movlt.n$2r12, pc\n$1addlt.w$2r12, #12\n$1addlt.w$2r12, r12, $3, lsl #($4-$branch_shift_offset)\n$1movlt.n$2pc, r12/g;
|
||||
|
||||
# Convert "mov pc, lr" into "bx lr", since the former only works
|
||||
# for switching from arm to thumb (and only in armv7), but not
|
||||
# from thumb to arm.
|
||||
s/mov(\s*)pc\s*,\s*lr/bx$1lr/g;
|
||||
}
|
||||
|
||||
1;
|
||||
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
##
|
||||
## Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
##
|
||||
|
||||
@@ -7,6 +7,9 @@ REM in the file PATENTS. All contributing project authors may
|
||||
REM be found in the AUTHORS file in the root of the source tree.
|
||||
echo on
|
||||
|
||||
cl /I "./" /I "%1" /nologo /c "%1/vp8/encoder/vp8_asm_enc_offsets.c"
|
||||
obj_int_extract.exe rvds "vp8_asm_enc_offsets.obj" > "vp8_asm_enc_offsets.asm"
|
||||
|
||||
cl /I "./" /I "%1" /nologo /c "%1/vp8/common/asm_com_offsets.c"
|
||||
cl /I "./" /I "%1" /nologo /c "%1/vp8/decoder/asm_dec_offsets.c"
|
||||
cl /I "./" /I "%1" /nologo /c "%1/vp8/encoder/asm_enc_offsets.c"
|
||||
obj_int_extract.exe rvds "asm_com_offsets.obj" > "asm_com_offsets.asm"
|
||||
obj_int_extract.exe rvds "asm_dec_offsets.obj" > "asm_dec_offsets.asm"
|
||||
obj_int_extract.exe rvds "asm_enc_offsets.obj" > "asm_enc_offsets.asm"
|
||||
|
||||
115
build/x86-msvs/yasm.rules
Normal file
115
build/x86-msvs/yasm.rules
Normal file
@@ -0,0 +1,115 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<VisualStudioToolFile
|
||||
Name="Yasm"
|
||||
Version="8.00"
|
||||
>
|
||||
<Rules>
|
||||
<CustomBuildRule
|
||||
Name="YASM"
|
||||
DisplayName="Yasm Assembler"
|
||||
CommandLine="yasm -Xvc -f $(PlatformName) [AllOptions] [AdditionalOptions] [Inputs]"
|
||||
Outputs="[$ObjectFileName]"
|
||||
FileExtensions="*.asm"
|
||||
ExecutionDescription="Assembling $(InputFileName)"
|
||||
ShowOnlyRuleProperties="false"
|
||||
>
|
||||
<Properties>
|
||||
<StringProperty
|
||||
Name="Defines"
|
||||
DisplayName="Definitions"
|
||||
Category="Pre-Defined Symbols"
|
||||
Description="Specify pre-defined symbols ('symbol' or 'symbol = value') "
|
||||
Switch="-D [value]"
|
||||
Delimited="true"
|
||||
Inheritable="true"
|
||||
/>
|
||||
<StringProperty
|
||||
Name="IncludePaths"
|
||||
DisplayName="Include Paths"
|
||||
Category="Configuration"
|
||||
Description="Set the paths for any additional include files"
|
||||
Switch="-I [value]"
|
||||
Delimited="true"
|
||||
Inheritable="true"
|
||||
/>
|
||||
<StringProperty
|
||||
Name="UnDefines"
|
||||
DisplayName="Remove Definitions"
|
||||
Category="Pre-Defined Symbols"
|
||||
Description="Remove pre-defined symbols "
|
||||
Switch="-U [value]"
|
||||
Delimited="true"
|
||||
Inheritable="true"
|
||||
/>
|
||||
<StringProperty
|
||||
Name="ObjectFileName"
|
||||
DisplayName="Object File Name"
|
||||
Category="Output"
|
||||
Description="Select the output file name"
|
||||
Switch="-o [value]"
|
||||
DefaultValue="$(IntDir)\$(InputName).obj"
|
||||
/>
|
||||
<StringProperty
|
||||
Name="ListFileName"
|
||||
DisplayName="List File Name"
|
||||
Category="Output"
|
||||
Description="Select an output listing by setting its file name"
|
||||
Switch="-l [value]"
|
||||
/>
|
||||
<StringProperty
|
||||
Name="PreIncludeFile"
|
||||
DisplayName="Pre Include File"
|
||||
Category="Configuration"
|
||||
Description="Select a pre-included file by setting its name"
|
||||
Switch="-P [value]"
|
||||
/>
|
||||
<BooleanProperty
|
||||
Name="Debug"
|
||||
DisplayName="Debug Information"
|
||||
Category="Output"
|
||||
Description="Generate debugging information"
|
||||
Switch="-g cv8"
|
||||
/>
|
||||
<EnumProperty
|
||||
Name="PreProc"
|
||||
DisplayName="Pre-Processor"
|
||||
Category="Configuration"
|
||||
Description="Select the pre-processor ('nasm' or 'raw')"
|
||||
>
|
||||
<Values>
|
||||
<EnumValue
|
||||
Value="0"
|
||||
Switch="-rnasm"
|
||||
DisplayName="Nasm "
|
||||
/>
|
||||
<EnumValue
|
||||
Value="1"
|
||||
Switch="-rraw"
|
||||
DisplayName="Raw"
|
||||
/>
|
||||
</Values>
|
||||
</EnumProperty>
|
||||
<EnumProperty
|
||||
Name="Parser"
|
||||
DisplayName="Parser"
|
||||
Category="Configuration"
|
||||
Description="Select the parser for Intel ('nasm') or AT&T ( 'gas') syntax"
|
||||
>
|
||||
<Values>
|
||||
<EnumValue
|
||||
Value="0"
|
||||
Switch="-pnasm"
|
||||
DisplayName="Nasm"
|
||||
/>
|
||||
<EnumValue
|
||||
Value="1"
|
||||
Switch="-pgas"
|
||||
DisplayName="Gas"
|
||||
/>
|
||||
</Values>
|
||||
</EnumProperty>
|
||||
</Properties>
|
||||
</CustomBuildRule>
|
||||
</Rules>
|
||||
</VisualStudioToolFile>
|
||||
|
||||
271
configure
vendored
271
configure
vendored
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
##
|
||||
## configure
|
||||
##
|
||||
@@ -20,37 +20,30 @@ show_help(){
|
||||
show_help_pre
|
||||
cat << EOF
|
||||
Advanced options:
|
||||
${toggle_libs} libraries
|
||||
${toggle_examples} examples
|
||||
${toggle_docs} documentation
|
||||
${toggle_unit_tests} unit tests
|
||||
${toggle_decode_perf_tests} build decoder perf tests with unit tests
|
||||
${toggle_libs} don't build libraries
|
||||
${toggle_examples} don't build examples
|
||||
${toggle_unit_tests} build unit tests
|
||||
--libc=PATH path to alternate libc
|
||||
--as={yasm|nasm|auto} use specified assembler [auto, yasm preferred]
|
||||
--sdk-path=PATH path to root of sdk (android builds only)
|
||||
${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_md5} support for output of checksum data
|
||||
${toggle_static_msvcrt} use static MSVCRT (VS builds only)
|
||||
${toggle_vp8} VP8 codec support
|
||||
${toggle_vp9} VP9 codec support
|
||||
${toggle_internal_stats} output of encoder internal stats for debug, if supported (encoders)
|
||||
${toggle_mem_tracker} track memory usage
|
||||
${toggle_postproc} postprocessing
|
||||
${toggle_vp9_postproc} vp9 specific postprocessing
|
||||
${toggle_multithread} multithreaded encoding and decoding
|
||||
${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_onthefly_bitpacking} enable on-the-fly bitpacking in real-time encoding
|
||||
${toggle_error_concealment} enable this option to get a decoder which is able to conceal losses
|
||||
${toggle_runtime_cpu_detect} runtime cpu detection
|
||||
${toggle_shared} shared library support
|
||||
${toggle_static} static library support
|
||||
${toggle_small} favor smaller size over speed
|
||||
${toggle_postproc_visualizer} macro block / block level visualizers
|
||||
${toggle_multi_res_encoding} enable multiple-resolution encoding
|
||||
${toggle_temporal_denoising} enable temporal denoising and disable the spatial denoiser
|
||||
|
||||
Codecs:
|
||||
Codecs can be selectively enabled or disabled individually, or by family:
|
||||
@@ -86,21 +79,23 @@ EOF
|
||||
|
||||
# all_platforms is a list of all supported target platforms. Maintain
|
||||
# alphabetically by architecture, generic-gnu last.
|
||||
all_platforms="${all_platforms} armv5te-android-gcc"
|
||||
all_platforms="${all_platforms} armv5te-linux-rvct"
|
||||
all_platforms="${all_platforms} armv5te-linux-gcc"
|
||||
all_platforms="${all_platforms} armv5te-none-rvct"
|
||||
all_platforms="${all_platforms} armv5te-symbian-gcc"
|
||||
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-none-rvct"
|
||||
all_platforms="${all_platforms} armv7-android-gcc" #neon Cortex-A8
|
||||
all_platforms="${all_platforms} armv6-symbian-gcc"
|
||||
all_platforms="${all_platforms} iwmmxt-linux-rvct"
|
||||
all_platforms="${all_platforms} iwmmxt-linux-gcc"
|
||||
all_platforms="${all_platforms} iwmmxt2-linux-rvct"
|
||||
all_platforms="${all_platforms} iwmmxt2-linux-gcc"
|
||||
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} armv7-none-rvct" #neon Cortex-A8
|
||||
all_platforms="${all_platforms} armv7-win32-vs11"
|
||||
all_platforms="${all_platforms} armv7-win32-vs12"
|
||||
all_platforms="${all_platforms} mips32-linux-gcc"
|
||||
all_platforms="${all_platforms} ppc32-darwin8-gcc"
|
||||
all_platforms="${all_platforms} ppc32-darwin9-gcc"
|
||||
@@ -109,46 +104,28 @@ 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} sparc-solaris-gcc"
|
||||
all_platforms="${all_platforms} x86-android-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-darwin10-gcc"
|
||||
all_platforms="${all_platforms} x86-darwin11-gcc"
|
||||
all_platforms="${all_platforms} x86-darwin12-gcc"
|
||||
all_platforms="${all_platforms} x86-darwin13-gcc"
|
||||
all_platforms="${all_platforms} x86-linux-gcc"
|
||||
all_platforms="${all_platforms} x86-linux-icc"
|
||||
all_platforms="${all_platforms} x86-os2-gcc"
|
||||
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-win32-vs9"
|
||||
all_platforms="${all_platforms} x86-win32-vs10"
|
||||
all_platforms="${all_platforms} x86-win32-vs11"
|
||||
all_platforms="${all_platforms} x86-win32-vs12"
|
||||
all_platforms="${all_platforms} x86_64-darwin9-gcc"
|
||||
all_platforms="${all_platforms} x86_64-darwin10-gcc"
|
||||
all_platforms="${all_platforms} x86_64-darwin11-gcc"
|
||||
all_platforms="${all_platforms} x86_64-darwin12-gcc"
|
||||
all_platforms="${all_platforms} x86_64-darwin13-gcc"
|
||||
all_platforms="${all_platforms} x86_64-linux-gcc"
|
||||
all_platforms="${all_platforms} x86_64-linux-icc"
|
||||
all_platforms="${all_platforms} x86_64-solaris-gcc"
|
||||
all_platforms="${all_platforms} x86_64-win64-gcc"
|
||||
all_platforms="${all_platforms} x86_64-win64-vs8"
|
||||
all_platforms="${all_platforms} x86_64-win64-vs9"
|
||||
all_platforms="${all_platforms} x86_64-win64-vs10"
|
||||
all_platforms="${all_platforms} x86_64-win64-vs11"
|
||||
all_platforms="${all_platforms} x86_64-win64-vs12"
|
||||
all_platforms="${all_platforms} universal-darwin8-gcc"
|
||||
all_platforms="${all_platforms} universal-darwin9-gcc"
|
||||
all_platforms="${all_platforms} universal-darwin10-gcc"
|
||||
all_platforms="${all_platforms} universal-darwin11-gcc"
|
||||
all_platforms="${all_platforms} universal-darwin12-gcc"
|
||||
all_platforms="${all_platforms} universal-darwin13-gcc"
|
||||
all_platforms="${all_platforms} generic-gnu"
|
||||
|
||||
# all_targets is a list of all targets that can be configured
|
||||
@@ -157,7 +134,7 @@ all_targets="libs examples docs"
|
||||
|
||||
# all targets available are enabled, by default.
|
||||
for t in ${all_targets}; do
|
||||
[ -f ${source_path}/${t}.mk ] && enable_feature ${t}
|
||||
[ -f ${source_path}/${t}.mk ] && enable ${t}
|
||||
done
|
||||
|
||||
# check installed doxygen version
|
||||
@@ -168,45 +145,38 @@ if [ ${doxy_major:-0} -ge 1 ]; then
|
||||
doxy_minor=${doxy_version%%.*}
|
||||
doxy_patch=${doxy_version##*.}
|
||||
|
||||
[ $doxy_major -gt 1 ] && enable_feature doxygen
|
||||
[ $doxy_minor -gt 5 ] && enable_feature doxygen
|
||||
[ $doxy_minor -eq 5 ] && [ $doxy_patch -ge 3 ] && enable_feature doxygen
|
||||
[ $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 except the sources, by default. sources will have
|
||||
# to be enabled when doing dist builds, since that's no longer a common
|
||||
# case.
|
||||
enabled doxygen && php -v >/dev/null 2>&1 && enable_feature install_docs
|
||||
enable_feature install_bins
|
||||
enable_feature install_libs
|
||||
enabled doxygen && php -v >/dev/null 2>&1 && enable install_docs
|
||||
enable install_bins
|
||||
enable install_libs
|
||||
|
||||
enable_feature static
|
||||
enable_feature optimizations
|
||||
enable_feature fast_unaligned #allow unaligned accesses, if supported by hw
|
||||
enable_feature spatial_resampling
|
||||
enable_feature multithread
|
||||
enable_feature os_support
|
||||
enable_feature temporal_denoising
|
||||
enable static
|
||||
enable optimizations
|
||||
enable fast_unaligned #allow unaligned accesses, if supported by hw
|
||||
enable md5
|
||||
enable spatial_resampling
|
||||
enable multithread
|
||||
enable os_support
|
||||
|
||||
[ -d ${source_path}/../include ] && enable_feature alt_tree_layout
|
||||
for d in vp8 vp9; do
|
||||
[ -d ${source_path}/${d} ] && disable_feature alt_tree_layout;
|
||||
[ -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"
|
||||
[ -d ${source_path}/vp9 ] && CODECS="${CODECS} vp9_encoder vp9_decoder"
|
||||
else
|
||||
# customer environment
|
||||
[ -f ${source_path}/../include/vpx/vp8cx.h ] && CODECS="${CODECS} vp8_encoder"
|
||||
[ -f ${source_path}/../include/vpx/vp8dx.h ] && CODECS="${CODECS} vp8_decoder"
|
||||
[ -f ${source_path}/../include/vpx/vp9cx.h ] && CODECS="${CODECS} vp9_encoder"
|
||||
[ -f ${source_path}/../include/vpx/vp9dx.h ] && CODECS="${CODECS} vp9_decoder"
|
||||
[ -f ${source_path}/../include/vpx/vp8cx.h ] || disable_feature vp8_encoder
|
||||
[ -f ${source_path}/../include/vpx/vp8dx.h ] || disable_feature vp8_decoder
|
||||
[ -f ${source_path}/../include/vpx/vp9cx.h ] || disable_feature vp9_encoder
|
||||
[ -f ${source_path}/../include/vpx/vp9dx.h ] || disable_feature vp9_decoder
|
||||
|
||||
[ -f ${source_path}/../lib/*/*mt.lib ] && soft_enable static_msvcrt
|
||||
fi
|
||||
@@ -223,12 +193,13 @@ ARCH_LIST="
|
||||
ppc64
|
||||
"
|
||||
ARCH_EXT_LIST="
|
||||
edsp
|
||||
media
|
||||
neon
|
||||
armv5te
|
||||
armv6
|
||||
armv7
|
||||
iwmmxt
|
||||
iwmmxt2
|
||||
|
||||
mips32
|
||||
dspr2
|
||||
|
||||
mmx
|
||||
sse
|
||||
@@ -236,8 +207,6 @@ ARCH_EXT_LIST="
|
||||
sse3
|
||||
ssse3
|
||||
sse4_1
|
||||
avx
|
||||
avx2
|
||||
|
||||
altivec
|
||||
"
|
||||
@@ -250,18 +219,12 @@ HAVE_LIST="
|
||||
sys_mman_h
|
||||
unistd_h
|
||||
"
|
||||
EXPERIMENT_LIST="
|
||||
multiple_arf
|
||||
non420
|
||||
alpha
|
||||
"
|
||||
CONFIG_LIST="
|
||||
external_build
|
||||
install_docs
|
||||
install_bins
|
||||
install_libs
|
||||
install_srcs
|
||||
use_x86inc
|
||||
debug
|
||||
gprof
|
||||
gcov
|
||||
@@ -277,12 +240,12 @@ CONFIG_LIST="
|
||||
mem_manager
|
||||
mem_tracker
|
||||
mem_checks
|
||||
md5
|
||||
|
||||
dequant_tokens
|
||||
dc_recon
|
||||
runtime_cpu_detect
|
||||
postproc
|
||||
vp9_postproc
|
||||
multithread
|
||||
internal_stats
|
||||
${CODECS}
|
||||
@@ -292,7 +255,6 @@ CONFIG_LIST="
|
||||
static_msvcrt
|
||||
spatial_resampling
|
||||
realtime_only
|
||||
onthefly_bitpacking
|
||||
error_concealment
|
||||
shared
|
||||
static
|
||||
@@ -300,15 +262,8 @@ CONFIG_LIST="
|
||||
postproc_visualizer
|
||||
os_support
|
||||
unit_tests
|
||||
decode_perf_tests
|
||||
multi_res_encoding
|
||||
temporal_denoising
|
||||
experimental
|
||||
decrypt
|
||||
${EXPERIMENT_LIST}
|
||||
"
|
||||
CMDLINE_SELECT="
|
||||
external_build
|
||||
extra_warnings
|
||||
werror
|
||||
install_docs
|
||||
@@ -319,25 +274,22 @@ CMDLINE_SELECT="
|
||||
gprof
|
||||
gcov
|
||||
pic
|
||||
use_x86inc
|
||||
optimizations
|
||||
ccache
|
||||
runtime_cpu_detect
|
||||
thumb
|
||||
|
||||
libs
|
||||
examples
|
||||
docs
|
||||
libc
|
||||
as
|
||||
fast_unaligned
|
||||
codec_srcs
|
||||
debug_libs
|
||||
md5
|
||||
|
||||
dequant_tokens
|
||||
dc_recon
|
||||
postproc
|
||||
vp9_postproc
|
||||
multithread
|
||||
internal_stats
|
||||
${CODECS}
|
||||
@@ -346,37 +298,19 @@ CMDLINE_SELECT="
|
||||
mem_tracker
|
||||
spatial_resampling
|
||||
realtime_only
|
||||
onthefly_bitpacking
|
||||
error_concealment
|
||||
shared
|
||||
static
|
||||
small
|
||||
postproc_visualizer
|
||||
unit_tests
|
||||
decode_perf_tests
|
||||
multi_res_encoding
|
||||
temporal_denoising
|
||||
experimental
|
||||
decrypt
|
||||
"
|
||||
|
||||
process_cmdline() {
|
||||
for opt do
|
||||
optval="${opt#*=}"
|
||||
case "$opt" in
|
||||
--disable-codecs) for c in ${CODECS}; do disable_feature $c; done ;;
|
||||
--enable-?*|--disable-?*)
|
||||
eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'`
|
||||
if echo "${EXPERIMENT_LIST}" | grep "^ *$option\$" >/dev/null; then
|
||||
if enabled experimental; then
|
||||
${action}_feature $option
|
||||
else
|
||||
log_echo "Ignoring $opt -- not in experimental mode."
|
||||
fi
|
||||
else
|
||||
process_common_cmdline $opt
|
||||
fi
|
||||
;;
|
||||
--disable-codecs) for c in ${CODECS}; do disable $c; done ;;
|
||||
*) process_common_cmdline "$opt"
|
||||
;;
|
||||
esac
|
||||
@@ -390,8 +324,8 @@ post_process_cmdline() {
|
||||
# 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_feature ${c}
|
||||
enabled ${c%%_*} && enable_feature ${c}
|
||||
disabled ${c%%_*} && disable ${c}
|
||||
enabled ${c%%_*} && enable ${c}
|
||||
done
|
||||
|
||||
# Enable all detected codecs, if they haven't been disabled
|
||||
@@ -399,12 +333,12 @@ post_process_cmdline() {
|
||||
|
||||
# Enable the codec family if any component of that family is enabled
|
||||
for c in ${CODECS}; do
|
||||
enabled $c && enable_feature ${c%_*}
|
||||
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_feature ${c##*_}s
|
||||
enabled ${c} && enable ${c##*_}s
|
||||
done
|
||||
}
|
||||
|
||||
@@ -425,7 +359,7 @@ process_targets() {
|
||||
fi
|
||||
|
||||
# The write_common_config (config.mk) logic is deferred until after the
|
||||
# recursive calls to configure complete, because we want our universal
|
||||
# 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
|
||||
@@ -444,7 +378,7 @@ process_targets() {
|
||||
done
|
||||
enabled debug_libs && DIST_DIR="${DIST_DIR}-debug"
|
||||
enabled codec_srcs && DIST_DIR="${DIST_DIR}-src"
|
||||
! enabled postproc && ! enabled vp9_postproc && DIST_DIR="${DIST_DIR}-nopost"
|
||||
! enabled postproc && DIST_DIR="${DIST_DIR}-nopost"
|
||||
! enabled multithread && DIST_DIR="${DIST_DIR}-nomt"
|
||||
! enabled install_docs && DIST_DIR="${DIST_DIR}-nodocs"
|
||||
DIST_DIR="${DIST_DIR}-${tgt_isa}-${tgt_os}"
|
||||
@@ -504,24 +438,17 @@ process_detect() {
|
||||
# Can only build shared libs on a subset of platforms. Doing this check
|
||||
# here rather than at option parse time because the target auto-detect
|
||||
# magic happens after the command line has been parsed.
|
||||
if ! enabled linux; then
|
||||
if enabled gnu; then
|
||||
echo "--enable-shared is only supported on ELF; assuming this is OK"
|
||||
else
|
||||
die "--enable-shared only supported on ELF for now"
|
||||
fi
|
||||
fi
|
||||
enabled linux || die "--enable-shared only supported on ELF for now"
|
||||
fi
|
||||
if [ -z "$CC" ] || enabled external_build; then
|
||||
if [ -z "$CC" ]; then
|
||||
echo "Bypassing toolchain for environment detection."
|
||||
enable_feature external_build
|
||||
enable external_build
|
||||
check_header() {
|
||||
log fake_check_header "$@"
|
||||
header=$1
|
||||
shift
|
||||
var=`echo $header | sed 's/[^A-Za-z0-9_]/_/g'`
|
||||
disable_feature $var
|
||||
# Headers common to all environments
|
||||
disable $var
|
||||
case $header in
|
||||
stdio.h)
|
||||
true;
|
||||
@@ -532,26 +459,7 @@ process_detect() {
|
||||
[ -f "${d##-I}/$header" ] && result=true && break
|
||||
done
|
||||
${result:-true}
|
||||
esac && enable_feature $var
|
||||
|
||||
# Specialize windows and POSIX environments.
|
||||
case $toolchain in
|
||||
*-win*-*)
|
||||
case $header-$toolchain in
|
||||
stdint*-gcc) true;;
|
||||
*) false;;
|
||||
esac && enable_feature $var
|
||||
;;
|
||||
*)
|
||||
case $header in
|
||||
stdint.h) true;;
|
||||
pthread.h) true;;
|
||||
sys/mman.h) true;;
|
||||
unistd.h) true;;
|
||||
*) false;;
|
||||
esac && enable_feature $var
|
||||
esac
|
||||
enabled $var
|
||||
esac && enable $var
|
||||
}
|
||||
check_ld() {
|
||||
true
|
||||
@@ -565,9 +473,8 @@ EOF
|
||||
check_header stdint.h
|
||||
check_header pthread.h
|
||||
check_header sys/mman.h
|
||||
check_header unistd.h # for sysconf(3) and friends.
|
||||
|
||||
check_header vpx/vpx_integer.h -I${source_path} && enable_feature vpx_ports
|
||||
check_header vpx/vpx_integer.h -I${source_path} && enable vpx_ports
|
||||
}
|
||||
|
||||
process_toolchain() {
|
||||
@@ -577,20 +484,11 @@ process_toolchain() {
|
||||
case $toolchain in
|
||||
universal-darwin*)
|
||||
local darwin_ver=${tgt_os##darwin}
|
||||
fat_bin_archs="$fat_bin_archs ppc32-${tgt_os}-gcc"
|
||||
|
||||
# Snow Leopard (10.6/darwin10) dropped support for PPC
|
||||
# Include PPC support for all prior versions
|
||||
if [ $darwin_ver -lt 10 ]; then
|
||||
fat_bin_archs="$fat_bin_archs ppc32-${tgt_os}-gcc"
|
||||
fi
|
||||
|
||||
# Tiger (10.4/darwin8) brought support for x86
|
||||
if [ $darwin_ver -ge 8 ]; then
|
||||
fat_bin_archs="$fat_bin_archs x86-${tgt_os}-${tgt_cc}"
|
||||
fi
|
||||
|
||||
# Leopard (10.5/darwin9) brought 64 bit support
|
||||
if [ $darwin_ver -ge 9 ]; then
|
||||
# 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
|
||||
;;
|
||||
@@ -606,19 +504,6 @@ process_toolchain() {
|
||||
check_add_cflags -Wpointer-arith
|
||||
check_add_cflags -Wtype-limits
|
||||
check_add_cflags -Wcast-qual
|
||||
check_add_cflags -Wvla
|
||||
check_add_cflags -Wimplicit-function-declaration
|
||||
check_add_cflags -Wuninitialized
|
||||
check_add_cflags -Wunused-variable
|
||||
case ${CC} in
|
||||
*clang*)
|
||||
# libvpx and/or clang have issues with aliasing:
|
||||
# https://code.google.com/p/webm/issues/detail?id=603
|
||||
# work around them until they are fixed
|
||||
check_add_cflags -fno-strict-aliasing
|
||||
;;
|
||||
*) check_add_cflags -Wunused-but-set-variable ;;
|
||||
esac
|
||||
enabled extra_warnings || check_add_cflags -Wno-unused-function
|
||||
fi
|
||||
|
||||
@@ -654,31 +539,16 @@ process_toolchain() {
|
||||
# ccache only really works on gcc toolchains
|
||||
enabled gcc || soft_disable ccache
|
||||
if enabled mips; then
|
||||
enable_feature dequant_tokens
|
||||
enable_feature dc_recon
|
||||
fi
|
||||
|
||||
if enabled internal_stats; then
|
||||
enable_feature vp9_postproc
|
||||
enable dequant_tokens
|
||||
enable dc_recon
|
||||
fi
|
||||
|
||||
# Enable the postbuild target if building for visual studio.
|
||||
case "$tgt_cc" in
|
||||
vs*) enable_feature msvs
|
||||
enable_feature solution
|
||||
vs*) enable msvs
|
||||
enable solution
|
||||
vs_version=${tgt_cc##vs}
|
||||
case $vs_version in
|
||||
[789])
|
||||
VCPROJ_SFX=vcproj
|
||||
gen_vcproj_cmd=${source_path}/build/make/gen_msvs_proj.sh
|
||||
;;
|
||||
10|11|12)
|
||||
VCPROJ_SFX=vcxproj
|
||||
gen_vcproj_cmd=${source_path}/build/make/gen_msvs_vcxproj.sh
|
||||
;;
|
||||
esac
|
||||
all_targets="${all_targets} solution"
|
||||
INLINE="__forceinline"
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -688,33 +558,6 @@ process_toolchain() {
|
||||
if enabled postproc_visualizer; then
|
||||
enabled postproc || die "postproc_visualizer requires postproc to be enabled"
|
||||
fi
|
||||
|
||||
# Enable unit tests by default if we have a working C++ compiler.
|
||||
case "$toolchain" in
|
||||
*-vs*)
|
||||
soft_enable unit_tests
|
||||
;;
|
||||
*-android-*)
|
||||
# GTestLog must be modified to use Android logging utilities.
|
||||
;;
|
||||
*-darwin-*)
|
||||
# iOS/ARM builds do not work with gtest. This does not match
|
||||
# x86 targets.
|
||||
;;
|
||||
*-win*)
|
||||
# Some mingw toolchains don't have pthread available by default.
|
||||
# Treat these more like visual studio where threading in gtest
|
||||
# would be disabled for the same reason.
|
||||
check_cxx "$@" <<EOF && soft_enable unit_tests
|
||||
int z;
|
||||
EOF
|
||||
;;
|
||||
*)
|
||||
enabled pthread_h && check_cxx "$@" <<EOF && soft_enable unit_tests
|
||||
int z;
|
||||
EOF
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
|
||||
|
||||
4
docs.mk
4
docs.mk
@@ -21,6 +21,9 @@ CODEC_DOX := mainpage.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
|
||||
@@ -31,6 +34,7 @@ TXT_DOX = $(call enabled,TXT_DOX)
|
||||
|
||||
EXAMPLE_PATH += $(SRC_PATH_BARE) #for CHANGELOG, README, etc
|
||||
|
||||
doxyfile: $(if $(findstring examples, $(ALL_TARGETS)),examples.doxy)
|
||||
doxyfile: libs.doxy_template libs.doxy
|
||||
@echo " [CREATE] $@"
|
||||
@cat $^ > $@
|
||||
|
||||
307
example_xma.c
307
example_xma.c
@@ -18,174 +18,197 @@
|
||||
#include "vpx_config.h"
|
||||
#include "vpx/vpx_decoder.h"
|
||||
#include "vpx/vpx_integer.h"
|
||||
#if CONFIG_VP9_DECODER
|
||||
#if CONFIG_VP8_DECODER
|
||||
#include "vpx/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_VP9_DECODER
|
||||
{"vp9", &vpx_codec_vp8_dx_algo},
|
||||
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;
|
||||
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);
|
||||
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));
|
||||
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);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
static void usage_error(const char *fmt, ...) {
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
vprintf(fmt, ap);
|
||||
printf("\n");
|
||||
usage_exit();
|
||||
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);
|
||||
void my_mem_dtor(vpx_codec_mmap_t *mmap)
|
||||
{
|
||||
if (verbose)
|
||||
printf("freeing segment %d\n", mmap->id);
|
||||
|
||||
free(mmap->priv);
|
||||
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;
|
||||
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];
|
||||
exec_name = argv[0];
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (!strcmp(argv[i], "--codec")) {
|
||||
if (i + 1 < argc) {
|
||||
int j, k = -1;
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
if (!strcmp(argv[i], "--codec"))
|
||||
{
|
||||
if (i + 1 < argc)
|
||||
{
|
||||
int j, k = -1;
|
||||
|
||||
i++;
|
||||
i++;
|
||||
|
||||
for (j = 0; j < sizeof(ifaces) / sizeof(ifaces[0]); j++)
|
||||
if (!strcmp(ifaces[j].name, argv[i]))
|
||||
k = j;
|
||||
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;
|
||||
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 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;
|
||||
usage_error("Error: Unrecognized option %s\n\n", argv[i]);
|
||||
}
|
||||
} 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;
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
140
examples.mk
140
examples.mk
@@ -8,12 +8,6 @@
|
||||
## be found in the AUTHORS file in the root of the source tree.
|
||||
##
|
||||
|
||||
LIBYUV_SRCS += third_party/libyuv/include/libyuv/basic_types.h \
|
||||
third_party/libyuv/include/libyuv/cpu_id.h \
|
||||
third_party/libyuv/include/libyuv/scale.h \
|
||||
third_party/libyuv/source/row.h \
|
||||
third_party/libyuv/source/scale.c \
|
||||
third_party/libyuv/source/cpu_id.c
|
||||
|
||||
# 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
|
||||
@@ -23,10 +17,7 @@ vpxdec.SRCS += md5_utils.c md5_utils.h
|
||||
vpxdec.SRCS += vpx_ports/vpx_timer.h
|
||||
vpxdec.SRCS += vpx/vpx_integer.h
|
||||
vpxdec.SRCS += args.c args.h
|
||||
vpxdec.SRCS += ivfdec.c ivfdec.h
|
||||
vpxdec.SRCS += tools_common.c tools_common.h
|
||||
vpxdec.SRCS += webmdec.c webmdec.h
|
||||
vpxdec.SRCS += y4menc.c y4menc.h
|
||||
vpxdec.SRCS += nestegg/halloc/halloc.h
|
||||
vpxdec.SRCS += nestegg/halloc/src/align.h
|
||||
vpxdec.SRCS += nestegg/halloc/src/halloc.c
|
||||
@@ -34,72 +25,67 @@ vpxdec.SRCS += nestegg/halloc/src/hlist.h
|
||||
vpxdec.SRCS += nestegg/halloc/src/macros.h
|
||||
vpxdec.SRCS += nestegg/include/nestegg/nestegg.h
|
||||
vpxdec.SRCS += nestegg/src/nestegg.c
|
||||
vpxdec.SRCS += $(LIBYUV_SRCS)
|
||||
vpxdec.GUID = BA5FE66F-38DD-E034-F542-B1578C5FB950
|
||||
vpxdec.DESCRIPTION = Full featured decoder
|
||||
UTILS-$(CONFIG_ENCODERS) += vpxenc.c
|
||||
vpxenc.SRCS += args.c args.h y4minput.c y4minput.h vpxenc.h
|
||||
vpxenc.SRCS += ivfdec.c ivfdec.h
|
||||
vpxenc.SRCS += ivfenc.c ivfenc.h
|
||||
vpxenc.SRCS += args.c args.h y4minput.c y4minput.h
|
||||
vpxenc.SRCS += tools_common.c tools_common.h
|
||||
vpxenc.SRCS += warnings.c warnings.h
|
||||
vpxenc.SRCS += webmenc.c webmenc.h
|
||||
vpxenc.SRCS += vpx_ports/mem_ops.h
|
||||
vpxenc.SRCS += vpx_ports/mem_ops_aligned.h
|
||||
vpxenc.SRCS += vpx_ports/vpx_timer.h
|
||||
vpxenc.SRCS += vpxstats.c vpxstats.h
|
||||
vpxenc.SRCS += third_party/libmkv/EbmlIDs.h
|
||||
vpxenc.SRCS += third_party/libmkv/EbmlWriter.c
|
||||
vpxenc.SRCS += third_party/libmkv/EbmlWriter.h
|
||||
vpxenc.SRCS += $(LIBYUV_SRCS)
|
||||
vpxenc.SRCS += libmkv/EbmlIDs.h
|
||||
vpxenc.SRCS += libmkv/EbmlWriter.c
|
||||
vpxenc.SRCS += libmkv/EbmlWriter.h
|
||||
vpxenc.GUID = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1
|
||||
vpxenc.DESCRIPTION = Full featured encoder
|
||||
UTILS-$(CONFIG_VP8_ENCODER) += vp8_scalable_patterns.c
|
||||
UTILS-$(CONFIG_ENCODERS) += vp8_scalable_patterns.c
|
||||
vp8_scalable_patterns.GUID = 0D6A210B-F482-4D6F-8570-4A9C01ACC88C
|
||||
vp8_scalable_patterns.DESCRIPTION = Temporal Scalability Encoder
|
||||
UTILS-$(CONFIG_VP9_ENCODER) += vp9_spatial_scalable_encoder.c
|
||||
vp9_spatial_scalable_encoder.SRCS += args.c args.h
|
||||
vp9_spatial_scalable_encoder.SRCS += ivfenc.c ivfenc.h
|
||||
vp9_spatial_scalable_encoder.SRCS += tools_common.c tools_common.h
|
||||
vp9_spatial_scalable_encoder.GUID = 4A38598D-627D-4505-9C7B-D4020C84100D
|
||||
vp9_spatial_scalable_encoder.DESCRIPTION = Spatial Scalable Encoder
|
||||
|
||||
# Clean up old ivfenc, ivfdec binaries.
|
||||
ifeq ($(CONFIG_MSVS),yes)
|
||||
CLEAN-OBJS += $(foreach p,$(VS_PLATFORMS),$(p)/Release/ivfenc.exe)
|
||||
CLEAN-OBJS += $(foreach p,$(VS_PLATFORMS),$(p)/Release/ivfdec.exe)
|
||||
else
|
||||
CLEAN-OBJS += ivfenc{.c.o,.c.d,.dox,.exe,}
|
||||
CLEAN-OBJS += ivfdec{.c.o,.c.d,.dox,.exe,}
|
||||
endif
|
||||
|
||||
# XMA example disabled for now, not used in VP8
|
||||
#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_VP8_DECODER) += simple_decoder.c
|
||||
GEN_EXAMPLES-$(CONFIG_DECODERS) += simple_decoder.c
|
||||
simple_decoder.GUID = D3BBF1E9-2427-450D-BBFF-B2843C1D44CC
|
||||
simple_decoder.DESCRIPTION = Simplified decoder loop
|
||||
GEN_EXAMPLES-$(CONFIG_VP8_DECODER) += postproc.c
|
||||
GEN_EXAMPLES-$(CONFIG_DECODERS) += postproc.c
|
||||
postproc.GUID = 65E33355-F35E-4088-884D-3FD4905881D7
|
||||
postproc.DESCRIPTION = Decoder postprocessor control
|
||||
GEN_EXAMPLES-$(CONFIG_VP8_DECODER) += decode_to_md5.c
|
||||
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_VP8_ENCODER) += simple_encoder.c
|
||||
GEN_EXAMPLES-$(CONFIG_ENCODERS) += simple_encoder.c
|
||||
simple_encoder.GUID = 4607D299-8A71-4D2C-9B1D-071899B6FBFD
|
||||
simple_encoder.DESCRIPTION = Simplified encoder loop
|
||||
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += twopass_encoder.c
|
||||
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_VP8_ENCODER) += force_keyframe.c
|
||||
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_VP8_ENCODER) += decode_with_drops.c
|
||||
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
|
||||
ifeq ($(CONFIG_VP8_DECODER),yes)
|
||||
ifeq ($(CONFIG_DECODERS),yes)
|
||||
GEN_EXAMPLES-$(CONFIG_ERROR_CONCEALMENT) += decode_with_partial_drops.c
|
||||
endif
|
||||
decode_with_partial_drops.GUID = 61C2D026-5754-46AC-916F-1343ECC5537E
|
||||
decode_with_partial_drops.DESCRIPTION = Drops parts of frames while decoding
|
||||
GEN_EXAMPLES-$(CONFIG_VP8_ENCODER) += error_resilient.c
|
||||
GEN_EXAMPLES-$(CONFIG_ENCODERS) += error_resilient.c
|
||||
error_resilient.GUID = DF5837B9-4145-4F92-A031-44E4F832E00C
|
||||
error_resilient.DESCRIPTION = Error Resiliency Feature
|
||||
|
||||
@@ -110,11 +96,6 @@ 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
|
||||
|
||||
# C file is provided, not generated automatically.
|
||||
UTILS-$(CONFIG_MULTI_RES_ENCODING) += vp8_multi_resolution_encoder.c
|
||||
vp8_multi_resolution_encoder.SRCS += $(LIBYUV_SRCS)
|
||||
vp8_multi_resolution_encoder.GUID = 04f8738e-63c8-423b-90fa-7c2703a374de
|
||||
vp8_multi_resolution_encoder.DESCRIPTION = VP8 Multiple-resolution Encoding
|
||||
|
||||
# Handle extra library flags depending on codec configuration
|
||||
|
||||
@@ -122,11 +103,9 @@ vp8_multi_resolution_encoder.DESCRIPTION = VP8 Multiple-resolution Encoding
|
||||
# when building for bare-metal targets
|
||||
ifeq ($(CONFIG_OS_SUPPORT), yes)
|
||||
CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m
|
||||
CODEC_EXTRA_LIBS-$(CONFIG_VP9) += m
|
||||
else
|
||||
ifeq ($(CONFIG_GCC), yes)
|
||||
CODEC_EXTRA_LIBS-$(CONFIG_VP8) += m
|
||||
CODEC_EXTRA_LIBS-$(CONFIG_VP9) += m
|
||||
endif
|
||||
endif
|
||||
#
|
||||
@@ -145,8 +124,6 @@ else
|
||||
LIB_PATH-yes += $(if $(BUILD_PFX),$(BUILD_PFX),.)
|
||||
INC_PATH-$(CONFIG_VP8_DECODER) += $(SRC_PATH_BARE)/vp8
|
||||
INC_PATH-$(CONFIG_VP8_ENCODER) += $(SRC_PATH_BARE)/vp8
|
||||
INC_PATH-$(CONFIG_VP9_DECODER) += $(SRC_PATH_BARE)/vp9
|
||||
INC_PATH-$(CONFIG_VP9_ENCODER) += $(SRC_PATH_BARE)/vp9
|
||||
LIB_PATH := $(call enabled,LIB_PATH)
|
||||
INC_PATH := $(call enabled,INC_PATH)
|
||||
endif
|
||||
@@ -180,23 +157,22 @@ $(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)
|
||||
DIST-BINS-$(NOT_MSVS) += $(addprefix bin/,$(ALL_EXAMPLES:.c=$(EXE_SFX)))
|
||||
INSTALL-BINS-$(NOT_MSVS) += $(addprefix bin/,$(UTILS:.c=$(EXE_SFX)))
|
||||
DIST-BINS-$(NOT_MSVS) += $(addprefix bin/,$(ALL_EXAMPLES:.c=))
|
||||
INSTALL-BINS-$(NOT_MSVS) += $(addprefix bin/,$(UTILS:.c=))
|
||||
DIST-SRCS-yes += $(ALL_SRCS)
|
||||
INSTALL-SRCS-yes += $(UTIL_SRCS)
|
||||
OBJS-$(NOT_MSVS) += $(if $(BUILD_OBJS),$(call objs,$(ALL_SRCS)))
|
||||
BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=$(EXE_SFX)))
|
||||
BINS-$(NOT_MSVS) += $(addprefix $(BUILD_PFX),$(ALL_EXAMPLES:.c=))
|
||||
|
||||
|
||||
# Instantiate linker template for all examples.
|
||||
CODEC_LIB=$(if $(CONFIG_DEBUG_LIBS),vpx_g,vpx)
|
||||
SHARED_LIB_SUF=$(if $(filter darwin%,$(TGT_OS)),.dylib,.so)
|
||||
CODEC_LIB_SUF=$(if $(CONFIG_SHARED),$(SHARED_LIB_SUF),.a)
|
||||
CODEC_LIB_SUF=$(if $(CONFIG_SHARED),.so,.a)
|
||||
$(foreach bin,$(BINS-yes),\
|
||||
$(if $(BUILD_OBJS),$(eval $(bin):\
|
||||
$(LIB_PATH)/lib$(CODEC_LIB)$(CODEC_LIB_SUF)))\
|
||||
$(if $(BUILD_OBJS),$(eval $(call linker_template,$(bin),\
|
||||
$(call objs,$($(notdir $(bin:$(EXE_SFX)=)).SRCS)) \
|
||||
$(call objs,$($(notdir $(bin)).SRCS)) \
|
||||
-l$(CODEC_LIB) $(addprefix -l,$(CODEC_EXTRA_LIBS))\
|
||||
)))\
|
||||
$(if $(LIPO_OBJS),$(eval $(call lipo_bin_template,$(bin))))\
|
||||
@@ -206,9 +182,9 @@ $(foreach bin,$(BINS-yes),\
|
||||
# Rules to generate the GEN_EXAMPLES sources
|
||||
.PRECIOUS: %.c
|
||||
CLEAN-OBJS += $(GEN_EXAMPLES)
|
||||
%.c: examples/%.c
|
||||
%.c: examples/%.txt
|
||||
@echo " [EXAMPLE] $@"
|
||||
@cp $< $@
|
||||
@$(SRC_PATH_BARE)/examples/gen_example_code.sh $< > $@
|
||||
|
||||
|
||||
# The following pairs define a mapping of locations in the distribution
|
||||
@@ -221,7 +197,7 @@ INSTALL_MAPS += % %
|
||||
|
||||
# Set up additional MSVS environment
|
||||
ifeq ($(CONFIG_MSVS),yes)
|
||||
CODEC_LIB=$(if $(CONFIG_SHARED),vpx,$(if $(CONFIG_STATIC_MSVCRT),vpxmt,vpxmd))
|
||||
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))))
|
||||
@@ -236,20 +212,62 @@ endif
|
||||
# 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_SFX)=).SRCS) vpx.$(VCPROJ_SFX)
|
||||
$(1): $($(1:.vcproj=).SRCS)
|
||||
@echo " [vcproj] $$@"
|
||||
$$(GEN_VCPROJ)\
|
||||
$$(SRC_PATH_BARE)/build/make/gen_msvs_proj.sh\
|
||||
--exe\
|
||||
--target=$$(TOOLCHAIN)\
|
||||
--name=$$(@:.$(VCPROJ_SFX)=)\
|
||||
--name=$$(@:.vcproj=)\
|
||||
--ver=$$(CONFIG_VS_VERSION)\
|
||||
--proj-guid=$$($$(@:.$(VCPROJ_SFX)=).GUID)\
|
||||
--proj-guid=$$($$(@:.vcproj=).GUID)\
|
||||
$$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \
|
||||
--out=$$@ $$(INTERNAL_CFLAGS) $$(CFLAGS) \
|
||||
$$(INTERNAL_LDFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) $$^
|
||||
$$(INTERNAL_LDFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) -lwinmm $$^
|
||||
endef
|
||||
PROJECTS-$(CONFIG_MSVS) += $(ALL_EXAMPLES:.c=.$(VCPROJ_SFX))
|
||||
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 += $^" > $@
|
||||
|
||||
@@ -1,173 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
// Frame-by-frame MD5 Checksum
|
||||
// ===========================
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
// 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.
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||
#include "./vpx_config.h"
|
||||
#include "vpx/vp8dx.h"
|
||||
#include "vpx/vpx_decoder.h"
|
||||
#include "md5_utils.h"
|
||||
|
||||
#define VP8_FOURCC 0x30385056
|
||||
#define VP9_FOURCC 0x30395056
|
||||
|
||||
#define IVF_FILE_HDR_SZ (32)
|
||||
#define IVF_FRAME_HDR_SZ (12)
|
||||
|
||||
static vpx_codec_iface_t *get_codec_interface(unsigned int fourcc) {
|
||||
switch (fourcc) {
|
||||
case VP8_FOURCC:
|
||||
return vpx_codec_vp8_dx();
|
||||
case VP9_FOURCC:
|
||||
return vpx_codec_vp9_dx();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
static void get_image_md5(const vpx_image_t *img, unsigned char digest[16]) {
|
||||
int plane, y;
|
||||
MD5Context md5;
|
||||
|
||||
MD5Init(&md5);
|
||||
|
||||
for (plane = 0; plane < 3; ++plane) {
|
||||
const unsigned char *buf = img->planes[plane];
|
||||
const int stride = img->stride[plane];
|
||||
const int w = plane ? (img->d_w + 1) >> 1 : img->d_w;
|
||||
const int h = plane ? (img->d_h + 1) >> 1 : img->d_h;
|
||||
|
||||
for (y = 0; y < h; ++y) {
|
||||
MD5Update(&md5, buf, w);
|
||||
buf += stride;
|
||||
}
|
||||
}
|
||||
|
||||
MD5Final(digest, &md5);
|
||||
}
|
||||
|
||||
static void print_md5(FILE *stream, unsigned char digest[16]) {
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 16; ++i)
|
||||
fprintf(stream, "%02x", digest[i]);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
FILE *infile, *outfile;
|
||||
vpx_codec_ctx_t codec;
|
||||
vpx_codec_iface_t *iface;
|
||||
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];
|
||||
|
||||
if (argc != 3)
|
||||
die("Usage: %s <infile> <outfile>\n", argv[0]);
|
||||
|
||||
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]);
|
||||
|
||||
if (!(fread(file_hdr, 1, IVF_FILE_HDR_SZ, infile) == IVF_FILE_HDR_SZ &&
|
||||
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]);
|
||||
|
||||
iface = get_codec_interface(mem_get_le32(file_hdr + 8));
|
||||
if (!iface)
|
||||
die("Unknown FOURCC code.");
|
||||
|
||||
|
||||
printf("Using %s\n", vpx_codec_iface_name(iface));
|
||||
|
||||
if (vpx_codec_dec_init(&codec, iface, NULL, flags))
|
||||
die_codec(&codec, "Failed to initialize decoder");
|
||||
|
||||
while (fread(frame_hdr, 1, IVF_FRAME_HDR_SZ, infile) == IVF_FRAME_HDR_SZ) {
|
||||
const int frame_size = mem_get_le32(frame_hdr);
|
||||
vpx_codec_iter_t iter = NULL;
|
||||
vpx_image_t *img;
|
||||
|
||||
if (frame_size > sizeof(frame))
|
||||
die("Frame %d data too big for example code buffer", frame_size);
|
||||
|
||||
if (fread(frame, 1, frame_size, infile) != frame_size)
|
||||
die("Failed to read complete frame");
|
||||
|
||||
if (vpx_codec_decode(&codec, frame, frame_size, NULL, 0))
|
||||
die_codec(&codec, "Failed to decode frame");
|
||||
|
||||
while ((img = vpx_codec_get_frame(&codec, &iter)) != NULL) {
|
||||
unsigned char digest[16];
|
||||
|
||||
get_image_md5(img, digest);
|
||||
print_md5(outfile, digest);
|
||||
fprintf(outfile, " img-%dx%d-%04d.i420\n",
|
||||
img->d_w, img->d_h, ++frame_cnt);
|
||||
}
|
||||
}
|
||||
|
||||
printf("Processed %d frames.\n", frame_cnt);
|
||||
if (vpx_codec_destroy(&codec))
|
||||
die_codec(&codec, "Failed to destroy codec");
|
||||
|
||||
fclose(outfile);
|
||||
fclose(infile);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
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];
|
||||
MD5Context md5;
|
||||
int i;
|
||||
|
||||
MD5Init(&md5);
|
||||
|
||||
for(plane=0; plane < 3; plane++) {
|
||||
unsigned char *buf =img->planes[plane];
|
||||
|
||||
for(y=0; y < (plane ? (img->d_h + 1) >> 1 : img->d_h); y++) {
|
||||
MD5Update(&md5, buf, (plane ? (img->d_w + 1) >> 1 : img->d_w));
|
||||
buf += img->stride[plane];
|
||||
}
|
||||
}
|
||||
|
||||
MD5Final(md5_sum, &md5);
|
||||
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
|
||||
@@ -1,177 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
// Decode With Drops Example
|
||||
// =========================
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
// 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:
|
||||
//
|
||||
// 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:
|
||||
//
|
||||
//
|
||||
// Making The Drop Decision
|
||||
// ------------------------
|
||||
// The example decides whether to drop the frame based on the current
|
||||
// frame number, immediately before decoding the frame.
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||
#include "./vpx_config.h"
|
||||
#include "vpx/vp8dx.h"
|
||||
#include "vpx/vpx_decoder.h"
|
||||
#define interface (vpx_codec_vp8_dx())
|
||||
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
int n, m, is_range;
|
||||
|
||||
(void)res;
|
||||
/* Open files */
|
||||
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]);
|
||||
}
|
||||
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 */
|
||||
if(!(fread(file_hdr, 1, IVF_FILE_HDR_SZ, infile) == IVF_FILE_HDR_SZ
|
||||
&& 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));
|
||||
/* Initialize codec */
|
||||
if(vpx_codec_dec_init(&codec, interface, NULL, flags))
|
||||
die_codec(&codec, "Failed to initialize decoder");
|
||||
|
||||
/* 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);
|
||||
|
||||
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);
|
||||
/* Decode the frame */
|
||||
if(vpx_codec_decode(&codec, frame, frame_sz, NULL, 0))
|
||||
die_codec(&codec, "Failed to decode frame");
|
||||
|
||||
/* Write decoded data to disk */
|
||||
while((img = vpx_codec_get_frame(&codec, &iter))) {
|
||||
unsigned int plane, y;
|
||||
|
||||
for(plane=0; plane < 3; plane++) {
|
||||
unsigned char *buf =img->planes[plane];
|
||||
|
||||
for(y=0; y < (plane ? (img->d_h + 1) >> 1 : img->d_h); y++) {
|
||||
(void) fwrite(buf, 1, (plane ? (img->d_w + 1) >> 1 : img->d_w),
|
||||
outfile);
|
||||
buf += img->stride[plane];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Processed %d frames.\n",frame_cnt);
|
||||
if(vpx_codec_destroy(&codec))
|
||||
die_codec(&codec, "Failed to destroy codec");
|
||||
|
||||
fclose(outfile);
|
||||
fclose(infile);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
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
|
||||
@@ -1,328 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
// Decode With Partial Drops Example
|
||||
// =========================
|
||||
//
|
||||
// This is an example utility which drops a series of frames (or parts of
|
||||
// frames), as specified on the command line. This is useful for observing the
|
||||
// error recovery features of the codec.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
// 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_partial_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_partial_drops in.ivf out.i420 3/7
|
||||
//
|
||||
// Dropping Random Parts Of Frames
|
||||
// -------------------------------
|
||||
// A third argument tuple is available to split the frame into 1500 bytes pieces
|
||||
// and randomly drop pieces rather than frames. The frame will be split at
|
||||
// partition boundaries where possible. The following example will seed the RNG
|
||||
// with the seed 123 and drop approximately 5% of the pieces. Pieces which
|
||||
// are depending on an already dropped piece will also be dropped.
|
||||
//
|
||||
// $ ./decode_with_partial_drops in.ivf out.i420 5,123
|
||||
//
|
||||
// Extra Variables
|
||||
// ---------------
|
||||
// This example maintains the pattern passed on the command line in the
|
||||
// `n`, `m`, and `is_range` variables:
|
||||
//
|
||||
// Making The Drop Decision
|
||||
// ------------------------
|
||||
// The example decides whether to drop the frame based on the current
|
||||
// frame number, immediately before decoding the frame.
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||
#include "./vpx_config.h"
|
||||
#include "vpx/vp8dx.h"
|
||||
#include "vpx/vpx_decoder.h"
|
||||
#define interface (vpx_codec_vp8_dx())
|
||||
#include <time.h>
|
||||
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
struct parsed_header
|
||||
{
|
||||
char key_frame;
|
||||
int version;
|
||||
char show_frame;
|
||||
int first_part_size;
|
||||
};
|
||||
|
||||
int next_packet(struct parsed_header* hdr, int pos, int length, int mtu)
|
||||
{
|
||||
int size = 0;
|
||||
int remaining = length - pos;
|
||||
/* Uncompressed part is 3 bytes for P frames and 10 bytes for I frames */
|
||||
int uncomp_part_size = (hdr->key_frame ? 10 : 3);
|
||||
/* number of bytes yet to send from header and the first partition */
|
||||
int remainFirst = uncomp_part_size + hdr->first_part_size - pos;
|
||||
if (remainFirst > 0)
|
||||
{
|
||||
if (remainFirst <= mtu)
|
||||
{
|
||||
size = remainFirst;
|
||||
}
|
||||
else
|
||||
{
|
||||
size = mtu;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/* second partition; just slot it up according to MTU */
|
||||
if (remaining <= mtu)
|
||||
{
|
||||
size = remaining;
|
||||
return size;
|
||||
}
|
||||
return mtu;
|
||||
}
|
||||
|
||||
void throw_packets(unsigned char* frame, int* size, int loss_rate,
|
||||
int* thrown, int* kept)
|
||||
{
|
||||
unsigned char loss_frame[256*1024];
|
||||
int pkg_size = 1;
|
||||
int pos = 0;
|
||||
int loss_pos = 0;
|
||||
struct parsed_header hdr;
|
||||
unsigned int tmp;
|
||||
int mtu = 1500;
|
||||
|
||||
if (*size < 3)
|
||||
{
|
||||
return;
|
||||
}
|
||||
putc('|', stdout);
|
||||
/* parse uncompressed 3 bytes */
|
||||
tmp = (frame[2] << 16) | (frame[1] << 8) | frame[0];
|
||||
hdr.key_frame = !(tmp & 0x1); /* inverse logic */
|
||||
hdr.version = (tmp >> 1) & 0x7;
|
||||
hdr.show_frame = (tmp >> 4) & 0x1;
|
||||
hdr.first_part_size = (tmp >> 5) & 0x7FFFF;
|
||||
|
||||
/* don't drop key frames */
|
||||
if (hdr.key_frame)
|
||||
{
|
||||
int i;
|
||||
*kept = *size/mtu + ((*size % mtu > 0) ? 1 : 0); /* approximate */
|
||||
for (i=0; i < *kept; i++)
|
||||
putc('.', stdout);
|
||||
return;
|
||||
}
|
||||
|
||||
while ((pkg_size = next_packet(&hdr, pos, *size, mtu)) > 0)
|
||||
{
|
||||
int loss_event = ((rand() + 1.0)/(RAND_MAX + 1.0) < loss_rate/100.0);
|
||||
if (*thrown == 0 && !loss_event)
|
||||
{
|
||||
memcpy(loss_frame + loss_pos, frame + pos, pkg_size);
|
||||
loss_pos += pkg_size;
|
||||
(*kept)++;
|
||||
putc('.', stdout);
|
||||
}
|
||||
else
|
||||
{
|
||||
(*thrown)++;
|
||||
putc('X', stdout);
|
||||
}
|
||||
pos += pkg_size;
|
||||
}
|
||||
memcpy(frame, loss_frame, loss_pos);
|
||||
memset(frame + loss_pos, 0, *size - loss_pos);
|
||||
*size = loss_pos;
|
||||
}
|
||||
|
||||
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;
|
||||
int n, m, mode;
|
||||
unsigned int seed;
|
||||
int thrown=0, kept=0;
|
||||
int thrown_frame=0, kept_frame=0;
|
||||
vpx_codec_dec_cfg_t dec_cfg = {0};
|
||||
|
||||
(void)res;
|
||||
/* Open files */
|
||||
if(argc < 4 || argc > 6)
|
||||
die("Usage: %s <infile> <outfile> [-t <num threads>] <N-M|N/M|L,S>\n",
|
||||
argv[0]);
|
||||
{
|
||||
char *nptr;
|
||||
int arg_num = 3;
|
||||
if (argc == 6 && strncmp(argv[arg_num++], "-t", 2) == 0)
|
||||
dec_cfg.threads = strtol(argv[arg_num++], NULL, 0);
|
||||
n = strtol(argv[arg_num], &nptr, 0);
|
||||
mode = (*nptr == '\0' || *nptr == ',') ? 2 : (*nptr == '-') ? 1 : 0;
|
||||
|
||||
m = strtol(nptr+1, NULL, 0);
|
||||
if((!n && !m) || (*nptr != '-' && *nptr != '/' &&
|
||||
*nptr != '\0' && *nptr != ','))
|
||||
die("Couldn't parse pattern %s\n", argv[3]);
|
||||
}
|
||||
seed = (m > 0) ? m : (unsigned int)time(NULL);
|
||||
srand(seed);thrown_frame = 0;
|
||||
printf("Seed: %u\n", seed);
|
||||
printf("Threads: %d\n", dec_cfg.threads);
|
||||
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 */
|
||||
if(!(fread(file_hdr, 1, IVF_FILE_HDR_SZ, infile) == IVF_FILE_HDR_SZ
|
||||
&& 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));
|
||||
/* Initialize codec */
|
||||
flags = VPX_CODEC_USE_ERROR_CONCEALMENT;
|
||||
res = vpx_codec_dec_init(&codec, interface, &dec_cfg, flags);
|
||||
if(res)
|
||||
die_codec(&codec, "Failed to initialize decoder");
|
||||
|
||||
|
||||
/* 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);
|
||||
|
||||
/* Decide whether to throw parts of the frame or the whole frame
|
||||
depending on the drop mode */
|
||||
thrown_frame = 0;
|
||||
kept_frame = 0;
|
||||
switch (mode)
|
||||
{
|
||||
case 0:
|
||||
if (m - (frame_cnt-1)%m <= n)
|
||||
{
|
||||
frame_sz = 0;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (frame_cnt >= n && frame_cnt <= m)
|
||||
{
|
||||
frame_sz = 0;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
throw_packets(frame, &frame_sz, n, &thrown_frame, &kept_frame);
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
if (mode < 2)
|
||||
{
|
||||
if (frame_sz == 0)
|
||||
{
|
||||
putc('X', stdout);
|
||||
thrown_frame++;
|
||||
}
|
||||
else
|
||||
{
|
||||
putc('.', stdout);
|
||||
kept_frame++;
|
||||
}
|
||||
}
|
||||
thrown += thrown_frame;
|
||||
kept += kept_frame;
|
||||
fflush(stdout);
|
||||
/* Decode the frame */
|
||||
if(vpx_codec_decode(&codec, frame, frame_sz, NULL, 0))
|
||||
die_codec(&codec, "Failed to decode frame");
|
||||
|
||||
/* Write decoded data to disk */
|
||||
while((img = vpx_codec_get_frame(&codec, &iter))) {
|
||||
unsigned int plane, y;
|
||||
|
||||
for(plane=0; plane < 3; plane++) {
|
||||
unsigned char *buf =img->planes[plane];
|
||||
|
||||
for(y=0; y < (plane ? (img->d_h + 1) >> 1 : img->d_h); y++) {
|
||||
(void) fwrite(buf, 1, (plane ? (img->d_w + 1) >> 1 : img->d_w),
|
||||
outfile);
|
||||
buf += img->stride[plane];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("Processed %d frames.\n",frame_cnt);
|
||||
if(vpx_codec_destroy(&codec))
|
||||
die_codec(&codec, "Failed to destroy codec");
|
||||
|
||||
fclose(outfile);
|
||||
fclose(infile);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
238
examples/decode_with_partial_drops.txt
Normal file
238
examples/decode_with_partial_drops.txt
Normal file
@@ -0,0 +1,238 @@
|
||||
@TEMPLATE decoder_tmpl.c
|
||||
Decode With Partial Drops Example
|
||||
=========================
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
|
||||
This is an example utility which drops a series of frames (or parts of frames),
|
||||
as specified on the command line. This is useful for observing the error
|
||||
recovery features of the codec.
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ INTRODUCTION
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
|
||||
#include <time.h>
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EXTRA_INCLUDES
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
|
||||
struct parsed_header
|
||||
{
|
||||
char key_frame;
|
||||
int version;
|
||||
char show_frame;
|
||||
int first_part_size;
|
||||
};
|
||||
|
||||
int next_packet(struct parsed_header* hdr, int pos, int length, int mtu)
|
||||
{
|
||||
int size = 0;
|
||||
int remaining = length - pos;
|
||||
/* Uncompressed part is 3 bytes for P frames and 10 bytes for I frames */
|
||||
int uncomp_part_size = (hdr->key_frame ? 10 : 3);
|
||||
/* number of bytes yet to send from header and the first partition */
|
||||
int remainFirst = uncomp_part_size + hdr->first_part_size - pos;
|
||||
if (remainFirst > 0)
|
||||
{
|
||||
if (remainFirst <= mtu)
|
||||
{
|
||||
size = remainFirst;
|
||||
}
|
||||
else
|
||||
{
|
||||
size = mtu;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
/* second partition; just slot it up according to MTU */
|
||||
if (remaining <= mtu)
|
||||
{
|
||||
size = remaining;
|
||||
return size;
|
||||
}
|
||||
return mtu;
|
||||
}
|
||||
|
||||
void throw_packets(unsigned char* frame, int* size, int loss_rate,
|
||||
int* thrown, int* kept)
|
||||
{
|
||||
unsigned char loss_frame[256*1024];
|
||||
int pkg_size = 1;
|
||||
int pos = 0;
|
||||
int loss_pos = 0;
|
||||
struct parsed_header hdr;
|
||||
unsigned int tmp;
|
||||
int mtu = 1500;
|
||||
|
||||
if (*size < 3)
|
||||
{
|
||||
return;
|
||||
}
|
||||
putc('|', stdout);
|
||||
/* parse uncompressed 3 bytes */
|
||||
tmp = (frame[2] << 16) | (frame[1] << 8) | frame[0];
|
||||
hdr.key_frame = !(tmp & 0x1); /* inverse logic */
|
||||
hdr.version = (tmp >> 1) & 0x7;
|
||||
hdr.show_frame = (tmp >> 4) & 0x1;
|
||||
hdr.first_part_size = (tmp >> 5) & 0x7FFFF;
|
||||
|
||||
/* don't drop key frames */
|
||||
if (hdr.key_frame)
|
||||
{
|
||||
int i;
|
||||
*kept = *size/mtu + ((*size % mtu > 0) ? 1 : 0); /* approximate */
|
||||
for (i=0; i < *kept; i++)
|
||||
putc('.', stdout);
|
||||
return;
|
||||
}
|
||||
|
||||
while ((pkg_size = next_packet(&hdr, pos, *size, mtu)) > 0)
|
||||
{
|
||||
int loss_event = ((rand() + 1.0)/(RAND_MAX + 1.0) < loss_rate/100.0);
|
||||
if (*thrown == 0 && !loss_event)
|
||||
{
|
||||
memcpy(loss_frame + loss_pos, frame + pos, pkg_size);
|
||||
loss_pos += pkg_size;
|
||||
(*kept)++;
|
||||
putc('.', stdout);
|
||||
}
|
||||
else
|
||||
{
|
||||
(*thrown)++;
|
||||
putc('X', stdout);
|
||||
}
|
||||
pos += pkg_size;
|
||||
}
|
||||
memcpy(frame, loss_frame, loss_pos);
|
||||
memset(frame + loss_pos, 0, *size - loss_pos);
|
||||
*size = loss_pos;
|
||||
}
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
|
||||
/* Initialize codec */
|
||||
flags = VPX_CODEC_USE_ERROR_CONCEALMENT;
|
||||
res = vpx_codec_dec_init(&codec, interface, &dec_cfg, flags);
|
||||
if(res)
|
||||
die_codec(&codec, "Failed to initialize decoder");
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INIT
|
||||
|
||||
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 || argc > 6)
|
||||
die("Usage: %s <infile> <outfile> [-t <num threads>] <N-M|N/M|L,S>\n",
|
||||
argv[0]);
|
||||
{
|
||||
char *nptr;
|
||||
int arg_num = 3;
|
||||
if (argc == 6 && strncmp(argv[arg_num++], "-t", 2) == 0)
|
||||
dec_cfg.threads = strtol(argv[arg_num++], NULL, 0);
|
||||
n = strtol(argv[arg_num], &nptr, 0);
|
||||
mode = (*nptr == '\0' || *nptr == ',') ? 2 : (*nptr == '-') ? 1 : 0;
|
||||
|
||||
m = strtol(nptr+1, NULL, 0);
|
||||
if((!n && !m) || (*nptr != '-' && *nptr != '/' &&
|
||||
*nptr != '\0' && *nptr != ','))
|
||||
die("Couldn't parse pattern %s\n", argv[3]);
|
||||
}
|
||||
seed = (m > 0) ? m : (unsigned int)time(NULL);
|
||||
srand(seed);thrown_frame = 0;
|
||||
printf("Seed: %u\n", seed);
|
||||
printf("Threads: %d\n", dec_cfg.threads);
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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_partial_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_partial_drops in.ivf out.i420 3/7
|
||||
|
||||
Dropping Random Parts Of Frames
|
||||
-------------------------------
|
||||
A third argument tuple is available to split the frame into 1500 bytes pieces
|
||||
and randomly drop pieces rather than frames. The frame will be split at
|
||||
partition boundaries where possible. The following example will seed the RNG
|
||||
with the seed 123 and drop approximately 5% of the pieces. Pieces which
|
||||
are depending on an already dropped piece will also be dropped.
|
||||
|
||||
$ ./decode_with_partial_drops in.ivf out.i420 5,123
|
||||
|
||||
|
||||
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, mode;
|
||||
unsigned int seed;
|
||||
int thrown=0, kept=0;
|
||||
int thrown_frame=0, kept_frame=0;
|
||||
vpx_codec_dec_cfg_t dec_cfg = {0};
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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
|
||||
/* Decide whether to throw parts of the frame or the whole frame
|
||||
depending on the drop mode */
|
||||
thrown_frame = 0;
|
||||
kept_frame = 0;
|
||||
switch (mode)
|
||||
{
|
||||
case 0:
|
||||
if (m - (frame_cnt-1)%m <= n)
|
||||
{
|
||||
frame_sz = 0;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (frame_cnt >= n && frame_cnt <= m)
|
||||
{
|
||||
frame_sz = 0;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
throw_packets(frame, &frame_sz, n, &thrown_frame, &kept_frame);
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
if (mode < 2)
|
||||
{
|
||||
if (frame_sz == 0)
|
||||
{
|
||||
putc('X', stdout);
|
||||
thrown_frame++;
|
||||
}
|
||||
else
|
||||
{
|
||||
putc('.', stdout);
|
||||
kept_frame++;
|
||||
}
|
||||
}
|
||||
thrown += thrown_frame;
|
||||
kept += kept_frame;
|
||||
fflush(stdout);
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PRE_DECODE
|
||||
103
examples/decoder_tmpl.c
Normal file
103
examples/decoder_tmpl.c
Normal file
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. 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/vpx_decoder.h"
|
||||
#include "vpx/vp8dx.h"
|
||||
#define interface (vpx_codec_vp8_dx())
|
||||
@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
|
||||
|
||||
@HELPERS
|
||||
|
||||
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 */
|
||||
if(!(fread(file_hdr, 1, IVF_FILE_HDR_SZ, infile) == IVF_FILE_HDR_SZ
|
||||
&& 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;
|
||||
}
|
||||
62
examples/decoder_tmpl.txt
Normal file
62
examples/decoder_tmpl.txt
Normal file
@@ -0,0 +1,62 @@
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
|
||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||
#include "vpx/vpx_decoder.h"
|
||||
#include "vpx/vp8dx.h"
|
||||
#define interface (vpx_codec_vp8_dx())
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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 < (plane ? (img->d_h + 1) >> 1 : img->d_h); y++) {
|
||||
if(fwrite(buf, 1, (plane ? (img->d_w + 1) >> 1 : img->d_w),
|
||||
outfile));
|
||||
buf += img->stride[plane];
|
||||
}
|
||||
}
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_DX
|
||||
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
|
||||
if(vpx_codec_destroy(&codec))
|
||||
die_codec(&codec, "Failed to destroy codec");
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
|
||||
@@ -8,23 +8,10 @@
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
// Error Resiliency Features
|
||||
// =========================
|
||||
//
|
||||
// This is an example demonstrating how to enable the error resiliency
|
||||
// features of the codec.
|
||||
//
|
||||
// Configuration
|
||||
// -------------
|
||||
// Error resiliency is controlled by the g_error_resilient member of the
|
||||
// configuration structure.
|
||||
//
|
||||
// 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.
|
||||
|
||||
/*
|
||||
@*INTRODUCTION
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
@@ -34,6 +21,7 @@
|
||||
#include "vpx/vp8cx.h"
|
||||
#define interface (vpx_codec_vp8_cx())
|
||||
#define fourcc 0x30385056
|
||||
@EXTRA_INCLUDES
|
||||
|
||||
#define IVF_FILE_HDR_SZ (32)
|
||||
#define IVF_FRAME_HDR_SZ (12)
|
||||
@@ -60,14 +48,7 @@ static void die(const char *fmt, ...) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
static int read_frame(FILE *f, vpx_image_t *img) {
|
||||
size_t nbytes, to_read;
|
||||
@@ -104,7 +85,7 @@ static void write_ivf_file_header(FILE *outfile,
|
||||
mem_put_le32(header+24, frame_cnt); /* length */
|
||||
mem_put_le32(header+28, 0); /* unused */
|
||||
|
||||
(void) fwrite(header, 1, 32, outfile);
|
||||
if(fwrite(header, 1, 32, outfile));
|
||||
}
|
||||
|
||||
|
||||
@@ -122,7 +103,7 @@ static void write_ivf_frame_header(FILE *outfile,
|
||||
mem_put_le32(header+4, pts&0xFFFFFFFF);
|
||||
mem_put_le32(header+8, pts >> 32);
|
||||
|
||||
(void) fwrite(header, 1, 12, outfile);
|
||||
if(fwrite(header, 1, 12, outfile));
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
@@ -137,10 +118,10 @@ int main(int argc, char **argv) {
|
||||
int frame_avail;
|
||||
int got_data;
|
||||
int flags = 0;
|
||||
@@@@TWOPASS_VARS
|
||||
|
||||
/* Open files */
|
||||
if(argc!=5)
|
||||
die("Usage: %s <width> <height> <infile> <outfile>\n", argv[0]);
|
||||
@@@@USAGE
|
||||
width = strtol(argv[1], NULL, 0);
|
||||
height = strtol(argv[2], NULL, 0);
|
||||
if(width < 16 || width%2 || height <16 || height%2)
|
||||
@@ -152,32 +133,20 @@ int main(int argc, char **argv) {
|
||||
|
||||
printf("Using %s\n",vpx_codec_iface_name(interface));
|
||||
|
||||
/* 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
|
||||
|
||||
/* 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;
|
||||
|
||||
/* Enable error resilient mode */
|
||||
cfg.g_error_resilient = 1;
|
||||
@@@@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]);
|
||||
|
||||
/* Initialize codec */
|
||||
if(vpx_codec_enc_init(&codec, interface, &cfg, 0))
|
||||
die_codec(&codec, "Failed to initialize encoder");
|
||||
@@@@@@@@ENC_INIT
|
||||
|
||||
frame_avail = 1;
|
||||
got_data = 0;
|
||||
@@ -185,19 +154,14 @@ int main(int argc, char **argv) {
|
||||
vpx_codec_iter_t iter = NULL;
|
||||
const vpx_codec_cx_pkt_t *pkt;
|
||||
|
||||
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");
|
||||
@@@@@@@@@@@@PER_FRAME_CFG
|
||||
@@@@@@@@@@@@ENCODE_FRAME
|
||||
got_data = 0;
|
||||
while( (pkt = vpx_codec_get_cx_data(&codec, &iter)) ) {
|
||||
got_data = 1;
|
||||
switch(pkt->kind) {
|
||||
case VPX_CODEC_CX_FRAME_PKT:
|
||||
write_ivf_frame_header(outfile, pkt);
|
||||
(void) fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz,
|
||||
outfile);
|
||||
break;
|
||||
@@@@@@@@@@@@@@@@PROCESS_FRAME
|
||||
@@@@@@@@@@@@@@@@PROCESS_STATS
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -209,11 +173,10 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
printf("\n");
|
||||
fclose(infile);
|
||||
@@@@TWOPASS_LOOP_END
|
||||
|
||||
printf("Processed %d frames.\n",frame_cnt-1);
|
||||
vpx_img_free(&raw);
|
||||
if(vpx_codec_destroy(&codec))
|
||||
die_codec(&codec, "Failed to destroy codec");
|
||||
@@@@DESTROY
|
||||
|
||||
/* Try to rewrite the file header with the actual frame count */
|
||||
if(!fseek(outfile, 0, SEEK_SET))
|
||||
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/vpx_encoder.h"
|
||||
#include "vpx/vp8cx.h"
|
||||
#define interface (vpx_codec_vp8_cx())
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 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);
|
||||
if(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.
|
||||
@@ -1,193 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. 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/vpx_decoder.h"
|
||||
#include "vpx/vpx_integer.h"
|
||||
#if CONFIG_VP9_DECODER
|
||||
#include "vpx/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_VP9_DECODER
|
||||
{"vp9", &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;
|
||||
|
||||
}
|
||||
@@ -1,225 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. All contributing project authors may
|
||||
* be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
// Forcing A Keyframe
|
||||
// ==================
|
||||
//
|
||||
// This is an example demonstrating how to control placement of keyframes
|
||||
// on a frame-by-frame basis.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
// 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.
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||
#include "vpx/vpx_encoder.h"
|
||||
#include "vpx/vp8cx.h"
|
||||
#define interface (vpx_codec_vp8_cx())
|
||||
#define fourcc 0x30385056
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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 */
|
||||
|
||||
(void) 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);
|
||||
|
||||
(void) 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;
|
||||
vpx_image_t raw;
|
||||
vpx_codec_err_t res;
|
||||
long width;
|
||||
long height;
|
||||
int frame_avail;
|
||||
int got_data;
|
||||
int flags = 0;
|
||||
|
||||
/* Open files */
|
||||
if(argc!=5)
|
||||
die("Usage: %s <width> <height> <infile> <outfile>\n", argv[0]);
|
||||
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, VPX_IMG_FMT_I420, 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));
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
|
||||
write_ivf_file_header(outfile, &cfg, 0);
|
||||
|
||||
|
||||
/* Open input file for this encoding pass */
|
||||
if(!(infile = fopen(argv[3], "rb")))
|
||||
die("Failed to open %s for reading", argv[3]);
|
||||
|
||||
/* Initialize codec */
|
||||
if(vpx_codec_enc_init(&codec, interface, &cfg, 0))
|
||||
die_codec(&codec, "Failed to initialize encoder");
|
||||
|
||||
frame_avail = 1;
|
||||
got_data = 0;
|
||||
while(frame_avail || got_data) {
|
||||
vpx_codec_iter_t iter = NULL;
|
||||
const vpx_codec_cx_pkt_t *pkt;
|
||||
|
||||
if(!(frame_cnt & 7))
|
||||
flags |= VPX_EFLAG_FORCE_KF;
|
||||
else
|
||||
flags &= ~VPX_EFLAG_FORCE_KF;
|
||||
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");
|
||||
got_data = 0;
|
||||
while( (pkt = vpx_codec_get_cx_data(&codec, &iter)) ) {
|
||||
got_data = 1;
|
||||
switch(pkt->kind) {
|
||||
case VPX_CODEC_CX_FRAME_PKT:
|
||||
write_ivf_frame_header(outfile, pkt);
|
||||
(void) fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz,
|
||||
outfile);
|
||||
break;
|
||||
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);
|
||||
|
||||
printf("Processed %d frames.\n",frame_cnt-1);
|
||||
vpx_img_free(&raw);
|
||||
if(vpx_codec_destroy(&codec))
|
||||
die_codec(&codec, "Failed to destroy codec");
|
||||
|
||||
/* 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;
|
||||
}
|
||||
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.
|
||||
85
examples/gen_example_code.sh
Executable file
85
examples/gen_example_code.sh
Executable file
@@ -0,0 +1,85 @@
|
||||
#!/bin/bash
|
||||
##
|
||||
## Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
##
|
||||
## Use of this source code is governed by a BSD-style license
|
||||
## that can be found in the LICENSE file in the root of the source
|
||||
## tree. An additional intellectual property rights grant can be found
|
||||
## in the file PATENTS. 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"
|
||||
224
examples/gen_example_doxy.php
Executable file
224
examples/gen_example_doxy.php
Executable file
@@ -0,0 +1,224 @@
|
||||
#!/usr/bin/env php
|
||||
/*
|
||||
* Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
*
|
||||
* Use of this source code is governed by a BSD-style license
|
||||
* that can be found in the LICENSE file in the root of the source
|
||||
* tree. An additional intellectual property rights grant can be found
|
||||
* in the file PATENTS. 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;
|
||||
|
||||
}
|
||||
84
examples/gen_example_text.sh
Executable file
84
examples/gen_example_text.sh
Executable file
@@ -0,0 +1,84 @@
|
||||
#!/bin/bash
|
||||
##
|
||||
## Copyright (c) 2010 The WebM project authors. All Rights Reserved.
|
||||
##
|
||||
## Use of this source code is governed by a BSD-style license
|
||||
## that can be found in the LICENSE file in the root of the source
|
||||
## tree. An additional intellectual property rights grant can be found
|
||||
## in the file PATENTS. 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
@@ -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>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user