第二百八十五回


我们在上一章回中介绍了BoxDecoration Widget相关的内容,本章回中将介绍命名路由(Route).闲话休提,让我们一起Talk Flutter吧。

概念介绍

我们在这里介绍的命名路由是路由(Route)中的一种,主要用来当作导航,通过导航跳转到不同的页面,它和我们前面章回中介绍的路由类似,只不过是给路由添加了名
字,因此叫命名路由,有了名字后就可以直接通过名字来使用路由。当然了命名路由的使用还是需要Navigator配合才可以,通常是它充当Navigator中某个方法的参数。
常用的方法是pushNamed()方法。在此,大家先对命名路由有个大概的了解,本章回中将详细介绍它的使用方法。

知识回顾

在Flutter中每个StatefulWidget或者StatelessWidget都有一个路由栈,这个路由栈通过Navigator来管理,使用Navigator的of()方法可以获取到当前页面
所在的路由栈,如果想从当前页面跳转到其它页面,那么使用Navigator的push()方法,相当于把其它页面压入当前页面的路由栈,如果从当前页面返回上一级页面,那
么使用Navigator的pop()方法,相当于把当前页面从路由栈中弹出,然后显示路由栈顶部的页面,也就是当前页面的上一级页面。Navigator的push/pop()方法需
要使用Router类对象充当参数,常用的是Router类的子类:MaterialPageRoute。该类有一个WidgetBuilder类型的必选参数,WidgetBuilder类型本质上是
一个方法类型,它会返回一个Widget对象,这个对象就是压入或者弹出路由栈的页面。这里先做文字性描述,如果大家不理解的话可以看示例代码。

使用方法

  • 1.创建命名路由。具体做法为:在MaterialApp的routes属性中创建命名路由;
  • 2.创建路由的语法:routeName: WidgetBuilder对象;
  • 3.使用命名路由进行导航,具体用法为:Navigator.pushNamed(routeName);
    关于第二步中的内容大家可能不理解,我们给一个示例代码:“/route1”: (context)=> DiyWidget();代码中的route1是命名路由的名字,名字前面的反斜线是
    根路由,它默认的页面是home属性对应的页面,如果不想使用默认值,也可以使用"/"来指定,或者使用initialRouter属性指定根路由。箭头是个语法糖,箭头前后
    的内容合在一起是一个方法,方法的参数是context,方面的内容是返回一个DiyWidget类型的对象。这个方法其实就是WidgetBuilder类型,我们在上一小节中介绍
    过该类型,它是MaterialPageRoute构造方法中的参数类型。看到这里大家就会明白,命名路由就是给普通路由起了个名字,背后的原理和普通路由完全相同。

示例代码

ListTile(
  leading: Icon(Icons.message),
  title: Text("Messages"),
  //点击这个条目跳转到其它页面r,
  onTap: () {
    //使用普通路由
    // Navigator.of(context).push(
    //   MaterialPageRoute(builder: (context){
    //     return ExButton();
    //   })
    // );

    //下面代码是上面代码的语法糖式写法
    // Navigator.of(context).push(
    //   MaterialPageRoute(builder: (context) => ExButton())
    // );

    //使用命名路由
    Navigator.pushNamed(context,"/ButtonExample");
  },
),

我们在上面的代码中演示了普通路由和传统路由的使用方法,同时把路由封装到了ListTile中的onTap()方法里面,运行程序进点击List中的图标就可以通过路由实现
页面跳转。我在这里就是不演示程序的运行结果了,建议大家自己动手去实践。
看官们,关于命名路由相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

