Removing examples code generation and making them static.
All documentation will be provided as comments in the source files. Change-Id: Ie609852747733c181191f864204c787a6b23ef3a
1
docs.mk
@ -31,7 +31,6 @@ 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 $^ > $@
|
||||
|
46
examples.mk
@ -205,9 +205,9 @@ $(foreach bin,$(BINS-yes),\
|
||||
# Rules to generate the GEN_EXAMPLES sources
|
||||
.PRECIOUS: %.c
|
||||
CLEAN-OBJS += $(GEN_EXAMPLES)
|
||||
%.c: examples/%.txt
|
||||
%.c: examples/%.c
|
||||
@echo " [EXAMPLE] $@"
|
||||
@$(SRC_PATH_BARE)/examples/gen_example_code.sh $< > $@
|
||||
@cp $< $@
|
||||
|
||||
|
||||
# The following pairs define a mapping of locations in the distribution
|
||||
@ -252,45 +252,3 @@ 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 += $^" > $@
|
||||
|
149
examples/decode_to_md5.c
Normal file
@ -0,0 +1,149 @@
|
||||
/*
|
||||
* 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"
|
||||
#define interface (vpx_codec_vp8_dx())
|
||||
#include "md5_utils.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);
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
|
||||
(void)res;
|
||||
/* Open files */
|
||||
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]);
|
||||
|
||||
/* 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);
|
||||
|
||||
/* 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;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
@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
|
177
examples/decode_with_drops.c
Normal file
@ -0,0 +1,177 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
@ -1,73 +0,0 @@
|
||||
@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
|
328
examples/decode_with_partial_drops.c
Normal file
@ -0,0 +1,328 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
@ -1,238 +0,0 @@
|
||||
@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
|
@ -1,104 +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.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
@*INTRODUCTION
|
||||
*/
|
||||
#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())
|
||||
@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;
|
||||
}
|
@ -1,62 +0,0 @@
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DEC_INCLUDES
|
||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||
#include "vpx/vpx_decoder.h"
|
||||
#include "vpx/vp9dx.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++) {
|
||||
(void) 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
|
@ -1,74 +0,0 @@
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ENC_INCLUDES
|
||||
#define VPX_CODEC_DISABLE_COMPAT 1
|
||||
#include "vpx/vpx_encoder.h"
|
||||
#include "vpx/vp9cx.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);
|
||||
(void) fwrite(pkt->data.frame.buf, 1, pkt->data.frame.sz,
|
||||
outfile);
|
||||
break;
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PROCESS_FRAME
|
||||
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
|
||||
vpx_img_free(&raw);
|
||||
if(vpx_codec_destroy(&codec))
|
||||
die_codec(&codec, "Failed to destroy codec");
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DESTROY
|
@ -8,10 +8,23 @@
|
||||
* 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>
|
||||
@ -21,7 +34,6 @@
|
||||
#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)
|
||||
@ -48,7 +60,14 @@ static void die(const char *fmt, ...) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
static int read_frame(FILE *f, vpx_image_t *img) {
|
||||
size_t nbytes, to_read;
|
||||
@ -118,10 +137,10 @@ int main(int argc, char **argv) {
|
||||
int frame_avail;
|
||||
int got_data;
|
||||
int flags = 0;
|
||||
@@@@TWOPASS_VARS
|
||||
|
||||
/* Open files */
|
||||
@@@@USAGE
|
||||
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)
|
||||
@ -133,20 +152,32 @@ int main(int argc, char **argv) {
|
||||
|
||||
printf("Using %s\n",vpx_codec_iface_name(interface));
|
||||
|
||||
@@@@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_SET_CFG
|
||||
@@@@ENC_SET_CFG2
|
||||
/* 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;
|
||||
|
||||
write_ivf_file_header(outfile, &cfg, 0);
|
||||
|
||||
@@@@TWOPASS_LOOP_BEGIN
|
||||
|
||||
/* Open input file for this encoding pass */
|
||||
if(!(infile = fopen(argv[3], "rb")))
|
||||
die("Failed to open %s for reading", argv[3]);
|
||||
|
||||
@@@@@@@@ENC_INIT
|
||||
/* Initialize codec */
|
||||
if(vpx_codec_enc_init(&codec, interface, &cfg, 0))
|
||||
die_codec(&codec, "Failed to initialize encoder");
|
||||
|
||||
frame_avail = 1;
|
||||
got_data = 0;
|
||||
@ -154,14 +185,19 @@ int main(int argc, char **argv) {
|
||||
vpx_codec_iter_t iter = NULL;
|
||||
const vpx_codec_cx_pkt_t *pkt;
|
||||
|
||||
@@@@@@@@@@@@PER_FRAME_CFG
|
||||
@@@@@@@@@@@@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");
|
||||
got_data = 0;
|
||||
while( (pkt = vpx_codec_get_cx_data(&codec, &iter)) ) {
|
||||
got_data = 1;
|
||||
switch(pkt->kind) {
|
||||
@@@@@@@@@@@@@@@@PROCESS_FRAME
|
||||
@@@@@@@@@@@@@@@@PROCESS_STATS
|
||||
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;
|
||||
}
|
||||
@ -173,10 +209,11 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
printf("\n");
|
||||
fclose(infile);
|
||||
@@@@TWOPASS_LOOP_END
|
||||
|
||||
printf("Processed %d frames.\n",frame_cnt-1);
|
||||
@@@@DESTROY
|
||||
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))
|
@ -1,25 +0,0 @@
|
||||
@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.
|
193
examples/example_xma.c
Normal file
@ -0,0 +1,193 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
}
|
225
examples/force_keyframe.c
Normal file
@ -0,0 +1,225 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
@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.
|
@ -1,85 +0,0 @@
|
||||
#!/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"
|
@ -1,224 +0,0 @@
|
||||
#!/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;
|
||||
|
||||
}
|
@ -1,84 +0,0 @@
|
||||
#!/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}"
|
@ -1,218 +0,0 @@
|
||||
<?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
|
||||
);
|
||||
|
||||
?>
|
@ -1,86 +0,0 @@
|
||||
/* 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 +0,0 @@
|
||||
* -crlf
|
@ -1,26 +0,0 @@
|
||||
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.
|
@ -1,26 +0,0 @@
|
||||
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
|
@ -1,8 +0,0 @@
|
||||
use ExtUtils::MakeMaker;
|
||||
|
||||
WriteMakefile(
|
||||
'NAME' => 'HTML::Toc',
|
||||
'VERSION_FROM' => 'Toc.pm',
|
||||
'PREREQ_PM' => {'HTML::Parser' => 0},
|
||||
'MAN3PODS' => {},
|
||||
);
|
@ -1,549 +0,0 @@
|
||||
#=== 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;
|
@ -1,693 +0,0 @@
|
||||
#==== 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;
|
@ -1,92 +0,0 @@
|
||||
<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>
|
@ -1,5 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>SubSub1</title>
|
||||
</head>
|
||||
</html>
|
@ -1,5 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Sub1</title>
|
||||
</head>
|
||||
</html>
|
@ -1,5 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>SubSub1</title>
|
||||
</head>
|
||||
</html>
|
@ -1,5 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>SubSub2</title>
|
||||
</head>
|
||||
</html>
|
@ -1,5 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Sub2</title>
|
||||
</head>
|
||||
</html>
|
@ -1,5 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Sub3</title>
|
||||
</head>
|
||||
</html>
|
@ -1,5 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Main</title>
|
||||
</head>
|
||||
</html>
|
@ -1,87 +0,0 @@
|
||||
#--- 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
|
@ -1,157 +0,0 @@
|
||||
#--- 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()
|
@ -1,200 +0,0 @@
|
||||
#--- 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
|
@ -1,336 +0,0 @@
|
||||
#--- 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();
|
@ -1,768 +0,0 @@
|
||||
#--- 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();
|
@ -1,194 +0,0 @@
|
||||
#--- 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();
|
@ -1,709 +0,0 @@
|
||||
#--- 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();
|
@ -1,176 +0,0 @@
|
||||
#--- 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>');
|
@ -1,97 +0,0 @@
|
||||
#--- 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();
|
@ -1,114 +0,0 @@
|
||||
#--- 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
|
@ -1,36 +0,0 @@
|
||||
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.
|
@ -1,731 +0,0 @@
|
||||
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.
|
@ -1,394 +0,0 @@
|
||||
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.
|
@ -1,860 +0,0 @@
|
||||
<?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.
|
||||
|
||||
*/
|
||||
?>
|
@ -1,124 +0,0 @@
|
||||
<?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>
|
@ -1,456 +0,0 @@
|
||||
<?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();
|
||||
}
|
||||
|
||||
?>
|
@ -1,59 +0,0 @@
|
||||
<?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);
|
||||
}
|
@ -1,217 +0,0 @@
|
||||
<?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>
|
@ -1,666 +0,0 @@
|
||||
<?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>
|
@ -1,29 +0,0 @@
|
||||
|
||||
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)
|
@ -1,682 +0,0 @@
|
||||
|
||||
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
|
@ -1,340 +0,0 @@
|
||||
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.
|
@ -1,33 +0,0 @@
|
||||
|
||||
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 :)
|
@ -1,163 +0,0 @@
|
||||
|
||||
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!
|
@ -1,71 +0,0 @@
|
||||
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 $
|
@ -1,13 +0,0 @@
|
||||
<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>
|
@ -1,24 +0,0 @@
|
||||
<?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>
|
@ -1,867 +0,0 @@
|
||||
<?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>
|
@ -1,864 +0,0 @@
|
||||
<?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>
|
@ -1,20 +0,0 @@
|
||||
<?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>
|
@ -1,478 +0,0 @@
|
||||
<?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>
|
@ -1,24 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html
|
||||
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//FR"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<!-- Generated by phpDocumentor on Thu, 25 Dec 2008 14:34:34 +0100 -->
|
||||
<title>GeSHi 1.0.8</title>
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
|
||||
</head>
|
||||
|
||||
<FRAMESET rows='120,*'>
|
||||
<FRAME src='packages.html' name='left_top' frameborder="1" bordercolor="#999999">
|
||||
<FRAMESET cols='25%,*'>
|
||||
<FRAME src='li_geshi.html' name='left_bottom' frameborder="1" bordercolor="#999999">
|
||||
<FRAME src='blank.html' name='right' frameborder="1" bordercolor="#999999">
|
||||
</FRAMESET>
|
||||
<NOFRAMES>
|
||||
<H2>Frame Alert</H2>
|
||||
<P>This document is designed to be viewed using the frames feature.
|
||||
If you see this message, you are using a non-frame-capable web client.</P>
|
||||
</NOFRAMES>
|
||||
</FRAMESET>
|
||||
</HTML>
|
@ -1,46 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<!-- template designed by Marco Von Ballmoos -->
|
||||
<title></title>
|
||||
<link rel="stylesheet" href="media/stylesheet.css" />
|
||||
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'/>
|
||||
</head>
|
||||
<body>
|
||||
<div class="package-title">geshi</div>
|
||||
<div class="package-details">
|
||||
|
||||
<dl class="tree">
|
||||
|
||||
<dt class="folder-title">Description</dt>
|
||||
<dd>
|
||||
<a href='classtrees_geshi.html' target='right'>Class trees</a><br />
|
||||
<a href='elementindex_geshi.html' target='right'>Index of elements</a><br />
|
||||
<a href="todolist.html" target="right">Todo List</a><br />
|
||||
</dd>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<dt class="sub-package"><img class="tree-icon" src="media/images/package.png" alt="Sub-package">core</dt>
|
||||
<dd>
|
||||
<dl class="tree">
|
||||
<dt class="folder-title"><img class="tree-icon" src="media/images/class_folder.png" alt=" ">Classes</dt>
|
||||
<dd><img class="tree-icon" src="media/images/Class.png" alt="Class"><a href='geshi/core/GeSHi.html' target='right'>GeSHi</a></dd>
|
||||
<dt class="folder-title"><img class="tree-icon" src="media/images/function_folder.png" alt=" ">Functions</dt>
|
||||
<dd><img class="tree-icon" src="media/images/Function.png" alt="Function"><a href='geshi/core/_geshi.php.html#functiongeshi_highlight' target='right'>geshi_highlight</a></dd>
|
||||
<dt class="folder-title"><img class="tree-icon" src="media/images/folder.png" alt=" ">Files</dt>
|
||||
<dd><img class="tree-icon" src="media/images/Page.png" alt="File"><a href='geshi/core/_geshi.php.html' target='right'>geshi.php</a></dd>
|
||||
</dl>
|
||||
</dd>
|
||||
|
||||
|
||||
</dl>
|
||||
</div>
|
||||
<p class="notes"><a href="http://www.phpdoc.org" target="_blank">phpDocumentor v <span class="field">1.4.2</span></a></p>
|
||||
</BODY>
|
||||
</HTML>
|
@ -1,33 +0,0 @@
|
||||
body
|
||||
{
|
||||
background-color: #EEEEEE;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
/* Banner (top bar) classes */
|
||||
|
||||
.banner { }
|
||||
|
||||
.banner-menu
|
||||
{
|
||||
text-align: right;
|
||||
clear: both;
|
||||
padding: .5em;
|
||||
border-top: 2px solid #AAAAAA;
|
||||
}
|
||||
|
||||
.banner-title
|
||||
{
|
||||
text-align: right;
|
||||
font-size: 20pt;
|
||||
font-weight: bold;
|
||||
margin: .2em;
|
||||
}
|
||||
|
||||
.package-selector
|
||||
{
|
||||
background-color: #DDDDDD;
|
||||
border: 1px solid #AAAAAA;
|
||||
color: #000090;
|
||||
}
|
Before Width: | Height: | Size: 620 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 696 B |
Before Width: | Height: | Size: 848 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 874 B |
Before Width: | Height: | Size: 570 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 752 B |
Before Width: | Height: | Size: 865 B |
Before Width: | Height: | Size: 956 B |
Before Width: | Height: | Size: 596 B |
Before Width: | Height: | Size: 712 B |
Before Width: | Height: | Size: 148 B |
Before Width: | Height: | Size: 584 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 219 B |
Before Width: | Height: | Size: 224 B |
Before Width: | Height: | Size: 661 B |
Before Width: | Height: | Size: 592 B |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 790 B |