├── .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 | ![](https://github.com/TSIOJeft/NoNote_Android/blob/main/pics/sc.jpg) 9 | ![](https://github.com/TSIOJeft/NoNote_Android/blob/main/pics/sc1.jpg) 10 | ![](https://github.com/TSIOJeft/NoNote_Android/blob/main/pics/sc2.jpg) 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 | 5 | 10 | -------------------------------------------------------------------------------- /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 | 39 | 40 | 49 | 50 | 53 | 54 | 57 | 58 | 59 | 63 | 64 | 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 | --------------------------------------------------------------------------------