Skip to content

Commit

Permalink
feat(highlighter): added default color
Browse files Browse the repository at this point in the history
  • Loading branch information
mediabakery committed Aug 7, 2022
1 parent 431df2c commit e47d8aa
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 22 deletions.
27 changes: 14 additions & 13 deletions index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ const OPTIONS = {
string: '[string]',
special: '[special]',
bracket: '[bracket]',
clear: '[clear]'
clear: '[clear]',
default: '[default]'
}
}

Expand All @@ -32,12 +33,12 @@ describe('unicode', () => {

it('strings (mixing quotes)', () => {
expect(hlUni('\'"`\' "\'`" `"\'`'))
.toBe('[string]\'"`\'[clear] [string]"\'`"[clear] [string]`"\'`[clear]')
.toBe('[string]\'"`\'[clear][default] [clear][string]"\'`"[clear][default] [clear][string]`"\'`[clear]')
})

it('strings (scaping quotes)', () => {
expect(hlUni('\'\\\'\' "\\"" `\\``'))
.toBe('[string]\'\\\'\'[clear] [string]"\\""[clear] [string]`\\``[clear]')
.toBe('[string]\'\\\'\'[clear][default] [clear][string]"\\""[clear][default] [clear][string]`\\``[clear]')
})

it('integers', () => {
Expand Down Expand Up @@ -81,8 +82,8 @@ describe('unicode', () => {
})

it('alphanumeric', () => {
expect(hlUni('(f1)'))
.toBe('[bracket]([clear]f1[bracket])[clear]')
expect(hlUni('(f2)'))
.toBe('[bracket]([clear][default]f2[clear][bracket])[clear]')
})

it('functions', () => {
Expand All @@ -92,12 +93,12 @@ describe('unicode', () => {

it('basic query', () => {
expect(hlUni("SELECT * FROM `users` WHERE `email` = 'test@example.com'"))
.toBe("[keyword]SELECT[clear] [special]*[clear] [keyword]FROM[clear] [string]`users`[clear] [keyword]WHERE[clear] [string]`email`[clear] [special]=[clear] [string]'test@example.com'[clear]")
.toBe("[keyword]SELECT[clear][default] [clear][special]*[clear][default] [clear][keyword]FROM[clear][default] [clear][string]`users`[clear][default] [clear][keyword]WHERE[clear][default] [clear][string]`email`[clear][default] [clear][special]=[clear][default] [clear][string]'test@example.com'[clear]")
})

it('complex query', () => {
expect(hlUni("SELECT COUNT(id), `id`, `username` FROM `users` WHERE `email` = 'test@example.com' AND `foo` = 'BAR' OR 1=1"))
.toBe("[keyword]SELECT[clear] [function]COUNT[clear][bracket]([clear]id[bracket])[clear][special],[clear] [string]`id`[clear][special],[clear] [string]`username`[clear] [keyword]FROM[clear] [string]`users`[clear] [keyword]WHERE[clear] [string]`email`[clear] [special]=[clear] [string]'test@example.com'[clear] [keyword]AND[clear] [string]`foo`[clear] [special]=[clear] [string]'BAR'[clear] [keyword]OR[clear] [number]1[clear][special]=[clear][number]1[clear]")
.toBe("[keyword]SELECT[clear][default] [clear][function]COUNT[clear][bracket]([clear][default]id[clear][bracket])[clear][special],[clear][default] [clear][string]`id`[clear][special],[clear][default] [clear][string]`username`[clear][default] [clear][keyword]FROM[clear][default] [clear][string]`users`[clear][default] [clear][keyword]WHERE[clear][default] [clear][string]`email`[clear][default] [clear][special]=[clear][default] [clear][string]'test@example.com'[clear][default] [clear][keyword]AND[clear][default] [clear][string]`foo`[clear][default] [clear][special]=[clear][default] [clear][string]'BAR'[clear][default] [clear][keyword]OR[clear][default] [clear][number]1[clear][special]=[clear][number]1[clear]")
})
})

Expand All @@ -114,12 +115,12 @@ describe('html', () => {

it('strings (mixing quotes)', () => {
expect(hlHtml('\'"`\' "\'`" `"\'`'))
.toBe('<span class="sql-hl-string">\'"`\'</span> <span class="sql-hl-string">"\'`"</span> <span class="sql-hl-string">`"\'`</span>')
.toBe('<span class="sql-hl-string">\'"`\'</span><span class="sql-hl-default"> </span><span class="sql-hl-string">"\'`"</span><span class="sql-hl-default"> </span><span class="sql-hl-string">`"\'`</span>')
})

it('strings (scaping quotes)', () => {
expect(hlHtml('\'\\\'\' "\\"" `\\``'))
.toBe('<span class="sql-hl-string">\'\\\'\'</span> <span class="sql-hl-string">"\\""</span> <span class="sql-hl-string">`\\``</span>')
.toBe("<span class=\"sql-hl-string\">'\\''</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">\"\\\"\"</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">`\\``</span>")
})

it('integers', () => {
Expand Down Expand Up @@ -159,7 +160,7 @@ describe('html', () => {

it('alphanumeric', () => {
expect(hlHtml('(f1)'))
.toBe('<span class="sql-hl-bracket">(</span>f1<span class="sql-hl-bracket">)</span>')
.toBe('<span class="sql-hl-bracket">(</span><span class="sql-hl-default">f1</span><span class="sql-hl-bracket">)</span>')
})

it('functions', () => {
Expand All @@ -169,17 +170,17 @@ describe('html', () => {

it('basic query', () => {
expect(hlHtml("SELECT * FROM `users` WHERE `email` = 'test@example.com'"))
.toBe("<span class=\"sql-hl-keyword\">SELECT</span> <span class=\"sql-hl-special\">*</span> <span class=\"sql-hl-keyword\">FROM</span> <span class=\"sql-hl-string\">`users`</span> <span class=\"sql-hl-keyword\">WHERE</span> <span class=\"sql-hl-string\">`email`</span> <span class=\"sql-hl-special\">=</span> <span class=\"sql-hl-string\">'test@example.com'</span>")
.toBe("<span class=\"sql-hl-keyword\">SELECT</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-special\">*</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-keyword\">FROM</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">`users`</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-keyword\">WHERE</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">`email`</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-special\">=</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">'test@example.com'</span>")
})

it('complex query', () => {
expect(hlHtml("SELECT COUNT(id), `id`, `username` FROM `users` WHERE `email` = 'test@example.com' AND `foo` = 'BAR' OR 1=1"))
.toBe("<span class=\"sql-hl-keyword\">SELECT</span> <span class=\"sql-hl-function\">COUNT</span><span class=\"sql-hl-bracket\">(</span>id<span class=\"sql-hl-bracket\">)</span><span class=\"sql-hl-special\">,</span> <span class=\"sql-hl-string\">`id`</span><span class=\"sql-hl-special\">,</span> <span class=\"sql-hl-string\">`username`</span> <span class=\"sql-hl-keyword\">FROM</span> <span class=\"sql-hl-string\">`users`</span> <span class=\"sql-hl-keyword\">WHERE</span> <span class=\"sql-hl-string\">`email`</span> <span class=\"sql-hl-special\">=</span> <span class=\"sql-hl-string\">'test@example.com'</span> <span class=\"sql-hl-keyword\">AND</span> <span class=\"sql-hl-string\">`foo`</span> <span class=\"sql-hl-special\">=</span> <span class=\"sql-hl-string\">'BAR'</span> <span class=\"sql-hl-keyword\">OR</span> <span class=\"sql-hl-number\">1</span><span class=\"sql-hl-special\">=</span><span class=\"sql-hl-number\">1</span>")
.toBe("<span class=\"sql-hl-keyword\">SELECT</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-function\">COUNT</span><span class=\"sql-hl-bracket\">(</span><span class=\"sql-hl-default\">id</span><span class=\"sql-hl-bracket\">)</span><span class=\"sql-hl-special\">,</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">`id`</span><span class=\"sql-hl-special\">,</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">`username`</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-keyword\">FROM</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">`users`</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-keyword\">WHERE</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">`email`</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-special\">=</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">'test@example.com'</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-keyword\">AND</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">`foo`</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-special\">=</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-string\">'BAR'</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-keyword\">OR</span><span class=\"sql-hl-default\"> </span><span class=\"sql-hl-number\">1</span><span class=\"sql-hl-special\">=</span><span class=\"sql-hl-number\">1</span>")
})

it('query with identifiers without apostrophes', () => {
expect(hlHtml('SELECT id FROM users'))
.toBe('<span class="sql-hl-keyword">SELECT</span> id <span class="sql-hl-keyword">FROM</span> users')
.toBe('<span class="sql-hl-keyword">SELECT</span><span class="sql-hl-default"> id </span><span class="sql-hl-keyword">FROM</span><span class="sql-hl-default"> users</span>')
})
})

Expand Down
16 changes: 7 additions & 9 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ const DEFAULT_OPTIONS = {
string: '\x1b[32m',
special: '\x1b[33m',
bracket: '\x1b[33m',
clear: '\x1b[0m'
clear: '\x1b[0m',
default: ''
}
}

Expand Down Expand Up @@ -72,12 +73,12 @@ function getSegments (sqlString) {

const trimmedText = hl.trimEnd
? text.substring(0, text.length - hl.trimEnd)
: text;
: text
matches.push({
name: hl.name,
start: match.index + boringLength,
length: trimmedText.length,
});
length: trimmedText.length
})
}
}

Expand All @@ -88,15 +89,15 @@ function getSegments (sqlString) {
let upperBound = 0
for (let i = 0; i < sortedMatches.length; i++) {
if (sortedMatches[i].start < upperBound) { break }

// If no match, add a default segment
if (sortedMatches[i].start > upperBound) {
segments.push({
name: DEFAULT_KEYWORD,
content: sqlString.substring(upperBound, sortedMatches[i].start)
})
}

segments.push({
name: sortedMatches[i].name,
content: sqlString.substring(
Expand Down Expand Up @@ -124,9 +125,6 @@ function highlight (sqlString, options) {

return getSegments(sqlString)
.map(({ name, content }) => {
if (name === DEFAULT_KEYWORD) {
return content
}
if (options.html) {
return `<span class="${options.classPrefix}${name}">${content}</span>`
}
Expand Down

0 comments on commit e47d8aa

Please sign in to comment.