utils.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /**
  2. * A package of some miscellaneous utility functions.
  3. *
  4. * @author Naotoshi Fujita
  5. * @copyright Naotoshi Fujita. All rights reserved.
  6. */
  7. import { create, append, remove, applyStyle } from "./dom";
  8. /**
  9. * Convert the given value to array.
  10. *
  11. * @param {*} value - Any value.
  12. *
  13. * @return {*[]} - Array containing the given value.
  14. */
  15. export function toArray( value ) {
  16. return Array.isArray( value ) ? value : [ value ];
  17. }
  18. /**
  19. * Check if the given value is between min and max.
  20. * Min will be returned when the value is less than min or max will do when greater than max.
  21. *
  22. * @param {number} value - A number to be checked.
  23. * @param {number} m1 - Minimum or maximum number.
  24. * @param {number} m2 - Maximum or minimum number.
  25. *
  26. * @return {number} - A value itself, min or max.
  27. */
  28. export function between( value, m1, m2 ) {
  29. return Math.min( Math.max( value, m1 > m2 ? m2 : m1 ), m1 > m2 ? m1 : m2 );
  30. }
  31. /**
  32. * The sprintf method with minimum functionality.
  33. *
  34. * @param {string} format - The string format.
  35. * @param {string|Array} replacements - Replacements accepting multiple arguments.
  36. *
  37. * @returns {string} - Converted string.
  38. */
  39. export function sprintf( format, replacements ) {
  40. let i = 0;
  41. return format.replace( /%s/g, () => toArray( replacements )[ i++ ] );
  42. }
  43. /**
  44. * Append px unit to the given subject if necessary.
  45. *
  46. * @param {number|string} value - A value that may not include an unit.
  47. *
  48. * @return {string} - If the value is string, return itself.
  49. * If number, do value + "px". An empty string, otherwise.
  50. */
  51. export function unit( value ) {
  52. const type = typeof value;
  53. if ( type === 'number' && value > 0 ) {
  54. return parseFloat( value ) + 'px';
  55. }
  56. return type === 'string' ? value : '';
  57. }
  58. /**
  59. * Pad start with 0.
  60. *
  61. * @param {number} number - A number to be filled with 0.
  62. *
  63. * @return {string|number} - Padded number.
  64. */
  65. export function pad( number ) {
  66. return number < 10 ? '0' + number : number
  67. }
  68. /**
  69. * Convert the given value to pixel.
  70. *
  71. * @param {Element} root - Root element where a dummy div is appended.
  72. * @param {string|number} value - CSS value to be converted, such as 10rem.
  73. *
  74. * @return {number} - Pixel.
  75. */
  76. export function toPixel( root, value ) {
  77. if ( typeof value === 'string' ) {
  78. const div = create( 'div', {} );
  79. applyStyle( div, {
  80. position: 'absolute',
  81. width: value,
  82. } );
  83. append( root, div );
  84. value = div.clientWidth;
  85. remove( div );
  86. }
  87. return +value || 0;
  88. }