一些后期处理是否可行?
该程序遍历文件树并处理所有名为constant-values.html 。 将检查名为constantValuesContainer的表:如果第一列包含文本static final char ,并且最后一列中的值是整数值,则将其替换为相应的字符。
请注意,这只是一个草图(但至少,在“它自己的”JavaDoc上测试;-))。 替换的条件可以改进。 例如,第一列中文本的匹配应该更加健壮(对于某人创建以char开头的类的情况)。 只有在整数值是有效的ASCII字符时才应该进行替换,以避免搞乱static final char CHAR_MAX = 0xFFFF等常量。 但是这样的调整应该很容易,如果(!)这样的后处理步骤是可行的方法。
import static java.nio.file.FileVisitResult.CONTINUE;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;
import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.OutputDocument;
import net.htmlparser.jericho.Segment;
import net.htmlparser.jericho.Source;
public class ConstantsTest
{
private static final char CHAR_A = 'A';
protected static final char CHAR_B = 'B';
static final char CHAR_C = 'C';
public static final char CHAR_D = 'D';
public static final char CHAR_E = 'E';
public static final char CHAR_F = 'F';
public static final int INT_65 = 65;
public static void main(String[] args) throws MalformedURLException, IOException
{
Path path = FileSystems.getDefault().getPath("./doc/");
Files.walkFileTree(path, new FileProcessor());
}
static class FileProcessor extends SimpleFileVisitor
{
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attributes)
{
//System.out.println("Visit "+file+" name '"+file.getFileName()+"'");
if (file.getFileName().toString().equals("constant-values.html"))
{
process(file);
}
return CONTINUE;
}
}
private static void process(Path file)
{
try
{
doProcess(file);
}
catch (IOException e)
{
e.printStackTrace();
}
}
private static void doProcess(Path file) throws IOException
{
System.out.println("Processing "+file);
Source source=new Source(file.toFile());
OutputDocument outputDocument=new OutputDocument(source);
for (Element element : source.getAllElementsByClass("constantValuesContainer"))
{
List colFirsts = element.getAllElementsByClass("colFirst");
List colLasts = element.getAllElementsByClass("colLast");
for (int i=0; i
{
Element colFirst = colFirsts.get(i);
Segment colFirstContent = colFirst.getContent();
String colFirstText = colFirstContent.getTextExtractor().toString();
// TODO Generalize this according to your needs,
// maybe with some RegEx...
if (colFirstText.contains("static final char"))
{
Element colLast = colLasts.get(i);
List children = colLast.getAllElements("code");
if (children.size() == 1)
{
Element child = children.get(0);
Segment childContent = child.getContent();
String childText = childContent.getTextExtractor().toString();
try
{
int value = Integer.parseInt(childText);
outputDocument.replace(childContent, String.valueOf((char)value));
}
catch (NumberFormatException e)
{
System.out.println("Value is not a number: "+childText+", ignoring");
}
}
}
}
}
outputDocument.writeTo(
new OutputStreamWriter(new FileOutputStream(file.toFile())));
System.out.println("Processing "+file+" DONE");
}
}