From: <ad...@us...> - 2010-11-06 15:04:58
|
Revision: 1174 http://jtidy.svn.sourceforge.net/jtidy/?rev=1174&view=rev Author: aditsu Date: 2010-11-06 15:04:52 +0000 (Sat, 06 Nov 2010) Log Message: ----------- fixed test 1720953 - implemented attribute sorting Modified Paths: -------------- branches/CodeUpdateAndJava5/src/main/java/org/w3c/tidy/Configuration.java branches/CodeUpdateAndJava5/src/main/java/org/w3c/tidy/Tidy.java Modified: branches/CodeUpdateAndJava5/src/main/java/org/w3c/tidy/Configuration.java =================================================================== --- branches/CodeUpdateAndJava5/src/main/java/org/w3c/tidy/Configuration.java 2010-11-06 14:34:06 UTC (rev 1173) +++ branches/CodeUpdateAndJava5/src/main/java/org/w3c/tidy/Configuration.java 2010-11-06 15:04:52 UTC (rev 1174) @@ -62,6 +62,7 @@ import java.util.Map; import java.util.Properties; +import org.w3c.tidy.Options.AttrSortStrategy; import org.w3c.tidy.Options.DoctypeModes; import org.w3c.tidy.Options.DupAttrModes; import org.w3c.tidy.Options.LineEnding; @@ -1259,4 +1260,12 @@ protected boolean isTidyCompat() { return getBool(Option.TidyCompat); } -} \ No newline at end of file + + public AttrSortStrategy getSortAttributes() { + return (AttrSortStrategy) getOptionEnum(Option.SortAttributes); + } + + public void setSortAttributes(final AttrSortStrategy sortAttributes) { + set(Option.SortAttributes, sortAttributes); + } +} Modified: branches/CodeUpdateAndJava5/src/main/java/org/w3c/tidy/Tidy.java =================================================================== --- branches/CodeUpdateAndJava5/src/main/java/org/w3c/tidy/Tidy.java 2010-11-06 14:34:06 UTC (rev 1173) +++ branches/CodeUpdateAndJava5/src/main/java/org/w3c/tidy/Tidy.java 2010-11-06 15:04:52 UTC (rev 1174) @@ -64,11 +64,16 @@ import java.io.Reader; import java.io.Serializable; import java.io.Writer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Properties; import org.w3c.tidy.Node.NodeType; +import org.w3c.tidy.Options.AttrSortStrategy; import org.w3c.tidy.Options.DoctypeModes; import org.w3c.tidy.Options.DupAttrModes; import org.w3c.tidy.Options.TriState; @@ -571,6 +576,11 @@ Clean.wbrToSpace(lexer, lexer.root); } + final AttrSortStrategy sortAttrStrat = configuration.getSortAttributes(); + if (sortAttrStrat != AttrSortStrategy.None) { + sortAttributes(lexer.root, sortAttrStrat); + } + pprint = new PPrint(configuration); if (showBodyOnly(lexer)) { @@ -602,8 +612,46 @@ return document; } + + private AttVal sortAttVal(final AttVal list, final AttrSortStrategy strat) { + // quick hack for now + final List<AttVal> l = new ArrayList<AttVal>(); + AttVal x = list; + while (x != null) { + l.add(x); + x = x.next; + } + if (strat != AttrSortStrategy.Alpha) { + throw new IllegalArgumentException("Unexpected sort strategy: " + strat); + } + if (l.size() < 2) { + return list; + } + Collections.sort(l, new Comparator<AttVal>() { + public int compare(final AttVal a1, final AttVal a2) { + return a1.attribute.compareTo(a2.attribute); + } + }); + final int n = l.size(); + l.add(null); + for (int i = 0; i < n; ++i) { + l.get(i).next = l.get(i + 1); + } + return l.get(0); + } + + private void sortAttributes(final Node node, final AttrSortStrategy strat) { + Node x = node; + while (x != null) { + x.attributes = sortAttVal(x.attributes, strat); + if (x.content != null) { + sortAttributes(x.content, strat); + } + x = x.next; + } + } - /** + /** * Internal routine that actually does the parsing. The caller can pass either an InputStream or file name. If both * are passed, the file name is preferred. * @param in input stream (used only if <code>file</code> is null) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |