Giter VIP home page Giter VIP logo

inkstone's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

inkstone's Issues

Feature request: Revisit all words

I added 5 words and after I reviewed them it said that I'm done for today.

It gave me two options:

  • Add 5 more cards
  • Edit schedule settings

There was no way to revisit all words one more time. It would be cool to revisit all the learned words and let the often wrong written ones pop up more frequently.

Rebuild desktop binaries

The Electron-based desktop binaries are quite slow and finicky to build. As a result, they're a few (currently, two) versions behind the Android app. This issue is a reminder to rebuild those sometime.

How to add new characters

Do you mind adding an example on how to introduce a new character that is not foundd in the dictionary? For example 齣.

Consider making the stroke orders of 「夾」 more natural

In v0.1.4, inkstone decides that「夾」's stroke order should be the middle「大」first and then two「人」s on the side.
This follows the general stroke order rule of writing the middle stroke first and then write the side strokes.

However, writing「夾」this way may accidentally leave too little room for the two「人」s on the side. Making the character look squashed. That's why many stroke order references decide to write「一」,「从」first, then the middle「人」
Quote from Wikipedia:

例如「夾」、「爽」兩字,若先寫中間(「大」部件),再寫左右(「从」部件、「㸚」部件),字體容易變得寬扁。因此正常的筆順,皆先寫「一」,再寫「从」或「㸚」部件,最後才寫「人」。

References that write「一」,「从」first, then the middle「人」:
筆順字典
萌典
漢字書き順辞典
香港小學學習字詞表

Unify forms of 鬼 in traditional mode

The 鬼 radical's traditional form has the bottom 丿 separate from the top 丨. However, the traditional form is not applied universally. In traditional-only characters like 醜, 鬼 has the traditional form. In shared characters like 愧, it still uses the simplified form.

Export learned words

Im still use an older version (0.0.8) and I'm half into learning the HSK 6 vocab. I got a new phone recently and wonder if there is a way to transfer my current status of already learned words to my new phone so I don't have to 'relearn' them. I didn't found any feature for that. Is there a way to manually do this?

Thanks in advance.

FTBFS - introduced recently, probably external deps

