神马笔记的方程公式大纲模式

神马笔记的方程公式大纲模式

最近的一次开发完成后,已经实现在笔记中插入方程公式,详见《Android完美实现在笔记中插入方程公式》。

大纲模式是『神马笔记』特有的以大纲形式编辑笔记内容的功能。

本次的开发目标是在『神马笔记』大纲模式支持方程公式。

一、目标

神马笔记』大纲模式支持方程公式。

二、实现过程

大纲模式只提供了笔记元素的整个操作功能,比如

  1. 排序——拖拽调整笔记元素顺序
  2. 删除——删除整个笔记元素
  3. 缩进——仅对段落元素有效

在大纲模式下,不提供编辑笔记元素内容的功能。

1. 定义逻辑数据

FormulaOutlineEntity对文章模式下的FormulaEntity再次包装,转换为大纲模式下的数据。

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class FormulaOutlineEntity extends BaseOutlineEntity<FormulaEntity> {

String latex;

public FormulaOutlineEntity(FormulaEntity parent) {
super(parent);
}

public String getLatex() {
if (!TextUtils.isEmpty(latex)) {
return latex;
}

// try latex
latex = parent.getLatex();
if (!TextUtils.isEmpty(latex)) {
return latex;
}

// try formula
latex = parent.getFormula();

String formula = latex;
if (MathMLTransformer.isMathML(formula)) {

if (MathMLTransformer.isMathML(formula)) {
MathMLTransformer transformer = WhatsApp.getInstance().getMathMLTransformer();
try {
formula = transformer.transform(formula);
} catch (TransformerException e) {
e.printStackTrace();
}
}

if (formula == null) {
formula = parent.getFormula();
}

latex = formula;
}

return latex;
}

}

2. 定义交互数据

FormulaOutlineViewHolder仅仅显示FormulaOutlineEntity内容,没有提供编辑内容的操作。

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
31
32
public class FormulaOutlineViewHolder extends BaseOutlineViewHolder<FormulaOutlineEntity> {

JLatexMathView pictureView;

@Keep
public FormulaOutlineViewHolder(OutlineHelper helper, View itemView) {
super(helper, itemView);
}

@Override
public void onViewCreated(@NonNull View view) {
super.onViewCreated(view);

viewStub.setLayoutResource(R.layout.layout_formula_outline_item);
this.pictureView = (viewStub.inflate().findViewById(R.id.iv_picture));
}

@Override
public void onBind(FormulaOutlineEntity item, int position) {
super.onBind(item, position);

iconView.setImageResource(R.drawable.ic_insert_formula_white_24dp);

try {
pictureView.setLatex(item.getLatex(), true);
} catch (Exception e) {

}

}

}

3. 文章模式转大纲模式

1
2
3
4
5
6
7
8
map.put(FormulaEntity.class, (e) -> {
FormulaEntity entity = (FormulaEntity)e;

ArrayList<FormulaOutlineEntity> list = new ArrayList<>();
list.add(new FormulaOutlineEntity(entity));

return list;
});

4. 大纲模式转文章模式

1
2
3
4
for (BaseOutlineEntity e : list) {
FormulaOutlineEntity entity = (FormulaOutlineEntity)e;
document.add(entity.getParent());
}

5. 绑定方程公式元素

1
2
adapter.bind(FormulaOutlineEntity.class,
new BridgeBuilder(FormulaOutlineViewHolder.class, FormulaOutlineViewHolder.LAYOUT_RES_ID, outlineHelper));

三、开发过程回顾

过程 操作 相关代码
定义数据结构 逻辑数据 FormulaOutlineEntity
交互数据 FormulaOutlineViewHolder
转换数据结构 文章模式转大纲模式 OutlineFactory
大纲模式转文章模式 OutlineFactory
绑定方程公式元素 绑定到RecyclerView.Adapter以显示在列表中。 OutlineFragment

四、遗留问题

因为没有涉及到方程公式元素内容的编辑,整个实现步骤比文章模式简单许多。

但是修改的代码有些分散,扩展性有待提高。

接下来会添加更多的笔记元素,下一个目标——音乐。

如果每种笔记元素要重复12个步骤,繁琐且容易出错。

五、接下来

文章模式——完成!

大纲模式——完成!

接下来从『神马笔记』中导出方程公式,以实现知识共享。

六、Finally

~今何许~凭阑怀古~残柳参差舞~