annotate genshi/_speedups.c @ 902:09cc3627654c experimental-inline

Sync `experimental/inline` branch with [source:trunk@1126].
author cmlenz
date Fri, 23 Apr 2010 21:08:26 +0000
parents 1837f39efd6f
children
rev   line source
820
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
1 /*
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
2 * Copyright (C) 2006-2008 Edgewall Software
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
3 * All rights reserved.
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
4 *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
5 * This software is licensed as described in the file COPYING, which
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
6 * you should have received as part of this distribution. The terms
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
7 * are also available at http://genshi.edgewall.org/wiki/License.
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
8 *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
9 * This software consists of voluntary contributions made by many
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
10 * individuals. For the exact contribution history, see the revision
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
11 * history and logs, available at http://genshi.edgewall.org/log/.
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
12 */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
13
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
14 #include <Python.h>
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
15 #include <structmember.h>
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
16
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
17 #if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
18 typedef int Py_ssize_t;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
19 #define PY_SSIZE_T_MAX INT_MAX
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
20 #define PY_SSIZE_T_MIN INT_MIN
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
21 #endif
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
22
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
23 static PyObject *amp1, *amp2, *lt1, *lt2, *gt1, *gt2, *qt1, *qt2;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
24 static PyObject *stripentities, *striptags;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
25
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
26 static void
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
27 init_constants(void)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
28 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
29 PyObject *util = PyImport_ImportModule("genshi.util");
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
30 stripentities = PyObject_GetAttrString(util, "stripentities");
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
31 striptags = PyObject_GetAttrString(util, "striptags");
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
32 Py_DECREF(util);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
33
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
34 amp1 = PyUnicode_DecodeASCII("&", 1, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
35 amp2 = PyUnicode_DecodeASCII("&amp;", 5, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
36 lt1 = PyUnicode_DecodeASCII("<", 1, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
37 lt2 = PyUnicode_DecodeASCII("&lt;", 4, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
38 gt1 = PyUnicode_DecodeASCII(">", 1, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
39 gt2 = PyUnicode_DecodeASCII("&gt;", 4, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
40 qt1 = PyUnicode_DecodeASCII("\"", 1, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
41 qt2 = PyUnicode_DecodeASCII("&#34;", 5, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
42 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
43
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
44 /* Markup class */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
45
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
46 PyTypeObject MarkupType; /* declared later */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
47
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
48 PyDoc_STRVAR(Markup__doc__,
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
49 "Marks a string as being safe for inclusion in HTML/XML output without\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
50 needing to be escaped.");
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
51
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
52 static PyObject *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
53 escape(PyObject *text, int quotes)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
54 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
55 PyObject *args, *ret;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
56 PyUnicodeObject *in, *out;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
57 Py_UNICODE *inp, *outp;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
58 int len, inn, outn;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
59
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
60 if (PyObject_TypeCheck(text, &MarkupType)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
61 Py_INCREF(text);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
62 return text;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
63 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
64 if (PyObject_HasAttrString(text, "__html__")) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
65 ret = PyObject_CallMethod(text, "__html__", NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
66 args = PyTuple_New(1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
67 if (args == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
68 Py_DECREF(ret);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
69 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
70 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
71 PyTuple_SET_ITEM(args, 0, ret);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
72 ret = MarkupType.tp_new(&MarkupType, args, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
73 Py_DECREF(args);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
74 return ret;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
75 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
76 in = (PyUnicodeObject *) PyObject_Unicode(text);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
77 if (in == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
78 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
79 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
80 /* First we need to figure out how long the escaped string will be */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
81 len = inn = 0;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
82 inp = in->str;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
83 while (*(inp) || in->length > inp - in->str) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
84 switch (*inp++) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
85 case '&': len += 5; inn++; break;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
86 case '"': len += quotes ? 5 : 1; inn += quotes ? 1 : 0; break;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
87 case '<':
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
88 case '>': len += 4; inn++; break;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
89 default: len++;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
90 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
91 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
92
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
93 /* Do we need to escape anything at all? */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
94 if (!inn) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
95 args = PyTuple_New(1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
96 if (args == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
97 Py_DECREF((PyObject *) in);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
98 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
99 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
100 PyTuple_SET_ITEM(args, 0, (PyObject *) in);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
101 ret = MarkupType.tp_new(&MarkupType, args, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
102 Py_DECREF(args);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
103 return ret;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
104 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
105
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
106 out = (PyUnicodeObject*) PyUnicode_FromUnicode(NULL, len);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
107 if (out == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
108 Py_DECREF((PyObject *) in);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
109 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
110 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
111
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
112 outn = 0;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
113 inp = in->str;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
114 outp = out->str;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
115 while (*(inp) || in->length > inp - in->str) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
116 if (outn == inn) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
117 /* copy rest of string if we have already replaced everything */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
118 Py_UNICODE_COPY(outp, inp, in->length - (inp - in->str));
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
119 break;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
120 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
121 switch (*inp) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
122 case '&':
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
123 Py_UNICODE_COPY(outp, ((PyUnicodeObject *) amp2)->str, 5);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
124 outp += 5;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
125 outn++;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
126 break;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
127 case '"':
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
128 if (quotes) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
129 Py_UNICODE_COPY(outp, ((PyUnicodeObject *) qt2)->str, 5);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
130 outp += 5;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
131 outn++;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
132 } else {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
133 *outp++ = *inp;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
134 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
135 break;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
136 case '<':
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
137 Py_UNICODE_COPY(outp, ((PyUnicodeObject *) lt2)->str, 4);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
138 outp += 4;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
139 outn++;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
140 break;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
141 case '>':
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
142 Py_UNICODE_COPY(outp, ((PyUnicodeObject *) gt2)->str, 4);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
143 outp += 4;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
144 outn++;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
145 break;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
146 default:
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
147 *outp++ = *inp;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
148 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
149 inp++;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
150 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
151
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
152 Py_DECREF((PyObject *) in);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
153
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
154 args = PyTuple_New(1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
155 if (args == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
156 Py_DECREF((PyObject *) out);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
157 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
158 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
159 PyTuple_SET_ITEM(args, 0, (PyObject *) out);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
160 ret = MarkupType.tp_new(&MarkupType, args, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
161 Py_DECREF(args);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
162 return ret;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
163 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
164
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
165 PyDoc_STRVAR(escape__doc__,
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
166 "Create a Markup instance from a string and escape special characters\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
167 it may contain (<, >, & and \").\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
168 \n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
169 >>> escape('\"1 < 2\"')\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
170 <Markup u'&#34;1 &lt; 2&#34;'>\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
171 \n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
172 If the `quotes` parameter is set to `False`, the \" character is left\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
173 as is. Escaping quotes is generally only required for strings that are\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
174 to be used in attribute values.\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
175 \n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
176 >>> escape('\"1 < 2\"', quotes=False)\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
177 <Markup u'\"1 &lt; 2\"'>\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
178 \n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
179 :param text: the text to escape\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
180 :param quotes: if ``True``, double quote characters are escaped in\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
181 addition to the other special characters\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
182 :return: the escaped `Markup` string\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
183 :rtype: `Markup`\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
184 ");
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
185
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
186 static PyObject *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
187 Markup_escape(PyTypeObject* type, PyObject *args, PyObject *kwds)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
188 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
189 static char *kwlist[] = {"text", "quotes", 0};
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
190 PyObject *text = NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
191 char quotes = 1;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
192
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
193 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|b", kwlist, &text, &quotes)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
194 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
195 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
196 if (PyObject_Not(text)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
197 return type->tp_new(type, args, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
198 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
199 if (PyObject_TypeCheck(text, type)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
200 Py_INCREF(text);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
201 return text;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
202 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
203 return escape(text, quotes);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
204 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
205
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
206 static PyObject *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
207 Markup_html(PyObject *self)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
208 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
209 Py_INCREF(self);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
210 return self;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
211 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
212
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
213 PyDoc_STRVAR(join__doc__,
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
214 "Return a `Markup` object which is the concatenation of the strings\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
215 in the given sequence, where this `Markup` object is the separator\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
216 between the joined elements.\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
217 \n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
218 Any element in the sequence that is not a `Markup` instance is\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
219 automatically escaped.\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
220 \n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
221 :param seq: the sequence of strings to join\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
222 :param escape_quotes: whether double quote characters in the elements\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
223 should be escaped\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
224 :return: the joined `Markup` object\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
225 :rtype: `Markup`\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
226 :see: `escape`\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
227 ");
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
228
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
229 static PyObject *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
230 Markup_join(PyObject *self, PyObject *args, PyObject *kwds)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
231 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
232 static char *kwlist[] = {"seq", "escape_quotes", 0};
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
233 PyObject *seq = NULL, *seq2, *tmp, *tmp2;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
234 char quotes = 1;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
235 Py_ssize_t n;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
236 int i;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
237
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
238 if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|b", kwlist, &seq, &quotes)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
239 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
240 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
241 if (!PySequence_Check(seq)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
242 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
243 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
244 n = PySequence_Size(seq);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
245 if (n < 0) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
246 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
247 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
248 seq2 = PyTuple_New(n);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
249 if (seq2 == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
250 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
251 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
252 for (i = 0; i < n; i++) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
253 tmp = PySequence_GetItem(seq, i);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
254 if (tmp == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
255 Py_DECREF(seq2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
256 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
257 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
258 tmp2 = escape(tmp, quotes);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
259 if (tmp2 == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
260 Py_DECREF(seq2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
261 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
262 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
263 PyTuple_SET_ITEM(seq2, i, tmp2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
264 Py_DECREF(tmp);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
265 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
266 tmp = PyUnicode_Join(self, seq2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
267 Py_DECREF(seq2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
268 if (tmp == NULL)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
269 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
270 args = PyTuple_New(1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
271 if (args == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
272 Py_DECREF(tmp);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
273 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
274 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
275 PyTuple_SET_ITEM(args, 0, tmp);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
276 tmp = MarkupType.tp_new(&MarkupType, args, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
277 Py_DECREF(args);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
278 return tmp;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
279 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
280
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
281 static PyObject *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
282 Markup_add(PyObject *self, PyObject *other)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
283 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
284 PyObject *tmp, *tmp2, *args, *ret;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
285 if (PyObject_TypeCheck(self, &MarkupType)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
286 tmp = escape(other, 1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
287 if (tmp == NULL)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
288 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
289 tmp2 = PyUnicode_Concat(self, tmp);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
290 } else { // __radd__
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
291 tmp = escape(self, 1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
292 if (tmp == NULL)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
293 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
294 tmp2 = PyUnicode_Concat(tmp, other);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
295 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
296 Py_DECREF(tmp);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
297 if (tmp2 == NULL)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
298 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
299 args = PyTuple_New(1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
300 if (args == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
301 Py_DECREF(tmp2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
302 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
303 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
304 PyTuple_SET_ITEM(args, 0, tmp2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
305 ret = MarkupType.tp_new(&MarkupType, args, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
306 Py_DECREF(args);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
307 return ret;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
308 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
309
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
310 static PyObject *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
311 Markup_mod(PyObject *self, PyObject *args)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
312 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
313 PyObject *tmp, *tmp2, *ret, *args2;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
314 int i;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
315 Py_ssize_t nargs = 0;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
316 PyObject *kwds = NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
317
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
318 if (PyDict_Check(args)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
319 kwds = args;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
320 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
321 if (kwds && PyDict_Size(kwds)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
322 PyObject *kwcopy, *key, *value;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
323 Py_ssize_t pos = 0;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
324
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
325 kwcopy = PyDict_Copy( kwds );
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
326 if (kwcopy == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
327 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
328 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
329 while (PyDict_Next(kwcopy, &pos, &key, &value)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
330 tmp = escape(value, 1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
331 if (tmp == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
332 Py_DECREF(kwcopy);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
333 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
334 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
335 if (PyDict_SetItem(kwcopy, key, tmp) < 0) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
336 Py_DECREF(tmp);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
337 Py_DECREF(kwcopy);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
338 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
339 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
340 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
341 tmp = PyUnicode_Format(self, kwcopy);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
342 Py_DECREF(kwcopy);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
343 if (tmp == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
344 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
345 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
346 } else if (PyTuple_Check(args)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
347 nargs = PyTuple_GET_SIZE(args);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
348 args2 = PyTuple_New(nargs);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
349 if (args2 == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
350 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
351 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
352 for (i = 0; i < nargs; i++) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
353 tmp = escape(PyTuple_GET_ITEM(args, i), 1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
354 if (tmp == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
355 Py_DECREF(args2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
356 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
357 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
358 PyTuple_SET_ITEM(args2, i, tmp);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
359 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
360 tmp = PyUnicode_Format(self, args2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
361 Py_DECREF(args2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
362 if (tmp == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
363 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
364 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
365 } else {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
366 tmp2 = escape(args, 1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
367 if (tmp2 == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
368 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
369 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
370 tmp = PyUnicode_Format(self, tmp2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
371 Py_DECREF(tmp2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
372 if (tmp == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
373 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
374 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
375 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
376 args = PyTuple_New(1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
377 if (args == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
378 Py_DECREF(tmp);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
379 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
380 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
381 PyTuple_SET_ITEM(args, 0, tmp);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
382 ret = PyUnicode_Type.tp_new(&MarkupType, args, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
383 Py_DECREF(args);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
384 return ret;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
385 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
386
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
387 static PyObject *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
388 Markup_mul(PyObject *self, PyObject *num)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
389 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
390 PyObject *unicode, *result, *args;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
391
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
392 if (PyObject_TypeCheck(self, &MarkupType)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
393 unicode = PyObject_Unicode(self);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
394 if (unicode == NULL) return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
395 result = PyNumber_Multiply(unicode, num);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
396 } else { // __rmul__
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
397 unicode = PyObject_Unicode(num);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
398 if (unicode == NULL) return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
399 result = PyNumber_Multiply(unicode, self);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
400 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
401 Py_DECREF(unicode);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
402
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
403 if (result == NULL) return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
404 args = PyTuple_New(1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
405 if (args == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
406 Py_DECREF(result);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
407 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
408 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
409 PyTuple_SET_ITEM(args, 0, result);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
410 result = PyUnicode_Type.tp_new(&MarkupType, args, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
411 Py_DECREF(args);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
412
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
413 return result;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
414 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
415
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
416 static PyObject *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
417 Markup_repr(PyObject *self)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
418 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
419 PyObject *format, *result, *args;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
420
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
421 format = PyString_FromString("<Markup %r>");
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
422 if (format == NULL) return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
423 result = PyObject_Unicode(self);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
424 if (result == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
425 Py_DECREF(format);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
426 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
427 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
428 args = PyTuple_New(1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
429 if (args == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
430 Py_DECREF(format);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
431 Py_DECREF(result);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
432 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
433 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
434 PyTuple_SET_ITEM(args, 0, result);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
435 result = PyString_Format(format, args);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
436 Py_DECREF(format);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
437 Py_DECREF(args);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
438 return result;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
439 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
440
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
441 PyDoc_STRVAR(unescape__doc__,
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
442 "Reverse-escapes &, <, >, and \" and returns a `unicode` object.\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
443 \n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
444 >>> Markup('1 &lt; 2').unescape()\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
445 u'1 < 2'\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
446 \n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
447 :return: the unescaped string\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
448 :rtype: `unicode`\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
449 :see: `genshi.core.unescape`\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
450 ");
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
451
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
452 static PyObject *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
453 Markup_unescape(PyObject* self)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
454 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
455 PyObject *tmp, *tmp2;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
456
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
457 tmp = PyUnicode_Replace(self, qt2, qt1, -1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
458 if (tmp == NULL) return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
459 tmp2 = PyUnicode_Replace(tmp, gt2, gt1, -1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
460 Py_DECREF(tmp);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
461 if (tmp2 == NULL) return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
462 tmp = PyUnicode_Replace(tmp2, lt2, lt1, -1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
463 Py_DECREF(tmp2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
464 if (tmp == NULL) return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
465 tmp2 = PyUnicode_Replace(tmp, amp2, amp1, -1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
466 Py_DECREF(tmp);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
467 return tmp2;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
468 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
469
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
470 PyDoc_STRVAR(stripentities__doc__,
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
471 "Return a copy of the text with any character or numeric entities\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
472 replaced by the equivalent UTF-8 characters.\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
473 \n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
474 If the `keepxmlentities` parameter is provided and evaluates to `True`,\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
475 the core XML entities (``&amp;``, ``&apos;``, ``&gt;``, ``&lt;`` and\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
476 ``&quot;``) are not stripped.\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
477 \n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
478 :return: a `Markup` instance with entities removed\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
479 :rtype: `Markup`\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
480 :see: `genshi.util.stripentities`\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
481 ");
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
482
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
483 static PyObject *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
484 Markup_stripentities(PyObject* self, PyObject *args, PyObject *kwds)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
485 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
486 static char *kwlist[] = {"keepxmlentities", 0};
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
487 PyObject *result, *args2;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
488 char keepxml = 0;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
489
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
490 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|b", kwlist, &keepxml)) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
491 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
492 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
493
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
494 if (stripentities == NULL) return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
495 result = PyObject_CallFunction(stripentities, "Ob", self, keepxml);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
496 if (result == NULL) return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
497 args2 = PyTuple_New(1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
498 if (args2 == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
499 Py_DECREF(result);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
500 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
501 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
502 PyTuple_SET_ITEM(args2, 0, result);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
503 result = MarkupType.tp_new(&MarkupType, args2, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
504 Py_DECREF(args2);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
505 return result;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
506 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
507
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
508 PyDoc_STRVAR(striptags__doc__,
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
509 """Return a copy of the text with all XML/HTML tags removed.\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
510 \n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
511 :return: a `Markup` instance with all tags removed\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
512 :rtype: `Markup`\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
513 :see: `genshi.util.striptags`\n\
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
514 ");
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
515
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
516 static PyObject *
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
517 Markup_striptags(PyObject* self)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
518 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
519 PyObject *result, *args;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
520
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
521 if (striptags == NULL) return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
522 result = PyObject_CallFunction(striptags, "O", self);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
523 if (result == NULL) return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
524 args = PyTuple_New(1);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
525 if (args == NULL) {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
526 Py_DECREF(result);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
527 return NULL;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
528 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
529 PyTuple_SET_ITEM(args, 0, result);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
530 result = MarkupType.tp_new(&MarkupType, args, NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
531 Py_DECREF(args);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
532 return result;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
533 }
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
534
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
535 typedef struct {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
536 PyUnicodeObject HEAD;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
537 } MarkupObject;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
538
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
539 static PyMethodDef Markup_methods[] = {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
540 {"__html__", (PyCFunction) Markup_html, METH_NOARGS, NULL},
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
541 {"escape", (PyCFunction) Markup_escape,
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
542 METH_VARARGS|METH_CLASS|METH_KEYWORDS, escape__doc__},
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
543 {"join", (PyCFunction)Markup_join, METH_VARARGS|METH_KEYWORDS, join__doc__},
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
544 {"unescape", (PyCFunction)Markup_unescape, METH_NOARGS, unescape__doc__},
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
545 {"stripentities", (PyCFunction) Markup_stripentities,
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
546 METH_VARARGS|METH_KEYWORDS, stripentities__doc__},
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
547 {"striptags", (PyCFunction) Markup_striptags, METH_NOARGS,
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
548 striptags__doc__},
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
549 {NULL} /* Sentinel */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
550 };
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
551
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
552 static PyNumberMethods Markup_as_number = {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
553 Markup_add, /*nb_add*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
554 0, /*nb_subtract*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
555 Markup_mul, /*nb_multiply*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
556 0, /*nb_divide*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
557 Markup_mod, /*nb_remainder*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
558 };
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
559
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
560 PyTypeObject MarkupType = {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
561 PyObject_HEAD_INIT(NULL)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
562 0,
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
563 "genshi._speedups.Markup",
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
564 sizeof(MarkupObject),
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
565 0,
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
566 0, /*tp_dealloc*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
567 0, /*tp_print*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
568 0, /*tp_getattr*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
569 0, /*tp_setattr*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
570 0, /*tp_compare*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
571 Markup_repr, /*tp_repr*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
572 &Markup_as_number, /*tp_as_number*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
573 0, /*tp_as_sequence*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
574 0, /*tp_as_mapping*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
575 0, /*tp_hash */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
576
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
577 0, /*tp_call*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
578 0, /*tp_str*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
579 0, /*tp_getattro*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
580 0, /*tp_setattro*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
581 0, /*tp_as_buffer*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
582
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
583 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
584 Markup__doc__,/*tp_doc*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
585
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
586 0, /*tp_traverse*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
587 0, /*tp_clear*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
588
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
589 0, /*tp_richcompare*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
590 0, /*tp_weaklistoffset*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
591
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
592 0, /*tp_iter*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
593 0, /*tp_iternext*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
594
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
595 /* Attribute descriptor and subclassing stuff */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
596
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
597 Markup_methods,/*tp_methods*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
598 0, /*tp_members*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
599 0, /*tp_getset*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
600 0, /*tp_base*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
601 0, /*tp_dict*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
602
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
603 0, /*tp_descr_get*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
604 0, /*tp_descr_set*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
605 0, /*tp_dictoffset*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
606
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
607 0, /*tp_init*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
608 0, /*tp_alloc will be set to PyType_GenericAlloc in module init*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
609 0, /*tp_new*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
610 0, /*tp_free Low-level free-memory routine */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
611 0, /*tp_is_gc For PyObject_IS_GC */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
612 0, /*tp_bases*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
613 0, /*tp_mro method resolution order */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
614 0, /*tp_cache*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
615 0, /*tp_subclasses*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
616 0 /*tp_weaklist*/
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
617 };
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
618
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
619 PyMODINIT_FUNC
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
620 init_speedups(void)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
621 {
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
622 PyObject *module;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
623
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
624 /* Workaround for quirk in Visual Studio, see
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
625 <http://www.python.it/faq/faq-3.html#3.24> */
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
626 MarkupType.tp_base = &PyUnicode_Type;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
627
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
628 if (PyType_Ready(&MarkupType) < 0)
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
629 return;
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
630
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
631 init_constants();
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
632
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
633 module = Py_InitModule("_speedups", NULL);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
634 Py_INCREF(&MarkupType);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
635 PyModule_AddObject(module, "Markup", (PyObject *) &MarkupType);
1837f39efd6f Sync (old) experimental inline branch with trunk@1027.
cmlenz
parents:
diff changeset
636 }
Copyright (C) 2012-2017 Edgewall Software