[17:03:02] git:(master) d33tah@d33tah-pc:/home/d33tah/workspace/src/inkstone/.build/android/project/cordova(0) > ./build --release                                                    
ANDROID_HOME=/home/d33tah/Android/Sdk
JAVA_HOME=/usr/lib/jvm/java-8-oracle
null
embedded
org.xwalk:xwalk_core_library:17+
:cdvCreateAssetManifest
:preBuild
:preArmv7ReleaseBuild
:checkArmv7ReleaseManifest
:preArmv7DebugBuild
:preX86DebugBuild
:preX86ReleaseBuild
:CordovaLib:preBuild UP-TO-DATE
:CordovaLib:preDebugBuild UP-TO-DATE
:CordovaLib:compileDebugNdk UP-TO-DATE
:CordovaLib:compileLint
:CordovaLib:copyDebugLint UP-TO-DATE
:CordovaLib:mergeDebugProguardFiles UP-TO-DATE
:CordovaLib:packageDebugRenderscript UP-TO-DATE
:CordovaLib:checkDebugManifest
:CordovaLib:prepareDebugDependencies
:CordovaLib:compileDebugRenderscript UP-TO-DATE
:CordovaLib:generateDebugResValues UP-TO-DATE
:CordovaLib:generateDebugResources UP-TO-DATE
:CordovaLib:packageDebugResources UP-TO-DATE
:CordovaLib:compileDebugAidl UP-TO-DATE
:CordovaLib:generateDebugBuildConfig UP-TO-DATE
:CordovaLib:generateDebugAssets UP-TO-DATE
:CordovaLib:mergeDebugAssets UP-TO-DATE
:CordovaLib:processDebugManifest UP-TO-DATE
:CordovaLib:processDebugResources UP-TO-DATE
:CordovaLib:generateDebugSources UP-TO-DATE
:CordovaLib:compileDebugJavaWithJavac UP-TO-DATE
:CordovaLib:processDebugJavaRes UP-TO-DATE
:CordovaLib:transformResourcesWithMergeJavaResForDebug UP-TO-DATE
:CordovaLib:transformClassesAndResourcesWithSyncLibJarsForDebug UP-TO-DATE
:CordovaLib:mergeDebugJniLibFolders UP-TO-DATE
:CordovaLib:transformNative_libsWithMergeJniLibsForDebug UP-TO-DATE
:CordovaLib:transformNative_libsWithSyncJniLibsForDebug UP-TO-DATE
:CordovaLib:bundleDebug UP-TO-DATE
:CordovaLib:preReleaseBuild UP-TO-DATE
:CordovaLib:compileReleaseNdk UP-TO-DATE
:CordovaLib:copyReleaseLint UP-TO-DATE
:CordovaLib:mergeReleaseProguardFiles UP-TO-DATE
:CordovaLib:packageReleaseRenderscript UP-TO-DATE
:CordovaLib:checkReleaseManifest
:CordovaLib:prepareReleaseDependencies
:CordovaLib:compileReleaseRenderscript UP-TO-DATE
:CordovaLib:generateReleaseResValues UP-TO-DATE
:CordovaLib:generateReleaseResources UP-TO-DATE
:CordovaLib:packageReleaseResources UP-TO-DATE
:CordovaLib:compileReleaseAidl UP-TO-DATE
:CordovaLib:generateReleaseBuildConfig UP-TO-DATE
:CordovaLib:generateReleaseAssets UP-TO-DATE
:CordovaLib:mergeReleaseAssets UP-TO-DATE
:CordovaLib:processReleaseManifest UP-TO-DATE
:CordovaLib:processReleaseResources UP-TO-DATE
:CordovaLib:generateReleaseSources UP-TO-DATE
:CordovaLib:compileReleaseJavaWithJavac UP-TO-DATE
:CordovaLib:processReleaseJavaRes UP-TO-DATE
:CordovaLib:transformResourcesWithMergeJavaResForRelease UP-TO-DATE
:CordovaLib:transformClassesAndResourcesWithSyncLibJarsForRelease UP-TO-DATE
:CordovaLib:mergeReleaseJniLibFolders UP-TO-DATE
:CordovaLib:transformNative_libsWithMergeJniLibsForRelease UP-TO-DATE
:CordovaLib:transformNative_libsWithSyncJniLibsForRelease UP-TO-DATE
:CordovaLib:bundleRelease UP-TO-DATE
:prepareComAndroidSupportSupportCompat2600Alpha1Library UP-TO-DATE
:prepareComAndroidSupportSupportCoreUi2600Alpha1Library UP-TO-DATE
:prepareComAndroidSupportSupportCoreUtils2600Alpha1Library UP-TO-DATE
:prepareComAndroidSupportSupportFragment2600Alpha1Library UP-TO-DATE
:prepareComAndroidSupportSupportMediaCompat2600Alpha1Library UP-TO-DATE
:prepareComAndroidSupportSupportV42600Alpha1Library UP-TO-DATE
:prepareOrgXwalkXwalk_core_library174644810Library UP-TO-DATE
:prepareProjectCordovaLibUnspecifiedReleaseLibrary UP-TO-DATE
:prepareArmv7ReleaseDependencies
:compileArmv7ReleaseAidl UP-TO-DATE
:compileArmv7ReleaseRenderscript UP-TO-DATE
:generateArmv7ReleaseBuildConfig UP-TO-DATE
:generateArmv7ReleaseAssets UP-TO-DATE
:mergeArmv7ReleaseAssets
:createXwalkCommandLineFileArmv7Release
:generateArmv7ReleaseResValues UP-TO-DATE
:generateArmv7ReleaseResources UP-TO-DATE
:mergeArmv7ReleaseResources UP-TO-DATE
:processArmv7ReleaseManifest UP-TO-DATE
:processArmv7ReleaseResources
:generateArmv7ReleaseSources
:compileArmv7ReleaseJavaWithJavac UP-TO-DATE
:compileArmv7ReleaseNdk UP-TO-DATE
:compileArmv7ReleaseSources UP-TO-DATE
:lintVitalArmv7Release[Fatal Error] :3:214: The value of attribute "name" associated with an element type "item" must not contain the '<' character.
Could not read /home/d33tah/Android/Sdk/platform-tools/api/annotations.zip
java.io.IOException: Could not parse XML from android/accounts/annotations.xml
        at com.android.tools.lint.ExternalAnnotationRepository$AnnotationsDatabase.initializePackage(ExternalAnnotationRepository.java:658)
        at com.android.tools.lint.ExternalAnnotationRepository$AnnotationsDatabase.initializeFromJar(ExternalAnnotationRepository.java:601)
        at com.android.tools.lint.ExternalAnnotationRepository$AnnotationsDatabase.<init>(ExternalAnnotationRepository.java:402)
        at com.android.tools.lint.ExternalAnnotationRepository.getDatabase(ExternalAnnotationRepository.java:214)
        at com.android.tools.lint.ExternalAnnotationRepository.create(ExternalAnnotationRepository.java:153)
        at com.android.tools.lint.ExternalAnnotationRepository.get(ExternalAnnotationRepository.java:134)
        at com.android.tools.lint.EcjParser$EcjResolvedMethod.getAnnotations(EcjParser.java:1167)
        at com.android.tools.lint.checks.SupportAnnotationDetector$CallVisitor.checkCall(SupportAnnotationDetector.java:1603)
        at com.android.tools.lint.checks.SupportAnnotationDetector$CallVisitor.visitMethodInvocation(SupportAnnotationDetector.java:1574)
        at com.android.tools.lint.client.api.JavaVisitor$DispatchVisitor.visitMethodInvocation(JavaVisitor.java:997)
        at com.android.tools.lint.client.api.JavaVisitor$DelegatingJavaVisitor.visitMethodInvocation(JavaVisitor.java:1365)
        at lombok.ast.MethodInvocation.accept(MethodInvocation.java:114)
        at lombok.ast.BinaryExpression.accept(BinaryExpression.java:130)
        at lombok.ast.VariableDefinitionEntry.accept(VariableDefinitionEntry.java:105)
        at lombok.ast.VariableDefinition.accept(VariableDefinition.java:155)
        at lombok.ast.VariableDeclaration.accept(VariableDeclaration.java:103)
        at lombok.ast.NormalTypeBody.accept(NormalTypeBody.java:57)
        at lombok.ast.ClassDeclaration.accept(ClassDeclaration.java:239)
        at lombok.ast.CompilationUnit.accept(CompilationUnit.java:83)
        at com.android.tools.lint.client.api.JavaVisitor.visitFile(JavaVisitor.java:272)
        at com.android.tools.lint.client.api.LintDriver.checkJava(LintDriver.java:1527)
        at com.android.tools.lint.client.api.LintDriver.runFileDetectors(LintDriver.java:1061)
        at com.android.tools.lint.client.api.LintDriver.checkProject(LintDriver.java:906)
        at com.android.tools.lint.client.api.LintDriver.analyze(LintDriver.java:435)
        at com.android.tools.lint.client.api.LintDriver.analyze(LintDriver.java:376)
        at com.android.tools.lint.LintCliClient.run(LintCliClient.java:128)
        at com.android.build.gradle.internal.LintGradleClient.run(LintGradleClient.java:116)
        at com.android.build.gradle.internal.LintGradleClient$run.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
        at com.android.build.gradle.tasks.Lint.runLint(Lint.groovy:196)
        at com.android.build.gradle.tasks.Lint.this$6$runLint(Lint.groovy)
        at com.android.build.gradle.tasks.Lint$this$6$runLint$4.callCurrent(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:149)
        at com.android.build.gradle.tasks.Lint.lintSingleVariant(Lint.groovy:171)
        at com.android.build.gradle.tasks.Lint$lintSingleVariant$3.callCurrent(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:49)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:133)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:145)
        at com.android.build.gradle.tasks.Lint.lint(Lint.groovy:73)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:63)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:218)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:211)
        at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:200)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:579)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:562)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:305)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
        at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
        at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)
        at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106)
        at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:80)
        at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)
        at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:36)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:47)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:35)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:24)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
        at org.gradle.launcher.daemon.server.exec.StartStopIfBuildAndStop.execute(StartStopIfBuildAndStop.java:33)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:71)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:69)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:69)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:70)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:34)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
        at org.gradle.launcher.daemon.server.exec.DaemonHygieneAction.execute(DaemonHygieneAction.java:39)
        at org.gradle.launcher.daemon.server.exec.DaemonCommandExecution.proceed(DaemonCommandExecution.java:119)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:46)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)
        at org.gradle.internal.concurrent.DefaultExecutorFactory$StoppableExecutorImpl$1.run(DefaultExecutorFactory.java:64)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

