diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_changelog.tid b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_changelog.tid
new file mode 100644
index 0000000..cd253a1
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_changelog.tid
@@ -0,0 +1,16 @@
+created: 20171230164920491
+modified: 20171230165117169
+tags:
+title: $:/plugins/ebalster/condition/changelog
+
+!!Version 0.1.1 — December 30, 2017
+
+* Fix an error when refreshing the condition widget.
+* Fix "match" attribute not working as expected.
+
+
+!!Version 0.1.0 — December 29, 2017
+
+* Initial implementation.
+* Includes $if, $else, $else-if
+* Common code in condition.js
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_license.tid b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_license.tid
new file mode 100644
index 0000000..467e28a
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_license.tid
@@ -0,0 +1,28 @@
+caption: license
+created: 20171230044445712
+modified: 20171230044506791
+revision: 0
+tags:
+title: $:/plugins/ebalster/condition/license
+type: text/vnd.tiddlywiki
+
+!!The MIT License (MIT)
+
+Copyright (c) 2017 Evan Balster
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_readme.tid b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_readme.tid
new file mode 100644
index 0000000..7472f11
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_readme.tid
@@ -0,0 +1,94 @@
+caption: readme
+created: 20171230044517252
+modified: 20171230052355854
+revision: 0
+tags:
+title: $:/plugins/ebalster/condition/readme
+type: text/vnd.tiddlywiki
+
+The ''Condition'' plugin for TiddlyWiki, version {{$:/plugins/ebalster/condition!!version}}, by Evan Balster.
+
+This plugin defines widgets that will either show or hide their contents depending on a condition.
+
+Unlike the closely-related reveal widget, condition widgets do //not// retain their content, and do not support animation or popups. Conditions may be based on variables, macros or filtered attributes. It can also be used with the [[Formula Plugin]].
+
+
+!!Truthiness
+
+Truthiness is a simple rule for whether a value triggers an "if" widget or not. Values are "truthy" if they do not match any of the "falsy" values below:
+
+* The number `0`, including any decimal point.
+* `false`
+* `undefined`
+* `null`
+* Blank (no text)
+
+This matching is case-insensitive, and any whitespace before or after the value will be ignored.
+
+
+!!If Widget
+
+The `$if` widget will show its content based on whether a value is "truthy", or matches another value.
+
+|Attribute|Meaning|h
+|value|''Required.'' Content is shown if `value` is truthy.|
+|match|Optional. If present, `value` and `match` must equal //exactly// for content to be shown. (Truthiness doesn't matter.)|
+|not|Inverts the condition, so the value will be shown if it would be hidden and vice versa.|
+
+For example,
+
+```
+<$if not value={{$:/StoryList}}>
+No tiddlers are open right now!
+$if>
+```
+
+
+!!Else Widget
+
+The `$else` widget has no attributes. It must be placed after one of the conditional widgets listed below, and will only show its contents if the preceding widget is //not// showing its content.
+
+|After...|Show contents when...|h
+|`$if`
`$else-if`|None of the previous if-conditions was true.|
+|`$list`|The list is empty. `$else` can be used instead of emptyMessage.|
+|`$reveal`|The contents of the reveal widget are hidden.|
+|`$else`|An else after an else will //never// be shown.|
+
+For example:
+
+```
+<$if value={{{[tag[Note]]}}}>
+!!My notes:
+ <$list filter="[tag[Note]]">
+ - {{!!title}}
+ $list>
+$if>
+<$else>
+!!I don't have any notes...
+$else>
+```
+
+Note that the else widget can't have any blank lines between it and the preceding widget.
+
+
+!!Else-If Widget
+
+The `$else-if` widget is a combination of the `$else` and `$if` widgets, and has the same attributes as the `$if` widget. Its content will only be displayed if the previous widget is //not// showing its content //and// the `$if`-condition is true.
+
+`$else-if` widgets can be used to perform a "chain" of tests, showing some text based on the first condition that passes (or fails). For example:
+
+```
+Something approaches...
+
+<$if value={{!!animal}} match=cat> Meow! $if>
+<$else-if value={{!!animal}} match=dog> Bark! $else-if>
+<$else-if value={{!!animal}} match=bird> Tweet! $else-if>
+<$else> This isn't like any animal you've seen before. $else>
+```
+
+
+!!Help & Support
+
+This plugin is a work in progress; seek help with it on the TiddlyWiki Google Group: https://groups.google.com/forum/#!forum/tiddlywiki
+
+Or E-mail me directly: [[evan@imitone.com|mailto://evan@imitone.com]]
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_repack.tid b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_repack.tid
new file mode 100644
index 0000000..5b6d2c1
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_repack.tid
@@ -0,0 +1,15 @@
+created: 20171230044112191
+modified: 20171230165309317
+revision: 0
+tags:
+title: $:/plugins/ebalster/condition/repack
+type: text/vnd.tiddlywiki
+
+Repacking command (use this in the browser console to repack the plugin)
+
+
$tw.utils.repackPlugin("$:/plugins/ebalster/condition", (= "[" & textjoin(",",
+ TRUE,
+ [prefix[$:/plugins/ebalster/condition/]addprefix["]addsuffix["]]) & "]" =));
+
+
+Version: <$edit-text tiddler="$:/plugins/ebalster/condition" field="version" />
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_condition.js b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_condition.js
new file mode 100644
index 0000000..acccdd7
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_condition.js
@@ -0,0 +1,163 @@
+/*\
+title: $:/plugins/ebalster/condition/widgets/condition.js
+type: application/javascript
+module-type: widget
+
+Base class for condition widgets.
+
+\*/
+(function(){
+
+/*jslint node: true, browser: true */
+/*global $tw: false */
+"use strict";
+
+var Widget = require("$:/core/modules/widgets/widget.js").widget;
+
+var ConditionWidget = function(parseTreeNode,options) {
+ if(arguments.length > 0) {
+ this.initialise(parseTreeNode,options);
+ }
+};
+
+/*
+Inherit from the base widget class
+*/
+ConditionWidget.prototype = new Widget();
+
+/*
+Render this widget into the DOM
+*/
+ConditionWidget.prototype.render = function(parent,nextSibling) {
+ this.parentDomNode = parent;
+ this.computeAttributes();
+ this.execute();
+ this.rerender(parent,nextSibling);
+};
+
+ConditionWidget.prototype.rerender = function(parent,nextSibling) {
+ this.removeChildDomNodes();
+ if (this.conditionError) {
+ // Show an error.
+ var parseTreeNodes = [{type: "element", tag: "span", attributes: {
+ "class": {type: "string", value: "tc-error"}
+ }, children: [
+ {type: "text", text: this.conditionError}
+ ]}];
+ this.makeChildWidgets(parseTreeNodes);
+ }
+ else if (this.isOpen) {
+ // Construct and render the child widgets.
+ this.makeChildWidgets(this.parseTreeNode.children);
+ }
+ else {
+ // Destroy the child widgets.
+ this.children = [];
+ }
+ this.renderChildren(parent,nextSibling);
+};
+
+/*
+Compute the internal state of the widget (default behavior)
+*/
+ConditionWidget.prototype.execute = function() {
+ this.executeIf("$condition");
+};
+
+/*
+Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
+*/
+ConditionWidget.prototype.refresh = function(changedTiddlers) {
+ var currentlyOpen = this.isOpen;
+ var changedAttributes = this.computeAttributes();
+ this.execute();
+ if(this.isOpen !== currentlyOpen) {
+ var nextSibling = this.findNextSiblingDomNode();
+ this.rerender(this.parentDomNode,nextSibling);
+ return true;
+ }
+ return this.refreshChildren(changedTiddlers);
+};
+
+/*
+Utility: Is a value "truthy"?
+*/
+ConditionWidget.prototype.valueIsTruthy = function(value) {
+ // It's truthy if it's not falsy, ie, undefined, false, blank or zero.
+ return !(/^\s*(undefined|false|null|0+|0*\.0+|0+\.0*|)\s*$/i.test(value));
+};
+
+/*
+Utility: Find a preceding non-text widget for an "else" widget.
+*/
+ConditionWidget.prototype.findPrecedingConditionWidget = function() {
+ var siblings = (this.parentWidget ? this.parentWidget.children : null);
+ var sibling;
+ if (siblings) {
+ for (var i = siblings.indexOf(this)-1; i >= 0; --i) {
+ sibling = siblings[i];
+ if (sibling.parseTreeNode.type == "text") continue;
+ if (sibling.isOpen != null || sibling.list != null) return sibling;
+ return null;
+ }
+ }
+ return null;
+};
+
+/*
+Utility: Test if another widget triggers an "else"; ie, false conditions, closed reveals, empty lists.
+*/
+ConditionWidget.prototype.widgetTriggersElse = function(widget) {
+ // Condition widgets
+ if (widget.triggerElse != null) return widget.triggerElse;
+ // Reveal widget
+ if (widget.isOpen != null) return !widget.isOpen;
+ // List widget
+ if (widget.list != null) return (widget.list instanceof Array) && widget.list.length == 0;
+};
+
+/*
+Utility: Execute as an "else" condition, computing isOpen and conditionError accordingly.
+*/
+ConditionWidget.prototype.executeElse = function(widgetName) {
+ this.isOpen = false;
+ this.conditionError = null;
+ this.triggerElse = false;
+ var predicate = this.findPrecedingConditionWidget();
+ if (!predicate) {
+ this.conditionError = (widgetName||"$else") + " widget must follow $if, $else-if, $reveal or $list.";
+ return;
+ }
+ this.isOpen = this.widgetTriggersElse(predicate);
+};
+
+/*
+Utility: Execute as an "if" condition, computing isOpen and conditionError accordingly.
+*/
+ConditionWidget.prototype.executeIf = function(widgetName) {
+ this.isOpen = false;
+ this.conditionError = null;
+ this.triggerElse = false;
+ // Re-check our "if" condition.
+ var value = this.getAttribute("value");
+ var match = this.getAttribute("match");
+ if (value == null) {
+ this.conditionError = (widgetName||"$condition") + " widget requires a 'value' attribute.";
+ return;
+ }
+ else if (match == null) {
+ // Open if the value is truthy.
+ this.isOpen = this.valueIsTruthy(value);
+ }
+ else {
+ this.isOpen = (value == match);
+ }
+ if (this.getAttribute("not")) {
+ this.isOpen = !this.isOpen;
+ }
+ this.triggerElse = !this.isOpen;
+};
+
+exports.condition = ConditionWidget;
+
+})();
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_condition.js.meta b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_condition.js.meta
new file mode 100644
index 0000000..d244ab5
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_condition.js.meta
@@ -0,0 +1,8 @@
+created: 20171230024342810
+description: As the $vars widget, but each attribute is interpreted as a formula.
+modified: 20171230024403999
+module-type: widget
+revision: 0
+tags:
+title: $:/plugins/ebalster/condition/widgets/condition.js
+type: application/javascript
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_elif.js b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_elif.js
new file mode 100644
index 0000000..d2ddafa
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_elif.js
@@ -0,0 +1,36 @@
+/*\
+title: $:/plugins/ebalster/condition/widgets/if.js
+type: application/javascript
+module-type: widget
+
+If-condition widget
+
+\*/
+(function(){
+
+/*jslint node: true, browser: true */
+/*global $tw: false */
+"use strict";
+
+var ConditionWidget = require("$:/plugins/ebalster/condition/widgets/condition.js").condition;
+
+var ElifWidget = function(parseTreeNode,options) {
+ this.initialise(parseTreeNode,options);
+};
+
+/*
+Inherit from the base widget class
+*/
+ElifWidget.prototype = new ConditionWidget();
+
+/*
+Compute the internal state of the widget
+*/
+ElifWidget.prototype.execute = function() {
+ this.executeElse("$else-if");
+ if (this.isOpen) this.executeIf("$if");
+};
+
+exports["else-if"] = ElifWidget;
+
+})();
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_elif.js.meta b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_elif.js.meta
new file mode 100644
index 0000000..76bac05
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_elif.js.meta
@@ -0,0 +1,8 @@
+created: 20171230040903429
+description: As the $vars widget, but each attribute is interpreted as a formula.
+modified: 20171230040911552
+module-type: widget
+revision: 0
+tags:
+title: $:/plugins/ebalster/condition/widgets/elif.js
+type: application/javascript
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_else.js b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_else.js
new file mode 100644
index 0000000..9f67e2e
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_else.js
@@ -0,0 +1,36 @@
+/*\
+title: $:/plugins/ebalster/condition/widgets/if.js
+type: application/javascript
+module-type: widget
+
+If-condition widget
+
+\*/
+(function(){
+
+/*jslint node: true, browser: true */
+/*global $tw: false */
+"use strict";
+
+var ConditionWidget = require("$:/plugins/ebalster/condition/widgets/condition.js").condition;
+
+var ElseWidget = function(parseTreeNode,options) {
+ this.initialise(parseTreeNode,options);
+};
+
+/*
+Inherit from the base widget class
+*/
+ElseWidget.prototype = new ConditionWidget();
+
+/*
+Compute the internal state of the widget
+*/
+ElseWidget.prototype.execute = function() {
+ // Execute as an else condition.
+ this.executeElse("$else");
+};
+
+exports.else = ElseWidget;
+
+})();
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_else.js.meta b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_else.js.meta
new file mode 100644
index 0000000..195b537
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_else.js.meta
@@ -0,0 +1,8 @@
+created: 20171230025320439
+description: As the $vars widget, but each attribute is interpreted as a formula.
+modified: 20171230025331858
+module-type: widget
+revision: 0
+tags:
+title: $:/plugins/ebalster/condition/widgets/else.js
+type: application/javascript
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_if.js b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_if.js
new file mode 100644
index 0000000..f192ab7
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_if.js
@@ -0,0 +1,35 @@
+/*\
+title: $:/plugins/ebalster/condition/widgets/if.js
+type: application/javascript
+module-type: widget
+
+If-condition widget
+
+\*/
+(function(){
+
+/*jslint node: true, browser: true */
+/*global $tw: false */
+"use strict";
+
+var ConditionWidget = require("$:/plugins/ebalster/condition/widgets/condition.js").condition;
+
+var IfWidget = function(parseTreeNode,options) {
+ this.initialise(parseTreeNode,options);
+};
+
+/*
+Inherit from the base widget class
+*/
+IfWidget.prototype = new ConditionWidget();
+
+/*
+Compute the internal state of the widget
+*/
+IfWidget.prototype.execute = function() {
+ this.executeIf("$if");
+};
+
+exports.if = IfWidget;
+
+})();
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_if.js.meta b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_if.js.meta
new file mode 100644
index 0000000..ed4ad7b
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/$__plugins_ebalster_condition_widgets_if.js.meta
@@ -0,0 +1,8 @@
+created: 20171230002741585
+description: As the $vars widget, but each attribute is interpreted as a formula.
+modified: 20171230004310622
+module-type: widget
+revision: 0
+tags:
+title: $:/plugins/ebalster/condition/widgets/if.js
+type: application/javascript
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/condition/plugin.info b/Wiki-OcttKB/plugins/condition/plugin.info
new file mode 100644
index 0000000..546a135
--- /dev/null
+++ b/Wiki-OcttKB/plugins/condition/plugin.info
@@ -0,0 +1,12 @@
+{
+ "bag": "default",
+ "revision": "0",
+ "version": "0.1.2",
+ "title": "$:/plugins/ebalster/condition",
+ "tags": "",
+ "plugin-type": "plugin",
+ "modified": "20171230165413285",
+ "list": "readme license changelog",
+ "dependents": "",
+ "created": "20171230044033218"
+}
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/echarts-addons/$__addon_bookprogress.js b/Wiki-OcttKB/plugins/echarts-addons/$__addon_bookprogress.js
new file mode 100644
index 0000000..b022284
--- /dev/null
+++ b/Wiki-OcttKB/plugins/echarts-addons/$__addon_bookprogress.js
@@ -0,0 +1,9 @@
+/*\
+title: $:/addon/bookprogress.js
+type: application/javascript
+description:
+
+// module-type: echarts-component
+
+\*/
+new $tw.Story;const e={onUpdate(e,t,o){const{title:r,filter:s="[tags[]!prefix[$:/]]",sort:i="descend",width:l=2,radius:a=10,toolbox:d="hide",doughnut:n,focusSelf:f,legend:u}=o,h=[];$tw.wiki.filterTiddlers(s).slice(0,50).sort().forEach((e=>h.push((e=>({name:e,value:$tw.wiki.filterTiddlers(`[tag[${e}]!has[draft.of]]`).length}))(e))));const c=h.length>10?0:l,p=h.length>10?5:a,g={title:{text:r,subtext:"",left:"left",top:"top"},toolbox:{show:"show"===d,left:0,bottom:0,feature:{dataView:{show:!0,readOnly:!1},restore:{},saveAsImage:{}}},tooltip:{trigger:"item",formatter:function(e){const{name:t,value:o,percent:r}=e;return o?`${t} 标签 有 ${o} 个条目 (${r}%)`:`${t} 条目`}},legend:{show:"yes"===u,orient:"vertical",right:10,top:20,bottom:20,type:"scroll"},series:[{name:"Tag",type:"pie",radius:"yes"===n?["40%","70%"]:"50%",center:"yes"===u?["40%","50%"]:"50%",data:h,itemStyle:{borderRadius:p,borderWidth:c,borderColor:"#fff"},emphasis:{focus:"yes"===f?"self":"",itemStyle:{}}}]};h.sort((function(e,t){return"descend"===i?t.value-e.value:e.value-t.value})),e.setOption(g)},shouldUpdate:(e,t)=>!!Object.keys(t).filter((e=>"$:/info/darkmode"===e||!e.startsWith("$:/")&&!e.startsWith("Draft of"))).length};module.exports=e;
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/echarts-addons/$__addon_bookprogress.js.meta b/Wiki-OcttKB/plugins/echarts-addons/$__addon_bookprogress.js.meta
new file mode 100644
index 0000000..549a142
--- /dev/null
+++ b/Wiki-OcttKB/plugins/echarts-addons/$__addon_bookprogress.js.meta
@@ -0,0 +1,3 @@
+description:
+title: $:/addon/bookprogress.js
+type: application/javascript
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/echarts-addons/$__addon_clock.js b/Wiki-OcttKB/plugins/echarts-addons/$__addon_clock.js
new file mode 100644
index 0000000..8fd9edc
--- /dev/null
+++ b/Wiki-OcttKB/plugins/echarts-addons/$__addon_clock.js
@@ -0,0 +1,7 @@
+/*\
+title: $:/addon/clock.js
+module-type: echarts-component
+type: application/javascript
+description: clock with echarts
+\*/
+const e={onUpdate(e){option={title:{text:"",top:"top",left:"center"},series:[{name:"hour",type:"gauge",startAngle:90,endAngle:-270,min:0,max:12,splitNumber:12,clockwise:!0,axisLine:{lineStyle:{width:8,color:[[1,"rgba(0,0,0,0.7)"]],shadowColor:"rgba(0, 0, 0, 0.5)",shadowBlur:15}},splitLine:{lineStyle:{shadowColor:"rgba(0, 0, 0, 0.3)",shadowBlur:3,shadowOffsetX:1,shadowOffsetY:2}},axisLabel:{fontSize:16,distance:15,formatter:function(e){return 0===e?"":e+""}},pointer:{icon:"path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z",width:6,length:"55%",offsetCenter:[0,"8%"],itemStyle:{color:"#C0911F",shadowColor:"rgba(0, 0, 0, 0.3)",shadowBlur:8,shadowOffsetX:2,shadowOffsetY:4}},detail:{show:!1},title:{offsetCenter:[0,"30%"]},data:[{value:0}]},{name:"minute",type:"gauge",startAngle:90,endAngle:-270,min:0,max:60,clockwise:!0,axisLine:{show:!1},splitLine:{show:!1},axisTick:{show:!1},axisLabel:{show:!1},pointer:{icon:"path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z",width:4,length:"70%",offsetCenter:[0,"8%"],itemStyle:{color:"#C0911F",shadowColor:"rgba(0, 0, 0, 0.3)",shadowBlur:8,shadowOffsetX:2,shadowOffsetY:4}},anchor:{show:!0,size:20,showAbove:!1,itemStyle:{borderWidth:8,borderColor:"#C0911F",shadowColor:"rgba(0, 0, 0, 0.3)",shadowBlur:8,shadowOffsetX:2,shadowOffsetY:4}},detail:{show:!1},title:{offsetCenter:["0%","-40%"]},data:[{value:0}]},{name:"second",type:"gauge",startAngle:90,endAngle:-270,min:0,max:60,animationEasingUpdate:"bounceOut",clockwise:!0,axisLine:{show:!1},splitLine:{show:!1},axisTick:{show:!1},axisLabel:{show:!1},pointer:{icon:"path://M2.9,0.7L2.9,0.7c1.4,0,2.6,1.2,2.6,2.6v115c0,1.4-1.2,2.6-2.6,2.6l0,0c-1.4,0-2.6-1.2-2.6-2.6V3.3C0.3,1.9,1.4,0.7,2.9,0.7z",width:2,length:"85%",offsetCenter:[0,"8%"],itemStyle:{color:"#C0911F",shadowColor:"rgba(0, 0, 0, 0.3)",shadowBlur:8,shadowOffsetX:2,shadowOffsetY:4}},anchor:{show:!0,size:15,showAbove:!0,itemStyle:{color:"#C0911F",shadowColor:"rgba(0, 0, 0, 0.3)",shadowBlur:8,shadowOffsetX:2,shadowOffsetY:4}},detail:{show:!1},title:{offsetCenter:["0%","-40%"]},data:[{value:0}]}]},setInterval((function(){var t=new Date,o=t.getSeconds(),a=t.getMinutes()+o/60,s=t.getHours()%12+a/60;option.animationDurationUpdate=300,e.setOption({series:[{name:"hour",animation:0!==s,data:[{value:s}]},{name:"minute",animation:0!==a,data:[{value:a}]},{animation:0!==o,name:"second",data:[{value:o}]}]})}),1e3),e.setOption(option)},shouldUpdate:()=>!1};module.exports=e;
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/echarts-addons/$__addon_clock.js.meta b/Wiki-OcttKB/plugins/echarts-addons/$__addon_clock.js.meta
new file mode 100644
index 0000000..054e52b
--- /dev/null
+++ b/Wiki-OcttKB/plugins/echarts-addons/$__addon_clock.js.meta
@@ -0,0 +1,4 @@
+description: clock with echarts
+module-type: echarts-component
+title: $:/addon/clock.js
+type: application/javascript
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/echarts-addons/$__addon_sevenday.js b/Wiki-OcttKB/plugins/echarts-addons/$__addon_sevenday.js
new file mode 100644
index 0000000..f4b278f
--- /dev/null
+++ b/Wiki-OcttKB/plugins/echarts-addons/$__addon_sevenday.js
@@ -0,0 +1,10 @@
+/*\
+title: $:/addon/sevenday.js
+module-type: echarts-component
+type: application/javascript
+description: 折线图
+
+\*/
+const e=(e,t="created")=>$tw.wiki.filterTiddlers(`[sameday:${t}[${e}]!is[system]!has[draft.of]]`).length,t=e=>new Date(`${e.substr(0,4)}-${e.substr(4,2)}-${e.substr(6,2)}`),a={title:"最近文章动态",opacity:.8,xLegend:"日期",yLegend:"文章数量",lineWidth:0,symbolSize:0},o={onUpdate(o,i,s){const{days:r,date:d,title:n=a.title,subtitle:l="",disableClick:c="no"}=s,f=function(e,a=7){const o=e?t(e):new Date,i=[];for(let e=0;em.push(e(t)))),f.forEach((t=>h.push(e(t,"modified"))));const y={title:{text:n,subtext:l,left:"center",top:"bottom"},legend:{data:["created","modified"]},toolbox:{feature:{restore:{}}},tooltip:{trigger:"item",
+// type: 'cross',
+formatter:function(e){const{name:a,value:o,seriesName:i}=e,s=t(a).toLocaleDateString();return"created"===i?o?`${s} 新增了 ${o} 篇文章`:`${s} 没有新增文章`:o?`${s} 更新了 ${o} 篇文章`:`${s} 没有文章更新`}},xAxis:{boundaryGap:!0,type:"category",data:f,name:a.xLegend},yAxis:{type:"value",name:a.yLegend},animationDuration:2e3,series:[{name:"created",data:m,type:"line",showSymbol:!1,symbolSize:a.symbolSize,stack:"Total",lineStyle:{width:a.lineWidth},endLabel:{show:!0,formatter:"{a}",distance:20},areaStyle:{opacity:a.opacity,color:new echarts.graphic.LinearGradient(0,0,0,1,[{offset:0,color:"rgb(55, 162, 255)"},{offset:1,color:"rgb(116, 21, 219)"}])},emphasis:{focus:"series",itemStyle:{scale:1.5,shadowOffsetX:0,shadowColor:"rgba(0, 0, 0, 0.5)"}},smooth:!0},{name:"modified",data:h,lineStyle:{width:a.lineWidth},symbolSize:a.symbolSize,stack:"Total",type:"line",showSymbol:!1,endLabel:{show:!0,formatter:"{a}",distance:20},areaStyle:{opacity:a.opacity,color:new echarts.graphic.LinearGradient(0,0,0,1,[{offset:0,color:"rgb(128, 255, 165)"},{offset:1,color:"rgb(1, 191, 236)"}])},emphasis:{focus:"series",itemStyle:{scale:1.25,shadowOffsetX:0,shadowColor:"rgba(0, 0, 0, 0.5)"}},smooth:!0}]};o.setOption(y),o.on("dblclick","series",(function(e){const{name:t,value:a,seriesName:o}=e,i=new $tw.Story,s=`[sameday:${o}[${t}]!is[system]!has[draft.of]]`;a&&($tw.rootWidget.invokeActionString('<$action-setfield $tiddler="$:/temp/advancedsearch" text="""'+s+'"""/><$action-setfield $tiddler="$:/temp/advancedsearch/input" text="""'+s+'"""/><$action-setfield $tiddler="$:/temp/advancedsearch/refresh" text="yes"/><$action-setfield $tiddler="$:/state/tab--1498284803" text="$:/core/ui/AdvancedSearch/Filter"/>'),i.navigateTiddler("$:/AdvancedSearch"))}))},shouldUpdate:()=>!1};module.exports=o;
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/echarts-addons/$__addon_sevenday.js.meta b/Wiki-OcttKB/plugins/echarts-addons/$__addon_sevenday.js.meta
new file mode 100644
index 0000000..82afc14
--- /dev/null
+++ b/Wiki-OcttKB/plugins/echarts-addons/$__addon_sevenday.js.meta
@@ -0,0 +1,4 @@
+description: 折线图
+module-type: echarts-component
+title: $:/addon/sevenday.js
+type: application/javascript
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/echarts-addons/$__addon_tagpie.js b/Wiki-OcttKB/plugins/echarts-addons/$__addon_tagpie.js
new file mode 100644
index 0000000..57f0317
--- /dev/null
+++ b/Wiki-OcttKB/plugins/echarts-addons/$__addon_tagpie.js
@@ -0,0 +1,10 @@
+/*\
+title: $:/addon/tagpie.js
+module-type: echarts-component
+type: application/javascript
+description: tag pie on tiddlywiki
+
+\*/
+const e=new $tw.Story,t=t=>{const o=t.name;$tw.wiki.tiddlerExists(o)?
+// parentWidget.dispatchEvent( { type: 'tm-navigate', navigateTo: title } )
+e.navigateTiddler(o):console.log(o+" not found")},o={onUpdate(e,o,s){const{title:r,filter:i="[tags[]!prefix[$:/]]",sort:l="descend",width:a=2,radius:n=10,toolbox:d="hide",doughnut:f,focusSelf:u,legend:c}=s,h=[];$tw.wiki.filterTiddlers(i).slice(0,50).sort().forEach((e=>h.push((e=>({name:e,value:$tw.wiki.filterTiddlers(`[tag[${e}]!has[draft.of]]`).length}))(e))));const g=h.length>10?0:a,p=h.length>10?5:n,m={title:{text:r,subtext:"",left:"left",top:"top"},toolbox:{show:"show"===d,left:0,bottom:0,feature:{dataView:{show:!0,readOnly:!1},restore:{},saveAsImage:{}}},tooltip:{trigger:"item",formatter:function(e){const{name:t,value:o,percent:s}=e;return o?`${t} 标签 有 ${o} 个条目 (${s}%)`:`${t} 条目`}},legend:{show:"yes"===c,orient:"vertical",right:10,top:20,bottom:20,type:"scroll"},series:[{name:"Tag",type:"pie",radius:"yes"===f?["40%","70%"]:"50%",center:"yes"===c?["40%","50%"]:"50%",data:h,itemStyle:{borderRadius:p,borderWidth:g,borderColor:"#fff"},emphasis:{focus:"yes"===u?"self":"",itemStyle:{}}}]};h.sort((function(e,t){return"descend"===l?t.value-e.value:e.value-t.value})),e.setOption(m),e.on("click","series",t)},shouldUpdate:(e,t)=>!!Object.keys(t).filter((e=>"$:/info/darkmode"===e||!e.startsWith("$:/")&&!e.startsWith("Draft of"))).length};module.exports=o;
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/echarts-addons/$__addon_tagpie.js.meta b/Wiki-OcttKB/plugins/echarts-addons/$__addon_tagpie.js.meta
new file mode 100644
index 0000000..d7fc66c
--- /dev/null
+++ b/Wiki-OcttKB/plugins/echarts-addons/$__addon_tagpie.js.meta
@@ -0,0 +1,4 @@
+description: tag pie on tiddlywiki
+module-type: echarts-component
+title: $:/addon/tagpie.js
+type: application/javascript
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/echarts-addons/$__plugins_oeyoews_echarts-addons_readme.md b/Wiki-OcttKB/plugins/echarts-addons/$__plugins_oeyoews_echarts-addons_readme.md
new file mode 100644
index 0000000..ca652d9
--- /dev/null
+++ b/Wiki-OcttKB/plugins/echarts-addons/$__plugins_oeyoews_echarts-addons_readme.md
@@ -0,0 +1,20 @@
+<$badge icon="echarts" />
+
+[img[https://i.imgur.com/9BEZnR3.png]]
+[img[https://i.imgur.com/myoq7V4.png]]
+[img[https://i.imgur.com/Zz1Qe8i.png]]
+
+> 目前支持 clockc, tagpie, sevenday, 三种 addon
+
+* 将 echarts 的 addons 独立出来,使用 js 编写,不依赖外部环境,即使在 tw 里面也能快速修改,方便用户修改
+
+## Usage
+
+> coming ...
+
+## TODO
+
+* update tooltip style to fix darkmode
+* support qrcode field to show current tiddler url qrcode
+
+<$qrcode type=url />
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/echarts-addons/$__plugins_oeyoews_echarts-addons_readme.md.meta b/Wiki-OcttKB/plugins/echarts-addons/$__plugins_oeyoews_echarts-addons_readme.md.meta
new file mode 100644
index 0000000..d180670
--- /dev/null
+++ b/Wiki-OcttKB/plugins/echarts-addons/$__plugins_oeyoews_echarts-addons_readme.md.meta
@@ -0,0 +1,2 @@
+title: $:/plugins/oeyoews/echarts-addons/readme
+type: text/markdown
\ No newline at end of file
diff --git a/Wiki-OcttKB/plugins/echarts-addons/plugin.info b/Wiki-OcttKB/plugins/echarts-addons/plugin.info
new file mode 100644
index 0000000..d1f9e1a
--- /dev/null
+++ b/Wiki-OcttKB/plugins/echarts-addons/plugin.info
@@ -0,0 +1,18 @@
+{
+ "created": "20240129095432732",
+ "creator": "Octt",
+ "version": "0.0.2",
+ "title": "$:/plugins/oeyoews/echarts-addons",
+ "plugin-type": "plugin",
+ "name": "Echarts Addons",
+ "description": "Addons",
+ "author": "oeyoews",
+ "meta#disabled": "yes",
+ "parent-plugin": "$:/plugins/Gk0Wk/echarts",
+ "list": "readme",
+ "dependents": "",
+ "revision": "0",
+ "bag": "default",
+ "modified": "20240129095443682",
+ "modifier": "Octt"
+}
\ No newline at end of file
diff --git a/Wiki-OcttKB/tiddlers/Normal/OcttKB/_Data.tid b/Wiki-OcttKB/tiddlers/Normal/OcttKB/_Data.tid
index b2f255d..31fd005 100644
--- a/Wiki-OcttKB/tiddlers/Normal/OcttKB/_Data.tid
+++ b/Wiki-OcttKB/tiddlers/Normal/OcttKB/_Data.tid
@@ -1,6 +1,6 @@
created: 20230109220804304
creator: Octt
-modified: 20230208171053772
+modified: 20240129095852920
modifier: Octt
tags: OcttKB $:/i18n:en
title: OcttKB/Data
@@ -17,7 +17,15 @@ Are these useless? ''Yes!'' But they are so pretty...
<$echarts $tiddler="$:/plugins/Gk0Wk/echarts/addons/GitHubHeatMap.js" $width="100%" $height="100%" />
-