libs/web: various changes in template library
- rename sanitize_pcdata() and sanitize_utf8() to pcdata() and utf8() - implement striptags()
This commit is contained in:
parent
e2f3b8923d
commit
f7b4fd2979
4 changed files with 99 additions and 20 deletions
|
@ -44,11 +44,11 @@ int template_L_parse(lua_State *L)
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
int template_L_sanitize_utf8(lua_State *L)
|
int template_L_utf8(lua_State *L)
|
||||||
{
|
{
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
const char *str = luaL_checklstring(L, 1, &len);
|
const char *str = luaL_checklstring(L, 1, &len);
|
||||||
char *res = sanitize_utf8(str, len);
|
char *res = utf8(str, len);
|
||||||
|
|
||||||
if (res != NULL)
|
if (res != NULL)
|
||||||
{
|
{
|
||||||
|
@ -61,11 +61,28 @@ int template_L_sanitize_utf8(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int template_L_sanitize_pcdata(lua_State *L)
|
int template_L_pcdata(lua_State *L)
|
||||||
{
|
{
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
const char *str = luaL_checklstring(L, 1, &len);
|
const char *str = luaL_checklstring(L, 1, &len);
|
||||||
char *res = sanitize_pcdata(str, len);
|
char *res = pcdata(str, len);
|
||||||
|
|
||||||
|
if (res != NULL)
|
||||||
|
{
|
||||||
|
lua_pushstring(L, res);
|
||||||
|
free(res);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int template_L_striptags(lua_State *L)
|
||||||
|
{
|
||||||
|
size_t len = 0;
|
||||||
|
const char *str = luaL_checklstring(L, 1, &len);
|
||||||
|
char *res = striptags(str, len);
|
||||||
|
|
||||||
if (res != NULL)
|
if (res != NULL)
|
||||||
{
|
{
|
||||||
|
@ -129,8 +146,9 @@ static int template_L_hash(lua_State *L) {
|
||||||
/* module table */
|
/* module table */
|
||||||
static const luaL_reg R[] = {
|
static const luaL_reg R[] = {
|
||||||
{ "parse", template_L_parse },
|
{ "parse", template_L_parse },
|
||||||
{ "sanitize_utf8", template_L_sanitize_utf8 },
|
{ "utf8", template_L_utf8 },
|
||||||
{ "sanitize_pcdata", template_L_sanitize_pcdata },
|
{ "pcdata", template_L_pcdata },
|
||||||
|
{ "striptags", template_L_striptags },
|
||||||
{ "load_catalog", template_L_load_catalog },
|
{ "load_catalog", template_L_load_catalog },
|
||||||
{ "close_catalog", template_L_close_catalog },
|
{ "close_catalog", template_L_close_catalog },
|
||||||
{ "change_catalog", template_L_change_catalog },
|
{ "change_catalog", template_L_change_catalog },
|
||||||
|
|
|
@ -244,7 +244,7 @@ template_format_chunk(struct template_parser *parser, size_t *sz)
|
||||||
switch (c->type)
|
switch (c->type)
|
||||||
{
|
{
|
||||||
case T_TYPE_TEXT:
|
case T_TYPE_TEXT:
|
||||||
escape_luastr(buf, c->s, c->e - c->s, 0);
|
luastr_escape(buf, c->s, c->e - c->s, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_TYPE_EXPR:
|
case T_TYPE_EXPR:
|
||||||
|
@ -254,15 +254,15 @@ template_format_chunk(struct template_parser *parser, size_t *sz)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_TYPE_INCLUDE:
|
case T_TYPE_INCLUDE:
|
||||||
escape_luastr(buf, c->s, c->e - c->s, 0);
|
luastr_escape(buf, c->s, c->e - c->s, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_TYPE_I18N:
|
case T_TYPE_I18N:
|
||||||
translate_luastr(buf, c->s, c->e - c->s, 1);
|
luastr_translate(buf, c->s, c->e - c->s, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_TYPE_I18N_RAW:
|
case T_TYPE_I18N_RAW:
|
||||||
translate_luastr(buf, c->s, c->e - c->s, 0);
|
luastr_translate(buf, c->s, c->e - c->s, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_TYPE_CODE:
|
case T_TYPE_CODE:
|
||||||
|
|
|
@ -278,7 +278,7 @@ static int _validate_utf8(unsigned char **s, int l, struct template_buffer *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sanitize given string and replace all invalid UTF-8 sequences with "?" */
|
/* sanitize given string and replace all invalid UTF-8 sequences with "?" */
|
||||||
char * sanitize_utf8(const char *s, unsigned int l)
|
char * utf8(const char *s, unsigned int l)
|
||||||
{
|
{
|
||||||
struct template_buffer *buf = buf_init(l);
|
struct template_buffer *buf = buf_init(l);
|
||||||
unsigned char *ptr = (unsigned char *)s;
|
unsigned char *ptr = (unsigned char *)s;
|
||||||
|
@ -312,7 +312,7 @@ char * sanitize_utf8(const char *s, unsigned int l)
|
||||||
/* Sanitize given string and strip all invalid XML bytes
|
/* Sanitize given string and strip all invalid XML bytes
|
||||||
* Validate UTF-8 sequences
|
* Validate UTF-8 sequences
|
||||||
* Escape XML control chars */
|
* Escape XML control chars */
|
||||||
char * sanitize_pcdata(const char *s, unsigned int l)
|
char * pcdata(const char *s, unsigned int l)
|
||||||
{
|
{
|
||||||
struct template_buffer *buf = buf_init(l);
|
struct template_buffer *buf = buf_init(l);
|
||||||
unsigned char *ptr = (unsigned char *)s;
|
unsigned char *ptr = (unsigned char *)s;
|
||||||
|
@ -368,7 +368,67 @@ char * sanitize_pcdata(const char *s, unsigned int l)
|
||||||
return buf_destroy(buf);
|
return buf_destroy(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void escape_luastr(struct template_buffer *out, const char *s, unsigned int l,
|
char * striptags(const char *s, unsigned int l)
|
||||||
|
{
|
||||||
|
struct template_buffer *buf = buf_init(l);
|
||||||
|
unsigned char *ptr = (unsigned char *)s;
|
||||||
|
unsigned char *end = ptr + l;
|
||||||
|
unsigned char *tag;
|
||||||
|
unsigned char prev;
|
||||||
|
char esq[8];
|
||||||
|
int esl;
|
||||||
|
|
||||||
|
for (prev = ' '; ptr < end; ptr++)
|
||||||
|
{
|
||||||
|
if ((*ptr == '<') && ((ptr + 2) < end) &&
|
||||||
|
((*(ptr + 1) == '/') || isalpha(*(ptr + 1))))
|
||||||
|
{
|
||||||
|
for (tag = ptr; tag < end; tag++)
|
||||||
|
{
|
||||||
|
if (*tag == '>')
|
||||||
|
{
|
||||||
|
if (!isspace(prev))
|
||||||
|
buf_putchar(buf, ' ');
|
||||||
|
|
||||||
|
ptr = tag;
|
||||||
|
prev = ' ';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (isspace(*ptr))
|
||||||
|
{
|
||||||
|
if (!isspace(prev))
|
||||||
|
buf_putchar(buf, *ptr);
|
||||||
|
|
||||||
|
prev = *ptr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch(*ptr)
|
||||||
|
{
|
||||||
|
case '"':
|
||||||
|
case '\'':
|
||||||
|
case '<':
|
||||||
|
case '>':
|
||||||
|
case '&':
|
||||||
|
esl = snprintf(esq, sizeof(esq), "&#%i;", *ptr);
|
||||||
|
buf_append(buf, esq, esl);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
buf_putchar(buf, *ptr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
prev = *ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf_destroy(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void luastr_escape(struct template_buffer *out, const char *s, unsigned int l,
|
||||||
int escape_xml)
|
int escape_xml)
|
||||||
{
|
{
|
||||||
int esl;
|
int esl;
|
||||||
|
@ -411,7 +471,7 @@ void escape_luastr(struct template_buffer *out, const char *s, unsigned int l,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void translate_luastr(struct template_buffer *out, const char *s, unsigned int l,
|
void luastr_translate(struct template_buffer *out, const char *s, unsigned int l,
|
||||||
int escape_xml)
|
int escape_xml)
|
||||||
{
|
{
|
||||||
char *tr;
|
char *tr;
|
||||||
|
@ -420,11 +480,11 @@ void translate_luastr(struct template_buffer *out, const char *s, unsigned int l
|
||||||
switch (lmo_translate(s, l, &tr, &trlen))
|
switch (lmo_translate(s, l, &tr, &trlen))
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
escape_luastr(out, tr, trlen, escape_xml);
|
luastr_escape(out, tr, trlen, escape_xml);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case -1:
|
case -1:
|
||||||
escape_luastr(out, s, l, escape_xml);
|
luastr_escape(out, s, l, escape_xml);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -39,10 +39,11 @@ int buf_append(struct template_buffer *buf, const char *s, int len);
|
||||||
int buf_length(struct template_buffer *buf);
|
int buf_length(struct template_buffer *buf);
|
||||||
char * buf_destroy(struct template_buffer *buf);
|
char * buf_destroy(struct template_buffer *buf);
|
||||||
|
|
||||||
char * sanitize_utf8(const char *s, unsigned int l);
|
char * utf8(const char *s, unsigned int l);
|
||||||
char * sanitize_pcdata(const char *s, unsigned int l);
|
char * pcdata(const char *s, unsigned int l);
|
||||||
|
char * striptags(const char *s, unsigned int l);
|
||||||
|
|
||||||
void escape_luastr(struct template_buffer *out, const char *s, unsigned int l, int escape_xml);
|
void luastr_escape(struct template_buffer *out, const char *s, unsigned int l, int escape_xml);
|
||||||
void translate_luastr(struct template_buffer *out, const char *s, unsigned int l, int escape_xml);
|
void luastr_translate(struct template_buffer *out, const char *s, unsigned int l, int escape_xml);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue