porting in progress
diff --git a/nbproject/project.properties b/nbproject/project.properties
index ac5d4e0..6c55589 100644
--- a/nbproject/project.properties
+++ b/nbproject/project.properties
@@ -64,7 +64,7 @@
jnlp.signing=
jnlp.signing.alias=
jnlp.signing.keystore=
-main.class=
+main.class=prettify.example.Example
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false
diff --git a/src/prettify/Prettify.java b/src/prettify/Prettify.java
index 58c4eb7..20310cd 100644
--- a/src/prettify/Prettify.java
+++ b/src/prettify/Prettify.java
@@ -233,7 +233,7 @@
shortcutStylePatterns = new ArrayList<List<Object>>();
fallthroughStylePatterns = new ArrayList<List<Object>>();
shortcutStylePatterns.add(Arrays.asList(new Object[]{PR_PLAIN, Pattern.compile("^[\\s]+"), null, " \t\r\n"}));
- shortcutStylePatterns.add(Arrays.asList(new Object[]{PR_ATTRIB_VALUE, Pattern.compile("^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)"), null, "\'"}));
+ shortcutStylePatterns.add(Arrays.asList(new Object[]{PR_ATTRIB_VALUE, Pattern.compile("^(?:\\\"[^\\\"]*\\\"?|\\'[^\\']*\\'?)"), null, "\"'"}));
fallthroughStylePatterns.add(Arrays.asList(new Object[]{PR_TAG, Pattern.compile("^^<\\/?[a-z](?:[\\w.:-]*\\w)?|\\/?>$", Pattern.CASE_INSENSITIVE)}));
fallthroughStylePatterns.add(Arrays.asList(new Object[]{PR_ATTRIB_NAME, Pattern.compile("^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?", Pattern.CASE_INSENSITIVE)}));
fallthroughStylePatterns.add(Arrays.asList(new Object[]{"lang-uq.val", Pattern.compile("^=\\s*([^>\\'\\\"\\s]*(?:[^>\\'\\\"\\s\\/]|\\/(?=\\s)))", Pattern.CASE_INSENSITIVE)}));
@@ -510,7 +510,7 @@
// beginning which would cause us to infinitely recurse on the
// entire token, so we catch the right context in match[2].
embeddedSourceEnd = token.length() - match[2].length();
- embeddedSourceStart = embeddedSourceEnd = embeddedSource.length();
+ embeddedSourceStart = embeddedSourceEnd - embeddedSource.length();
}
String lang = style.substring(5);
// Decorate the left of the embedded source
@@ -746,7 +746,7 @@
if (!(extension != null && langHandlerRegistry.get(extension) != null)) {
// Treat it as markup if the first non whitespace character is a < and
// the last non-whitespace character is a >.
- extension = Util.test(Pattern.compile("^\\s&<"), source)
+ extension = Util.test(Pattern.compile("^\\s*<"), source)
? "default-markup"
: "default-code";
}
diff --git a/src/prettify/SyntaxHighlighter.java b/src/prettify/SyntaxHighlighter.java
index a53cf26..e4d95da 100644
--- a/src/prettify/SyntaxHighlighter.java
+++ b/src/prettify/SyntaxHighlighter.java
@@ -24,7 +24,7 @@
static {
// set debug mode
- System.setProperty("PrettifyDebugMode", "false");
+ System.setProperty("PrettifyDebugMode", "true");
}
private static final long serialVersionUID = 1L;
/**
@@ -40,6 +40,10 @@
*/
protected Theme theme;
/**
+ * The Prettify object.
+ */
+ protected Prettify prettify;
+ /**
* The content of the syntax highlighter, null if there is no content so far.
*/
protected String content;
@@ -68,6 +72,7 @@
}
this.theme = theme;
+ prettify = new Prettify();
setBorder(null);
@@ -86,17 +91,18 @@
* This will re-parse the content and set the style.
*/
protected void render() {
-// if (content != null) {
-// Parser parser = new Parser();
-// // stop the change listener on the row header to speed up rendering
-// highlighterRowHeader.setListenToDocumentUpdate(false);
-// highlighter.setStyle(parser.parse(brush, htmlScript, content.toCharArray(), 0, content.length()));
-// // resume the change listener on the row header
-// highlighterRowHeader.setListenToDocumentUpdate(true);
-// // notify the row header to update its information related to the SyntaxHighlighterPane
-// // need to call this because we have stopped the change listener of the row header in previous code
-// highlighterRowHeader.checkPanelSize();
-// }
+ if (content != null) {
+ // stop the change listener on the row header to speed up rendering
+ highlighterRowHeader.setListenToDocumentUpdate(false);
+ Job job = new Job(0, content);
+ prettify.langHandlerForExtension(null, content).decorate(job);
+ highlighter.setStyle(job.getDecorations());
+ // resume the change listener on the row header
+ highlighterRowHeader.setListenToDocumentUpdate(true);
+ // notify the row header to update its information related to the SyntaxHighlighterPane
+ // need to call this because we have stopped the change listener of the row header in previous code
+ highlighterRowHeader.checkPanelSize();
+ }
}
/**
diff --git a/src/prettify/SyntaxHighlighterPane.java b/src/prettify/SyntaxHighlighterPane.java
index 82059ec..9df1190 100644
--- a/src/prettify/SyntaxHighlighterPane.java
+++ b/src/prettify/SyntaxHighlighterPane.java
@@ -19,9 +19,7 @@
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTextPane;
@@ -83,9 +81,9 @@
*/
protected Theme theme;
/**
- * The style list. see {@link #setStyle(java.util.Map)}.
+ * The style list. see {@link #setStyle(java.util.List)}.
*/
- protected Map<String, List<Object>> styleList;
+ protected List<Object> styleList;
/**
* Record the mouse cursor is currently pointing at which line of the document. -1 means not any line.
* It is used internally.
@@ -319,13 +317,12 @@
* Apply the list of style to the script text pane.
* @param styleList the style list
*/
- public void setStyle(Map<String, List<Object>> styleList) {
+ public void setStyle(List<Object> styleList) {
if (styleList == null) {
- this.styleList = new HashMap<String, List<Object>>();
+ this.styleList = new ArrayList<Object>();
return;
}
- // not a deep copy
- this.styleList = new HashMap<String, List<Object>>(styleList);
+ this.styleList = new ArrayList<Object>(styleList);
if (theme == null) {
return;
@@ -335,15 +332,14 @@
// clear all the existing style
document.setCharacterAttributes(0, document.getLength(), theme.getPlain().getAttributeSet(), true);
-// // apply style according to the style list
-// for (String key : styleList.keySet()) {
-// List<Object> posList = styleList.get(key);
-//
-// AttributeSet attributeSet = theme.getStyle(key).getAttributeSet();
-// for (Object pos : posList) {
-// document.setCharacterAttributes(pos.getOffset(), pos.getLength(), attributeSet, true);
-// }
-// }
+ Integer startPos = 0, endPos = 0;
+ // apply style according to the style list
+ for (int i = 0, iEnd = styleList.size(); i < iEnd; i += 2) {
+ SimpleAttributeSet attributeSet = theme.getStyle((String) styleList.get(i + 1)).getAttributeSet();
+ endPos = i + 2 < iEnd ? (Integer) styleList.get(i + 2) : document.getLength();
+ startPos = (Integer) styleList.get(i);
+ document.setCharacterAttributes(startPos, endPos - startPos, attributeSet, true);
+ }
repaint();
}
diff --git a/src/prettify/Theme.java b/src/prettify/Theme.java
index cf60dbc..0c6f505 100644
--- a/src/prettify/Theme.java
+++ b/src/prettify/Theme.java
@@ -171,7 +171,7 @@
return type;
} else if (key.equals("lit")) {
return literal;
- } else if (key.equals("pub")) {
+ } else if (key.equals("pun")) {
return punctuation;
} else if (key.equals("pln")) {
return plain;
diff --git a/src/prettify/Util.java b/src/prettify/Util.java
index b8c69e9..874a111 100644
--- a/src/prettify/Util.java
+++ b/src/prettify/Util.java
@@ -18,6 +18,9 @@
Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
matchesList.add(matcher.group(0));
+ for (int i = 1, iEnd = matcher.groupCount(); i <= iEnd; i++) {
+ matchesList.add(matcher.group(i));
+ }
}
return matchesList.toArray(new String[matchesList.size()]);
diff --git a/src/prettify/example/Example.java b/src/prettify/example/Example.java
new file mode 100644
index 0000000..5c528a2
--- /dev/null
+++ b/src/prettify/example/Example.java
@@ -0,0 +1,111 @@
+/**
+ * This is part of the Java SyntaxHighlighter.
+ *
+ * It is distributed under MIT license. See the file 'readme.txt' for
+ * information on usage and redistribution of this file, and for a
+ * DISCLAIMER OF ALL WARRANTIES.
+ *
+ * @author Chan Wai Shing <cws1989@gmail.com>
+ */
+package prettify.example;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import prettify.SyntaxHighlighter;
+import prettify.theme.ThemeDefault;
+
+/**
+ * Usage example. This will just cover some of the functions. To know other available functions, please read the JavaDoc.
+ * @author Chan Wai Shing <cws1989@gmail.com>
+ */
+public class Example {
+
+ /**
+ * Read the resource file from the jar.
+ * @param path the resource path
+ * @return the content of the resource file in byte array
+ * @throws IOException error occurred when reading the content from the file
+ */
+ public static byte[] readResourceFile(String path) throws IOException {
+ if (path == null) {
+ throw new NullPointerException("argument 'path' cannot be null");
+ }
+
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ InputStream in = null;
+ try {
+ in = Example.class.getResourceAsStream(path);
+ if (in == null) {
+ throw new IOException("Resources not found: " + path);
+ }
+
+ int byteRead = 0;
+ byte[] b = new byte[8096];
+
+ while ((byteRead = in.read(b)) != -1) {
+ bout.write(b, 0, byteRead);
+ }
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException ex) {
+ }
+ }
+ }
+
+ return bout.toByteArray();
+ }
+
+ public static void main(String[] args) {
+ // set look & feel
+ try {
+ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+ } catch (Exception ex) {
+ Logger.getLogger(Example.class.getName()).log(Level.INFO, "Failed to set system look and feel.", ex);
+ }
+
+ SwingUtilities.invokeLater(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ // timer start
+ long start, end;
+ start = System.currentTimeMillis();
+
+ // use XML (for HTML) brush and RDark theme
+ SyntaxHighlighter highlighter = new SyntaxHighlighter(new ThemeDefault());
+ // set the line number count from 10 instead of 1
+ highlighter.setFirstLine(10);
+ // set to highlight line 13, 27, 28, 38, 42, 43 and 53
+ highlighter.setHighlightedLineList(Arrays.asList(13, 27, 28, 38, 42, 43, 53));
+ // set the content of the script, the example.html is located in the jar: /syntaxhighlighter/example/example.html
+ highlighter.setContent(new String(readResourceFile("/prettify/example/example.html")));
+
+ // timer end
+ end = System.currentTimeMillis();
+ System.out.println("time elapsed: " + (end - start) + "ms");
+
+ // initiate a frame and display
+ JFrame frame = new JFrame();
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ // SyntaxHighlighter is actually a JScrollPane
+ frame.setContentPane(highlighter);
+ frame.setLocationByPlatform(true);
+ frame.pack();
+ frame.setVisible(true);
+ } catch (Exception ex) {
+ Logger.getLogger(Example.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ });
+ }
+}
diff --git a/src/prettify/example/example.html b/src/prettify/example/example.html
new file mode 100644
index 0000000..d378884
--- /dev/null
+++ b/src/prettify/example/example.html
@@ -0,0 +1,47 @@
+<html var="value">
+<head>
+ <title> HTML Script Example </title>
+ <style type="text/css">
+ body {
+ font-family: Helvetica, Geneva, Arial, sans-serif;
+ font-size: 1em;
+ margin: 4em 15em 4em 4em;
+ }
+ body.with_sponsor { margin-right: 410px; }
+ a.external {
+ background: url(../images/external.png) right 50% no-repeat;
+ padding-right: 12px;
+ }
+ code, pre, .file-list {
+ font-family: Consolas, Monaco, "Bitstream Vera Sans Mono", "Courier New", Courier, monospace;
+ }
+ </style>
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-XXXXX-XX']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+</head>
+<body>
+
+<div style="font-weight: bold"><?= str_replace("\n", "<br/>", $var) ?></div>
+<?php
+ /***********************************
+ ** Multiline block comments
+ **********************************/
+
+ $stringWithUrl = "http://alexgorbatchev.com";
+ $stringWithUrl = 'http://alexgorbatchev.com';
+
+ ob_start("parseOutputBuffer"); // Start Code Buffering
+ session_start();
+?>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/src/prettify/example/package-info.java b/src/prettify/example/package-info.java
new file mode 100644
index 0000000..736f3f9
--- /dev/null
+++ b/src/prettify/example/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Usage example.
+ */
+package prettify.example;
\ No newline at end of file
diff --git a/src/prettify/theme/ThemeDefault.java b/src/prettify/theme/ThemeDefault.java
index 43cdceb..5f7cc3e 100644
--- a/src/prettify/theme/ThemeDefault.java
+++ b/src/prettify/theme/ThemeDefault.java
@@ -15,71 +15,71 @@
setFont(new Font("Consolas", Font.PLAIN, 12));
setBackground(Color.white);
- setHighlightedBackground(Color.decode("0xeee"));
+ setHighlightedBackground(Color.decode("0xcccccc"));
- setGutterText(Color.decode("0x000"));
- setGutterBorderColor(Color.decode("0xeee"));
+ setGutterText(Color.decode("0x000000"));
+ setGutterBorderColor(Color.decode("0xaaaaaa"));
setGutterBorderWidth(3);
setGutterTextFont(new Font("Verdana", Font.PLAIN, 11));
setGutterTextPaddingLeft(7);
setGutterTextPaddingRight(7);
Style plainStyle = new Style();
- plainStyle.setColor(Color.decode("0x000"));
+ plainStyle.setColor(Color.decode("0x000000"));
setPlain(plainStyle);
Style style;
style = new Style();
- style.setColor(Color.decode("0x080"));
+ style.setColor(Color.decode("0x008800"));
setString(style);
style = new Style();
- style.setColor(Color.decode("0x008"));
+ style.setColor(Color.decode("0x000088"));
setKeyword(style);
style = new Style();
- style.setColor(Color.decode("0x800"));
+ style.setColor(Color.decode("0x880000"));
setComment(style);
style = new Style();
- style.setColor(Color.decode("0x606"));
+ style.setColor(Color.decode("0x660066"));
setType(style);
style = new Style();
- style.setColor(Color.decode("0x066"));
+ style.setColor(Color.decode("0x006666"));
setLiteral(style);
style = new Style();
- style.setColor(Color.decode("0x660"));
+ style.setColor(Color.decode("0x666600"));
setPunctuation(style);
style = new Style();
- style.setColor(Color.decode("0x008"));
+ style.setColor(Color.decode("0x000088"));
setTag(style);
setDeclaration(plainStyle);
style = new Style();
- style.setColor(Color.decode("0x606"));
+ style.setColor(Color.decode("0x660066"));
setAttributeName(style);
style = new Style();
- style.setColor(Color.decode("0x080"));
+ style.setColor(Color.decode("0x008800"));
setAttributeValue(style);
setNoCode(plainStyle);
style = new Style();
- style.setColor(Color.decode("0x660"));
+ style.setColor(Color.decode("0x666600"));
setOpenBracket(style);
style = new Style();
- style.setColor(Color.decode("0x660"));
+ style.setColor(Color.decode("0x666600"));
setCloseBracket(style);
style = new Style();
- style.setColor(Color.decode("0x606"));
+ style.setColor(Color.decode("0x660066"));
setVariable(style);
style = new Style();
diff --git a/src/prettify/theme/ThemeDesert.java b/src/prettify/theme/ThemeDesert.java
index 70398d0..a967a8c 100644
--- a/src/prettify/theme/ThemeDesert.java
+++ b/src/prettify/theme/ThemeDesert.java
@@ -15,19 +15,19 @@
/* desert scheme ported from vim to google prettify */
setFont(new Font("Consolas", Font.PLAIN, 12));
- setBackground(Color.decode("0x000"));
+ setBackground(Color.decode("0x111111"));
- setHighlightedBackground(Color.decode("0x111"));
+ setHighlightedBackground(Color.decode("0x444444"));
- setGutterText(Color.decode("0xfff"));
- setGutterBorderColor(Color.decode("0x111"));
+ setGutterText(Color.decode("0xffffff"));
+ setGutterBorderColor(Color.decode("0x888888"));
setGutterBorderWidth(3);
setGutterTextFont(new Font("Verdana", Font.PLAIN, 11));
setGutterTextPaddingLeft(7);
setGutterTextPaddingRight(7);
Style plainStyle = new Style();
- plainStyle.setColor(Color.decode("0xfff"));
+ plainStyle.setColor(Color.decode("0xffffff"));
setPlain(plainStyle);
Style style;
@@ -54,7 +54,7 @@
setLiteral(style);
style = new Style();
- style.setColor(Color.decode("0xfff"));
+ style.setColor(Color.decode("0xffffff"));
setPunctuation(style);
style = new Style();
@@ -77,7 +77,7 @@
setAttributeValue(style);
style = new Style();
- style.setColor(Color.decode("0x333"));
+ style.setColor(Color.decode("0x333333"));
setNoCode(style);
setOpenBracket(plainStyle);
diff --git a/src/prettify/theme/ThemeSonsOfObsidian.java b/src/prettify/theme/ThemeSonsOfObsidian.java
index 08920bb..c6177c1 100644
--- a/src/prettify/theme/ThemeSonsOfObsidian.java
+++ b/src/prettify/theme/ThemeSonsOfObsidian.java
@@ -21,12 +21,12 @@
*/
setFont(new Font("Consolas", Font.PLAIN, 12));
- setBackground(Color.white);
+ setBackground(Color.decode("0x000000"));
- setHighlightedBackground(Color.decode("0x111"));
+ setHighlightedBackground(Color.decode("0x333333"));
- setGutterText(Color.decode("0xF1F2F3"));
- setGutterBorderColor(Color.decode("0x111"));
+ setGutterText(Color.decode("0x555555"));
+ setGutterBorderColor(Color.decode("0x666666"));
setGutterBorderWidth(3);
setGutterTextFont(new Font("Verdana", Font.PLAIN, 11));
setGutterTextPaddingLeft(7);
diff --git a/src/prettify/theme/ThemeSunburst.java b/src/prettify/theme/ThemeSunburst.java
index ef75c80..4865938 100644
--- a/src/prettify/theme/ThemeSunburst.java
+++ b/src/prettify/theme/ThemeSunburst.java
@@ -19,17 +19,17 @@
setFont(new Font("Consolas", Font.PLAIN, 12));
setBackground(Color.black);
- setHighlightedBackground(Color.decode("0xAEAEAE"));
+ setHighlightedBackground(Color.decode("0x444444"));
- setGutterText(Color.decode("0xfff"));
- setGutterBorderColor(Color.decode("0xAEAEAE"));
+ setGutterText(Color.decode("0xffffff"));
+ setGutterBorderColor(Color.decode("0x777777"));
setGutterBorderWidth(3);
setGutterTextFont(new Font("Verdana", Font.PLAIN, 11));
setGutterTextPaddingLeft(7);
setGutterTextPaddingRight(7);
Style plainStyle = new Style();
- plainStyle.setColor(Color.decode("0xfff"));
+ plainStyle.setColor(Color.decode("0xffffff"));
setPlain(plainStyle);
Style style;
@@ -56,7 +56,7 @@
setLiteral(style);
style = new Style();
- style.setColor(Color.decode("0xfff")); /* punctuation - white */
+ style.setColor(Color.decode("0xffffff")); /* punctuation - white */
setPunctuation(style);
style = new Style();