2015-07-13 01:10:02 +00:00
/ *
XOWA : the XOWA Offline Wiki Application
Copyright ( C ) 2012 gnosygnu @gmail.com
This program is free software : you can redistribute it and / or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation , either version 3 of the
License , or ( at your option ) any later version .
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 Affero General Public License for more details .
You should have received a copy of the GNU Affero General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
* /
package gplx.gfml ; import gplx.* ;
2015-11-23 02:39:33 +00:00
import gplx.core.stores.* ; import gplx.core.gfo_ndes.* ;
2015-07-13 01:10:02 +00:00
public class GfmlDataNde {
public GfmlDoc Doc ( ) { return gdoc ; } GfmlDoc gdoc ;
public DataRdr XtoRdr ( ) {
GfmlDataRdr rv = new GfmlDataRdr ( ) ;
rv . SetNode ( gdoc . RootNde ( ) ) ;
return rv ;
}
public DataWtr XtoWtr ( ) {
GfmlDataWtr2 rv = new GfmlDataWtr2 ( ) ;
rv . Doc_set ( gdoc ) ;
return rv ;
}
public static GfmlDataNde new_any_eol_ ( String raw ) { return new_ ( String_ . Replace ( raw , String_ . CrLf , String_ . Lf ) ) ; }
public static GfmlDataNde new_ ( String raw ) {
GfmlDataNde rv = new GfmlDataNde ( ) ;
GfmlBldr bldr = GfmlBldr_ . default_ ( ) ;
bldr . Doc ( ) . RootLxr ( ) . SubLxr_Add
( GfmlDocLxrs . AtrSpr_lxr ( )
, GfmlDocLxrs . NdeDot_lxr ( )
, GfmlDocLxrs . NdeHdrBgn_lxr ( )
, GfmlDocLxrs . NdeHdrEnd_lxr ( )
) ;
rv . gdoc = bldr . XtoGfmlDoc ( raw ) ;
return rv ;
}
public static GfoMsg XtoMsg ( String raw ) {
GfmlDoc gdoc = GfmlDataNde . new_any_eol_ ( raw ) . Doc ( ) ;
return XtoMsg ( gdoc . RootNde ( ) ) ;
}
public static GfoMsg XtoMsgNoRoot ( String raw ) {
GfmlDoc gdoc = GfmlDataNde . new_any_eol_ ( raw ) . Doc ( ) ;
GfoMsg msg = XtoMsg ( gdoc . RootNde ( ) ) ;
return ( GfoMsg ) msg . Subs_getAt ( 0 ) ;
}
static GfoMsg XtoMsg ( GfmlNde gnde ) {
String msgKey = String_ . Coalesce ( gnde . Key ( ) , gnde . Hnd ( ) ) ;
GfoMsg msg = GfoMsg_ . new_parse_ ( msgKey ) ;
for ( int i = 0 ; i < gnde . SubKeys ( ) . Count ( ) ; i + + ) {
GfmlItm subItm = ( GfmlItm ) gnde . SubKeys ( ) . Get_at ( i ) ;
if ( subItm . ObjType ( ) = = GfmlObj_ . Type_atr ) {
GfmlAtr subAtr = ( GfmlAtr ) subItm ;
String subAtrKey = String_ . Len_eq_0 ( subAtr . Key ( ) ) ? " " : subAtr . Key ( ) ; // NOTE: needs to be "" or else will fail in GfoConsole; key will be evaluated against NullKey in GfsCtx
msg . Add ( subAtrKey , subAtr . DatTkn ( ) . Val ( ) ) ;
}
else {
GfmlNde subNde = ( GfmlNde ) subItm ;
GfoMsg subMsg = XtoMsg ( subNde ) ;
msg . Subs_add ( subMsg ) ;
}
}
for ( int i = 0 ; i < gnde . SubHnds ( ) . Count ( ) ; i + + ) {
GfmlItm subItm = ( GfmlItm ) gnde . SubHnds ( ) . Get_at ( i ) ;
GfmlNde subNde = ( GfmlNde ) subItm ;
GfoMsg subMsg = XtoMsg ( subNde ) ;
msg . Subs_add ( subMsg ) ;
}
return msg ;
}
}
class GfmlDataWtr2 extends DataWtr_base implements DataWtr {
@Override public void WriteData ( String name , Object val ) {
GfmlTkn nameTkn = GfmlTkn_ . raw_ ( name ) ;
2015-08-17 06:09:16 +00:00
GfmlTkn valTkn = GfmlTkn_ . raw_ ( To_str ( val ) ) ;
2015-07-13 01:10:02 +00:00
GfmlAtr atr = GfmlAtr . new_ ( nameTkn , valTkn , GfmlType_ . String ) ;
GfmlNde nde = gdoc . RootNde ( ) . SubHnds ( ) . Get_at ( 0 ) ;
nde . SubKeys ( ) . Add ( atr ) ;
}
public void InitWtr ( String key , Object val ) { }
public void WriteTableBgn ( String name , GfoFldList fields ) { }
@Override public void WriteNodeBgn ( String nodeName ) { }
public void WriteLeafBgn ( String leafName ) { }
@Override public void WriteNodeEnd ( ) { }
public void WriteLeafEnd ( ) { }
public void Clear ( ) { }
2015-08-17 06:09:16 +00:00
public String To_str ( ) { return " " ; }
String To_str ( Object obj ) {
2015-07-13 01:10:02 +00:00
if ( obj = = null ) return " '' " ;
String s = obj . toString ( ) ;
return String_ . Concat ( " ' " , String_ . Replace ( s , " ' " , " '' " ) , " ' " ) ;
}
@Override public SrlMgr SrlMgr_new ( Object o ) { return new GfmlDataWtr2 ( ) ; }
public void Doc_set ( GfmlDoc v ) { gdoc = v ; } GfmlDoc gdoc ;
}