From 2d1c41b698d5105513a71e4ed28330e04aeb0cfa Mon Sep 17 00:00:00 2001 From: Mehak Nasir <67791278+mehaknasir@users.noreply.github.com> Date: Mon, 23 May 2022 12:36:10 +0500 Subject: [PATCH] Fix: for rendering latex in comments and responses and support for special symbols in TinyMCE (#160) * fix: for for rendering latex in comments and responses * fix: component is seperated for loading html in dom * feat: added special characters support in tiny-mce --- src/components/HTMLLoader.jsx | 27 ++++++++++++++++++++ src/components/TinyMCEEditor.jsx | 6 +++-- src/discussions/comments/comment/Comment.jsx | 4 +-- src/discussions/comments/comment/Reply.jsx | 4 +-- src/discussions/posts/post/Post.jsx | 4 +-- src/discussions/posts/post/PostLink.jsx | 4 +-- 6 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 src/components/HTMLLoader.jsx diff --git a/src/components/HTMLLoader.jsx b/src/components/HTMLLoader.jsx new file mode 100644 index 00000000..bd139bcd --- /dev/null +++ b/src/components/HTMLLoader.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +import MathJax from 'react-mathjax-preview'; + +function HTMLLoader({ htmlNode, componentId, cssClassName }) { + const isLatex = htmlNode.match(/(\${1,2})((?:\\.|.)*)\1/); + + return ( + isLatex ? + // eslint-disable-next-line react/no-danger + :
+ ); +} + +HTMLLoader.propTypes = { + htmlNode: PropTypes.node.isRequired, + componentId: PropTypes.string, + cssClassName: PropTypes.string, +}; + +HTMLLoader.defaultProps = { + componentId: null, + cssClassName: '', +}; + +export default HTMLLoader; diff --git a/src/components/TinyMCEEditor.jsx b/src/components/TinyMCEEditor.jsx index cea74536..89981368 100644 --- a/src/components/TinyMCEEditor.jsx +++ b/src/components/TinyMCEEditor.jsx @@ -25,6 +25,7 @@ import 'tinymce/plugins/link'; import 'tinymce/plugins/lists'; import 'tinymce/plugins/emoticons'; import 'tinymce/plugins/emoticons/js/emojis'; +import 'tinymce/plugins/charmap'; /* eslint import/no-webpack-loader-syntax: off */ // eslint-disable-next-line import/no-unresolved import edxBrandCss from '!!raw-loader!sass-loader!../index.scss'; @@ -84,14 +85,15 @@ export default function TinyMCEEditor(props) { a11y_advanced_options: true, autosave_interval: '1s', autosave_restore_when_empty: true, - plugins: 'autosave codesample link lists image imagetools code emoticons', + plugins: 'autosave codesample link lists image imagetools code emoticons charmap', toolbar: 'formatselect | bold italic underline' + ' | link blockquote openedx_code image' + ' | bullist numlist outdent indent' + ' | removeformat' + ' | openedx_html' + ' | undo redo' - + ' | emoticons', + + ' | emoticons' + + ' | charmap', content_css: false, content_style: contentStyle, body_class: 'm-2', diff --git a/src/discussions/comments/comment/Comment.jsx b/src/discussions/comments/comment/Comment.jsx index 7d1d36a7..d68fbc7d 100644 --- a/src/discussions/comments/comment/Comment.jsx +++ b/src/discussions/comments/comment/Comment.jsx @@ -7,6 +7,7 @@ import { useDispatch, useSelector } from 'react-redux'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { Button, useToggle } from '@edx/paragon'; +import HTMLLoader from '../../../components/HTMLLoader'; import { ContentActions } from '../../../data/constants'; import { AlertBanner, DeleteConfirmation } from '../../common'; import { fetchThread } from '../../posts/data/thunks'; @@ -73,8 +74,7 @@ function Comment({ ? ( setEditing(false)} /> ) - // eslint-disable-next-line react/no-danger - :
} + : } {isEditing ? setEditing(false)} /> - // eslint-disable-next-line react/no-danger - :
} + : }
diff --git a/src/discussions/posts/post/Post.jsx b/src/discussions/posts/post/Post.jsx index db883a43..e15e0176 100644 --- a/src/discussions/posts/post/Post.jsx +++ b/src/discussions/posts/post/Post.jsx @@ -1,13 +1,13 @@ import React from 'react'; import PropTypes from 'prop-types'; -import MathJax from 'react-mathjax-preview'; import { useDispatch, useSelector } from 'react-redux'; import { useHistory, useLocation } from 'react-router-dom'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { Hyperlink, useToggle } from '@edx/paragon'; +import HTMLLoader from '../../../components/HTMLLoader'; import { ContentActions } from '../../../data/constants'; import { selectorForUnitSubsection, selectTopicContext } from '../../../data/selectors'; import { AlertBanner, DeleteConfirmation } from '../../common'; @@ -75,7 +75,7 @@ function Post({
- +
{topicContext && topic && (
diff --git a/src/discussions/posts/post/PostLink.jsx b/src/discussions/posts/post/PostLink.jsx index 58b91f5a..adef65fb 100644 --- a/src/discussions/posts/post/PostLink.jsx +++ b/src/discussions/posts/post/PostLink.jsx @@ -1,13 +1,13 @@ import React, { useContext } from 'react'; import classNames from 'classnames'; -import MathJax from 'react-mathjax-preview'; import { Link } from 'react-router-dom'; import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { Badge, Icon } from '@edx/paragon'; import { Bookmark } from '@edx/paragon/icons'; +import HTMLLoader from '../../../components/HTMLLoader'; import { AvatarBorderAndLabelColors, Routes, ThreadType } from '../../../data/constants'; import AuthorLabel from '../../common/AuthorLabel'; import { DiscussionContext } from '../../common/context'; @@ -83,7 +83,7 @@ function PostLink({
- +