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
/**********************************************************************
Copyright (C) 2008 by Chris Morley
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
***********************************************************************/
#include <openbabel/babelconfig.h>
#include <openbabel/obconversion.h>
#include <openbabel/text.h>
using namespace std;
namespace OpenBabel
{
class TextFormat : public OBFormat
{
public:
TextFormat()
{
OBConversion::RegisterFormat("text",this);
}
virtual const char* Description() //required
{
return
"Read and write raw text\n"
"Facilitates the input of boilerplate text with obabel commandline" ;
}
/////////////////////////////////////////////////////////////////
virtual bool ReadChemObject(OBConversion* pConv)
{
//Makes a new OBText
OBText* pReact = new OBText;
bool ret=ReadMolecule(pReact,pConv); //call the "API" read function
std::string auditMsg = "OpenBabel::Read text ";
std::string description(Description());
auditMsg += description.substr(0,description.find('\n'));
obErrorLog.ThrowError(__FUNCTION__,
auditMsg,
obAuditMsg);
if(ret) //Do transformation and return molecule
return pConv->AddChemObject(pReact->DoTransformations(pConv->GetOptions(OBConversion::GENOPTIONS),pConv))!=0;
else
pConv->AddChemObject(nullptr);
return false;
}
///////////////////////////////////////////////////////////////////////
virtual bool ReadMolecule(OBBase* pOb, OBConversion* pConv)
{
//It's really text, not a molecule.
OBText* pText = dynamic_cast<OBText*>(pOb);
if (!pText)
return false;
string fileText(istreambuf_iterator<char>(*pConv->GetInStream()), istreambuf_iterator<char>());
pText->SetText(fileText);
return !fileText.empty();
}
virtual bool WriteChemObject(OBConversion* pConv)
{
//Output an OBText object and delete any other type.
OBBase* pOb = pConv->GetChemObject();
OBText* pText = dynamic_cast<OBText*>(pOb);
if(!pText)
{
delete pOb;
return false;
}
else
{
ostream* ofs = pConv->GetOutStream();
if(ofs)
*ofs << pText->GetText();
return (bool)*ofs;
}
}
};
//*********************************************************************
//Make an instance of the format class
TextFormat theTextFormat;
} //namespace OpenBabel