:transformClassesWithDexForArmv7Release UP-TO-DATE
:mergeArmv7ReleaseJniLibFolders UP-TO-DATE
:transformNative_libsWithMergeJniLibsForArmv7Release UP-TO-DATE
:processArmv7ReleaseJavaRes UP-TO-DATE
:transformResourcesWithMergeJavaResForArmv7Release UP-TO-DATE
:packageArmv7Release
:assembleArmv7Release
:checkX86ReleaseManifest
:prepareX86ReleaseDependencies
:compileX86ReleaseAidl UP-TO-DATE
:compileX86ReleaseRenderscript UP-TO-DATE
:generateX86ReleaseBuildConfig UP-TO-DATE
:generateX86ReleaseAssets UP-TO-DATE
:mergeX86ReleaseAssets
:createXwalkCommandLineFileX86Release
:generateX86ReleaseResValues UP-TO-DATE
:generateX86ReleaseResources UP-TO-DATE
:mergeX86ReleaseResources UP-TO-DATE
:processX86ReleaseManifest UP-TO-DATE
:processX86ReleaseResources
:generateX86ReleaseSources
:compileX86ReleaseJavaWithJavac UP-TO-DATE
:compileX86ReleaseNdk UP-TO-DATE
:compileX86ReleaseSources UP-TO-DATE
:lintVitalX86Release
:transformClassesWithDexForX86Release UP-TO-DATE
:mergeX86ReleaseJniLibFolders UP-TO-DATE
:transformNative_libsWithMergeJniLibsForX86Release UP-TO-DATE
:processX86ReleaseJavaRes UP-TO-DATE
:transformResourcesWithMergeJavaResForX86Release UP-TO-DATE
:packageX86Release
:assembleX86Release
:assembleRelease
:cdvBuildRelease

