【问题标题】:How to Determine Indentation: Converting Java Source FIle to HTML File如何确定缩进:将 Java 源文件转换为 HTML 文件
【发布时间】:2013-10-21 14:12:51
【问题描述】:

我正在尝试使用 PrintWriter 以编程方式将 Java 源文件转换为 HTML 文件以写入单独的 .html 文件

示例源文件可能如下所示。
HelloWorld.java:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");

        while (true) {
            System.out.println("Hello World!"); 
            // Disregard this ridiculous example
        }
    }
}

我的所有打印工作都很好,只是我遇到了压痕问题。 Everyting 左对齐。

HelloWorld.html(在浏览器中看到):

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");

while (true) {
System.out.println("Hello World!"); 
// Disregard this ridiculous example
}
}
}

程序源代码片段:我希望这个程序为我确定,在将 java 源代码中的哪一行转换为 HTML 时应该缩进。我不想手动执行,因为那样我就必须为每个源文件编写不同的程序

    PrintWriter output = new PrintWriter(newFile);

    output.print("<!DOCTYPE html><html><head>"
            + "<style>"
            + ".keyword { font-weight: bold; color: blue}"
            + "</style></head><body>");

    while (input.hasNextLine()) {
        String line = input.nextLine();
        String[] tokens = line.split(" ");

        for (int i = 0; i < tokens.length; i++) {
            if (keywordSet.contains(tokens[i])) {
                // Gives Java keyword bold blue font
                output.print("<span class=\"keyword\">");
                output.print(tokens[i] + " ");
                output.print("</span>");
            } else {
                output.print(tokens[i] + " ");
            }
        }
        output.print("<br/>");
    }

    output.print("</body><html>");
    output.close();

注意:我split() 每行的原因是因为可能在该行中的某些关键字正在 html 文件中突出显示,我使用 &lt;span&gt;代码

在程序源码中,我明显没有任何缩进的实现,所以我知道为什么我的html文件中没有缩进。我真的不知道如何去实现这个。

我如何确定哪一行得到缩进,以及多少缩进?

编辑: 我的猜测:在拆分之前确定行中有多少空格,将其保存到变量中,然后在打印行中的其他任何内容之前以 &nbsp 的形式打印这些空格。但是如何确定行首有多少空格?

【问题讨论】:

    标签: java string parsing whitespace


    【解决方案1】:
    1. 您可以使用带有white-space: prepre-linepre-wrap 的CSS 类。
    2. 您可以用计算得出的margin-left 将每一行包装在&lt;p&gt; 中。例如,它可能是10px 的倍数。这还可以让您更改大括号样式。

    基本上,您必须保留一个变量indentLevel。为不在字符串或注释中的每个{ 增加它,并为不在字符串或注释中的每个} 减少它。缩进每一行,比如10px 乘以缩进级别。测试;你想让续行缩进更多吗?

    【讨论】:

    • 我的问题更像是一个 Java 问题,而不是一个格式问题。我试图让程序确定源代码中的哪一行在将其转换为 HTML 文件时应该缩进多少。
    • @Eric &lt;pre&gt; 标签能为我做什么?
    •  标签告诉浏览器尊重空白。 CSS 属性的作用相同,pre-linepre-wrap 值做的事情稍微复杂一些。见w3schools.com/tags/tag_pre.aspw3schools.com/cssref/pr_text_white-space.asp
    【解决方案2】:

    使用pre 标签。

    标签定义了预格式化的文本。

    元素中的文本以固定宽度的字体显示(通常 Courier),它同时保留了空格和换行符。

    您不需要确定需要缩进的行,因为pre 标记保留了原始 HTML 源代码中的所有空格、回车符和换行符。

    如果您检查在 StackOverflow 中以标记为代码的内容呈现的 HTML,您将看到它使用了此标记。

    【讨论】:

    • 我觉得这没什么用,他是用String.split()分割每一行代码来查找关键字,所以缩进空格丢失了。
    • 我完全了解空格以及如何在 HTML 中实现它,但我的问题是,我如何在我的程序中确定源代码中的哪一行应该缩进,当我将其转换为我的 HTML 文件
    • 而我拆分的原因是因为我在字符串中的某些关键字中添加了&lt;span class="keyword"&gt;
    【解决方案3】:

    也许最好先用源代码准备字符串,添加所需的 HTML,然后用&amp;nbsp; 替换空格。这可以通过 String.replace() 方法完成 - 遍历您的关键字集并用其包装版本替换所有关键字。然后您就可以将完整的字符串写入您的流中。

    【讨论】:

    • 这种方法唯一的问题是我手动插入了空格。我想以编程方式进行。这就是为什么我需要我的程序来确定间距的去向。在您的情况下,我将不得不手动分隔每个源文件。我正在尝试创建一个程序,我可以将源文件传递给它,它会自动为我转换它。
    • 这不是微不足道的,您必须通过标记解析您的代码,然后为所需的格式规则实现所有缩进逻辑以打印它。您可以从计算花括号开始:)
    • 我真的只需要计算从源文件中获取的每一行前面的空格。然后我可以在打印其他任何内容之前将该空白打印到 html 中。但我不知道如何确定有多少空白。那是我真正的问题。剩下的我可以处理。
    【解决方案4】:

    我知道我想要完成什么

            ...
    
            int whiteSpace = 0;
    
            while (whiteSpace < line.length() && Character.isWhitespace(line.charAt(j))) {
                whiteSpace++;
            }
    
            String[] tokens = line.split(" ");
    
            // Print white space
            for (int i = 0; i < whiteSpace; i++) {
                output.print("&nbsp");
            }
    
            ...
    

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 2011-05-25
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2012-06-29
      相关资源
      最近更新 更多