Exemplo n.º 1
0
bool path_prefix_is(string & path, string const & pre, path_case how)
{
#ifdef __APPLE__
	docstring const p1 = from_utf8(path);
	docstring const p2 = from_utf8(pre);
	docstring::size_type const p1_len = p1.length();
	docstring::size_type const p2_len = p2.length();
	docstring::size_type common_len = common_path(p1, p2);

	if (p2[p2_len - 1] == '/' && p1_len != p2_len)
		++common_len;

	if (common_len != p2_len)
		return false;

	if (how == CASE_ADJUSTED && !prefixIs(path, pre)) {
		if (p1_len < common_len)
			path = to_utf8(p2.substr(0, p1_len));
		else
			path = to_utf8(p2 + p1.substr(common_len,
							p1_len - common_len));
	}

	return true;
#else
	// silence compiler warnings
	(void)how;

	return prefixIs(path, pre);
#endif
}
Exemplo n.º 2
0
void InsetText::setText(docstring const & data, Font const & font, bool trackChanges)
{
	clear();
	Paragraph & first = paragraphs().front();
	for (unsigned int i = 0; i < data.length(); ++i)
		first.insertChar(i, data[i], font, trackChanges);
}
Exemplo n.º 3
0
docstring::size_type common_path(docstring const & p1, docstring const & p2)
{
	docstring::size_type i = 0;
	docstring::size_type const p1_len = p1.length();
	docstring::size_type const p2_len = p2.length();
	while (i < p1_len && i < p2_len && uppercase(p1[i]) == uppercase(p2[i]))
		++i;
	if ((i < p1_len && i < p2_len)
	    || (i < p1_len && p1[i] != '/' && i == p2_len)
	    || (i < p2_len && p2[i] != '/' && i == p1_len))
	{
		if (i)
			--i;     // here was the last match
		while (i && p1[i] != '/')
			--i;
	}
	return i;
}
Exemplo n.º 4
0
string const to_ascii(docstring const & ucs4)
{
	int const len = ucs4.length();
	string ascii;
	ascii.resize(len);
	for (int i = 0; i < len; ++i) {
		LASSERT(ucs4[i] < 0x80, /**/);
		ascii[i] = static_cast<char>(ucs4[i]);
	}
	return ascii;
}
Exemplo n.º 5
0
void writePlaintextParagraph(Buffer const & buf,
                             Paragraph const & par,
                             odocstream & os,
                             OutputParams const & runparams,
                             bool & ref_printed)
{
    int ltype = 0;
    depth_type ltype_depth = 0;
    depth_type depth = par.params().depth();

    // First write the layout
    string const tmp = to_utf8(par.layout().name());
    if (compare_ascii_no_case(tmp, "itemize") == 0) {
        ltype = 1;
        ltype_depth = depth + 1;
    } else if (compare_ascii_no_case(tmp, "enumerate") == 0) {
        ltype = 2;
        ltype_depth = depth + 1;
    } else if (contains(ascii_lowercase(tmp), "ection")) {
        ltype = 3;
        ltype_depth = depth + 1;
    } else if (contains(ascii_lowercase(tmp), "aragraph")) {
        ltype = 4;
        ltype_depth = depth + 1;
    } else if (compare_ascii_no_case(tmp, "description") == 0) {
        ltype = 5;
        ltype_depth = depth + 1;
    } else if (compare_ascii_no_case(tmp, "abstract") == 0) {
        ltype = 6;
        ltype_depth = 0;
    } else if (compare_ascii_no_case(tmp, "bibliography") == 0) {
        ltype = 7;
        ltype_depth = 0;
    } else {
        ltype = 0;
        ltype_depth = 0;
    }

    /* the labelwidthstring used in lists */

    /* noindent ? */

    /* what about the alignment */

    // runparams.linelen == 0 is special and means we don't have paragraph breaks

    string::size_type currlinelen = 0;

    os << docstring(depth * 2, ' ');
    currlinelen += depth * 2;

    //--
    // we should probably change to the paragraph language in the
    // support/gettext.here (if possible) so that strings are output in
    // the correct language! (20012712 Jug)
    //--
    switch (ltype) {
    case 0: // Standard
    case 4: // (Sub)Paragraph
    case 5: // Description
        break;

    case 6: // Abstract
        if (runparams.linelen > 0) {
            os << buf.B_("Abstract") << "\n\n";
            currlinelen = 0;
        } else {
            docstring const abst = buf.B_("Abstract: ");
            os << abst;
            currlinelen += abst.length();
        }
        break;

    case 7: // Bibliography
        if (!ref_printed) {
            if (runparams.linelen > 0) {
                os << buf.B_("References") << "\n\n";
                currlinelen = 0;
            } else {
                docstring const refs = buf.B_("References: ");
                os << refs;
                currlinelen += refs.length();
            }
            ref_printed = true;
        }
        break;

    default: {
        docstring const label = par.params().labelString();
        if (!label.empty()) {
            os << label << ' ';
            currlinelen += label.length() + 1;
        }
        break;
    }

    }

    if (currlinelen == 0) {
        pair<int, docstring> p = addDepth(depth, ltype_depth);
        os << p.second;
        currlinelen += p.first;
    }

    docstring word;

    for (pos_type i = 0; i < par.size(); ++i) {
        // deleted characters don't make much sense in plain text output
        if (par.isDeleted(i))
            continue;

        char_type c = par.getUChar(buf.params(), i);

        if (par.isInset(i) || c == ' ') {
            if (runparams.linelen > 0 &&
                    currlinelen + word.length() > runparams.linelen) {
                os << '\n';
                pair<int, docstring> p = addDepth(depth, ltype_depth);
                os << p.second;
                currlinelen = p.first;
            }
            os << word;
            currlinelen += word.length();
            word.erase();
        }

        if (par.isInset(i)) {
            OutputParams rp = runparams;
            rp.depth = par.params().depth();
            int len = par.getInset(i)->plaintext(os, rp);
            if (len >= Inset::PLAINTEXT_NEWLINE)
                currlinelen = len - Inset::PLAINTEXT_NEWLINE;
            else
                currlinelen += len;
            continue;
        }

        switch (c) {
        case ' ':
            os << ' ';
            currlinelen++;
            break;

        case '\0':
            LYXERR(Debug::INFO, "writePlaintextFile: NUL char in structure.");
            break;

        default:
            word += c;
            break;
        }
    }

    // currlinelen may be greater than runparams.linelen!
    // => check whether word is empty and do nothing in this case
    if (!word.empty()) {
        if (runparams.linelen > 0 &&
                currlinelen + word.length() > runparams.linelen) {
            os << '\n';
            pair<int, docstring> p = addDepth(depth, ltype_depth);
            os << p.second;
            currlinelen = p.first;
        }
        os << word;
    }
}
Exemplo n.º 6
0
string const to_iconv_encoding(docstring const & s, string const & encoding)
{
	std::vector<char> const encoded =
		ucs4_to_eightbit(s.data(), s.length(), encoding);
	return string(encoded.begin(), encoded.end());
}