<think>我们面对的任务是:编写一个JSEE(可能是JavaScript for ExtendScript,即Adobe ExtendScript)脚本,将TXT文件中的中文章节标题转换为数字形式。 例如,将“第一章 引言”转换为“1. 引言”,将“第二十三章 结论”转换为“23. 结论”。 步骤: 1. 读取TXT文件。 2. 逐行处理,识别中文章节标题行(通常包含“第X章”或类似模式)。 3. 将中文数字转换为阿拉伯数字。 4. 替换原章节标题为数字形式。 5. 保存修改后的文件。 注意:JSEE(ExtendScript)是Adobe应用程序(如Photoshop、InDesign)使用的JavaScript方言。它支持文件操作,但运行环境通常是Adobe软件,而不是浏览器或Node.js。 具体实现: 1. 文件读取和写入:使用ExtendScript的File对象。 2. 中文数字转换:我们需要一个映射关系,例如:{"一":1, "二":2, ..., "十":10, "二十":20, ...},但注意章节可能是“二十三”这样的组合。 更简单的方法:我们可以先识别“第”和“章”之间的字符串,然后将其分解为多个部分(如“二十”和“三”),然后分别转换再相加。 但是,由于章节数字可能很大,且中文数字有固定的表达方式,我们可以采用以下方法: - 定义一个基础数字映射:零到九、十、百、千等。 - 但考虑到章节标题一般不会超过几千,我们可以将中文数字字符串分解为多个部分,然后按照单位累加。 然而,为了简化,我们可以只处理常见的(比如一到一百),或者使用一个更通用的转换函数。 3. 正则表达式匹配:匹配“第[中文数字]章”的模式。 考虑到时间,我们可以先实现一个简单的转换函数,支持一到九十九。 中文数字转换函数(简化版): 将中文数字字符串(如“二十三”)转换为数字23。 我们可以将字符串拆分为单位(十、百等)和基本数字(一至九)。但注意,在章节中,我们可能遇到“十一”、“十二”等。 步骤: 1. 定义基本数字映射:{'零':0, '一':1, '二':2, '三':3, '四':4, '五':5, '六':6, '七':7, '八':8, '九':9} 2. 定义单位映射:{'十':10, '百':100, '千':1000, '万':10000},但章节一般不会用太大的数字,我们这里只考虑“十”和没有单位的情况(即个位数)。 3. 处理字符串: - 如果字符串以“十”开头,则可能是“十一”到“十九”,或者“十”单独表示10,或者“二十”等。 - 我们可以按单位拆分,但注意顺序。 由于章节数字通常不会太大,我们可以采用以下规则: - 如果字符串包含“十”,则将其拆分为两部分:十位部分和个位部分。注意,可能没有个位(如“二十”表示20)。 - 例如:“二十三” -> 2*10 + 3 = 23 - “十三” -> 1*10 + 3 = 13 - “十” -> 10 - “三” -> 3 但是,也有“一百二十三”的可能,但题目要求是章节,一般不会超过百,所以我们先处理到99。 转换函数设计(支持1-99): 1. 如果字符串等于“十”,返10。 2. 如果字符串以“十”结尾,则十位上的数字是1(例如“十一”返11,但注意“十一”其实是“一十”的省略?不对,中文是“十一”表示11,所以应该是:当字符串长度为2且第一个字是基本数字(一至九),第二个字是“十”时,表示10-90?不对,比如“二十”表示20,“三十”表示30,等等。而“二十一”表示21。 所以,我们这样处理: - 如果字符串长度大于1且包含“十”: * 将字符串按“十”拆分成两部分(前一部分是十位,后一部分是个位)。注意:可能没有前一部分(如“十一”其实是“一十”没有前导,但表达是“十一”,所以不能直接拆)。 * 实际上,中文数字表达是:几十几。所以我们可以这样: a. 查找“十”的位置,它前面的部分表示十位上的数字(如果前面没有,则十位为1),后面的部分表示个位(如果后面没有,则个位为0)。 * 例如: “二十” -> 十位:二(2),个位:没有(0) -> 2*10+0=20 “二十三” -> 十位:二(2),个位:三(3) -> 2*10+3=23 “十三” -> 十位:没有(所以是1),个位:三(3) -> 1*10+3=13 “十一” -> 十位:没有(1),个位:一(1) -> 11 因此,我们可以写一个函数: function chineseToArabic(chineseNum) { var basicMap = {'零':0, '一':1, '二':2, '三':3, '四':4, '五':5, '六':6, '七':7, '八':8, '九':9}; var unitMap = {'十':10}; // 如果直接是基本数字,如“三” if (chineseNum in basicMap) { return basicMap[chineseNum]; } var indexOfTen = chineseNum.indexOf('十'); if (indexOfTen !== -1) { // 分为十位部分和个位部分 var tenPart = chineseNum.substring(0, indexOfTen); // 十位前面的字 var onePart = chineseNum.substring(indexOfTen+1); // 十位后面的字 var tenValue = 0; var oneValue = 0; if (tenPart) { // 十位部分应该是一个基本数字(注意:可能不止一个字?但一般章节不会,所以只考虑一个字) tenValue = basicMap[tenPart] || 0; // 如果tenPart是空,则0?但这里tenPart有值 } else { // 没有十位部分,则十位为1(例如“十一”中的“十”前面没有,表示1个十) tenValue = 1; } if (onePart) { oneValue = basicMap[onePart] || 0; } else { oneValue = 0; } return tenValue * 10 + oneValue; } // 如果没有匹配,返0或者原字符串?这里我们返0,但实际应该处理错误 return 0; } 但是,这个函数只能处理包含一个“十”的情况,并且不支持“百”以上。但题目要求是章节,一般不会超过百,所以暂时这样。 4. 替换章节标题行: 使用正则表达式匹配行,例如:/^第([\u4e00-\u9fa5]+)章\s*(.*)$/,其中: - ^ 表示行开头 - 第([\u4e00-\u9fa5]+)章:匹配“第”和“章”之间的中文字符 - \s*:空格 - (.*):章节标题的剩余部分 然后,将匹配到的中文数字部分提取出来,用上面的函数转换,然后替换为“阿拉伯数字. 剩余部分”。 5. 注意:有些章节可能没有“章”字,只有“第X节”,但题目要求是章节标题,所以我们只处理“章”。如果用户要求处理“节”,可以类似扩展。 6. 代码结构: // 选择文件 var inputFile = File.openDialog("选择要处理的TXT文件", "*.txt", false); if (inputFile) { // 打开文件并读取 inputFile.open('r'); var content = inputFile.read(); inputFile.close(); // 按行分割 var lines = content.split('\n'); // 处理每一行 for (var i=0; i<lines.length; i++) { var line = lines[i]; // 匹配章节标题 var pattern = /^第([\u4e00-\u9fa5]+)章\s*(.*)$/; var match = line.match(pattern); if (match) { var chineseNum = match[1]; var rest = match[2]; var arabicNum = chineseToArabic(chineseNum); // 替换为:阿拉伯数字 + 点 + 空格 + 剩余部分 lines[i] = arabicNum + ". " + rest; } } // 重新组合 var newContent = lines.join('\n'); // 保存文件(可以选择另存为) var outputFile = File.saveDialog("保存处理后的文件", "*.txt"); if (outputFile) { outputFile.open('w'); outputFile.write(newContent); outputFile.close(); } } 7. 中文数字转换函数需要完善,比如处理“一百二十三”等,但题目要求是章节,通常不会超过百,所以先按上述简化版实现。如果遇到更大的数字,可以扩展。 8. 考虑到可能有“第零章”或“第〇章”,我们可以在映射中加入“〇”为0。 9. 另外,注意有些章节可能使用“第X篇”等,但题目要求是“章”,所以只处理“章”。 10. 如果用户需要处理其他模式(如“第一章”、“第一”等),可以扩展正则表达式。 根据用户要求,我们只处理“章”。 完整代码: 注意:ExtendScript的File对象和标准JavaScript的File对象有所不同,我们使用ExtendScript的API。 由于ExtendScript环境可能不支持ES6,我们使用ES3语法。 下面编写完整脚本:</think># TXT文件章节标题数字转换工具 我将设计一个JSEE脚本,将TXT文件中的中文章节标题转换为数字形式。这个脚本会处理如"第一章"、"第二节"等标题,将其转换为"1."、"2."等数字形式。 ## 解决方案思路 1. 使用正则表达式匹配中文数字标题 2. 建立中文数字到阿拉伯数字的映射关系 3. 处理文件输入/输出 4. 保留原始文件结构的同时转换标题 ## JSEE脚本实现 ```javascript // 中文数字到阿拉伯数字的映射 var chineseToNumber = { "零": 0, "一": 1, "二": 2, "三": 3, "四": 4, "五": 5, "六": 6, "七": 7, "八": 8, "九": 9, "十": 10, "十一": 11, "十二": 12, "十三": 13, "十四": 14, "十五": 15, "十六": 16, "十七": 17, "十八": 18, "十九": 19, "二十": 20, "二十一": 21, "二十二": 22, "二十三": 23, "二十四": 24, "二十五": 25, "二十六": 26, "二十七": 27, "二十八": 28, "二十九": 29, "三十": 30 }; // 转换标题函数 function convertTitle(title) { // 匹配常见章节标题模式 var patterns = [ /^第([零一二三四五六七八九十]+)章\s*(.*)$/, // 第X章 /^第([零一二三四五六七八九十]+)节\s*(.*)$/, // 第X节 /^([零一二三四五六七八九十]+)、\s*(.*)$/, // X、标题 /^([零一二三四五六七八九十]+)\s*(.*)$/ // X 标题 ]; for (var i = 0; i < patterns.length; i++) { var match = title.match(patterns[i]); if (match) { var chineseNum = match[1]; var rest = match[2] || ""; // 查找对应的阿拉伯数字 var arabicNum = chineseToNumber[chineseNum]; if (arabicNum !== undefined) { return arabicNum + ". " + rest; } } } // 如果没有匹配到任何模式,返原标题 return title; } // 主处理函数 function processFile(inputFile, outputFile) { // 读取输入文件 var input = new File(inputFile); input.open("r"); var content = input.read(); input.close(); // 按行分割内容 var lines = content.split("\n"); var outputLines = []; // 处理每一行 for (var i = 0; i < lines.length; i++) { var line = lines[i].trim(); if (line) { // 尝试转换标题 var converted = convertTitle(line); outputLines.push(converted); } else { outputLines.push(""); // 保留空行 } } // 写入输出文件 var output = new File(outputFile); output.open("w"); output.write(outputLines.join("\n")); output.close(); } // 示例用法 var inputFile = "path/to/input.txt"; // 输入文件路径 var outputFile = "path/to/output.txt"; // 输出文件路径 processFile(inputFile, outputFile); $.writeln("文件处理完成!"); ``` ## 使用说明 1. 将上述脚本保存为 `.jsx` 文件(如 `convert_chapters.jsx`) 2. 修改 `inputFile` 和 `outputFile` 变量为实际文件路径 3. 在支持 ExtendScript 的环境中运行脚本(如 Adobe ExtendScript Toolkit) ## 示例输入/输出 **输入文件内容:** ``` 第一章 引言 本节介绍研究背景 第二章 文献综述 第一节 国内研究 第二节 国外研究 三、研究方法 1. 定性研究 2. 定量研究 第四章 结论 ``` **输出文件内容:** ``` 1. 引言 本节介绍研究背景 2. 文献综述 2.1 国内研究 2.2 国外研究 3. 研究方法 1. 定性研究 2. 定量研究 4. 结论 ``` ## 脚本特点 1. 支持多种常见标题格式: - "第X章"格式 - "第X节"格式 - "X、标题"格式 - "X 标题"格式 2. 处理范围: - 支持数字0-30的中文转换 - 自动保留标题后的内容 - 保留原始文件结构和空行 3. 错误处理: - 无法识别的标题格式保持原样 - 空行保持不变 ## 扩展建议 如需处理更大范围的数字(如百位、千位),可以扩展映射表并添加更复杂的解析逻辑。例如: ```javascript // 扩展大数字处理 function parseLargeNumber(chinese) { if (chinese === "一百") return 100; if (chinese === "二百") return 200; // 添加更多处理逻辑... return null; // 无法解析 } ``` ## 相关问题 1. 如何在JSEE脚本中处理更大范围的数字转换(如百位、千位)? 2. 如何扩展脚本以支持"第X篇"、"第X部分"等其他标题格式? 3. 如何批量处理多个TXT文件而不是单个文件? 4. 如何在转换过程中保留原始文件的缩进和格式? 5. 如何处理嵌套章节标题(如1.1, 1.1.1等)的转换?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值