BUILD SUCCESSFUL

Total time: 26.08 secs
Built the following apk(s): 

[17:03:33] git:(master) d33tah@d33tah-pc:/home/d33tah/workspace/src/inkstone/.build/android/project/cordova(0) > 

Direction of first stroke of「匕」under「老」appears inconsistent

Under traditional mode, direction of first stroke of「匕」under「老」appears inconsistent. Sometimes it is from left to right「一」, other times it is from right to left「丿」. I would recommend picking one of the stroke direction and stay consistent. It will be nice if it is also consistent with the direction in the standalone character「匕」.

"how it works" section in the readme

I would love even a short paragraph on how the app works in the readme. Usually handwriting recognition takes a lot of machine learning/statistical techniques, which is why they would usually require an internet connection. How did you manage to make a handwriting app that runs without an internet connection?

Feature Request: Ankidroid Integration

I have never seen such a great app for practicing the writing of multi character words.

If you can show me what to put in the Front, Styling, and Template fields I can play around with it and make it work well in anki. I am good at working with the anki templates, I can send you an example of my chinese deck if you want to see. As long as you can give me the coding and scripting for the templates as well as the .js file to save in the anki media folder, I can work this and I bet the results would reverberate through the entire Chinese studying anki community. Most folks just assume this is impossible I think, but would be incredibly excited to experience it.

I've tried to adapt the Matthias deck to work with multiple characters but the java just wasn't built for it and I'm no programmer. I did however manage to integrate it and make it look quite pretty on my cards. I just don't use it because so many of my cards use multiple characters.

feature suggestion: automatic leech blacklisting

A feature I really like in Anki is automatic leech suspension. When I fail a card a certain number of times that card is automatically taken out of circulation and I can use my time to study other cards that will likely be much easier to learn. Inkstone already has a blacklist feature, and it would be nice if it also had the ability to automatically blacklist leeches.

stroke order on 好 is incorrect

In your animation on adding handwriting shortcuts, you should the horizontal stroke on the 女 part of 好 comes last. Afaik, even in a shortcut, it should not be accepted usage to first write the horizontal stroke. But correct me if I'm wrong.

PS Will the shortcut also allow writing a squiggle for the 'fire'/'water' dots? I noticed Hanping Chinese which uses a handwriting recognition library is very good at recognizing such and other 'cursive' script.

「解」should have a different form in traditional mode

