Updated Upskirt files.

This commit is contained in:
Frank
2011-07-03 13:28:24 +02:00
parent b80bdb4012
commit be0a4eb5cd
5 changed files with 50 additions and 253 deletions

View File

@@ -135,6 +135,8 @@ The functionality of the following constants is explained at *Render Flags*.
### 0.3.1 (2011-07-03)
* Renamed Pantyshot to Misaka.
* Updated Upskirt files; See commits from 2011-06-06 to 2011-06-23:
https://github.com/tanoku/upskirt/commits/master/
### 0.3.0 (2011-06-16)

View File

@@ -47,6 +47,13 @@ static size_t
autolink_delim(char *data, size_t link_end, size_t offset, size_t size)
{
char cclose, copen = 0;
size_t i;
for (i = 0; i < link_end; ++i)
if (data[i] == '<') {
link_end = i;
break;
}
while (link_end > 0) {
if (strchr("?!.,", data[link_end - 1]) != NULL)
@@ -63,11 +70,6 @@ autolink_delim(char *data, size_t link_end, size_t offset, size_t size)
else
link_end--;
}
else if (data[link_end - 1] == '>') {
while (link_end > 0 && data[link_end] != '<')
link_end--;
}
else break;
}
@@ -125,11 +127,29 @@ autolink_delim(char *data, size_t link_end, size_t offset, size_t size)
return link_end;
}
static size_t
check_domain(char *data, size_t size)
{
size_t i, np = 0;
if (!isalnum(data[0]))
return 0;
for (i = 1; i < size - 1; ++i) {
if (data[i] == '.') np++;
else if (!isalnum(data[i]) && data[i] != '-') break;
}
if (!isalnum(data[i - 1]) || np == 0)
return 0;
return i;
}
size_t
ups_autolink__www(size_t *rewind_p, struct buf *link, char *data, size_t offset, size_t size)
{
size_t link_end;
int np = 0;
if (offset > 0 && !ispunct(data[-1]) && !isspace(data[-1]))
return 0;
@@ -137,17 +157,14 @@ ups_autolink__www(size_t *rewind_p, struct buf *link, char *data, size_t offset,
if (size < 4 || memcmp(data, "www.", STRLEN("www.")) != 0)
return 0;
link_end = 0;
while (link_end < size && !isspace(data[link_end])) {
if (data[link_end] == '.')
np++;
link_end = check_domain(data, size);
link_end++;
}
if (np < 2)
if (link_end == 0)
return 0;
while (link_end < size && !isspace(data[link_end]))
link_end++;
link_end = autolink_delim(data, link_end, offset, size);
if (link_end == 0)
@@ -211,7 +228,7 @@ ups_autolink__email(size_t *rewind_p, struct buf *link, char *data, size_t offse
size_t
ups_autolink__url(size_t *rewind_p, struct buf *link, char *data, size_t offset, size_t size)
{
size_t link_end, rewind = 0;
size_t link_end, rewind = 0, domain_len;
if (size < 4 || data[1] != '/' || data[2] != '/')
return 0;
@@ -221,8 +238,13 @@ ups_autolink__url(size_t *rewind_p, struct buf *link, char *data, size_t offset,
if (!is_safe_link(data - rewind, size + rewind))
return 0;
link_end = STRLEN("://");
link_end = 0;
domain_len = check_domain(data + link_end, size - link_end);
if (domain_len == 0)
return 0;
link_end += domain_len;
while (link_end < size && !isspace(data[link_end]))
link_end++;

View File

@@ -19,12 +19,6 @@
#include "buffer.h"
typedef enum {
AUTOLINK_URLS = (1 << 0),
AUTOLINK_EMAILS = (1 << 1),
AUTOLINK_ALL = AUTOLINK_URLS|AUTOLINK_EMAILS
} autolink_mode;
extern size_t
ups_autolink__www(size_t *rewind_p, struct buf *link, char *data, size_t offset, size_t size);

View File

@@ -1,221 +0,0 @@
/*
* Copyright (c) 2011, Vicent Marti
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "autolink.h"
#include "buffer.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
static void
autolink_escape_cb(struct buf *ob, const struct buf *text, void *unused)
{
size_t i = 0, org;
while (i < text->size) {
org = i;
while (i < text->size &&
text->data[i] != '<' &&
text->data[i] != '>' &&
text->data[i] != '&' &&
text->data[i] != '"')
i++;
if (i > org)
bufput(ob, text->data + org, i - org);
if (i >= text->size)
break;
switch (text->data[i]) {
case '<': BUFPUTSL(ob, "&lt;"); break;
case '>': BUFPUTSL(ob, "&gt;"); break;
case '&': BUFPUTSL(ob, "&amp;"); break;
case '"': BUFPUTSL(ob, "&quot;"); break;
default: bufputc(ob, text->data[i]); break;
}
i++;
}
}
static inline int
is_closing_a(const char *tag, size_t size)
{
size_t i;
if (tag[0] != '<' || size < STRLEN("</a>") || tag[1] != '/')
return 0;
i = 2;
while (i < size && isspace(tag[i]))
i++;
if (i == size || tag[i] != 'a')
return 0;
i++;
while (i < size && isspace(tag[i]))
i++;
if (i == size || tag[i] != '>')
return 0;
return i;
}
static size_t
skip_tags(struct buf *ob, const char *text, size_t size)
{
size_t i = 0;
while (i < size && text[i] != '>')
i++;
if (size > 3 && text[1] == 'a' && isspace(text[2])) {
while (i < size) {
size_t tag_len = is_closing_a(text + i, size - i);
if (tag_len) {
i += tag_len;
break;
}
i++;
}
}
bufput(ob, text, i + 1);
return i + 1;
}
void
upshtml_autolink(
struct buf *ob,
struct buf *text,
unsigned int flags,
const char *link_attr,
void (*link_text_cb)(struct buf *ob, const struct buf *link, void *payload),
void *payload)
{
size_t i, end;
struct buf *link = bufnew(16);
const char *active_chars;
if (!text || text->size == 0)
return;
switch (flags) {
case AUTOLINK_EMAILS:
active_chars = "<@";
break;
case AUTOLINK_URLS:
active_chars = "<w:";
case AUTOLINK_ALL:
active_chars = "<@w:";
break;
default:
return;
}
if (link_text_cb == NULL)
link_text_cb = &autolink_escape_cb;
bufgrow(ob, text->size);
i = end = 0;
while (i < text->size) {
size_t rewind;
while (end < text->size && strchr(active_chars, text->data[end]) == NULL)
end++;
bufput(ob, text->data + i, end - i);
if (end >= text->size)
break;
i = end;
link->size = 0;
switch (text->data[i]) {
case '@':
end = ups_autolink__email(&rewind, link, text->data + i, i, text->size - i);
if (end > 0) {
ob->size -= rewind;
BUFPUTSL(ob, "<a");
if (link_attr) bufputs(ob, link_attr);
BUFPUTSL(ob, " href=\"mailto:");
bufput(ob, link->data, link->size);
BUFPUTSL(ob, "\">");
link_text_cb(ob, link, payload);
BUFPUTSL(ob, "</a>");
}
break;
case 'w':
end = ups_autolink__www(&rewind, link, text->data + i, i, text->size - i);
if (end > 0) {
BUFPUTSL(ob, "<a");
if (link_attr) bufputs(ob, link_attr);
BUFPUTSL(ob, " href=\"http://");
bufput(ob, link->data, link->size);
BUFPUTSL(ob, "\">");
link_text_cb(ob, link, payload);
BUFPUTSL(ob, "</a>");
}
break;
case ':':
end = ups_autolink__url(&rewind, link, text->data + i, i, text->size - i);
if (end > 0) {
ob->size -= rewind;
BUFPUTSL(ob, "<a");
if (link_attr) bufputs(ob, link_attr);
BUFPUTSL(ob, " href=\"");
bufput(ob, link->data, link->size);
BUFPUTSL(ob, "\">");
link_text_cb(ob, link, payload);
BUFPUTSL(ob, "</a>");
}
break;
case '<':
end = skip_tags(ob, text->data + i, text->size - i);
break;
default:
end = 0;
break;
}
if (!end)
end = i + 1;
else {
i += end;
end = i;
}
}
}

View File

@@ -365,10 +365,10 @@ parse_inline(struct buf *ob, struct render *rndr, char *data, size_t size)
end = markdown_char_ptrs[(int)action](ob, rndr, data + i, i, size - i);
if (!end) /* no action from the callback */
end = i + 1;
else {
else {
i += end;
end = i;
}
}
}
}
@@ -479,7 +479,7 @@ parse_emph2(struct buf *ob, struct render *rndr, char *data, size_t size, char c
if (!render_method)
return 0;
while (i < size) {
len = find_emph_char(data + i, size - i, c);
if (!len) return 0;
@@ -536,7 +536,7 @@ parse_emph3(struct buf *ob, struct render *rndr, char *data, size_t size, char c
else return len - 1;
}
}
return 0;
return 0;
}
/* char_emphasis • single and double emphasis parsing */
@@ -569,7 +569,7 @@ char_emphasis(struct buf *ob, struct render *rndr, char *data, size_t offset, si
return ret + 3;
}
return 0;
return 0;
}
@@ -1519,7 +1519,7 @@ parse_listitem(struct buf *ob, struct render *rndr, char *data, size_t size, int
/* intermediate render of block li */
if (sublist && sublist < work->size) {
parse_block(inter, rndr, work->data, sublist);
parse_block(inter, rndr, work->data + sublist, work->size - sublist);
parse_block(inter, rndr, work->data + sublist, work->size - sublist);
}
else
parse_block(inter, rndr, work->data, work->size);
@@ -1670,7 +1670,7 @@ parse_htmlblock(struct buf *ob, struct render *rndr, char *data, size_t size, in
if (do_render && rndr->make.blockhtml)
rndr->make.blockhtml(ob, &work, rndr->make.opaque);
return work.size;
}
}
}
/* HR, which is the only self-closing block tag considered */
@@ -1688,7 +1688,7 @@ parse_htmlblock(struct buf *ob, struct render *rndr, char *data, size_t size, in
rndr->make.blockhtml(ob, &work, rndr->make.opaque);
return work.size;
}
}
}
}
/* no special case recognised */
@@ -1719,7 +1719,7 @@ parse_htmlblock(struct buf *ob, struct render *rndr, char *data, size_t size, in
found = 1;
break;
}
}
}
}
if (!found) return 0;
@@ -2068,7 +2068,7 @@ is_ref(char *data, size_t beg, size_t end, size_t *last, struct array *refs)
bufput(lr->title, data + title_offset,
title_end - title_offset); }
else lr->title = 0;
return 1;
return 1;
}
static void expand_tabs(struct buf *ob, const char *line, size_t size)