1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-24 10:27:10 +02:00
joplin/ReactNativeClient/MarkdownEditor/applyListFormat.js

44 lines
1.6 KiB
JavaScript
Raw Normal View History

Mobile: Add toolbar, list continuation and Markdown preview to editor (#2224) * The basic editor is working! No list continuation still though * List continuation is working! Now to delete when entering again and not typing on line + handle ordered lists * Supports checkboxes + attempted at setting font * Editor font works now; now need to fix the delete (look at past state) * Fix deletion problem * Add ordered list handler * Add comments * Extract insertListLine * End lists on enter for empty bullets * Add MarkdownView (renders badly though) * Save edited text from MarkdownEditor * Cleanup * Refactor react-native-markdown-editor/ * Rename react-native-markdown-editor/ => MarkdownEditor/ * Cleanup * Fix preview styles; still need to fix checkbox problem * Fix keyboard padding * Change name back to #body_changeText * Incorporate PR feedback from @laurent22 * wip: Move MarkdownEditor/ from ReactNativeClient/lib/ to ReactNativeClient/ * Move MarkdownEditor/ from ReactNativeClient/lib/ to ReactNativeClient/ * Remove log statement * Focus TextInput in MarkdownEditor from grandparent * Make eslint happy * Extract textInputRefName to shared variable * Remove accidental #setState * Cleanup * Cleanup * Run linter * Cleanup * Update button order * Improve styles for config descriptions * Allow descriptions to be added to BOOL type Setting configs * Add editorBeta Setting * Move FailSafe details to description text * Update descriptionText styles * Put the editor under the beta flag toggle * Incorporate PR feedback from @laurent22 * Refactor Markdown editor focusing * Cleanup * Reorder MarkdownEditor formats * Make applyListFormat behavior more intuitive * Add comment * Show MarkdownEditor with preview by default * Show preview by default, then hide on typing * Fix MarkdownEditor selection bug * Cleanup * Update Markdown button styles * Make Markdown button colors theme-conscious * Fix merge conflict resolution mistake * Fix broken import * Delete package-lock.json * Reset package-lock.json Co-authored-by: Laurent Cozic <laurent22@users.noreply.github.com>
2020-03-25 12:50:45 +02:00
import { replaceBetween } from './utils';
export default ({ getState, item, setState }) => {
let { text } = getState();
const { selection } = getState();
text = text || '';
let newText;
let newSelection;
// Ignore multi-character selections.
// NOTE: I was on the fence about whether more appropriate behavior would be
// to add the list prefix (e.g. '-', '1.', '#', '##', '###') at the
// beginning of the line where the selection begins, but for now I think
// it's more natural to just ignore it in this case. If after using this
// editor for a while it turns out the other way is more natural, that's
// fine by me!
if (selection.start !== selection.end) {
return;
}
const spaceForPrefix = item.prefix.length + 1;
const isNewLine = text.substring(selection.start - 1, selection.start) === '\n';
if (isNewLine) { // We're at the start of a line
newText = replaceBetween(text, selection, `${item.prefix} `);
newSelection = { start: selection.start + spaceForPrefix, end: selection.start + spaceForPrefix };
} else { // We're in the middle of a line
// NOTE: It may be more natural for the prefix (e.g. '-', '1.', '#', '##')
// to be prepended at the beginning of the line where the selection is,
// rather than creating a new line (which is the behavior implemented here).
// If the other way is more natural, that's fine by me!
newText = replaceBetween(text, selection, `\n${item.prefix} `);
newSelection = {
start: selection.start + spaceForPrefix + 1,
end: selection.start + spaceForPrefix + 1,
};
}
setState({ text: newText }, () => {
setTimeout(() => {
setState({ selection: newSelection });
}, 300);
});
};