Compare commits
17 Commits
connect-ka
...
pre-sqlite
| Author | SHA1 | Date | |
|---|---|---|---|
| 5ba64bbb46 | |||
| 67f46ccbc7 | |||
| d652fc0685 | |||
| 5d377aa668 | |||
| 46fb93efe3 | |||
| 936c669118 | |||
| c242d56f41 | |||
| edd3d7c9a9 | |||
| 7ad6540962 | |||
| 76061a42f1 | |||
| eaa5510942 | |||
| 8c7253fd93 | |||
| 2ca9988018 | |||
| 241ff1cab6 | |||
| 76f8cc6c86 | |||
| f6134c07a1 | |||
| a577af2667 |
BIN
.github/screenshots/draw_search.png
vendored
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
.github/screenshots/history.png
vendored
Normal file
|
After Width: | Height: | Size: 63 KiB |
BIN
.github/screenshots/kanji_result.png
vendored
Normal file
|
After Width: | Height: | Size: 212 KiB |
BIN
.github/screenshots/kanji_search.png
vendored
Normal file
|
After Width: | Height: | Size: 145 KiB |
BIN
.github/screenshots/radical_search.png
vendored
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
.github/screenshots/search.png
vendored
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
.github/screenshots/search_result.png
vendored
Normal file
|
After Width: | Height: | Size: 134 KiB |
22
.gitignore
vendored
@@ -22,6 +22,7 @@
|
||||
|
||||
# Flutter/Dart/Pub related
|
||||
**/doc/api/
|
||||
**/ios/Flutter/.last_build_id
|
||||
.dart_tool/
|
||||
.flutter-plugins
|
||||
.flutter-plugins-dependencies
|
||||
@@ -33,5 +34,22 @@
|
||||
# Web related
|
||||
lib/generated_plugin_registrant.dart
|
||||
|
||||
# Exceptions to above rules.
|
||||
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
|
||||
# Symbolication related
|
||||
app.*.symbols
|
||||
|
||||
# Obfuscation related
|
||||
app.*.map.json
|
||||
|
||||
# Android Studio will place build artifacts here
|
||||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
||||
|
||||
# -----------------------------
|
||||
|
||||
# Nix build result
|
||||
result
|
||||
|
||||
# The dev directory I'm using when moving files via adb
|
||||
android-data
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
# This file should be version controlled and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: 0b8abb4724aa590dd0f429683339b1e045a1594d
|
||||
revision: 7e9793dee1b85a243edd0e06cb1658e98b077561
|
||||
channel: stable
|
||||
|
||||
project_type: app
|
||||
|
||||
77
README.md
@@ -1,22 +1,77 @@
|
||||
[]()
|
||||
[![CircleCI Status][circleci-badge]][circleci]
|
||||
|
||||
<p align="center">
|
||||
<img src="assets/images/logo/logo_icon_transparent_green.png" width=100/>
|
||||
|
||||
</p>
|
||||
|
||||
# Jisho Study tool
|
||||
A japanese dictionary with features for making studying the language easier. For the time being, it's mostly a frontend for [Jisho.org][jisho]. It is still in beta, and will stay in beta for some time. Its main data source is the [unofficial_jisho_api][unofficial_jisho_api].
|
||||
|
||||
A japanese dictionary with features for making studying the language easier.
|
||||
## Screenshots
|
||||
|
||||
<p align="center">
|
||||
<img src=".github/screenshots/search.png" width="250"/>
|
||||
<img src=".github/screenshots/kanji_search.png" width="250"/>
|
||||
<img src=".github/screenshots/radical_search.png" width="250"/>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img src=".github/screenshots/search_result.png" width="250"/>
|
||||
<img src=".github/screenshots/kanji_result.png" width="250"/>
|
||||
<img src=".github/screenshots/draw_search.png" width="250"/>
|
||||
</p>
|
||||
|
||||
[See all screenshots][screenshots]
|
||||
|
||||
## Search
|
||||
|
||||
Standard search using Jishos API. This returns standard Jisho search results, including what you'd find if you searched through the search bar without any modifiers
|
||||
Search using the Jisho API.
|
||||
This returns the same Jisho search results you would find by default search without any modifiers (like `#kanji` or `#adverbs`).
|
||||
There is also an `Extensive search` mode which does another request to fetch detailed information, at the expense of keeping the user waiting.
|
||||
This detailed information might include example sentences, audio, and other supplementary information.
|
||||
|
||||
## Kanji Search
|
||||
|
||||
Jisho kanji search just like using the #kanji modifier in the jisho search bar. This will give you detailed information about things like drawing order, radicals, different kinds of ranks and statistics and some onyomi and kunyomi example words.
|
||||
There's several ways to search for kanji.
|
||||
You can search for kanji manually, by typing it in (or by choosing from a large copy-pasted message).
|
||||
You can also search for kanji by trying to draw it.
|
||||
There's also grade based search, and radical based search.
|
||||
The data returned usually includes the kanjis radical, meanings, pronounciations, stroke order, some statistics and example usage.
|
||||
|
||||
## Upcoming Features
|
||||
## Development environment
|
||||
|
||||
- [ ] Different kinds of kanji input like radicals and grade based lists
|
||||
- [ ] Favorites, history and custom lists
|
||||
- [ ] Anki export
|
||||
- [ ] Memo cards
|
||||
- [ ] Cloud sync
|
||||
- [ ] Dark theme
|
||||
To set up a development environment, I would suggest heading over to [flutter.dev][flutter-get-started] and following the installation instructions.
|
||||
|
||||
Apart from that, there is no other tools being used at the current time.
|
||||
|
||||
## Aim
|
||||
|
||||
Why am I making this application, when there's thousands of japanese dictionary apps out there?
|
||||
|
||||
I've spent quite a lot of time studying this language.
|
||||
During study sessions, most of my time would go towards looking for information.
|
||||
I would often come across new kanji for which I don't know the stroke order, so I ended up fighting with the handwriting recognizers.
|
||||
Sometimes, I was looking at a word where I had some translations for the word, but no idea how to actually use it.
|
||||
Finding words that were worthwile to learn could also be hard, and I've probably memorized a bunch of uncommon words that people don't really use.
|
||||
I also frequently went to places without access to the internet.
|
||||
|
||||
To resolve these problems, I've tried several study aiding apps.
|
||||
Most were good in some ways, but there wasn't really any app that filled all my requirements.
|
||||
Jisho.org however, provides most of my needs.
|
||||
There was a lot of Jisho.org apps, but most were missing a lot of the features that were critical to me.
|
||||
That is the main problem this app is trying to solve.
|
||||
I'm aiming to make the app I wished I had while studying.
|
||||
|
||||
## Thanks to
|
||||
|
||||
- Kim, Miwa and Andrew, who did the absolutely incredible work of making Jisho.org
|
||||
- Mistvall, who created the original API library [unofficial-jisho-api][unofficial-jisho-api].
|
||||
|
||||
[circleci-badge]: https://circleci.com/gh/h7x4ABk3g/Jisho-Study-Tool.svg?style=shield
|
||||
[circleci]: https://app.circleci.com/pipelines/github/h7x4ABk3g/Jisho-Study-Tool
|
||||
[flutter-get-started]: https://docs.flutter.dev/get-started/install
|
||||
[jisho]: https://jisho.org
|
||||
[screenshots]: .github/screenshots/
|
||||
[unofficial-jisho-api]: https://www.npmjs.com/package/unofficial-jisho-api
|
||||
[unofficial_jisho_api]: https://pub.dev/packages/unofficial_jisho_api
|
||||
6
android/.gitignore
vendored
@@ -5,3 +5,9 @@ gradle-wrapper.jar
|
||||
/gradlew.bat
|
||||
/local.properties
|
||||
GeneratedPluginRegistrant.java
|
||||
|
||||
# Remember to never publicly share your keystore.
|
||||
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
|
||||
key.properties
|
||||
**/*.keystore
|
||||
**/*.jks
|
||||
|
||||
@@ -26,24 +26,29 @@ apply plugin: 'kotlin-android'
|
||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||
|
||||
android {
|
||||
compileSdkVersion 28
|
||||
compileSdkVersion flutter.compileSdkVersion
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = '1.8'
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
disable 'InvalidPackage'
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||
applicationId "com.example.jisho_study_tool"
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 28
|
||||
applicationId "app.jishostudytool.jisho_study_tool"
|
||||
// minSdkVersion flutter.minSdkVersion
|
||||
minSdkVersion 19
|
||||
targetSdkVersion flutter.targetSdkVersion
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
@@ -61,7 +66,4 @@ flutter {
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
testImplementation 'junit:junit:4.12'
|
||||
androidTestImplementation 'androidx.test:runner:1.1.1'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.jisho_study_tool">
|
||||
package="app.jishostudytool.jisho_study_tool">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
</manifest>
|
||||
|
||||
@@ -1,21 +1,25 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.jisho_study_tool">
|
||||
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
|
||||
calls FlutterMain.startInitialization(this); in its onCreate method.
|
||||
In most cases you can leave this as-is, but you if you want to provide
|
||||
additional functionality it is fine to subclass or reimplement
|
||||
FlutterApplication and put your custom class here. -->
|
||||
<application
|
||||
android:name="io.flutter.app.FlutterApplication"
|
||||
android:label="jisho_study_tool"
|
||||
package="app.jishostudytool.jisho_study_tool">
|
||||
<application
|
||||
android:label="Jisho Study Tool"
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/launcher_icon">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
android:exported="true"
|
||||
android:launchMode="singleTop"
|
||||
android:theme="@style/LaunchTheme"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||
the Android process has started. This theme is visible to the user
|
||||
while the Flutter UI initializes. After that, this theme continues
|
||||
to determine the Window background behind the Flutter UI. -->
|
||||
<meta-data
|
||||
android:name="io.flutter.embedding.android.NormalTheme"
|
||||
android:resource="@style/NormalTheme"
|
||||
/>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
@@ -28,4 +32,7 @@
|
||||
android:value="2" />
|
||||
</application>
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
</manifest>
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
// Generated file.
|
||||
// If you wish to remove Flutter's multidex support, delete this entire file.
|
||||
|
||||
package io.flutter.app;
|
||||
|
||||
import android.content.Context;
|
||||
import androidx.annotation.CallSuper;
|
||||
import androidx.multidex.MultiDex;
|
||||
|
||||
/**
|
||||
* Extension of {@link io.flutter.app.FlutterApplication}, adding multidex support.
|
||||
*/
|
||||
public class FlutterMultiDexApplication extends FlutterApplication {
|
||||
@Override
|
||||
@CallSuper
|
||||
protected void attachBaseContext(Context base) {
|
||||
super.attachBaseContext(base);
|
||||
MultiDex.install(this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package app.jishostudytool.jisho_study_tool
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
|
||||
class MainActivity: FlutterActivity() {
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
package com.example.jisho_study_tool
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugins.GeneratedPluginRegistrant
|
||||
|
||||
class MainActivity: FlutterActivity() {
|
||||
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
|
||||
GeneratedPluginRegistrant.registerWith(flutterEngine);
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.7 KiB |
18
android/app/src/main/res/values-night-v31/styles.xml
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="android:windowFullscreen">false</item>
|
||||
<item name="android:windowSplashScreenBackground">#202020</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -5,13 +5,14 @@
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
Flutter draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="android:windowFullscreen">false</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
|
||||
18
android/app/src/main/res/values-v31/styles.xml
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="android:windowFullscreen">false</item>
|
||||
<item name="android:windowSplashScreenBackground">#3edd00</item>
|
||||
</style>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -1,8 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<!-- Show a splash screen on the activity. Automatically removed when
|
||||
Flutter draws its first frame -->
|
||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||
<item name="android:forceDarkAllowed">false</item>
|
||||
<item name="android:windowFullscreen">false</item>
|
||||
</style>
|
||||
</resources>
|
||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||
This theme determines the color of the Android Window while your
|
||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||
running.
|
||||
|
||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||
<item name="android:windowBackground">?android:colorBackground</item>
|
||||
</style>
|
||||
</resources>
|
||||
@@ -1,7 +1,10 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.jisho_study_tool">
|
||||
package="app.jishostudytool.jisho_study_tool">
|
||||
<!-- Flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||
</manifest>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.5.0'
|
||||
ext.kotlin_version = '1.6.10'
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.0.3'
|
||||
classpath 'com.android.tools.build:gradle:4.1.0'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,7 @@ buildscript {
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
org.gradle.jvmargs=-Xmx1536M
|
||||
android.enableR8=true
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
|
||||
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
include ':app'
|
||||
|
||||
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
|
||||
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
|
||||
def properties = new Properties()
|
||||
|
||||
def plugins = new Properties()
|
||||
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
|
||||
if (pluginsFile.exists()) {
|
||||
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
|
||||
}
|
||||
assert localPropertiesFile.exists()
|
||||
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
|
||||
|
||||
plugins.each { name, path ->
|
||||
def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
|
||||
include ":$name"
|
||||
project(":$name").projectDir = pluginDirectory
|
||||
}
|
||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
||||
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
|
||||
|
||||
BIN
assets/fonts/DroidSansJapanese.ttf
Executable file
BIN
assets/fonts/NotoSansCJK-Regular.ttc
Normal file
BIN
assets/fonts/NotoSerifCJK-Regular.ttc
Normal file
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
122
assets/images/links/compart.svg
Normal file
@@ -0,0 +1,122 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="svg2443"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.46"
|
||||
width="228.14874"
|
||||
height="60.237499"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="Compart Logo.svg"
|
||||
version="1.0"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
|
||||
id="metadata2448"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs2446"><inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective2450" /><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath2458"><path
|
||||
d="M 0,682.495 L 594.96,682.495 L 594.96,48.244 L 0,48.244 L 0,682.495 z"
|
||||
id="path2460" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath2470"><path
|
||||
d="M 0,841.945 L 594.96,841.945 L 594.96,0.055 L 0,0.055 L 0,841.945 z"
|
||||
id="path2472" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath2496"><path
|
||||
d="M 0,841.945 L 594.96,841.945 L 594.96,0.055 L 0,0.055 L 0,841.945 z"
|
||||
id="path2498" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath2512"><path
|
||||
d="M 0,841.945 L 594.96,841.945 L 594.96,0.055 L 0,0.055 L 0,841.945 z"
|
||||
id="path2514" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath2532"><path
|
||||
d="M 563.399,34.611 L 584.608,34.611 L 584.608,13.402 L 563.399,13.402 L 563.399,34.611 z"
|
||||
id="path2534" /></clipPath><clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath2554"><path
|
||||
d="M 0,841.945 L 594.96,841.945 L 594.96,0.055 L 0,0.055 L 0,841.945 z"
|
||||
id="path2556" /></clipPath></defs><sodipodi:namedview
|
||||
inkscape:window-height="974"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
guidetolerance="10.0"
|
||||
gridtolerance="10.0"
|
||||
objecttolerance="10.0"
|
||||
borderopacity="1.0"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
id="base"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4"
|
||||
inkscape:cx="235.03328"
|
||||
inkscape:cy="66.25"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:current-layer="g2510" /><g
|
||||
id="g2452"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Format-Nr-6-2006-03"
|
||||
transform="matrix(1.25,0,0,-1.25,-226.22766,443.03353)"><g
|
||||
id="g2508"
|
||||
transform="translate(-231.45887,306.18182)"><g
|
||||
id="g2510"
|
||||
clip-path="url(#clipPath2512)"><path
|
||||
d="M 574.003,46.057 L 603.942,46.057 L 603.942,2.245 L 574.003,2.245 L 574.003,46.057 z"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path2520" /><path
|
||||
d="M 552.796,48.245 L 603.942,48.245 L 603.942,45.215 L 552.796,45.215 L 552.796,48.245 z"
|
||||
style="fill:#ed1c24;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path2522" /><path
|
||||
d="M 552.796,2.798 L 603.942,2.798 L 603.942,-8.486 L 552.796,-8.486 L 552.796,2.798 z"
|
||||
style="fill:#ed1c24;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path2524" /></g></g><path
|
||||
d="M 331.94013,340.79282 L 353.14913,340.79282 L 353.14913,319.58382 L 331.94013,319.58382 L 331.94013,340.79282 z"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path2526" /><g
|
||||
id="g2528"
|
||||
transform="translate(-231.45887,306.18182)"><g
|
||||
id="g2530"
|
||||
clip-path="url(#clipPath2532)"><path
|
||||
d="M 574.003,35.651 L 586.674,35.651 L 586.674,11.401 L 574.003,11.401 L 574.003,35.651 z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path2536" /></g></g><path
|
||||
d="M 202.82513,335.47782 C 201.67913,336.11382 200.34213,336.43182 199.00613,336.43182 C 193.88213,336.43182 189.87213,332.80382 189.87213,327.55282 C 189.87213,322.62082 193.91413,319.02482 198.75113,319.02482 C 200.15113,319.02482 201.55213,319.31082 202.82513,319.94782 L 202.82513,324.84782 C 202.06113,324.14782 200.94713,323.73482 199.92913,323.73482 C 197.54213,323.73482 195.85513,325.38882 195.85513,327.74382 C 195.85513,330.00382 197.60613,331.72182 199.83313,331.72182 C 200.94713,331.72182 201.96513,331.21282 202.82513,330.57682 L 202.82513,335.47782"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path2538" /><path
|
||||
d="M 213.68613,336.43182 C 208.43513,336.43182 203.85213,333.28182 203.85213,327.71282 C 203.85213,322.14282 208.46713,319.02482 213.68613,319.02482 C 218.93713,319.02482 223.51913,322.17482 223.51913,327.71282 C 223.51913,333.28182 218.93713,336.43182 213.68613,336.43182 z M 213.68613,331.40382 C 216.04113,331.40382 217.40913,329.71682 217.40913,327.71282 C 217.40913,325.64382 216.04113,324.05282 213.68613,324.05282 C 211.33113,324.05282 209.96313,325.64382 209.96313,327.71282 C 209.96313,329.71682 211.33113,331.40382 213.68613,331.40382"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path2540" /><path
|
||||
d="M 230.92713,335.89082 L 225.13513,335.89082 L 225.13513,319.56582 L 230.92713,319.56582 L 230.92713,327.36282 C 230.92713,329.17582 230.92713,331.94482 233.50513,331.94482 C 236.08213,331.94482 236.08213,329.17582 236.08213,327.36282 L 236.08213,319.56582 L 241.87413,319.56582 L 241.87413,327.36282 C 241.87413,329.30382 241.97013,331.81782 244.64313,331.81782 C 247.09313,331.81782 247.03013,329.04882 247.03013,327.36282 L 247.03013,319.56582 L 252.82213,319.56582 L 252.82213,329.97182 C 252.82213,333.72682 251.39013,336.43182 247.25313,336.43182 C 245.02513,336.43182 242.82913,335.34982 241.71513,333.31382 C 240.53813,335.47782 238.50113,336.43182 236.14613,336.43182 C 234.04613,336.43182 232.35913,335.66882 230.99113,333.85482 L 230.92713,333.85482 L 230.92713,335.89082"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path2542" /><path
|
||||
d="M 260.98013,335.89082 L 255.18813,335.89082 L 255.18813,311.41882 L 260.98013,311.41882 L 260.98013,321.12482 C 262.22113,319.69282 264.16213,319.02482 266.04013,319.02482 C 270.87713,319.02482 274.21913,322.97082 274.21913,327.68082 C 274.21913,332.35882 270.84513,336.43182 265.97613,336.43182 C 264.06713,336.43182 262.09413,335.66882 261.04413,334.04582 L 260.98013,334.04582 L 260.98013,335.89082 z M 264.51213,331.40382 C 266.86713,331.40382 268.23613,329.71682 268.23613,327.71282 C 268.23613,325.64382 266.86713,324.05282 264.51213,324.05282 C 262.15713,324.05282 260.78913,325.64382 260.78913,327.71282 C 260.78913,329.71682 262.15713,331.40382 264.51213,331.40382"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path2544" /><path
|
||||
d="M 285.26213,331.40382 C 287.61713,331.40382 288.98513,329.71682 288.98513,327.71282 C 288.98513,325.64382 287.61713,324.05282 285.26213,324.05282 C 282.90713,324.05282 281.53913,325.64382 281.53913,327.71282 C 281.53913,329.71682 282.90713,331.40382 285.26213,331.40382 z M 294.58613,335.89082 L 288.79413,335.89082 L 288.79413,334.29982 C 287.58513,335.73182 285.61213,336.43182 283.73413,336.43182 C 278.89713,336.43182 275.55613,332.42282 275.55613,327.74382 C 275.55613,323.06582 278.96113,319.02482 283.79813,319.02482 C 285.70713,319.02482 287.71213,319.75682 288.73113,321.37982 L 288.79413,321.37982 L 288.79413,319.56582 L 294.58613,319.56582 L 294.58613,335.89082"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:evenodd;stroke:none"
|
||||
id="path2546" /><path
|
||||
d="M 302.59613,335.89082 L 296.80413,335.89082 L 296.80413,319.56582 L 302.59613,319.56582 L 302.59613,326.15282 C 302.59613,328.95382 303.39213,331.08582 306.60613,331.08582 C 307.49713,331.08582 308.26113,330.98982 309.05613,330.54482 L 309.05613,336.11382 L 307.94313,336.11382 C 305.68313,336.11382 303.77313,335.22282 302.66013,333.21782 L 302.59613,333.21782 L 302.59613,335.89082"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path2548" /><g
|
||||
id="g2550"><g
|
||||
id="g2552"
|
||||
clip-path="url(#clipPath2554)"><path
|
||||
d="M 318.04513,331.11782 L 321.32313,331.11782 L 321.32313,335.89082 L 318.04513,335.89082 L 318.04513,340.79182 L 312.25313,340.79182 L 312.25313,335.89082 L 310.37513,335.89082 L 310.37513,331.11782 L 312.25313,331.11782 L 312.25313,319.56582 L 318.04513,319.56582 L 318.04513,331.11782"
|
||||
style="fill:#231f20;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path2558" /></g></g></g></svg>
|
||||
|
After Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
4
assets/licenses.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"droid-fonts": "assets/licenses/droid-fonts.txt",
|
||||
"noto-fonts": "assets/licenses/noto-fonts.txt"
|
||||
}
|
||||
202
assets/licenses/droid-fonts.txt
Normal file
@@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
94
assets/licenses/noto-fonts.txt
Normal file
@@ -0,0 +1,94 @@
|
||||
Copyright 2018 The Noto Project Authors (github.com/googlei18n/noto-fonts)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1.
|
||||
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font
|
||||
creation efforts of academic and linguistic communities, and to
|
||||
provide a free and open framework in which fonts may be shared and
|
||||
improved in partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply to
|
||||
any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software
|
||||
components as distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to,
|
||||
deleting, or substituting -- in part or in whole -- any of the
|
||||
components of the Original Version, by changing formats or by porting
|
||||
the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed,
|
||||
modify, redistribute, and sell modified and unmodified copies of the
|
||||
Font Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components, in
|
||||
Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the
|
||||
corresponding Copyright Holder. This restriction only applies to the
|
||||
primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created using
|
||||
the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
184
flake.lock
generated
Normal file
@@ -0,0 +1,184 @@
|
||||
{
|
||||
"nodes": {
|
||||
"android-nixpkgs": {
|
||||
"inputs": {
|
||||
"devshell": "devshell",
|
||||
"flake-utils": "flake-utils_2",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1651782096,
|
||||
"narHash": "sha256-rrj0HPwmDf6Q14sljnVf2hkMvc97rndgi4PJkFtpFPk=",
|
||||
"owner": "tadfisher",
|
||||
"repo": "android-nixpkgs",
|
||||
"rev": "ccd2a8f58709ea3413fcb72769b2f62a98332215",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tadfisher",
|
||||
"repo": "android-nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"devshell": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1650900878,
|
||||
"narHash": "sha256-qhNncMBSa9STnhiLfELEQpYC1L4GrYHNIzyCZ/pilsI=",
|
||||
"owner": "numtide",
|
||||
"repo": "devshell",
|
||||
"rev": "d97df53b5ddaa1cfbea7cddbd207eb2634304733",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "devshell",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"locked": {
|
||||
"lastModified": 1642700792,
|
||||
"narHash": "sha256-XqHrk7hFb+zBvRg6Ghl+AZDq03ov6OshJLiSWOoX5es=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "846b2ae0fc4cc943637d3d1def4454213e203cba",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_2": {
|
||||
"locked": {
|
||||
"lastModified": 1649676176,
|
||||
"narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_3": {
|
||||
"locked": {
|
||||
"lastModified": 1649676176,
|
||||
"narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils_4": {
|
||||
"locked": {
|
||||
"lastModified": 1649676176,
|
||||
"narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nix-dart": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils_4",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"pub2nix": "pub2nix"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1651781526,
|
||||
"narHash": "sha256-q01e+S69g4UDrMcEitaQOccr2aHeiJ+VEmPS94h/7WY=",
|
||||
"owner": "tadfisher",
|
||||
"repo": "nix-dart",
|
||||
"rev": "71d2fda0f9590d5de917fb736dee312d9fef7e27",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "tadfisher",
|
||||
"repo": "nix-dart",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1643381941,
|
||||
"narHash": "sha256-pHTwvnN4tTsEKkWlXQ8JMY423epos8wUOhthpwJjtpc=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "5efc8ca954272c4376ac929f4c5ffefcc20551d5",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixpkgs-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1651743098,
|
||||
"narHash": "sha256-NuQNu6yHh54li0kZffM59FRC5bWCJusygL4Cy+3O0fY=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "d4191fe35cbe52f755ef73009d4d37b9e002efa2",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"ref": "nixos-21.11",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"pub2nix": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1594192744,
|
||||
"narHash": "sha256-pDvcXSG1Mh2BpwkqAcNDJzcupV3pIAAtZJLfkiHMAz4=",
|
||||
"owner": "paulyoung",
|
||||
"repo": "pub2nix",
|
||||
"rev": "0c7ecca590fcd1616db8c6468f799ffef36c85e9",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "paulyoung",
|
||||
"repo": "pub2nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"android-nixpkgs": "android-nixpkgs",
|
||||
"flake-utils": "flake-utils_3",
|
||||
"nix-dart": "nix-dart",
|
||||
"nixpkgs": "nixpkgs_2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
116
flake.nix
Normal file
@@ -0,0 +1,116 @@
|
||||
{
|
||||
description = "A dictionary app for studying japanese";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "nixpkgs/nixos-21.11";
|
||||
|
||||
flake-utils = {
|
||||
url = "github:numtide/flake-utils";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
android-nixpkgs = {
|
||||
url = "github:tadfisher/android-nixpkgs";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
nix-dart = {
|
||||
url = "github:tadfisher/nix-dart";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
# nix-flutter = {
|
||||
# url = "path:/home/h7x4/git/flutter_linux_2.5.1-stable/flutter";
|
||||
# inputs.nixpkgs.follows = "nixpkgs";
|
||||
# };
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils, android-nixpkgs, nix-dart }:
|
||||
let
|
||||
system = "x86_64-linux";
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
config = {
|
||||
android_sdk.accept_license = true;
|
||||
allowUnfree = true;
|
||||
};
|
||||
};
|
||||
|
||||
dartVersion = "2.14.2";
|
||||
dartChannel = "stable";
|
||||
|
||||
flutterVersion = "2.5.1";
|
||||
flutterChannel = "stable";
|
||||
in {
|
||||
|
||||
packages.${system} = {
|
||||
android-sdk = android-nixpkgs.sdk.${system} (sdkPkgs: with sdkPkgs; [
|
||||
cmdline-tools-latest
|
||||
build-tools-32-0-0
|
||||
build-tools-31-0-0
|
||||
build-tools-30-0-2
|
||||
build-tools-29-0-2
|
||||
platform-tools
|
||||
platforms-android-32
|
||||
platforms-android-31
|
||||
platforms-android-30
|
||||
platforms-android-29
|
||||
emulator
|
||||
]);
|
||||
|
||||
# dart = nix-dart.packages.${system}.dart;
|
||||
dart = (pkgs.callPackage ./nix/dart.nix {});
|
||||
|
||||
inherit (pkgs.callPackage ./nix/flutter.nix { inherit (self.packages.${system}) dart; }) flutter;
|
||||
|
||||
# pub2nix-lock = nix-dart.packages.${system}.pub2nix-lock;
|
||||
};
|
||||
|
||||
# apps.${system} = {
|
||||
# web-debug = {
|
||||
# type = "app";
|
||||
# program = "";
|
||||
# };
|
||||
# web-release = {
|
||||
# type = "app";
|
||||
# program = "";
|
||||
# };
|
||||
# apk-debug = {
|
||||
# type = "app";
|
||||
# program = "";
|
||||
# };
|
||||
# apk-release = {
|
||||
# type = "app";
|
||||
# program = "${self.packages.${system}.flutter}/bin/flutter run --release";
|
||||
# };
|
||||
# default = self.apps.${system}.apk-debug;
|
||||
# };
|
||||
|
||||
devShell.${system} = let
|
||||
inherit (pkgs) lcov google-chrome sqlite sqlite-web;
|
||||
inherit (self.packages.${system}) android-sdk flutter dart;
|
||||
inherit (nix-dart.packages.${system}) pub2nix-lock;
|
||||
java = pkgs.jdk8;
|
||||
in pkgs.mkShell rec {
|
||||
ANDROID_JAVA_HOME="${java.home}";
|
||||
ANDROID_SDK_ROOT = "${android-sdk}/share/android-sdk";
|
||||
CHROME_EXECUTABLE = "${google-chrome}/bin/google-chrome-stable";
|
||||
FLUTTER_SDK="${flutter}";
|
||||
GRADLE_OPTS = "-Dorg.gradle.project.android.aapt2FromMavenOverride=${ANDROID_SDK_ROOT}/build-tools/32.0.0/aapt2";
|
||||
JAVA_HOME="${ANDROID_JAVA_HOME}";
|
||||
USE_CCACHE=0;
|
||||
|
||||
buildInputs = [
|
||||
android-sdk
|
||||
dart
|
||||
flutter
|
||||
google-chrome
|
||||
java
|
||||
lcov
|
||||
pub2nix-lock
|
||||
sqlite
|
||||
sqlite-web
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
2
ios/.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
**/dgph
|
||||
*.mode1v3
|
||||
*.mode2v3
|
||||
*.moved-aside
|
||||
@@ -18,6 +19,7 @@ Flutter/App.framework
|
||||
Flutter/Flutter.framework
|
||||
Flutter/Flutter.podspec
|
||||
Flutter/Generated.xcconfig
|
||||
Flutter/ephemeral/
|
||||
Flutter/app.flx
|
||||
Flutter/app.zip
|
||||
Flutter/flutter_assets/
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>App</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
@@ -21,6 +21,6 @@
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.0</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
<string>8.0</string>
|
||||
<string>9.0</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -3,17 +3,13 @@
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objectVersion = 50;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||
3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };
|
||||
3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||
9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };
|
||||
9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||
@@ -26,8 +22,6 @@
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,
|
||||
9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,
|
||||
);
|
||||
name = "Embed Frameworks";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -38,13 +32,11 @@
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||
3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = "<group>"; };
|
||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
||||
9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = "<group>"; };
|
||||
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
@@ -57,8 +49,6 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,
|
||||
3B80C3941E831B6300D905FE /* App.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
@@ -68,9 +58,7 @@
|
||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3B80C3931E831B6300D905FE /* App.framework */,
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
||||
9740EEBA1CF902C7004384FC /* Flutter.framework */,
|
||||
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
||||
9740EEB31CF90195004384FC /* Generated.xcconfig */,
|
||||
@@ -102,7 +90,6 @@
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */,
|
||||
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
|
||||
97C147021CF9000F007C117D /* Info.plist */,
|
||||
97C146F11CF9000F007C117D /* Supporting Files */,
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
|
||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
|
||||
@@ -111,13 +98,6 @@
|
||||
path = Runner;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
97C146F11CF9000F007C117D /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
);
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
@@ -147,8 +127,8 @@
|
||||
97C146E61CF9000F007C117D /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 1020;
|
||||
ORGANIZATIONNAME = "The Chromium Authors";
|
||||
LastUpgradeCheck = 1300;
|
||||
ORGANIZATIONNAME = "";
|
||||
TargetAttributes = {
|
||||
97C146ED1CF9000F007C117D = {
|
||||
CreatedOnToolsVersion = 7.3.1;
|
||||
@@ -157,7 +137,7 @@
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
compatibilityVersion = "Xcode 9.3";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
@@ -201,7 +181,7 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin";
|
||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
|
||||
};
|
||||
9740EEB61CF901F6004384FC /* Run Script */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
@@ -253,7 +233,6 @@
|
||||
/* Begin XCBuildConfiguration section */
|
||||
249021D3217E4FDB00AE95B9 /* Profile */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
@@ -293,7 +272,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
@@ -310,17 +289,12 @@
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
ENABLE_BITCODE = NO;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.jishoStudyTool;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = app.jishostudytool.jishoStudyTool;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
@@ -330,7 +304,6 @@
|
||||
};
|
||||
97C147031CF9000F007C117D /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
@@ -376,7 +349,7 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
@@ -386,7 +359,6 @@
|
||||
};
|
||||
97C147041CF9000F007C117D /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
@@ -426,11 +398,12 @@
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = iphoneos;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
@@ -444,17 +417,12 @@
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
ENABLE_BITCODE = NO;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.jishoStudyTool;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = app.jishostudytool.jishoStudyTool;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
@@ -471,17 +439,12 @@
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||
ENABLE_BITCODE = NO;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
);
|
||||
INFOPLIST_FILE = Runner/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/Flutter",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.example.jishoStudyTool;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = app.jishostudytool.jishoStudyTool;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
|
||||
SWIFT_VERSION = 5.0;
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
<Workspace
|
||||
version = "1.0">
|
||||
<FileRef
|
||||
location = "group:Runner.xcodeproj">
|
||||
location = "self:">
|
||||
</FileRef>
|
||||
</Workspace>
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreviewsEnabled</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1020"
|
||||
LastUpgradeVersion = "1300"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -27,8 +27,6 @@
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
<MacroExpansion>
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
@@ -38,8 +36,8 @@
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</MacroExpansion>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
@@ -61,8 +59,6 @@
|
||||
ReferencedContainer = "container:Runner.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Profile"
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>PreviewsEnabled</key>
|
||||
<false/>
|
||||
</dict>
|
||||
</plist>
|
||||
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 7.7 KiB |
@@ -4,6 +4,8 @@
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>Jisho Study Tool</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
|
||||
@@ -1 +1 @@
|
||||
#import "GeneratedPluginRegistrant.h"
|
||||
#import "GeneratedPluginRegistrant.h"
|
||||
|
||||
27
lib/components/common/denshi_jisho_background.dart
Normal file
@@ -0,0 +1,27 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class DenshiJishoBackground extends StatelessWidget {
|
||||
final Widget child;
|
||||
|
||||
const DenshiJishoBackground({
|
||||
Key? key,
|
||||
required this.child,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
right: 30,
|
||||
left: 100,
|
||||
bottom: 30,
|
||||
child: Image.asset(
|
||||
'assets/images/components/denshi_jisho_background_overlay.png',
|
||||
),
|
||||
),
|
||||
child,
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ import 'package:signature/signature.dart';
|
||||
|
||||
import '../../bloc/theme/theme_bloc.dart';
|
||||
import '../../services/handwriting.dart';
|
||||
import '../../settings.dart';
|
||||
|
||||
class DrawingBoard extends StatefulWidget {
|
||||
final Function(String)? onSuggestionChosen;
|
||||
@@ -112,7 +113,7 @@ class _DrawingBoardState extends State<DrawingBoard> {
|
||||
style: TextStyle(
|
||||
fontSize: fontSize,
|
||||
color: colors.foreground,
|
||||
),
|
||||
).merge(japaneseFont.textStyle),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -2,38 +2,13 @@ import 'package:flutter/material.dart';
|
||||
|
||||
import '../../bloc/theme/theme_bloc.dart';
|
||||
|
||||
class DateDivider extends StatelessWidget {
|
||||
final String? text;
|
||||
final DateTime? date;
|
||||
class TextDivider extends StatelessWidget {
|
||||
final String text;
|
||||
|
||||
const DateDivider({
|
||||
this.text,
|
||||
this.date,
|
||||
const TextDivider({
|
||||
Key? key,
|
||||
}) : assert((text == null) ^ (date == null)),
|
||||
super(key: key);
|
||||
|
||||
String getHumanReadableDate(DateTime date) {
|
||||
const List<String> monthTable = [
|
||||
'Jan',
|
||||
'Feb',
|
||||
'Mar',
|
||||
'Apr',
|
||||
'May',
|
||||
'Jun',
|
||||
'Jul',
|
||||
'Aug',
|
||||
'Sep',
|
||||
'Oct',
|
||||
'Nov',
|
||||
'Dec',
|
||||
];
|
||||
|
||||
final int day = date.day;
|
||||
final String month = monthTable[date.month - 1];
|
||||
final int year = date.year;
|
||||
return '$day. $month $year';
|
||||
}
|
||||
required this.text,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => BlocBuilder<ThemeBloc, ThemeState>(
|
||||
@@ -47,9 +22,7 @@ class DateDivider extends StatelessWidget {
|
||||
horizontal: 10,
|
||||
),
|
||||
child: DefaultTextStyle.merge(
|
||||
child: (text != null)
|
||||
? Text(text!)
|
||||
: Text(getHumanReadableDate(date!)),
|
||||
child: Text(text),
|
||||
style: TextStyle(color: colors.foreground),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -2,72 +2,103 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_slidable/flutter_slidable.dart';
|
||||
|
||||
import '../../models/history/search.dart';
|
||||
import '../../routing/routes.dart';
|
||||
import '../../services/datetime.dart';
|
||||
import '../../settings.dart';
|
||||
import 'kanji_box.dart';
|
||||
|
||||
class SearchItem extends StatelessWidget {
|
||||
final DateTime time;
|
||||
final Widget search;
|
||||
final Search search;
|
||||
// final Widget search;
|
||||
final int objectKey;
|
||||
final void Function()? onDelete;
|
||||
final void Function()? onFavourite;
|
||||
final void Function()? onTap;
|
||||
|
||||
const SearchItem({
|
||||
required this.time,
|
||||
required this.search,
|
||||
required this.objectKey,
|
||||
this.onDelete,
|
||||
this.onFavourite,
|
||||
this.onTap,
|
||||
Key? key,
|
||||
}) : super(key: key);
|
||||
|
||||
String getTime() {
|
||||
final hours = time.hour.toString().padLeft(2, '0');
|
||||
final mins = time.minute.toString().padLeft(2, '0');
|
||||
return '$hours:$mins';
|
||||
}
|
||||
Widget get _child => (search.isKanji)
|
||||
? KanjiBox(kanji: search.kanjiQuery!.kanji)
|
||||
: Text(search.wordQuery!.query);
|
||||
|
||||
void Function() _onTap(context) => search.isKanji
|
||||
? () => Navigator.pushNamed(
|
||||
context,
|
||||
Routes.kanjiSearch,
|
||||
arguments: search.kanjiQuery!.kanji,
|
||||
)
|
||||
: () => Navigator.pushNamed(
|
||||
context,
|
||||
Routes.search,
|
||||
arguments: search.wordQuery!.query,
|
||||
);
|
||||
|
||||
MaterialPageRoute get timestamps => MaterialPageRoute(
|
||||
builder: (context) => Scaffold(
|
||||
appBar: AppBar(title: const Text('Last searched')),
|
||||
body: ListView(
|
||||
children: [
|
||||
for (final ts in search.timestamps.reversed)
|
||||
ListTile(title: Text('${formatDate(ts)} ${formatTime(ts)}'))
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
List<SlidableAction> _actions(context) => [
|
||||
SlidableAction(
|
||||
backgroundColor: Colors.blue,
|
||||
icon: Icons.access_time,
|
||||
onPressed: (_) => Navigator.push(context, timestamps),
|
||||
),
|
||||
SlidableAction(
|
||||
backgroundColor: Colors.yellow,
|
||||
icon: Icons.star,
|
||||
onPressed: (_) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(content: Text('TODO: implement favourites')),
|
||||
);
|
||||
onFavourite?.call();
|
||||
},
|
||||
),
|
||||
SlidableAction(
|
||||
backgroundColor: Colors.red,
|
||||
icon: Icons.delete,
|
||||
onPressed: (_) {
|
||||
final Database db = GetIt.instance.get<Database>();
|
||||
Search.store.record(objectKey).delete(db);
|
||||
onDelete?.call();
|
||||
},
|
||||
),
|
||||
];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Slidable(
|
||||
endActionPane: ActionPane(
|
||||
motion: const ScrollMotion(),
|
||||
children: [
|
||||
SlidableAction(
|
||||
label: 'Favourite',
|
||||
backgroundColor: Colors.yellow,
|
||||
icon: Icons.star,
|
||||
onPressed: (_) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
const SnackBar(content: Text('TODO: implement favourites')),
|
||||
);
|
||||
onFavourite?.call();
|
||||
},
|
||||
),
|
||||
SlidableAction(
|
||||
label: 'Delete',
|
||||
backgroundColor: Colors.red,
|
||||
icon: Icons.delete,
|
||||
onPressed: (_) {
|
||||
final Database db = GetIt.instance.get<Database>();
|
||||
Search.store.record(objectKey).delete(db);
|
||||
onDelete?.call();
|
||||
},
|
||||
),
|
||||
],
|
||||
children: _actions(context),
|
||||
),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 10),
|
||||
child: ListTile(
|
||||
onTap: onTap,
|
||||
onTap: _onTap(context),
|
||||
contentPadding: EdgeInsets.zero,
|
||||
title: Row(
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20),
|
||||
child: Text(getTime()),
|
||||
child: Text(formatTime(search.timestamp)),
|
||||
),
|
||||
DefaultTextStyle.merge(
|
||||
style: japaneseFont.textStyle,
|
||||
child: _child,
|
||||
),
|
||||
search,
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -9,6 +9,7 @@ import './kanji_result_body/radical.dart';
|
||||
import './kanji_result_body/rank.dart';
|
||||
import './kanji_result_body/stroke_order_gif.dart';
|
||||
import './kanji_result_body/yomi_chips.dart';
|
||||
import '../../services/kanji_grade_conversion.dart';
|
||||
|
||||
class KanjiResultBody extends StatelessWidget {
|
||||
late final String query;
|
||||
@@ -24,6 +25,7 @@ class KanjiResultBody extends StatelessWidget {
|
||||
resultData = result.data!;
|
||||
}
|
||||
|
||||
// TODO: add compart link
|
||||
Widget get headerRow => Container(
|
||||
margin: const EdgeInsets.fromLTRB(20.0, 20.0, 20.0, 30.0),
|
||||
child: Row(
|
||||
@@ -31,7 +33,7 @@ class KanjiResultBody extends StatelessWidget {
|
||||
children: [
|
||||
const Flexible(
|
||||
fit: FlexFit.tight,
|
||||
child: Center(child: SizedBox()),
|
||||
child: SizedBox(),
|
||||
),
|
||||
Flexible(
|
||||
fit: FlexFit.tight,
|
||||
@@ -62,7 +64,7 @@ class KanjiResultBody extends StatelessWidget {
|
||||
Row(
|
||||
children: [
|
||||
const Text('Grade: ', style: TextStyle(fontSize: 20.0)),
|
||||
Grade(grade: resultData.taughtIn),
|
||||
Grade(grade: resultData.grade),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:unofficial_jisho_api/api.dart';
|
||||
|
||||
import '../../../bloc/theme/theme_bloc.dart';
|
||||
import '../../../routing/routes.dart';
|
||||
import '../../../services/romaji_transliteration.dart';
|
||||
import '../../../settings.dart';
|
||||
|
||||
@@ -73,7 +74,14 @@ class _Example extends StatelessWidget {
|
||||
child: IntrinsicHeight(
|
||||
child: Row(
|
||||
children: [
|
||||
_Kana(colors: kanaColors, example: yomiExample),
|
||||
InkWell(
|
||||
onTap: () => Navigator.pushNamed(
|
||||
context,
|
||||
Routes.search,
|
||||
arguments: yomiExample.example,
|
||||
),
|
||||
child: _Kana(colors: kanaColors, example: yomiExample),
|
||||
),
|
||||
_ExampleText(colors: menuColors, example: yomiExample)
|
||||
],
|
||||
),
|
||||
@@ -114,7 +122,7 @@ class _Kana extends StatelessWidget {
|
||||
style: TextStyle(
|
||||
color: colors.foreground,
|
||||
fontSize: 15.0,
|
||||
),
|
||||
).merge(!romajiEnabled ? japaneseFont.textStyle : null),
|
||||
),
|
||||
const SizedBox(height: 5.0),
|
||||
Text(
|
||||
@@ -122,7 +130,7 @@ class _Kana extends StatelessWidget {
|
||||
style: TextStyle(
|
||||
color: colors.foreground,
|
||||
fontSize: 20.0,
|
||||
),
|
||||
).merge(japaneseFont.textStyle),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../bloc/theme/theme_bloc.dart';
|
||||
import '../../../settings.dart';
|
||||
|
||||
class Grade extends StatelessWidget {
|
||||
final String? grade;
|
||||
@@ -28,7 +29,7 @@ class Grade extends StatelessWidget {
|
||||
style: TextStyle(
|
||||
color: colors.foreground,
|
||||
fontSize: 20.0,
|
||||
),
|
||||
).merge(japaneseFont.textStyle),
|
||||
),
|
||||
);
|
||||
},
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../bloc/theme/theme_bloc.dart';
|
||||
import '../../../settings.dart';
|
||||
|
||||
class Header extends StatelessWidget {
|
||||
final String kanji;
|
||||
@@ -18,15 +19,15 @@ class Header extends StatelessWidget {
|
||||
final colors = state.theme.kanjiResultColor;
|
||||
|
||||
return Container(
|
||||
alignment: Alignment.center,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
color: colors.background,
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
kanji,
|
||||
style: TextStyle(fontSize: 70.0, color: colors.foreground),
|
||||
),
|
||||
child: Text(
|
||||
kanji,
|
||||
style: TextStyle(fontSize: 70.0, color: colors.foreground)
|
||||
.merge(japaneseFont.textStyle),
|
||||
),
|
||||
);
|
||||
},
|
||||
|
||||
@@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
|
||||
import 'package:unofficial_jisho_api/api.dart' as jisho;
|
||||
|
||||
import '../../../bloc/theme/theme_bloc.dart';
|
||||
import '../../../routing/routes.dart';
|
||||
import '../../../settings.dart';
|
||||
|
||||
class Radical extends StatelessWidget {
|
||||
final jisho.Radical radical;
|
||||
@@ -16,17 +18,20 @@ class Radical extends StatelessWidget {
|
||||
builder: (context, state) {
|
||||
final colors = state.theme.kanjiResultColor;
|
||||
|
||||
return Container(
|
||||
padding: const EdgeInsets.all(15.0),
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: colors.background,
|
||||
),
|
||||
child: Text(
|
||||
radical.symbol,
|
||||
style: TextStyle(
|
||||
color: colors.foreground,
|
||||
fontSize: 40.0,
|
||||
return InkWell(
|
||||
onTap: () => Navigator.pushNamed(context, Routes.kanjiSearchRadicals, arguments: radical.symbol),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(15.0),
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: colors.background,
|
||||
),
|
||||
child: Text(
|
||||
radical.symbol,
|
||||
style: TextStyle(
|
||||
color: colors.foreground,
|
||||
fontSize: 40.0,
|
||||
).merge(japaneseFont.textStyle),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../bloc/theme/theme_bloc.dart';
|
||||
import '../../../routing/routes.dart';
|
||||
import '../../../services/romaji_transliteration.dart';
|
||||
import '../../../settings.dart';
|
||||
|
||||
@@ -50,24 +51,30 @@ class YomiChips extends StatelessWidget {
|
||||
bool get isExpandable => yomi.length > 6;
|
||||
|
||||
Widget yomiCard({
|
||||
required BuildContext context,
|
||||
required String yomi,
|
||||
required ColorSet colors,
|
||||
TextStyle? extraTextStyle,
|
||||
}) =>
|
||||
Container(
|
||||
margin: const EdgeInsets.symmetric(horizontal: 5),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 10.0,
|
||||
horizontal: 10.0,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: colors.background,
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
),
|
||||
child: Text(
|
||||
yomi,
|
||||
style: TextStyle(
|
||||
fontSize: 20.0,
|
||||
color: colors.foreground,
|
||||
InkWell(
|
||||
onTap: () =>
|
||||
Navigator.pushNamed(context, Routes.search, arguments: yomi),
|
||||
child: Container(
|
||||
margin: const EdgeInsets.symmetric(horizontal: 5),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 10.0,
|
||||
horizontal: 10.0,
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: colors.background,
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
),
|
||||
child: Text(
|
||||
yomi,
|
||||
style: TextStyle(
|
||||
fontSize: 20.0,
|
||||
color: colors.foreground,
|
||||
).merge(extraTextStyle),
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -75,12 +82,22 @@ class YomiChips extends StatelessWidget {
|
||||
Widget yomiWrapper(BuildContext context) {
|
||||
final yomiCards = yomi
|
||||
.map((y) => romajiEnabled ? transliterateKanaToLatin(y) : y)
|
||||
.map((y) => yomiCard(yomi: y, colors: type.getColors(context)))
|
||||
.map(
|
||||
(y) => yomiCard(
|
||||
context: context,
|
||||
yomi: y,
|
||||
colors: type.getColors(context),
|
||||
extraTextStyle: type != YomiType.meaning && !romajiEnabled
|
||||
? japaneseFont.textStyle
|
||||
: null,
|
||||
),
|
||||
)
|
||||
.toList();
|
||||
|
||||
final yomiCardsWithTitle = <Widget>[
|
||||
if (type != YomiType.meaning)
|
||||
yomiCard(
|
||||
context: context,
|
||||
yomi: type == YomiType.kunyomi ? 'Kun:' : 'On:',
|
||||
colors: ColorSet(
|
||||
foreground: type.getColors(context).background,
|
||||
@@ -101,7 +118,11 @@ class YomiChips extends StatelessWidget {
|
||||
else
|
||||
return ExpansionTile(
|
||||
title: Center(
|
||||
child: yomiCard(yomi: type.title, colors: type.getColors(context)),
|
||||
child: yomiCard(
|
||||
context: context,
|
||||
yomi: type.title,
|
||||
colors: type.getColors(context),
|
||||
),
|
||||
),
|
||||
children: [
|
||||
const SizedBox(height: 20.0),
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../bloc/theme/theme_bloc.dart';
|
||||
import '../../../routing/routes.dart';
|
||||
import '../../../settings.dart';
|
||||
|
||||
class KanjiGrid extends StatelessWidget {
|
||||
final List<String> suggestions;
|
||||
@@ -49,7 +50,9 @@ class _GridItem extends StatelessWidget {
|
||||
child: FittedBox(
|
||||
child: Text(
|
||||
kanji,
|
||||
style: TextStyle(color: _menuColors.foreground),
|
||||
style: japaneseFont.textStyle.merge(
|
||||
TextStyle(color: _menuColors.foreground),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import '../../../settings.dart';
|
||||
|
||||
class KanjiSearchBar extends StatefulWidget {
|
||||
final Function(String)? onChanged;
|
||||
|
||||
@@ -52,6 +54,7 @@ class KanjiSearchBarState extends State<KanjiSearchBar> {
|
||||
controller: textController,
|
||||
onChanged: (text) => onChanged(),
|
||||
onSubmitted: (_) => {},
|
||||
style: japaneseFont.textStyle,
|
||||
decoration: InputDecoration(
|
||||
hintText: 'Search',
|
||||
border: OutlineInputBorder(
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'package:get_it/get_it.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../../models/themes/theme.dart';
|
||||
import '../../settings.dart';
|
||||
|
||||
class LanguageSelector extends StatefulWidget {
|
||||
const LanguageSelector({Key? key}) : super(key: key);
|
||||
@@ -31,11 +32,11 @@ class _LanguageSelectorState extends State<LanguageSelector> {
|
||||
?.map((s) => s == '1')
|
||||
.toList();
|
||||
|
||||
Widget _languageOption(String language) =>
|
||||
Widget _languageOption(String language, {TextStyle? style}) =>
|
||||
Container(
|
||||
alignment: Alignment.center,
|
||||
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 20.0),
|
||||
child: Text(language),
|
||||
child: Text(language, style: style,),
|
||||
);
|
||||
|
||||
@override
|
||||
@@ -43,9 +44,9 @@ class _LanguageSelectorState extends State<LanguageSelector> {
|
||||
return ToggleButtons(
|
||||
selectedColor: AppTheme.jishoGreen.background,
|
||||
isSelected: isSelected,
|
||||
children: <Widget>[
|
||||
children: [
|
||||
_languageOption('Auto'),
|
||||
_languageOption('日本語'),
|
||||
_languageOption('日本語', style: japaneseFont.textStyle),
|
||||
_languageOption('English')
|
||||
],
|
||||
onPressed: (buttonIndex) {
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
|
||||
import '../../models/themes/theme.dart';
|
||||
import '../../routing/routes.dart';
|
||||
import '../../settings.dart';
|
||||
import 'language_selector.dart';
|
||||
|
||||
class SearchBar extends StatelessWidget {
|
||||
@@ -24,6 +25,7 @@ class SearchBar extends StatelessWidget {
|
||||
TextField(
|
||||
onSubmitted: (text) => _search(context, text),
|
||||
controller: controller,
|
||||
style: japaneseFont.textStyle,
|
||||
decoration: InputDecoration(
|
||||
labelText: 'Search',
|
||||
border: OutlineInputBorder(
|
||||
|
||||
@@ -31,8 +31,23 @@ class JapaneseHeader extends StatelessWidget {
|
||||
// If that's not the case, then the word is usually present in wordReading.
|
||||
// However, there are some exceptions where the reading is placed in word.
|
||||
// I have no clue why this might be the case.
|
||||
hasFurigana ? Text(wordReading!) : const Text(''),
|
||||
hasFurigana ? Text(word.word!) : Text(wordReading ?? word.word!),
|
||||
hasFurigana
|
||||
? Text(
|
||||
wordReading!,
|
||||
style: romajiEnabled ? null : japaneseFont.textStyle,
|
||||
)
|
||||
: const Text(''),
|
||||
hasFurigana
|
||||
? Text(
|
||||
word.word!,
|
||||
style: japaneseFont.textStyle,
|
||||
)
|
||||
: Text(
|
||||
wordReading ?? word.word!,
|
||||
style: wordReading != null && romajiEnabled
|
||||
? null
|
||||
: japaneseFont.textStyle,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../../bloc/theme/theme_bloc.dart';
|
||||
import '../../../../routing/routes.dart';
|
||||
import '../../../../settings.dart';
|
||||
|
||||
class KanjiRow extends StatelessWidget {
|
||||
final List<String> kanji;
|
||||
@@ -32,7 +33,7 @@ class KanjiRow extends StatelessWidget {
|
||||
style: TextStyle(
|
||||
color: colors.foreground,
|
||||
fontSize: fontSize,
|
||||
),
|
||||
).merge(japaneseFont.textStyle),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:jisho_study_tool/services/kanji_regex.dart';
|
||||
import 'package:unofficial_jisho_api/api.dart';
|
||||
|
||||
import '../../../../models/themes/theme.dart';
|
||||
@@ -34,8 +35,8 @@ class KanjiKanaBox extends StatelessWidget {
|
||||
|
||||
bool get hasFurigana => word.reading != null;
|
||||
|
||||
String get kana => '${word.reading ?? ""}${word.word ?? ""}'
|
||||
.replaceAll(RegExp(r'\p{Script=Hani}', unicode: true), '');
|
||||
String get kana =>
|
||||
'${word.reading ?? ""}${word.word ?? ""}'.replaceAll(kanjiRegex, '');
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -65,6 +66,10 @@ class KanjiKanaBox extends StatelessWidget {
|
||||
style: TextStyle(
|
||||
fontSize: fFontsize,
|
||||
color: colors.foreground,
|
||||
).merge(
|
||||
romajiEnabled && autoTransliterateRomaji
|
||||
? null
|
||||
: japaneseFont.textStyle,
|
||||
),
|
||||
)
|
||||
: Text(
|
||||
@@ -77,9 +82,10 @@ class KanjiKanaBox extends StatelessWidget {
|
||||
|
||||
DefaultTextStyle.merge(
|
||||
child: hasFurigana
|
||||
? Text(word.word!)
|
||||
? Text(word.word ?? word.reading!)
|
||||
: Text(wordReading ?? word.word!),
|
||||
style: TextStyle(fontSize: kanjiFontsize),
|
||||
style: TextStyle(fontSize: kanjiFontsize)
|
||||
.merge(japaneseFont.textStyle),
|
||||
),
|
||||
if (romajiEnabled && showRomajiBelow)
|
||||
Text(
|
||||
|
||||
@@ -1,15 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:unofficial_jisho_api/api.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
Future<void> _launch(String url) async {
|
||||
if (await canLaunch(url)) {
|
||||
launch(url);
|
||||
} else {
|
||||
debugPrint('Could not open url: $url');
|
||||
}
|
||||
}
|
||||
import '../../../../services/open_webpage.dart';
|
||||
|
||||
final BoxDecoration _iconStyle = BoxDecoration(
|
||||
color: Colors.white,
|
||||
@@ -30,8 +23,8 @@ Widget _wiki({
|
||||
decoration: _iconStyle,
|
||||
margin: EdgeInsets.fromLTRB(0, 0, 10, isJapanese ? 12 : 10),
|
||||
child: IconButton(
|
||||
onPressed: () => _launch(link),
|
||||
icon: SvgPicture.asset('assets/images/wikipedia.svg'),
|
||||
onPressed: () => open_webpage(link),
|
||||
icon: SvgPicture.asset('assets/images/links/wikipedia.svg'),
|
||||
),
|
||||
),
|
||||
Container(
|
||||
@@ -56,9 +49,9 @@ Widget _wiki({
|
||||
Widget _dbpedia(String link) => Container(
|
||||
decoration: _iconStyle,
|
||||
child: IconButton(
|
||||
onPressed: () => _launch(link),
|
||||
onPressed: () => open_webpage(link),
|
||||
icon: Image.asset(
|
||||
'assets/images/dbpedia.png',
|
||||
'assets/images/links/dbpedia.png',
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -107,7 +100,7 @@ class Links extends StatelessWidget {
|
||||
final List<Widget> otherLinks = [
|
||||
for (final link in newLinks) ...[
|
||||
InkWell(
|
||||
onTap: () => _launch(link.url),
|
||||
onTap: () => open_webpage(link.url),
|
||||
child: Text(
|
||||
link.text,
|
||||
style: const TextStyle(color: Colors.blue),
|
||||
|
||||
@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||
|
||||
import '../../../../../models/themes/theme.dart';
|
||||
import '../../../../../routing/routes.dart';
|
||||
import '../../../../../settings.dart';
|
||||
import 'search_chip.dart';
|
||||
|
||||
class Antonyms extends StatelessWidget {
|
||||
@@ -41,6 +42,7 @@ class Antonyms extends StatelessWidget {
|
||||
child: SearchChip(
|
||||
text: antonym,
|
||||
colors: colors,
|
||||
extraTextStyle: japaneseFont.textStyle,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -5,11 +5,13 @@ import '../../../../../models/themes/theme.dart';
|
||||
class SearchChip extends StatelessWidget {
|
||||
final String text;
|
||||
final ColorSet colors;
|
||||
final TextStyle? extraTextStyle;
|
||||
|
||||
const SearchChip({
|
||||
Key? key,
|
||||
required this.text,
|
||||
this.colors = LightTheme.defaultMenuGreyNormal,
|
||||
this.extraTextStyle,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
@@ -21,7 +23,7 @@ class SearchChip extends StatelessWidget {
|
||||
),
|
||||
child: Text(
|
||||
text,
|
||||
style: TextStyle(color: colors.foreground),
|
||||
style: TextStyle(color: colors.foreground).merge(extraTextStyle),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:unofficial_jisho_api/api.dart';
|
||||
|
||||
import '../../../../../settings.dart';
|
||||
|
||||
class SupplementalInfo extends StatelessWidget {
|
||||
final JishoWordSense sense;
|
||||
final List<String>? supplementalInfo;
|
||||
@@ -42,6 +44,6 @@ class SupplementalInfo extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) => DefaultTextStyle.merge(
|
||||
child: Column(children: _body),
|
||||
style: TextStyle(color: color),
|
||||
style: TextStyle(color: color).merge(japaneseFont.textStyle),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:jisho_study_tool/services/kanji_regex.dart';
|
||||
import 'package:unofficial_jisho_api/api.dart';
|
||||
|
||||
import './parts/common_badge.dart';
|
||||
@@ -31,6 +32,7 @@ class SearchResultCard extends StatefulWidget {
|
||||
|
||||
class _SearchResultCardState extends State<SearchResultCard> {
|
||||
PhrasePageScrapeResultData? extraData;
|
||||
bool? extraDataSearchFailed;
|
||||
|
||||
Future<PhrasePageScrapeResult?> _scrape(JishoResult result) =>
|
||||
(!(result.japanese[0].word == null && result.japanese[0].reading == null))
|
||||
@@ -55,7 +57,7 @@ class _SearchResultCardState extends State<SearchResultCard> {
|
||||
return jlpt.last;
|
||||
}
|
||||
|
||||
List<String> get kanji => RegExp(r'(\p{Script=Hani})', unicode: true)
|
||||
List<String> get kanji => kanjiRegex
|
||||
.allMatches(
|
||||
widget.result.japanese
|
||||
.map((w) => '${w.word ?? ""}${w.reading ?? ""}')
|
||||
@@ -132,18 +134,19 @@ class _SearchResultCardState extends State<SearchResultCard> {
|
||||
if (extensiveSearchEnabled && extraData == null) {
|
||||
final data = await _scrape(widget.result);
|
||||
setState(() {
|
||||
extraData = (data != null && data.found) ? data.data : null;
|
||||
extraDataSearchFailed = !(data?.found ?? false);
|
||||
extraData = !extraDataSearchFailed! ? data!.data : null;
|
||||
});
|
||||
}
|
||||
},
|
||||
title: _header,
|
||||
children: [
|
||||
if (extensiveSearchEnabled && extraData == null)
|
||||
if (extensiveSearchEnabled && extraDataSearchFailed == null)
|
||||
const Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 10),
|
||||
child: Center(child: CircularProgressIndicator()),
|
||||
)
|
||||
else if (extraData != null)
|
||||
else if (!extraDataSearchFailed!)
|
||||
_body(extendedData: extraData)
|
||||
else
|
||||
_body()
|
||||
|
||||
@@ -1,30 +1,13 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:path/path.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:sembast/sembast.dart';
|
||||
import 'package:sembast/sembast_io.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import 'bloc/theme/theme_bloc.dart';
|
||||
import 'routing/router.dart';
|
||||
import 'services/database.dart';
|
||||
import 'services/licenses.dart';
|
||||
import 'services/preferences.dart';
|
||||
import 'settings.dart';
|
||||
|
||||
Future<void> setupDatabase() async {
|
||||
final Directory appDocDir = await getApplicationDocumentsDirectory();
|
||||
if (!appDocDir.existsSync()) appDocDir.createSync(recursive: true);
|
||||
final Database database =
|
||||
await databaseFactoryIo.openDatabase(join(appDocDir.path, 'sembast.db'));
|
||||
GetIt.instance.registerSingleton<Database>(database);
|
||||
}
|
||||
|
||||
Future<void> setupSharedPreferences() async {
|
||||
final SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||
GetIt.instance.registerSingleton<SharedPreferences>(prefs);
|
||||
}
|
||||
|
||||
Future<void> main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
@@ -33,6 +16,8 @@ Future<void> main() async {
|
||||
setupSharedPreferences(),
|
||||
]);
|
||||
|
||||
registerExtraLicenses();
|
||||
|
||||
runApp(const MyApp());
|
||||
}
|
||||
|
||||
|
||||
6
lib/migrations/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
test.db
|
||||
data/jisho
|
||||
data/radkfile
|
||||
data/kradfile
|
||||
data/0002_radicals.json
|
||||
!data/jouyou
|
||||
295
lib/migrations/0001_initial.sql
Normal file
@@ -0,0 +1,295 @@
|
||||
-- KANJI
|
||||
|
||||
CREATE TABLE Kanji_YomiExample (
|
||||
exampleID INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
example TEXT NOT NULL,
|
||||
reading TEXT NOT NULL,
|
||||
meaning TEXT NOT NULL,
|
||||
UNIQUE (example, reading, meaning)
|
||||
);
|
||||
|
||||
CREATE TABLE Kanji_Radical (
|
||||
id INTEGER NOT NULL UNIQUE,
|
||||
symbol CHAR(1) NOT NULL PRIMARY KEY,
|
||||
strokes INTEGER NOT NULL,
|
||||
meaning TEXT NOT NULL,
|
||||
searchSymbol CHAR(1)
|
||||
);
|
||||
|
||||
CREATE TABLE Kanji_Radical_Forms (
|
||||
form CHAR(1) NOT NULL PRIMARY KEY,
|
||||
radical CHAR(1) NOT NULL,
|
||||
FOREIGN KEY(radical) REFERENCES Kanji_Radical(symbol)
|
||||
);
|
||||
|
||||
CREATE TABLE Kanji_Kunyomi (
|
||||
yomi TEXT NOT NULL PRIMARY KEY
|
||||
);
|
||||
|
||||
CREATE TABLE Kanji_Onyomi (
|
||||
yomi TEXT NOT NULL PRIMARY KEY
|
||||
);
|
||||
|
||||
CREATE TABLE Kanji_Part (
|
||||
part CHAR(1) NOT NULL PRIMARY KEY
|
||||
-- FOREIGN KEY(part) REFERENCES Kanji_Radical(symbol)
|
||||
);
|
||||
|
||||
CREATE TABLE Kanji_Result (
|
||||
kanji CHAR(1) PRIMARY KEY,
|
||||
taughtIn INTEGER CHECK (taughtIn BETWEEN 1 AND 7),
|
||||
jlptLevel INTEGER CHECK (jlptLevel BETWEEN 1 AND 5),
|
||||
newspaperFrequencyRank INTEGER,
|
||||
strokeCount INTEGER NOT NULL,
|
||||
meaning INTEGER NOT NULL,
|
||||
radical CHAR(1) NOT NULL,
|
||||
isJouyou BOOLEAN NOT NULL DEFAULT false,
|
||||
FOREIGN KEY (radical) REFERENCES Kanji_Radical(symbol)
|
||||
);
|
||||
|
||||
CREATE TABLE Kanji_ResultKunyomiExample_XRef (
|
||||
exampleID INTEGER NOT NULL,
|
||||
kanji CHAR(1) NOT NULL,
|
||||
FOREIGN KEY(exampleID) REFERENCES Kanji_YomiExample(exampleID),
|
||||
FOREIGN KEY(kanji) REFERENCES Kanji_Result(kanji),
|
||||
PRIMARY KEY(exampleID, kanji)
|
||||
);
|
||||
|
||||
CREATE TABLE Kanji_ResultOnyomiExample_XRef (
|
||||
exampleID INTEGER NOT NULL,
|
||||
kanji CHAR(1) NOT NULL,
|
||||
FOREIGN KEY(exampleID) REFERENCES Kanji_YomiExample(exampleID),
|
||||
FOREIGN KEY(kanji) REFERENCES Kanji_Result(kanji),
|
||||
PRIMARY KEY(exampleID, kanji)
|
||||
);
|
||||
|
||||
CREATE TABLE Kanji_ResultKunyomi_XRef (
|
||||
yomi TEXT NOT NULL,
|
||||
kanji CHAR(1) NOT NULL,
|
||||
FOREIGN KEY(yomi) REFERENCES Kanji_Kunyomi(yomi),
|
||||
FOREIGN KEY(kanji) REFERENCES Kanji_Result(kanji),
|
||||
PRIMARY KEY(yomi, kanji)
|
||||
);
|
||||
|
||||
CREATE TABLE Kanji_ResultOnyomi_XRef (
|
||||
yomi TEXT NOT NULL,
|
||||
kanji CHAR(1) NOT NULL,
|
||||
FOREIGN KEY(yomi) REFERENCES Kanji_Onyomi(yomi),
|
||||
FOREIGN KEY(kanji) REFERENCES Kanji_Result(kanji),
|
||||
PRIMARY KEY(yomi, kanji)
|
||||
);
|
||||
|
||||
CREATE TABLE Kanji_ResultPart_XRef (
|
||||
part CHAR(1) NOT NULL,
|
||||
kanji CHAR(1) NOT NULL,
|
||||
FOREIGN KEY(part) REFERENCES Kanji_Part(part),
|
||||
FOREIGN KEY(kanji) REFERENCES Kanji_Result(kanji),
|
||||
PRIMARY KEY(part, kanji)
|
||||
);
|
||||
|
||||
-- RADKFILE
|
||||
|
||||
CREATE TABLE RADKFILE (
|
||||
kanji CHAR(1) NOT NULL,
|
||||
radical CHAR(1) NOT NULL,
|
||||
FOREIGN KEY(radical) REFERENCES Kanji_Radical(symbol)
|
||||
);
|
||||
|
||||
CREATE INDEX RADK ON RADKFILE (radical);
|
||||
CREATE INDEX KRAD ON RADKFILE (kanji);
|
||||
|
||||
-- Example Sentence
|
||||
|
||||
CREATE TABLE ExampleSentence_Result (
|
||||
resultID INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
kanji TEXT NOT NULL,
|
||||
kana TEXT NOT NULL,
|
||||
english TEXT NOT NULL
|
||||
);
|
||||
|
||||
CREATE TABLE ExampleSentence_Piece (
|
||||
orderNum INTEGER NOT NULL,
|
||||
lifted TEXT,
|
||||
unlifted TEXT NOT NULL,
|
||||
resultID INTEGER NOT NULL,
|
||||
FOREIGN KEY(resultID) REFERENCES ExampleSentence_Result(resultID),
|
||||
PRIMARY KEY(resultID, orderNum)
|
||||
);
|
||||
|
||||
-- Words
|
||||
|
||||
CREATE TABLE PhraseScrape_Result (
|
||||
uri TEXT NOT NULL PRIMARY KEY
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_Sentence (
|
||||
english TEXT NOT NULL,
|
||||
japanese TEXT NOT NULL,
|
||||
PRIMARY KEY (english, japanese)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_Sentence_Piece (
|
||||
orderNum INTEGER NOT NULL,
|
||||
lifted TEXT,
|
||||
unlifted TEXT NOT NULL,
|
||||
sentenceEnglish TEXT NOT NULL,
|
||||
sentenceJapanese TEXT NOT NULL,
|
||||
FOREIGN KEY(sentenceEnglish, sentenceJapanese) REFERENCES PhraseScrape_Sentence(english, japanese) ON DELETE CASCADE,
|
||||
PRIMARY KEY (sentenceEnglish, sentenceJapanese, orderNum)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_Meaning_SeeAlsoTerm (
|
||||
seeAlsoTerm TEXT NOT NULL,
|
||||
meaningDefinition TEXT NOT NULL,
|
||||
resultUri TEXT NOT NULL,
|
||||
FOREIGN KEY (meaningDefinition, resultUri) REFERENCES PhraseScrape_Meaning (definition, resultUri) ON DELETE CASCADE,
|
||||
PRIMARY KEY (seeAlsoTerm, meaningDefinition, resultUri)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_Meaning_Supplemental (
|
||||
supplemental TEXT NOT NULL,
|
||||
meaningDefinition TEXT NOT NULL,
|
||||
resultUri TEXT NOT NULL,
|
||||
FOREIGN KEY (meaningDefinition, resultUri) REFERENCES PhraseScrape_Meaning (definition, resultUri) ON DELETE CASCADE,
|
||||
PRIMARY KEY (supplemental, meaningDefinition, resultUri)
|
||||
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_Meaning_Tag (
|
||||
tag TEXT NOT NULL,
|
||||
meaningDefinition TEXT NOT NULL,
|
||||
resultUri TEXT NOT NULL,
|
||||
FOREIGN KEY (meaningDefinition, resultUri) REFERENCES PhraseScrape_Meaning (definition, resultUri) ON DELETE CASCADE,
|
||||
PRIMARY KEY (tag, meaningDefinition, resultUri)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_Meaning (
|
||||
definition TEXT NOT NULL,
|
||||
definitionAbstract TEXT,
|
||||
resultUri TEXT NOT NULL,
|
||||
FOREIGN KEY(resultUri) REFERENCES PhraseScrape_Result(uri) ON DELETE CASCADE,
|
||||
PRIMARY KEY(definition,resultUri)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_MeaningSentence_XRef (
|
||||
sentenceEnglish TEXT NOT NULL,
|
||||
sentenceJapanese TEXT NOT NULL,
|
||||
resultUri TEXT NOT NULL,
|
||||
FOREIGN KEY(resultUri) REFERENCES PhraseScrape_Result(uri) ON DELETE CASCADE,
|
||||
FOREIGN KEY(sentenceEnglish, sentenceJapanese) REFERENCES PhraseScrape_Sentence(english, japanese) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_KanjiKanaPair (
|
||||
kanji TEXT NOT NULL,
|
||||
kana TEXT,
|
||||
resultUri TEXT NOT NULL,
|
||||
FOREIGN KEY(resultUri) REFERENCES PhraseScrape_Result(uri) ON DELETE CASCADE,
|
||||
PRIMARY KEY (kanji, kana, resultUri)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_AudioFile (
|
||||
uri TEXT NOT NULL PRIMARY KEY,
|
||||
mimetype TEXT NOT NULL,
|
||||
resultUri TEXT NOT NULL,
|
||||
FOREIGN KEY(resultUri) REFERENCES PhraseScrape_Result(uri) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_Note (
|
||||
note TEXT NOT NULL,
|
||||
resultUri TEXT NOT NULL,
|
||||
FOREIGN KEY(resultUri) REFERENCES PhraseScrape_Result(uri) ON DELETE CASCADE,
|
||||
PRIMARY KEY (note, resultUri)
|
||||
);
|
||||
|
||||
-- API
|
||||
|
||||
CREATE TABLE PhraseSearch_JishoResult (
|
||||
slug TEXT NOT NULL PRIMARY KEY,
|
||||
isCommon BOOLEAN
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_JishoResult_Tag (
|
||||
tag TEXT NOT NULL,
|
||||
resultSlug TEXT NOT NULl,
|
||||
FOREIGN KEY(resultSlug) REFERENCES PhraseSearch_JishoResult(slug) ON DELETE CASCADE,
|
||||
PRIMARY KEY (tag, resultSlug)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseScrape_JishoResult_Jlpt (
|
||||
jlpt TEXT NOT NULL,
|
||||
resultSlug TEXT NOT NULl,
|
||||
FOREIGN KEY(resultSlug) REFERENCES PhraseSearch_JishoResult(slug) ON DELETE CASCADE,
|
||||
PRIMARY KEY (jlpt, resultSlug)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseSearch_JapaneseWord (
|
||||
word TEXT,
|
||||
reading TEXT,
|
||||
resultSlug TEXT NOT NULl,
|
||||
FOREIGN KEY(resultSlug) REFERENCES PhraseSearch_JishoResult(slug) ON DELETE CASCADE,
|
||||
PRIMARY KEY (word, reading, resultSlug),
|
||||
CHECK (word NOT NULL OR reading NOT NULL)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseSearch_WordSense (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseSearch_WordSense_Link (
|
||||
text TEXT NOT NULL,
|
||||
url TEXT NOT NULL,
|
||||
senseID INTEGER NOT NULL,
|
||||
FOREIGN KEY(senseID) REFERENCES PhraseSearch_WordSense(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY(url, senseID)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseSearch_WordSense_Tag (
|
||||
tag TEXT NOT NULL,
|
||||
senseID INTEGER NOT NULL,
|
||||
FOREIGN KEY(senseID) REFERENCES PhraseSearch_WordSense(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (tag, senseID)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseSearch_WordSense_SeeAlso (
|
||||
seeAlso TEXT NOT NULL,
|
||||
senseID INTEGER NOT NULL,
|
||||
FOREIGN KEY(senseID) REFERENCES PhraseSearch_WordSense(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (seeAlso, senseID)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseSearch_WordSense_Antonym (
|
||||
antonym TEXT NOT NULL,
|
||||
senseID INTEGER NOT NULL,
|
||||
FOREIGN KEY(senseID) REFERENCES PhraseSearch_WordSense(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (antonym, senseID)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseSearch_WordSense_Source (
|
||||
language TEXT NOT NULL,
|
||||
word TEXT,
|
||||
senseID INTEGER NOT NULL,
|
||||
FOREIGN KEY(senseID) REFERENCES PhraseSearch_WordSense(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (language, senseID)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseSearch_WordSense_Info (
|
||||
info TEXT NOT NULL,
|
||||
senseID INTEGER NOT NULL,
|
||||
FOREIGN KEY(senseID) REFERENCES PhraseSearch_WordSense(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (info, senseID)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseSearch_WordSense_Restriction (
|
||||
restriction TEXT NOT NULL,
|
||||
senseID INTEGER NOT NULL,
|
||||
FOREIGN KEY(senseID) REFERENCES PhraseSearch_WordSense(id) ON DELETE CASCADE,
|
||||
PRIMARY KEY (restriction, senseID)
|
||||
);
|
||||
|
||||
CREATE TABLE PhraseSearch_Attribution (
|
||||
jmdict BOOLEAN NOT NULL,
|
||||
jmnedict BOOLEAN NOT NULL,
|
||||
dbpedia TEXT,
|
||||
resultSlug TEXT NOT NULl PRIMARY KEY,
|
||||
FOREIGN KEY(resultSlug) REFERENCES PhraseSearch_JishoResult(slug) ON DELETE CASCADE
|
||||
);
|
||||
254
lib/migrations/0002_populate_radicals.sql
Normal file
@@ -0,0 +1,254 @@
|
||||
INSERT INTO Kanji_Radical(id, symbol, strokes, meaning, searchSymbol) VALUES
|
||||
(1, '一', 1, 'one', NULL),
|
||||
(2, '|', 1, 'line', NULL),
|
||||
(3, '丶', 1, 'dot', NULL),
|
||||
(4, 'ノ', 1, 'slash', NULL),
|
||||
(5, '乙', 1, 'second', NULL),
|
||||
(6, '亅', 1, 'hook', NULL),
|
||||
(7, '二', 2, 'two', NULL),
|
||||
(8, '亠', 2, 'lid', NULL),
|
||||
(9, '人', 2, 'man, human', NULL),
|
||||
(10, '⺅', 2, 'man, human', '化'),
|
||||
(11, '𠆢', 2, 'man, human', '个'),
|
||||
(12, '儿', 2, 'legs', NULL),
|
||||
(13, '入', 2, 'enter', NULL),
|
||||
(14, 'ハ', 2, 'eight', NULL),
|
||||
(15, '丷', 2, 'eight', '并'),
|
||||
(16, '冂', 2, 'open country', NULL),
|
||||
(17, '冖', 2, 'cover', NULL),
|
||||
(18, '冫', 2, 'ice', NULL),
|
||||
(19, '几', 2, 'table', NULL),
|
||||
(20, '凵', 2, 'container, open mouth', NULL),
|
||||
(21, '刀', 2, 'knife, sword', NULL),
|
||||
(22, '⺉', 2, 'knife, sword', '刈'),
|
||||
(23, '力', 2, 'power, force', NULL),
|
||||
(24, '勹', 2, 'wrap, embrace', NULL),
|
||||
(25, '匕', 2, 'spoon', NULL),
|
||||
(26, '匚', 2, 'box', NULL),
|
||||
(27, '十', 2, 'ten, complete', NULL),
|
||||
(28, '卜', 2, 'divination', NULL),
|
||||
(29, '卩', 2, 'kneel', NULL),
|
||||
(30, '厂', 2, 'cliff', NULL),
|
||||
(31, '厶', 2, 'private', NULL),
|
||||
(32, '又', 2, 'right hand', NULL),
|
||||
(33, 'マ', 2, 'katakana, jisho search radical', NULL),
|
||||
(34, '九', 2, 'second', NULL),
|
||||
(35, 'ユ', 2, 'katakana, jisho search radical', NULL),
|
||||
(36, '乃', 2, 'slash', NULL),
|
||||
(360, '𠂉', 2, 'slash', '乞'),
|
||||
(37, '⻌', 3, 'walk', '込'),
|
||||
(38, '口', 3, 'mouth, opening', NULL),
|
||||
(39, '囗', 3, 'enclosure', NULL),
|
||||
(40, '土', 3, 'earth', NULL),
|
||||
(41, '士', 3, 'scholar, bachelor', NULL),
|
||||
(42, '夂', 3, 'go', NULL),
|
||||
(43, '夕', 3, 'evening, sunset', NULL),
|
||||
(44, '大', 3, 'big, very', NULL),
|
||||
(45, '女', 3, 'woman, female', NULL),
|
||||
(46, '子', 3, 'child, seed', NULL),
|
||||
(47, '宀', 3, 'roof', NULL),
|
||||
(48, '寸', 3, 'thumb, inch', NULL),
|
||||
(49, '小', 3, 'small, insignificant', NULL),
|
||||
(50, '⺌', 3, 'small, insignificant', '尚'),
|
||||
(51, '尢', 3, 'lame', NULL),
|
||||
(52, '尸', 3, 'corpse', NULL),
|
||||
(53, '屮', 3, 'sprout', NULL),
|
||||
(54, '山', 3, 'mountain', NULL),
|
||||
(55, '川', 3, 'river', NULL),
|
||||
(56, '巛', 3, 'river', NULL),
|
||||
(57, '工', 3, 'work', NULL),
|
||||
(58, '已', 3, 'oneself', NULL),
|
||||
(59, '巾', 3, 'turban, scarf', NULL),
|
||||
(60, '干', 3, 'pestle', NULL),
|
||||
(61, '幺', 3, 'short, tiny', NULL),
|
||||
(62, '广', 3, 'house on cliff', NULL),
|
||||
(63, '廴', 3, 'long stride', NULL),
|
||||
(64, '廾', 3, 'two hands, twenty', NULL),
|
||||
(65, '弋', 3, 'shoot, arrow', NULL),
|
||||
(66, '弓', 3, 'bow', NULL),
|
||||
(67, 'ヨ', 3, 'pig snout', NULL),
|
||||
(68, '彑', 3, 'pig snout', NULL),
|
||||
(69, '彡', 3, 'bristle, beard', NULL),
|
||||
(70, '彳', 3, 'step', NULL),
|
||||
(71, '⺖', 3, 'heart', '忙'),
|
||||
(72, '⺘', 3, 'hand', '扎'),
|
||||
(73, '⺡', 3, 'water', '汁'),
|
||||
(74, '⺨', 3, 'dog', '犯'),
|
||||
(75, '⺾', 3, 'grass', '艾'),
|
||||
(76, '⻏', 3, 'town (阝 right)', '邦'),
|
||||
(77, '⻖', 3, 'mound, dam (阝 left)', '阡'),
|
||||
(78, '也', 3, 'second', NULL),
|
||||
(79, '亡', 3, 'lid', NULL),
|
||||
(80, '及', 3, 'right hand', NULL),
|
||||
(81, '久', 3, 'slash', NULL),
|
||||
(82, '⺹', 4, 'old', '老'),
|
||||
(83, '心', 4, 'heart', NULL),
|
||||
(84, '戈', 4, 'spear, halberd', NULL),
|
||||
(85, '戸', 4, 'door, house', NULL),
|
||||
(86, '手', 4, 'hand', NULL),
|
||||
(87, '支', 4, 'branch', NULL),
|
||||
(88, '攵', 4, 'rap', NULL),
|
||||
(89, '文', 4, 'script, literature', NULL),
|
||||
(90, '斗', 4, 'dipper', NULL),
|
||||
(91, '斤', 4, 'axe', NULL),
|
||||
(92, '方', 4, 'square', NULL),
|
||||
(93, '无', 4, 'perish', NULL),
|
||||
(94, '日', 4, 'sun, day', NULL),
|
||||
(95, '曰', 4, 'say', NULL),
|
||||
(96, '月', 4, 'moon, month', NULL),
|
||||
(97, '木', 4, 'tree', NULL),
|
||||
(98, '欠', 4, 'lack, yawn', NULL),
|
||||
(99, '止', 4, 'stop', NULL),
|
||||
(100, '歹', 4, 'death, decay', NULL),
|
||||
(101, '殳', 4, 'weapon, lance', NULL),
|
||||
(102, '比', 4, 'compare, compete', NULL),
|
||||
(103, '毛', 4, 'fur, hair', NULL),
|
||||
(104, '氏', 4, 'clan', NULL),
|
||||
(105, '气', 4, 'steam, breath', NULL),
|
||||
(106, '水', 4, 'water', NULL),
|
||||
(107, '火', 4, 'fire', NULL),
|
||||
(108, '⺣', 4, 'fire', '杰'),
|
||||
(109, '爪', 4, 'claw', NULL),
|
||||
(110, '父', 4, 'father', NULL),
|
||||
(111, '爻', 4, 'mix, twine, cross', NULL),
|
||||
(112, '爿', 4, 'split wood', NULL),
|
||||
(113, '片', 4, 'slice', NULL),
|
||||
(114, '牛', 4, 'cow', NULL),
|
||||
(115, '犬', 4, 'dog', NULL),
|
||||
(116, '⺭', 4, 'sign', '礼'),
|
||||
(117, '王', 4, 'jade (king)', NULL),
|
||||
(118, '元', 4, 'legs', NULL),
|
||||
(119, '井', 4, 'two', NULL),
|
||||
(120, '勿', 4, 'wrap, embrace', NULL),
|
||||
(121, '尤', 4, 'lame', NULL),
|
||||
(122, '五', 4, 'two', NULL),
|
||||
(123, '屯', 4, 'sprout', NULL),
|
||||
(124, '巴', 4, 'oneself', NULL),
|
||||
(125, '毋', 4, 'mother, do not', NULL),
|
||||
(126, '玄', 5, 'dark, profound', NULL),
|
||||
(127, '瓦', 5, 'tile', NULL),
|
||||
(128, '甘', 5, 'sweet', NULL),
|
||||
(129, '生', 5, 'life', NULL),
|
||||
(130, '用', 5, 'use', NULL),
|
||||
(131, '田', 5, 'field', NULL),
|
||||
(132, '疋', 5, 'bolt of cloth', NULL),
|
||||
(133, '疒', 5, 'sickness', '疔'),
|
||||
(134, '癶', 5, 'footsteps', NULL),
|
||||
(135, '白', 5, 'white', NULL),
|
||||
(136, '皮', 5, 'skin', NULL),
|
||||
(137, '皿', 5, 'dish', NULL),
|
||||
(138, '目', 5, 'eye', NULL),
|
||||
(139, '矛', 5, 'spear', NULL),
|
||||
(140, '矢', 5, 'arrow', NULL),
|
||||
(141, '石', 5, 'stone', NULL),
|
||||
(142, '示', 5, 'sign', NULL),
|
||||
(143, '禸', 5, 'track', '禹'),
|
||||
(144, '禾', 5, 'grain', NULL),
|
||||
(145, '穴', 5, 'cave', NULL),
|
||||
(146, '立', 5, 'stand, erect', NULL),
|
||||
(147, '⻂', 5, 'clothes', '初'),
|
||||
(148, '世', 5, 'one', NULL),
|
||||
(149, '巨', 5, 'work', NULL),
|
||||
(150, '冊', 5, 'open country', NULL),
|
||||
(151, '母', 5, 'mother, do not', NULL),
|
||||
(152, '⺲', 5, 'net', '買'),
|
||||
(153, '牙', 5, 'fang', NULL),
|
||||
(154, '瓜', 6, 'melon', NULL),
|
||||
(155, '竹', 6, 'bamboo', NULL),
|
||||
(156, '米', 6, 'rice', NULL),
|
||||
(157, '糸', 6, 'silk', NULL),
|
||||
(158, '缶', 6, 'jar', NULL),
|
||||
(159, '羊', 6, 'sheep', NULL),
|
||||
(160, '羽', 6, 'feather', NULL),
|
||||
(161, '而', 6, 'beard', NULL),
|
||||
(162, '耒', 6, 'plow', NULL),
|
||||
(163, '耳', 6, 'ear', NULL),
|
||||
(164, '聿', 6, 'brush', NULL),
|
||||
(165, '肉', 6, 'meat', NULL),
|
||||
(166, '自', 6, 'self', NULL),
|
||||
(167, '至', 6, 'arrive', NULL),
|
||||
(168, '臼', 6, 'mortar', NULL),
|
||||
(169, '舌', 6, 'tongue', NULL),
|
||||
(170, '舟', 6, 'boat', NULL),
|
||||
(171, '艮', 6, 'stopping', NULL),
|
||||
(172, '色', 6, 'colour, prettiness', NULL),
|
||||
(173, '虍', 6, 'tiger stripes', NULL),
|
||||
(174, '虫', 6, 'insect', NULL),
|
||||
(175, '血', 6, 'blood', NULL),
|
||||
(176, '行', 6, 'go, do', NULL),
|
||||
(177, '衣', 6, 'clothes', NULL),
|
||||
(178, '西', 6, 'west', NULL),
|
||||
(179, '臣', 7, 'minster, official', NULL),
|
||||
(180, '見', 7, 'see', NULL),
|
||||
(181, '角', 7, 'horn', NULL),
|
||||
(182, '言', 7, 'speech', NULL),
|
||||
(183, '谷', 7, 'valley', NULL),
|
||||
(184, '豆', 7, 'bean', NULL),
|
||||
(185, '豕', 7, 'pig', NULL),
|
||||
(186, '豸', 7, 'cat, badger', NULL),
|
||||
(187, '貝', 7, 'shell', NULL),
|
||||
(188, '赤', 7, 'red, naked', NULL),
|
||||
(189, '走', 7, 'run', NULL),
|
||||
(190, '足', 7, 'foot', NULL),
|
||||
(191, '身', 7, 'body', NULL),
|
||||
(192, '車', 7, 'cart, car', NULL),
|
||||
(193, '辛', 7, 'bitter', NULL),
|
||||
(194, '辰', 7, 'morning', NULL),
|
||||
(195, '酉', 7, 'wine, alcohol', NULL),
|
||||
(196, '釆', 7, 'divide, distinguish, choose', NULL),
|
||||
(197, '里', 7, 'village, mile', NULL),
|
||||
(198, '舛', 7, 'opposite', NULL),
|
||||
(199, '麦', 7, 'wheat', NULL),
|
||||
(200, '金', 8, 'metal, gold', NULL),
|
||||
(201, '長', 8, 'long, grow', NULL),
|
||||
(202, '門', 8, 'gate', NULL),
|
||||
(203, '隶', 8, 'slave, capture', NULL),
|
||||
(204, '隹', 8, 'small bird', NULL),
|
||||
(205, '雨', 8, 'rain', NULL),
|
||||
(206, '青', 8, 'blue', NULL),
|
||||
(207, '非', 8, 'wrong', NULL),
|
||||
(208, '奄', 8, 'big, very', NULL),
|
||||
(209, '岡', 8, 'mountain', NULL),
|
||||
(210, '免', 8, 'legs', NULL),
|
||||
(211, '斉', 8, 'script, literature', NULL),
|
||||
(212, '面', 9, 'face', NULL),
|
||||
(213, '革', 9, 'leather, rawhide', NULL),
|
||||
(214, '韭', 9, 'leek', NULL),
|
||||
(215, '音', 9, 'sound', NULL),
|
||||
(216, '頁', 9, 'leaf', NULL),
|
||||
(217, '風', 9, 'wind', NULL),
|
||||
(218, '飛', 9, 'fly', NULL),
|
||||
(219, '食', 9, 'eat, food', NULL),
|
||||
(220, '首', 9, 'head', NULL),
|
||||
(221, '香', 9, 'fragrance', NULL),
|
||||
(222, '品', 9, 'mouth, opening', NULL),
|
||||
(223, '馬', 10, 'horse', NULL),
|
||||
(224, '骨', 10, 'bone', NULL),
|
||||
(225, '高', 10, 'tall', NULL),
|
||||
(226, '髟', 10, 'long hair', NULL),
|
||||
(227, '鬥', 10, 'fight', NULL),
|
||||
(228, '鬯', 10, 'herbs, sacrificial wine', NULL),
|
||||
(229, '鬲', 10, 'tripod, cauldron', NULL),
|
||||
(230, '鬼', 10, 'ghost, demon', NULL),
|
||||
(231, '竜', 10, 'stand, erect', NULL),
|
||||
(232, '韋', 10, 'tanned leather', NULL),
|
||||
(233, '魚', 11, 'fish', NULL),
|
||||
(234, '鳥', 11, 'bird', NULL),
|
||||
(235, '鹵', 11, 'salt', NULL),
|
||||
(236, '鹿', 11, 'deer', NULL),
|
||||
(237, '麻', 11, 'hemp, flax', NULL),
|
||||
(238, '亀', 11, 'second', NULL),
|
||||
(239, '啇', 11, 'mouth, opening', '滴'),
|
||||
(240, '黄', 11, 'yellow', NULL),
|
||||
(241, '黒', 11, 'black', NULL),
|
||||
(242, '黍', 12, 'millet', NULL),
|
||||
(243, '黹', 12, 'embroidery, needlework', NULL),
|
||||
(244, '無', 12, 'fire', NULL),
|
||||
(245, '歯', 12, 'stop', NULL),
|
||||
(246, '黽', 13, 'frog, amphibian', NULL),
|
||||
(247, '鼎', 13, 'tripod', NULL),
|
||||
(248, '鼓', 13, 'drum', NULL),
|
||||
(249, '鼠', 13, 'rat, mouse', NULL),
|
||||
(250, '鼻', 14, 'nose', NULL),
|
||||
(251, '齊', 14, 'even, uniformly', NULL),
|
||||
(252, '龠', 17, 'flute', NULL);
|
||||
24557
lib/migrations/0003_populate_radkfile.sql
Normal file
52987
lib/migrations/0004_populate_jouyou_kanji.sql
Normal file
18
lib/migrations/Makefile
Normal file
@@ -0,0 +1,18 @@
|
||||
DB_NAME=test.db
|
||||
|
||||
all: clean dart
|
||||
sqlite3 $(DB_NAME) < 0001_initial.sql
|
||||
sqlite3 $(DB_NAME) < 0002_populate_radicals.sql
|
||||
sqlite3 $(DB_NAME) < 0003_populate_radkfile.sql
|
||||
sqlite3 $(DB_NAME) < 0004_populate_jouyou_kanji.sql
|
||||
|
||||
convert_kradk:
|
||||
iconv -f EUC-JP -t UTF-8 -o data/radkfile_utf8 data/radkfile
|
||||
|
||||
dart:
|
||||
dart run tools/update_0002.dart
|
||||
dart run tools/update_0003.dart
|
||||
dart run tools/update_0004.dart
|
||||
|
||||
clean:
|
||||
rm test.db || true
|
||||
1
lib/migrations/data/jouyou/grade1.txt
Normal file
@@ -0,0 +1 @@
|
||||
一右雨円王音下火花貝学気九休玉金空月犬見五口校左三山子四糸字耳七車手十出女小上森人水正生青夕石赤千川先早草足村大男竹中虫町天田土二日入年白八百文木本名目立力林六
|
||||
1
lib/migrations/data/jouyou/grade2.txt
Normal file
@@ -0,0 +1 @@
|
||||
引羽雲園遠何科夏家歌画回会海絵外角楽活間丸岩顔汽記帰弓牛魚京強教近兄形計元言原戸古午後語工公広交光考行高黄合谷国黒今才細作算止市矢姉思紙寺自時室社弱首秋週春書少場色食心新親図数西声星晴切雪船線前組走多太体台地池知茶昼長鳥朝直通弟店点電刀冬当東答頭同道読内南肉馬売買麦半番父風分聞米歩母方北毎妹万明鳴毛門夜野友用曜来里理話
|
||||
1
lib/migrations/data/jouyou/grade3.txt
Normal file
@@ -0,0 +1 @@
|
||||
悪安暗医委意育員院飲運泳駅央横屋温化荷界開階寒感漢館岸起期客究急級宮球去橋業曲局銀区苦具君係軽血決研県庫湖向幸港号根祭皿仕死使始指歯詩次事持式実写者主守取酒受州拾終習集住重宿所暑助昭消商章勝乗植申身神真深進世整昔全相送想息速族他打対待代第題炭短談着注柱丁帳調追定庭笛鉄転都度投豆島湯登等動童農波配倍箱畑発反坂板皮悲美鼻筆氷表秒病品負部服福物平返勉放味命面問役薬由油有遊予羊洋葉陽様落流旅両緑礼列練路和
|
||||
1
lib/migrations/data/jouyou/grade4.txt
Normal file
@@ -0,0 +1 @@
|
||||
愛案以衣位茨印英栄媛塩岡億加果貨課芽賀改械害街各覚潟完官管関観願岐希季旗器機議求泣給挙漁共協鏡競極熊訓軍郡群径景芸欠結建健験固功好香候康佐差菜最埼材崎昨札刷察参産散残氏司試児治滋辞鹿失借種周祝順初松笑唱焼照城縄臣信井成省清静席積折節説浅戦選然争倉巣束側続卒孫帯隊達単置仲沖兆低底的典伝徒努灯働特徳栃奈梨熱念敗梅博阪飯飛必票標不夫付府阜富副兵別辺変便包法望牧末満未民無約勇要養浴利陸良料量輪類令冷例連老労録
|
||||
1
lib/migrations/data/jouyou/grade5.txt
Normal file
@@ -0,0 +1 @@
|
||||
圧囲移因永営衛易益液演応往桜可仮価河過快解格確額刊幹慣眼紀基寄規喜技義逆久旧救居許境均禁句型経潔件険検限現減故個護効厚耕航鉱構興講告混査再災妻採際在財罪殺雑酸賛士支史志枝師資飼示似識質舎謝授修述術準序招証象賞条状常情織職制性政勢精製税責績接設絶祖素総造像増則測属率損貸態団断築貯張停提程適統堂銅導得毒独任燃能破犯判版比肥非費備評貧布婦武復複仏粉編弁保墓報豊防貿暴脈務夢迷綿輸余容略留領歴
|
||||
1
lib/migrations/data/jouyou/grade6.txt
Normal file
@@ -0,0 +1 @@
|
||||
胃異遺域宇映延沿恩我灰拡革閣割株干巻看簡危机揮貴疑吸供胸郷勤筋系敬警劇激穴券絹権憲源厳己呼誤后孝皇紅降鋼刻穀骨困砂座済裁策冊蚕至私姿視詞誌磁射捨尺若樹収宗就衆従縦縮熟純処署諸除承将傷障蒸針仁垂推寸盛聖誠舌宣専泉洗染銭善奏窓創装層操蔵臓存尊退宅担探誕段暖値宙忠著庁頂腸潮賃痛敵展討党糖届難乳認納脳派拝背肺俳班晩否批秘俵腹奮並陛閉片補暮宝訪亡忘棒枚幕密盟模訳郵優預幼欲翌乱卵覧裏律臨朗論
|
||||
1
lib/migrations/data/jouyou/grade7.txt
Normal file
@@ -0,0 +1 @@
|
||||
亜哀挨曖握扱宛嵐依威為畏尉萎偉椅彙違維慰緯壱逸芋咽姻淫陰隠韻唄鬱畝浦詠影鋭疫悦越謁閲炎怨宴援煙猿鉛縁艶汚凹押旺欧殴翁奥憶臆虞乙俺卸穏佳苛架華菓渦嫁暇禍靴寡箇稼蚊牙瓦雅餓介戒怪拐悔皆塊楷潰壊懐諧劾崖涯慨蓋該概骸垣柿核殻郭較隔獲嚇穫岳顎掛括喝渇葛滑褐轄且釜鎌刈甘汗缶肝冠陥乾勘患貫喚堪換敢棺款閑勧寛歓監緩憾還環韓艦鑑含玩頑企伎忌奇祈軌既飢鬼亀幾棋棄毀畿輝騎宜偽欺儀戯擬犠菊吉喫詰却脚虐及丘朽臼糾嗅窮巨拒拠虚距御凶叫狂享況峡挟狭恐恭脅矯響驚仰暁凝巾斤菌琴僅緊錦謹襟吟駆惧愚偶遇隅串屈掘窟繰勲薫刑茎契恵啓掲渓蛍傾携継詣慶憬稽憩鶏迎鯨隙撃桁傑肩倹兼剣拳軒圏堅嫌献遣賢謙鍵繭顕懸幻玄弦舷股虎孤弧枯雇誇鼓錮顧互呉娯悟碁勾孔巧甲江坑抗攻更拘肯侯恒洪荒郊貢控梗喉慌硬絞項溝綱酵稿衡購乞拷剛傲豪克酷獄駒込頃昆恨婚痕紺魂墾懇沙唆詐鎖挫采砕宰栽彩斎債催塞歳載剤削柵索酢搾錯咲刹拶撮擦桟惨傘斬暫旨伺刺祉肢施恣脂紫嗣雌摯賜諮侍慈餌璽軸𠮟疾執湿嫉漆芝赦斜煮遮邪蛇酌釈爵寂朱狩殊珠腫趣寿呪需儒囚舟秀臭袖羞愁酬醜蹴襲汁充柔渋銃獣叔淑粛塾俊瞬旬巡盾准殉循潤遵庶緒如叙徐升召匠床抄肖尚昇沼宵症祥称渉紹訟掌晶焦硝粧詔奨詳彰憧衝償礁鐘丈冗浄剰畳壌嬢錠譲醸拭殖飾触嘱辱尻伸芯辛侵津唇娠振浸紳診寝慎審震薪刃尽迅甚陣尋腎須吹炊帥粋衰酔遂睡穂随髄枢崇据杉裾瀬是姓征斉牲凄逝婿誓請醒斥析脊隻惜戚跡籍拙窃摂仙占扇栓旋煎羨腺詮践箋潜遷薦繊鮮禅漸膳繕狙阻租措粗疎訴塑遡礎双壮荘捜挿桑掃曹曽爽喪痩葬僧遭槽踪燥霜騒藻憎贈即促捉俗賊遜汰妥唾堕惰駄耐怠胎泰堆袋逮替滞戴滝択沢卓拓託濯諾濁但脱奪棚誰丹旦胆淡嘆端綻鍛弾壇恥致遅痴稚緻畜逐蓄秩窒嫡抽衷酎鋳駐弔挑彫眺釣貼超跳徴嘲澄聴懲勅捗沈珍朕陳鎮椎墜塚漬坪爪鶴呈廷抵邸亭貞帝訂逓偵堤艇締諦泥摘滴溺迭哲徹撤添塡殿斗吐妬途渡塗賭奴怒到逃倒凍唐桃透悼盗陶塔搭棟痘筒稲踏謄藤闘騰洞胴瞳峠匿督篤凸突屯豚頓貪鈍曇丼那謎鍋軟尼弐匂虹尿妊忍寧捻粘悩濃把覇婆罵杯排廃輩培陪媒賠伯拍泊迫剝舶薄漠縛爆箸肌鉢髪伐抜罰閥氾帆汎伴畔般販斑搬煩頒範繁藩蛮盤妃彼披卑疲被扉碑罷避尾眉微膝肘匹泌姫漂苗描猫浜賓頻敏瓶扶怖附訃赴浮符普腐敷膚賦譜侮舞封伏幅覆払沸紛雰噴墳憤丙併柄塀幣弊蔽餅壁璧癖蔑偏遍哺捕舗募慕簿芳邦奉抱泡胞俸倣峰砲崩蜂飽褒縫乏忙坊妨房肪某冒剖紡傍帽貌膨謀頰朴睦僕墨撲没勃堀奔翻凡盆麻摩磨魔昧埋膜枕又抹慢漫魅岬蜜妙眠矛霧娘冥銘滅免麺茂妄盲耗猛網黙紋冶弥厄躍闇喩愉諭癒唯幽悠湧猶裕雄誘憂融与誉妖庸揚揺溶腰瘍踊窯擁謡抑沃翼拉裸羅雷頼絡酪辣濫藍欄吏痢履璃離慄柳竜粒隆硫侶虜慮了涼猟陵僚寮療瞭糧厘倫隣瑠涙累塁励戻鈴零霊隷齢麗暦劣烈裂恋廉錬呂炉賂露弄郎浪廊楼漏籠麓賄脇惑枠湾腕
|
||||
1
lib/migrations/data/txt/n1.txt
Normal file
@@ -0,0 +1 @@
|
||||
氏統保第結派案策基価提挙応企検藤沢裁証援施井護展態鮮視条幹独宮率衛張監環審義訴株姿閣衆評影松撃佐核整融製票渉響推請器士討攻崎督授催及憲離激摘系批郎健盟従修隊織拡故振弁就異献厳維浜遺塁邦素遣抗模雄益緊標宣昭廃伊江僚吉盛皇臨踏壊債興源儀創障継筋闘葬避司康善逮迫惑崩紀聴脱級博締救執房撤削密措志載陣我為抑幕染奈傷択秀徴弾償功拠秘拒刑塚致繰尾描鈴盤項喪伴養懸街契掲躍棄邸縮還属慮枠恵露沖緩節需射購揮充貢鹿却端賃獲郡併徹貴衝焦奪災浦析譲称納樹挑誘紛至宗促慎控智握宙俊銭渋銃操携診託撮誕侵括謝駆透津壁稲仮裂敏是排裕堅訳芝綱典賀扱顧弘看訟戒祉誉歓奏勧騒閥甲縄郷揺免既薦隣華範隠徳哲杉釈己妥威豪熊滞微隆症暫忠倉彦肝喚沿妙唱阿索誠襲懇俳柄驚麻李浩剤瀬趣陥斎貫仙慰序旬兼聖旨即柳舎偽較覇詳抵脅茂犠旗距雅飾網竜詩繁翼潟敵魅嫌斉敷擁圏酸罰滅礎腐脚潮梅尽僕桜滑孤炎賠句鋼頑鎖彩摩励縦輝蓄軸巡稼瞬砲噴誇祥牲秩帝宏唆阻泰賄撲堀菊絞縁唯膨矢耐塾漏慶猛芳懲剣彰棋丁恒揚冒之倫陳憶潜梨仁克岳概拘墓黙須偏雰遇諮狭卓亀糧簿炉牧殊殖艦輩穴奇慢鶴謀暖昌拍朗寛覆胞泣隔浄没暇肺貞靖鑑飼陰銘随烈尋稿丹啓也丘棟壌漫玄粘悟舗妊熟旭恩騰往豆遂狂岐陛緯培衰艇屈径淡抽披廷錦准暑磯奨浸剰胆繊駒虚霊帳悔諭惨虐翻墜沼据肥徐糖搭盾脈滝軌俵妨擦鯨荘諾雷漂懐勘栽拐駄添冠斜鏡聡浪亜覧詐壇勲魔酬紫曙紋卸奮欄逸涯拓眼獄尚彫穏顕巧矛垣欺釣萩粛栗愚嘉遭架鬼庶稚滋幻煮姫誓把践呈疎仰剛疾征砕謡嫁謙后嘆菌鎌巣頻琴班棚潔酷宰廊寂辰霞伏碁俗漠邪晶墨鎮洞履劣那殴娠奉憂朴亭淳怪鳩酔惜穫佳潤悼乏該赴桑桂髄虎盆晋穂壮堤飢傍疫累痴搬晃癒桐寸郭尿凶吐宴鷹賓虜陶鐘憾猪紘磁弥昆粗訂芽庄傘敦騎寧循忍怠如寮祐鵬鉛珠凝苗獣哀跳匠垂蛇澄縫僧眺亘呉凡憩媛溝恭刈睡錯伯笹穀陵霧魂弊妃舶餓窮掌麗綾臭悦刃縛暦宜盲粋辱毅轄猿弦稔窒炊洪摂飽冗桃狩朱渦紳枢碑鍛刀鼓裸猶塊旋弓幣膜扇腸槽慈楊伐駿漬糾亮墳坪紺娯椿舌羅峡俸厘峰圭醸蓮弔乙汁尼遍衡薫猟羊款閲偵喝敢胎酵憤豚遮扉硫赦窃泡瑞又慨紡恨肪扶戯伍忌濁奔斗蘭迅肖鉢朽殻享秦茅藩沙輔媒鶏禅嘱胴迭挿嵐椎絹陪剖譜郁悠淑帆暁傑楠笛玲奴錠拳翔遷拙侍尺峠篤肇渇叔雌亨堪叙酢吟逓嶺甚喬崇漆岬癖愉寅礁乃洲屯樺槙姻巌擬塀唇睦閑胡幽峻曹詠卑侮鋳抹尉槻隷禍蝶酪茎帥逝汽琢匿襟蛍蕉寡琉痢庸朋坑藍賊搾畔遼唄孔橘漱呂拷嬢苑巽杜渓翁廉謹瞳湧欣窯褒醜升殉煩巴禎劾租堕桟稜婿倭斐慕矯罷囚某虹魁泌鴻赳於蚊漸厄葵禄藻嫡孟嚇尭凸巳韻暢硝霜芹勅棺杏鳳儒慧馨楼愁匡彬欽眉褐薪嵯賜繕綜翠栓榛鮎艶凹蔦惣隼錬衷渚斥逐芙稀皐詔惟雛耀佑渥黛宵憧惇妄甫脩蚕酌蒼嬉頒暉肢只凱檀謄彗丑梓叶嗣絢汐伽朔抄畝黎爽蛮惰旺冴偲萌瑠壱侯允鯉蒔遥弧瑛舜彪附但卯芋綺凌茜洸皓婆毬鯛緋邑怜碧倣穣啄悌酉柚倹亦繭采詢賦紗玖眸錘弐倖諄笙痘裟侃爾洵昴耗莞銑碩伶滉宥伎晏迪朕且綸晨竣燦吏頌麿楓箇梧琳澪哉晟匁凪衿丙梢茄颯恕勺瑚蕗瞭遵虞燎侑柊斤謁捺嵩茉蓉燿袈冶誼墾栞菖勁椋旦紬叡凜胤爵亥麟脹汰莉瑳瑶椰耶丞絃奎璃昂塑熙柾諒菫崚鞠捷濫
|
||||
1
lib/migrations/data/txt/n2.txt
Normal file
@@ -0,0 +1 @@
|
||||
党協総区領県設改府査委軍団各島革村勢減再税営比防補境導副算輸述線農州武象域額欧担準賞辺造被技低復移個門課脳極含蔵量型況針専谷史階管兵接細効丸湾録省旧橋岸周材戸央券編捜竹超並療採森競介根販歴将幅般貿講林装諸劇河航鉄児禁印逆換久短油暴輪占植清倍均億圧芸署伸停爆陸玉波帯延羽固則乱普測豊厚齢囲卒略承順岩練軽了庁城患層版令角絡損募裏仏績築貨混昇池血温季星永著誌庫刊像香坂底布寺宇巨震希触依籍汚枚複郵仲栄札板骨傾届巻燃跡包駐弱紹雇替預焼簡章臓律贈照薄群秒奥詰双刺純翌快片敬悩泉皮漁荒貯硬埋柱祭袋筆訓浴童宝封胸砂塩賢腕兆床毛緑尊祝柔殿濃液衣肩零幼荷泊黄甘臣浅掃雲掘捨軟沈凍乳恋紅郊腰炭踊冊勇械菜珍卵湖喫干虫刷湯溶鉱涙匹孫鋭枝塗軒毒叫拝氷乾棒祈拾粉糸綿汗銅湿瓶咲召缶隻脂蒸肌耕鈍泥隅灯辛磨麦姓筒鼻粒詞胃畳机膚濯塔沸灰菓帽枯涼舟貝符憎皿肯燥畜挟曇滴伺
|
||||
1
lib/migrations/data/txt/n3.txt
Normal file
@@ -0,0 +1 @@
|
||||
政議民連対部合市内相定回選米実関決全表戦経最現調化当約首法性要制治務成期取都和機平加受続進数記初指権支産点報済活原共得解交資予向際勝面告反判認参利組信在件側任引求所次昨論官増係感情投示変打直両式確果容必演歳争談能位置流格疑過局放常状球職与供役構割費付由説難優夫収断石違消神番規術備宅害配警育席訪乗残想声念助労例然限追商葉伝働形景落好退頭負渡失差末守若種美命福望非観察段横深申様財港識呼達良候程満敗値突光路科積他処太客否師登易速存飛殺号単座破除完降責捕危給苦迎園具辞因馬愛富彼未舞亡冷適婦寄込顔類余王返妻背熱宿薬険頼覚船途許抜便留罪努精散静婚喜浮絶幸押倒等老曲払庭徒勤遅居雑招困欠更刻賛抱犯恐息遠戻願絵越欲痛笑互束似列探逃遊迷夢君閉緒折草暮酒悲晴掛到寝暗盗吸陽御歯忘雪吹娘誤洗慣礼窓昔貧怒泳祖杯疲皆鳴腹煙眠怖耳頂箱晩寒髪忙才靴恥偶偉猫幾
|
||||
1
lib/migrations/data/txt/n4.txt
Normal file
@@ -0,0 +1 @@
|
||||
会同事自社発者地業方新場員立開手力問代明動京目通言理体田主題意不作用度強公持野以思家世多正安院心界教文元重近考画海売知道集別物使品計死特私始朝運終台広住真有口少町料工建空急止送切転研足究楽起着店病質待試族銀早映親験英医仕去味写字答夜音注帰古歌買悪図週室歩風紙黒花春赤青館屋色走秋夏習駅洋旅服夕借曜飲肉貸堂鳥飯勉冬昼茶弟牛魚兄犬妹姉漢
|
||||
1
lib/migrations/data/txt/n5.txt
Normal file
@@ -0,0 +1 @@
|
||||
日一国人年大十二本中長出三時行見月後前生五間上東四今金九入学高円子外八六下来気小七山話女北午百書先名川千水半男西電校語土木聞食車何南万毎白天母火右読友左休父雨
|
||||