走到这里,才是我们iWriter真正的开始。哈哈,一切看起来如此的顺利。
iWriter是一个桌面程序,如Word、Photoshop一样,当然iWriter要简单得多,但也需要有界面让用户操作和使用文件来保存用户的输出。所以在桌面程序在开发上,一开始会面临原型与文件的问题。原型吗?天下文章一家抄,只需要将80%的操作控制到三步之内就可以了,详细的就得另写文章说明了。你愿意等,我就愿意写。所以这里更多的是说说文件格式的设计。当然你也可以在维基上看看别的格式的说明,只是在这里我说得更简单一点。

经过一二个星期的学习,最于到了攻池略地的时候了。看看我们的伙伴,一个个势气如虹、威震山河,是时候大喊一声”千秋万载,一统江湖“了。

〜〜〜〜〜 概述 〜〜〜〜〜

到了这一年,9102年,所有的软件开发都需要原型,没有原型我们程序猿是不会动手的。但我这里不讲原型设计,只提供了一张界面图和功能的说明,让我们知道我们要做的是什么。这样后面每一步,大家心里有个底,”哦,这里为了实现这个功能”。所以本章有三部分:

  1. 原型与功能:有了原型,我们才知道需要那么组件;有了功能说明,我们才知需要处理什么样的业务,所以原型是开发的基准。
  2. 文件格式:想在这里说,不仅是因为跟业务有关系,同时是因为我以前折腾过。不希望我的伙伴再折腾一次,所以说一说。
  3. 开发说明:为下步的将要实现的功能模作一个计划,因为程序开发不仅仅是写代码,它还是一项工程管理,得有计划地去做这件事情。

下面我们将从上述的三个方面来讲讲。

〜〜〜〜〜 正文 〜〜〜〜〜

一、“iWriter” 原型与功能:

iWriter原型是我自己画的,我说过我不仅是程序员,还是设计师。当然,这不能表明我一定画得好,程序员、设计师都分一二三等的嘛。

  • 原型与布局说明

整个布局分左中右三大区,目录、备注、搜索栏共用左区,撰写、大纲栏共用中区,角色、符号、字典栏共用右区;

  1. 各栏点击标题区域可展开或收拢该栏内容,拖动区间线可改变相邻区区域,拖动栏间线可改变相邻栏栏区域。
  2. 撰写栏可拖动章节标题,以调整章节在该栏中的顺序。
  • 界面功能说明。

