diff --git a/lib/RELEASE-NOTES b/lib/RELEASE-NOTES index 59325c3bd2..a48968b24d 100644 --- a/lib/RELEASE-NOTES +++ b/lib/RELEASE-NOTES @@ -111,6 +111,10 @@ opened in editable mode. This state used to be hardcoded at compile time. +* buffer-anonymize (2.3.2) + Replace all text n the document by streams of `a'. This is useful + for sharing private documents in a bug report. + * font-crossout Cross out characters. diff --git a/src/Buffer.cpp b/src/Buffer.cpp index ca3c049b4d..1ae48acc8a 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -2612,15 +2612,16 @@ bool Buffer::getStatus(FuncRequest const & cmd, FuncStatus & flag) flag.setOnOff(params().output_changes); break; - case LFUN_BUFFER_TOGGLE_COMPRESSION: { + case LFUN_BUFFER_TOGGLE_COMPRESSION: flag.setOnOff(params().compressed); break; - } - case LFUN_BUFFER_TOGGLE_OUTPUT_SYNC: { + case LFUN_BUFFER_TOGGLE_OUTPUT_SYNC: flag.setOnOff(params().output_sync); break; - } + + case LFUN_BUFFER_ANONYMIZE: + break; default: return false; @@ -2898,6 +2899,15 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) params().output_sync = !params().output_sync; break; + case LFUN_BUFFER_ANONYMIZE: { + undo().recordUndoFullBuffer(CursorData()); + CursorData cur(doc_iterator_begin(this)); + for ( ; cur ; cur.forwardPar()) + cur.paragraph().anonymize(); + dr.forceBufferUpdate(); + break; + } + default: dispatched = false; break; diff --git a/src/BufferView.cpp b/src/BufferView.cpp index bf7c1ea165..e141f34c7e 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -1112,7 +1112,6 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag) case LFUN_WORD_FIND_FORWARD: case LFUN_WORD_FIND_BACKWARD: case LFUN_WORD_REPLACE: - case LFUN_BUFFER_ANONYMIZE: case LFUN_MARK_OFF: case LFUN_MARK_ON: case LFUN_MARK_TOGGLE: @@ -1576,14 +1575,6 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) break; } - case LFUN_BUFFER_ANONYMIZE: { - for(char c = '0'; c <='Z'; c++) { - odocstringstream ss; - ss << "a\n" << c << "\n0 0 1 1 0"; - lyx::dispatch(FuncRequest(LFUN_WORD_REPLACE, ss.str())); - } - } - case LFUN_WORD_FINDADV: { FindAndReplaceOptions opt; istringstream iss(to_utf8(cmd.argument())); diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 5c5a728027..c905856e9c 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -4176,6 +4176,15 @@ SpellChecker::Result Paragraph::spellCheck(pos_type & from, pos_type & to, } +void Paragraph::anonymize() +{ + // This is a very crude anonymization for now + for (char_type & c : d->text_) + if (isLetterChar(c) || isNumber(c)) + c = 'a'; +} + + void Paragraph::Private::markMisspelledWords( pos_type const & first, pos_type const & last, SpellChecker::Result result, diff --git a/src/Paragraph.h b/src/Paragraph.h index d462f4c413..0c6c48090f 100644 --- a/src/Paragraph.h +++ b/src/Paragraph.h @@ -505,6 +505,10 @@ public: /// presently used only in the XHTML output routines. std::string magicLabel() const; + /// anonymizes the paragraph contents (but not the paragraphs + /// contained inside it. Does not handle undo. + void anonymize(); + private: /// Expand the counters for the labelstring of \c layout docstring expandParagraphLabel(Layout const &, BufferParams const &,