blob: 85df0c94283ad6e68315918c725fc87b15d586a6 [file] [log] [blame]
//
// Copyright 2014 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
//
part of charted.core.utils;
/// Charts are always drawn with LTR context.
BidiFormatter _bidiFormatter = new BidiFormatter.LTR();
/// Fix direction of HTML using <span dir="..."> for RTL when required
fixMarkupDirection(String markup) =>
_bidiFormatter.wrapWithSpan(markup, isHtml: true);
/// Fix direction of text using unicode markers for RTL when required
/// This is a simplified version of BidiFormatter.wrapWithUnicode that
/// is meant to be used for small labels only (Eg: axis ticks).
String fixSimpleTextDirection(String text) {
TextDirection direction = estimateDirectionOfSimpleText(text);
if (TextDirection.RTL == direction) {
var marker = direction == TextDirection.RTL ? Bidi.RLE : Bidi.LRE;
return "${marker}$text${Bidi.PDF}";
}
return text;
}
/// Estimates direction of simple text.
/// This is a simplified version of Bidi.estimateDirectionOfText
var _spaceRegExp = new RegExp(r'\s+');
var _digitsRegExp = new RegExp(r'\d');
TextDirection estimateDirectionOfSimpleText(String text) {
var rtlCount = 0,
total = 0,
hasWeaklyLtr = false,
tokens = text.split(_spaceRegExp);
for (int i = 0, len = tokens.length; i < len; ++i) {
var token = tokens.elementAt(i);
if (Bidi.startsWithRtl(token)) {
rtlCount++;
total++;
} else if (Bidi.hasAnyLtr(token)) {
total++;
} else if (_digitsRegExp.hasMatch(token)) {
hasWeaklyLtr = true;
}
}
if (total == 0) {
return hasWeaklyLtr ? TextDirection.LTR : TextDirection.UNKNOWN;
} else {
return rtlCount > 0.4 * total ? TextDirection.RTL : TextDirection.LTR;
}
}