如果字符串长度小于length则从左侧和右侧填充字符,如果没法平均分配,则截断超出的长度

/**
 * 如果string字符串长度小于length则从左侧和右侧填充字符,如果没法平均分配,则截断超出的长度
 * Pads `string` on the left and right sides if it's shorter than `length`.
 * Padding characters are truncated if they can't be evenly divided by `length`
 * @param {string} [string=''] The string to pad
 * @param {number} [length=0] The padding length
 * @param {string} [chars=' '] The string used as padding
 * @returns {string} Returns the padding string
 * @example
 * pad('abc', 8)
 * // => 'abc'
 * pad('abc', 8, '_-')
 * // => '_-abc_-_'
 * pad('abc', 3)
 * // => 'abc'
 */

import toString from "./toString"  //我的博客搜索【转换`value`成字符串,`null`和`undefined`返回空字符串,`-0`转成'-0'】
import toInteger from "./toInteger" //我的博客搜索【转换为整数】
import stringSize from "./stringSize"
import createPadding from "./createPadding"

function pad(string, length, chars) {
  string = toString(string)
  length = toInteger(length)

  var strLength = length ? stringSize(string) : 0
  if (!length || strLength >= length) {
    return string
  }
  var mid = (length - strLength) / 2
  return (
    createPadding(Math.floor(mid), chars) +
    string +
    createPadding(Math.ceil(mid), chars)
  )
}

export default pad
/**
 * Creates the padding for `string` based on `length`.The `chars` string
 * is truncated if the number of characters exceeds `length`
 * @param {number} length The padding length
 * @param {string} [chars=' '] The string used as padding
 * @returns {string} Returns the padding for `string`
 */

import baseToString from "./baseToString"
import baseRepeat from "./baseRepeat"
import stringSize from "./stringSize"

function createPadding(length, chars) {
  chars = chars === undefined ? " " : baseToString(chars)

  var charsLength = chars.length
  if (charsLength < 2) {
    return charsLength ? baseRepeat(chars, length) : chars
  }
  var result = baseRepeat(chars, Math.ceil(length / stringSize(chars)))
  return result.slice(0, length)
}

export default createPadding
/**
 * The base implementation of `toString` which doesn't convert nullish values to empty strings
 * @param {*} value The value to process
 * @returns {string} Returns the string
 */

// A specialized version of `map` for arrays without for iteratee shorthands
function arrayMap(array, iteratee) {
  var index = -1,
    length = array == null ? 0 : array.length,
    result = Array(length)

  while (++index < length) {
    result[index] = iteratee(array[index], index, array)
  }
  return result
}

const symbolTag = "[object Symbol]"

function isObjectLike(value) {
  return typeof value == "object" && value !== null
}

// 判断`value`是否是`Symbol`类型
function isSymbol(value) {
  return (
    typeof value === "symbol" ||
    (isObjectLike(value) && Object.prototype.toString.call(value) === symbolTag)
  )
}

function baseToString(value) {
  if (typeof value === "string") {
    return value
  }
  if (Array.isArray(value)) {
    return arrayMap(value, baseToString) + ""
  }
  if (isSymbol(value)) {
    return Symbol.prototype.toString
      ? Symbol.prototype.toString.call(value)
      : ""
  }
  var result = value + ""
  return result == "0" && 1 / value == -Infinity ? "-0" : result
}

export default baseToString
/**
 * The base implementation of `repeat` which doesn't coerce arguments
 * @param {string} string The string to repeat
 * @param {number} n The number of times to repeat the string
 * @returns {string} Returns the repeated string
 */

function baseRepeat(string, n) {
  var result = ""
  if (!string || n < 1 || n > Number.MAX_SAFE_INTEGER) {
    return result
  }

  // 通过平方算法利用取幂来实现更快的重复。
  // Leverage the exponentiation by squaring algorithm for a faster repeat.
  // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
  do {
    if (n % 2) {
      result += string
    }
    n = Math.floor(n / 2)
    if (n) {
      string += string
    }
  } while (n)

  return result
}

export default baseRepeat
/**
 * Gets the number of symbols in `string`
 * @param {string} string The string to inspect
 * @returns {number} Returns the string size
 */

import hasUnicode from "./hasUnicode"

// Used to compose unicode character classes.
var rsAstralRange = "\\ud800-\\udfff",
  rsComboMarksRange = "\\u0300-\\u036f",
  reComboHalfMarksRange = "\\ufe20-\\ufe2f",
  rsComboSymbolsRange = "\\u20d0-\\u20ff",
  rsComboRange =
    rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
  rsVarRange = "\\ufe0e\\ufe0f"

// Used to compose unicode capture groups.
var rsAstral = "[" + rsAstralRange + "]",
  rsCombo = "[" + rsComboRange + "]",
  rsFitz = "\\ud83c[\\udffb-\\udfff]",
  rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")",
  rsNonAstral = "[^" + rsAstralRange + "]",
  rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}",
  rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]",
  rsZWJ = "\\u200d"

// Used to compose unicode regexes.
var rsSymbol =
  "(?:" +
  [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join(
    "|"
  ) +
  ")"

/** Used to compose unicode regexes. */
var reOptMod = rsModifier + "?",
  rsOptVar = "[" + rsVarRange + "]?",
  rsOptJoin =
    "(?:" +
    rsZWJ +
    "(?:" +
    [rsNonAstral, rsRegional, rsSurrPair].join("|") +
    ")" +
    rsOptVar +
    reOptMod +
    ")*",
  rsSeq = rsOptVar + reOptMod + rsOptJoin

// Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode).
var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g")

// Gets the size of a Unicode `string`
function unicodeSize(string) {
  var result = 0
  reUnicode.lastIndex = 0
  while (reUnicode.test(string)) {
    ++result
  }
  return result
}

function baseProperty(key) {
  return function(object) {
    return object == null ? undefined : object[key]
  }
}

// Gets the size of an ASCII `string`
var asciiSize = baseProperty("length")

function stringSize(string) {
  return hasUnicode(string) ? unicodeSize(string) : asciiSize(string)
}

export default stringSize
/**
 * Checks if `string` contains Unicode symbols
 * 检查字符串是否包含Unicode字符
 * @param {string} string The string to inspect.
 * @returns {boolean} Returns `true` if a symbol is found, else `false`
 */

const rsZWJ = "\\u200d"
const rsAstralRange = "\\ud800-\\udfff"
const rsComboMarksRange = "\\u0300-\\u036f"
const reComboHalfMarksRange = "\\ufe20-\\ufe2f"
const rsComboSymbolsRange = "\\u20d0-\\u20ff"
const rsComboRange =
  rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange
const rsVarRange = "\\ufe0e\\ufe0f"

const reHasUnicode = new RegExp(
  "[" + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + "]"
)

function hasUnicode(string) {
  return reHasUnicode.test(string)
}

export default hasUnicode

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值