ImageEn, unit hyieutils

TIEDictionary


Declaration

TIEDictionary = class;


Description

TIEDictionary is a String->Object dictionary (hashmap).
It can import/export key-values in a JSON-like (not fully compatible yet) style.


Methods and Properties

Public Method  Create
Public Method  Clear
Public Property  Count
Public Method  Dump
Public Method  Erase
Public Method  HasKey
Public Method  Get
Public Method  GetBoolean
Public Method  GetDictionary
Public Method  GetDouble
Public Method  GetInteger
Public Method  GetList
Public Method  GetNext
Public Method  GetString
Public Method  Insert
Public Method  IsEmpty
Public Method  Parse

Note:
- Use '#content' as the key to get content from tags (like <tag ...> content </tag>), e.g. dict := xmpDict.GetDictionary('#content', false);
- Use '#text' as the key to get the values from a tag list, e.g. memo1.lines.add( dict.GetString( '#text', false ));


Examples

// Dump dictionary content as XML
var
  dict: TIEDictionary;
begin
  dict := TIEDictionary.Create();
  dict.Insert('doublekey', 10.1);
  dict.Insert('integerkey', 100);
  dict.Insert('stringkey', 'hello');
  dict.Insert('bool_true', true);
  dict.Insert('bool_false', false);
  dict.Insert('dict', TIEDictionary.Create());
    dict.GetDictionary('dict').Insert('one', 1);
    dict.GetDictionary('dict').Insert('two', 'two');
  dict.Insert('list', TObjectList.Create());
    dict.GetList('list').Add( TIEDictionaryValueWideString.Create('mike') );
    dict.GetList('list').Add( TIEDictionaryValueWideString.Create('robert') );
    dict.GetList('list').Add( TIEDictionaryValueWideString.Create('john') );
    dict.GetList('list').Add( TIEDictionaryValueInteger.Create(2013) );

  memo1.Text := dict.Dump(ieplXML);

  dict.free;
end;


// Dump the structure of the dictionary
var
  ss : TStringList;
  dict: TIEDictionary;
begin
  ss := TStringList.Create;
  dict := TIEDictionary.Create();
  ss.LoadFromFile('d:\XML_TEST.xml');
  dict.parse( ss.Text );

  // Dump structure
  memo1.Text := dict.Dump(ieplStructure);

  dict.free;
  ss.Free;
end;


// Parse all DictionaryEntries from XML file
// Download file from: www.imageen.com/files/UnitTestFiles/XML_TEST.xml
{
SAMPLE:

<?xml version="1.0" encoding="UTF-8"?>
<Proofreader>
 <Rules Language="EN">
   <DictionaryEntries>
     <Entry>absolute</Entry>
     <Entry>add</Entry>
     <Entry>ancestor</Entry>
     <Entry>anchor</Entry>
     <Entry>begin</Entry>
     ...


OUTPUT:

absolute
add
ancestor
anchor
begin
...
}
var
  ss : TStringList;
  xmlDict: TIEDictionary;  // Dict to parse source XML
  navDict: TIEDictionary;  // Dict to navigate XML structure
  list: TObjectList;
  i: integer;
begin
  ss := TStringList.Create;
  xmlDict := TIEDictionary.Create();
  ss.LoadFromFile('D:\XML_TEST.xml');
  xmlDict.parse( ss.Text );

  // Output all entries of Proofreader->Rules->DictionaryEntries into "memo1"
  navDict := xmlDict.GetDictionary('Proofreader', false);
  navDict := navDict.GetDictionary('#content', false);
  navDict := TIEDictionary(navDict.GetList('Rules', false)[0]);
  navDict := navDict.GetDictionary('#content', false);
  navDict := navDict.GetDictionary('DictionaryEntries', false);
  navDict := navDict.GetDictionary('#content', false);
  list := navDict.GetList('Entry', false);
  for i := 0 to list.Count - 1 do
  begin
    navDict := TIEDictionary(list[i]).GetDictionary('#content', false);
    memo1.lines.add( navDict.GetString('#text', false) );
  end;

  xmlDict.free;
  ss.Free;
end;


// Save a PNG file as a lossless WebP with lossless compression (using ImageMagick plug-in)
var
  imDict: TIEDictionary
begin
  ImageEnView1.IO.LoadFromFile( 'D:\Image.png' );
  imDict := TIEDictionary.Create();
  imDict.Insert( 'webp:lossless', true );
  imDict.Insert( 'webp:method', 0 );
  imDict.Insert( 'webp:auto-filter', true );
  ImageEnView1.IO.Params.Dict.Insert( 'ImageMagick', imDict );
  ImageEnView1.IO.SaveToFile( 'D:\Image_out.webp' );
end;

// List items in "ImageMagick" dictionary
var
  dict: TIEDictionary;
  curr: TIEStrStrEnumerator;
  key, val: String;
begin
  dict := TIEDictionary( ImageEnView1.IO.Params.Dict.Get( 'ImageMagick', True, False ));
  if dict = nil then
    exit;

  curr := TIEStrStrEnumerator.Create();
  try
    while dict.GetNext( curr ) do
    begin
      key := curr.item.key;
      val := IEDictValueToStr( curr.item.value );
      Memo1.Lines.Add( key + '=' + val );
    end;
  finally
    curr.Free();
  end;
end;
{
Result:
webp:method=0
webp:lossless=true
webp:auto-filter=true
}