> I couldn't resist.
I bet this would be the case ;-)
> Attached a patch that implements the glue length for texted. Maybe you can do
> the file format/lyx2lyx stuff.
The lyx2lyx part was more complicated than I thought. However, attached is the
patch to go in.
regards Uwe
Index: lib/lyx2lyx/lyx_2_0.py
===================================================================
--- lib/lyx2lyx/lyx_2_0.py (revision 30715)
+++ lib/lyx2lyx/lyx_2_0.py (working copy)
@@ -182,43 +182,138 @@
i = string.find("text%")
if i > -1:
percent = True
- value = string[:i]
- value = str(float(value)/100)
- return "True," + value + "\\textwidth"
+ minus = string.rfind("-", 0, i)
+ plus = string.rfind("+", 0, i)
+ if plus == -1 and minus == -1:
+ value = string[:i]
+ value = str(float(value)/100)
+ end = string[i+5:]
+ string = value + "\\textwidth" + end
+ if plus > minus:
+ value = string[plus+1:i]
+ value = str(float(value)/100)
+ begin = string[:plus+1]
+ end = string[i+5:]
+ string = begin + value + "\\textwidth" + end
+ if plus < minus:
+ value = string[minus+1:i]
+ value = str(float(value)/100)
+ begin = string[:minus+1]
+ string = begin + value + "\\textwidth"
i = string.find("col%")
if i > -1:
percent = True
- value = string[:i]
- value = str(float(value)/100)
- return "True," + value + "\\columnwidth"
+ minus = string.rfind("-", 0, i)
+ plus = string.rfind("+", 0, i)
+ if plus == -1 and minus == -1:
+ value = string[:i]
+ value = str(float(value)/100)
+ end = string[i+4:]
+ string = value + "\\columnwidth" + end
+ if plus > minus:
+ value = string[plus+1:i]
+ value = str(float(value)/100)
+ begin = string[:plus+1]
+ end = string[i+4:]
+ string = begin + value + "\\columnwidth" + end
+ if plus < minus:
+ value = string[minus+1:i]
+ value = str(float(value)/100)
+ begin = string[:minus+1]
+ string = begin + value + "\\columnwidth"
i = string.find("page%")
if i > -1:
percent = True
- value = string[:i]
- value = str(float(value)/100)
- return "True," + value + "\\paperwidth"
+ minus = string.rfind("-", 0, i)
+ plus = string.rfind("+", 0, i)
+ if plus == -1 and minus == -1:
+ value = string[:i]
+ value = str(float(value)/100)
+ end = string[i+5:]
+ sstring = value + "\\paperwidth" + end
+ if plus > minus:
+ value = string[plus+1:i]
+ value = str(float(value)/100)
+ begin = string[:plus+1]
+ end = string[i+5:]
+ string = begin + value + "\\paperwidth" + end
+ if plus < minus:
+ value = string[minus+1:i]
+ value = str(float(value)/100)
+ begin = string[:minus+1]
+ string = begin + value + "\\paperwidth"
i = string.find("line%")
if i > -1:
percent = True
- value = string[:i]
- value = str(float(value)/100)
- return "True," + value + "\\linewidth"
+ minus = string.rfind("-", 0, i)
+ plus = string.rfind("+", 0, i)
+ if plus == -1 and minus == -1:
+ value = string[:i]
+ value = str(float(value)/100)
+ end = string[i+5:]
+ string = value + "\\linewidth" + end
+ if plus > minus:
+ value = string[plus+1:i]
+ value = str(float(value)/100)
+ begin = string[:plus+1]
+ end = string[i+5:]
+ string = begin + value + "\\linewidth" + end
+ if plus < minus:
+ value = string[minus+1:i]
+ value = str(float(value)/100)
+ begin = string[:minus+1]
+ string = begin + value + "\\linewidth"
i = string.find("theight%")
if i > -1:
percent = True
- value = string[:i]
- value = str(float(value)/100)
- return "True," + value + "\\textheight"
+ minus = string.rfind("-", 0, i)
+ plus = string.rfind("+", 0, i)
+ if plus == -1 and minus == -1:
+ value = string[:i]
+ value = str(float(value)/100)
+ end = string[i+8:]
+ string = value + "\\textheight" + end
+ if plus > minus:
+ value = string[plus+1:i]
+ value = str(float(value)/100)
+ begin = string[:plus+1]
+ end = string[i+8:]
+ string = begin + value + "\\textheight" + end
+ if plus < minus:
+ value = string[minus+1:i]
+ value = str(float(value)/100)
+ begin = string[:minus+1]
+ string = begin + value + "\\textheight"
i = string.find("pheight%")
if i > -1:
percent = True
- value = string[:i]
- value = str(float(value)/100)
- return "True," + value + "\\paperheight"
+ minus = string.rfind("-", 0, i)
+ plus = string.rfind("+", 0, i)
+ if plus == -1 and minus == -1:
+ value = string[:i]
+ value = str(float(value)/100)
+ end = string[i+8:]
+ string = value + "\\paperheight" + end
+ if plus > minus:
+ value = string[plus+1:i]
+ document.warning("value_plus: " + value)
+ value = str(float(value)/100)
+ begin = string[:plus+1]
+ end = string[i+8:]
+ string = begin + value + "\\paperheight" + end
+ if plus < minus:
+ value = string[minus+1:i]
+ value = str(float(value)/100)
+ begin = string[:minus+1]
+ string = begin + value + "\\paperheight"
if percent == False:
- return "False," + string
+ return "False," + string
+ else:
+ string = string.replace("+", " plus ")
+ string = string.replace("-", " minus ")
+ return "True," + string
+
-
####################################################################
@@ -945,6 +1040,53 @@
j = i
+def revert_hspace_glue_lengths(document):
+ " Revert HSpace glue lengths to ERT "
+ i = 0
+ j = 0
+ while True:
+ i = find_token(document.body, "\\begin_inset space \hspace{}", i)
+ if i == -1:
+ j = find_token(document.body, "\\begin_inset space \hspace*{}", j)
+ if j == -1:
+ break
+ else:
+ star = True
+ i = j
+ else:
+ star = False
+ # only revert when a custom length was set and when
+ # it used a percent length
+ o = document.body[i+1].find("\\length")
+ if o == -1:
+ document.warning("Error: Cannot find lenght for \\hspace!")
+ break
+ # search for the beginning of the value via the space
+ k = document.body[i+1].find(" ")
+ length = document.body[i+1][k+1:]
+ # check if the length contains a plus or minus
+ l = length.find("+")
+ if l == -1:
+ l = length.find("-")
+ if l == -1:
+ break
+ # handle percent lengths
+ length = latex_length(length)
+ # latex_length returns "bool,length"
+ m = length.find(",")
+ percent = length[:m]
+ length = length[m+1:]
+ # revert the HSpace inset to ERT
+ if percent == "True":
+ if star == True:
+ subst = [put_cmd_in_ert("\\hspace*{" + length + "}")]
+ else:
+ subst = [put_cmd_in_ert("\\hspace{" + length + "}")]
+ document.body[i:i+3] = subst
+ i = i + 2
+ j = i
+
+
##
# Conversion hub
#
@@ -971,10 +1113,12 @@
[364, []],
[365, []],
[366, []],
- [367, []]
+ [367, []],
+ [368, []]
]
-revert = [[366, [revert_percent_vspace_lengths, revert_percent_hspace_lengths]],
+revert = [[367, [revert_hspace_glue_lengths]],
+ [366, [revert_percent_vspace_lengths, revert_percent_hspace_lengths]],
[365, [revert_percent_skip_lengths]],
[364, [revert_paragraph_indentation]],
[363, [revert_branch_filename]],
Index: src/Buffer.cpp
===================================================================
--- src/Buffer.cpp (revision 30715)
+++ src/Buffer.cpp (working copy)
@@ -127,7 +127,7 @@
// Do not remove the comment below, so we get merge conflict in
// independent branches. Instead add your own.
-int const LYX_FORMAT = 367; // uwestoehr: percent lengths for the VSpace dialog
+int const LYX_FORMAT = 368; // spitz, uwestoehr: glue lengths for the HSpace dialog
typedef map<string, bool> DepClean;
typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
Index: src/factory.cpp
===================================================================
--- src/factory.cpp (revision 30715)
+++ src/factory.cpp (working copy)
@@ -387,22 +387,22 @@
else if (name == "hrulefill")
isp.kind = InsetSpaceParams::HRULEFILL;
else if (name == "hspace") {
- if (len.empty() || !isValidLength(len)) {
+ if (len.empty() || !isValidGlueLength(len)) {
lyxerr << "LyX function 'space-insert hspace' "
<< "needs a valid length argument." << endl;
break;
}
isp.kind = InsetSpaceParams::CUSTOM;
- isp.length = Length(len);
+ isp.length = GlueLength(len);
}
else if (name == "hspace*") {
- if (len.empty() || !isValidLength(len)) {
+ if (len.empty() || !isValidGlueLength(len)) {
lyxerr << "LyX function 'space-insert hspace*' "
<< "needs a valid length argument." << endl;
break;
}
isp.kind = InsetSpaceParams::CUSTOM_PROTECTED;
- isp.length = Length(len);
+ isp.length = GlueLength(len);
}
else {
lyxerr << "Wrong argument for LyX function 'space-insert'." << endl;
Index: src/frontends/qt4/GuiHSpace.cpp
===================================================================
--- src/frontends/qt4/GuiHSpace.cpp (revision 30715)
+++ src/frontends/qt4/GuiHSpace.cpp (working copy)
@@ -57,7 +57,10 @@
connect(fillPatternCO, SIGNAL(activated(int)),
this, SLOT(patternChanged()));
- valueLE->setValidator(unsignedLengthValidator(valueLE));
+ if (params_.math)
+ valueLE->setValidator(unsignedLengthValidator(valueLE));
+ else
+ valueLE->setValidator(unsignedGlueLengthValidator(valueLE));
// Manage the ok, apply, restore and cancel/close buttons
bc().setPolicy(ButtonPolicy::OkApplyCancelReadOnlyPolicy);
@@ -245,9 +248,10 @@
keep->setChecked(protect);
Length::UNIT const default_unit = Length::defaultUnit();
- if (item == (params.math ? 9 : 7))
- lengthToWidgets(value, unit, params.length, default_unit);
- else
+ if (item == (params.math ? 9 : 7)) {
+ string length = params.length.asString();
+ lengthToWidgets(value, unit, length, default_unit);
+ } else
lengthToWidgets(value, unit, "", default_unit);
}
@@ -269,7 +273,7 @@
case 8: params.kind = InsetSpaceParams::QQUAD; break;
case 9:
params.kind = InsetSpaceParams::CUSTOM;
- params.length = Length(widgetsToLength(value, unit));
+ params.length = GlueLength(widgetsToLength(value, unit));
break;
}
return params;
@@ -323,7 +327,7 @@
params.kind = InsetSpaceParams::CUSTOM_PROTECTED;
else
params.kind = InsetSpaceParams::CUSTOM;
- params.length = Length(widgetsToLength(value, unit));
+ params.length = GlueLength(widgetsToLength(value, unit));
break;
}
return params;
Index: src/insets/InsetSpace.cpp
===================================================================
--- src/insets/InsetSpace.cpp (revision 30715)
+++ src/insets/InsetSpace.cpp (working copy)
@@ -53,7 +53,7 @@
}
-Length InsetSpace::length() const
+GlueLength InsetSpace::length() const
{
return params_.length;
}
@@ -130,12 +130,14 @@
message = _("Horizontal Fill (Down Brace)");
break;
case InsetSpaceParams::CUSTOM:
+ // FIXME unicode
message = support::bformat(_("Horizontal Space (%1$s)"),
- params_.length.asDocstring());
+ from_ascii(params_.length.asString()));
break;
case InsetSpaceParams::CUSTOM_PROTECTED:
+ // FIXME unicode
message = support::bformat(_("Protected Horizontal Space (%1$s)"),
- params_.length.asDocstring());
+ from_ascii(params_.length.asString()));
break;
}
return message;
@@ -238,7 +240,7 @@
case InsetSpaceParams::CUSTOM:
case InsetSpaceParams::CUSTOM_PROTECTED: {
int const w =
- params_.length.inPixels(mi.base.textwidth,
+ params_.length.len().inPixels(mi.base.textwidth,
fm.width(char_type('M')));
int const minw = (w < 0) ? 3 * arrow_size : 4;
dim.wid = max(minw, abs(w));
@@ -264,7 +266,7 @@
{
Dimension const dim = dimension(*pi.base.bv);
- if (isStretchableSpace() || params_.length.value() < 0) {
+ if (isStretchableSpace() || params_.length.len().value() < 0) {
int const asc = theFontMetrics(pi.base.font).ascent('M');
int const desc = theFontMetrics(pi.base.font).descent('M');
// Pixel height divisible by 2 for prettier fill graphics:
@@ -450,7 +452,7 @@
break;
}
- if (!length.empty())
+ if (!length.len().empty())
os << "\n\\length " << length.asString();
}
Index: src/insets/InsetSpace.h
===================================================================
--- src/insets/InsetSpace.h (revision 30715)
+++ src/insets/InsetSpace.h (working copy)
@@ -81,7 +81,7 @@
///
Kind kind;
///
- Length length;
+ GlueLength length;
/**
* Whether these params are to be used in mathed.
* This determines the set of valid kinds.
@@ -110,7 +110,7 @@
///
static std::string params2string(InsetSpaceParams const &);
///
- Length length() const;
+ GlueLength length() const;
///
docstring toolTip(BufferView const & bv, int x, int y) const;
Index: src/mathed/InsetMathSpace.cpp
===================================================================
--- src/mathed/InsetMathSpace.cpp (revision 30715)
+++ src/mathed/InsetMathSpace.cpp (working copy)
@@ -214,7 +214,7 @@
LASSERT(space_info[space_].visible, /**/);
InsetSpaceParams isp(true);
isp.kind = space_info[space_].kind;
- isp.length = length_;
+ isp.length = GlueLength(length_);
return InsetSpace::params2string(isp);
}