File: main.cpp

package info (click to toggle)
dtkcore 5.7.12-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,728 kB
  • sloc: cpp: 22,021; ansic: 183; python: 68; xml: 58; makefile: 27; sh: 15
file content (102 lines) | stat: -rw-r--r-- 3,957 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later

#include <DTextEncoding>

#include <QCoreApplication>
#include <QCommandLineOption>
#include <QCommandLineParser>
#include <QDebug>

DCORE_USE_NAMESPACE

void convertFileEncoding(const QString &fromFile,
                         const QString &toFile,
                         const QByteArray &toEncoding,
                         const QByteArray &fromEncoding = QByteArray())
{
    QByteArray contentEncoding = fromEncoding;
    if (contentEncoding.isEmpty()) {
        bool isOk = false;
        contentEncoding = DTextEncoding::detectFileEncoding(fromFile, &isOk);
        if (!isOk) {
            qInfo().noquote() << QString("Detect file %1 encoding failed").arg(fromFile);
            return;
        }
    }

    QString errString;
    if (!DTextEncoding::convertFileEncodingTo(fromFile, toFile, toEncoding, contentEncoding, &errString)) {
        qInfo().noquote() << QString("Convert file %1 encoding from %2 to %3 failed. error: %4")
                                 .arg(fromFile)
                                 .arg(QString::fromUtf8(contentEncoding))
                                 .arg(QString::fromUtf8(toEncoding))
                                 .arg(errString);
    } else {
        qInfo().noquote() << QString("Convert file %1 encoding from %2 to %3 successed.")
                                 .arg(fromFile)
                                 .arg(QString::fromUtf8(contentEncoding))
                                 .arg(QString::fromUtf8(toEncoding));
    }
}

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QCoreApplication::setApplicationName("Text codec");

    QCommandLineOption toEncodingOption({"t", "toEncoding"}, "Convert file encoding to specified encoding.", "encoding");
    QCommandLineOption fromEncodingOption({"f", "fromEncoding"}, "Convert file encoding from specified encoding.", "encoding");
    QCommandLineOption outputOption(
        {"o", "output"}, "Save converted text with file path, only supported when opening a single file.", "path");

    QCommandLineParser parser;
    parser.setApplicationDescription("Text codec, provide encoding detection and encoding conversion.");
    parser.addHelpOption();
    parser.addOption(toEncodingOption);
    parser.addOption(fromEncodingOption);
    parser.addOption(outputOption);
    parser.addPositionalArgument("file", "Open file.", "[file...]");
    parser.process(app);

    const QStringList args = parser.positionalArguments();
    if (args.isEmpty()) {
        parser.showHelp();
    }

    const QStringList fileArgs = parser.positionalArguments();
    if (fileArgs.isEmpty()) {
        qInfo().noquote() << "Not set open file.";
        return 0;
    }

    if (parser.isSet(outputOption)) {
        if (fileArgs.size() > 1) {
            qInfo().noquote() << "Output file path only supported when opening a single file.";
            return 0;
        } else if (!parser.isSet(toEncodingOption)) {
            qInfo().noquote() << "Convert file with not set convert encoding.";
        } else {
            QString fromFile = fileArgs.first();
            QString toFile = parser.value(outputOption);
            QByteArray toEncoding = parser.value(toEncodingOption).toUtf8();

            convertFileEncoding(fromFile, toFile, toEncoding, parser.value(fromEncodingOption).toUtf8());
            return 0;
        }
    }

    QByteArray toEncoding = parser.value(toEncodingOption).toUtf8();
    for (QString fileName : fileArgs) {
        if (toEncoding.isEmpty()) {
            // Only display file encoding.
            qInfo().noquote() << fileName << DTextEncoding::detectFileEncoding(fileName);
        } else {
            // Convert file encoding.
            convertFileEncoding(fileName, fileName, toEncoding, parser.value(fromEncodingOption).toUtf8());
        }
    }

    return 0;
}