[prev in list] [next in list] [prev in thread] [next in thread] 

List:       abiword-dev
Subject:    Writing OTS plugins
From:       Nadav Rotem <nadavrotem () mail ! ru>
Date:       2003-06-08 11:11:08
[Download RAW message or body]

This is a first draft for the OTS plugin Tutorial. This tutorial will 
help developers of programs such as Abiword , Gedit and others to create
a plugin that uses OTS. The style-information section is still missing.


Writing OTS plugins
------------------

To create a plugin that uses OTS for your program to use two 

functions need to be written. One to parse your text and place

it into the ots structure and the other is the exporter plugin 

to get the data from the ots data structure back into your 

application.

create this function:

ots_parse_myprog (myprog_struct * mytext , OtsArticle * Doc)

This function will parse the text from your internal data structure. 

It will have to insert each word to a node of (char *) using
ots_append_word.

each space , punctuation and other symbols will be added as a separate
node;

example:

[Stuff]-[ ]-[that]-[ ]-[matters]-[.]

To create the data structure first we need to create a new sentence

using  " newLine = ots_append_line (Doc); "  This adds a line to 

the article and returns a pointer to that line.  To add a word to this

line we will call " ots_append_word (tmpLine, string); " This will add

a new node of (char *) to the sentence.

Remember to call " ots_add_wordstat(Doc , aWord); " for every word that

we enter the line. This will add it to the word list for more statistics

on the article. ots will not work without you adding each word to the
list.

Do not add punctuations , spaces and non words strings; 

example of such list:

Stuff

that

matters

Now that we have created an OTSsentence would be a good time to attach
our 

original sentence to the line using " tmpLine->user_data=(some token);
". 

This may be a pointer to the original sentence in your program or 

token number.

This pointer is not moderator and OTS will ignore it. we define this
pointer

so later we can go through the ots data structure and have the original 

sentence with all the font , style etc.

For more examples look into parser.c

output:

After ots has worked on the data structure your plugin will have to go

through a list of sentences and see if ots marked them as "selected". 

If the "selected" flag is set then it means that ots found this sentence

important for the article. Now you can access your "user_data" pointer
and

either remove your original sentence or paste it to a new canvas.

Code sample:

 GList *li;

 for (li = (GList *) Doc->lines; li != NULL; li = li->next) {

  if ((li->data->selected)) { 

     /* do something with li->data->user_data */

     }

 }

For more examples look into text.c or html.c

general program flow:

 OtsArticle *Art; //ots article

 OtsWordList *dict; //Ots Dictionary file

 OtsWordList *ImpWords; //Ots list of words

 Art = ots_new_article ();         //new

 ImpWords = ots_new_wordlist ();   //new

 dict = ots_new_wordlist ();   //new

 ots_load_dictionary (dict, dictionary_file); //load dictionary

 ots_parse_myprogram (input_stream, Art); // <---- Your parser here! 

 ots_sort_list (Art->wordStat); //sort word list

 ots_union_list (Art->wordStat, dict, ImpWords);

 ots_sort_list (ImpWords);

 ots_grade_doc (Art, ImpWords);

 ots_highlight_doc (Art, sumPercent);

 Art->title=create_title(ImpWords);

 ots_print_myprogram (output_stream, Art); // <---- Your print function
here

 ots_free_article (Art);   //free

 ots_free_wordlist (dict);  //free

 ots_free_wordlist (ImpWords); //free

For more examples look into main() in ots.c


Nadav Rotem



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic