Пример #1
0
/* closed by a symbol not preceded by whitespace and not followed by symbol */
static size_t
parse_emph1(struct buf *ob, struct render *rndr,
			char *data, size_t size, char c) {
	size_t i = 0, len;
	struct buf *work = 0;
	int r;

	if (!rndr->make.emphasis) return 0;

	/* skipping one symbol if coming from emph3 */
	if (size > 1 && data[0] == c && data[1] == c) i = 1;

	while (i < size) {
		len = find_emph_char(data + i, size - i, c);
		if (!len) return 0;
		i += len;
		if (i >= size) return 0;

		if (i + 1 < size && data[i + 1] == c) {
			i += 1;
			continue; }
		if (data[i] == c && data[i - 1] != ' '
		&& data[i - 1] != '\t' && data[i - 1] != '\n') {
			work = new_work_buffer(rndr);
			parse_inline(work, rndr, data, i);
			r = rndr->make.emphasis(ob, work, c, rndr->make.opaque);
			release_work_buffer(rndr, work);
			return r ? i + 1 : 0; } }
	return 0; }
Пример #2
0
/* parse_emph2 • parsing single emphase */
static size_t
parse_emph2(struct buf *ob, struct render *rndr, char *data, size_t size, char c)
{
	int (*render_method)(struct buf *ob, struct buf *text, void *opaque);
	size_t i = 0, len;
	struct buf *work = 0;
	int r;

	render_method = (c == '~') ? rndr->make.strikethrough : rndr->make.double_emphasis;

	if (!render_method)
		return 0;
	
	while (i < size) {
		len = find_emph_char(data + i, size - i, c);
		if (!len) return 0;
		i += len;

		if (i + 1 < size && data[i] == c && data[i + 1] == c && i && !isspace(data[i - 1])) {
			work = rndr_newbuf(rndr);
			parse_inline(work, rndr, data, i);
			r = render_method(ob, work, rndr->make.opaque);
			rndr_popbuf(rndr);
			return r ? i + 2 : 0;
		}
		i++;
	}
	return 0;
}
Пример #3
0
/* closed by a symbol not preceded by whitespace and not followed by symbol */
static size_t
parse_emph1(struct buf *ob, struct render *rndr, char *data, size_t size, char c)
{
	size_t i = 0, len;
	struct buf *work = 0;
	int r;

	if (!rndr->make.emphasis) return 0;

	/* skipping one symbol if coming from emph3 */
	if (size > 1 && data[0] == c && data[1] == c) i = 1;

	while (i < size) {
		len = find_emph_char(data + i, size - i, c);
		if (!len) return 0;
		i += len;
		if (i >= size) return 0;

		if (i + 1 < size && data[i + 1] == c) {
			i += 1;
			continue;
		}

		if (data[i] == c && !isspace(data[i - 1])) {

			if ((rndr->ext_flags & MKDEXT_LAX_EMPHASIS) == 0) {
				if (!(i + 1 == size || isspace(data[i + 1]) || ispunct(data[i + 1])))
					continue;
			}

			work = rndr_newbuf(rndr);
			parse_inline(work, rndr, data, i);
			r = rndr->make.emphasis(ob, work, rndr->make.opaque);
			rndr_popbuf(rndr);
			return r ? i + 1 : 0;
		}
	}

	return 0;
}
Пример #4
0
/* finds the first closing tag, and delegates to the other emph */
static size_t
parse_emph3(struct buf *ob, struct render *rndr, char *data, size_t size, char c)
{
	size_t i = 0, len;
	int r;

	while (i < size) {
		len = find_emph_char(data + i, size - i, c);
		if (!len) return 0;
		i += len;

		/* skip whitespace preceded symbols */
		if (data[i] != c || isspace(data[i - 1]))
			continue;

		if (i + 2 < size && data[i + 1] == c && data[i + 2] == c && rndr->make.triple_emphasis) {
			/* triple symbol found */
			struct buf *work = rndr_newbuf(rndr);

			parse_inline(work, rndr, data, i);
			r = rndr->make.triple_emphasis(ob, work, rndr->make.opaque);
			rndr_popbuf(rndr);
			return r ? i + 3 : 0;

		} else if (i + 1 < size && data[i + 1] == c) {
			/* double symbol found, handing over to emph1 */
			len = parse_emph1(ob, rndr, data - 2, size + 2, c);
			if (!len) return 0;
			else return len - 2;

		} else {
			/* single symbol found, handing over to emph2 */
			len = parse_emph2(ob, rndr, data - 1, size + 1, c);
			if (!len) return 0;
			else return len - 1;
		}
	}
	return 0; 
}
Пример #5
0
/* parse_emph2 • parsing single emphase */
static size_t
parse_emph2(struct buf *ob, struct render *rndr,
			char *data, size_t size, char c) {
	size_t i = 0, len;
	struct buf *work = 0;
	int r;

	if (!rndr->make.double_emphasis) return 0;
	
	while (i < size) {
		len = find_emph_char(data + i, size - i, c);
		if (!len) return 0;
		i += len;
		if (i + 1 < size && data[i] == c && data[i + 1] == c
		&& i && data[i - 1] != ' '
		&& data[i - 1] != '\t' && data[i - 1] != '\n') {
			work = new_work_buffer(rndr);
			parse_inline(work, rndr, data, i);
			r = rndr->make.double_emphasis(ob, work, c,
				rndr->make.opaque);
			release_work_buffer(rndr, work);
			return r ? i + 2 : 0; }
		i += 1; }
	return 0; }