Skip to content

Commit 49cf6f8

Browse files
BeardedBeaverouuan
authored andcommitted
feat: Add a simple JS highlighter (Megaxela#9)
* Add a simple JS highlighter * Add a JS sample code
1 parent ecb2c3c commit 49cf6f8

File tree

11 files changed

+231
-1
lines changed

11 files changed

+231
-1
lines changed

CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ set(INCLUDE_FILES
2525
include/QGLSLCompleter
2626
include/QGLSLHighlighter
2727
include/QJavaHighlighter
28+
include/QJSHighlighter
2829
include/QLanguage
2930
include/QXMLHighlighter
3031
include/QJSONHighlighter
@@ -36,6 +37,7 @@ set(INCLUDE_FILES
3637
include/internal/QCodeEditor.hpp
3738
include/internal/QCXXHighlighter.hpp
3839
include/internal/QJavaHighlighter.hpp
40+
include/internal/QJSHighlighter.hpp
3941
include/internal/QLineNumberArea.hpp
4042
include/internal/QStyleSyntaxHighlighter.hpp
4143
include/internal/QSyntaxStyle.hpp
@@ -59,6 +61,7 @@ set(SOURCE_FILES
5961
src/internal/QGLSLCompleter.cpp
6062
src/internal/QGLSLHighlighter.cpp
6163
src/internal/QJavaHighlighter.cpp
64+
src/internal/QJSHighlighter.cpp
6265
src/internal/QLanguage.cpp
6366
src/internal/QXMLHighlighter.cpp
6467
src/internal/QJSONHighlighter.cpp

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ must not use a resource file with the same name.
2323
1. C++ highlight rules.
2424
1. XML highlight rules.
2525
1. JSON highligh rules.
26+
1. Java highligh rules.
27+
1. JavaScript highligh rules.
2628
1. Frame selection.
2729
1. Qt Creator styles.
2830

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// example of a JS code to test JS syntax highlighter
2+
// source:
3+
// https://stackoverflow.com/questions/61301013/why-adapter-function-changing-my-num-array
4+
// https://stackoverflow.com/questions/61301471/how-can-i-filter-undefined-from-an-object
5+
6+
var num = []
7+
8+
// creates a copy of a passed list, pushes 1 to it and returns it
9+
function push(nums) {
10+
var orig = nums.map(x => x)
11+
var newNum = pushed()
12+
num = orig
13+
return newNum
14+
}
15+
16+
/*
17+
This is a helper function
18+
*/
19+
function pushed() {
20+
num.push(1)
21+
return num
22+
}
23+
24+
function filterFunnel() {
25+
let filterLists = $("#funnel-filters").children().filter(".filter");
26+
let query = `SELECT * FROM funnel WHERE `;
27+
let count = 0;
28+
for(i = 0; i < Object.keys(filterLists).length; i++) {
29+
let dom = filterLists[i];
30+
if(dom === undefined){
31+
return query;
32+
} else {
33+
if(dom.value === "Select" || dom.value === "") {
34+
35+
} else {
36+
if(count >= 1) {
37+
query += ` AND ${dom.id} = ${dom.value}`;
38+
}else{
39+
query += `${dom.id} = ${dom.value} `
40+
}
41+
count += 1;
42+
}
43+
}
44+
}
45+
}
46+
47+
console.log("new", push(num))
48+
console.log("old", num)

example/resources/demo_resources.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<file>code_samples/shader.glsl</file>
66
<file>code_samples/xml.xml</file>
77
<file>code_samples/java.java</file>
8+
<file>code_samples/js.js</file>
89
<file>code_samples/json.json</file>
910
<file>code_samples/lua.lua</file>
1011
<file>code_samples/python.py</file>

example/src/MainWindow.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <QGLSLHighlighter>
1212
#include <QXMLHighlighter>
1313
#include <QJavaHighlighter>
14+
#include <QJSHighlighter>
1415
#include <QJSONHighlighter>
1516
#include <QLuaHighlighter>
1617
#include <QPythonHighlighter>
@@ -55,6 +56,7 @@ void MainWindow::initData()
5556
{"GLSL", loadCode(":/code_samples/shader.glsl")},
5657
{"XML", loadCode(":/code_samples/xml.xml")},
5758
{"Java", loadCode(":/code_samples/java.java")},
59+
{"JS", loadCode(":/code_samples/js.js")},
5860
{"JSON", loadCode(":/code_samples/json.json")},
5961
{"LUA", loadCode(":/code_samples/lua.lua")},
6062
{"Python", loadCode(":/code_samples/python.py")}
@@ -73,6 +75,7 @@ void MainWindow::initData()
7375
{"GLSL", new QGLSLHighlighter},
7476
{"XML", new QXMLHighlighter},
7577
{"Java", new QJavaHighlighter },
78+
{"JS", new QJSHighlighter},
7679
{"JSON", new QJSONHighlighter},
7780
{"LUA", new QLuaHighlighter},
7881
{"Python", new QPythonHighlighter},

include/QJSHighlighter

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#pragma once
2+
3+
#include <internal/QJSHighlighter.hpp>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#pragma once
2+
3+
#include <QHighlightRule>
4+
#include <QStyleSyntaxHighlighter> // Required for inheritance
5+
6+
// Qt
7+
#include <QRegularExpression>
8+
#include <QVector>
9+
10+
class QSyntaxStyle;
11+
12+
/**
13+
* @brief Derived to implement highlighting of JavaScript code.
14+
*/
15+
class QJSHighlighter : public QStyleSyntaxHighlighter
16+
{
17+
Q_OBJECT
18+
19+
public:
20+
/**
21+
* @brief Constructs a new instance of a JavaScript highlighter.
22+
* @param document The text document to be highlighted.
23+
* This may be a null pointer.
24+
*/
25+
explicit QJSHighlighter(QTextDocument *document = nullptr);
26+
27+
protected:
28+
void highlightBlock(const QString &text) override;
29+
30+
private:
31+
QVector<QHighlightRule> m_highlightRules;
32+
33+
QRegularExpression m_commentStartPattern;
34+
QRegularExpression m_commentEndPattern;
35+
};

resources/languages/js.xml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<root>
3+
<section name="Keyword">
4+
<name>break</name>
5+
<name>case</name>
6+
<name>class</name>
7+
<name>catch</name>
8+
<name>const</name>
9+
<name>continue</name>
10+
<name>debugger</name>
11+
<name>default</name>
12+
<name>delete</name>
13+
<name>do</name>
14+
<name>else</name>
15+
<name>export</name>
16+
<name>extends</name>
17+
<name>finally</name>
18+
<name>for</name>
19+
<name>function</name>
20+
<name>if</name>
21+
<name>import</name>
22+
<name>in</name>
23+
<name>instanceof</name>
24+
<name>let</name>
25+
<name>new</name>
26+
<name>return</name>
27+
<name>super</name>
28+
<name>switch</name>
29+
<name>this</name>
30+
<name>throw</name>
31+
<name>try</name>
32+
<name>typeof</name>
33+
<name>var</name>
34+
<name>void</name>
35+
<name>while</name>
36+
<name>with</name>
37+
<name>yield</name>
38+
</section>
39+
</root>

resources/qcodeeditor_resources.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
<file>languages/java.xml</file>
77
<file>languages/lua.xml</file>
88
<file>languages/python.xml</file>
9+
<file>languages/js.xml</file>
910
</qresource>
1011
</RCC>

src/internal/QCodeEditor.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <QJavaHighlighter>
55
#include <QLineNumberArea>
66
#include <QPythonHighlighter>
7+
#include <QJSHighlighter>
78
#include <QStyleSyntaxHighlighter>
89
#include <QSyntaxStyle>
910

@@ -320,8 +321,9 @@ void QCodeEditor::toggleBlockComment()
320321
{
321322
bool isCpp = dynamic_cast<QCXXHighlighter *>(m_highlighter);
322323
bool isJava = dynamic_cast<QJavaHighlighter *>(m_highlighter);
324+
bool isJS = dynamic_cast<QJSHighlighter *>(m_highlighter);
323325
bool isPython = dynamic_cast<QPythonHighlighter *>(m_highlighter);
324-
if (isCpp || isJava || isPython)
326+
if (isCpp || isJava || isJS || isPython)
325327
{
326328
auto cursor = textCursor();
327329
int startPos = cursor.selectionStart();

0 commit comments

Comments
 (0)