「解」is composed of 「角」,「刀」and「牛」. In traditional chinese, the middle vertical stroke of「角」should not go past the second horizontal stroke. I think we should use the traditional form of 「解」when the user is in traditional mode. The same appliedms to the standalone 「角」character.

/

/

Release for iPad

Hi, I just bought Inkstone on the AppStore and to my dismay it runs only in iPhone mode on the iPad meaning it takes about a 3rd of the screen rather than all of it.

「真」in traditional mode

「真」in traditional mode should not the same as the simplified. Please add the 「真」component found in「鎮」to remain consistent.

Xcode iOS build fails

System:
Mac OS 10.12.5
Xcode 8.3.2
Swift 3.1
Meteor 1.5

It worked fine to compile the code with meteor

meteor add-platform ios
meteor build .build --server localhost:3785

When I opened the Xcode project in .build/ios it said the Swift code need to be converted to the latest version. I confirmed and the code was converted automatically. After that I tried to compile it with Xcode and got a lot of compile errors:

inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleManager.swift:69:13: Initializer for conditional binding must have Optional type, not 'String'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleManager.swift:212:10: Initializer for conditional binding must have Optional type, not '() -> URL'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleManager.swift:267:65: Cannot force unwrap value of non-optional type 'String'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleManager.swift:303:97: Expression resolves to an unused function
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/WebAppLocalServer.swift:93:25: Value of type 'Int' has no member 'uintValue'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/WebAppLocalServer.swift:381:67: Value of optional type 'String?' not unwrapped; did you mean to use '!' or '?'?
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/WebAppLocalServer.swift:457:38: Cannot force unwrap value of non-optional type 'String'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/WebAppLocalServer.swift:490:50: Cannot force unwrap value of non-optional type 'String'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/Asset.swift:6:26: Cannot force unwrap value of non-optional type 'URL'
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleDownloader.swift:162:34: Cannot assign to property: 'URLComponents' is a 'let' constant
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleDownloader.swift:164:34: Cannot assign to property: 'URLComponents' is a 'let' constant
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/AssetBundleDownloader.swift:244:31: Value of type 'Error' has no member 'userInfo'
inkstone/.build/ios/project/Swift.Error:102:16: Did you mean '_userInfo'?
inkstone/.build/ios/project/Inkstone/Plugins/cordova-plugin-meteor-webapp/Utility.swift:80:11: 'getResourceValue(_:forKey:)' is unavailable: Use struct URLResourceValues and URL.setResourceValues(_:) instead
inkstone/.build/ios/project/Foundation.URL:251:17: 'getResourceValue(_:forKey:)' has been explicitly marked unavailable here

It seems to be a common issue with meteor. I'm just testing some suggested solutions.

feature suggestion: character metadata field for user defined mnemonics

I've previously used Heisig's "Remember the Hanzi" mnemonic system to study Chinese characters, and I found it to be a useful tool for remembering stubborn-to-learn characters. Inkstone already has a "Character Details" page (see screenshot below) that displays metadata for the characters you are currently studying. It would be nice if this metadata had another field for notes or mnemonics that could be edited by the user during a study session.

screenshot from 2018-11-03 12-19-04

Additional feature: character lookup

Very nice app! I like how it evaluates how good was the writing and helps you to memorize the correct order of each stroke.
I would suggest a character lookup as one additional feature. The field "For" really helps to visualize and remember each word. It would be great if we could review a word by searching it, as part of the process.

Desktop support

Would it be possible to add support for using Inkstone on the desktop? I tried running/building it for the browser, and it 95% worked already - there were mostly interface-rendering issues (and I had to enable "simulate touch events" mode).

Feature request: Navigate back to last card

When I completed a word and got it wrong I'd like to navigate back to write it one more time. Currently there is no back button that brings me back.

Keep up the good work!

Clear one character at a time rather than whole word

When writing multi-character words, the clear button clears all characters and there should be an option to only clear the current character.

For example, if I am writing a three character word and I make a mistake on the third character and I want to write it again. My only option is to clear the whole word.

Feature request: custom search of characters/phrases

While having custom word lists are great, users may ocassionaly encounter new characters/phrases not on their lists. Having a custom search for characters/phrases built into Inkstone can help users practice them. As a bonus, users can optionally add them to one of their lists to do more spaced practices.

Some ideas and feature request

Hi,

