1 #if defined(HAVE_CONFIG_H) && !defined(GEANYPY_WINDOWS)
2 # include "config.h"
3 #endif
4
5 #include "geanypy.h"
6
7
8 static void
Filetype_dealloc(Filetype * self)9 Filetype_dealloc(Filetype *self)
10 {
11 self->ob_type->tp_free((PyObject *) self);
12 }
13
14
15 static int
Filetype_init(Filetype * self,PyObject * args,PyObject * kwds)16 Filetype_init(Filetype *self, PyObject *args, PyObject *kwds)
17 {
18 self->ft = NULL;
19 return 0;
20 }
21
22
23 static PyObject *
Filetype_get_property(Filetype * self,const gchar * prop_name)24 Filetype_get_property(Filetype *self, const gchar *prop_name)
25 {
26 g_return_val_if_fail(self != NULL, NULL);
27 g_return_val_if_fail(prop_name != NULL, NULL);
28
29 if (!self->ft)
30 {
31 PyErr_SetString(PyExc_RuntimeError,
32 "Filetype instance not initialized properly");
33 return NULL;
34 }
35
36 if (g_str_equal(prop_name, "display_name"))
37 GEANYPY_RETURN_STRING(filetypes_get_display_name(self->ft))
38 else if (g_str_equal(prop_name, "extension"))
39 GEANYPY_RETURN_STRING(self->ft->extension)
40 else if (g_str_equal(prop_name, "id"))
41 return PyInt_FromLong((glong) self->ft->id);
42 else if (g_str_equal(prop_name, "lang"))
43 return PyInt_FromLong((glong) self->ft->lang);
44 else if (g_str_equal(prop_name, "name"))
45 GEANYPY_RETURN_STRING(self->ft->name)
46 else if (g_str_equal(prop_name, "pattern"))
47 {
48 gint i, len;
49 PyObject *list = PyList_New(0);
50 if (self->ft->pattern)
51 {
52 len = g_strv_length(self->ft->pattern);
53 for (i = 0; i < len; i++)
54 PyList_Append(list, PyString_FromString(self->ft->pattern[i]));
55 }
56 return list;
57
58 }
59 else if (g_str_equal(prop_name, "title"))
60 GEANYPY_RETURN_STRING(self->ft->title)
61 #ifdef ENABLE_PRIVATE
62 else if (g_str_equal(prop_name, "context_action_cmd"))
63 GEANYPY_RETURN_STRING(self->ft->context_action_cmd)
64 else if (g_str_equal(prop_name, "comment_open"))
65 GEANYPY_RETURN_STRING(self->ft->comment_open)
66 else if (g_str_equal(prop_name, "comment_use_indent"))
67 {
68 if (self->ft->comment_use_indent)
69 Py_RETURN_TRUE;
70 else
71 Py_RETURN_FALSE;
72 }
73 else if (g_str_equal(prop_name, "group"))
74 return PyInt_FromLong((glong) self->ft->group);
75 else if (g_str_equal(prop_name, "error_regex_string"))
76 return PyString_FromString(self->ft->error_regex_string);
77 else if (g_str_equal(prop_name, "lexer_filetype"))
78 {
79 if (self->ft->lexer_filetype)
80 return Filetype_create_new_from_geany_filetype(self->ft->lexer_filetype);
81 }
82 else if (g_str_equal(prop_name, "mime_type"))
83 GEANYPY_RETURN_STRING(self->ft->lexer_filetype)
84 else if (g_str_equal(prop_name, "icon"))
85 {
86 if (self->ft->icon)
87 return (PyObject *) pygobject_new(G_OBJECT(self->ft->icon));
88 }
89 else if (g_str_equal(prop_name, "comment_single"))
90 GEANYPY_RETURN_STRING(self->ft->comment_single)
91 else if (g_str_equal(prop_name, "indent_type"))
92 return PyInt_FromLong((glong) self->ft->indent_type);
93 else if (g_str_equal(prop_name, "indent_width"))
94 return PyInt_FromLong((glong) self->ft->indent_width);
95 #endif
96
97 Py_RETURN_NONE;
98 }
99 GEANYPY_PROPS_READONLY(Filetype);
100
101
102 static PyGetSetDef Filetype_getseters[] = {
103 GEANYPY_GETSETDEF(Filetype, "display_name",
104 "Gets the filetype's name for display."),
105 GEANYPY_GETSETDEF(Filetype, "extension",
106 "Default file extension for new files or None."),
107 GEANYPY_GETSETDEF(Filetype, "id",
108 "Index of the the filetype."),
109 GEANYPY_GETSETDEF(Filetype, "lang",
110 "TagManager language type, -1 for all, -2 for none."),
111 GEANYPY_GETSETDEF(Filetype, "name",
112 "Untranslated short name, such as 'C' or 'None'."),
113 GEANYPY_GETSETDEF(Filetype, "pattern",
114 "List of filename-matching wildcard strings."),
115 GEANYPY_GETSETDEF(Filetype, "title",
116 "Shown in the open dialog, such as 'C source file'."),
117 #ifdef ENABLE_PRIVATE
118 GEANYPY_GETSETDEF(Filetype, "context_action_cmd", ""),
119 GEANYPY_GETSETDEF(Filetype, "comment_open", ""),
120 GEANYPY_GETSETDEF(Filetype, "comment_use_indent", ""),
121 GEANYPY_GETSETDEF(Filetype, "group", ""),
122 GEANYPY_GETSETDEF(Filetype, "error_regex_string", ""),
123 GEANYPY_GETSETDEF(Filetype, "lexer_filetype", ""),
124 GEANYPY_GETSETDEF(Filetype, "mime_type", ""),
125 GEANYPY_GETSETDEF(Filetype, "icon", ""),
126 GEANYPY_GETSETDEF(Filetype, "comment_single", ""),
127 GEANYPY_GETSETDEF(Filetype, "indent_type", ""),
128 GEANYPY_GETSETDEF(Filetype, "indent_width", ""),
129 #endif
130 { NULL }
131 };
132
133
134 static PyTypeObject FiletypeType = {
135 PyObject_HEAD_INIT(NULL)
136 0, /* ob_size */
137 "geany.filetypes.Filetype", /* tp_name */
138 sizeof(Filetype), /* tp_basicsize */
139 0, /* tp_itemsize */
140 (destructor) Filetype_dealloc, /* tp_dealloc */
141 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* tp_print - tp_as_buffer */
142 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
143 "Wrapper around a GeanyFiletype structure.",/* tp_doc */
144 0, 0, 0, 0, 0, 0, 0, 0, /* tp_traverse - tp_members */
145 Filetype_getseters, /* tp_getset */
146 0, 0, 0, 0, 0, /* tp_base - tp_dictoffset */
147 (initproc) Filetype_init, /* tp_init */
148 0, 0, /* tp_alloc - tp_new */
149
150 };
151
152
153 static PyObject *
Filetype_detect_from_file(PyObject * self,PyObject * args,PyObject * kwargs)154 Filetype_detect_from_file(PyObject *self, PyObject *args, PyObject *kwargs)
155 {
156 GeanyFiletype *ft;
157 gchar *filename = NULL;
158 static gchar *kwlist[] = { "filename", NULL };
159
160 if (PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filename))
161 {
162 if (filename)
163 {
164 if ((ft = filetypes_detect_from_file(filename)))
165 return (PyObject *) Filetype_create_new_from_geany_filetype(ft);
166 }
167 }
168
169 Py_RETURN_NONE;
170 }
171
172
173 static PyObject *
Filetype_get_sorted_by_name(PyObject * self)174 Filetype_get_sorted_by_name(PyObject *self)
175 {
176 const GSList *glist, *iter;
177 PyObject *list;
178
179 glist = filetypes_get_sorted_by_name();
180 list = PyList_New(0);
181
182 for (iter = glist; iter != NULL; iter = g_slist_next(iter))
183 {
184 if (!iter->data)
185 continue;
186 PyList_Append(list, (PyObject *)
187 Filetype_create_new_from_geany_filetype((GeanyFiletype *) iter->data));
188 }
189
190 return list;
191 }
192
193
194 static PyObject *
Filetype_index(PyObject * self,PyObject * args,PyObject * kwargs)195 Filetype_index(PyObject *self, PyObject *args, PyObject *kwargs)
196 {
197 GeanyFiletype *ft;
198 gint idx = -1;
199 static gchar *kwlist[] = { "index", NULL };
200
201 if (PyArg_ParseTupleAndKeywords(args, kwargs, "i", kwlist, &idx))
202 {
203 if ((ft = filetypes_index(idx)))
204 return (PyObject *) Filetype_create_new_from_geany_filetype(ft);
205 }
206
207 Py_RETURN_NONE;
208 }
209
210
211 static PyObject *
Filetype_lookup_by_name(PyObject * self,PyObject * args,PyObject * kwargs)212 Filetype_lookup_by_name(PyObject *self, PyObject *args, PyObject *kwargs)
213 {
214 GeanyFiletype *ft;
215 gchar *filetype = NULL;
216 static gchar *kwlist[] = { "name", NULL };
217
218 if (PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwlist, &filetype))
219 {
220 if (filetype && (ft = filetypes_lookup_by_name(filetype)))
221 return (PyObject *) Filetype_create_new_from_geany_filetype(ft);
222 }
223
224 Py_RETURN_NONE;
225 }
226
227
228 static PyObject *
Filetype_get_sorted_by_title(PyObject * self,PyObject * args)229 Filetype_get_sorted_by_title(PyObject *self, PyObject *args)
230 {
231 const GSList *iter;
232 PyObject *list;
233
234 list = PyList_New(0);
235
236 for (iter = geany_data->filetypes_by_title; iter != NULL; iter = g_slist_next(iter))
237 {
238 if (!iter->data)
239 continue;
240 PyList_Append(list, (PyObject *)
241 Filetype_create_new_from_geany_filetype((GeanyFiletype *) iter->data));
242 }
243
244 return list;
245 }
246
247
248 static
249 PyMethodDef FiletypeModule_methods[] = {
250 { "detect_from_file", (PyCFunction) Filetype_detect_from_file, METH_KEYWORDS },
251 { "index", (PyCFunction) Filetype_index, METH_KEYWORDS },
252 { "get_sorted_by_name", (PyCFunction) Filetype_get_sorted_by_name, METH_NOARGS },
253 { "lookup_by_name", (PyCFunction) Filetype_lookup_by_name, METH_KEYWORDS },
254 { "get_sorted_by_title", (PyCFunction) Filetype_get_sorted_by_title, METH_NOARGS },
255 { NULL }
256 };
257
258
259 PyMODINIT_FUNC
initfiletypes(void)260 initfiletypes(void)
261 {
262 PyObject *m;
263
264 FiletypeType.tp_new = PyType_GenericNew;
265 if (PyType_Ready(&FiletypeType) < 0)
266 return;
267
268 m = Py_InitModule3("filetypes", FiletypeModule_methods,
269 "Filetype information and management.");
270
271 Py_INCREF(&FiletypeType);
272 PyModule_AddObject(m, "Filetype", (PyObject *)&FiletypeType);
273 }
274
275
Filetype_create_new_from_geany_filetype(GeanyFiletype * ft)276 Filetype *Filetype_create_new_from_geany_filetype(GeanyFiletype *ft)
277 {
278 Filetype *self;
279 self = (Filetype *) PyObject_CallObject((PyObject *) &FiletypeType, NULL);
280 self->ft = ft;
281 return self;
282 }
283