Correctly show merged paragraphs with change tracking

Fixes #3136
This commit is contained in:
Juergen Spitzmueller 2019-12-26 13:47:50 +01:00
parent 54e10dc1ad
commit afb442c76c
3 changed files with 25 additions and 9 deletions

View File

@ -621,6 +621,11 @@ bool Paragraph::isMergedOnEndOfParDeletion(bool trackChanges) const
return change.inserted() && change.currentAuthor();
}
Change Paragraph::parEndChange() const
{
return d->changes_.lookup(size());
}
void Paragraph::setChange(Change const & change)
{

View File

@ -279,6 +279,8 @@ public:
/// will the paragraph be physically merged with the next
/// one if the imaginary end-of-par character is logically deleted?
bool isMergedOnEndOfParDeletion(bool trackChanges) const;
/// Return Change form of paragraph break
Change parEndChange() const;
/// set change for the entire par
void setChange(Change const & change);

View File

@ -769,11 +769,14 @@ void TeXOnePar(Buffer const & buf,
state->open_encoding_ = none;
}
// This paragraph is merged and we do not show changes in the output
bool const merged_par = !bparams.output_changes && par.parEndChange().deleted();
if (text.inset().isPassThru()) {
Font const outerfont = text.outerFont(pit);
// No newline before first paragraph in this lyxtext
if (pit > 0 && !text.inset().getLayout().parbreakIgnored()) {
if (pit > 0 && !text.inset().getLayout().parbreakIgnored() && !merged_par) {
os << '\n';
if (!text.inset().getLayout().parbreakIsNewline())
os << '\n';
@ -813,17 +816,20 @@ void TeXOnePar(Buffer const & buf,
if (par.needsCProtection(runparams.moving_arg)
&& contains(runparams.active_chars, '^'))
os << "\\endgroup";
os << "\n";
if (merged_par)
os << "{}";
else
os << "\n";
}
else
else if (!merged_par)
os << '\n';
if (!style.parbreak_is_newline) {
if (!style.parbreak_is_newline && !merged_par) {
os << '\n';
} else if (nextpar && !style.isEnvironment()) {
Layout const nextstyle = text.inset().forcePlainLayout()
? bparams.documentClass().plainLayout()
: nextpar->layout();
if (nextstyle.name() != style.name())
if (nextstyle.name() != style.name() && !merged_par)
os << '\n';
}
@ -1176,7 +1182,7 @@ void TeXOnePar(Buffer const & buf,
&& nextpar->getDepth() < par.getDepth()))
close_lang_switch = using_begin_end;
if (nextpar && par.params().depth() < nextpar->params().depth())
pending_newline = !text.inset().getLayout().parbreakIgnored();
pending_newline = !text.inset().getLayout().parbreakIgnored() && !merged_par;
break;
case LATEX_ENVIRONMENT: {
// if it's the last paragraph of the current environment
@ -1195,7 +1201,7 @@ void TeXOnePar(Buffer const & buf,
default:
// we don't need it for the last paragraph and in InTitle commands!!!
if (nextpar && !intitle_command)
pending_newline = !text.inset().getLayout().parbreakIgnored();
pending_newline = !text.inset().getLayout().parbreakIgnored() && !merged_par;
}
// InTitle commands use switches (not environments) for space settings
@ -1415,7 +1421,7 @@ void TeXOnePar(Buffer const & buf,
// TeXEnvironment, because it is needed in this case
if (nextpar && !os.afterParbreak() && !last_was_separator) {
Layout const & next_layout = nextpar->layout();
if (!text.inset().getLayout().parbreakIgnored())
if (!text.inset().getLayout().parbreakIgnored() && !merged_par)
// Make sure to start a new line
os << breakln;
// A newline '\n' is always output before a command,
@ -1459,7 +1465,10 @@ void TeXOnePar(Buffer const & buf,
&& next_layout.align == nextpar->getAlign(bparams))
|| (style.align != par.getAlign(bparams)
&& tclass.isDefaultLayout(next_layout))) {
os << '\n';
// and omit paragraph break if it has been deleted with ct
// and changes are not shown in output
if (!merged_par)
os << '\n';
}
}
}