]> cat aescling's git repositories - mastodon.git/commitdiff
Preserve newlines in delete & redraft and desktop notifications (#7750)
authorEugen Rochko <eugen@zeonfederated.com>
Wed, 6 Jun 2018 18:49:53 +0000 (20:49 +0200)
committerGitHub <noreply@github.com>
Wed, 6 Jun 2018 18:49:53 +0000 (20:49 +0200)
Fix #7748

app/javascript/mastodon/reducers/compose.js
app/javascript/mastodon/utils/html.js

index e9f6a4902edafd9fd040e7e26c4ceef72172e36e..8524ddb8e0562d2c73b3697857c1ae6c1183d7b0 100644 (file)
@@ -36,6 +36,7 @@ import { REDRAFT } from '../actions/statuses';
 import { Map as ImmutableMap, List as ImmutableList, OrderedSet as ImmutableOrderedSet, fromJS } from 'immutable';
 import uuid from '../uuid';
 import { me } from '../initial_state';
+import { unescapeHTML } from '../utils/html';
 
 const initialState = ImmutableMap({
   mounted: 0,
@@ -173,14 +174,14 @@ const hydrate = (state, hydratedState) => {
 
 const domParser = new DOMParser();
 
-const htmlToText = status => {
+const expandMentions = status => {
   const fragment = domParser.parseFromString(status.get('content'), 'text/html').documentElement;
 
   status.get('mentions').forEach(mention => {
     fragment.querySelector(`a[href="${mention.get('url')}"]`).textContent = `@${mention.get('acct')}`;
   });
 
-  return fragment.textContent;
+  return fragment.innerHTML;
 };
 
 export default function compose(state = initialState, action) {
@@ -316,7 +317,7 @@ export default function compose(state = initialState, action) {
       }));
   case REDRAFT:
     return state.withMutations(map => {
-      map.set('text', htmlToText(action.status));
+      map.set('text', unescapeHTML(expandMentions(action.status)));
       map.set('in_reply_to', action.status.get('in_reply_to_id'));
       map.set('privacy', action.status.get('visibility'));
       map.set('media_attachments', action.status.get('media_attachments'));
index 0b646ce58fb41fb0f721f65540610e6ee697d670..5159df9db75bebedbf46da9edd374645f917a4c5 100644 (file)
@@ -1,6 +1,5 @@
 export const unescapeHTML = (html) => {
   const wrapper = document.createElement('div');
-  html = html.replace(/<br \/>|<br>|\n/g, ' ');
-  wrapper.innerHTML = html;
+  wrapper.innerHTML = html.replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n').replace(/<[^>]*>/g, '');
   return wrapper.textContent;
 };