Esempio n. 1
0
int
trans(int c, char *p1) {
	int f;
	f = ROM;
	switch( c) {
	case '0': case '1': case '2': case '3': case '4':
	case '5': case '6': case '7': case '8': case '9':
	case ':': case ';': case '!': case '%':
	case '(': case '[': case ')': case ']':
	case ',':
		if (rf == ITAL)
			shim();
		roman(c); break;
	case '.':
		if (rf == ROM)
			roman(c);
		else
			cs[csp++] = c;
		f = rf;
		break;
	case '|':
		if (rf == ITAL)
			shim();
		shim(); roman(c); shim(); break;
	case '=':
		if (rf == ITAL)
			shim();
		name4('e','q');
		break;
	case '+':
		if (rf == ITAL)
			shim();
		name4('p', 'l');
		break;
	case '>': case '<':
		if (rf == ITAL)
			shim();
		if (p1[psp]=='=') {	/* look ahead for == <= >= */
			name4(c,'=');
			psp++;
		} else {
			cs[csp++] = c;  
		}
		break;
	case '-':
		if (rf == ITAL)
			shim();
		if (p1[psp]=='>') {
			name4('-','>'); psp++;
		} else {
			name4('m','i');
		}
		break;
	case '/':
		if (rf == ITAL)
			shim();
		name4('s','l');
		break;
	case '~': case ' ':
		shim(); shim(); break;
	case '^':
		shim(); break;
	case '\\':	/* troff - pass 2 or 3 more chars */
		if (rf == ITAL)
			shim();
		cs[csp++] = c; cs[csp++] = c = p1[psp++]; cs[csp++] = p1[psp++];
		if (c=='(') cs[csp++] = p1[psp++];
		if (c=='*' && cs[csp-1] == '(') {
			cs[csp++] = p1[psp++];
			cs[csp++] = p1[psp++];
		}
		break;
	case '\'':
		cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = rf==ITAL ? ITAL : ROM;
		name4('f','m');
		cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
		f = rf==ITAL ? ITAL : ROM;
		break;

	case 'f':
		if (ft == ITAL) {
			cs[csp++] = '\\'; cs[csp++] = '^';
			cs[csp++] = 'f';
			cs[csp++] = '\\'; cs[csp++] = '|';	/* trying | instead of ^ */
			f = ITAL;
		}
		else
			cs[csp++] = 'f';
		break;
	case 'j':
		if (ft == ITAL) {
			cs[csp++] = '\\'; cs[csp++] = '^';
			cs[csp++] = 'j';
			f = ITAL;
		}
		else
			cs[csp++] = 'j';
		break;
	default:
		cs[csp++] = c;
		f = ft==ITAL ? ITAL : ROM;
		break;
	}
	return(f);
}
Esempio n. 2
0
int
trans(int c, char *blah)
{
	int f;

	if (isalpharune(c) && ft == ITAL && c != 'f' && c != 'j') {	/* italic letter */
		shim(pclass, nclass = ILET);
		cadd(c);
		return ITAL;
	}
	if (isalpharune(c) && ft != ITAL) {		/* other letter */
		shim(pclass, nclass = OLET);
		cadd(c);
		return ROM;
	}
	if (isdigitrune(c)) {
		shim(pclass, nclass = DIG);
		roman(c);
		return ROM;	/* this is the right side font of this object */
	}
	f = ROM;
	nclass = OTHER;
	switch (c) {
	case ':': case ';': case '!': case '%': case '?':
		shim(pclass, nclass);
		roman(c);
		return f;
	case '(': case '[':
		shim(pclass, nclass = LPAR);
		roman(c);
		return f;
	case ')': case ']':
		shim(pclass, nclass = RPAR);
		roman(c);
		return f;
	case ',':
		shim(pclass, nclass = OTHER);
		roman(c);
		return f;
	case '.':
		if (rf == ROM)
			roman(c);
		else
			cadd(c);
		return f;
	case '|':		/* postscript needs help with default width! */
		shim(pclass, nclass = VBAR);
		sadd("\\v'.17m'\\z|\\v'-.17m'\\|");	/* and height */
		return f;
	case '=':
		shim(pclass, nclass = PLUS);
		sadd("\\(eq");
		return f;
	case '+':
		shim(pclass, nclass = PLUS);
		sadd("\\(pl");
		return f;
	case '>':
	case '<':		/* >, >=, >>, <, <-, <=, << */
		shim(pclass, nclass = PLUS);
		if (*psp == '=') {
			sadd(c == '<' ? "\\(<=" : "\\(>=");
			psp++;
		} else if (c == '<' && *psp == '-') {	/* <- only */
			sadd("\\(<-");
			psp++;
		} else if (*psp == c) {		/* << or >> */
			cadd(c);
			cadd(c);
			psp++;
		} else {
			cadd(c);  
		}
		return f;
	case '-':
		shim(pclass, nclass = PLUS);	/* probably too big for ->'s */
		if (*psp == '>') {
			sadd("\\(->");
			psp++;
		} else {
			sadd("\\(mi");
		}
		return f;
	case '/':
		shim(pclass, nclass = SLASH);
		cadd('/');
		return f;
	case '~':
	case ' ':
		sadd("\\|\\|");
		return f;
	case '^':
		sadd("\\|");
		return f;
	case '\\':	/* troff - pass only \(xx without comment */
		shim(pclass, nclass);
		cadd('\\');
		cadd(c = *psp++);
		if (c == '(' && *psp && *(psp+1)) {
			cadd(*psp++);
			cadd(*psp++);
		} else
			fprintf(stderr, "eqn warning: unquoted troff command \\%c, file %s:%d\n",
				c, curfile->fname, curfile->lineno);
		return f;
	case '\'':
		shim(pclass, nclass);
		sadd("\\(fm");
		return f;

	case 'f':
		if (ft == ITAL) {
			shim(pclass, nclass = ILETF);
			cadd('f');
			f = ITAL;
		} else
			cadd('f');
		return f;
	case 'j':
		if (ft == ITAL) {
			shim(pclass, nclass = ILETJ);
			cadd('j');
			f = ITAL;
		} else
			cadd('j');
		return f;
	default:
		shim(pclass, nclass);
		cadd(c);
		return ft==ITAL ? ITAL : ROM;
	}
}
Esempio n. 3
0
void
html_li(struct html_context *html_context, unsigned char *a,
        unsigned char *xxx3, unsigned char *xxx4, unsigned char **xxx5)
{
	int t = par_format.flags & P_LISTMASK;

	/* When handling the code <li><li> @was_li will be 1 and it means we
	 * have to insert a line break since no list item content has done it
	 * for us. */
	if (html_context->was_li) {
		html_context->line_breax = 0;
		ln_break(html_context, 1);
	}

	/*kill_html_stack_until(html_context, 0
	                      "", "UL", "OL", NULL);*/
	if (t == P_NO_BULLET) {
		/* Print nothing. */
	} else if (!par_format.list_number) {
		if (t == P_O) /* Print U+25E6 WHITE BULLET. */
			put_chrs(html_context, (unsigned char *)"&#9702;", 7);
		else if (t == P_SQUARE) /* Print U+25AA BLACK SMALL SQUARE. */
			put_chrs(html_context, (unsigned char *)"&#9642;", 7);
		else /* Print U+2022 BULLET. */
			put_chrs(html_context, (unsigned char *)"&#8226;", 7);
		put_chrs(html_context, (unsigned char *)"&nbsp;", 6);
		par_format.leftmargin += 2;
		par_format.align = ALIGN_LEFT;

	} else {
		unsigned char c = 0;
		int nlen;
		int t = par_format.flags & P_LISTMASK;
		int s = get_num(a, (unsigned char *)"value", html_context->doc_cp);
		struct string n;

		if (!init_string(&n)) return;

		if (s != -1) par_format.list_number = s;

		if (t == P_ALPHA || t == P_alpha) {
			unsigned char n0;

			put_chrs(html_context, (unsigned char *)"&nbsp;", 6);
			c = 1;
			n0 = par_format.list_number
			       ? (par_format.list_number - 1) % 26
			         + (t == P_ALPHA ? 'A' : 'a')
			       : 0;
			if (n0) add_char_to_string(&n, n0);

		} else if (t == P_ROMAN || t == P_roman) {
			roman(&n, par_format.list_number);
			if (t == P_ROMAN) {
				unsigned char *x;

				for (x = n.source; *x; x++) *x = c_toupper(*x);
			}

		} else {
			unsigned char n0[64];
			if (par_format.list_number < 10) {
				put_chrs(html_context, (unsigned char *)"&nbsp;", 6);
				c = 1;
			}

			ulongcat(n0, NULL, par_format.list_number, (sizeof(n) - 1), 0);
			add_to_string(&n, n0);
		}

		nlen = n.length;
		put_chrs(html_context, n.source, nlen);
		put_chrs(html_context, (unsigned char *)".&nbsp;", 7);
		par_format.leftmargin += nlen + c + 2;
		par_format.align = ALIGN_LEFT;
		done_string(&n);

		{
			struct html_element *element;

			element = search_html_stack(html_context, (unsigned char *)"ol");
			if (element)
				element->parattr.list_number = par_format.list_number + 1;
		}

		par_format.list_number = 0;
	}

	html_context->putsp = HTML_SPACE_SUPPRESS;
	html_context->line_breax = 2;
	html_context->was_li = 1;
}