├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── farplace
│ │ └── nonote
│ │ └── ExampleInstrumentedTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ └── editor
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── bundle.js
│ │ │ ├── css
│ │ │ └── editor.css
│ │ │ ├── index.html
│ │ │ ├── js
│ │ │ ├── editor.js
│ │ │ └── fileutil.js
│ │ │ ├── note
│ │ │ └── hello.md
│ │ │ ├── package-lock.json
│ │ │ ├── package.json
│ │ │ └── test.md
│ ├── ic_launcher-playstore.png
│ ├── java
│ │ └── com
│ │ │ └── farplace
│ │ │ └── nonote
│ │ │ ├── MainActivity.java
│ │ │ ├── data
│ │ │ └── MainData.java
│ │ │ ├── util
│ │ │ ├── FileUtil.java
│ │ │ ├── NoteUtil.java
│ │ │ └── StringUtil.java
│ │ │ └── view
│ │ │ ├── FileCreateDialog.java
│ │ │ ├── MenuPopupView.java
│ │ │ └── VditorWebView.java
│ └── res
│ │ ├── drawable
│ │ ├── button_background.xml
│ │ ├── button_click_background.xml
│ │ ├── button_press_background.xml
│ │ ├── dot_line_background.xml
│ │ ├── ic_launcher_background.xml
│ │ ├── linear_background_color.xml
│ │ ├── linear_second_background_color.xml
│ │ ├── logo.png
│ │ ├── outline_save_24.xml
│ │ ├── round_add_24.xml
│ │ ├── round_attach_money_24.xml
│ │ ├── round_keyboard_return_24.xml
│ │ ├── round_keyboard_tab_24.xml
│ │ ├── round_space_bar_24.xml
│ │ └── round_tag_24.xml
│ │ ├── layout
│ │ ├── activity_main.xml
│ │ ├── content_main.xml
│ │ ├── file_create_dialog_layout.xml
│ │ ├── help_button_layout.xml
│ │ ├── popup_menu_item_view.xml
│ │ └── popup_menu_layout.xml
│ │ ├── menu
│ │ └── menu_main.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.webp
│ │ ├── ic_launcher_background.webp
│ │ ├── ic_launcher_foreground.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.webp
│ │ ├── ic_launcher_background.webp
│ │ ├── ic_launcher_foreground.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.webp
│ │ ├── ic_launcher_background.webp
│ │ ├── ic_launcher_foreground.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.webp
│ │ ├── ic_launcher_background.webp
│ │ ├── ic_launcher_foreground.webp
│ │ └── ic_launcher_round.webp
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.webp
│ │ ├── ic_launcher_background.webp
│ │ ├── ic_launcher_foreground.webp
│ │ └── ic_launcher_round.webp
│ │ ├── values-night
│ │ └── colors.xml
│ │ └── values
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── themes.xml
│ └── test
│ └── java
│ └── com
│ └── farplace
│ └── nonote
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── pics
├── fore.png
├── sc.jpg
├── sc1.jpg
└── sc2.jpg
└── settings.gradle
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Gradle files
2 | .gradle/
3 | build/
4 |
5 | # Local configuration file (sdk path, etc)
6 | local.properties
7 |
8 | # Log/OS Files
9 | *.log
10 |
11 | # Android Studio generated files and folders
12 | captures/
13 | .externalNativeBuild/
14 | .cxx/
15 | *.apk
16 | output.json
17 |
18 | # IntelliJ
19 | *.iml
20 | .idea/
21 |
22 | # Keystore files
23 | *.jks
24 | *.keystore
25 |
26 | # Google Services (e.g. APIs or Firebase)
27 | google-services.json
28 |
29 | # Android Profiling
30 | *.hprof
31 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 TSIOJeft
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # NoNote_Android
2 | NoNote Android.
3 |
4 | ## About
5 | [NoNote](https://github.com/TSIOJeft/NoNote)
6 |
7 | ## Shots
8 | 
9 | 
10 | 
11 |
12 | ## Download
13 | apk file in release.
14 | Thanks.
15 | 😍
16 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.application'
3 | }
4 |
5 | android {
6 | namespace 'com.farplace.nonote'
7 | compileSdk 34
8 |
9 | defaultConfig {
10 | applicationId "com.farplace.nonote"
11 | minSdk 23
12 | targetSdk 33
13 | versionCode 1
14 | versionName "1.0"
15 |
16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
17 | }
18 |
19 | buildTypes {
20 | release {
21 | minifyEnabled false
22 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
23 | }
24 | }
25 | compileOptions {
26 | sourceCompatibility JavaVersion.VERSION_11
27 | targetCompatibility JavaVersion.VERSION_11
28 | }
29 | buildFeatures {
30 | viewBinding true
31 | }
32 | buildToolsVersion '34.0.0'
33 | }
34 |
35 | dependencies {
36 |
37 | implementation 'androidx.appcompat:appcompat:1.6.1'
38 | implementation 'com.google.android.material:material:1.11.0'
39 | implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
40 | implementation 'androidx.navigation:navigation-fragment:2.7.5'
41 | implementation 'org.apache.commons:commons-text:1.9'
42 | implementation 'androidx.navigation:navigation-ui:2.7.5'
43 | }
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/farplace/nonote/ExampleInstrumentedTest.java:
--------------------------------------------------------------------------------
1 | package com.farplace.nonote;
2 |
3 | import android.content.Context;
4 |
5 | import androidx.test.platform.app.InstrumentationRegistry;
6 | import androidx.test.ext.junit.runners.AndroidJUnit4;
7 |
8 | import org.junit.Test;
9 | import org.junit.runner.RunWith;
10 |
11 | import static org.junit.Assert.*;
12 |
13 | /**
14 | * Instrumented test, which will execute on an Android device.
15 | *
16 | * @see Testing documentation
17 | */
18 | @RunWith(AndroidJUnit4.class)
19 | public class ExampleInstrumentedTest {
20 | @Test
21 | public void useAppContext() {
22 | // Context of the app under test.
23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
24 | assertEquals("com.farplace.nonote", appContext.getPackageName());
25 | }
26 | }
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
13 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/app/src/main/assets/editor/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 FarPlace
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/app/src/main/assets/editor/README.md:
--------------------------------------------------------------------------------
1 | # NoNote
2 | Pure MarkDown Note.
3 |
--------------------------------------------------------------------------------
/app/src/main/assets/editor/css/editor.css:
--------------------------------------------------------------------------------
1 | html {
2 | height: 100%;
3 | width: 100%;
4 | }
5 |
6 | body {
7 | height: 100%;
8 | width: 100%;
9 | display: flex;
10 | }
11 |
12 | /* body {
13 | overflow: scroll;
14 | display: table;
15 | table-layout: fixed;
16 | width: 100%;
17 | min-height: 100%;
18 | margin:0;
19 | } */
20 |
21 | /* #vditor {
22 | display: table-cell;
23 | outline: 0px solid transparent;
24 | background-repeat: no-repeat;
25 | background-position: center;
26 | background-size: cover;
27 | } */
28 | .toolbar {
29 | height: 42px;
30 | width: 100%;
31 | align-self: center;
32 | align-items: center;
33 | align-content: center;
34 | display: flex;
35 | flex-direction: row;
36 | background: linear-gradient(#757575, #616161);
37 | }
38 |
39 | .borderButton {
40 | border: 1px solid #424242;
41 | text-align: center;
42 | color: white;
43 | font-weight: bold;
44 | display: inline-block;
45 | padding: 2px;
46 | padding-left: 6px;
47 | padding-right: 6px;
48 | border-radius: 8px;
49 | margin-left: 8px;
50 | }
51 |
52 | .vditor {
53 | border-radius: 0;
54 | border: 0 solid #000;
55 | flex: 1;
56 | align-self: center;
57 | }
58 |
59 | .vditor-toolbar {
60 | border-bottom: 0 solid #000;
61 | height: 0;
62 | }
63 |
64 | .vditor-textarea {
65 | background-color: #fff;
66 | }
--------------------------------------------------------------------------------
/app/src/main/assets/editor/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
23 |
25 |
26 |
27 |
28 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/app/src/main/assets/editor/js/editor.js:
--------------------------------------------------------------------------------
1 | const vditor = new Vditor("vditor", {
2 | preview: { maxWidth: '900' }, width: '100%', upload: {
3 | url: 'http://127.0.0.1:5050/upload', file(files) {
4 | var mfile = files[0];
5 | if (mfile) {
6 | const reader = new FileReader();
7 | alert(mfile.name);
8 | reader.readAsArrayBuffer(mfile);
9 | reader.onload = function (evt) {
10 | if (evt.target.readyState == FileReader.DONE) {
11 | var arrayBuffer = evt.target.result,
12 | array = new Uint8Array(arrayBuffer);
13 | var fileByteArray = [];
14 | for (var i = 0; i < array.length; i++) {
15 | fileByteArray.push(array[i]);
16 | }
17 | var data = new Object();
18 | data.event = 2;
19 | data.mes = fileByteArray;
20 | window.chrome.webview.postMessage(JSON.stringify(data));
21 | }
22 |
23 | };
24 |
25 | }
26 | return null;
27 | }
28 | }, after() {
29 | var data = new Object();
30 | data.event = 0;
31 | window.chrome.webview.postMessage(JSON.stringify(data));
32 | }
33 | });
34 | // var fs = require('fs');
35 | // fs.writeFile("/tmp/test.txt", "Hey there!", function (err) {
36 | // if (err) {
37 | // console.log(err);
38 | // } else {
39 | // console.log("The file was saved!");
40 | // }
41 | // });
42 | // function getFile() {
43 | // fetch("http://127.0.0.1:9091/hello.md")
44 | // .then((response) => response.text())
45 | // .then((data) => {
46 | // vditor.setValue(data, (clearStack = false));
47 | // });
48 | // }
49 |
50 | function getFile(filePath) {
51 | fetch(filePath)
52 | .then((response) => response.text())
53 | .then((data) => {
54 | ameSetValue(data);
55 | alert(vditor.getValue())
56 | });
57 | }
58 |
59 | function getEditorValue() {
60 | return vditor.getValue();
61 | }
62 |
63 | function setEditorValue(data_json) {
64 | alert(data_json)
65 | var content = JSON.parse("\"" + data_json + "\"");
66 | alert(JSON.stringify(content));
67 | ameSetValue(content);
68 | }
69 |
70 | ameGetValue = () => {
71 | return vditor.getValue();
72 | };
73 |
74 | //在焦点处插入内容
75 | ameInsertValue = (value) => {
76 | vditor.insertValue(value);
77 | };
78 |
79 | //聚焦到编辑器
80 | ameFocus = () => {
81 | vditor.focus();
82 | };
83 |
84 | //失焦
85 | ameBlur = () => {
86 | vditor.blur();
87 | };
88 |
89 | //禁用
90 | ameDisabled = () => {
91 | vditor.disabled();
92 | };
93 |
94 | //解除编辑器禁用
95 | ameEnable = () => {
96 | vditor.enable();
97 | };
98 |
99 | //选中从 start 开始到 end 结束的字符串
100 | ameSetSelection = (start, end) => {
101 | vditor.setSelection(start, end);
102 | };
103 |
104 | //返回选中的字符串
105 | ameGetSelection = () => {
106 | return vditor.getSelection();
107 | };
108 |
109 | //设置编辑器内容
110 | ameSetValue = (value) => {
111 | vditor.setValue(value, clearStack = false);
112 | };
113 |
114 | //获取焦点位置
115 | ameGetCursorPosition = () => {
116 | return JSON.stringify(vditor.getCursorPosition());
117 | };
118 |
119 | //删除选中内容
120 | ameDeleteValue = () => {
121 | vditor.deleteValue();
122 | };
123 |
124 | //更新选中内容
125 | ameUpdateValue = (value) => {
126 | vditor.updateValue(value);
127 | };
128 |
129 | //清除缓存
130 | ameClearCache = () => {
131 | vditor.clearCache();
132 | };
133 |
134 | //禁用缓存
135 | ameDisabledCache = () => {
136 | vditor.disabledCache();
137 | };
138 |
139 | //启用缓存
140 | ameEnableCache = () => {
141 | vditor.enableCache();
142 | };
143 |
144 | //设置预览模式
145 | ameSetPreviewMode = (mode) => {
146 | //alert(mode);
147 | console.log(mode);
148 |
149 | vditor.setPreviewMode(mode);
150 | };
151 |
152 | //设置模式
153 | ameSetWysiwyg = (mode) => {
154 | vditor.setWysiwyg(mode);
155 | };
156 |
157 | //消息提示
158 | ameTip = (text, time) => {
159 | vditor.tip(text, time);
160 | };
161 |
162 | ameUndo = () => {
163 | vditor.undo();
164 | };
165 |
166 | ameRedo = () => {
167 | vditor.redo();
168 | };
169 |
170 | ameSetBold = () => {
171 | vditor.setBold();
172 | };
173 |
174 | ameSetH1 = () => {
175 | vditor.setH1();
176 | };
177 |
178 | ameSetH2 = () => {
179 | vditor.setH2();
180 | };
181 |
182 | ameSetH3 = () => {
183 | vditor.setH3();
184 | };
185 |
186 | ameSetH4 = () => {
187 | vditor.setH4();
188 | };
189 |
190 | ameSetH5 = () => {
191 | vditor.setH5();
192 | };
193 |
194 | ameSetH6 = () => {
195 | vditor.setH6();
196 | };
197 |
198 | ameSetItalic = () => {
199 | vditor.setItalic();
200 | };
201 |
202 | ameSetStrike = () => {
203 | vditor.setStrike();
204 | };
205 |
206 | ameSetLine = () => {
207 | vditor.setLine();
208 | };
209 |
210 | ameSetQuote = () => {
211 | vditor.setQuote();
212 | };
213 |
214 | ameSetList = () => {
215 | vditor.setList();
216 | };
217 |
218 | ameSetOrdered = () => {
219 | vditor.setOrdered();
220 | };
221 |
222 | ameSetCheck = () => {
223 | vditor.setCheck();
224 | };
225 |
226 | ameSetCode = () => {
227 | vditor.setCode();
228 | };
229 |
230 | ameSetInlineCode = () => {
231 | vditor.setInlineCode();
232 | };
233 |
234 | ameSetLink = () => {
235 | vditor.setLink();
236 | };
237 |
238 | ameSetTable = () => {
239 | vditor.setTable();
240 | };
241 |
242 | ameGetHtml = () => {
243 | // console.log(vditor.getHTML());
244 |
245 | // let str = vditor.getHTML();
246 |
247 | // let str1 = str.replace(new RegExp("\\u003C","gm"),"<")
248 |
249 | // return str1
250 | return vditor.getHTML();
251 | // vditor.getHTML().then(res => {
252 | // ameBridge.getHtml(res)
253 | // })
254 | };
255 |
256 | ameHtml2md = (value) => {
257 | return vditor.html2md(value);
258 | // vditor.html2md(value).then(res => {
259 | // ameBridge.html2md(res)
260 | // })
261 | };
262 |
--------------------------------------------------------------------------------
/app/src/main/assets/editor/js/fileutil.js:
--------------------------------------------------------------------------------
1 | const fs = require('browserify-fs');
2 | function getFile(filePath) {
3 | fetch(filePath)
4 | .then((response) => response.text())
5 | .then((data) => {
6 | vditor.setValue(data, (clearStack = false));
7 | });
8 | }
9 | function saveFile(filePath, text) {
10 |
11 | fs.writeFile(filePath, text, (err) => {
12 | if (err) {
13 | console.error('Error writing file:', err);
14 | } else {
15 | console.log('File saved successfully!');
16 | }
17 | });
18 | }
19 | exports.saveFile = saveFile
20 | exports.getFile = getFile
--------------------------------------------------------------------------------
/app/src/main/assets/editor/note/hello.md:
--------------------------------------------------------------------------------
1 | # hello NoNote1
--------------------------------------------------------------------------------
/app/src/main/assets/editor/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "NoNote",
3 | "lockfileVersion": 2,
4 | "requires": true,
5 | "packages": {
6 | "": {
7 | "dependencies": {
8 | "browserify-fs": "^1.0.0",
9 | "vditor": "^3.9.8"
10 | }
11 | },
12 | "node_modules/abstract-leveldown": {
13 | "version": "0.12.4",
14 | "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz",
15 | "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==",
16 | "dependencies": {
17 | "xtend": "~3.0.0"
18 | }
19 | },
20 | "node_modules/abstract-leveldown/node_modules/xtend": {
21 | "version": "3.0.0",
22 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz",
23 | "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==",
24 | "engines": {
25 | "node": ">=0.4"
26 | }
27 | },
28 | "node_modules/bl": {
29 | "version": "0.8.2",
30 | "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz",
31 | "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==",
32 | "dependencies": {
33 | "readable-stream": "~1.0.26"
34 | }
35 | },
36 | "node_modules/bl/node_modules/isarray": {
37 | "version": "0.0.1",
38 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
39 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
40 | },
41 | "node_modules/bl/node_modules/readable-stream": {
42 | "version": "1.0.34",
43 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
44 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
45 | "dependencies": {
46 | "core-util-is": "~1.0.0",
47 | "inherits": "~2.0.1",
48 | "isarray": "0.0.1",
49 | "string_decoder": "~0.10.x"
50 | }
51 | },
52 | "node_modules/bl/node_modules/string_decoder": {
53 | "version": "0.10.31",
54 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
55 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
56 | },
57 | "node_modules/browserify-fs": {
58 | "version": "1.0.0",
59 | "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz",
60 | "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==",
61 | "dependencies": {
62 | "level-filesystem": "^1.0.1",
63 | "level-js": "^2.1.3",
64 | "levelup": "^0.18.2"
65 | }
66 | },
67 | "node_modules/buffer-from": {
68 | "version": "1.1.2",
69 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
70 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
71 | },
72 | "node_modules/clone": {
73 | "version": "0.1.19",
74 | "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz",
75 | "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw==",
76 | "engines": {
77 | "node": "*"
78 | }
79 | },
80 | "node_modules/concat-stream": {
81 | "version": "1.6.2",
82 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
83 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
84 | "engines": [
85 | "node >= 0.8"
86 | ],
87 | "dependencies": {
88 | "buffer-from": "^1.0.0",
89 | "inherits": "^2.0.3",
90 | "readable-stream": "^2.2.2",
91 | "typedarray": "^0.0.6"
92 | }
93 | },
94 | "node_modules/core-util-is": {
95 | "version": "1.0.3",
96 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
97 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
98 | },
99 | "node_modules/deferred-leveldown": {
100 | "version": "0.2.0",
101 | "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz",
102 | "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==",
103 | "dependencies": {
104 | "abstract-leveldown": "~0.12.1"
105 | }
106 | },
107 | "node_modules/diff-match-patch": {
108 | "version": "1.0.5",
109 | "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz",
110 | "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw=="
111 | },
112 | "node_modules/errno": {
113 | "version": "0.1.8",
114 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
115 | "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
116 | "dependencies": {
117 | "prr": "~1.0.1"
118 | },
119 | "bin": {
120 | "errno": "cli.js"
121 | }
122 | },
123 | "node_modules/foreach": {
124 | "version": "2.0.6",
125 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz",
126 | "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg=="
127 | },
128 | "node_modules/fwd-stream": {
129 | "version": "1.0.4",
130 | "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz",
131 | "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==",
132 | "dependencies": {
133 | "readable-stream": "~1.0.26-4"
134 | }
135 | },
136 | "node_modules/fwd-stream/node_modules/isarray": {
137 | "version": "0.0.1",
138 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
139 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
140 | },
141 | "node_modules/fwd-stream/node_modules/readable-stream": {
142 | "version": "1.0.34",
143 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
144 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
145 | "dependencies": {
146 | "core-util-is": "~1.0.0",
147 | "inherits": "~2.0.1",
148 | "isarray": "0.0.1",
149 | "string_decoder": "~0.10.x"
150 | }
151 | },
152 | "node_modules/fwd-stream/node_modules/string_decoder": {
153 | "version": "0.10.31",
154 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
155 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
156 | },
157 | "node_modules/idb-wrapper": {
158 | "version": "1.7.2",
159 | "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz",
160 | "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg=="
161 | },
162 | "node_modules/indexof": {
163 | "version": "0.0.1",
164 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
165 | "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg=="
166 | },
167 | "node_modules/inherits": {
168 | "version": "2.0.4",
169 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
170 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
171 | },
172 | "node_modules/is": {
173 | "version": "0.2.7",
174 | "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz",
175 | "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ==",
176 | "engines": {
177 | "node": "*"
178 | }
179 | },
180 | "node_modules/is-object": {
181 | "version": "0.1.2",
182 | "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz",
183 | "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ=="
184 | },
185 | "node_modules/isarray": {
186 | "version": "1.0.0",
187 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
188 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
189 | },
190 | "node_modules/isbuffer": {
191 | "version": "0.0.0",
192 | "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz",
193 | "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g=="
194 | },
195 | "node_modules/level-blobs": {
196 | "version": "0.1.7",
197 | "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz",
198 | "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==",
199 | "dependencies": {
200 | "level-peek": "1.0.6",
201 | "once": "^1.3.0",
202 | "readable-stream": "^1.0.26-4"
203 | }
204 | },
205 | "node_modules/level-blobs/node_modules/isarray": {
206 | "version": "0.0.1",
207 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
208 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
209 | },
210 | "node_modules/level-blobs/node_modules/readable-stream": {
211 | "version": "1.1.14",
212 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
213 | "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
214 | "dependencies": {
215 | "core-util-is": "~1.0.0",
216 | "inherits": "~2.0.1",
217 | "isarray": "0.0.1",
218 | "string_decoder": "~0.10.x"
219 | }
220 | },
221 | "node_modules/level-blobs/node_modules/string_decoder": {
222 | "version": "0.10.31",
223 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
224 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
225 | },
226 | "node_modules/level-filesystem": {
227 | "version": "1.2.0",
228 | "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz",
229 | "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==",
230 | "dependencies": {
231 | "concat-stream": "^1.4.4",
232 | "errno": "^0.1.1",
233 | "fwd-stream": "^1.0.4",
234 | "level-blobs": "^0.1.7",
235 | "level-peek": "^1.0.6",
236 | "level-sublevel": "^5.2.0",
237 | "octal": "^1.0.0",
238 | "once": "^1.3.0",
239 | "xtend": "^2.2.0"
240 | }
241 | },
242 | "node_modules/level-fix-range": {
243 | "version": "1.0.2",
244 | "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz",
245 | "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ=="
246 | },
247 | "node_modules/level-hooks": {
248 | "version": "4.5.0",
249 | "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz",
250 | "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==",
251 | "dependencies": {
252 | "string-range": "~1.2"
253 | }
254 | },
255 | "node_modules/level-js": {
256 | "version": "2.2.4",
257 | "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz",
258 | "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==",
259 | "dependencies": {
260 | "abstract-leveldown": "~0.12.0",
261 | "idb-wrapper": "^1.5.0",
262 | "isbuffer": "~0.0.0",
263 | "ltgt": "^2.1.2",
264 | "typedarray-to-buffer": "~1.0.0",
265 | "xtend": "~2.1.2"
266 | }
267 | },
268 | "node_modules/level-js/node_modules/xtend": {
269 | "version": "2.1.2",
270 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
271 | "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==",
272 | "dependencies": {
273 | "object-keys": "~0.4.0"
274 | },
275 | "engines": {
276 | "node": ">=0.4"
277 | }
278 | },
279 | "node_modules/level-peek": {
280 | "version": "1.0.6",
281 | "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz",
282 | "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==",
283 | "dependencies": {
284 | "level-fix-range": "~1.0.2"
285 | }
286 | },
287 | "node_modules/level-sublevel": {
288 | "version": "5.2.3",
289 | "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz",
290 | "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==",
291 | "dependencies": {
292 | "level-fix-range": "2.0",
293 | "level-hooks": ">=4.4.0 <5",
294 | "string-range": "~1.2.1",
295 | "xtend": "~2.0.4"
296 | }
297 | },
298 | "node_modules/level-sublevel/node_modules/level-fix-range": {
299 | "version": "2.0.0",
300 | "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz",
301 | "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==",
302 | "dependencies": {
303 | "clone": "~0.1.9"
304 | }
305 | },
306 | "node_modules/level-sublevel/node_modules/object-keys": {
307 | "version": "0.2.0",
308 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz",
309 | "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==",
310 | "deprecated": "Please update to the latest object-keys",
311 | "dependencies": {
312 | "foreach": "~2.0.1",
313 | "indexof": "~0.0.1",
314 | "is": "~0.2.6"
315 | }
316 | },
317 | "node_modules/level-sublevel/node_modules/xtend": {
318 | "version": "2.0.6",
319 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz",
320 | "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==",
321 | "dependencies": {
322 | "is-object": "~0.1.2",
323 | "object-keys": "~0.2.0"
324 | },
325 | "engines": {
326 | "node": ">=0.4"
327 | }
328 | },
329 | "node_modules/levelup": {
330 | "version": "0.18.6",
331 | "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz",
332 | "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==",
333 | "dependencies": {
334 | "bl": "~0.8.1",
335 | "deferred-leveldown": "~0.2.0",
336 | "errno": "~0.1.1",
337 | "prr": "~0.0.0",
338 | "readable-stream": "~1.0.26",
339 | "semver": "~2.3.1",
340 | "xtend": "~3.0.0"
341 | }
342 | },
343 | "node_modules/levelup/node_modules/isarray": {
344 | "version": "0.0.1",
345 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
346 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
347 | },
348 | "node_modules/levelup/node_modules/prr": {
349 | "version": "0.0.0",
350 | "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz",
351 | "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ=="
352 | },
353 | "node_modules/levelup/node_modules/readable-stream": {
354 | "version": "1.0.34",
355 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
356 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
357 | "dependencies": {
358 | "core-util-is": "~1.0.0",
359 | "inherits": "~2.0.1",
360 | "isarray": "0.0.1",
361 | "string_decoder": "~0.10.x"
362 | }
363 | },
364 | "node_modules/levelup/node_modules/string_decoder": {
365 | "version": "0.10.31",
366 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
367 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
368 | },
369 | "node_modules/levelup/node_modules/xtend": {
370 | "version": "3.0.0",
371 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz",
372 | "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg==",
373 | "engines": {
374 | "node": ">=0.4"
375 | }
376 | },
377 | "node_modules/ltgt": {
378 | "version": "2.2.1",
379 | "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
380 | "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA=="
381 | },
382 | "node_modules/object-keys": {
383 | "version": "0.4.0",
384 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
385 | "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw=="
386 | },
387 | "node_modules/octal": {
388 | "version": "1.0.0",
389 | "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz",
390 | "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ=="
391 | },
392 | "node_modules/once": {
393 | "version": "1.4.0",
394 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
395 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
396 | "dependencies": {
397 | "wrappy": "1"
398 | }
399 | },
400 | "node_modules/process-nextick-args": {
401 | "version": "2.0.1",
402 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
403 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
404 | },
405 | "node_modules/prr": {
406 | "version": "1.0.1",
407 | "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
408 | "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw=="
409 | },
410 | "node_modules/readable-stream": {
411 | "version": "2.3.8",
412 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
413 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
414 | "dependencies": {
415 | "core-util-is": "~1.0.0",
416 | "inherits": "~2.0.3",
417 | "isarray": "~1.0.0",
418 | "process-nextick-args": "~2.0.0",
419 | "safe-buffer": "~5.1.1",
420 | "string_decoder": "~1.1.1",
421 | "util-deprecate": "~1.0.1"
422 | }
423 | },
424 | "node_modules/safe-buffer": {
425 | "version": "5.1.2",
426 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
427 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
428 | },
429 | "node_modules/semver": {
430 | "version": "2.3.2",
431 | "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz",
432 | "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==",
433 | "bin": {
434 | "semver": "bin/semver"
435 | }
436 | },
437 | "node_modules/string_decoder": {
438 | "version": "1.1.1",
439 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
440 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
441 | "dependencies": {
442 | "safe-buffer": "~5.1.0"
443 | }
444 | },
445 | "node_modules/string-range": {
446 | "version": "1.2.2",
447 | "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz",
448 | "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w=="
449 | },
450 | "node_modules/typedarray": {
451 | "version": "0.0.6",
452 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
453 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
454 | },
455 | "node_modules/typedarray-to-buffer": {
456 | "version": "1.0.4",
457 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz",
458 | "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw=="
459 | },
460 | "node_modules/util-deprecate": {
461 | "version": "1.0.2",
462 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
463 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
464 | },
465 | "node_modules/vditor": {
466 | "version": "3.9.8",
467 | "resolved": "https://registry.npmjs.org/vditor/-/vditor-3.9.8.tgz",
468 | "integrity": "sha512-Ls17n8GR9t6JOQqH6c0+UegOkuKT/qtMEUOi/a92OzocbsqNiit0YwtgTiqCE26u3go7ExHRJ2e83YJT2AHfxw==",
469 | "dependencies": {
470 | "diff-match-patch": "^1.0.5"
471 | },
472 | "funding": {
473 | "url": "https://ld246.com/sponsor"
474 | }
475 | },
476 | "node_modules/wrappy": {
477 | "version": "1.0.2",
478 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
479 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
480 | },
481 | "node_modules/xtend": {
482 | "version": "2.2.0",
483 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz",
484 | "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==",
485 | "engines": {
486 | "node": ">=0.4"
487 | }
488 | }
489 | },
490 | "dependencies": {
491 | "abstract-leveldown": {
492 | "version": "0.12.4",
493 | "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz",
494 | "integrity": "sha512-TOod9d5RDExo6STLMGa+04HGkl+TlMfbDnTyN93/ETJ9DpQ0DaYLqcMZlbXvdc4W3vVo1Qrl+WhSp8zvDsJ+jA==",
495 | "requires": {
496 | "xtend": "~3.0.0"
497 | },
498 | "dependencies": {
499 | "xtend": {
500 | "version": "3.0.0",
501 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz",
502 | "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg=="
503 | }
504 | }
505 | },
506 | "bl": {
507 | "version": "0.8.2",
508 | "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz",
509 | "integrity": "sha512-pfqikmByp+lifZCS0p6j6KreV6kNU6Apzpm2nKOk+94cZb/jvle55+JxWiByUQ0Wo/+XnDXEy5MxxKMb6r0VIw==",
510 | "requires": {
511 | "readable-stream": "~1.0.26"
512 | },
513 | "dependencies": {
514 | "isarray": {
515 | "version": "0.0.1",
516 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
517 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
518 | },
519 | "readable-stream": {
520 | "version": "1.0.34",
521 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
522 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
523 | "requires": {
524 | "core-util-is": "~1.0.0",
525 | "inherits": "~2.0.1",
526 | "isarray": "0.0.1",
527 | "string_decoder": "~0.10.x"
528 | }
529 | },
530 | "string_decoder": {
531 | "version": "0.10.31",
532 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
533 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
534 | }
535 | }
536 | },
537 | "browserify-fs": {
538 | "version": "1.0.0",
539 | "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz",
540 | "integrity": "sha512-8LqHRPuAEKvyTX34R6tsw4bO2ro6j9DmlYBhiYWHRM26Zv2cBw1fJOU0NeUQ0RkXkPn/PFBjhA0dm4AgaBurTg==",
541 | "requires": {
542 | "level-filesystem": "^1.0.1",
543 | "level-js": "^2.1.3",
544 | "levelup": "^0.18.2"
545 | }
546 | },
547 | "buffer-from": {
548 | "version": "1.1.2",
549 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
550 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
551 | },
552 | "clone": {
553 | "version": "0.1.19",
554 | "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz",
555 | "integrity": "sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw=="
556 | },
557 | "concat-stream": {
558 | "version": "1.6.2",
559 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
560 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
561 | "requires": {
562 | "buffer-from": "^1.0.0",
563 | "inherits": "^2.0.3",
564 | "readable-stream": "^2.2.2",
565 | "typedarray": "^0.0.6"
566 | }
567 | },
568 | "core-util-is": {
569 | "version": "1.0.3",
570 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
571 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
572 | },
573 | "deferred-leveldown": {
574 | "version": "0.2.0",
575 | "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz",
576 | "integrity": "sha512-+WCbb4+ez/SZ77Sdy1iadagFiVzMB89IKOBhglgnUkVxOxRWmmFsz8UDSNWh4Rhq+3wr/vMFlYj+rdEwWUDdng==",
577 | "requires": {
578 | "abstract-leveldown": "~0.12.1"
579 | }
580 | },
581 | "diff-match-patch": {
582 | "version": "1.0.5",
583 | "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz",
584 | "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw=="
585 | },
586 | "errno": {
587 | "version": "0.1.8",
588 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
589 | "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
590 | "requires": {
591 | "prr": "~1.0.1"
592 | }
593 | },
594 | "foreach": {
595 | "version": "2.0.6",
596 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz",
597 | "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg=="
598 | },
599 | "fwd-stream": {
600 | "version": "1.0.4",
601 | "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz",
602 | "integrity": "sha512-q2qaK2B38W07wfPSQDKMiKOD5Nzv2XyuvQlrmh1q0pxyHNanKHq8lwQ6n9zHucAwA5EbzRJKEgds2orn88rYTg==",
603 | "requires": {
604 | "readable-stream": "~1.0.26-4"
605 | },
606 | "dependencies": {
607 | "isarray": {
608 | "version": "0.0.1",
609 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
610 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
611 | },
612 | "readable-stream": {
613 | "version": "1.0.34",
614 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
615 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
616 | "requires": {
617 | "core-util-is": "~1.0.0",
618 | "inherits": "~2.0.1",
619 | "isarray": "0.0.1",
620 | "string_decoder": "~0.10.x"
621 | }
622 | },
623 | "string_decoder": {
624 | "version": "0.10.31",
625 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
626 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
627 | }
628 | }
629 | },
630 | "idb-wrapper": {
631 | "version": "1.7.2",
632 | "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz",
633 | "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg=="
634 | },
635 | "indexof": {
636 | "version": "0.0.1",
637 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
638 | "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg=="
639 | },
640 | "inherits": {
641 | "version": "2.0.4",
642 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
643 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
644 | },
645 | "is": {
646 | "version": "0.2.7",
647 | "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz",
648 | "integrity": "sha512-ajQCouIvkcSnl2iRdK70Jug9mohIHVX9uKpoWnl115ov0R5mzBvRrXxrnHbsA+8AdwCwc/sfw7HXmd4I5EJBdQ=="
649 | },
650 | "is-object": {
651 | "version": "0.1.2",
652 | "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz",
653 | "integrity": "sha512-GkfZZlIZtpkFrqyAXPQSRBMsaHAw+CgoKe2HXAkjd/sfoI9+hS8PT4wg2rJxdQyUKr7N2vHJbg7/jQtE5l5vBQ=="
654 | },
655 | "isarray": {
656 | "version": "1.0.0",
657 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
658 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
659 | },
660 | "isbuffer": {
661 | "version": "0.0.0",
662 | "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz",
663 | "integrity": "sha512-xU+NoHp+YtKQkaM2HsQchYn0sltxMxew0HavMfHbjnucBoTSGbw745tL+Z7QBANleWM1eEQMenEpi174mIeS4g=="
664 | },
665 | "level-blobs": {
666 | "version": "0.1.7",
667 | "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz",
668 | "integrity": "sha512-n0iYYCGozLd36m/Pzm206+brIgXP8mxPZazZ6ZvgKr+8YwOZ8/PPpYC5zMUu2qFygRN8RO6WC/HH3XWMW7RMVg==",
669 | "requires": {
670 | "level-peek": "1.0.6",
671 | "once": "^1.3.0",
672 | "readable-stream": "^1.0.26-4"
673 | },
674 | "dependencies": {
675 | "isarray": {
676 | "version": "0.0.1",
677 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
678 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
679 | },
680 | "readable-stream": {
681 | "version": "1.1.14",
682 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
683 | "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
684 | "requires": {
685 | "core-util-is": "~1.0.0",
686 | "inherits": "~2.0.1",
687 | "isarray": "0.0.1",
688 | "string_decoder": "~0.10.x"
689 | }
690 | },
691 | "string_decoder": {
692 | "version": "0.10.31",
693 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
694 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
695 | }
696 | }
697 | },
698 | "level-filesystem": {
699 | "version": "1.2.0",
700 | "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz",
701 | "integrity": "sha512-PhXDuCNYpngpxp3jwMT9AYBMgOvB6zxj3DeuIywNKmZqFj2djj9XfT2XDVslfqmo0Ip79cAd3SBy3FsfOZPJ1g==",
702 | "requires": {
703 | "concat-stream": "^1.4.4",
704 | "errno": "^0.1.1",
705 | "fwd-stream": "^1.0.4",
706 | "level-blobs": "^0.1.7",
707 | "level-peek": "^1.0.6",
708 | "level-sublevel": "^5.2.0",
709 | "octal": "^1.0.0",
710 | "once": "^1.3.0",
711 | "xtend": "^2.2.0"
712 | }
713 | },
714 | "level-fix-range": {
715 | "version": "1.0.2",
716 | "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz",
717 | "integrity": "sha512-9llaVn6uqBiSlBP+wKiIEoBa01FwEISFgHSZiyec2S0KpyLUkGR4afW/FCZ/X8y+QJvzS0u4PGOlZDdh1/1avQ=="
718 | },
719 | "level-hooks": {
720 | "version": "4.5.0",
721 | "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz",
722 | "integrity": "sha512-fxLNny/vL/G4PnkLhWsbHnEaRi+A/k8r5EH/M77npZwYL62RHi2fV0S824z3QdpAk6VTgisJwIRywzBHLK4ZVA==",
723 | "requires": {
724 | "string-range": "~1.2"
725 | }
726 | },
727 | "level-js": {
728 | "version": "2.2.4",
729 | "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz",
730 | "integrity": "sha512-lZtjt4ZwHE00UMC1vAb271p9qzg8vKlnDeXfIesH3zL0KxhHRDjClQLGLWhyR0nK4XARnd4wc/9eD1ffd4PshQ==",
731 | "requires": {
732 | "abstract-leveldown": "~0.12.0",
733 | "idb-wrapper": "^1.5.0",
734 | "isbuffer": "~0.0.0",
735 | "ltgt": "^2.1.2",
736 | "typedarray-to-buffer": "~1.0.0",
737 | "xtend": "~2.1.2"
738 | },
739 | "dependencies": {
740 | "xtend": {
741 | "version": "2.1.2",
742 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
743 | "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==",
744 | "requires": {
745 | "object-keys": "~0.4.0"
746 | }
747 | }
748 | }
749 | },
750 | "level-peek": {
751 | "version": "1.0.6",
752 | "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz",
753 | "integrity": "sha512-TKEzH5TxROTjQxWMczt9sizVgnmJ4F3hotBI48xCTYvOKd/4gA/uY0XjKkhJFo6BMic8Tqjf6jFMLWeg3MAbqQ==",
754 | "requires": {
755 | "level-fix-range": "~1.0.2"
756 | }
757 | },
758 | "level-sublevel": {
759 | "version": "5.2.3",
760 | "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz",
761 | "integrity": "sha512-tO8jrFp+QZYrxx/Gnmjawuh1UBiifpvKNAcm4KCogesWr1Nm2+ckARitf+Oo7xg4OHqMW76eAqQ204BoIlscjA==",
762 | "requires": {
763 | "level-fix-range": "2.0",
764 | "level-hooks": ">=4.4.0 <5",
765 | "string-range": "~1.2.1",
766 | "xtend": "~2.0.4"
767 | },
768 | "dependencies": {
769 | "level-fix-range": {
770 | "version": "2.0.0",
771 | "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz",
772 | "integrity": "sha512-WrLfGWgwWbYPrHsYzJau+5+te89dUbENBg3/lsxOs4p2tYOhCHjbgXxBAj4DFqp3k/XBwitcRXoCh8RoCogASA==",
773 | "requires": {
774 | "clone": "~0.1.9"
775 | }
776 | },
777 | "object-keys": {
778 | "version": "0.2.0",
779 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz",
780 | "integrity": "sha512-XODjdR2pBh/1qrjPcbSeSgEtKbYo7LqYNq64/TPuCf7j9SfDD3i21yatKoIy39yIWNvVM59iutfQQpCv1RfFzA==",
781 | "requires": {
782 | "foreach": "~2.0.1",
783 | "indexof": "~0.0.1",
784 | "is": "~0.2.6"
785 | }
786 | },
787 | "xtend": {
788 | "version": "2.0.6",
789 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz",
790 | "integrity": "sha512-fOZg4ECOlrMl+A6Msr7EIFcON1L26mb4NY5rurSkOex/TWhazOrg6eXD/B0XkuiYcYhQDWLXzQxLMVJ7LXwokg==",
791 | "requires": {
792 | "is-object": "~0.1.2",
793 | "object-keys": "~0.2.0"
794 | }
795 | }
796 | }
797 | },
798 | "levelup": {
799 | "version": "0.18.6",
800 | "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz",
801 | "integrity": "sha512-uB0auyRqIVXx+hrpIUtol4VAPhLRcnxcOsd2i2m6rbFIDarO5dnrupLOStYYpEcu8ZT087Z9HEuYw1wjr6RL6Q==",
802 | "requires": {
803 | "bl": "~0.8.1",
804 | "deferred-leveldown": "~0.2.0",
805 | "errno": "~0.1.1",
806 | "prr": "~0.0.0",
807 | "readable-stream": "~1.0.26",
808 | "semver": "~2.3.1",
809 | "xtend": "~3.0.0"
810 | },
811 | "dependencies": {
812 | "isarray": {
813 | "version": "0.0.1",
814 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
815 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
816 | },
817 | "prr": {
818 | "version": "0.0.0",
819 | "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz",
820 | "integrity": "sha512-LmUECmrW7RVj6mDWKjTXfKug7TFGdiz9P18HMcO4RHL+RW7MCOGNvpj5j47Rnp6ne6r4fZ2VzyUWEpKbg+tsjQ=="
821 | },
822 | "readable-stream": {
823 | "version": "1.0.34",
824 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
825 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
826 | "requires": {
827 | "core-util-is": "~1.0.0",
828 | "inherits": "~2.0.1",
829 | "isarray": "0.0.1",
830 | "string_decoder": "~0.10.x"
831 | }
832 | },
833 | "string_decoder": {
834 | "version": "0.10.31",
835 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
836 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="
837 | },
838 | "xtend": {
839 | "version": "3.0.0",
840 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz",
841 | "integrity": "sha512-sp/sT9OALMjRW1fKDlPeuSZlDQpkqReA0pyJukniWbTGoEKefHxhGJynE3PNhUMlcM8qWIjPwecwCw4LArS5Eg=="
842 | }
843 | }
844 | },
845 | "ltgt": {
846 | "version": "2.2.1",
847 | "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
848 | "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA=="
849 | },
850 | "object-keys": {
851 | "version": "0.4.0",
852 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
853 | "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw=="
854 | },
855 | "octal": {
856 | "version": "1.0.0",
857 | "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz",
858 | "integrity": "sha512-nnda7W8d+A3vEIY+UrDQzzboPf1vhs4JYVhff5CDkq9QNoZY7Xrxeo/htox37j9dZf7yNHevZzqtejWgy1vCqQ=="
859 | },
860 | "once": {
861 | "version": "1.4.0",
862 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
863 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
864 | "requires": {
865 | "wrappy": "1"
866 | }
867 | },
868 | "process-nextick-args": {
869 | "version": "2.0.1",
870 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
871 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
872 | },
873 | "prr": {
874 | "version": "1.0.1",
875 | "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
876 | "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw=="
877 | },
878 | "readable-stream": {
879 | "version": "2.3.8",
880 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
881 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
882 | "requires": {
883 | "core-util-is": "~1.0.0",
884 | "inherits": "~2.0.3",
885 | "isarray": "~1.0.0",
886 | "process-nextick-args": "~2.0.0",
887 | "safe-buffer": "~5.1.1",
888 | "string_decoder": "~1.1.1",
889 | "util-deprecate": "~1.0.1"
890 | }
891 | },
892 | "safe-buffer": {
893 | "version": "5.1.2",
894 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
895 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
896 | },
897 | "semver": {
898 | "version": "2.3.2",
899 | "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz",
900 | "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA=="
901 | },
902 | "string_decoder": {
903 | "version": "1.1.1",
904 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
905 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
906 | "requires": {
907 | "safe-buffer": "~5.1.0"
908 | }
909 | },
910 | "string-range": {
911 | "version": "1.2.2",
912 | "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz",
913 | "integrity": "sha512-tYft6IFi8SjplJpxCUxyqisD3b+R2CSkomrtJYCkvuf1KuCAWgz7YXt4O0jip7efpfCemwHEzTEAO8EuOYgh3w=="
914 | },
915 | "typedarray": {
916 | "version": "0.0.6",
917 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
918 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
919 | },
920 | "typedarray-to-buffer": {
921 | "version": "1.0.4",
922 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz",
923 | "integrity": "sha512-vjMKrfSoUDN8/Vnqitw2FmstOfuJ73G6CrSEKnf11A6RmasVxHqfeBcnTb6RsL4pTMuV5Zsv9IiHRphMZyckUw=="
924 | },
925 | "util-deprecate": {
926 | "version": "1.0.2",
927 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
928 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
929 | },
930 | "vditor": {
931 | "version": "3.9.8",
932 | "resolved": "https://registry.npmjs.org/vditor/-/vditor-3.9.8.tgz",
933 | "integrity": "sha512-Ls17n8GR9t6JOQqH6c0+UegOkuKT/qtMEUOi/a92OzocbsqNiit0YwtgTiqCE26u3go7ExHRJ2e83YJT2AHfxw==",
934 | "requires": {
935 | "diff-match-patch": "^1.0.5"
936 | }
937 | },
938 | "wrappy": {
939 | "version": "1.0.2",
940 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
941 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
942 | },
943 | "xtend": {
944 | "version": "2.2.0",
945 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz",
946 | "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw=="
947 | }
948 | }
949 | }
950 |
--------------------------------------------------------------------------------
/app/src/main/assets/editor/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "browserify-fs": "^1.0.0",
4 | "vditor": "^3.9.8"
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/app/src/main/assets/editor/test.md:
--------------------------------------------------------------------------------
1 | 111
--------------------------------------------------------------------------------
/app/src/main/ic_launcher-playstore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/ic_launcher-playstore.png
--------------------------------------------------------------------------------
/app/src/main/java/com/farplace/nonote/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.farplace.nonote;
2 |
3 | import android.content.Context;
4 | import android.graphics.Color;
5 | import android.os.Build;
6 | import android.os.Bundle;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.Window;
10 | import android.view.WindowManager;
11 | import android.widget.TextView;
12 |
13 | import androidx.annotation.NonNull;
14 | import androidx.appcompat.app.AppCompatActivity;
15 | import androidx.core.content.ContextCompat;
16 | import androidx.navigation.ui.AppBarConfiguration;
17 |
18 | import com.farplace.nonote.data.MainData;
19 | import com.farplace.nonote.databinding.ActivityMainBinding;
20 | import com.farplace.nonote.util.FileUtil;
21 | import com.farplace.nonote.util.NoteUtil;
22 | import com.farplace.nonote.util.StringUtil;
23 | import com.farplace.nonote.view.FileCreateDialog;
24 | import com.farplace.nonote.view.MenuPopupView;
25 | import com.farplace.nonote.view.VditorWebView;
26 | import com.google.android.material.button.MaterialButton;
27 |
28 | import org.apache.commons.text.StringEscapeUtils;
29 |
30 | import java.io.File;
31 | import java.util.List;
32 |
33 | public class MainActivity extends AppCompatActivity {
34 |
35 | private AppBarConfiguration appBarConfiguration;
36 | private ActivityMainBinding binding;
37 | private VditorWebView vditorWebView;
38 | private String currentFile;
39 |
40 | @Override
41 | protected void onCreate(Bundle savedInstanceState) {
42 | super.onCreate(savedInstanceState);
43 |
44 | binding = ActivityMainBinding.inflate(getLayoutInflater());
45 | setContentView(binding.getRoot());
46 |
47 | setSupportActionBar(binding.toolbar);
48 | transparentNavBar(getWindow());
49 | transparentStatusBar(getWindow());
50 | initView();
51 | initData();
52 | }
53 |
54 | private void initData() {
55 | new MainData().init(this);
56 | String current_File = getSharedPreferences("DATA", MODE_PRIVATE).getString("currentFile", null);
57 | if (current_File != null) {
58 | this.currentFile = current_File;
59 | getSupportActionBar().setTitle(NoteUtil.getNoteName(new File(currentFile).getName()));
60 | }
61 | }
62 |
63 | private void initView() {
64 | vditorWebView = findViewById(R.id.vditor_view);
65 | MaterialButton add_bu = findViewById(R.id.add_button);
66 | add_bu.setOnClickListener(v -> {
67 | MenuPopupView menuPopupView = new MenuPopupView(this, v);
68 | LayoutInflater layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
69 | List notes = new NoteUtil().getNotes();
70 | View.OnClickListener file_click = v12 -> {
71 | openNote(MainData.workFolder + File.separator + "note" + File.separator + v12.getTag());
72 | };
73 | for (File note : notes) {
74 | String name = note.getName();
75 | TextView note_name_text = (TextView) layoutInflater.inflate(R.layout.popup_menu_item_view, null, false);
76 | note_name_text.setTag(note.getName());
77 | note_name_text.setOnClickListener(file_click);
78 | note_name_text.setText(NoteUtil.getNoteName(name));
79 | menuPopupView.addItemView(note_name_text);
80 | }
81 | TextView add_text = (TextView) layoutInflater.inflate(R.layout.popup_menu_item_view, null, false);
82 | add_text.setCompoundDrawablesWithIntrinsicBounds(R.drawable.round_add_24, 0, 0, 0);
83 | menuPopupView.addItemView(add_text);
84 | add_text.setOnClickListener(v1 -> {
85 | showFileCreate();
86 | });
87 | menuPopupView.showMenuWindow(-100, 0);
88 | });
89 | View.OnClickListener helper_click = v -> {
90 | vditorWebView.insertValue(((String) v.getTag()), true);
91 | };
92 | int[] helper_button = new int[]{R.id.tag_insert_bu, R.id.format_insert_bu, R.id.space_insert_bu, R.id.tab_insert_bu};
93 | for (int bu_id : helper_button) {
94 | MaterialButton help_bu = findViewById(bu_id);
95 | help_bu.setOnClickListener(helper_click);
96 | }
97 | MaterialButton save_bu = findViewById(R.id.save_bu);
98 | save_bu.setOnClickListener(v -> {
99 | if (currentFile == null) {
100 | showFileCreate();
101 | } else {
102 | vditorWebView.getValue(value -> {
103 | value = value.substring(1);
104 | value = value.substring(0, value.length() - 1);
105 | value = StringEscapeUtils.unescapeJava(value);
106 | FileUtil.saveTextFile(currentFile, value);
107 | });
108 |
109 | }
110 | });
111 | }
112 |
113 | private void showFileCreate() {
114 |
115 | FileCreateDialog fileCreateDialog = new FileCreateDialog(MainActivity.this, new FileCreateDialog.CreateCallBack() {
116 | @Override
117 | public void onCreate(String path) {
118 |
119 | }
120 | });
121 |
122 | fileCreateDialog.show();
123 | fileCreateDialog.initView();
124 | }
125 |
126 | public void transparentStatusBar(@NonNull final Window window) {
127 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
128 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
129 | int option = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
130 | int vis = window.getDecorView().getSystemUiVisibility();
131 | window.getDecorView().setSystemUiVisibility(option | vis);
132 | window.setStatusBarColor(Color.TRANSPARENT);
133 | window.setNavigationBarColor(ContextCompat.getColor(this, R.color.linearStartColor));
134 | }
135 |
136 | public void transparentNavBar(@NonNull final Window window) {
137 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
138 | window.setNavigationBarContrastEnforced(false);
139 | }
140 | window.setNavigationBarColor(Color.TRANSPARENT);
141 | View decorView = window.getDecorView();
142 | int vis = decorView.getSystemUiVisibility();
143 | int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
144 | decorView.setSystemUiVisibility(vis | option);
145 | }
146 |
147 | private void openNote(String noteFile) {
148 | String content = FileUtil.loadTextFile(noteFile);
149 | content = StringUtil.escape(content);
150 | String noteName = NoteUtil.getNoteName(new File(noteFile).getName());
151 | getSupportActionBar().setTitle(noteName);
152 | getSharedPreferences("DATA", MODE_PRIVATE).edit().putString("currentFile", noteFile).apply();
153 | vditorWebView.setValue(content);
154 | }
155 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/farplace/nonote/data/MainData.java:
--------------------------------------------------------------------------------
1 | package com.farplace.nonote.data;
2 |
3 | import android.content.Context;
4 |
5 | public class MainData {
6 | public static String workFolder;
7 |
8 | public void init(Context context) {
9 | workFolder = context.getExternalFilesDir(null).toString();
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/app/src/main/java/com/farplace/nonote/util/FileUtil.java:
--------------------------------------------------------------------------------
1 | package com.farplace.nonote.util;
2 |
3 | import java.io.BufferedReader;
4 | import java.io.BufferedWriter;
5 | import java.io.File;
6 | import java.io.FileReader;
7 | import java.io.FileWriter;
8 | import java.io.IOException;
9 |
10 | public class FileUtil {
11 | public static String loadTextFile(String path) {
12 | try {
13 | BufferedReader bufferedReader = new BufferedReader(new FileReader(path));
14 | String line = "";
15 | StringBuilder stringBuilder = new StringBuilder(line);
16 | while ((line = bufferedReader.readLine()) != null) {
17 | stringBuilder.append(line).append("\n");
18 | }
19 | bufferedReader.close();
20 | return stringBuilder.toString();
21 | } catch (IOException e) {
22 | return "";
23 | }
24 | }
25 |
26 | public static void saveTextFile(String path, String content) {
27 | try {
28 | File parentFile = new File(path).getParentFile();
29 | if (parentFile == null || !parentFile.exists()) parentFile.mkdirs();
30 |
31 | BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(path));
32 | bufferedWriter.write(content);
33 | bufferedWriter.flush();
34 | bufferedWriter.close();
35 | } catch (IOException e) {
36 | //ignore
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/app/src/main/java/com/farplace/nonote/util/NoteUtil.java:
--------------------------------------------------------------------------------
1 | package com.farplace.nonote.util;
2 |
3 | import com.farplace.nonote.data.MainData;
4 |
5 | import java.io.File;
6 | import java.util.ArrayList;
7 | import java.util.Arrays;
8 | import java.util.List;
9 |
10 | public class NoteUtil {
11 | public List getNotes() {
12 | File file = new File(MainData.workFolder + File.separator + "note");
13 | File[] notes = file.listFiles();
14 | if (notes != null) {
15 | return Arrays.asList(notes);
16 | } else {
17 | return new ArrayList<>();
18 | }
19 | }
20 |
21 | public static String getNoteName(String fileName) {
22 | if (fileName.contains(".")) {
23 | return fileName.substring(0, fileName.lastIndexOf("."));
24 | } else {
25 | return fileName;
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/app/src/main/java/com/farplace/nonote/util/StringUtil.java:
--------------------------------------------------------------------------------
1 | package com.farplace.nonote.util;
2 |
3 | import org.apache.commons.text.StringEscapeUtils;
4 |
5 | public class StringUtil {
6 | public static String escape(String content) {
7 |
8 | return StringEscapeUtils.escapeJava(content);
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/app/src/main/java/com/farplace/nonote/view/FileCreateDialog.java:
--------------------------------------------------------------------------------
1 | package com.farplace.nonote.view;
2 |
3 | import android.content.Context;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.widget.Toast;
7 |
8 | import androidx.annotation.NonNull;
9 | import androidx.appcompat.app.AlertDialog;
10 |
11 | import com.farplace.nonote.R;
12 | import com.farplace.nonote.data.MainData;
13 | import com.farplace.nonote.util.FileUtil;
14 | import com.google.android.material.button.MaterialButton;
15 | import com.google.android.material.dialog.MaterialAlertDialogBuilder;
16 | import com.google.android.material.textfield.TextInputEditText;
17 |
18 | import java.io.File;
19 |
20 | public class FileCreateDialog extends MaterialAlertDialogBuilder {
21 |
22 | View view;
23 | public CreateCallBack createCallBack;
24 | AlertDialog myDialog;
25 |
26 | public interface CreateCallBack {
27 | void onCreate(String path);
28 | }
29 |
30 | public FileCreateDialog(@NonNull Context context, CreateCallBack createCallBack) {
31 | super(context);
32 | LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
33 | view = layoutInflater.inflate(R.layout.file_create_dialog_layout, null, false);
34 | setView(view);
35 | this.createCallBack = createCallBack;
36 | }
37 |
38 | public void initView() {
39 | TextInputEditText fileName = view.findViewById(R.id.file_name_input);
40 | MaterialButton add = view.findViewById(R.id.add_button);
41 | add.setOnClickListener(v -> {
42 | String name = fileName.getText().toString();
43 | if (name.length() == 0) {
44 | fileName.setError(getContext().getString(R.string.empty_error));
45 | } else {
46 | String filePath = MainData.workFolder + File.separator + "note" + File.separator + name + ".md";
47 | if (new File(filePath).exists()) {
48 | Toast.makeText(getContext(), R.string.file_exist, Toast.LENGTH_SHORT).show();
49 | createCallBack.onCreate(null);
50 | } else {
51 | FileUtil.saveTextFile(filePath, "test");
52 | createCallBack.onCreate(filePath);
53 | }
54 | myDialog.dismiss();
55 | }
56 | });
57 | }
58 |
59 | @NonNull
60 | @Override
61 | public AlertDialog create() {
62 | myDialog = super.create();
63 | return myDialog;
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/app/src/main/java/com/farplace/nonote/view/MenuPopupView.java:
--------------------------------------------------------------------------------
1 | package com.farplace.nonote.view;
2 |
3 | import android.animation.ObjectAnimator;
4 | import android.content.Context;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.widget.FrameLayout;
8 | import android.widget.LinearLayout;
9 | import android.widget.PopupWindow;
10 |
11 | import com.farplace.nonote.R;
12 |
13 | public class MenuPopupView extends PopupWindow {
14 | View view;
15 | Context context;
16 | LinearLayout main_linear;
17 | View anchorView;
18 | int minWidth;
19 |
20 | public MenuPopupView(Context context) {
21 | super(((LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.popup_menu_layout, null)
22 | , LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, true);
23 | view = getContentView();
24 | view.setTranslationZ(10);
25 | this.context = context;
26 | initView();
27 | }
28 |
29 | public MenuPopupView(Context context, View anchorView) {
30 | this(context);
31 | this.anchorView = anchorView;
32 |
33 | }
34 |
35 | private void initView() {
36 | main_linear = view.findViewById(R.id.main_linear);
37 | if (minWidth != 0) {
38 | setLinearWidth(minWidth);
39 | }
40 | }
41 |
42 | public void setMinWidth(int width) {
43 | this.minWidth = width;
44 | }
45 |
46 | private void setLinearWidth(int width) {
47 | FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) main_linear.getLayoutParams();
48 | layoutParams.width = width;
49 | main_linear.setLayoutParams(layoutParams);
50 | main_linear.requestLayout();
51 | }
52 |
53 | public void showMenuWindow(int offsetX, int offsetY) {
54 | // int ox = 0;
55 | // int oy = 0;
56 | // Log.e("TEST===>>",anchorView.getY()+"");
57 | // if (anchorView.getY() > 1000) {
58 | // oy = anchorView.getHeight() + 300;
59 | // }
60 |
61 | showAsDropDown(anchorView,offsetX,offsetY);
62 | if (anchorView != null) {
63 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(anchorView, "translationZ", 0, -15);
64 | objectAnimator.start();
65 | ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(view, "elevation", 0, 5);
66 | objectAnimator1.start();
67 | }
68 | setOnDismissListener(() -> {
69 | if (anchorView != null) {
70 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(anchorView, "translationZ", anchorView.getTranslationZ(), 0);
71 | objectAnimator.start();
72 | ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(view, "elevation", 5, 0);
73 | objectAnimator1.start();
74 | }
75 | });
76 |
77 | }
78 |
79 | public void addItemView(View view) {
80 | main_linear.addView(view);
81 | }
82 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/farplace/nonote/view/VditorWebView.java:
--------------------------------------------------------------------------------
1 | package com.farplace.nonote.view;
2 |
3 | import android.annotation.SuppressLint;
4 | import android.content.Context;
5 | import android.util.AttributeSet;
6 | import android.util.Log;
7 | import android.webkit.ValueCallback;
8 | import android.webkit.WebChromeClient;
9 | import android.webkit.WebSettings;
10 | import android.webkit.WebView;
11 | import android.webkit.WebViewClient;
12 |
13 | public class VditorWebView extends WebView {
14 | private static final String TAG = "----AME-----";
15 | private static final String SETUP_HTML = "file:///android_asset/editor/index.html";
16 | private OnGetHtmlResult onGetHtmlResult;
17 | private OnHtml2mdResult onHtml2mdResult;
18 |
19 |
20 | public VditorWebView(Context context) {
21 | this(context, null);
22 | }
23 |
24 | public VditorWebView(Context context, AttributeSet attrs) {
25 | this(context, attrs, android.R.attr.webViewStyle);
26 | }
27 |
28 | @SuppressLint("SetJavaScriptEnabled")
29 | public VditorWebView(Context context, AttributeSet attrs, int defStyleAttr) {
30 | super(context, attrs, defStyleAttr);
31 | Log.e(TAG, "-------");
32 | setVerticalScrollBarEnabled(false);
33 | setHorizontalScrollBarEnabled(false);
34 | WebSettings settings = getSettings();
35 | settings.setJavaScriptEnabled(true);
36 | settings.setCacheMode(WebSettings.LOAD_DEFAULT);
37 | settings.setDomStorageEnabled(true);
38 | settings.setDatabaseEnabled(true);
39 | settings.setAllowFileAccessFromFileURLs(true);
40 | setWebChromeClient(new WebChromeClient());
41 | setWebViewClient(new WebViewClient());
42 | // addJavascriptInterface(new JsInterface(this),"ameBridge");
43 | loadUrl(SETUP_HTML);
44 |
45 | }
46 |
47 | //获取编辑器内容
48 | public void getValue(ValueCallback callback) {
49 | evaluateJavascript("javascript:ameGetValue()", callback);
50 | }
51 |
52 | //在焦点处插入内容
53 | public void insertValue(String value, boolean render) {
54 | String script = "javascript:ameInsertValue('" + value + "','"+render+"')";
55 | evaluateJavascript(script, null);
56 | }
57 |
58 | //聚焦到编辑器
59 | public void focus() {
60 | evaluateJavascript("javascript:ameFocus()", null);
61 | }
62 |
63 | //失焦
64 | public void blur(){
65 | evaluateJavascript("javascript:ameBlur()", null);
66 | }
67 |
68 | //禁用
69 | public void disable(){
70 | evaluateJavascript("javascript:ameDisabled()", null);
71 | }
72 |
73 | //解除编辑器禁用
74 | public void enable(){
75 | evaluateJavascript("javascript:ameEnable()", null);
76 | }
77 |
78 | //选中从 start 开始到 end 结束的字符串
79 | public void setSelection(int start,int end){
80 | String script = "javascript:ameSetSelection(" + start + ","+end+")";
81 | evaluateJavascript(script,null);
82 | }
83 |
84 | //返回选中的字符串
85 | public void getSelection(ValueCallback callback){
86 | evaluateJavascript("javascript:ameGetSelection()", callback);
87 | }
88 |
89 | //设置编辑器内容
90 | public void setValue(String value){
91 | String script = "javascript:ameSetValue('" + value + "')";
92 | evaluateJavascript(script,null);
93 | }
94 |
95 | //获取焦点位置
96 | public void getCursorPosition(ValueCallback callback){
97 | evaluateJavascript("javascript:ameGetCursorPosition()", callback);
98 | }
99 |
100 | //删除选中内容
101 | public void deleteValue(){
102 | evaluateJavascript("javascript:ameDeleteValue()", null);
103 | }
104 |
105 | //更新选中内容
106 | public void updateValue(String value){
107 | String script = "javascript:ameUpdateValue('" + value + "')";
108 | evaluateJavascript(script,null);
109 | }
110 |
111 | //清除缓存
112 | public void clearCache(){
113 | evaluateJavascript("javascript:ameClearCache()", null);
114 | }
115 |
116 | //禁用缓存
117 | public void disabledCache(){
118 | evaluateJavascript("javascript:ameDisabledCache()", null);
119 | }
120 |
121 | //启用缓存
122 | public void enableCache(){
123 | evaluateJavascript("javascript:ameEnableCache()", null);
124 | }
125 |
126 | //设置预览模式
127 | public void setPreviewMode(PreviewMode previewMode){
128 | Log.e(TAG, "setPreviewMode: "+ previewMode);
129 | evaluateJavascript("javascript:ameSetPreviewMode('"+ previewMode+"')", null);
130 | }
131 |
132 | //设置模式
133 | public void setMode(Mode mode){
134 | evaluateJavascript("javascript:ameSetWysiwyg('"+ mode+"')", null);
135 | }
136 |
137 | //消息提示
138 | public void tip(String text,int time){
139 | String script = "javascript:ameTip('" + text + "',"+time+")";
140 | evaluateJavascript(script,null);
141 | }
142 |
143 | public void undo(){
144 | evaluateJavascript("javascript:ameUndo()", null);
145 | }
146 |
147 | public void redo(){
148 | evaluateJavascript("javascript:ameRedo()", null);
149 | }
150 |
151 |
152 | public void setBold(){
153 | evaluateJavascript("javascript:ameSetBold()", null);
154 | }
155 |
156 | public void setH1(){
157 | evaluateJavascript("javascript:ameSetH1()", null);
158 | }
159 |
160 | public void setH2(){
161 | evaluateJavascript("javascript:ameSetH2()", null);
162 | }
163 |
164 | public void setH3(){
165 | evaluateJavascript("javascript:ameSetH3()", null);
166 | }
167 |
168 | public void setH4(){
169 | evaluateJavascript("javascript:ameSetH4()", null);
170 | }
171 |
172 | public void setH5(){
173 | evaluateJavascript("javascript:ameSetH5()", null);
174 | }
175 |
176 | public void setH6(){
177 | evaluateJavascript("javascript:ameSetH6()", null);
178 | }
179 |
180 | public void setItalic(){
181 | evaluateJavascript("javascript:ameSetItalic()", null);
182 | }
183 |
184 | public void setStrike(){
185 | evaluateJavascript("javascript:ameSetStrike()", null);
186 | }
187 |
188 | public void setLine(){
189 | evaluateJavascript("javascript:ameSetLine()", null);
190 | }
191 |
192 | public void setQuote(){
193 | evaluateJavascript("javascript:ameSetQuote()", null);
194 | }
195 |
196 | public void setList(){
197 | evaluateJavascript("javascript:ameSetList()", null);
198 | }
199 |
200 | public void setOrdered(){
201 | evaluateJavascript("javascript:ameSetOrdered()", null);
202 | }
203 |
204 | public void setCheck(){
205 | evaluateJavascript("javascript:ameSetCheck()", null);
206 | }
207 |
208 | public void setCode(){
209 | evaluateJavascript("javascript:ameSetCode()", null);
210 | }
211 |
212 | public void setInlineCode(){
213 | evaluateJavascript("javascript:ameSetInlineCode()", null);
214 | }
215 |
216 | public void setLink(){
217 | evaluateJavascript("javascript:ameSetLink()", null);
218 | }
219 |
220 | public void setTable(){
221 | evaluateJavascript("javascript:ameSetTable()", null);
222 | }
223 |
224 | public void getHtml(ValueCallback callback){
225 | evaluateJavascript("javascript:ameGetHtml()", callback);
226 | }
227 |
228 | public void html2md(String value,ValueCallback callback){
229 | String script = "javascript:ameHtml2md('" + value + "')";
230 | evaluateJavascript(script,callback);
231 | }
232 |
233 |
234 | @Deprecated
235 | public void getHtml(OnGetHtmlResult onGetHtmlResult){
236 | this.onGetHtmlResult = onGetHtmlResult;
237 | evaluateJavascript("javascript:ameGetHtml()", null);
238 | }
239 |
240 | @Deprecated
241 | public void html2md(String value,OnHtml2mdResult onHtml2mdResult){
242 | this.onHtml2mdResult = onHtml2mdResult;
243 | String script = "javascript:ameHtml2md('" + value + "')";
244 | evaluateJavascript(script,null);
245 | }
246 |
247 | // public void setOnGetHtmlResult(OnGetHtmlResult onGetHtmlResult){
248 | // this.onGetHtmlResult = onGetHtmlResult;
249 | // }
250 |
251 | @Deprecated
252 | protected void getHtmlFinished(String result){
253 | if(this.onGetHtmlResult!=null){
254 | this.onGetHtmlResult.onGetHtmlResult(result);
255 | }
256 | }
257 |
258 | @Deprecated
259 | protected void html2mdFinished(String result){
260 | if(this.onHtml2mdResult!=null){
261 | this.onHtml2mdResult.onHtml2mdResult(result);
262 | }
263 | }
264 |
265 | @Deprecated
266 | public interface OnGetHtmlResult{
267 | void onGetHtmlResult(String result);
268 | }
269 |
270 | @Deprecated
271 | public interface OnHtml2mdResult{
272 | void onHtml2mdResult(String result);
273 | }
274 |
275 | public enum PreviewMode {
276 | both,editor,preview
277 | }
278 |
279 | public enum Mode {
280 | wysiwyg,markdown
281 | }
282 |
283 |
284 |
285 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable/button_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
6 |
7 |
10 |
11 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/button_click_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/button_press_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | -
4 |
5 |
6 |
7 |
10 |
11 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/dot_line_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
10 |
15 |
20 |
25 |
30 |
35 |
40 |
45 |
50 |
55 |
60 |
65 |
70 |
75 |
80 |
85 |
90 |
95 |
100 |
105 |
110 |
115 |
120 |
125 |
130 |
135 |
140 |
145 |
150 |
155 |
160 |
165 |
170 |
171 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/linear_background_color.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/linear_second_background_color.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/drawable/logo.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/outline_save_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/round_add_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/round_attach_money_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/round_keyboard_return_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/round_keyboard_tab_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/round_space_bar_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/round_tag_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
19 |
20 |
21 |
36 |
37 |
46 |
47 |
56 |
57 |
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
16 |
17 |
18 |
19 |
20 |
28 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/file_create_dialog_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
16 |
22 |
26 |
31 |
32 |
33 |
43 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/help_button_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
9 |
14 |
15 |
20 |
21 |
29 |
30 |
38 |
39 |
47 |
48 |
56 |
57 |
58 |
68 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/popup_menu_item_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/popup_menu_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_main.xml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_background.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-hdpi/ic_launcher_background.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_background.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-mdpi/ic_launcher_background.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_background.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xhdpi/ic_launcher_background.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/app/src/main/res/values-night/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #546E7A
4 | #61D4FF
5 | #003545
6 | #004D63
7 | #BBE9FF
8 | #B4CAD5
9 | #1E333C
10 | #354A53
11 | #CFE6F2
12 | #C5C3EA
13 | #2E2D4D
14 | #444364
15 | #E2DFFF
16 | #FFB4AB
17 | #93000A
18 | #690005
19 | #FFDAD6
20 | #191C1E
21 | #E1E3E4
22 | #191C1E
23 | #E1E3E4
24 | #40484C
25 | #C0C8CC
26 | #8A9296
27 | #191C1E
28 | #E1E3E4
29 | #006782
30 | #000000
31 | #61D4FF
32 | #40484C
33 | #000000
34 |
35 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #546E7A
4 | #006782
5 | #FFFFFF
6 | #BBE9FF
7 | #001F29
8 | #4C616B
9 | #FFFFFF
10 | #CFE6F2
11 | #081E27
12 | #5C5B7D
13 | #FFFFFF
14 | #E2DFFF
15 | #191837
16 | #BA1A1A
17 | #FFDAD6
18 | #FFFFFF
19 | #410002
20 | #FBFCFE
21 | #191C1E
22 | #FBFCFE
23 | #191C1E
24 | #DCE4E9
25 | #40484C
26 | #70787D
27 | #EFF1F3
28 | #2E3132
29 | #61D4FF
30 | #000000
31 | #006782
32 | #C0C8CC
33 | #000000
34 | #61D4FF
35 | #003545
36 | #004D63
37 | #BBE9FF
38 | #B4CAD5
39 | #1E333C
40 | #354A53
41 | #CFE6F2
42 | #C5C3EA
43 | #2E2D4D
44 | #444364
45 | #E2DFFF
46 | #FFB4AB
47 | #93000A
48 | #690005
49 | #FFDAD6
50 | #191C1E
51 | #E1E3E4
52 | #191C1E
53 | #E1E3E4
54 | #40484C
55 | #C0C8CC
56 | #8A9296
57 | #191C1E
58 | #E1E3E4
59 | #006782
60 | #000000
61 | #61D4FF
62 | #40484C
63 | #000000
64 | #ffffff
65 | #4E342E
66 | #4E342E
67 | #5D4037
68 | #FFF59D
69 | #FFF9C4
70 | #4E342E
71 | #795548
72 | #212121
73 | #5D4037
74 | #3E2723
75 | #FDD835
76 |
77 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 | 16dp
3 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | NoNote
3 | Settings
4 |
5 | First Fragment
6 | Second Fragment
7 | Next
8 | Previous
9 |
10 | 命名笔记
11 | 不能为空
12 | 文件存在
13 |
--------------------------------------------------------------------------------
/app/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
32 |
33 |
34 |
35 |
39 |
40 |
49 |
50 |
53 |
54 |
57 |
58 |
59 |
63 |
64 |
65 |
66 |
67 |
68 |
71 |
--------------------------------------------------------------------------------
/app/src/test/java/com/farplace/nonote/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.farplace.nonote;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * @see Testing documentation
11 | */
12 | public class ExampleUnitTest {
13 | @Test
14 | public void addition_isCorrect() {
15 | assertEquals(4, 2 + 2);
16 | }
17 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 | plugins {
3 | id 'com.android.application' version '8.1.1' apply false
4 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app's APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Enables namespacing of each library's R class so that its R class includes only the
19 | # resources declared in the library itself and none from the library's dependencies,
20 | # thereby reducing the size of the R class for that library
21 | android.nonTransitiveRClass=true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Feb 02 21:08:41 HKT 2024
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | #
4 | # Copyright 2015 the original author or authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | ##
21 | ## Gradle start up script for UN*X
22 | ##
23 | ##############################################################################
24 |
25 | # Attempt to set APP_HOME
26 | # Resolve links: $0 may be a link
27 | PRG="$0"
28 | # Need this for relative symlinks.
29 | while [ -h "$PRG" ] ; do
30 | ls=`ls -ld "$PRG"`
31 | link=`expr "$ls" : '.*-> \(.*\)$'`
32 | if expr "$link" : '/.*' > /dev/null; then
33 | PRG="$link"
34 | else
35 | PRG=`dirname "$PRG"`"/$link"
36 | fi
37 | done
38 | SAVED="`pwd`"
39 | cd "`dirname \"$PRG\"`/" >/dev/null
40 | APP_HOME="`pwd -P`"
41 | cd "$SAVED" >/dev/null
42 |
43 | APP_NAME="Gradle"
44 | APP_BASE_NAME=`basename "$0"`
45 |
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48 |
49 | # Use the maximum available, or set MAX_FD != -1 to use that value.
50 | MAX_FD="maximum"
51 |
52 | warn () {
53 | echo "$*"
54 | }
55 |
56 | die () {
57 | echo
58 | echo "$*"
59 | echo
60 | exit 1
61 | }
62 |
63 | # OS specific support (must be 'true' or 'false').
64 | cygwin=false
65 | msys=false
66 | darwin=false
67 | nonstop=false
68 | case "`uname`" in
69 | CYGWIN* )
70 | cygwin=true
71 | ;;
72 | Darwin* )
73 | darwin=true
74 | ;;
75 | MINGW* )
76 | msys=true
77 | ;;
78 | NONSTOP* )
79 | nonstop=true
80 | ;;
81 | esac
82 |
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84 |
85 |
86 | # Determine the Java command to use to start the JVM.
87 | if [ -n "$JAVA_HOME" ] ; then
88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
89 | # IBM's JDK on AIX uses strange locations for the executables
90 | JAVACMD="$JAVA_HOME/jre/sh/java"
91 | else
92 | JAVACMD="$JAVA_HOME/bin/java"
93 | fi
94 | if [ ! -x "$JAVACMD" ] ; then
95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
96 |
97 | Please set the JAVA_HOME variable in your environment to match the
98 | location of your Java installation."
99 | fi
100 | else
101 | JAVACMD="java"
102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
103 |
104 | Please set the JAVA_HOME variable in your environment to match the
105 | location of your Java installation."
106 | fi
107 |
108 | # Increase the maximum file descriptors if we can.
109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
110 | MAX_FD_LIMIT=`ulimit -H -n`
111 | if [ $? -eq 0 ] ; then
112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
113 | MAX_FD="$MAX_FD_LIMIT"
114 | fi
115 | ulimit -n $MAX_FD
116 | if [ $? -ne 0 ] ; then
117 | warn "Could not set maximum file descriptor limit: $MAX_FD"
118 | fi
119 | else
120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
121 | fi
122 | fi
123 |
124 | # For Darwin, add options to specify how the application appears in the dock
125 | if $darwin; then
126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
127 | fi
128 |
129 | # For Cygwin or MSYS, switch paths to Windows format before running java
130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
133 |
134 | JAVACMD=`cygpath --unix "$JAVACMD"`
135 |
136 | # We build the pattern for arguments to be converted via cygpath
137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
138 | SEP=""
139 | for dir in $ROOTDIRSRAW ; do
140 | ROOTDIRS="$ROOTDIRS$SEP$dir"
141 | SEP="|"
142 | done
143 | OURCYGPATTERN="(^($ROOTDIRS))"
144 | # Add a user-defined pattern to the cygpath arguments
145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
147 | fi
148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
149 | i=0
150 | for arg in "$@" ; do
151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
153 |
154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
156 | else
157 | eval `echo args$i`="\"$arg\""
158 | fi
159 | i=`expr $i + 1`
160 | done
161 | case $i in
162 | 0) set -- ;;
163 | 1) set -- "$args0" ;;
164 | 2) set -- "$args0" "$args1" ;;
165 | 3) set -- "$args0" "$args1" "$args2" ;;
166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
172 | esac
173 | fi
174 |
175 | # Escape application args
176 | save () {
177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
178 | echo " "
179 | }
180 | APP_ARGS=`save "$@"`
181 |
182 | # Collect all arguments for the java command, following the shell quoting and substitution rules
183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
184 |
185 | exec "$JAVACMD" "$@"
186 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34 |
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37 |
38 | @rem Find java.exe
39 | if defined JAVA_HOME goto findJavaFromJavaHome
40 |
41 | set JAVA_EXE=java.exe
42 | %JAVA_EXE% -version >NUL 2>&1
43 | if "%ERRORLEVEL%" == "0" goto execute
44 |
45 | echo.
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47 | echo.
48 | echo Please set the JAVA_HOME variable in your environment to match the
49 | echo location of your Java installation.
50 |
51 | goto fail
52 |
53 | :findJavaFromJavaHome
54 | set JAVA_HOME=%JAVA_HOME:"=%
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56 |
57 | if exist "%JAVA_EXE%" goto execute
58 |
59 | echo.
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61 | echo.
62 | echo Please set the JAVA_HOME variable in your environment to match the
63 | echo location of your Java installation.
64 |
65 | goto fail
66 |
67 | :execute
68 | @rem Setup the command line
69 |
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71 |
72 |
73 | @rem Execute Gradle
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/pics/fore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/pics/fore.png
--------------------------------------------------------------------------------
/pics/sc.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/pics/sc.jpg
--------------------------------------------------------------------------------
/pics/sc1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/pics/sc1.jpg
--------------------------------------------------------------------------------
/pics/sc2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/TSIOJeft/NoNote_Android/e6c1dc7359aae031bc2a5f1bd13816e9fdcc7b0a/pics/sc2.jpg
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | google()
4 | mavenCentral()
5 | gradlePluginPortal()
6 | }
7 | }
8 | dependencyResolutionManagement {
9 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
10 | repositories {
11 | google()
12 | mavenCentral()
13 | }
14 | }
15 |
16 | rootProject.name = "NoNote"
17 | include ':app'
18 |
--------------------------------------------------------------------------------