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';
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'>
onKeyUp={onKeyUp}
onFocus={this.onFocus}
onBlur={this.onBlur}
- style={style}
+ dir='auto'
aria-autocomplete='list'
id={id}
className={className}
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';
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'>
onFocus={this.onFocus}
onBlur={this.onBlur}
onPaste={this.onPaste}
- style={style}
+ dir='auto'
aria-autocomplete='list'
/>
</label>
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';
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 = '';
<div
ref={this.setContentsRef}
key={`contents-${tagLinks}`}
- style={directionStyle}
tabIndex={!hidden ? 0 : null}
dangerouslySetInnerHTML={content}
className='status__content__text'
return (
<div
className={classNames}
- style={directionStyle}
onMouseDown={this.handleMouseDown}
onMouseUp={this.handleMouseUp}
tabIndex='0'
return (
<div
className='status__content'
- style={directionStyle}
tabIndex='0'
ref={this.setRef}
>
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: {
<div
className='content'
dangerouslySetInnerHTML={{ __html: content || '' }}
- style={{ direction: isRtl(content) ? 'rtl' : 'ltr' }}
/>
{attachments.size > 0 && (
<AttachmentList
p, pre, blockquote {
margin-bottom: 20px;
white-space: pre-wrap;
+ unicode-bidi: plaintext;
&:last-child {
margin-bottom: 0;
a {
color: $secondary-text-color;
text-decoration: none;
+ unicode-bidi: isolate;
&:hover {
text-decoration: underline;
+++ /dev/null
-// 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;
-};