js模仿java格式化字符串处理

本文介绍了一个仿照Java的String.format方法实现的JavaScript版本。通过使用正则表达式和数组操作来实现%s占位符的替换功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

仿照java构建的js的格式化字符串的方法

String.formatStr = function(){

var result = arguments[0]||"";
if(arguments.length>1){
var reg = new RegExp(/%s/g),//替换%s正则
data = arguments[0],
array = data.match(reg),
rel = null;
if(array){
rel = data.split("%s");
// length = arguments.length-1 >= array.length ?array.length:arguments.length-1;
for(var i = 0,length = array.length;i<length;i++){
rel.splice(i*2 + 1,0,arguments[i+1]||"%s");
}
result = rel.join("");
}
}
return result;

};

调用方式如下:

var a = String.formatStr("%s %s","123123","test");

a的值为“123123 test”

<think>我们使用markmap库来实现将markdown文本转换为思维导图的HTML字符串。首先,我们需要添加markmap的依赖。在Java中,我们可以通过使用相应的库来实现,但是请注意,markmap本身是一个JavaScript库。因此,在Java中我们通常无法直接使用,但我们可以通过以下两种方式之一:1.使用Java调用JavaScript引擎(如GraalVM或Nashorn)来执行markmap的转换代码。2.使用Java的网络请求功能,调用markmap的在线API(如果有的话)或者自己搭建一个服务。然而,目前并没有官方的Java版本的markmap库。因此,我们需要考虑其他途径。但是,我们可以利用markmap提供的命令行工具,然后通过Java执行命令行命令,将markdown文件转换为HTML字符串。不过这样需要安装Node.js和markmap-cli。另一种思路是:markmap的HTML输出实际上是一个HTML文件,其中包含了一些JavaScript和CSS,以及一个包含思维导图数据的div。我们可以用Java生成这个HTML字符串,但是需要知道具体的模板和如何将markdown转换为思维导图数据(即markmap需要的数据结构)。实际上,markmap的工作原理是将markdown转换为一个嵌套的标题结构,然后使用d3.js来渲染。我们可以模仿这个过程:1.将markdown解析为抽象语法树(AST),然后转换为一个层次结构(h1,h2,h3等形成树状结构)。2.将这个层次结构嵌入到一个HTML模板中,该模板已经包含了markmap的库(d3.js和markmap的js库)。但是,这个过程比较复杂,而且需要我们自己解析markdown并构建树。考虑到时间,我们采用另一种方法:使用现有的Javamarkdown解析器(如flexmark)将markdown解析为AST,然后转换为markmap所需的JSON格式,再嵌入到HTML模板中。步骤:1.解析markdown,构建标题树(只考虑标题,忽略其他内容?还是需要将段落等也作为叶子节点?markmap通常只使用标题结构)2.转换为类似以下格式的JSON:{"t":"root","d":0,"v":"","c":[{"t":"heading","d":1,"v":"Heading1","c":[...]}]}但实际上,markmap的格式要求可以查看其文档:https://markmap.js.org/docs/json-format3.使用一个预定义的HTML模板,将生成的JSON数据插入,并引入markmap的库。由于这需要较多工作,我们简化:我们只考虑标题(h1-h6),将markdown文本解析为标题树。然后生成对应的JSON树。然后使用HTML模板生成最终的HTML字符串。这里我们使用flexmark-java来解析markdown。具体步骤:1.添加flexmark依赖(假设使用Maven):<dependency><groupId>com.vladsch.flexmark</groupId><artifactId>flexmark-all</artifactId><version>0.64.0</version></dependency>2.解析markdown,遍历AST,提取标题节点,并构建树形结构。3.将树形结构转换为markmap所需的JSON格式(注意:markmap要求根节点为root,子节点为heading,每个节点包含t(类型)、d(深度)、v(文本内容)和c(子节点))。4.使用HTML模板,将JSON数据作为变量插入,并包含markmap的库。但是,注意:我们这里不要求完全实现markmap的所有功能,只实现基本标题树。由于代码较长,我们将分步骤实现。注意:如果markdown中有非标题的内容,我们忽略(因为markmap通常只显示标题结构)。实现步骤:1.使用flexmark解析markdown,得到AST。2.遍历AST,我们只关心Heading节点。3.构建树:由于标题有层级,我们用一个栈来辅助构建树结构。4.将树转换为特定的JSON对象(我们可以使用Map或者自定义对象,然后转换为JSON字符串)。5.生成HTML字符串,其中包含:-一个div元素,id为"mindmap"-引入markmap的库(通过CDN)-编写JavaScript代码,使用markmap创建思维导图,将我们生成的JSON数据作为输入。我们使用一个预定义的HTML模板,将JSON数据作为字符串嵌入到JavaScript代码中。但是,由于在Java中生成HTML字符串需要拼接,我们使用StringBuilder来构建。考虑到安全,我们需要对JSON字符串中的特殊字符进行转义(比如双引号、换行符等)。我们使用org.json.JSONObject来构建JSON树?或者使用简单的字符串拼接?为了简单,我们使用字符串拼接构建JSON字符串(但要注意格式正确)。或者使用JSON库(如org.json)。添加org.json依赖:<dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20231013</version></dependency>步骤较多,我们开始写代码。注意:我们假设输入的markdown文本只包含标题,或者我们只提取标题。代码结构:-方法:markdownToMarkmap(Stringmarkdown)返回HTML字符串。-步骤:1.使用flexmark解析markdown为AST。2.遍历AST,收集标题节点(记录标题级别和文本),并构建树节点(自定义TreeNode类)。3.构建树:使用栈(或者递归)构建树结构。4.将树转换为JSON对象(使用org.json.JSONObject)表示。5.将JSON对象转换为字符串(注意转义)。6.生成HTML模板,将JSON字符串嵌入到JavaScript代码中。由于时间关系,我们只考虑按顺序出现的标题,并假设标题级别是递增的(或者可能跳跃,比如h1后直接h3,这时我们将其视为h1的子节点?还是视为错误?markmap会将其视为h1的下一级,即h3的深度比h1大2,但h1后面没有h2,所以h3应该作为h1的子节点?实际上,我们应该按照标题的级别来,如果当前标题级别比上一个标题级别大,则作为上一个标题的子节点;如果相等,则作为兄弟节点;如果小,则回溯到上一级或上上级,直到找到它的父节点)。构建树算法:-初始化一个根节点(root),深度为0。-用一个栈(或当前节点指针)来记录当前路径。-遍历每个标题节点:1.新建一个节点,深度为标题级别(h1为1,h2为2,...)。2.从当前节点向上回溯(弹出栈顶直到栈顶节点的深度小于当前节点的深度),然后将当前节点添加到栈顶节点的子节点中,并将当前节点压入栈。具体步骤:-初始化一个根节点(深度0),压入栈。-对于每个标题节点,创建一个新节点,深度=标题级别(如1,2,3...)。-比较当前节点(栈顶)的深度和新建节点的深度:while(栈顶节点的深度>=新建节点的深度){弹出栈顶节点;}-此时栈顶节点的深度小于新建节点深度,将新建节点添加到栈顶节点的子节点中,然后将新建节点压入栈。最后,根节点就是完整的树。然后,我们将树转换为markmap要求的JSON格式。每个节点是一个对象,包含:t:节点类型,根节点为"root",标题节点为"heading"d:深度(root为0,h1为1,h2为2,...)v:文本内容(字符串)c:子节点数组(如果没有子节点,可以省略或者为空数组)注意:根节点不需要文本内容。最后,生成HTML字符串,使用markmap库渲染。下面我们开始编写代码。由于依赖外部库,我们需要在项目中添加flexmark和json的依赖。注意:由于我们可能无法在运行环境中安装Node.js,所以采用纯Java实现,但生成的HTML需要浏览器环境来渲染。代码示例:</think># Java实现Markdown转思维导图HTML字符串 下面我将使用Java实现一个Markdown转思维导图HTML字符串的功能,使用Markmap库。Markmap是一个基于D3.js的库,可以将Markdown转换为交互式思维导图。 ## 解决方案 ### 依赖准备 首先需要添加以下依赖到Maven项目的pom.xml文件中: ```xml <dependencies> <!-- Markdown解析器 --> <dependency> <groupId>com.vladsch.flexmark</groupId> <artifactId>flexmark-all</artifactId> <version>0.64.0</version> </dependency> <!-- JSON处理 --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency> </dependencies> ``` ### Java实现代码 ```java import com.google.gson.Gson; import com.vladsch.flexmark.ast.Heading; import com.vladsch.flexmark.ast.Node; import com.vladsch.flexmark.ast.Text; import com.vladsch.flexmark.parser.Parser; import com.vladsch.flexmark.util.ast.Document; import com.vladsch.flexmark.util.sequence.BasedSequence; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MarkdownToMindMap { public static String convertMarkdownToMarkmap(String markdown) { // 1. 解析Markdown为AST Parser parser = Parser.builder().build(); Document document = parser.parse(markdown); // 2. 将Markdown AST转换为树形结构 List<Map<String, Object>> root = new ArrayList<>(); Map<Integer, Map<String, Object>> lastAtLevel = new HashMap<>(); for (Node node : document.getChildren()) { if (node instanceof Heading) { Heading heading = (Heading) node; int level = heading.getLevel(); // 获取标题文本 StringBuilder content = new StringBuilder(); for (Node child : heading.getChildren()) { if (child instanceof Text) { content.append(((Text) child).getChars()); } } // 创建节点 Map<String, Object> nodeMap = new HashMap<>(); nodeMap.put("t", "heading"); nodeMap.put("d", level); nodeMap.put("v", content.toString().trim()); nodeMap.put("c", new ArrayList<Map<String, Object>>()); // 添加到树中 if (level == 1) { root.add(nodeMap); lastAtLevel.put(level, nodeMap); } else { // 找到父节点 Map<String, Object> parent = lastAtLevel.get(level - 1); if (parent != null) { @SuppressWarnings("unchecked") List<Map<String, Object>> children = (List<Map<String, Object>>) parent.get("c"); children.add(nodeMap); lastAtLevel.put(level, nodeMap); } } // 清除更低级别的缓存 for (int i = level + 1; i <= 6; i++) { lastAtLevel.remove(i); } } } // 3. 转换为JSON Map<String, Object> rootNode = new HashMap<>(); rootNode.put("t", "root"); rootNode.put("d", 0); rootNode.put("v", ""); rootNode.put("c", root); Gson gson = new Gson(); String jsonData = gson.toJson(rootNode); // 4. 生成HTML模板 return generateHtmlTemplate(jsonData); } private static String generateHtmlTemplate(String jsonData) { return "<!DOCTYPE html>\n" + "<html>\n" + "<head>\n" + " <meta charset=\"utf-8\">\n" + " <title>Markmap</title>\n" + " <script src=\"https://d3js.org/d3.v6.min.js\"></script>\n" + " <script src=\"https://cdn.jsdelivr.net/npm/markmap-autoloader\"></script>\n" + " <style>\n" + " #mindmap {\n" + " width: 100%;\n" + " height: 100vh;\n" + " }\n" + " </style>\n" + "</head>\n" + "<body>\n" + " <div id=\"mindmap\"></div>\n" + " <script>\n" + " // 提供的Markdown数据\n" + " const data = " + jsonData + ";\n" + " \n" + " // 创建Markmap\n" + " markmap.Markmap.create('#mindmap', null, data);\n" + " </script>\n" + "</body>\n" + "</html>"; } public static void main(String[] args) { String markdown = "# Java编程\n" + "## 基础语法\n" + "### 数据类型\n" + "### 控制结构\n" + "## 面向对象\n" + "### 类与对象\n" + "### 继承与多态\n" + "## 高级特性\n" + "### 泛型\n" + "### 注解\n" + "### Lambda表达式"; String html = convertMarkdownToMarkmap(markdown); System.out.println(html); } } ``` ## 代码解释 ### 1. Markdown解析 使用Flexmark库解析Markdown文本,将其转换为抽象语法树(AST)。我们主要关注标题节点(Heading),因为思维导图主要基于标题层级结构。 ### 2. 构建树形结构 - 遍历AST中的每个标题节点 - 根据标题级别(1-6)构建层级关系 - 使用`lastAtLevel`映射跟踪每个级别的最新节点 - 将每个标题节点添加到其父节点(上一级标题)的子节点列表中 ### 3. 转换为Markmap格式 构建符合Markmap要求的JSON结构: - `t`: 节点类型("root"或"heading") - `d`: 深度(0表示根节点,1-6对应标题级别) - `v`: 节点内容 - `c`: 子节点列表 ### 4. 生成HTML模板 创建包含以下内容的HTML字符串: - 引入D3.js和Markmap库 - 创建一个div容器用于显示思维导图 - 使用JavaScript初始化Markmap并传入转换后的JSON数据 ### 5. 示例使用 在main方法中提供了一个示例Markdown文本: ``` # Java编程 ## 基础语法 ### 数据类型 ### 控制结构 ## 面向对象 ### 类与对象 ### 继承与多态 ## 高级特性 ### 泛型 ### 注解 ### Lambda表达式 ``` 运行程序后会输出完整的HTML字符串,可以在浏览器中打开查看生成的思维导图。 ## 使用说明 1. 将上述代码添加到Java项目中 2. 确保添加了必要的依赖项 3. 调用`convertMarkdownToMarkmap`方法,传入Markdown字符串 4. 将返回的HTML字符串保存为.html文件或在浏览器中直接使用 ## 注意事项 - Markmap需要标题结构完整的Markdown文档 - 目前实现仅处理标题元素(h1-h6),忽略其他Markdown元素 - 生成的HTML需要浏览器支持JavaScript - 可以通过修改CSS调整思维导图的大小和样式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值