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