File indexing completed on 2024-04-21 15:55:31

0001 /***************************************************************************
0002     begin                : Sun Feb 29 2004
0003     copyright            : (C) 2004 by Jeroen Wijnhout
0004     email                : Jeroen.Wijnhout@kdemail.net
0005  ***************************************************************************/
0006 
0007 /***************************************************************************
0008  *                                                                         *
0009  *   This program is free software; you can redistribute it and/or modify  *
0010  *   it under the terms of the GNU General Public License as published by  *
0011  *   the Free Software Foundation; either version 2 of the License, or     *
0012  *   (at your option) any later version.                                   *
0013  *                                                                         *
0014  ***************************************************************************/
0015 
0016 #ifndef CONVERT_H
0017 #define CONVERT_H
0018 
0019 #include <QString>
0020 #include <QStringList>
0021 #include <qmap.h>
0022 
0023 #include <QUrl>
0024 
0025 namespace KTextEditor {
0026 class Document;
0027 }
0028 
0029 class ConvertMap
0030 {
0031 protected:
0032     ConvertMap(const QString & encoding);
0033 
0034 public:
0035     const QString & encoding() const {
0036         return m_aliases[0];
0037     }
0038     const QString & isoName() const {
0039         return m_aliases[1];
0040     }
0041 
0042     QChar toEncoding(const QString & enc) {
0043         return m_toEncoding[enc];
0044     }
0045     QString toASCII(const QChar & c) {
0046         return m_toASCII[c];
0047     }
0048 
0049     void addPair(QChar c, const QString & enc);
0050 
0051     bool canDecode(const QChar & c) {
0052         return ( m_toASCII.contains(c));
0053     }
0054     bool canEncode(const QString & enc) {
0055         return ( m_toEncoding.contains(enc));
0056     }
0057 
0058     bool load();
0059 
0060 private:
0061     bool commandIsTerminated(const QString &);
0062 
0063 private:
0064     QStringList             m_aliases;
0065     QMap<QChar, QString>        m_toASCII;
0066     QMap<QString, QChar>        m_toEncoding;
0067 
0068 //static members
0069 public:
0070     static bool create(const QString & encoding);
0071     static QString encodingNameFor(const QString &);
0072     static QString isoNameFor(const QString &);
0073     static ConvertMap * mapFor(const QString & enc) {
0074         return g_maps[enc];
0075     }
0076 
0077 private:
0078     static QMap<QString, ConvertMap*>   g_maps;
0079 };
0080 
0081 class ConvertIO
0082 {
0083 public:
0084     explicit ConvertIO(KTextEditor::Document *doc);
0085     virtual ~ConvertIO() {}
0086 
0087     virtual void nextLine(); //read next line
0088     virtual QString& currentLine();
0089     virtual QString& text() {
0090         return m_text;
0091     }
0092     virtual void writeText();
0093     virtual int current(); //current line number
0094     virtual bool done();
0095 
0096 protected:
0097     KTextEditor::Document   *m_doc;
0098     QString         m_text, m_line;
0099     int             m_nLine;
0100 };
0101 
0102 class ConvertIOFile : public ConvertIO
0103 {
0104 public:
0105     ConvertIOFile(KTextEditor::Document *doc, const QUrl &url);
0106 
0107     void writeText() override;
0108 
0109 private:
0110     QUrl    m_url;
0111 };
0112 
0113 class ConvertBase
0114 {
0115 public:
0116     ConvertBase(const QString & encoding, ConvertIO * io);
0117     virtual ~ConvertBase() {};
0118 
0119 public:
0120     virtual bool convert();
0121 
0122 protected:
0123     virtual bool setMap();
0124 
0125     virtual QString mapNext(int&);
0126 
0127     ConvertIO       *m_io;
0128     QString         m_encoding;
0129     ConvertMap      *m_map;
0130 };
0131 
0132 class ConvertEncToASCII : public ConvertBase
0133 {
0134 public:
0135     ConvertEncToASCII(const QString & encoding, ConvertIO * io) : ConvertBase(encoding, io) {}
0136 
0137 protected:
0138     QString mapNext(int&) override;
0139 };
0140 
0141 class ConvertASCIIToEnc : public ConvertBase
0142 {
0143 public:
0144     ConvertASCIIToEnc(const QString & encoding, ConvertIO * io) : ConvertBase(encoding, io) {}
0145 
0146 protected:
0147     QString getSequence(int&);
0148     QString nextSequence(int&);
0149     bool isModifier(const QString&);
0150     QString mapNext(int&) override;
0151 };
0152 
0153 #endif