lyx_mirror/src/support/counter_reps.cpp
Richard Kimberly Heck 684d27c0fb New counter manipulation inset.
This inset allows counters to be set, reset, saved, restored, etc,
both in the LyX GUI and in the output; optionally, the effect can be
limited to the GUI. Of course, LaTeX provides means for doing all of
these things, so they could previously be done with ERT, as far as
the output is concerned. But there was no mechanism for manipulating
counters in the GUI and none for other output formats.
2020-04-30 23:09:36 -04:00

136 lines
3.2 KiB
C++

/**
* \file convert.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author André Pönitz
* \author Lars Gullik Bjønnes
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "support/counter_reps.h"
#include "support/docstring.h"
#include "support/lstrings.h"
using namespace std;
namespace lyx {
char loweralphaCounter(int const n)
{
if (n < 1 || n > 26)
return '?';
return 'a' + n - 1;
}
char alphaCounter(int const n)
{
if (n < 1 || n > 26)
return '?';
return 'A' + n - 1;
}
char hebrewCounter(int const n)
{
static const char hebrew[22] = {
'\xe0', '\xe1', '\xe2', '\xe3', '\xe4', '\xe5', '\xe6', '\xe7', '\xe8',
'\xe9', '\xeb', '\xec', '\xee', '\xf0', '\xf1', '\xf2', '\xf4', '\xf6',
'\xf7', '\xf8', '\xf9', '\xfa'
};
if (n < 1 || n > 22)
return '?';
return hebrew[n - 1];
}
// On the special cases, see http://mathworld.wolfram.com/RomanNumerals.html
// and for a list of roman numerals up to and including 3999, see
// http://www.research.att.com/~njas/sequences/a006968.txt. (Thanks to Joost
// for this info.)
docstring const romanCounter(int const n)
{
static char const * const ones[9] = {
"I", "II", "III", "IV", "V",
"VI", "VII", "VIII", "IX"
};
static char const * const tens[9] = {
"X", "XX", "XXX", "XL", "L",
"LX", "LXX", "LXXX", "XC"
};
static char const * const hunds[9] = {
"C", "CC", "CCC", "CD", "D",
"DC", "DCC", "DCCC", "CM"
};
if (n >= 1000 || n < 1)
return from_ascii("??");
int val = n;
string roman;
switch (n) {
//special cases
case 900:
roman = "CM";
break;
case 400:
roman = "CD";
break;
default:
if (val >= 100) {
int hundreds = val / 100;
roman = hunds[hundreds - 1];
val = val % 100;
}
if (val >= 10) {
switch (val) {
//special case
case 90:
roman = roman + "XC";
val = 0; //skip next
break;
default:
int tensnum = val / 10;
roman = roman + tens[tensnum - 1];
val = val % 10;
} // end switch
} // end tens
if (val > 0)
roman = roman + ones[val -1];
}
return from_ascii(roman);
}
docstring const lowerromanCounter(int const n)
{
return support::lowercase(romanCounter(n));
}
docstring const fnsymbolCounter(int const n)
{
switch(n) {
case 1: return docstring(1, 0x002a); //*
case 2: return docstring(1, 0x2020); // dagger
case 3: return docstring(1, 0x2021); // double dagger
case 4: return docstring(1, 0x00A7); // section sign
case 5: return docstring(1, 0x00B6); // pilcrow sign
case 6: return docstring(1, 0x2016); // vertical bar
case 7: return docstring(2, 0x002a); // two *
case 8: return docstring(2, 0x2020); // two daggers
case 9: return docstring(2, 0x2021); // two double daggers
default:
return from_ascii("?");
};
}
} // namespace lyx