diff --git a/radselect/kanji.cpp b/radselect/kanji.cpp index dbfe1e599a3eb5ee0e88904e00089bba0dac1260..99d1e2d1d5dc1947c493e08592e1240e58a82e07 100644 --- a/radselect/kanji.cpp +++ b/radselect/kanji.cpp @@ -37,13 +37,9 @@ void Kanji::addRadical( const QString &it ) components += it; } -void Kanji::calculateStrokes( const QList &lookup ) +void Kanji::setStrokes( unsigned int strokes ) { - strokeCount = 0; - foreach( const QString &it, components ) - { - strokeCount += lookup.value( lookup.indexOf( Radical( it ) ) ).strokes(); - } + strokeCount = strokes; } const QSet& Kanji::getRadicals() const diff --git a/radselect/kanji.h b/radselect/kanji.h index c61e18db630e465db7928dd2e8be7d4c18224a93..f122250f5c09d1fbb0392262ec2e4a596f00166e 100644 --- a/radselect/kanji.h +++ b/radselect/kanji.h @@ -35,7 +35,7 @@ class Kanji : public QString , const QSet &radicals ); void addRadical( const QString &it ); - void calculateStrokes( const QList &lookup ); + void setStrokes( unsigned int strokes ); const QSet& getRadicals() const; unsigned int strokes() const; diff --git a/radselect/radicalfile.cpp b/radselect/radicalfile.cpp index b516ce14a33592ed9f8be2af20b1f51749cdee2f..e77b4eb46ffdd8c9ebfe0ac601f23493c7092f23 100644 --- a/radselect/radicalfile.cpp +++ b/radselect/radicalfile.cpp @@ -18,6 +18,8 @@ * Boston, MA 02110-1301, USA. * *****************************************************************************/ +#include "DictKanjidic/dictfilekanjidic.h" +#include "kitenmacros.h" #include "radicalfile.h" #include @@ -25,9 +27,13 @@ #include #include -RadicalFile::RadicalFile( QString &radkfile ) +RadicalFile::RadicalFile( QString &radkfile, const QString &kanjidic ) { loadRadicalFile( radkfile ); + if( ! kanjidic.isEmpty() ) + { + loadKanjidic( kanjidic ); + } } QSet RadicalFile::kanjiContainingRadicals( QSet &radicallist ) const @@ -121,12 +127,41 @@ bool RadicalFile::loadRadicalFile( QString &radkfile ) { m_kanji.insert( it.key() , Kanji( it.key() - , it.value() ) )->calculateStrokes( m_radicals.values() ); + , it.value() ) ); } f.close(); return true; } +// Mostly copied from KanjiBrowser::loadKanji() +bool RadicalFile::loadKanjidic( const QString &kanjidic ) +{ + DictFileKanjidic dictFileKanjidic; + dictFileKanjidic.loadSettings(); + dictFileKanjidic.loadDictionary( kanjidic, KANJIDIC ); + + QRegExp strokeMatch( "^S\\d+" ); + foreach( const QString &line, dictFileKanjidic.dumpDictionary() ) + { + const QString kanji = line[ 0 ]; + +#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0) + QStringList strokesSection = line.split( " ", QString::SkipEmptyParts ) +#else + QStringList strokesSection = line.split( " ", Qt::SkipEmptyParts ) +#endif + .filter( strokeMatch ); + + unsigned int strokes = strokesSection.first().remove( 0, 1 ).toInt(); + + if( m_kanji.contains( kanji ) ) { + m_kanji[ kanji ].setStrokes( strokes ); + } + } + + return true; +} + QMultiMap* RadicalFile::mapRadicalsByStrokes() const { QMultiMap *result = new QMultiMap(); diff --git a/radselect/radicalfile.h b/radselect/radicalfile.h index 92b13bfe1f6e8fd4c534384ff7ea7429d83c7101..0bfa48711c5eeb5df3a298517188d46b6c71fab1 100644 --- a/radselect/radicalfile.h +++ b/radselect/radicalfile.h @@ -33,10 +33,11 @@ class RadicalFile { public: - explicit RadicalFile( QString &radkfile ); + explicit RadicalFile( QString &radkfile, const QString &kanjidic = QString() ); QSet kanjiContainingRadicals( QSet &radicalList ) const; bool loadRadicalFile( QString &radkfile ); + bool loadKanjidic( const QString &kanjidic ); QMultiMap *mapRadicalsByStrokes() const; QSet radicalsInKanji( QSet &kanjiList ) const; diff --git a/radselect/radselectview.cpp b/radselect/radselectview.cpp index 40ca3b3d28521d76f5b5e5766b30538787c688f6..e5382ac5f049b0705e0f1f41cde2fc38c2334d44 100644 --- a/radselect/radselectview.cpp +++ b/radselect/radselectview.cpp @@ -44,6 +44,7 @@ RadSelectView::RadSelectView( QWidget *parent ) //Setup the ui from the .ui file setupUi( this ); m_radicalInfo = nullptr; + //Load the radical information QString radkfilename = QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kiten/radkfile")); if ( radkfilename.isNull() ) @@ -54,7 +55,17 @@ RadSelectView::RadSelectView( QWidget *parent ) } else { - m_radicalInfo = new RadicalFile( radkfilename ); + QString kanjidicname = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kiten/kanjidic"); + if ( kanjidicname.isNull() ) + { + KMessageBox::error( nullptr, i18n( "Kanji dictionary does not seem to " + "be installed (file kiten/kanjidic), stroke " + "count information will be unavailable." ) ); + strokes_low->setEnabled( false ); + strokes_high->setEnabled( false ); + } + + m_radicalInfo = new RadicalFile( radkfilename, kanjidicname ); } //Configure the scrolling area