iWriter的功能只是Word的极小部分,除了常规的文件读写,更多的是文字处理和一些觉得对写小说有帮助的小功能。下面以界面为参考逐一说明。

  1. 最近打开小说:

    1. 点击显示下拉窗口。
    2. 窗口列表按时间近远显示最近撰写的作品,显示数量读取用户设置的相关参数,初始默认值为10。
    3. 点击列表项,打开该作品,实现了作品的快速切换。
  2. 工具栏:
    1. 新建:显示文件浏览器窗口,用户指定文件名称与保存位置,确定后开始新的章节。
    2. 打开:显示文件浏览器窗口,用户指定文件,确定后开始上次编辑的章节。
    3. 保存:将新编辑的内容保存到指定文件中。
    4. 标题:支持一二极标题,分别对应章与节。快捷方式: # 一级标题 ;## 二级标题。
    5. 标注:支持标注文本。快捷方式: * 标注 ; * 标注 *。
    6. 角色:支持插入角色。快捷方式:@ 角色。
    7. 无序:支持无序列表。快捷方式:$ 序列。
    8. 有序:支持有序列表。快捷方式:1. 序列,A. 序列,a. 序列,一. 序列。
    9. 删除:未选择文本时支持显示隐藏、删除的文本。选择文本时,为所选文本添加删除线。快捷方式:〜 文本 〜。
    10. 临时插入:未选择文本时支持显示隐藏、临时插入的文本。选择文本时,为所选文本添加临时插入标志,快捷方式:^ 文本 ^。
  3. 作业信息:显示全文字数,本节字数,当天字数,当天任务字数,未完成数,当天已作业时长等。当天作务数量读取用户设置的相关参数,初始默认值5000。
  4. 目录:
    1. 目录导航。
    2. 点击右侧“+”,添加章节,设置目录名、说明。
    3. 双击目录项可编辑该项目录名及说明。
    4. 选择目录项,可用Delete键删除该项。
    5. 可拖移目录项进行排序。
    6. 支持右键:目录名编辑、说明编辑、删除、上移、下移。
  5. 备注:
    1. 备注导航。
    2. 选择文本后,点击右侧“+”,显示输入框,输入添加备注。
    3. 双击备注项可编辑该项。
    4. 选择备注项,可用Delete键删除该项。
    5. 支持右键:编辑、删除。
  6. 搜索:
    1. 输入搜索关键词,确认后可检索导航。
    2. 输入替换关键词,可单个替换和全部替换。
    3. 勾选全文,实现全文范围中使用。
    4. 文本中,对应搜索关键词显示高亮,突出当前导航位置的关键词。
  7. 角色:
    1. 角色导航(时间线)。
    2. 占击右侧“+”,添加角色,设置角色名,说明,支持角色名自动生成。
    3. 双击角色项可编辑该项角色名及说明。
    4. 选择角色项,可用Delete键删除该项。
    5. 可拖移角色项进行排序。
    6. 支持右键:角色名编辑、说明编辑、删除、上移、下移。
  8. 符号,可将行文中常出现的词组定义为符号,如“降龙十八掌”、“风波亭”等。
    1. 符号导航(时间线)。
    2. 占击右侧“+”,添加符号,设置符号名,说明。
    3. 双击符号项可编辑该项符号名及说明。
    4. 选择符号项,可用Delete键删除该项。
    5. 可拖移符号项进行排序。
    6. 支持右键:符号名编辑、说明编辑、删除、上移、下移。
  9. 字典:字、词、成语查询释义功能。
  • 其它程序功能:
  1. iwriter菜单:

    1. 关于:检查更新。
    2. 偏好设置:多语言设置,前期中英文;默认值设置,如定时保存的时长、最近打开的文件数、当天任务字数;程序模式,如亮色模式、暗色模式、自定义模式;字体与字体大小等。
    3. 退出:退出前询问是否保存。
  2. 文件菜单:
    1. 导入:为当前章节导入纯文本格式。
    2. 导出:将当前章节、所选章节、全文导出为纯文本格式。
    3. 分割:按章节将当前作品分割为多个作品。
    4. 合并:将iWriter多个作品合并为一个作品。
    5. 上线:设置上线,将选择的章节上线到指定的站点。
    6. 页面设置:设置页面显示的模式,单章节显示跨章节显示。
    7. 打印:按章节将作品打印出来。
  3. 编辑菜单:
    1. 撤消。
    2. 重做。
    3. 全选:选择本章节所有内容。
    4. 选段:选择本段内容。
    5. 选句:选当前句。
    6. 选上:选择本章节鼠标上所有内容。
    7. 选下:选择本章节鼠标下所有内容。
    8. 选句:选当前句。
    9. 删除所选。
    10. 拼写与语法。
  4. 格式化菜单:
    1. 字体加大。
    2. 字体减小。
  5. 视图菜单:
    1. 放大:界面元素放大。
    2. 缩小:界面元素缩小。
    3. 格子线:编辑区显示、隐藏方格子线。
    4. 行线:编辑区显示、隐藏行线。
    5. 段落标号。各段前显示段落标号。
    6. 全屏显示。
  6. 窗口菜单:
    1. 显示、隐藏最近打开小说栏
    2. 显示、隐藏工具栏。
    3. 显示、隐藏作业信息栏。
    4. 显示、隐藏目录栏。
    5. 显示、隐藏角色栏。
    6. 显示、隐藏备注栏。
    7. 显示、隐藏符号栏。
    8. 显示、隐藏搜索栏。
    9. 显示、隐藏大纲栏。
    10. 显示、隐藏字典栏。
  7. 帮助菜单
    1. 帮助。
    2. 注册。

二、“iWriter” 文件格式设计:

文件格式一般分两种:单文件与多文件格式,前都有PDF后者有EPUB。单文件格式,顾名思义是将所有的输出数据保存在一个文件内;多文件格式,是将不同的输出数据保存在不同的文件上,然后一起打包为一个文件。EPUB就是这么干的,大概地说是将整个静态网站打包在一起。

