[d565449] | 1 | (function (global, factory) {
|
---|
| 2 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
---|
| 3 | typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
---|
| 4 | (global = global || self, factory(global.rtlCSSJSCore = {}));
|
---|
| 5 | }(this, (function (exports) { 'use strict';
|
---|
| 6 |
|
---|
| 7 | /**
|
---|
| 8 | * Takes an array of [keyValue1, keyValue2] pairs and creates an object of {keyValue1: keyValue2, keyValue2: keyValue1}
|
---|
| 9 | * @param {Array} array the array of pairs
|
---|
| 10 | * @return {Object} the {key, value} pair object
|
---|
| 11 | */
|
---|
| 12 | function arrayToObject(array) {
|
---|
| 13 | return array.reduce(function (obj, _ref) {
|
---|
| 14 | var prop1 = _ref[0],
|
---|
| 15 | prop2 = _ref[1];
|
---|
| 16 | obj[prop1] = prop2;
|
---|
| 17 | obj[prop2] = prop1;
|
---|
| 18 | return obj;
|
---|
| 19 | }, {});
|
---|
| 20 | }
|
---|
| 21 | function isBoolean(val) {
|
---|
| 22 | return typeof val === 'boolean';
|
---|
| 23 | }
|
---|
| 24 | function isFunction(val) {
|
---|
| 25 | return typeof val === 'function';
|
---|
| 26 | }
|
---|
| 27 | function isNumber(val) {
|
---|
| 28 | return typeof val === 'number';
|
---|
| 29 | }
|
---|
| 30 | function isNullOrUndefined(val) {
|
---|
| 31 | return val === null || typeof val === 'undefined';
|
---|
| 32 | }
|
---|
| 33 | function isObject(val) {
|
---|
| 34 | return val && typeof val === 'object';
|
---|
| 35 | }
|
---|
| 36 | function isString(val) {
|
---|
| 37 | return typeof val === 'string';
|
---|
| 38 | }
|
---|
| 39 | function includes(inclusive, inclusee) {
|
---|
| 40 | return inclusive.indexOf(inclusee) !== -1;
|
---|
| 41 | }
|
---|
| 42 |
|
---|
| 43 | /**
|
---|
| 44 | * Flip the sign of a CSS value, possibly with a unit.
|
---|
| 45 | *
|
---|
| 46 | * We can't just negate the value with unary minus due to the units.
|
---|
| 47 | *
|
---|
| 48 | * @private
|
---|
| 49 | * @param {String} value - the original value (for example 77%)
|
---|
| 50 | * @return {String} the result (for example -77%)
|
---|
| 51 | */
|
---|
| 52 | function flipSign(value) {
|
---|
| 53 | if (parseFloat(value) === 0) {
|
---|
| 54 | // Don't mangle zeroes
|
---|
| 55 | return value;
|
---|
| 56 | }
|
---|
| 57 | if (value[0] === '-') {
|
---|
| 58 | return value.slice(1);
|
---|
| 59 | }
|
---|
| 60 | return "-" + value;
|
---|
| 61 | }
|
---|
| 62 | function flipTransformSign(match, prefix, offset, suffix) {
|
---|
| 63 | return prefix + flipSign(offset) + suffix;
|
---|
| 64 | }
|
---|
| 65 |
|
---|
| 66 | /**
|
---|
| 67 | * Takes a percentage for background position and inverts it.
|
---|
| 68 | * This was copied and modified from CSSJanus:
|
---|
| 69 | * https://github.com/cssjanus/cssjanus/blob/4245f834365f6cfb0239191a151432fb85abab23/src/cssjanus.js#L152-L175
|
---|
| 70 | * @param {String} value - the original value (for example 77%)
|
---|
| 71 | * @return {String} the result (for example 23%)
|
---|
| 72 | */
|
---|
| 73 | function calculateNewBackgroundPosition(value) {
|
---|
| 74 | var idx = value.indexOf('.');
|
---|
| 75 | if (idx === -1) {
|
---|
| 76 | value = 100 - parseFloat(value) + "%";
|
---|
| 77 | } else {
|
---|
| 78 | // Two off, one for the "%" at the end, one for the dot itself
|
---|
| 79 | var len = value.length - idx - 2;
|
---|
| 80 | value = 100 - parseFloat(value);
|
---|
| 81 | value = value.toFixed(len) + "%";
|
---|
| 82 | }
|
---|
| 83 | return value;
|
---|
| 84 | }
|
---|
| 85 |
|
---|
| 86 | /**
|
---|
| 87 | * This takes a list of CSS values and converts it to an array
|
---|
| 88 | * @param {String} value - something like `1px`, `1px 2em`, or `3pt rgb(150, 230, 550) 40px calc(100% - 5px)`
|
---|
| 89 | * @return {Array} the split values (for example: `['3pt', 'rgb(150, 230, 550)', '40px', 'calc(100% - 5px)']`)
|
---|
| 90 | */
|
---|
| 91 | function getValuesAsList(value) {
|
---|
| 92 | return value.replace(/ +/g, ' ') // remove all extraneous spaces
|
---|
| 93 | .split(' ').map(function (i) {
|
---|
| 94 | return i.trim();
|
---|
| 95 | }) // get rid of extra space before/after each item
|
---|
| 96 | .filter(Boolean) // get rid of empty strings
|
---|
| 97 | // join items which are within parenthese
|
---|
| 98 | // luckily `calc (100% - 5px)` is invalid syntax and it must be `calc(100% - 5px)`, otherwise this would be even more complex
|
---|
| 99 | .reduce(function (_ref2, item) {
|
---|
| 100 | var list = _ref2.list,
|
---|
| 101 | state = _ref2.state;
|
---|
| 102 | var openParansCount = (item.match(/\(/g) || []).length;
|
---|
| 103 | var closedParansCount = (item.match(/\)/g) || []).length;
|
---|
| 104 | if (state.parensDepth > 0) {
|
---|
| 105 | list[list.length - 1] = list[list.length - 1] + " " + item;
|
---|
| 106 | } else {
|
---|
| 107 | list.push(item);
|
---|
| 108 | }
|
---|
| 109 | state.parensDepth += openParansCount - closedParansCount;
|
---|
| 110 | return {
|
---|
| 111 | list: list,
|
---|
| 112 | state: state
|
---|
| 113 | };
|
---|
| 114 | }, {
|
---|
| 115 | list: [],
|
---|
| 116 | state: {
|
---|
| 117 | parensDepth: 0
|
---|
| 118 | }
|
---|
| 119 | }).list;
|
---|
| 120 | }
|
---|
| 121 |
|
---|
| 122 | /**
|
---|
| 123 | * This is intended for properties that are `top right bottom left` and will switch them to `top left bottom right`
|
---|
| 124 | * @param {String} value - `1px 2px 3px 4px` for example, but also handles cases where there are too few/too many and
|
---|
| 125 | * simply returns the value in those cases (which is the correct behavior)
|
---|
| 126 | * @return {String} the result - `1px 4px 3px 2px` for example.
|
---|
| 127 | */
|
---|
| 128 | function handleQuartetValues(value) {
|
---|
| 129 | var splitValues = getValuesAsList(value);
|
---|
| 130 | if (splitValues.length <= 3 || splitValues.length > 4) {
|
---|
| 131 | return value;
|
---|
| 132 | }
|
---|
| 133 | var top = splitValues[0],
|
---|
| 134 | right = splitValues[1],
|
---|
| 135 | bottom = splitValues[2],
|
---|
| 136 | left = splitValues[3];
|
---|
| 137 | return [top, left, bottom, right].join(' ');
|
---|
| 138 | }
|
---|
| 139 |
|
---|
| 140 | /**
|
---|
| 141 | *
|
---|
| 142 | * @param {String|Number|Object} value css property value to test
|
---|
| 143 | * @returns If the css property value can(should?) have an RTL equivalent
|
---|
| 144 | */
|
---|
| 145 | function canConvertValue(value) {
|
---|
| 146 | return !isBoolean(value) && !isNullOrUndefined(value);
|
---|
| 147 | }
|
---|
| 148 |
|
---|
| 149 | /**
|
---|
| 150 | * Splits a shadow style into its separate shadows using the comma delimiter, but creating an exception
|
---|
| 151 | * for comma separated values in parentheses often used for rgba colours.
|
---|
| 152 | * @param {String} value
|
---|
| 153 | * @returns {Array} array of all box shadow values in the string
|
---|
| 154 | */
|
---|
| 155 | function splitShadow(value) {
|
---|
| 156 | var shadows = [];
|
---|
| 157 | var start = 0;
|
---|
| 158 | var end = 0;
|
---|
| 159 | var rgba = false;
|
---|
| 160 | while (end < value.length) {
|
---|
| 161 | if (!rgba && value[end] === ',') {
|
---|
| 162 | shadows.push(value.substring(start, end).trim());
|
---|
| 163 | end++;
|
---|
| 164 | start = end;
|
---|
| 165 | } else if (value[end] === "(") {
|
---|
| 166 | rgba = true;
|
---|
| 167 | end++;
|
---|
| 168 | } else if (value[end] === ')') {
|
---|
| 169 | rgba = false;
|
---|
| 170 | end++;
|
---|
| 171 | } else {
|
---|
| 172 | end++;
|
---|
| 173 | }
|
---|
| 174 | }
|
---|
| 175 |
|
---|
| 176 | // push the last shadow value if there is one
|
---|
| 177 | // istanbul ignore next
|
---|
| 178 | if (start != end) {
|
---|
| 179 | shadows.push(value.substring(start, end + 1));
|
---|
| 180 | }
|
---|
| 181 | return shadows;
|
---|
| 182 | }
|
---|
| 183 |
|
---|
| 184 | // some values require a little fudging, that fudging goes here.
|
---|
| 185 | var propertyValueConverters = {
|
---|
| 186 | padding: function padding(_ref) {
|
---|
| 187 | var value = _ref.value;
|
---|
| 188 | if (isNumber(value)) {
|
---|
| 189 | return value;
|
---|
| 190 | }
|
---|
| 191 | return handleQuartetValues(value);
|
---|
| 192 | },
|
---|
| 193 | textShadow: function textShadow(_ref2) {
|
---|
| 194 | var value = _ref2.value;
|
---|
| 195 | var flippedShadows = splitShadow(value).map(function (shadow) {
|
---|
| 196 | // intentionally leaving off the `g` flag here because we only want to change the first number (which is the offset-x)
|
---|
| 197 | return shadow.replace(/(^|\s)(-*)([.|\d]+)/, function (match, whiteSpace, negative, number) {
|
---|
| 198 | if (number === '0') {
|
---|
| 199 | return match;
|
---|
| 200 | }
|
---|
| 201 | var doubleNegative = negative === '' ? '-' : '';
|
---|
| 202 | return "" + whiteSpace + doubleNegative + number;
|
---|
| 203 | });
|
---|
| 204 | });
|
---|
| 205 | return flippedShadows.join(',');
|
---|
| 206 | },
|
---|
| 207 | borderColor: function borderColor(_ref3) {
|
---|
| 208 | var value = _ref3.value;
|
---|
| 209 | return handleQuartetValues(value);
|
---|
| 210 | },
|
---|
| 211 | borderRadius: function borderRadius(_ref4) {
|
---|
| 212 | var value = _ref4.value;
|
---|
| 213 | if (isNumber(value)) {
|
---|
| 214 | return value;
|
---|
| 215 | }
|
---|
| 216 | if (includes(value, '/')) {
|
---|
| 217 | var _value$split = value.split('/'),
|
---|
| 218 | radius1 = _value$split[0],
|
---|
| 219 | radius2 = _value$split[1];
|
---|
| 220 | var convertedRadius1 = propertyValueConverters.borderRadius({
|
---|
| 221 | value: radius1.trim()
|
---|
| 222 | });
|
---|
| 223 | var convertedRadius2 = propertyValueConverters.borderRadius({
|
---|
| 224 | value: radius2.trim()
|
---|
| 225 | });
|
---|
| 226 | return convertedRadius1 + " / " + convertedRadius2;
|
---|
| 227 | }
|
---|
| 228 | var splitValues = getValuesAsList(value);
|
---|
| 229 | switch (splitValues.length) {
|
---|
| 230 | case 2:
|
---|
| 231 | {
|
---|
| 232 | return splitValues.reverse().join(' ');
|
---|
| 233 | }
|
---|
| 234 | case 4:
|
---|
| 235 | {
|
---|
| 236 | var topLeft = splitValues[0],
|
---|
| 237 | topRight = splitValues[1],
|
---|
| 238 | bottomRight = splitValues[2],
|
---|
| 239 | bottomLeft = splitValues[3];
|
---|
| 240 | return [topRight, topLeft, bottomLeft, bottomRight].join(' ');
|
---|
| 241 | }
|
---|
| 242 | default:
|
---|
| 243 | {
|
---|
| 244 | return value;
|
---|
| 245 | }
|
---|
| 246 | }
|
---|
| 247 | },
|
---|
| 248 | background: function background(_ref5) {
|
---|
| 249 | var value = _ref5.value,
|
---|
| 250 | valuesToConvert = _ref5.valuesToConvert,
|
---|
| 251 | isRtl = _ref5.isRtl,
|
---|
| 252 | bgImgDirectionRegex = _ref5.bgImgDirectionRegex,
|
---|
| 253 | bgPosDirectionRegex = _ref5.bgPosDirectionRegex;
|
---|
| 254 | if (isNumber(value)) {
|
---|
| 255 | return value;
|
---|
| 256 | }
|
---|
| 257 |
|
---|
| 258 | // Yeah, this is in need of a refactor 🙃...
|
---|
| 259 | // but this property is a tough cookie 🍪
|
---|
| 260 | // get the backgroundPosition out of the string by removing everything that couldn't be the backgroundPosition value
|
---|
| 261 | var backgroundPositionValue = value.replace(/(url\(.*?\))|(rgba?\(.*?\))|(hsl\(.*?\))|(#[a-fA-F0-9]+)|((^| )(\D)+( |$))/g, '').trim();
|
---|
| 262 | // replace that backgroundPosition value with the converted version
|
---|
| 263 | value = value.replace(backgroundPositionValue, propertyValueConverters.backgroundPosition({
|
---|
| 264 | value: backgroundPositionValue,
|
---|
| 265 | valuesToConvert: valuesToConvert,
|
---|
| 266 | isRtl: isRtl,
|
---|
| 267 | bgPosDirectionRegex: bgPosDirectionRegex
|
---|
| 268 | }));
|
---|
| 269 | // do the backgroundImage value replacing on the whole value (because why not?)
|
---|
| 270 | return propertyValueConverters.backgroundImage({
|
---|
| 271 | value: value,
|
---|
| 272 | valuesToConvert: valuesToConvert,
|
---|
| 273 | bgImgDirectionRegex: bgImgDirectionRegex
|
---|
| 274 | });
|
---|
| 275 | },
|
---|
| 276 | backgroundImage: function backgroundImage(_ref6) {
|
---|
| 277 | var value = _ref6.value,
|
---|
| 278 | valuesToConvert = _ref6.valuesToConvert,
|
---|
| 279 | bgImgDirectionRegex = _ref6.bgImgDirectionRegex;
|
---|
| 280 | if (!includes(value, 'url(') && !includes(value, 'linear-gradient(')) {
|
---|
| 281 | return value;
|
---|
| 282 | }
|
---|
| 283 | return value.replace(bgImgDirectionRegex, function (match, g1, group2) {
|
---|
| 284 | return match.replace(group2, valuesToConvert[group2]);
|
---|
| 285 | });
|
---|
| 286 | },
|
---|
| 287 | backgroundPosition: function backgroundPosition(_ref7) {
|
---|
| 288 | var value = _ref7.value,
|
---|
| 289 | valuesToConvert = _ref7.valuesToConvert,
|
---|
| 290 | isRtl = _ref7.isRtl,
|
---|
| 291 | bgPosDirectionRegex = _ref7.bgPosDirectionRegex;
|
---|
| 292 | return value
|
---|
| 293 | // intentionally only grabbing the first instance of this because that represents `left`
|
---|
| 294 | .replace(isRtl ? /^((-|\d|\.)+%)/ : null, function (match, group) {
|
---|
| 295 | return calculateNewBackgroundPosition(group);
|
---|
| 296 | }).replace(bgPosDirectionRegex, function (match) {
|
---|
| 297 | return valuesToConvert[match];
|
---|
| 298 | });
|
---|
| 299 | },
|
---|
| 300 | backgroundPositionX: function backgroundPositionX(_ref8) {
|
---|
| 301 | var value = _ref8.value,
|
---|
| 302 | valuesToConvert = _ref8.valuesToConvert,
|
---|
| 303 | isRtl = _ref8.isRtl,
|
---|
| 304 | bgPosDirectionRegex = _ref8.bgPosDirectionRegex;
|
---|
| 305 | if (isNumber(value)) {
|
---|
| 306 | return value;
|
---|
| 307 | }
|
---|
| 308 | return propertyValueConverters.backgroundPosition({
|
---|
| 309 | value: value,
|
---|
| 310 | valuesToConvert: valuesToConvert,
|
---|
| 311 | isRtl: isRtl,
|
---|
| 312 | bgPosDirectionRegex: bgPosDirectionRegex
|
---|
| 313 | });
|
---|
| 314 | },
|
---|
| 315 | transition: function transition(_ref9) {
|
---|
| 316 | var value = _ref9.value,
|
---|
| 317 | propertiesToConvert = _ref9.propertiesToConvert;
|
---|
| 318 | return value.split(/,\s*/g).map(function (transition) {
|
---|
| 319 | var values = transition.split(' ');
|
---|
| 320 |
|
---|
| 321 | // Property is always defined first
|
---|
| 322 | values[0] = propertiesToConvert[values[0]] || values[0];
|
---|
| 323 | return values.join(' ');
|
---|
| 324 | }).join(', ');
|
---|
| 325 | },
|
---|
| 326 | transitionProperty: function transitionProperty(_ref10) {
|
---|
| 327 | var value = _ref10.value,
|
---|
| 328 | propertiesToConvert = _ref10.propertiesToConvert;
|
---|
| 329 | return value.split(/,\s*/g).map(function (prop) {
|
---|
| 330 | return propertiesToConvert[prop] || prop;
|
---|
| 331 | }).join(', ');
|
---|
| 332 | },
|
---|
| 333 | transform: function transform(_ref11) {
|
---|
| 334 | var value = _ref11.value;
|
---|
| 335 | // This was copied and modified from CSSJanus:
|
---|
| 336 | // https://github.com/cssjanus/cssjanus/blob/4a40f001b1ba35567112d8b8e1d9d95eda4234c3/src/cssjanus.js#L152-L153
|
---|
| 337 | var nonAsciiPattern = "[^\\u0020-\\u007e]";
|
---|
| 338 | var escapePattern = "(?:" + '(?:(?:\\[0-9a-f]{1,6})(?:\\r\\n|\\s)?)' + "|\\\\[^\\r\\n\\f0-9a-f])";
|
---|
| 339 | var signedQuantPattern = "((?:-?" + ('(?:[0-9]*\\.[0-9]+|[0-9]+)' + "(?:\\s*" + '(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)' + "|" + ("-?" + ("(?:[_a-z]|" + nonAsciiPattern + "|" + escapePattern + ")") + ("(?:[_a-z0-9-]|" + nonAsciiPattern + "|" + escapePattern + ")") + "*") + ")?") + ")|(?:inherit|auto))";
|
---|
| 340 | var translateXRegExp = new RegExp("(translateX\\s*\\(\\s*)" + signedQuantPattern + "(\\s*\\))", 'gi');
|
---|
| 341 | var translateRegExp = new RegExp("(translate\\s*\\(\\s*)" + signedQuantPattern + "((?:\\s*,\\s*" + signedQuantPattern + "){0,1}\\s*\\))", 'gi');
|
---|
| 342 | var translate3dRegExp = new RegExp("(translate3d\\s*\\(\\s*)" + signedQuantPattern + "((?:\\s*,\\s*" + signedQuantPattern + "){0,2}\\s*\\))", 'gi');
|
---|
| 343 | var rotateRegExp = new RegExp("(rotate[ZY]?\\s*\\(\\s*)" + signedQuantPattern + "(\\s*\\))", 'gi');
|
---|
| 344 | return value.replace(translateXRegExp, flipTransformSign).replace(translateRegExp, flipTransformSign).replace(translate3dRegExp, flipTransformSign).replace(rotateRegExp, flipTransformSign);
|
---|
| 345 | }
|
---|
| 346 | };
|
---|
| 347 | propertyValueConverters.objectPosition = propertyValueConverters.backgroundPosition;
|
---|
| 348 | propertyValueConverters.margin = propertyValueConverters.padding;
|
---|
| 349 | propertyValueConverters.borderWidth = propertyValueConverters.padding;
|
---|
| 350 | propertyValueConverters.boxShadow = propertyValueConverters.textShadow;
|
---|
| 351 | propertyValueConverters.webkitBoxShadow = propertyValueConverters.boxShadow;
|
---|
| 352 | propertyValueConverters.mozBoxShadow = propertyValueConverters.boxShadow;
|
---|
| 353 | propertyValueConverters.WebkitBoxShadow = propertyValueConverters.boxShadow;
|
---|
| 354 | propertyValueConverters.MozBoxShadow = propertyValueConverters.boxShadow;
|
---|
| 355 | propertyValueConverters.borderStyle = propertyValueConverters.borderColor;
|
---|
| 356 | propertyValueConverters.webkitTransform = propertyValueConverters.transform;
|
---|
| 357 | propertyValueConverters.mozTransform = propertyValueConverters.transform;
|
---|
| 358 | propertyValueConverters.WebkitTransform = propertyValueConverters.transform;
|
---|
| 359 | propertyValueConverters.MozTransform = propertyValueConverters.transform;
|
---|
| 360 | propertyValueConverters.transformOrigin = propertyValueConverters.backgroundPosition;
|
---|
| 361 | propertyValueConverters.webkitTransformOrigin = propertyValueConverters.transformOrigin;
|
---|
| 362 | propertyValueConverters.mozTransformOrigin = propertyValueConverters.transformOrigin;
|
---|
| 363 | propertyValueConverters.WebkitTransformOrigin = propertyValueConverters.transformOrigin;
|
---|
| 364 | propertyValueConverters.MozTransformOrigin = propertyValueConverters.transformOrigin;
|
---|
| 365 | propertyValueConverters.webkitTransition = propertyValueConverters.transition;
|
---|
| 366 | propertyValueConverters.mozTransition = propertyValueConverters.transition;
|
---|
| 367 | propertyValueConverters.WebkitTransition = propertyValueConverters.transition;
|
---|
| 368 | propertyValueConverters.MozTransition = propertyValueConverters.transition;
|
---|
| 369 | propertyValueConverters.webkitTransitionProperty = propertyValueConverters.transitionProperty;
|
---|
| 370 | propertyValueConverters.mozTransitionProperty = propertyValueConverters.transitionProperty;
|
---|
| 371 | propertyValueConverters.WebkitTransitionProperty = propertyValueConverters.transitionProperty;
|
---|
| 372 | propertyValueConverters.MozTransitionProperty = propertyValueConverters.transitionProperty;
|
---|
| 373 |
|
---|
| 374 | // kebab-case versions
|
---|
| 375 |
|
---|
| 376 | propertyValueConverters['text-shadow'] = propertyValueConverters.textShadow;
|
---|
| 377 | propertyValueConverters['border-color'] = propertyValueConverters.borderColor;
|
---|
| 378 | propertyValueConverters['border-radius'] = propertyValueConverters.borderRadius;
|
---|
| 379 | propertyValueConverters['background-image'] = propertyValueConverters.backgroundImage;
|
---|
| 380 | propertyValueConverters['background-position'] = propertyValueConverters.backgroundPosition;
|
---|
| 381 | propertyValueConverters['background-position-x'] = propertyValueConverters.backgroundPositionX;
|
---|
| 382 | propertyValueConverters['object-position'] = propertyValueConverters.objectPosition;
|
---|
| 383 | propertyValueConverters['border-width'] = propertyValueConverters.padding;
|
---|
| 384 | propertyValueConverters['box-shadow'] = propertyValueConverters.textShadow;
|
---|
| 385 | propertyValueConverters['-webkit-box-shadow'] = propertyValueConverters.textShadow;
|
---|
| 386 | propertyValueConverters['-moz-box-shadow'] = propertyValueConverters.textShadow;
|
---|
| 387 | propertyValueConverters['border-style'] = propertyValueConverters.borderColor;
|
---|
| 388 | propertyValueConverters['-webkit-transform'] = propertyValueConverters.transform;
|
---|
| 389 | propertyValueConverters['-moz-transform'] = propertyValueConverters.transform;
|
---|
| 390 | propertyValueConverters['transform-origin'] = propertyValueConverters.transformOrigin;
|
---|
| 391 | propertyValueConverters['-webkit-transform-origin'] = propertyValueConverters.transformOrigin;
|
---|
| 392 | propertyValueConverters['-moz-transform-origin'] = propertyValueConverters.transformOrigin;
|
---|
| 393 | propertyValueConverters['-webkit-transition'] = propertyValueConverters.transition;
|
---|
| 394 | propertyValueConverters['-moz-transition'] = propertyValueConverters.transition;
|
---|
| 395 | propertyValueConverters['transition-property'] = propertyValueConverters.transitionProperty;
|
---|
| 396 | propertyValueConverters['-webkit-transition-property'] = propertyValueConverters.transitionProperty;
|
---|
| 397 | propertyValueConverters['-moz-transition-property'] = propertyValueConverters.transitionProperty;
|
---|
| 398 |
|
---|
| 399 | // this will be an object of properties that map to their corresponding rtl property (their doppelganger)
|
---|
| 400 | var propertiesToConvert = arrayToObject([['paddingLeft', 'paddingRight'], ['marginLeft', 'marginRight'], ['left', 'right'], ['borderLeft', 'borderRight'], ['borderLeftColor', 'borderRightColor'], ['borderLeftStyle', 'borderRightStyle'], ['borderLeftWidth', 'borderRightWidth'], ['borderTopLeftRadius', 'borderTopRightRadius'], ['borderBottomLeftRadius', 'borderBottomRightRadius'],
|
---|
| 401 | // kebab-case versions
|
---|
| 402 | ['padding-left', 'padding-right'], ['margin-left', 'margin-right'], ['border-left', 'border-right'], ['border-left-color', 'border-right-color'], ['border-left-style', 'border-right-style'], ['border-left-width', 'border-right-width'], ['border-top-left-radius', 'border-top-right-radius'], ['border-bottom-left-radius', 'border-bottom-right-radius']]);
|
---|
| 403 | var propsToIgnore = ['content'];
|
---|
| 404 |
|
---|
| 405 | // this is the same as the propertiesToConvert except for values
|
---|
| 406 | var valuesToConvert = arrayToObject([['ltr', 'rtl'], ['left', 'right'], ['w-resize', 'e-resize'], ['sw-resize', 'se-resize'], ['nw-resize', 'ne-resize']]);
|
---|
| 407 |
|
---|
| 408 | // Sorry for the regex 😞, but basically thisis used to replace _every_ instance of
|
---|
| 409 | // `ltr`, `rtl`, `right`, and `left` in `backgroundimage` with the corresponding opposite.
|
---|
| 410 | // A situation we're accepting here:
|
---|
| 411 | // url('/left/right/rtl/ltr.png') will be changed to url('/right/left/ltr/rtl.png')
|
---|
| 412 | // Definite trade-offs here, but I think it's a good call.
|
---|
| 413 | var bgImgDirectionRegex = new RegExp('(^|\\W|_)((ltr)|(rtl)|(left)|(right))(\\W|_|$)', 'g');
|
---|
| 414 | var bgPosDirectionRegex = new RegExp('(left)|(right)');
|
---|
| 415 |
|
---|
| 416 | /**
|
---|
| 417 | * converts properties and values in the CSS in JS object to their corresponding RTL values
|
---|
| 418 | * @param {Object} object the CSS in JS object
|
---|
| 419 | * @return {Object} the RTL converted object
|
---|
| 420 | */
|
---|
| 421 | function convert(object) {
|
---|
| 422 | return Object.keys(object).reduce(function (newObj, originalKey) {
|
---|
| 423 | var originalValue = object[originalKey];
|
---|
| 424 | if (isString(originalValue)) {
|
---|
| 425 | // you're welcome to later code 😺
|
---|
| 426 | originalValue = originalValue.trim();
|
---|
| 427 | }
|
---|
| 428 |
|
---|
| 429 | // Some properties should never be transformed
|
---|
| 430 | if (includes(propsToIgnore, originalKey)) {
|
---|
| 431 | newObj[originalKey] = originalValue;
|
---|
| 432 | return newObj;
|
---|
| 433 | }
|
---|
| 434 | var _convertProperty = convertProperty(originalKey, originalValue),
|
---|
| 435 | key = _convertProperty.key,
|
---|
| 436 | value = _convertProperty.value;
|
---|
| 437 | newObj[key] = value;
|
---|
| 438 | return newObj;
|
---|
| 439 | }, Array.isArray(object) ? [] : {});
|
---|
| 440 | }
|
---|
| 441 |
|
---|
| 442 | /**
|
---|
| 443 | * Converts a property and its value to the corresponding RTL key and value
|
---|
| 444 | * @param {String} originalKey the original property key
|
---|
| 445 | * @param {Number|String|Object} originalValue the original css property value
|
---|
| 446 | * @return {Object} the new {key, value} pair
|
---|
| 447 | */
|
---|
| 448 | function convertProperty(originalKey, originalValue) {
|
---|
| 449 | var isNoFlip = /\/\*\s?@noflip\s?\*\//.test(originalValue);
|
---|
| 450 | var key = isNoFlip ? originalKey : getPropertyDoppelganger(originalKey);
|
---|
| 451 | var value = isNoFlip ? originalValue : getValueDoppelganger(key, originalValue);
|
---|
| 452 | return {
|
---|
| 453 | key: key,
|
---|
| 454 | value: value
|
---|
| 455 | };
|
---|
| 456 | }
|
---|
| 457 |
|
---|
| 458 | /**
|
---|
| 459 | * This gets the RTL version of the given property if it has a corresponding RTL property
|
---|
| 460 | * @param {String} property the name of the property
|
---|
| 461 | * @return {String} the name of the RTL property
|
---|
| 462 | */
|
---|
| 463 | function getPropertyDoppelganger(property) {
|
---|
| 464 | return propertiesToConvert[property] || property;
|
---|
| 465 | }
|
---|
| 466 |
|
---|
| 467 | /**
|
---|
| 468 | * This converts the given value to the RTL version of that value based on the key
|
---|
| 469 | * @param {String} key this is the key (note: this should be the RTL version of the originalKey)
|
---|
| 470 | * @param {String|Number|Object} originalValue the original css property value. If it's an object, then we'll convert that as well
|
---|
| 471 | * @return {String|Number|Object} the converted value
|
---|
| 472 | */
|
---|
| 473 | function getValueDoppelganger(key, originalValue) {
|
---|
| 474 | if (!canConvertValue(originalValue)) {
|
---|
| 475 | return originalValue;
|
---|
| 476 | }
|
---|
| 477 | if (isObject(originalValue)) {
|
---|
| 478 | return convert(originalValue); // recursion 🌀
|
---|
| 479 | }
|
---|
| 480 |
|
---|
| 481 | var isNum = isNumber(originalValue);
|
---|
| 482 | var isFunc = isFunction(originalValue);
|
---|
| 483 | var importantlessValue = isNum || isFunc ? originalValue : originalValue.replace(/ !important.*?$/, '');
|
---|
| 484 | var isImportant = !isNum && importantlessValue.length !== originalValue.length;
|
---|
| 485 | var valueConverter = propertyValueConverters[key];
|
---|
| 486 | var newValue;
|
---|
| 487 | if (valueConverter) {
|
---|
| 488 | newValue = valueConverter({
|
---|
| 489 | value: importantlessValue,
|
---|
| 490 | valuesToConvert: valuesToConvert,
|
---|
| 491 | propertiesToConvert: propertiesToConvert,
|
---|
| 492 | isRtl: true,
|
---|
| 493 | bgImgDirectionRegex: bgImgDirectionRegex,
|
---|
| 494 | bgPosDirectionRegex: bgPosDirectionRegex
|
---|
| 495 | });
|
---|
| 496 | } else {
|
---|
| 497 | newValue = valuesToConvert[importantlessValue] || importantlessValue;
|
---|
| 498 | }
|
---|
| 499 | if (isImportant) {
|
---|
| 500 | return newValue + " !important";
|
---|
| 501 | }
|
---|
| 502 | return newValue;
|
---|
| 503 | }
|
---|
| 504 |
|
---|
| 505 | exports.arrayToObject = arrayToObject;
|
---|
| 506 | exports.calculateNewBackgroundPosition = calculateNewBackgroundPosition;
|
---|
| 507 | exports.calculateNewTranslate = flipTransformSign;
|
---|
| 508 | exports.canConvertValue = canConvertValue;
|
---|
| 509 | exports.convert = convert;
|
---|
| 510 | exports.convertProperty = convertProperty;
|
---|
| 511 | exports.flipSign = flipSign;
|
---|
| 512 | exports.flipTransformSign = flipTransformSign;
|
---|
| 513 | exports.getPropertyDoppelganger = getPropertyDoppelganger;
|
---|
| 514 | exports.getValueDoppelganger = getValueDoppelganger;
|
---|
| 515 | exports.getValuesAsList = getValuesAsList;
|
---|
| 516 | exports.handleQuartetValues = handleQuartetValues;
|
---|
| 517 | exports.includes = includes;
|
---|
| 518 | exports.isBoolean = isBoolean;
|
---|
| 519 | exports.isFunction = isFunction;
|
---|
| 520 | exports.isNullOrUndefined = isNullOrUndefined;
|
---|
| 521 | exports.isNumber = isNumber;
|
---|
| 522 | exports.isObject = isObject;
|
---|
| 523 | exports.isString = isString;
|
---|
| 524 | exports.propertiesToConvert = propertiesToConvert;
|
---|
| 525 | exports.propertyValueConverters = propertyValueConverters;
|
---|
| 526 | exports.propsToIgnore = propsToIgnore;
|
---|
| 527 | exports.splitShadow = splitShadow;
|
---|
| 528 | exports.valuesToConvert = valuesToConvert;
|
---|
| 529 |
|
---|
| 530 | Object.defineProperty(exports, '__esModule', { value: true });
|
---|
| 531 |
|
---|
| 532 | })));
|
---|
| 533 | //# sourceMappingURL=rtl-css-js.core.umd.js.map
|
---|