I've buy this app and thank you for develope it! I have some ideas after using it 1 day ago.

  1. Custom words list:
    Using offline it and allow upload custom words file is a good idea, but thinking I have a list of 100 words as example.
    The first time I want learn 100 words, but after many times, some words I learned, some is not. I only want to learn some words of them, so it is helpful if I can create custom words (choose some words from the file I upload).
    First, the app load the custom file I uploaded (can choose some files), list all words and have a checkbox to help me choose custom list from it.

  2. Favorite words list:
    This as type of custom words list above but I can mark the words when learning. It is useful!

  3. Translate "Rad":
    I want to translate "rad" when see word detail into my own language, this help me so much!

2019-01-27_134426

  1. Add new words anywhere:
    Imagining anytime you see a new word, you want to know it is and the way it writing. Although you can using another app to solve this. But it is wonderful if Inkstone can do this.
    First I have a square to draw and the app suggestion the true one (for the words I don't know it), or have a text input for type pinyin (if I know its pinyin). The words after that added to a list for learning.

  2. Add search function:
    I can search the words by character or pinyin, its fuction as a dictionary.

  3. Small improve:
    I think blacklist button is not necessary, replace it with "skip" (or next) button. Because If I can choose my list, so nothing is blacklist, I only want to skip this words to write the next one. Skip button saving time.

Change icon "search" to "info", the detail information of the word is truely a info icon.

  1. Help about edit custom list:
    Some newbie https://www.skishore.me/inkstone/docs/format.html will be confused when edit custom list. Which software you using to edit this file, I using Excel and save as Unicode Text but it add some quote (" ") characters.

Thank you so much!

Feature: Stats

It would be nice to have a stats page similar to what Anki has.
It would show you a pie chart of for example the following properties:
Total, Unseen, Correct, Wrong

I've been trying to add this myself but I'm completely new to Meteor and I'm having a difficult time figuring out how it works.

In the /client/model/vocabulary.js I figured out how to get the total number of words:

new Cursor(() => {}).count();

I tried to get all the failures like this:

new Cursor((entry) => entry[kIndices.failed]).count()

But this only returns the failures of the current 20 cards but not the previous ones

If you have any pointers for me on how I can achieve this, I would be very thankful!

Tell users clearly where backups are saved to

Hello, I changed my phone and I'd like to transfer the files to another phone, but I can't seem to find the directory where data is saved in to copy it.

Where should it normally be? In data/com.skishore... ?

Is there a better way to do that?

Add donation address

I just discovered your project and it seems to envolve to a serious and free Skritter alternative. That's so awesome! I'd love to see an iOS or web version of Inkstone. I read that you're lacking of an iPhone. So why not add some common donation options to your README (for example PayPal or some crypto currencies). I'm pretty sure I'm not the only one who likes to see this open source project flourish.

Could you confirm that I have rights to use "Inkstone" name and make a friendly fork?

Hi!

As we talked outside of Github, I'm trying to take over development of Inkstone and you approve it. Just so I have credibility and a proof there's no legal dispute, could you publicly confirm that I'm authorized to use the name Inkstone and continue the development of Inkstone under a separate repository, providing it free of charge under the same license, with no advertisements attached?

Enforce stroke order

There should be an option to enforce correct Stoke order. Right now, sometimes I put in an incorrect stroke that comes later.

Feature suggestion: Add new word button

There are days I'm only capable of learning 5 new words and there are days I'd like to learn more. There are also days I reach my word limit in the morning but still want to exercise some new words at night. To be more flexible I'd love to see the "write" view with a "+" button that adds a new word to my stack.

Add traditional character「潢」

Currently the traditional character「潢」is mapped to it's simplified counterpart「潢」. Please consider adding the traditional form.

Publish on F-Droid?

Hi! I love your app? Any chance you could put it in the F-Droid repository?

feature suggestion: undo button

I've been using this app every day to study, and it seems like I always accidentally incorrectly score a few words each day (usually scoring the words I actually know as failures). It would be nice if the erase button (circled in red below) turned into an undo button when the app initially shows you the next word so you could go back and rescore the previous word if you made a scoring mistake.

image png ed97534cf5b5236fc18f51932f621c8c

Stroke order of 「螞」is wrong

The first dot under the right「馬」radical is currently immediately after the left「虫」radical. It should be after the top half of the right「馬」radical.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.