Skip to content

Commit 46129ba

Browse files
Merge pull request #200 from SwiftFiddle/syntax
Improve syntax view
2 parents 5787919 + 23a8816 commit 46129ba

File tree

3 files changed

+93
-23
lines changed

3 files changed

+93
-23
lines changed

Public/css/popover.css

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@
5050
white-space: pre-line;
5151
}
5252

53-
.popover-content dd .badge {
54-
margin: 0 8px 0 8px;
53+
.popover-content .badge.annotation {
54+
width: 48px;
55+
text-align: end;
56+
font-size: 0.8rem;
57+
margin: 0 8px 0 0;
58+
padding: 0;
59+
color: #808080;
60+
background-color: transparent;
5561
}

Public/js/syntax_view.js

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,12 @@ export class SyntaxView {
3838
.parents("span")
3939
.each(function (index, element) {
4040
createDOMRectElement(element.getBoundingClientRect());
41-
contents.push([element.dataset.title, element.dataset.content]);
41+
contents.push({
42+
title: element.dataset.title,
43+
content: element.dataset.content,
44+
type: element.dataset.type,
45+
range: element.dataset.range,
46+
});
4247
if (index > 0) {
4348
return false;
4449
}
@@ -48,13 +53,35 @@ export class SyntaxView {
4853
element.style.backgroundColor = "rgba(81, 101, 255, 0.5)";
4954

5055
contents.reverse();
51-
contents.push([element.dataset.title, element.dataset.content]);
56+
contents.push({
57+
title: element.dataset.title,
58+
content: element.dataset.content,
59+
type: element.dataset.type,
60+
range: element.dataset.range,
61+
});
5262

53-
const dl = `<dl>${contents
54-
.map((content) => {
55-
return `<dt>${content[0]}</dt><dd>${content[1]}</dd>`;
63+
const list = contents
64+
.filter(
65+
(item, index, self) =>
66+
index ===
67+
self.findIndex(
68+
(t) =>
69+
t.title === item.title &&
70+
t.content === item.content &&
71+
t.range === item.range
72+
)
73+
)
74+
.map((item) => {
75+
if (item.range) {
76+
const range = JSON.parse(item.range);
77+
const sourceRange = `${range.startRow}:${range.startColumn} - ${range.endRow}:${range.endColumn}`;
78+
return `<dt class="text-truncate" style="max-width: calc(40vw - 20px);"><span class="badge annotation" style="width: auto; text-align: start;">Text</span>${item.title}</dt><dd><div><span class="badge annotation">Range</span>${sourceRange}</div><div><span class="badge annotation">${item.type}</span>${item.content}</div></dd>`;
79+
} else {
80+
return `<dt class="text-truncate" style="max-width: calc(40vw - 20px);"><span class="badge annotation" style="width: auto; text-align: start;">Text</span>${item.title}</dt><dd><div><span class="badge annotation">${item.type}</span>${item.content}</div></dd>`;
81+
}
5682
})
57-
.join("")}</dl>`;
83+
.join("");
84+
const dl = `<dl>${list}</dl>`;
5885
popover.content = dl;
5986

6087
popover.show(element, {

Sources/App/Controllers/TokenVisitor.swift

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,40 @@ final class TokenVisitor: SyntaxRewriter {
1616
}
1717

1818
override func visitPre(_ node: Syntax) {
19-
var syntax = "\(node.syntaxNodeType)"
20-
if syntax.hasSuffix("Syntax") {
21-
syntax = String(syntax.dropLast(6))
19+
let syntaxNodeType = node.syntaxNodeType
20+
21+
let className: String
22+
if "\(syntaxNodeType)".hasSuffix("Syntax") {
23+
className = String("\(syntaxNodeType)".dropLast(6))
24+
} else {
25+
className = "\(syntaxNodeType)"
26+
}
27+
28+
let content: String
29+
let type: String
30+
if let tokenSyntax = node.as(TokenSyntax.self) {
31+
content = "\(tokenSyntax.tokenKind)"
32+
type = "Token"
33+
} else {
34+
content = "\(syntaxNodeType)"
35+
type = "Syntax"
2236
}
23-
list.append("<span class='\(syntax)' data-title='Syntax' data-content='\(syntax)'>")
37+
38+
let sourceRange = node.sourceRange(converter: converter)
39+
let start = sourceRange.start
40+
let end = sourceRange.end
41+
let startRow = start.line ?? 1
42+
let startColumn = start.column ?? 1
43+
let endRow = end.line ?? 1
44+
let endColumn = end.column ?? 1
45+
46+
list.append(
47+
"<span class='\(className)' " +
48+
"data-title='\("\(node.withoutTrivia())".replacingOccurrences(of: "\n", with: ""))' " +
49+
"data-content='\(content)' " +
50+
"data-type='\(type)' " +
51+
#"data-range='{"startRow":\#(startRow),"startColumn":\#(startColumn),"endRow":\#(endRow),"endColumn":\#(endColumn)}'>"#
52+
)
2453

2554
let syntaxType: SyntaxType
2655
switch node {
@@ -36,18 +65,14 @@ final class TokenVisitor: SyntaxRewriter {
3665
syntaxType = .other
3766
}
3867

39-
let sourceRange = node.sourceRange(converter: converter)
40-
let start = sourceRange.start
41-
let end = sourceRange.end
42-
4368
let treeNode = TreeNode(
4469
id: index,
45-
text: syntax,
70+
text: className,
4671
range: Range(
47-
startRow: start.line.flatMap { $0 } ?? 1,
48-
startColumn: start.column.flatMap { $0 } ?? 1,
49-
endRow: end.line.flatMap { $0 } ?? 1,
50-
endColumn: end.column.flatMap { $0 } ?? 1
72+
startRow: startRow,
73+
startColumn: startColumn,
74+
endRow: endRow,
75+
endColumn: endColumn
5176
),
5277
type: syntaxType
5378
)
@@ -134,14 +159,26 @@ final class TokenVisitor: SyntaxRewriter {
134159
kind = "keyword"
135160
}
136161

162+
let sourceRange = token.sourceRange(converter: converter)
163+
let start = sourceRange.start
164+
let end = sourceRange.end
165+
let startRow = start.line ?? 1
166+
let startColumn = start.column ?? 1
167+
let endRow = end.line ?? 1
168+
let endColumn = end.column ?? 1
137169
list.append(
138-
"<span class='token \(kind)' data-title='Token' data-content='\(token.tokenKind)'>\(escapeHtmlSpecialCharacters(token.text))</span>"
170+
"<span class='token \(kind)' " +
171+
"data-title='\(token.withoutTrivia())' " +
172+
"data-content='\(token.tokenKind)' " +
173+
"data-type='Token' " +
174+
#"data-range='{"startRow":\#(startRow),"startColumn":\#(startColumn),"endRow":\#(endRow),"endColumn":\#(endColumn)}'>"# +
175+
"\(escapeHtmlSpecialCharacters(token.text))</span>"
139176
)
140177
}
141178

142179
private func processTriviaPiece(_ piece: TriviaPiece) -> String {
143180
func wrapWithSpanTag(class c: String, text: String) -> String {
144-
"<span class='\(c)' data-title='Trivia' data-content='\(c)'>\(escapeHtmlSpecialCharacters(text))</span>"
181+
"<span class='\(c)' data-title='\(piece)' data-content='\(c)' data-type='Trivia'>\(escapeHtmlSpecialCharacters(text))</span>"
145182
}
146183

147184
var trivia = ""

0 commit comments

Comments
 (0)