[Glitch] Change RTL detection to rely on unicode-bidi paragraph by paragraph
Port 1f564051b6b447e3663852c482982b3ff5a2f238 to glitch-soc Signed-off-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
		
							parent
							
								
									6205107229
								
							
						
					
					
						commit
						b0722fbc14
					
				@ -4,7 +4,6 @@ import AutosuggestEmoji from './autosuggest_emoji';
 | 
			
		||||
import AutosuggestHashtag from './autosuggest_hashtag';
 | 
			
		||||
import ImmutablePropTypes from 'react-immutable-proptypes';
 | 
			
		||||
import PropTypes from 'prop-types';
 | 
			
		||||
import { isRtl } from 'flavours/glitch/util/rtl';
 | 
			
		||||
import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
import { List as ImmutableList } from 'immutable';
 | 
			
		||||
@ -189,11 +188,6 @@ export default class AutosuggestInput extends ImmutablePureComponent {
 | 
			
		||||
  render () {
 | 
			
		||||
    const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, className, id, maxLength } = this.props;
 | 
			
		||||
    const { suggestionsHidden } = this.state;
 | 
			
		||||
    const style = { direction: 'ltr' };
 | 
			
		||||
 | 
			
		||||
    if (isRtl(value)) {
 | 
			
		||||
      style.direction = 'rtl';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      <div className='autosuggest-input'>
 | 
			
		||||
@ -212,7 +206,7 @@ export default class AutosuggestInput extends ImmutablePureComponent {
 | 
			
		||||
            onKeyUp={onKeyUp}
 | 
			
		||||
            onFocus={this.onFocus}
 | 
			
		||||
            onBlur={this.onBlur}
 | 
			
		||||
            style={style}
 | 
			
		||||
            dir='auto'
 | 
			
		||||
            aria-autocomplete='list'
 | 
			
		||||
            id={id}
 | 
			
		||||
            className={className}
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,6 @@ import AutosuggestEmoji from './autosuggest_emoji';
 | 
			
		||||
import AutosuggestHashtag from './autosuggest_hashtag';
 | 
			
		||||
import ImmutablePropTypes from 'react-immutable-proptypes';
 | 
			
		||||
import PropTypes from 'prop-types';
 | 
			
		||||
import { isRtl } from 'flavours/glitch/util/rtl';
 | 
			
		||||
import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
			
		||||
import Textarea from 'react-textarea-autosize';
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
@ -195,11 +194,6 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
 | 
			
		||||
  render () {
 | 
			
		||||
    const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, children } = this.props;
 | 
			
		||||
    const { suggestionsHidden } = this.state;
 | 
			
		||||
    const style = { direction: 'ltr' };
 | 
			
		||||
 | 
			
		||||
    if (isRtl(value)) {
 | 
			
		||||
      style.direction = 'rtl';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return [
 | 
			
		||||
      <div className='compose-form__autosuggest-wrapper' key='autosuggest-wrapper'>
 | 
			
		||||
@ -220,7 +214,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
 | 
			
		||||
              onFocus={this.onFocus}
 | 
			
		||||
              onBlur={this.onBlur}
 | 
			
		||||
              onPaste={this.onPaste}
 | 
			
		||||
              style={style}
 | 
			
		||||
              dir='auto'
 | 
			
		||||
              aria-autocomplete='list'
 | 
			
		||||
            />
 | 
			
		||||
          </label>
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,6 @@
 | 
			
		||||
import React from 'react';
 | 
			
		||||
import ImmutablePropTypes from 'react-immutable-proptypes';
 | 
			
		||||
import PropTypes from 'prop-types';
 | 
			
		||||
import { isRtl } from 'flavours/glitch/util/rtl';
 | 
			
		||||
import { FormattedMessage } from 'react-intl';
 | 
			
		||||
import Permalink from './permalink';
 | 
			
		||||
import classnames from 'classnames';
 | 
			
		||||
@ -277,16 +276,11 @@ export default class StatusContent extends React.PureComponent {
 | 
			
		||||
 | 
			
		||||
    const content = { __html: status.get('contentHtml') };
 | 
			
		||||
    const spoilerContent = { __html: status.get('spoilerHtml') };
 | 
			
		||||
    const directionStyle = { direction: 'ltr' };
 | 
			
		||||
    const classNames = classnames('status__content', {
 | 
			
		||||
      'status__content--with-action': parseClick && !disabled,
 | 
			
		||||
      'status__content--with-spoiler': status.get('spoiler_text').length > 0,
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (isRtl(status.get('search_index'))) {
 | 
			
		||||
      directionStyle.direction = 'rtl';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (status.get('spoiler_text').length > 0) {
 | 
			
		||||
      let mentionsPlaceholder = '';
 | 
			
		||||
 | 
			
		||||
@ -346,7 +340,6 @@ export default class StatusContent extends React.PureComponent {
 | 
			
		||||
            <div
 | 
			
		||||
              ref={this.setContentsRef}
 | 
			
		||||
              key={`contents-${tagLinks}`}
 | 
			
		||||
              style={directionStyle}
 | 
			
		||||
              tabIndex={!hidden ? 0 : null}
 | 
			
		||||
              dangerouslySetInnerHTML={content}
 | 
			
		||||
              className='status__content__text'
 | 
			
		||||
@ -360,7 +353,6 @@ export default class StatusContent extends React.PureComponent {
 | 
			
		||||
      return (
 | 
			
		||||
        <div
 | 
			
		||||
          className={classNames}
 | 
			
		||||
          style={directionStyle}
 | 
			
		||||
          onMouseDown={this.handleMouseDown}
 | 
			
		||||
          onMouseUp={this.handleMouseUp}
 | 
			
		||||
          tabIndex='0'
 | 
			
		||||
@ -380,7 +372,6 @@ export default class StatusContent extends React.PureComponent {
 | 
			
		||||
      return (
 | 
			
		||||
        <div
 | 
			
		||||
          className='status__content'
 | 
			
		||||
          style={directionStyle}
 | 
			
		||||
          tabIndex='0'
 | 
			
		||||
          ref={this.setRef}
 | 
			
		||||
        >
 | 
			
		||||
 | 
			
		||||
@ -10,9 +10,6 @@ import AccountContainer from 'flavours/glitch/containers/account_container';
 | 
			
		||||
import IconButton from 'flavours/glitch/components/icon_button';
 | 
			
		||||
import AttachmentList from 'flavours/glitch/components/attachment_list';
 | 
			
		||||
 | 
			
		||||
//  Utils.
 | 
			
		||||
import { isRtl } from 'flavours/glitch/util/rtl';
 | 
			
		||||
 | 
			
		||||
//  Messages.
 | 
			
		||||
const messages = defineMessages({
 | 
			
		||||
  cancel: {
 | 
			
		||||
@ -71,7 +68,6 @@ class ReplyIndicator extends ImmutablePureComponent {
 | 
			
		||||
        <div
 | 
			
		||||
          className='content'
 | 
			
		||||
          dangerouslySetInnerHTML={{ __html: content || '' }}
 | 
			
		||||
          style={{ direction: isRtl(content) ? 'rtl' : 'ltr' }}
 | 
			
		||||
        />
 | 
			
		||||
        {attachments.size > 0 && (
 | 
			
		||||
          <AttachmentList
 | 
			
		||||
 | 
			
		||||
@ -70,6 +70,7 @@
 | 
			
		||||
  p, pre, blockquote {
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
    white-space: pre-wrap;
 | 
			
		||||
    unicode-bidi: plaintext;
 | 
			
		||||
 | 
			
		||||
    &:last-child {
 | 
			
		||||
      margin-bottom: 0;
 | 
			
		||||
@ -152,6 +153,7 @@
 | 
			
		||||
  a {
 | 
			
		||||
    color: $secondary-text-color;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    unicode-bidi: isolate;
 | 
			
		||||
 | 
			
		||||
    &:hover {
 | 
			
		||||
      text-decoration: underline;
 | 
			
		||||
 | 
			
		||||
@ -1,32 +0,0 @@
 | 
			
		||||
// U+0590  to U+05FF  - Hebrew
 | 
			
		||||
// U+0600  to U+06FF  - Arabic
 | 
			
		||||
// U+0700  to U+074F  - Syriac
 | 
			
		||||
// U+0750  to U+077F  - Arabic Supplement
 | 
			
		||||
// U+0780  to U+07BF  - Thaana
 | 
			
		||||
// U+07C0  to U+07FF  - N'Ko
 | 
			
		||||
// U+0800  to U+083F  - Samaritan
 | 
			
		||||
// U+08A0  to U+08FF  - Arabic Extended-A
 | 
			
		||||
// U+FB1D  to U+FB4F  - Hebrew presentation forms
 | 
			
		||||
// U+FB50  to U+FDFF  - Arabic presentation forms A
 | 
			
		||||
// U+FE70  to U+FEFF  - Arabic presentation forms B
 | 
			
		||||
 | 
			
		||||
const rtlChars = /[\u0590-\u083F]|[\u08A0-\u08FF]|[\uFB1D-\uFDFF]|[\uFE70-\uFEFF]/mg;
 | 
			
		||||
 | 
			
		||||
export function isRtl(text) {
 | 
			
		||||
  if (text.length === 0) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  text = text.replace(/(?:^|[^\/\w])@([a-z0-9_]+(@[a-z0-9\.\-]+)?)/ig, '');
 | 
			
		||||
  text = text.replace(/(?:^|[^\/\w])#([\S]+)/ig, '');
 | 
			
		||||
  text = text.replace(/\s+/g, '');
 | 
			
		||||
  text = text.replace(/(\w\S+\.\w{2,}\S*)/g, '');
 | 
			
		||||
 | 
			
		||||
  const matches = text.match(rtlChars);
 | 
			
		||||
 | 
			
		||||
  if (!matches) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return matches.length / text.length > 0.3;
 | 
			
		||||
};
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user