Skip to content

Commit

Permalink
Rewriting CSSLintParser parser tomasbjerre#101
Browse files Browse the repository at this point in the history
  • Loading branch information
tomasbjerre committed Sep 27, 2020
1 parent 5f968ce commit 0516f86
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 28 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ Changelog of Violations lib.
## Unreleased
### GitHub [#101](https://github.com/tomasbjerre/violations-lib/issues/101) Replace the regexp xml-parsing with STL xml parser

**Rewriting PMDParser parser**


[5f968ce7f75969e](https://github.com/tomasbjerre/violations-lib/commit/5f968ce7f75969e) Tomas Bjerre *2020-09-27 14:07:01*

**Rewriting CheckstyleParser parser**


Expand Down
62 changes: 39 additions & 23 deletions src/main/java/se/bjurr/violations/lib/parsers/CSSLintParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,43 +8,59 @@
import static se.bjurr.violations.lib.util.ViolationParserUtils.findAttribute;
import static se.bjurr.violations.lib.util.ViolationParserUtils.findIntegerAttribute;
import static se.bjurr.violations.lib.util.ViolationParserUtils.getAttribute;
import static se.bjurr.violations.lib.util.ViolationParserUtils.getChunks;

import java.util.List;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.Optional;
import java.util.Set;
import java.util.TreeSet;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
import se.bjurr.violations.lib.ViolationsLogger;
import se.bjurr.violations.lib.model.SEVERITY;
import se.bjurr.violations.lib.model.Violation;
import se.bjurr.violations.lib.util.ViolationParserUtils;

public class CSSLintParser implements ViolationsParser {

@Override
public Set<Violation> parseReportOutput(
final String string, final ViolationsLogger violationsLogger) throws Exception {
final String content, final ViolationsLogger violationsLogger) throws Exception {
final Set<Violation> violations = new TreeSet<>();
final List<String> files = getChunks(string, "<file", "</file>");
for (final String fileChunk : files) {
final String filename = getAttribute(fileChunk, "name");
final List<String> issues = getChunks(fileChunk, "<issue", "/>");
for (final String issueChunk : issues) {
final Integer line = findIntegerAttribute(issueChunk, "line").orElse(1);
final Optional<Integer> charAttrib = findIntegerAttribute(issueChunk, "char");
final String severity = getAttribute(issueChunk, "severity");

final String message = getAttribute(issueChunk, "reason");
final String evidence = findAttribute(issueChunk, "evidence").orElse("").trim();
violations.add( //
violationBuilder() //
.setParser(CSSLINT) //
.setStartLine(line) //
.setColumn(charAttrib.orElse(null)) //
.setFile(filename) //
.setSeverity(this.toSeverity(severity)) //
.setMessage(message + ": " + evidence) //
.build() //
);
try (InputStream input = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))) {
final XMLStreamReader xmlr = ViolationParserUtils.createXmlReader(input);
String filename = null;
Integer line = null;
Optional<Integer> charAttrib = null;
String severity = null;
String message = null;
String evidence = null;
while (xmlr.hasNext()) {
final int eventType = xmlr.next();
if (eventType == XMLStreamConstants.START_ELEMENT) {
if (xmlr.getLocalName().equalsIgnoreCase("file")) {
filename = getAttribute(xmlr, "name");
}
if (xmlr.getLocalName().equalsIgnoreCase("issue")) {
line = findIntegerAttribute(xmlr, "line").orElse(1);
charAttrib = findIntegerAttribute(xmlr, "char");
severity = getAttribute(xmlr, "severity");
message = getAttribute(xmlr, "reason");
evidence = findAttribute(xmlr, "evidence").orElse("").trim();
final Violation violation =
violationBuilder() //
.setParser(CSSLINT) //
.setStartLine(line) //
.setColumn(charAttrib.orElse(null)) //
.setFile(filename) //
.setSeverity(this.toSeverity(severity)) //
.setMessage(message + ": " + evidence) //
.build();
violations.add(violation);
}
}
}
}
return violations;
Expand Down
14 changes: 10 additions & 4 deletions src/test/resources/csslint/csslint-no-line.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
<csslint>
<file name="foo/bar/style.css>
<issue evidence="" reason="Too many !important declarations (38), try to use less than 10 to avoid specificity issues." severity="warning"/>
<issue evidence="" reason="Too many font-size declarations (35), abstraction needed." severity="warning"/>
<issue evidence="" reason="You have 5 h1s, 7 h2s, 5 h3s, 7 h4s, 2 h5s defined in this stylesheet." severity="warning"/>
<file name="foo/bar/style.css">
<issue evidence=" "
reason="Too many !important declarations (38), try to use less than 10 to avoid specificity issues."
severity="warning" />
<issue evidence=""
reason="Too many font-size declarations (35), abstraction needed."
severity="warning" />
<issue evidence=""
reason="You have 5 h1s, 7 h2s, 5 h3s, 7 h4s, 2 h5s defined in this stylesheet."
severity="warning" />
</file>
</csslint>
14 changes: 13 additions & 1 deletion src/test/resources/csslint/csslint.xml
Original file line number Diff line number Diff line change
@@ -1 +1,13 @@
<?xml version="1.0" encoding="utf-8"?><csslint><file name="web/css-file.css"><issue line="3" char="2" severity="warning" reason="Duplicate property 'font-size' found." evidence=" font-size: 14px;"/></file><file name="web/css-file2.css"><issue line="2" char="2" severity="warning" reason="Unknown property 'thisisnotarule'." evidence=" thisisnotarule: 1;"/><issue line="3" char="2" severity="warning" reason="Unknown property 'thisisalsonotarule'." evidence=" thisisalsonotarule: 1;"/></file></csslint>
<?xml version="1.0" encoding="utf-8"?>
<csslint>
<file name="web/css-file.css">
<issue line="3" char="2" severity="warning"
reason="Duplicate property 'font-size' found." evidence=" font-size: 14px;" />
</file>
<file name="web/css-file2.css">
<issue line="2" char="2" severity="warning"
reason="Unknown property 'thisisnotarule'." evidence=" thisisnotarule: 1;" />
<issue line="3" char="2" severity="warning"
reason="Unknown property 'thisisalsonotarule'." evidence=" thisisalsonotarule: 1;" />
</file>
</csslint>

0 comments on commit 0516f86

Please sign in to comment.