Updated Upskirt files.
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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++;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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, "<"); break;
|
||||
case '>': BUFPUTSL(ob, ">"); break;
|
||||
case '&': BUFPUTSL(ob, "&"); break;
|
||||
case '"': BUFPUTSL(ob, """); 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user