2013-02-17 [colin] 3.9.0cvs75
[claws.git] / src / plugins / python / nodetype.c
1 /* Python plugin for Claws-Mail
2  * Copyright (C) 2009 Holger Berndt
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #ifdef HAVE_CONFIG_H
19 #  include "config.h"
20 #include "claws-features.h"
21 #endif
22
23 #include <glib.h>
24 #include <glib/gi18n.h>
25
26 #include "nodetype.h"
27
28 #include <structmember.h>
29
30 PyMODINIT_FUNC initnode(PyObject *module)
31 {
32   PyObject *dict;
33   PyObject *res;
34   const char *cmd =
35       "class Node(object):\n"
36       "    \"\"\"A general purpose tree container type\"\"\"\n"
37       "\n"
38       "    def __init__(self):\n"
39       "        self.data = None\n"
40       "        self.children = []\n"
41       "\n"
42       "    def __str__(self):\n"
43       "        return '\\n'.join(self.get_str_list(0))\n"
44       "\n"
45       "    def get_str_list(self, level):\n"
46       "        \"\"\"get_str_list(level) - get a list of string-representations of the tree data\n"
47       "        \n"
48       "        The nesting of the tree elements is represented by various levels of indentation.\"\"\"\n"
49       "        str = []\n"
50       "        indent = '  '*level\n"
51       "        if self.data:\n"
52       "            str.append(indent + self.data.__str__())\n"
53       "        else:\n"
54       "            str.append(indent + 'None')\n"
55       "        for child in self.children:\n"
56       "            str.extend(child.get_str_list(level+1))\n"
57       "        return str\n"
58       "\n"
59       "    def traverse(self, callback, arg=None):\n"
60       "        \"\"\"traverse(callback [, arg=None]) - traverse the tree\n"
61       "        \n"
62       "        Traverse the tree, calling the callback function for each node element,\n"
63       "        with optional arg as user-data. The expected callback function signature is\n"
64       "        callback(node_data [, arg]).\"\"\"\n"
65       "        if self.data:\n"
66       "            if arg is not None:\n"
67       "                callback(self.data, arg)\n"
68       "            else:\n"
69       "                callback(self.data)\n"
70       "        for child in self.children:\n"
71       "            child.traverse(callback, arg)\n"
72       "\n"
73       "    def flat_list(self):\n"
74       "        \"\"\"flat_list() - get a flat list of the tree\n"
75       "        \n"
76       "        Returns a flat list of the tree, disregarding the nesting structure.\"\"\"\n"
77       "        flat_list = []\n"
78       "        self.traverse(lambda data,list: list.append(data), flat_list)\n"
79       "        return flat_list\n"
80       "\n";
81
82   dict = PyModule_GetDict(module);
83
84   if(PyDict_GetItemString(dict, "__builtins__") == NULL)
85     PyDict_SetItemString(dict, "__builtins__", PyEval_GetBuiltins());
86
87   res = PyRun_String(cmd, Py_file_input, dict, dict);
88   Py_XDECREF(res);
89 }
90
91 PyObject* clawsmail_node_new(PyObject *module)
92 {
93   PyObject *class, *dict;
94
95   dict = PyModule_GetDict(module);
96   class = PyDict_GetItemString(dict, "Node");
97   return PyObject_CallObject(class, NULL);
98 }