Adobe FrameMaker FDK, 構造化されたドキュメントの要素を順にたどって要素の属性を列挙するAPI Client(C++版)
C++版
C++版 chkelemattr
C版の myelement.c をMyElementクラスに変更しただけです。 処理内容は全く同じです。
C版からC++版に変える上での必要な変更
- ファイル拡張子を .c から .cpp に変更する必要がある
- VC++ のコンパイラ cl.exe が .cpp 拡張子にしないと C++のコードとして扱ってはくれない
- 直接ソースに書いた文字列は、MyString("")で囲む必要がある
- MyStringは関数型マクロとして自前で定義したもの
- F_Printf()の第二引数では、StringTにキャストしていたものを NativeCharT* にキャストするように変更
C++版は以下の3つのファイルで構成
myelemen.h
#include "fapi.h"
#include "futils.h"
#include "fstrings.h"
#include "fstrlist.h"
class MyElement {
public:
MyElement(F_ObjHandleT docId, F_ObjHandleT elementId);
~MyElement();
StringT getElementName();
StringListT MyElement::getAttributeNameList();
StringT MyElement::getAttributeValue( StringT attrname );
private:
StringT eleName;
StringListT list;
StringT attrvalue;
F_ObjHandleT docId;
F_ObjHandleT elementId;
};
myelemen.cpp
#include "fapi.h"
#include "futils.h"
#include "fstrings.h"
#include "fstrlist.h"
#include "myelement.h"
//StringT result;
MyElement::MyElement(F_ObjHandleT mydocId, F_ObjHandleT myelementId){
docId = mydocId;
elementId = myelementId;
}
MyElement::~MyElement(){
if( eleName!=NULL )
F_Free( eleName );
if( list!=NULL )
F_StrListFree(list);
}
StringT MyElement::getElementName(){
F_ObjHandleT eltDefId = F_ApiGetId( docId, elementId, FP_ElementDef );
eleName = F_ApiGetString( docId, eltDefId, FP_Name );
return eleName;
}
StringListT MyElement::getAttributeNameList(){
IntT i;
F_AttributesT attrs;
F_AttributeT attr;
list = F_StrListNew((UIntT)1,(UIntT)1);
attrs = F_ApiGetAttributes(docId,elementId);
for (i=0; i < attrs.len; i++) {
attr = attrs.val[i];
F_StrListAppend(list,attr.name); // append attribute-name to list
}
return list;
}
StringT MyElement::getAttributeValue( StringT attrname ){
UIntT i;
F_AttributesT attrs;
F_AttributeT attr;
F_StringsT strs;
// init
attrvalue=F_StrCopyString((StringT)"");
attrs = F_ApiGetAttributes(docId,elementId);
for (i=0; i < attrs.len; i++) {
attr = attrs.val[i];
if( F_StrEqual( attrname , attr.name ) ){
strs = attr.values;
if( strs.len>0 ){
attrvalue = strs.val[0];
}
}
}
return attrvalue;
}
chkelemattr.cpp
#include "fapi.h"
#include "futils.h"
#include "fstrings.h"
#include "fstrlist.h"
#include "myelement.h"
#define ChkElemAttr 1
#define MyString(x) F_StrCopyString((StringT)x)
StringT EMPTY = MyString("");
VoidT F_ApiInitialize(IntT initialization) {
F_ObjHandleT menuBarId, menuId;
menuBarId = F_ApiGetNamedObject(FV_SessionId,FO_Menu,MyString("!MakerMainMenu"));
menuId = F_ApiDefineAndAddMenu(menuBarId,F_StrCopyString((StringT)"APIMenu"),F_StrCopyString((StringT)"myapi"));
F_ApiDefineAndAddCommand(ChkElemAttr, menuId, MyString("ChkElemAttr"), MyString("chk element attributes"), MyString(""));
}
BoolT traverseElement( F_ObjHandleT docId, F_ObjHandleT elementId ) {
StringT eleName;
IntT i;
StringListT list;
StringT attrname;
StringT attrvalue;
MyElement* myele;
if( elementId ){
for(
elementId = F_ApiGetId( docId, elementId, FP_FirstChildElement ) ;
elementId ;
elementId = F_ApiGetId( docId, elementId, FP_NextSiblingElement )
){
myele = new MyElement( docId,elementId );
eleName = myele->getElementName();
F_Printf( NULL, (NativeCharT*)"element name=%s \r\n", eleName );
list = myele->getAttributeNameList();
for(i=0; i < F_StrListLen(list); i++){
attrname = F_StrListGet(list, i);
attrvalue = myele->getAttributeValue( attrname );
if( ! F_StrEqual(attrvalue,EMPTY) ){
F_Printf( NULL, (NativeCharT*) "element attribute name =%s \r\n", attrname );
F_Printf( NULL, (NativeCharT*) "element attribute value=%s \r\n", attrvalue );
}
}
delete myele;
if( ! traverseElement( docId, elementId ) ) return False;
}
return True;
}
else{
return False;
}
}
VoidT traceStructure( F_ObjHandleT docId ) {
F_ObjHandleT flowId;
F_ObjHandleT elementId;
if( ! docId ) return;
flowId = F_ApiGetId( FV_SessionId, docId, FP_MainFlowInDoc );
elementId = F_ApiGetId( docId, flowId, FP_HighestLevelElement );
traverseElement( docId , elementId );
}
VoidT doChkAttribute(){
F_ObjHandleT docId;
docId = F_ApiGetId(0,FV_SessionId,FP_ActiveDoc);
traceStructure( docId );
}
VoidT F_ApiCommand(IntT command) {
switch (command) {
case ChkElemAttr:
doChkAttribute();
break;
}
}