由支持应用决定,iWriter需要保存的内容有:文件信息、目录、角色、备注、符号、多个正文。

  • 单文件格式。将输出的内容在一个文件内进行分区处理:大多都有文件头,在前几个字节里表示,告诉解释者这是什么格式的文件;接下来可能是小区地址索引,告诉解释者各小区的起止点,如:文件信息、字体信息、格式信息、压缩加密信息、目录或索引等;再接下来可能是各小区内容;最后是大区内容即主要内容,大区内容的分段起止由目录或索引提供。下面以iWriter为例,作单文件格式设计,其中固定分段可以用起止符处理,所表述内容仅供参考,请留意。
  1. 前置信息:

    1. 0-7字节,保存“iw”。文件头:表明该文件是一个“iWriter”文件。是确认本文件的格式为iWriter所用,并可使用“iw”格式的约定继续解释。
    2. 8-24字节,保存小区索引位置起止。
  2. 小区索引:
    1. 0-15,文件信息位置起止。
    2. 16-31,目录位置起止。
    3. 32-47,角色位置起止。
    4. 48-63,备注位置起止。
    5. 64-79,符号位置起止。
    6. 80-95,大区位置起止。
    7. 128-143,确定索的压缩方式。
    8. 144-159,确认正文的压缩方式。
    9. 159-175,区域编码方式。
    10. 175-303,加盐的起止与提取方式,不想被第三方解释。
    11. 再预留256节字。
    12. 空字节。
  3. 文件信息:
    1. 0-7,保存“info”,确认文件信息起点正确。
    2. 8-255,文章标题。
    3. 其余:作者,创建时间之类。
  4. 角色,以888分段保存角色信息:
    1. 0-7,保存“role”,确认角色起点正确。
    2. 8-127,角色名。
    3. 127-1015:角色说明。
  5. 符号,以888分段保存角色信息:
    1. 0-7,保存“symbol”,确认符号起点正确。
    2. 8-127,符号名。
    3. 127-1015:符号说明。
  6. 备注,以1024分段保存:
    1. 0-7,保存“note”,确认备注起点正确。
    2. 8-1031,备注内容。
  7. 目录信息:
    1. 0-7,保存“catalog”,确认起点正确。
    2. 8-16,保存压缩标志,确认压缩方法。
    3. 余下解压后以256分段。0-15,目录对应正文的起止;16-23,索引号;其余为目录名。
  8. 正文信息:
    1. 0-1,保存索引号,确认起点正确。
    2. 后余解压后得正文。
  • 多文件格式。将输出按不同的数据分别保存在独立的文件中,然后打包、加密、压缩成一个文件,并以特写后缀命名 下面以iWriter为例作多文件格式设计,也是本案使用的格式,请看仔细了。另外需要说明的是,各数据使用创建时间的时间戳值为其的identifier,如:章节内容保存的文件名是“时间戳”+“.txt”。因为iWriter是个单机板,所以其identifier具有不重复性。
  1. 文件夹,以“iWriter”名。文件夹包含info.txt、catalog.txt、role.txt、symbol.txt、note.txt和各章节文件。前五者以保存JSON字符串,后者保存行文,注意txt后缀可省略。
  2. info.txt,作品信息。作品名、作者、创建时间、其它信息,JSON数据。
let info = ["title":String,       // 作品名"author":String,      // 作者,多个作者用逗号分开"creation":Int,           // 创建时间,时间戳,作身份"chapters":String     // 打开的章节,多个catalog->creation用逗号分隔"activation":Int,     // 当前编辑的章节,用 catalog->creation...
]

3. catalog.txt,目录。章节标题、章节信息、创建时间、章节字数、子集,JSON数据。

