commit 237193f8a888777192981136469a5d4febb8e9d8
Author: Juergen Spitzmueller <[email protected]>
Date: Sat Dec 24 14:27:00 2016 +0100
Some new quote styles
* b `british' (``inner quotation'')
* w >>swedishg>> ('inner quotation') ["g" = Guillemets]
* f <<french>> (``inner quotation'')
* i <<frenchin>> (<<inner quotation>>) ["in" = Imprimerie Nationale]
* r <<russian>> (,,inner quotation``)
Rename "french" to "swiss"
Also rename "single/double" to "secondary/primary" ("inner/outer" in
the UI) and "left/right" to "opening/closing". Note that the inset
identifier string is left as is ("s/d" and "l/r")
---
development/FORMAT | 12 +++
lib/languages | 65 ++++++++++-------
lib/lyx2lyx/lyx_2_3.py | 162 ++++++++++++++++++++++++++++++++++++++++++-
lib/ui/stdmenus.inc | 4 +-
src/BufferParams.cpp | 10 ++-
src/LyXAction.cpp | 29 +++++---
src/Text3.cpp | 5 +-
src/frontends/qt4/Menus.cpp | 57 ++++++++++++++--
src/insets/InsetQuotes.cpp | 114 ++++++++++++++++++++++---------
src/insets/InsetQuotes.h | 22 ++++--
src/tex2lyx/TODO.txt | 11 +++
src/version.h | 4 +-
12 files changed, 402 insertions(+), 93 deletions(-)
diff --git a/development/FORMAT b/development/FORMAT
index 9cc37ed..76c9682 100644
--- a/development/FORMAT
+++ b/development/FORMAT
@@ -11,6 +11,18 @@ adjustments are made to tex2lyx and bugs are fixed in
lyx2lyx.
-----------------------
+2016-12-24 Jürgen Spitzmüller <[email protected]>
+ * Format incremented to 521:
+ Introduce new quote styles:
+ - british \begin_inset Quotes b..
+ - swiss \begin_inset Quotes c..
+ - swedishg \begin_inset Quotes w..
+ - frenchin \begin_inset Quotes i..
+ - russian \begin_inset Quotes r..
+ Change default behavior of French quote style:
+ - Inner quotes are now ``..''.
+ - Former french style is now called "swiss"
+
2016-12-21 Jürgen Spitzmüller <[email protected]>
* Format incremented to 520: Introduce plain quote style:
\begin_inset Quotes qls => \textquotesingle
diff --git a/lib/languages b/lib/languages
index 2df8f0a..3a0b6ad 100644
--- a/lib/languages
+++ b/lib/languages
@@ -12,7 +12,8 @@
# PolyglossiaOpts "<language-specific options>"
# Encoding <encoding>
# FontEncoding <font encoding>
-# QuoteStyle <danish|english|french|german|polish|swedish>
+# QuoteStyle <british|danish|english|french|frenchin|
+# german|polish|russian|swedish|swedishg|swiss|plain>
# InternalEncoding <true|false>
# RTL <true|false>
# AsBabelOptions <true|false>
@@ -43,13 +44,19 @@
# (UK) -- try to select the entry that is most generic -- here
# English.
# * The QuoteStyle arguments correspond to the following styles:
-# - danish: >>text<< >text< (inward guillemets)
-# - english: ``text'' `text' (66_99)
-# - french: <<text>> <text> (outward guillemets)
-# - german: ,,text`` ,text` (99/66)
-# - polish: ,,text'' ,text' (99/99)
-# - swedish: ''text'' 'text' (99_99)
-# - plain: "text" 'text' (straight non-typographical quotes)
+# PRIMARY SECONDARY
+# - british: `text' ``text'' (6_9 -- 66_99)
+# - danish: >>text<< >text< (inward guillemets)
+# - english: ``text'' `text' (66_99 -- 6_9)
+# - french: <<text>> ``text'' (outward guillemets -- 66_99)
+# - frenchin: <<text>> <<text>> (French Imprimerie Nationale
style)
+# - german: ,,text`` ,text` (99/66 -- 9/6)
+# - polish: ,,text'' ,text' (99/99 -- 9/9)
+# - russian: <<text>> ,,text`` (outward guillemets -- 99/66)
+# - swedish: ''text'' 'text' (99_99 -- 9_9)
+# - swedishg: >>text>> 'text' (Swedish Guillemets)
+# - swiss: <<text>> <text> (outward guillemets)
+# - plain: "text" 'text' (non-typographical quotes)
# Note that the option names have been selected (rather arbitrarily)
# because the respective styles are common in the respective countries.
# Of course this does not imply any fixed relation to those countries.
@@ -118,7 +125,7 @@ Language albanian
GuiName "Albanian"
BabelName albanian
PolyglossiaName albanian
- QuoteStyle french
+ QuoteStyle swiss
Encoding iso8859-2
LangCode sq_AL
End
@@ -187,7 +194,7 @@ End
Language armenian
GuiName "Armenian"
PolyglossiaName armenian
- QuoteStyle french
+ QuoteStyle swiss
Encoding utf8
LangCode hy_AM
End
@@ -259,7 +266,7 @@ Language basque
HasGuiSupport true
BabelName basque
PolyglossiaName basque
- QuoteStyle french
+ QuoteStyle swiss
Encoding iso8859-15
LangCode eu_ES
PostBabelPreamble
@@ -310,7 +317,7 @@ Language british
BabelName british
PolyglossiaName english
PolyglossiaOpts "variant=british"
- QuoteStyle english
+ QuoteStyle british
Encoding iso8859-15
LangCode en_GB
End
@@ -462,7 +469,7 @@ Language estonian
GuiName "Estonian"
BabelName estonian
PolyglossiaName estonian
- QuoteStyle polish
+ QuoteStyle german
Encoding iso8859-15
LangCode et_EE
PostBabelPreamble
@@ -480,6 +487,7 @@ Language farsi
FontEncoding "LFE,LAE"
RTL true
LangCode fa_IR
+ QuoteStyle english
PostBabelPreamble
\DeclareTextSymbol{\guillemotright}{LFE}{62}
\DeclareTextSymbol{\guillemotleft}{LFE}{60}
@@ -577,7 +585,7 @@ Language german-ch
BabelName nswissgerman
PolyglossiaName german
PolyglossiaOpts "variant=swiss,spelling=new,babelshorthands=true"
- QuoteStyle danish
+ QuoteStyle swiss
Encoding iso8859-15
LangCode de_CH
End
@@ -590,7 +598,7 @@ Language german-ch-old
BabelName swissgerman
PolyglossiaName german
PolyglossiaOpts "variant=swiss,spelling=old,babelshorthands=true"
- QuoteStyle danish
+ QuoteStyle swiss
Encoding iso8859-15
LangCode de_CH
End
@@ -652,6 +660,7 @@ End
# BabelName hungarian
# Encoding iso8859-2
# LangCode hu_HU
+# QuoteStyle polish
#End
Language icelandic
@@ -672,6 +681,7 @@ Language interlingua
PolyglossiaName interlingua
Encoding iso8859-15
LangCode ia_IA
+ QuoteStyle english
End
Language irish
@@ -787,7 +797,7 @@ Language latvian
GuiName "Latvian"
BabelName latvian
PolyglossiaName latvian
- QuoteStyle danish
+ QuoteStyle german
Encoding iso8859-4
# FontEncoding L7x # (required for hyphenation but not set by babel)
LangCode lv_LV
@@ -871,7 +881,7 @@ Language norsk
HasGuiSupport true
BabelName norsk
PolyglossiaName norsk
- QuoteStyle french
+ QuoteStyle swiss
Encoding iso8859-15
LangCode nb_NO
End
@@ -881,7 +891,7 @@ Language nynorsk
HasGuiSupport true
BabelName nynorsk
PolyglossiaName nynorsk
- QuoteStyle french
+ QuoteStyle swiss
Encoding iso8859-15
LangCode nn_NO
End
@@ -905,6 +915,7 @@ End
# PolyglossiaName russian
# PolyglossiaOpts "spelling=old"
# LangCode ru_petr1708
+# QuoteStyle russian
# End
Language piedmontese
@@ -933,7 +944,7 @@ Language portuguese
HasGuiSupport true
BabelName portuges
PolyglossiaName portuges
- QuoteStyle english
+ QuoteStyle french
Encoding iso8859-15
LangCode pt_PT
End
@@ -963,7 +974,7 @@ Language russian
HasGuiSupport true
BabelName russian
PolyglossiaName russian
- QuoteStyle french
+ QuoteStyle russian
Encoding koi8-r
FontEncoding T2A
LangCode ru_RU
@@ -1002,7 +1013,7 @@ Language serbian
BabelName serbianc
PolyglossiaName serbian
PolyglossiaOpts "script=Cyrillic"
- QuoteStyle german
+ QuoteStyle polish
Encoding utf8
FontEncoding T2A
LangCode sr_RS
@@ -1016,7 +1027,7 @@ Language serbian-latin
BabelName serbian
PolyglossiaName serbian
PolyglossiaOpts "script=Latin"
- QuoteStyle german
+ QuoteStyle polish
Encoding iso8859-2
LangCode sr_RS-Latin
End
@@ -1127,7 +1138,7 @@ Language turkish
HasGuiSupport true
BabelName turkish
PolyglossiaName turkish
- QuoteStyle french
+ QuoteStyle english
Encoding iso8859-9
LangCode tr_TR
PostBabelPreamble
@@ -1141,7 +1152,7 @@ Language turkmen
GuiName "Turkmen"
BabelName turkmen
PolyglossiaName turkmen
- QuoteStyle french
+ QuoteStyle swiss
Encoding utf8
LangCode tk_TM
AsBabelOptions true
@@ -1152,7 +1163,7 @@ Language ukrainian
HasGuiSupport true
BabelName ukrainian
PolyglossiaName ukrainian
- QuoteStyle french
+ QuoteStyle russian
Encoding koi8-u
FontEncoding T2A
LangCode uk_UA
@@ -1183,7 +1194,7 @@ Language vietnamese
GuiName "Vietnamese"
BabelName vietnam
PolyglossiaName vietnamese
- QuoteStyle french
+ QuoteStyle english
Encoding utf8
LangCode vi_VN
AsBabelOptions true
@@ -1194,7 +1205,7 @@ Language welsh
GuiName "Welsh"
BabelName welsh
PolyglossiaName welsh
- QuoteStyle english
+ QuoteStyle british
Encoding iso8859-15
LangCode cy_GB
End
diff --git a/lib/lyx2lyx/lyx_2_3.py b/lib/lyx2lyx/lyx_2_3.py
index 6949364..98eb463 100644
--- a/lib/lyx2lyx/lyx_2_3.py
+++ b/lib/lyx2lyx/lyx_2_3.py
@@ -667,7 +667,7 @@ def revert_quotestyle(document):
def revert_plainquote(document):
- " Revert plain quote inset "
+ " Revert plain quote insets "
# First, revert style setting
i = find_token(document.header, "\\quotes_style plain", 0)
@@ -693,6 +693,162 @@ def revert_plainquote(document):
i = l
+def convert_frenchquotes(document):
+ " Convert french quote insets to swiss "
+
+ # First, revert style setting
+ i = find_token(document.header, "\\quotes_style french", 0)
+ if i != -1:
+ document.header[i] = "\\quotes_style swiss"
+
+ # now the insets
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_inset Quotes f', i)
+ if i == -1:
+ return
+ val = get_value(document.body, "\\begin_inset Quotes", i)[7:]
+ newval = val.replace("f", "c", 1)
+ document.body[i] = document.body[i].replace(val, newval)
+ i += 1
+
+
+def revert_swissquotes(document):
+ " Revert swiss quote insets to french "
+
+ # First, revert style setting
+ i = find_token(document.header, "\\quotes_style swiss", 0)
+ if i != -1:
+ document.header[i] = "\\quotes_style french"
+
+ # now the insets
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_inset Quotes c', i)
+ if i == -1:
+ return
+ val = get_value(document.body, "\\begin_inset Quotes", i)[7:]
+ newval = val.replace("c", "f", 1)
+ document.body[i] = document.body[i].replace(val, newval)
+ i += 1
+
+
+def revert_britishquotes(document):
+ " Revert british quote insets to english "
+
+ # First, revert style setting
+ i = find_token(document.header, "\\quotes_style british", 0)
+ if i != -1:
+ document.header[i] = "\\quotes_style english"
+
+ # now the insets
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_inset Quotes b', i)
+ if i == -1:
+ return
+ val = get_value(document.body, "\\begin_inset Quotes", i)[7:]
+ newval = val.replace("b", "e", 1)
+ if val[2] == "d":
+ # opening mark
+ newval = newval.replace("d", "s")
+ else:
+ # inner marks
+ newval = newval.replace("s", "d")
+ document.body[i] = document.body[i].replace(val, newval)
+ i += 1
+
+
+def revert_swedishgquotes(document):
+ " Revert swedish quote insets "
+
+ # First, revert style setting
+ i = find_token(document.header, "\\quotes_style swedishg", 0)
+ if i != -1:
+ document.header[i] = "\\quotes_style danish"
+
+ # now the insets
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_inset Quotes w', i)
+ if i == -1:
+ return
+ val = get_value(document.body, "\\begin_inset Quotes", i)[7:]
+ if val[2] == "d":
+ # outer marks
+ newval = val.replace("w", "a", 1).replace("r", "l")
+ else:
+ # inner marks
+ newval = val.replace("w", "s", 1)
+ document.body[i] = document.body[i].replace(val, newval)
+ i += 1
+
+
+def revert_frenchquotes(document):
+ " Revert french inner quote insets "
+
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_inset Quotes f', i)
+ if i == -1:
+ return
+ val = get_value(document.body, "\\begin_inset Quotes", i)[7:]
+ if val[2] == "s":
+ # inner marks
+ newval = val.replace("f", "e", 1).replace("s", "d")
+ document.body[i] = document.body[i].replace(val, newval)
+ i += 1
+
+
+def revert_frenchinquotes(document):
+ " Revert inner frenchin quote insets "
+
+ # First, revert style setting
+ i = find_token(document.header, "\\quotes_style frenchin", 0)
+ if i != -1:
+ document.header[i] = "\\quotes_style french"
+
+ # now the insets
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_inset Quotes i', i)
+ if i == -1:
+ return
+ val = get_value(document.body, "\\begin_inset Quotes", i)[7:]
+ newval = val.replace("i", "f", 1)
+ if val[2] == "s":
+ # inner marks
+ newval = newval.replace("s", "d")
+ document.body[i] = document.body[i].replace(val, newval)
+ i += 1
+
+
+def revert_russianquotes(document):
+ " Revert russian quote insets "
+
+ # First, revert style setting
+ i = find_token(document.header, "\\quotes_style russian", 0)
+ if i != -1:
+ document.header[i] = "\\quotes_style french"
+
+ # now the insets
+ i = 0
+ while True:
+ i = find_token(document.body, '\\begin_inset Quotes r', i)
+ if i == -1:
+ return
+ val = get_value(document.body, "\\begin_inset Quotes", i)[7:]
+ newval = val
+ if val[2] == "s":
+ # inner marks
+ newval = val.replace("r", "g", 1).replace("s", "d")
+ else:
+ # outer marks
+ newval = val.replace("r", "f", 1)
+ document.body[i] = document.body[i].replace(val, newval)
+ i += 1
+
+
##
# Conversion hub
#
@@ -710,10 +866,12 @@ convert = [
[517, []],
[518, [convert_iopart]],
[519, [convert_quotestyle]],
- [520, []]
+ [520, []],
+ [521, [convert_frenchquotes]]
]
revert = [
+ [520, [revert_britishquotes, revert_swedishgquotes,
revert_frenchquotes, revert_frenchinquotes, revert_russianquotes,
revert_swissquotes]],
[519, [revert_plainquote]],
[518, [revert_quotestyle]],
[517, [revert_iopart]],
diff --git a/lib/ui/stdmenus.inc b/lib/ui/stdmenus.inc
index 47e7b61..6f2c0c7 100644
--- a/lib/ui/stdmenus.inc
+++ b/lib/ui/stdmenus.inc
@@ -400,8 +400,8 @@ Menuset
Item "Symbols...|b" "dialog-show symbols"
Item "Ellipsis|i" "specialchar-insert dots"
Item "End of Sentence|E" "specialchar-insert end-of-sentence"
- Item "Plain Quotation Mark|Q" "quote-insert double auto plain"
- Item "Single Quotation Mark|S" "quote-insert single"
+ Item "Plain Quotation Mark|Q" "quote-insert outer auto plain"
+ Item "Inner Quotation Mark|n" "quote-insert inner"
Item "Protected Hyphen|y" "specialchar-insert nobreakdash"
Item "Breakable Slash|a" "specialchar-insert slash"
Item "Visible Space|V" "space-insert visible"
diff --git a/src/BufferParams.cpp b/src/BufferParams.cpp
index 740bb6b..3bdfefb 100644
--- a/src/BufferParams.cpp
+++ b/src/BufferParams.cpp
@@ -72,7 +72,8 @@ static char const * const string_paragraph_separation[] = {
static char const * const string_quotes_style[] = {
- "english", "swedish", "german", "polish", "french", "danish", "plain",
""
+ "english", "swedish", "german", "polish", "swiss", "danish", "plain",
+ "british", "swedishg", "french", "frenchin", "russian", ""
};
@@ -138,9 +139,14 @@ QuotesStyleTranslator const init_quotesstyletranslator()
translator.addPair(string_quotes_style[1],
InsetQuotesParams::SwedishQuotes);
translator.addPair(string_quotes_style[2],
InsetQuotesParams::GermanQuotes);
translator.addPair(string_quotes_style[3],
InsetQuotesParams::PolishQuotes);
- translator.addPair(string_quotes_style[4],
InsetQuotesParams::FrenchQuotes);
+ translator.addPair(string_quotes_style[4],
InsetQuotesParams::SwissQuotes);
translator.addPair(string_quotes_style[5],
InsetQuotesParams::DanishQuotes);
translator.addPair(string_quotes_style[6],
InsetQuotesParams::PlainQuotes);
+ translator.addPair(string_quotes_style[7],
InsetQuotesParams::BritishQuotes);
+ translator.addPair(string_quotes_style[8],
InsetQuotesParams::SwedishGQuotes);
+ translator.addPair(string_quotes_style[9],
InsetQuotesParams::FrenchQuotes);
+ translator.addPair(string_quotes_style[10],
InsetQuotesParams::FrenchINQuotes);
+ translator.addPair(string_quotes_style[11],
InsetQuotesParams::RussianQuotes);
return translator;
}
diff --git a/src/LyXAction.cpp b/src/LyXAction.cpp
index 63b4a69..89d12ec 100644
--- a/src/LyXAction.cpp
+++ b/src/LyXAction.cpp
@@ -404,17 +404,22 @@ void LyXAction::init()
* \li Notion: Currently English, Swedish, German, Polish, French, Danish
quotes
are distinguished.
* \li Syntax: quote-insert [<LEVEL>] [<SIDE>] [<STYLE>]
- * \li Params: <LEVEL>: 'single' for single (i.e., inner or secondary) quotes,
otherwise
- * double quotes will be used.
- * <SIDE>: 'left' for opening quotes, 'right' for closing quotes,
otherwise
- * the side will be guessed from the context.
- * <STYLE>: 'english' for ``English'' quote style
- * 'swedish' for ''Swedish'' quote style
- * 'german' for ,,German`` quote style
- * 'polish' for ,,Polish'' quote style
- * 'french' for <<French>> quote style
- * 'danish' for >>Danish<< quote style
- * 'plain' for "Plain" quote style
+ * \li Params: <LEVEL>: 'inner' for (i.e., secondary, usually single) quotes,
otherwise
+ * outer (i.e., primary, usually double) quotes will be
used.
+ * <SIDE>: 'opening' for opening quotes, 'closing' for closing
quotes,
+ * otherwise the side will be guessed from the context.
+ * <STYLE>: 'british' for `British' quote style (with ``inner
quotation'')
+ * 'danish' for >>Danish<< quote style (with >inner
quotation<)
+ * 'english' for ``English'' quote style (with `inner
quotation')
+ * 'french' for <<french>> quote style (with ``inner
quotation'')
+ * 'frenchin' for <<frenchin>> quote style (with <<inner
quotation>>) ["in" = Imprimerie Nationale]
+ * 'german' for ,,German`` quote style (with ,inner
quotation`)
+ * 'plain' for "Plain" quote style (with 'inner
quotation')
+ * 'polish' for ,,Polish'' quote style (with ,inner
quotation')
+ * 'swedish' for ''Swedish'' quote style (with 'inner
quotation')
+ * 'swedishg' for >>swedishg>> quote style (with 'inner
quotation') ["g" = Guillemets]
+ * 'swiss' for <<Swiss>> quote style (with <inner
quotation>)
+ * 'russian' for <<Russian>> quote style (with ,,inner
quotation``)
* If no quote style is specified, the document-wide will
be used.
* \endvar
*/
@@ -2483,7 +2488,7 @@ void LyXAction::init()
inset-modify note Note Comment \n
Change a Box into an Ovalbox: \n
inset-modify changetype Ovalbox \n
- Change a quotation mark to e[nglish style], l[eft side],
s[ingle] \n
+ Change a quotation mark to e[nglish style], l[eft side =
opening], s[ingle = inner, secondary] \n
inset-modify changetype els \n
Change only the style of a quotation mark, maintaining the
other aspects (. = wildcard) \n
inset-modify changetype e.. \n
diff --git a/src/Text3.cpp b/src/Text3.cpp
index cf90c4d..b9619bf 100644
--- a/src/Text3.cpp
+++ b/src/Text3.cpp
@@ -1551,8 +1551,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
char_type c = ' ';
if (pos > 0 && (!cur.prevInset() ||
!cur.prevInset()->isSpace()))
c = par.getChar(pos - 1);
- InsetQuotesParams::QuoteLevel const quote_level =
(cmd.getArg(0) == "single")
- ? InsetQuotesParams::SingleQuotes :
InsetQuotesParams::DoubleQuotes;
+ InsetQuotesParams::QuoteLevel const quote_level =
+ (cmd.getArg(0) == "single" || cmd.getArg(0) ==
"inner")
+ ? InsetQuotesParams::SecondaryQuotes :
InsetQuotesParams::PrimaryQuotes;
cur.insert(new InsetQuotes(cur.buffer(), c, quote_level,
cmd.getArg(1), cmd.getArg(2)));
cur.buffer()->updateBuffer();
cur.posForward();
diff --git a/src/frontends/qt4/Menus.cpp b/src/frontends/qt4/Menus.cpp
index bca8ea8..1100dd3 100644
--- a/src/frontends/qt4/Menus.cpp
+++ b/src/frontends/qt4/Menus.cpp
@@ -1679,9 +1679,14 @@ void MenuDefinition::expandQuotes(BufferView const * bv)
MenuDefinition sqs;
MenuDefinition gqs;
MenuDefinition pqs;
- MenuDefinition fqs;
+ MenuDefinition cqs;
MenuDefinition aqs;
MenuDefinition qqs;
+ MenuDefinition bqs;
+ MenuDefinition wqs;
+ MenuDefinition fqs;
+ MenuDefinition iqs;
+ MenuDefinition rqs;
for (; qq != end; ++qq) {
docstring const style = from_ascii(qq->first);
FuncRequest const cmd = FuncRequest(LFUN_INSET_MODIFY,
from_ascii("changetype ") + style);
@@ -1697,12 +1702,22 @@ void MenuDefinition::expandQuotes(BufferView const * bv)
gqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
else if (prefixIs(style, 'p') && !prefixIs(qtype, "p"))
pqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
- else if (prefixIs(style, 'f') && !prefixIs(qtype, "f"))
- fqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ else if (prefixIs(style, 'c') && !prefixIs(qtype, "c"))
+ cqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
else if (prefixIs(style, 'a') && !prefixIs(qtype, "a"))
aqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
else if (prefixIs(style, 'q') && !prefixIs(qtype, "q"))
qqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ else if (prefixIs(style, 'b') && !prefixIs(qtype, "b"))
+ bqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ else if (prefixIs(style, 'w') && !prefixIs(qtype, "w"))
+ wqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ else if (prefixIs(style, 'f') && !prefixIs(qtype, "f"))
+ fqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ else if (prefixIs(style, 'i') && !prefixIs(qtype, "i"))
+ iqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+ else if (prefixIs(style, 'r') && !prefixIs(qtype, "r"))
+ rqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
}
if (!eqs.empty()) {
@@ -1729,10 +1744,10 @@ void MenuDefinition::expandQuotes(BufferView const * bv)
item.setSubmenu(pqs);
add(item);
}
- if (!fqs.empty()) {
+ if (!cqs.empty()) {
MenuItem item(MenuItem::Submenu,
-
toqstr(quoteparams.getGuiLabel(InsetQuotesParams::FrenchQuotes)));
- item.setSubmenu(fqs);
+
toqstr(quoteparams.getGuiLabel(InsetQuotesParams::SwissQuotes)));
+ item.setSubmenu(cqs);
add(item);
}
if (!aqs.empty()) {
@@ -1747,6 +1762,36 @@ void MenuDefinition::expandQuotes(BufferView const * bv)
item.setSubmenu(qqs);
add(item);
}
+ if (!bqs.empty()) {
+ MenuItem item(MenuItem::Submenu,
+
toqstr(quoteparams.getGuiLabel(InsetQuotesParams::BritishQuotes)));
+ item.setSubmenu(bqs);
+ add(item);
+ }
+ if (!wqs.empty()) {
+ MenuItem item(MenuItem::Submenu,
+
toqstr(quoteparams.getGuiLabel(InsetQuotesParams::SwedishGQuotes)));
+ item.setSubmenu(wqs);
+ add(item);
+ }
+ if (!fqs.empty()) {
+ MenuItem item(MenuItem::Submenu,
+
toqstr(quoteparams.getGuiLabel(InsetQuotesParams::FrenchQuotes)));
+ item.setSubmenu(fqs);
+ add(item);
+ }
+ if (!iqs.empty()) {
+ MenuItem item(MenuItem::Submenu,
+
toqstr(quoteparams.getGuiLabel(InsetQuotesParams::FrenchINQuotes)));
+ item.setSubmenu(iqs);
+ add(item);
+ }
+ if (!rqs.empty()) {
+ MenuItem item(MenuItem::Submenu,
+
toqstr(quoteparams.getGuiLabel(InsetQuotesParams::RussianQuotes)));
+ item.setSubmenu(rqs);
+ add(item);
+ }
}
diff --git a/src/insets/InsetQuotes.cpp b/src/insets/InsetQuotes.cpp
index 248d5de..342a9de 100644
--- a/src/insets/InsetQuotes.cpp
+++ b/src/insets/InsetQuotes.cpp
@@ -56,12 +56,17 @@ namespace {
* s ''swedish'' ('inner quotation')
* g ,,german`` (,inner quotation`)
* p ,,polish'' (,inner quotation')
- * f <<french>> (<inner quotation>)
+ * c <<swiss>> (<inner quotation>)
* a >>danish<< (>inner quotation<)
* q "plain" ('inner quotation')
+ * b `british' (``inner quotation'')
+ * w >>swedishg>> ('inner quotation') ["g" = Guillemets]
+ * f <<french>> (``inner quotation'')
+ * i <<frenchin>> (<<inner quotation>>) ["in" = Imprimerie Nationale]
+ * r <<russian>> (,,inner quotation``)
*/
-char const * const style_char = "esgpfaq";
+char const * const style_char = "esgpcaqbwfir";
char const * const side_char = "lr" ;
char const * const level_char = "sd";
@@ -124,7 +129,7 @@ char_type InsetQuotesParams::getQuoteChar(QuoteStyle const
& style, QuoteLevel c
right_secondary = 0x2019; // '
break;
}
- case FrenchQuotes: {
+ case SwissQuotes: {
left_primary = 0x00ab; // <<
right_primary = 0x00bb; // >>
left_secondary = 0x2039; // <
@@ -145,6 +150,41 @@ char_type InsetQuotesParams::getQuoteChar(QuoteStyle const
& style, QuoteLevel c
right_secondary = 0x0027; // '
break;
}
+ case BritishQuotes: {
+ left_primary = 0x2018; // `
+ right_primary = 0x2019; // '
+ left_secondary = 0x201c; // ``
+ right_secondary = 0x201d; // ''
+ break;
+ }
+ case SwedishGQuotes: {
+ left_primary = 0x00bb; // >>
+ right_primary = 0x00bb; // >>
+ left_secondary = 0x2019; // '
+ right_secondary = 0x2019; // '
+ break;
+ }
+ case FrenchQuotes: {
+ left_primary = 0x00ab; // <<
+ right_primary = 0x00bb; // >>
+ left_secondary = 0x201c; // ``
+ right_secondary = 0x201d; // ''
+ break;
+ }
+ case FrenchINQuotes:{
+ left_primary = 0x00ab; // <<
+ right_primary = 0x00bb; // >>
+ left_secondary = 0x00ab; // <<
+ right_secondary = 0x00bb; // >>
+ break;
+ }
+ case RussianQuotes:{
+ left_primary = 0x00ab; // <<
+ right_primary = 0x00bb; // >>
+ left_secondary = 0x201e; // ,,
+ right_secondary = 0x201c; // ``
+ break;
+ }
default:
// should not happen
left_primary = 0x003f; // ?
@@ -155,10 +195,10 @@ char_type InsetQuotesParams::getQuoteChar(QuoteStyle
const & style, QuoteLevel c
}
switch (level) {
- case SingleQuotes:
- return (side == LeftQuote) ? left_secondary : right_secondary;
- case DoubleQuotes:
- return (side == LeftQuote) ? left_primary : right_primary;
+ case SecondaryQuotes:
+ return (side == OpeningQuote) ? left_secondary :
right_secondary;
+ case PrimaryQuotes:
+ return (side == OpeningQuote) ? left_primary : right_primary;
default:
break;
}
@@ -346,10 +386,10 @@ map<string, docstring> InsetQuotesParams::getTypes() const
docstring const InsetQuotesParams::getGuiLabel(QuoteStyle const & qs)
{
return bformat(_("%1$souter%2$s and %3$sinner%4$s[[quotation marks]]"),
- docstring(1, quoteparams.getQuoteChar(qs, DoubleQuotes,
LeftQuote)),
- docstring(1, quoteparams.getQuoteChar(qs, DoubleQuotes,
RightQuote)),
- docstring(1, quoteparams.getQuoteChar(qs, SingleQuotes,
LeftQuote)),
- docstring(1, quoteparams.getQuoteChar(qs, SingleQuotes,
RightQuote))
+ docstring(1, quoteparams.getQuoteChar(qs, PrimaryQuotes,
OpeningQuote)),
+ docstring(1, quoteparams.getQuoteChar(qs, PrimaryQuotes,
ClosingQuote)),
+ docstring(1, quoteparams.getQuoteChar(qs, SecondaryQuotes,
OpeningQuote)),
+ docstring(1, quoteparams.getQuoteChar(qs, SecondaryQuotes,
ClosingQuote))
);
}
@@ -379,10 +419,10 @@ InsetQuotes::InsetQuotes(Buffer * buf, char_type c,
InsetQuotesParams::QuoteLeve
fontenc_ = lyxrc.fontenc;
}
- if (side == "left")
- side_ = InsetQuotesParams::LeftQuote;
- else if (side == "right")
- side_ = InsetQuotesParams::RightQuote;
+ if (side == "left" || side == "opening")
+ side_ = InsetQuotesParams::OpeningQuote;
+ else if (side == "right" || side == "closing")
+ side_ = InsetQuotesParams::ClosingQuote;
else
setSide(c);
}
@@ -396,15 +436,15 @@ docstring InsetQuotes::layoutName() const
void InsetQuotes::setSide(char_type c)
{
- // Decide whether left or right
+ // Decide whether opening or closing quote
switch (c) {
case ' ':
case '(':
case '[':
- side_ = InsetQuotesParams::LeftQuote; // left quote
+ side_ = InsetQuotesParams::OpeningQuote;// opening quote
break;
default:
- side_ = InsetQuotesParams::RightQuote; // right quote
+ side_ = InsetQuotesParams::ClosingQuote;// closing quote
}
}
@@ -446,7 +486,7 @@ void InsetQuotes::parseString(string const & s, bool const
allow_wildcards)
if (i >= 2) {
LYXERR0("ERROR (InsetQuotes::InsetQuotes):"
" bad side specification.");
- side_ = InsetQuotesParams::LeftQuote;
+ side_ = InsetQuotesParams::OpeningQuote;
}
}
@@ -461,7 +501,7 @@ void InsetQuotes::parseString(string const & s, bool const
allow_wildcards)
if (i >= 2) {
LYXERR0("ERROR (InsetQuotes::InsetQuotes):"
" bad level specification.");
- level_ = InsetQuotesParams::DoubleQuotes;
+ level_ = InsetQuotesParams::PrimaryQuotes;
}
}
}
@@ -479,12 +519,20 @@ InsetQuotesParams::QuoteStyle
InsetQuotes::getStyle(string const & s)
qs = InsetQuotesParams::GermanQuotes;
else if (s == "polish")
qs = InsetQuotesParams::PolishQuotes;
- else if (s == "french")
- qs = InsetQuotesParams::FrenchQuotes;
+ else if (s == "swiss")
+ qs = InsetQuotesParams::SwissQuotes;
else if (s == "danish")
qs = InsetQuotesParams::DanishQuotes;
else if (s == "plain")
qs = InsetQuotesParams::PlainQuotes;
+ else if (s == "british")
+ qs = InsetQuotesParams::BritishQuotes;
+ else if (s == "swedishg")
+ qs = InsetQuotesParams::SwedishGQuotes;
+ else if (s == "french")
+ qs = InsetQuotesParams::FrenchQuotes;
+ else if (s == "frenchin")
+ qs = InsetQuotesParams::FrenchINQuotes;
return qs;
}
@@ -494,18 +542,20 @@ docstring InsetQuotes::displayString() const
{
// In PassThru, we use straight quotes
if (pass_thru_)
- return (level_ == InsetQuotesParams::DoubleQuotes) ?
+ return (level_ == InsetQuotesParams::PrimaryQuotes) ?
from_ascii("\"") : from_ascii("'");
docstring retdisp = docstring(1, quoteparams.getQuoteChar(style_,
level_, side_));
// in French, thin spaces are added inside double guillemets
if (prefixIs(context_lang_, "fr")
- && level_ == InsetQuotesParams::DoubleQuotes
- && style_ == InsetQuotesParams::FrenchQuotes) {
+ && level_ == InsetQuotesParams::PrimaryQuotes
+ && (style_ == InsetQuotesParams::SwissQuotes
+ || style_ == InsetQuotesParams::FrenchQuotes
+ || style_ == InsetQuotesParams::FrenchINQuotes)) {
// THIN SPACE (U+2009)
char_type const thin_space = 0x2009;
- if (side_ == InsetQuotesParams::LeftQuote)
+ if (side_ == InsetQuotesParams::OpeningQuote)
retdisp += thin_space;
else
retdisp = thin_space + retdisp;
@@ -611,11 +661,11 @@ void InsetQuotes::latex(otexstream & os, OutputParams
const & runparams) const
// In pass-thru context, we output plain quotes
if (runparams.pass_thru)
- qstr = (level_ == InsetQuotesParams::DoubleQuotes) ?
from_ascii("\"") : from_ascii("'");
+ qstr = (level_ == InsetQuotesParams::PrimaryQuotes) ?
from_ascii("\"") : from_ascii("'");
else if (style_ == InsetQuotesParams::PlainQuotes &&
runparams.isFullUnicode()) {
// For XeTeX and LuaTeX,we need to disable mapping to get
straight
// quotes. We define our own commands that do this
- qstr = (level_ == InsetQuotesParams::DoubleQuotes) ?
+ qstr = (level_ == InsetQuotesParams::PrimaryQuotes) ?
from_ascii("\\textquotedblplain") :
from_ascii("\\textquotesingleplain");
}
else if (runparams.use_polyglossia) {
@@ -624,11 +674,11 @@ void InsetQuotes::latex(otexstream & os, OutputParams
const & runparams) const
qstr = docstring(1, quotechar);
}
else if (style_ == InsetQuotesParams::FrenchQuotes
- && level_ == InsetQuotesParams::DoubleQuotes
+ && level_ == InsetQuotesParams::PrimaryQuotes
&& prefixIs(runparams.local_font->language()->code(), "fr")) {
// Specific guillemets of French babel
// including correct French spacing
- if (side_ == InsetQuotesParams::LeftQuote)
+ if (side_ == InsetQuotesParams::OpeningQuote)
qstr = from_ascii("\\og");
else
qstr = from_ascii("\\fg");
@@ -690,11 +740,11 @@ docstring InsetQuotes::getQuoteEntity() const {
docstring res =
quoteparams.getHTMLQuote(quoteparams.getQuoteChar(style_, level_, side_));
// in French, thin spaces are added inside double guillemets
if (prefixIs(context_lang_, "fr")
- && level_ == InsetQuotesParams::DoubleQuotes
+ && level_ == InsetQuotesParams::PrimaryQuotes
&& style_ == InsetQuotesParams::FrenchQuotes) {
// THIN SPACE (U+2009)
docstring const thin_space = from_ascii(" ");
- if (side_ == InsetQuotesParams::LeftQuote)
+ if (side_ == InsetQuotesParams::OpeningQuote)
res += thin_space;
else
res = thin_space + res;
diff --git a/src/insets/InsetQuotes.h b/src/insets/InsetQuotes.h
index 032c111..426f13e 100644
--- a/src/insets/InsetQuotes.h
+++ b/src/insets/InsetQuotes.h
@@ -36,25 +36,35 @@ public:
///
PolishQuotes,
///
- FrenchQuotes,
+ SwissQuotes,
///
DanishQuotes,
///
- PlainQuotes
+ PlainQuotes,
+ ///
+ BritishQuotes,
+ ///
+ SwedishGQuotes,
+ ///
+ FrenchQuotes,
+ ///
+ FrenchINQuotes,
+ ///
+ RussianQuotes
};
///
enum QuoteSide {
///
- LeftQuote,
+ OpeningQuote,
///
- RightQuote
+ ClosingQuote
};
///
enum QuoteLevel {
///
- SingleQuotes,
+ SecondaryQuotes,
///
- DoubleQuotes
+ PrimaryQuotes
};
/// Returns the unicode character of a given quote
char_type getQuoteChar(QuoteStyle const &, QuoteLevel const &,
diff --git a/src/tex2lyx/TODO.txt b/src/tex2lyx/TODO.txt
index 46353e8..e5e0433 100644
--- a/src/tex2lyx/TODO.txt
+++ b/src/tex2lyx/TODO.txt
@@ -86,6 +86,17 @@ Format LaTeX feature LyX feature
520 Plain InsetQuote Style:
\textquotesingle \begin_inset Quotes qls,
\begin_inset Quotes qrs
\textquotedbl \begin_inset Quotes qld,
\begin_inset Quotes qrd
+521 New Quote Styles InsetQuote
+ - british \begin_inset Quotes b..
+ - swiss \begin_inset Quotes c..
+ - swedishg \begin_inset Quotes w..
+ - frenchin \begin_inset Quotes i..
+ - russian \begin_inset Quotes r..
+ Change default behavior \begin_inset Quotes f..
+ of French quote style:
+ - Inner quotes are now ``..''.
+ - Former french style is now
+ called "swiss"
General
diff --git a/src/version.h b/src/version.h
index 053c203..58ef117 100644
--- a/src/version.h
+++ b/src/version.h
@@ -32,8 +32,8 @@ extern char const * const lyx_version_info;
// Do not remove the comment below, so we get merge conflict in
// independent branches. Instead add your own.
-#define LYX_FORMAT_LYX 520 // spitz: plain quotes style
-#define LYX_FORMAT_TEX2LYX 520
+#define LYX_FORMAT_LYX 521 // spitz: new quotes styles
+#define LYX_FORMAT_TEX2LYX 521
#if LYX_FORMAT_TEX2LYX != LYX_FORMAT_LYX
#ifndef _MSC_VER