let catalog = [["title":String,       // 章节标题"info":String,        // 章节信息"creation":Int,       // 创建时间,时间戳,作身份"number":Int,         // 字数"subset":[Any]        // 子类别],...
]

4. role.txt,角色。角色名、角色信息、创建时间,JSON数据。

let role = [["name":String,              // 名称"info":String,              // 介绍"creation":String,          // 创建时间,时间戳,作身份],...
]

5. symbol.txt,符号。符号名、符号信息、创建时间,JSON数据。

let symbol = [["name":String,              // 名称"info":String,              // 介绍"creation":String,          // 创建时间,时间戳,作身份],...
]

6. note.txt,备注。创建时间、备注内容。JSON数据。

let note = [Int:String        // 以时间戮为key, 以标内容为Value...
]

7. "(creation)".txt,正文。

/**标题:支持一二极标题对应章与节,快捷方式: # 一级标题 ;## 二级标题。标注:支持标文本,快捷方式: * 标注 ;  * 标注 *。角色:支持插入角色,快捷方式:@ 角色。无序:支持无序,快捷方式:$ 序列。有序:支持有序,快捷方式:1. 序列,A. 序列,a. 序列,一. 序列。删除:支持显示删除文本,快捷方式:〜 文本 〜。临时插入:支持显示插入文本,快捷方式:^ 文本 ^。
**/

三、iWriter 开发说明。

在一个项目启动后,我们不仅需要原型,需要对功能进行梳理,更需要对整个项目的开发作有步骤有节点的计划与规划。
记得很早之前,Facebook有一句口号是“Done is better than perfect”,我们当时的翻译是:“输出高于一切”。在程序开发中,由于感知问题,不同时期对事物的感觉不一样,而这种感觉大多是现在的大如从前。不用说是产品经理,就是自己,写的代码时,写着写着,回头一看,多是“今是昨非”感觉,于是念念的想去改。这样的行为导致的结果是,计划落空,甚至无法输出。改变这一状况的方法是:用最短的时间做出确定的输出。 所以编程不仅是技术问题,还是一个管理的问题,那怕是只有你一个人在作业。即然是管理问题,我们需要从细处着手。
那该如何着手呢?即然标准是:用最短的时间做出确定的输出。所以项目需要分阶段,各个阶段需要分节点,有计划可检测地输出。对于程序开发来说,我们是这样做的:首先,将程序功能按需求分阶段, 如:基本的、适用的、优化的等,保证各阶段的产品输出。其次,在各个阶段上,又要求按相关性分模块实现功能。在按阶段输出的基础上再按模块逐一实现其功能,能保存在最短时间内输出可量化、可检测的结果。

  • 那我们将按阶段、按模块来计划我们的iWriter项目的开发。从今天开始我们不仅是开发者,更是管理者。

阶段。

前面我们穷举了iWriter的功能,作为一个给用户用来创作小说的程序,功能实在不多。这对于一个团队来说,一个阶段可以把它们全部搞定,但对于我们独立开发者来说,还是分阶段、按模块有计旬的输出比较好。所以我将iWriter开发分为两个阶段:可用阶段、好用阶段。我们将一些体验性的,冗余的功能放到第二阶:

  1. 大纲。提供头脑风暴的模式来设计作品的大纲,目录设计有相同的功能。
  2. 标点符号格式文本。用 # 一级标题格式化一级标题,等等,工具栏工具有相似功能。
  3. 章节的连续加载。往上或下连续拖,本章节内容完成后,继续下一章节或上一章节,单篇加载也够用。
  4. 多语言。前期有英文也够用。
  5. 设置。只有默认项不影响使用。
  6. 删除线、临时插入。可用可不用。
  7. 导入、导出文本。可用可不用。
  8. 上线。可用可不可

模块。

模块的划分与功能的相关性有关,这样每一个模块完成后都可以进行测试。独立模块需要优先完成,有依赖的模块在有条件后再开始。功能测试和单元测试对于个人开发者来说尤其重要,我们没有时间、金钱、精力去做大量的成品测试,所以把关好每一个环节能为我们省不少事情。就这样,我把iWriter 按相关性划分了功能模块:

  1. 文件:文件的新建、打开、保存、另存、最近打开、自动缓存、定时保存、导入、导出等与文件相关的操作。
  2. 布局:界面布局,区块控制。
  3. 文本:文本基本编辑功能,格式化功能,标点符号的特定输入支持格式化文本功能,作品与章节状态,目录导航,备注导航。
  4. 工具:字典、大纲、上线、角色导航、符号导航。

四、项目准备:

为了明天,为了功能模块的输出,今天我们要做好前期准备,我们又需要重建“iWriter”的macOS项目。嘿嘿,有点不好意思,但这是最后一次,这一次这个项目会陪我们到最后。

建好名为“iWriter”的macOS项目后,我们需要在Navigator Area中Project栏里iWriter群组下,再建六个群组,以便分类存放我们输出的代码。请留意,在旧版的Xcode里,这些新建的群组不会在文件夹里建立对应的目录,而最新版本则可以了,很好,这个我喜欢。还有,目录与文件的顺序可以自己拖动排列:

  1. Views:自定义的组件。
  2. Models:数据相关的类。
  3. Business:业务处理类。
  4. Venders:第三方库文件,如Sqlite, ZipArchive。
  5. Resources:图片、图标及其它资源。
  6. Other:没法分类的,统统放到这里。

如图:

下一篇,文件模块的实现。

让我们在这里,遇见明天的自己!姜友华

存在正文时不允许未命名的原型参数_用Swift开发macOS程序, 六、原型、格式与开发说明...相关推荐

  1. .NET+Oracle 9i时产生的未在本地计算机上注册“OraOLEDB.Oracle.1”提供程序

    产生原因:         很可能是由于Oracle所在的盘是NTFS格式的分区. 解决方法:         在ora92文件夹的文件夹属性中,选择"安全"选项,把Authent ...

  2. 极速pdf文件打印时此计算机未连接到网络,PDF文件如何禁止打印?简单六步就能实现!!...

    在我们的工作当中,我们除了一些平时经常会用到的word.excel.ppt等文件文档以外,PDF文件也是我们经常会用到的文档.因为PDF文件与其他文件相比,所展现出来的效果更好,观看起来的效果也就越好 ...

  3. Go 学习笔记(32)— 类型系统(命名类型、未命名类型、底层类型、类型强制转换、类型别名和新声明类型)

    1. 命名类型和未命名类型 1.1 命名类型 类型可以通过标识符来表示,这种类型称为命名类型( Named Type ). Go 语言的基本类型中有 20 个预声明简单类型都是命名类型, Go 语言还 ...

  4. 未命名语句块中的声明

    未命名语句块中的声明 命名块中的局部变量 Verilog允许在命名的begin-end或fork-join块中声明局部变量.局部变量声明的通常用法是声明一个临时变量进行循环控制.局部变量避免了对同名但 ...

  5. 百度未命名算法将执行,打击SEO收割

    收到百度通知,近期将上线新算法,旨在提升网站和百度的用户体验,搜索引擎的使命就是让用户找到自己正在搜索的问题,更快的离开搜索引擎,目前一些限制用户权限的站点已经开始严重危害到用户体验,如果站点只有登录 ...

  6. windows xp安装驱动时提示驱动未通过微软数字签名

    因windows加密服务出错造成 症状 在尝试下载 ActiveX 控件.安装 Windows 或 Windows 组件的更新.安装 Windows 或 Windows 组件的 Service Pac ...

  7. python2.7 解决email foxmail for mac 收到附件无后缀未命名文件,无发件人,漏掉邮件内容问题

    python2.7 解决email中foxmail for mac 收到附件无后缀,无发件人,漏掉邮件内容问题:https://blog.csdn.net/SHSQLDLL/article/detai ...

  8. mfc如何判断读到文件尾_试图越过其尾端对一未命名文件进行读写 VC

    收录日期:2021/02/26 15:24:07 时间:2016/07/15 05:36:10 标签:基础类 各位高手请看下面这段代码: CString pres; CString s="f ...

  9. Error running 未命名. Command line is too long. Shorten the command line via JAR manifest or via a clas

    运行 未命名 时出错.命令行过长. 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行 方法一: 1.修改项目下 .idea\workspace.xml 2.找到标签 <componen ...

最新文章

  1. C++ Primer 5th笔记(chap 17 标准库特殊设施)bitset操作
  2. MySQL和PGSQL事务锁等待超时时间
  3. [Ceoi2016|BZOJ4936] Match
  4. error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MD_DynamicRelease”...
  5. VueJS实现用户管理系统
  6. PaddlePaddle顶会论文复现 | ECO视频动作识别网络
  7. 什么时候使用resulttype_柳州站东广场到底什么时候可以使用?
  8. 百度 UEditor--自定义上传文件路径及读取文件
  9. android逆向 网易,Android逆向——网易云音乐排行榜api(上)
  10. 用C语言写的爬虫项目
  11. 2020 中国独立开发者生存现状调研报告
  12. 重新理解函数空间(上)
  13. idea中的一些有趣的插件
  14. ansible playbook详细教程(笔记)
  15. 台式计算机启动叫两声,电脑开机2声短报警什么情况
  16. mysql三个分组排序方法row_number()、rank()、dense_rank()
  17. 如何零成本实现微信公众号自助查券返利机器人(一)
  18. python如何定义带有可选参数的函数_python中如何正确调用带可选参数的函数
  19. 软件测试接口测试用例设计
  20. 从一座瑞典风机的倒塌看VDI2230用于螺栓连接精确计算的重要性

热门文章

  1. css 文字溢出...显示,hover时显示隐藏文字
  2. Android Switch和ToggleButton控件
  3. BS工作原理—BS总结
  4. 并行计算与计算机集群
  5. Mac OS X Lion安装MacPorts(让你在Mac的Shell下更加游刃有余)
  6. 知名人脸搜索引擎惹众怒:仅需一张照片,几秒钟把你扒得底裤不剩
  7. 新版H5微信网页JS-SDK自定义分享功能实现
  8. 关于weight_decay的设定
  9. java游戏spa,【Vue的路由,SPA概念】
  10. 丽荣葵花——从吴忠走向全国