wsemi
Version:
A support package for web developer.
990 lines (856 loc) • 65.6 kB
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>color.mjs - Documentation</title>
<script src="scripts/prettify/prettify.js"></script>
<script src="scripts/prettify/lang-css.js"></script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="styles/prettify.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
<script src="scripts/nav.js" defer></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
<label for="nav-trigger" class="navicon-button x">
<div class="navicon"></div>
</label>
<label for="nav-trigger" class="overlay"></label>
<nav >
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="wsemi.html">wsemi</a><ul class='methods'><li data-type='method'><a href="wsemi.html#.ab2blob">ab2blob</a></li><li data-type='method'><a href="wsemi.html#.ab2u8arr">ab2u8arr</a></li><li data-type='method'><a href="wsemi.html#.addExcelWorksheetFromData">addExcelWorksheetFromData</a></li><li data-type='method'><a href="wsemi.html#.addMonth">addMonth</a></li><li data-type='method'><a href="wsemi.html#.aes2str">aes2str</a></li><li data-type='method'><a href="wsemi.html#.alive">alive</a></li><li data-type='method'><a href="wsemi.html#.arr2dt">arr2dt</a></li><li data-type='method'><a href="wsemi.html#.arrAccum">arrAccum</a></li><li data-type='method'><a href="wsemi.html#.arrAdd">arrAdd</a></li><li data-type='method'><a href="wsemi.html#.arrAt">arrAt</a></li><li data-type='method'><a href="wsemi.html#.arrDiff">arrDiff</a></li><li data-type='method'><a href="wsemi.html#.arrFilterByKeywords">arrFilterByKeywords</a></li><li data-type='method'><a href="wsemi.html#.arrFilterByNum">arrFilterByNum</a></li><li data-type='method'><a href="wsemi.html#.arrFilterByPnum">arrFilterByPnum</a></li><li data-type='method'><a href="wsemi.html#.arrFilterByPnumAndToLog">arrFilterByPnumAndToLog</a></li><li data-type='method'><a href="wsemi.html#.arrFind">arrFind</a></li><li data-type='method'><a href="wsemi.html#.arrGroupByMaxmin">arrGroupByMaxmin</a></li><li data-type='method'><a href="wsemi.html#.arrHas">arrHas</a></li><li data-type='method'><a href="wsemi.html#.arrInsert">arrInsert</a></li><li data-type='method'><a href="wsemi.html#.arrLookupByMaxmin">arrLookupByMaxmin</a></li><li data-type='method'><a href="wsemi.html#.arrMax">arrMax</a></li><li data-type='method'><a href="wsemi.html#.arrMin">arrMin</a></li><li data-type='method'><a href="wsemi.html#.arrMulti">arrMulti</a></li><li data-type='method'><a href="wsemi.html#.arrNorm">arrNorm</a></li><li data-type='method'><a href="wsemi.html#.arrProduct">arrProduct</a></li><li data-type='method'><a href="wsemi.html#.arrReduce">arrReduce</a></li><li data-type='method'><a href="wsemi.html#.arrSep">arrSep</a></li><li data-type='method'><a href="wsemi.html#.arrSort">arrSort</a></li><li data-type='method'><a href="wsemi.html#.asind">asind</a></li><li data-type='method'><a href="wsemi.html#.atan2d">atan2d</a></li><li data-type='method'><a href="wsemi.html#.atand">atand</a></li><li data-type='method'><a href="wsemi.html#.attstr">attstr</a></li><li data-type='method'><a href="wsemi.html#.b642obj">b642obj</a></li><li data-type='method'><a href="wsemi.html#.b642str">b642str</a></li><li data-type='method'><a href="wsemi.html#.b642u16arr">b642u16arr</a></li><li data-type='method'><a href="wsemi.html#.b642u8arr">b642u8arr</a></li><li data-type='method'><a href="wsemi.html#.binstr">binstr</a></li><li data-type='method'><a href="wsemi.html#.blob2ab">blob2ab</a></li><li data-type='method'><a href="wsemi.html#.blob2b64">blob2b64</a></li><li data-type='method'><a href="wsemi.html#.blob2str">blob2str</a></li><li data-type='method'><a href="wsemi.html#.blob2u8arr">blob2u8arr</a></li><li data-type='method'><a href="wsemi.html#.blobs2b64s">blobs2b64s</a></li><li data-type='method'><a href="wsemi.html#.blobs2u8arrs">blobs2u8arrs</a></li><li data-type='method'><a href="wsemi.html#.bodyLog">bodyLog</a></li><li data-type='method'><a href="wsemi.html#.browserView">browserView</a></li><li data-type='method'><a href="wsemi.html#.browserViewFromBlob">browserViewFromBlob</a></li><li data-type='method'><a href="wsemi.html#.browserViewFromText">browserViewFromText</a></li><li data-type='method'><a href="wsemi.html#.browserViewFromU8arr">browserViewFromU8arr</a></li><li data-type='method'><a href="wsemi.html#.bs2u8arr">bs2u8arr</a></li><li data-type='method'><a href="wsemi.html#.bufRead">bufRead</a></li><li data-type='method'><a href="wsemi.html#.bufReadDbl">bufReadDbl</a></li><li data-type='method'><a href="wsemi.html#.bufWrite">bufWrite</a></li><li data-type='method'><a href="wsemi.html#.bufWriteDbl">bufWriteDbl</a></li><li data-type='method'><a href="wsemi.html#.cache">cache</a></li><li data-type='method'><a href="wsemi.html#.cbol">cbol</a></li><li data-type='method'><a href="wsemi.html#.cdbl">cdbl</a></li><li data-type='method'><a href="wsemi.html#.cfilesize">cfilesize</a></li><li data-type='method'><a href="wsemi.html#.cfinancial">cfinancial</a></li><li data-type='method'><a href="wsemi.html#.cint">cint</a></li><li data-type='method'><a href="wsemi.html#.clearXSS">clearXSS</a></li><li data-type='method'><a href="wsemi.html#.color">color</a></li><li data-type='method'><a href="wsemi.html#.composeToTree">composeToTree</a></li><li data-type='method'><a href="wsemi.html#.convertToTree">convertToTree</a></li><li data-type='method'><a href="wsemi.html#.copyStrToClipboard">copyStrToClipboard</a></li><li data-type='method'><a href="wsemi.html#.cosd">cosd</a></li><li data-type='method'><a href="wsemi.html#.cotd">cotd</a></li><li data-type='method'><a href="wsemi.html#.createExcelWorkbook">createExcelWorkbook</a></li><li data-type='method'><a href="wsemi.html#.cscd">cscd</a></li><li data-type='method'><a href="wsemi.html#.cstr">cstr</a></li><li data-type='method'><a href="wsemi.html#.day2cht">day2cht</a></li><li data-type='method'><a href="wsemi.html#.debounce">debounce</a></li><li data-type='method'><a href="wsemi.html#.delay">delay</a></li><li data-type='method'><a href="wsemi.html#.dig">dig</a></li><li data-type='method'><a href="wsemi.html#.digExp">digExp</a></li><li data-type='method'><a href="wsemi.html#.domAlert">domAlert</a></li><li data-type='method'><a href="wsemi.html#.domAppend">domAppend</a></li><li data-type='method'><a href="wsemi.html#.domCancelEvent">domCancelEvent</a></li><li data-type='method'><a href="wsemi.html#.domCompareText">domCompareText</a></li><li data-type='method'><a href="wsemi.html#.domCompareTextDyn">domCompareTextDyn</a></li><li data-type='method'><a href="wsemi.html#.domConvertToPic">domConvertToPic</a></li><li data-type='method'><a href="wsemi.html#.domConvertToPicDyn">domConvertToPicDyn</a></li><li data-type='method'><a href="wsemi.html#.domDetect">domDetect</a></li><li data-type='method'><a href="wsemi.html#.domDrag">domDrag</a></li><li data-type='method'><a href="wsemi.html#.domDragBarAndScroll">domDragBarAndScroll</a></li><li data-type='method'><a href="wsemi.html#.domDragPreview">domDragPreview</a></li><li data-type='method'><a href="wsemi.html#.domDropFiles">domDropFiles</a></li><li data-type='method'><a href="wsemi.html#.domElementsFromPoint">domElementsFromPoint</a></li><li data-type='method'><a href="wsemi.html#.domFadeIn">domFadeIn</a></li><li data-type='method'><a href="wsemi.html#.domFadeOut">domFadeOut</a></li><li data-type='method'><a href="wsemi.html#.domFind">domFind</a></li><li data-type='method'><a href="wsemi.html#.domFinds">domFinds</a></li><li data-type='method'><a href="wsemi.html#.domGetAttr">domGetAttr</a></li><li data-type='method'><a href="wsemi.html#.domGetBoudRect">domGetBoudRect</a></li><li data-type='method'><a href="wsemi.html#.domGetBoudRectRefSelf">domGetBoudRectRefSelf</a></li><li data-type='method'><a href="wsemi.html#.domGetFileAccept">domGetFileAccept</a></li><li data-type='method'><a href="wsemi.html#.domGetFiles">domGetFiles</a></li><li data-type='method'><a href="wsemi.html#.domGetParents">domGetParents</a></li><li data-type='method'><a href="wsemi.html#.domGetPointFromEvent">domGetPointFromEvent</a></li><li data-type='method'><a href="wsemi.html#.domGetScrollableParent">domGetScrollableParent</a></li><li data-type='method'><a href="wsemi.html#.domGetWindowSize">domGetWindowSize</a></li><li data-type='method'><a href="wsemi.html#.domIsClientXYIn">domIsClientXYIn</a></li><li data-type='method'><a href="wsemi.html#.domIsFocused">domIsFocused</a></li><li data-type='method'><a href="wsemi.html#.domIsVisible">domIsVisible</a></li><li data-type='method'><a href="wsemi.html#.domPrepend">domPrepend</a></li><li data-type='method'><a href="wsemi.html#.domRemove">domRemove</a></li><li data-type='method'><a href="wsemi.html#.domRenderMarkdownMind">domRenderMarkdownMind</a></li><li data-type='method'><a href="wsemi.html#.domRenderMarkdownMindDyn">domRenderMarkdownMindDyn</a></li><li data-type='method'><a href="wsemi.html#.domRipple">domRipple</a></li><li data-type='method'><a href="wsemi.html#.domScrollIntoView">domScrollIntoView</a></li><li data-type='method'><a href="wsemi.html#.domScrollTo">domScrollTo</a></li><li data-type='method'><a href="wsemi.html#.domShowImages">domShowImages</a></li><li data-type='method'><a href="wsemi.html#.domShowImagesDyn">domShowImagesDyn</a></li><li data-type='method'><a href="wsemi.html#.domShowInputAndGetFiles">domShowInputAndGetFiles</a></li><li data-type='method'><a href="wsemi.html#.domShowInputAndGetFilesU8Arrs">domShowInputAndGetFilesU8Arrs</a></li><li data-type='method'><a href="wsemi.html#.domTooltip">domTooltip</a></li><li data-type='method'><a href="wsemi.html#.domTriggerEvent">domTriggerEvent</a></li><li data-type='method'><a href="wsemi.html#.domVirtualCreate">domVirtualCreate</a></li><li data-type='method'><a href="wsemi.html#.domVirtualCreateQueue">domVirtualCreateQueue</a></li><li data-type='method'><a href="wsemi.html#.downloadExcelFileFromData">downloadExcelFileFromData</a></li><li data-type='method'><a href="wsemi.html#.downloadExcelFileFromDataDyn">downloadExcelFileFromDataDyn</a></li><li data-type='method'><a href="wsemi.html#.downloadFileFromB64">downloadFileFromB64</a></li><li data-type='method'><a href="wsemi.html#.downloadFileFromBlob">downloadFileFromBlob</a></li><li data-type='method'><a href="wsemi.html#.downloadFileFromText">downloadFileFromText</a></li><li data-type='method'><a href="wsemi.html#.downloadFileFromU8Arr">downloadFileFromU8Arr</a></li><li data-type='method'><a href="wsemi.html#.dtmapping">dtmapping</a></li><li data-type='method'><a href="wsemi.html#.dtpick">dtpick</a></li><li data-type='method'><a href="wsemi.html#.evem">evem</a></li><li data-type='method'><a href="wsemi.html#.execProcess">execProcess</a></li><li data-type='method'><a href="wsemi.html#.execScript">execScript</a></li><li data-type='method'><a href="wsemi.html#.f2c">f2c</a></li><li data-type='method'><a href="wsemi.html#.filepathToTree">filepathToTree</a></li><li data-type='method'><a href="wsemi.html#.files2data">files2data</a></li><li data-type='method'><a href="wsemi.html#.flattenToConn">flattenToConn</a></li><li data-type='method'><a href="wsemi.html#.flattenTree">flattenTree</a></li><li data-type='method'><a href="wsemi.html#.fsCleanFolder">fsCleanFolder</a></li><li data-type='method'><a href="wsemi.html#.fsCopyFolder">fsCopyFolder</a></li><li data-type='method'><a href="wsemi.html#.fsCreateFile">fsCreateFile</a></li><li data-type='method'><a href="wsemi.html#.fsCreateFolder">fsCreateFolder</a></li><li data-type='method'><a href="wsemi.html#.fsDeleteFile">fsDeleteFile</a></li><li data-type='method'><a href="wsemi.html#.fsDeleteFolder">fsDeleteFolder</a></li><li data-type='method'><a href="wsemi.html#.fsEvem">fsEvem</a></li><li data-type='method'><a href="wsemi.html#.fsGetFilesInFolder">fsGetFilesInFolder</a></li><li data-type='method'><a href="wsemi.html#.fsGetFoldersInFolder">fsGetFoldersInFolder</a></li><li data-type='method'><a href="wsemi.html#.fsIsFile">fsIsFile</a></li><li data-type='method'><a href="wsemi.html#.fsIsFolder">fsIsFolder</a></li><li data-type='method'><a href="wsemi.html#.fsReadText">fsReadText</a></li><li data-type='method'><a href="wsemi.html#.fsRenameFile">fsRenameFile</a></li><li data-type='method'><a href="wsemi.html#.fsRenameFolder">fsRenameFolder</a></li><li data-type='method'><a href="wsemi.html#.fsTreeFolder">fsTreeFolder</a></li><li data-type='method'><a href="wsemi.html#.fsWatchFile">fsWatchFile</a></li><li data-type='method'><a href="wsemi.html#.fsWriteText">fsWriteText</a></li><li data-type='method'><a href="wsemi.html#.genGradientColor">genGradientColor</a></li><li data-type='method'><a href="wsemi.html#.genID">genID</a></li><li data-type='method'><a href="wsemi.html#.genPm">genPm</a></li><li data-type='method'><a href="wsemi.html#.getBufferSize">getBufferSize</a></li><li data-type='method'><a href="wsemi.html#.getClearPathName">getClearPathName</a></li><li data-type='method'><a href="wsemi.html#.getCsvStrFromData">getCsvStrFromData</a></li><li data-type='method'><a href="wsemi.html#.getDataFromExcelFileU8Arr">getDataFromExcelFileU8Arr</a></li><li data-type='method'><a href="wsemi.html#.getDataFromExcelFileU8ArrDyn">getDataFromExcelFileU8ArrDyn</a></li><li data-type='method'><a href="wsemi.html#.getDirName">getDirName</a></li><li data-type='method'><a href="wsemi.html#.getEnv">getEnv</a></li><li data-type='method'><a href="wsemi.html#.getExcelU8ArrFromData">getExcelU8ArrFromData</a></li><li data-type='method'><a href="wsemi.html#.getExcelU8ArrFromWorkbook">getExcelU8ArrFromWorkbook</a></li><li data-type='method'><a href="wsemi.html#.getExcelWorkbookFromData">getExcelWorkbookFromData</a></li><li data-type='method'><a href="wsemi.html#.getExcelWorkbookFromWorksheet">getExcelWorkbookFromWorksheet</a></li><li data-type='method'><a href="wsemi.html#.getExcelWorksheetFromData">getExcelWorksheetFromData</a></li><li data-type='method'><a href="wsemi.html#.getFileAccept">getFileAccept</a></li><li data-type='method'><a href="wsemi.html#.getFileName">getFileName</a></li><li data-type='method'><a href="wsemi.html#.getFileTrueName">getFileTrueName</a></li><li data-type='method'><a href="wsemi.html#.getGlobal">getGlobal</a></li><li data-type='method'><a href="wsemi.html#.getObjSize">getObjSize</a></li><li data-type='method'><a href="wsemi.html#.getTimeBetween">getTimeBetween</a></li><li data-type='method'><a href="wsemi.html#.getTimeFromUnit">getTimeFromUnit</a></li><li data-type='method'><a href="wsemi.html#.getTimeObject">getTimeObject</a></li><li data-type='method'><a href="wsemi.html#.getTimeRange">getTimeRange</a></li><li data-type='method'><a href="wsemi.html#.getUserAgent">getUserAgent</a></li><li data-type='method'><a href="wsemi.html#.getUserAgentDyn">getUserAgentDyn</a></li><li data-type='method'><a href="wsemi.html#.getltdtkeys">getltdtkeys</a></li><li data-type='method'><a href="wsemi.html#.haskey">haskey</a></li><li data-type='method'><a href="wsemi.html#.html2pic">html2pic</a></li><li data-type='method'><a href="wsemi.html#.html2picDyn">html2picDyn</a></li><li data-type='method'><a href="wsemi.html#.html2str">html2str</a></li><li data-type='method'><a href="wsemi.html#.html2strDyn">html2strDyn</a></li><li data-type='method'><a href="wsemi.html#.htmlDecode">htmlDecode</a></li><li data-type='method'><a href="wsemi.html#.htmlEncode">htmlEncode</a></li><li data-type='method'><a href="wsemi.html#.importResources">importResources</a></li><li data-type='method'><a href="wsemi.html#.interp1">interp1</a></li><li data-type='method'><a href="wsemi.html#.isDev">isDev</a></li><li data-type='method'><a href="wsemi.html#.isEle">isEle</a></li><li data-type='method'><a href="wsemi.html#.isEleExistByID">isEleExistByID</a></li><li data-type='method'><a href="wsemi.html#.isEmail">isEmail</a></li><li data-type='method'><a href="wsemi.html#.isIE">isIE</a></li><li data-type='method'><a href="wsemi.html#.isNarrow">isNarrow</a></li><li data-type='method'><a href="wsemi.html#.isStrHasCapital">isStrHasCapital</a></li><li data-type='method'><a href="wsemi.html#.isStrHasLowerCase">isStrHasLowerCase</a></li><li data-type='method'><a href="wsemi.html#.isStrHasNumber">isStrHasNumber</a></li><li data-type='method'><a href="wsemi.html#.isUserIdentify">isUserIdentify</a></li><li data-type='method'><a href="wsemi.html#.isUserName">isUserName</a></li><li data-type='method'><a href="wsemi.html#.isUserPW">isUserPW</a></li><li data-type='method'><a href="wsemi.html#.isWindow">isWindow</a></li><li data-type='method'><a href="wsemi.html#.isab">isab</a></li><li data-type='method'><a href="wsemi.html#.isarr">isarr</a></li><li data-type='method'><a href="wsemi.html#.isarr0">isarr0</a></li><li data-type='method'><a href="wsemi.html#.isblob">isblob</a></li><li data-type='method'><a href="wsemi.html#.isbol">isbol</a></li><li data-type='method'><a href="wsemi.html#.isday">isday</a></li><li data-type='method'><a href="wsemi.html#.isearr">isearr</a></li><li data-type='method'><a href="wsemi.html#.iseobj">iseobj</a></li><li data-type='method'><a href="wsemi.html#.iser">iser</a></li><li data-type='method'><a href="wsemi.html#.isernot">isernot</a></li><li data-type='method'><a href="wsemi.html#.isestr">isestr</a></li><li data-type='method'><a href="wsemi.html#.isfun">isfun</a></li><li data-type='method'><a href="wsemi.html#.isint">isint</a></li><li data-type='method'><a href="wsemi.html#.ismonth">ismonth</a></li><li data-type='method'><a href="wsemi.html#.isn0int">isn0int</a></li><li data-type='method'><a href="wsemi.html#.isn0num">isn0num</a></li><li data-type='method'><a href="wsemi.html#.isnbr">isnbr</a></li><li data-type='method'><a href="wsemi.html#.isnint">isnint</a></li><li data-type='method'><a href="wsemi.html#.isnnum">isnnum</a></li><li data-type='method'><a href="wsemi.html#.isnull">isnull</a></li><li data-type='method'><a href="wsemi.html#.isnum">isnum</a></li><li data-type='method'><a href="wsemi.html#.isobj">isobj</a></li><li data-type='method'><a href="wsemi.html#.isobj0">isobj0</a></li><li data-type='method'><a href="wsemi.html#.isp0int">isp0int</a></li><li data-type='method'><a href="wsemi.html#.isp0num">isp0num</a></li><li data-type='method'><a href="wsemi.html#.ispint">ispint</a></li><li data-type='method'><a href="wsemi.html#.ispm">ispm</a></li><li data-type='method'><a href="wsemi.html#.ispnum">ispnum</a></li><li data-type='method'><a href="wsemi.html#.isstr">isstr</a></li><li data-type='method'><a href="wsemi.html#.isstr0">isstr0</a></li><li data-type='method'><a href="wsemi.html#.istime">istime</a></li><li data-type='method'><a href="wsemi.html#.istimeTZ">istimeTZ</a></li><li data-type='method'><a href="wsemi.html#.istimems">istimems</a></li><li data-type='method'><a href="wsemi.html#.istimemsTZ">istimemsTZ</a></li><li data-type='method'><a href="wsemi.html#.isu16arr">isu16arr</a></li><li data-type='method'><a href="wsemi.html#.isu8arr">isu8arr</a></li><li data-type='method'><a href="wsemi.html#.isundefined">isundefined</a></li><li data-type='method'><a href="wsemi.html#.j2o">j2o</a></li><li data-type='method'><a href="wsemi.html#.keysmat2ltdt">keysmat2ltdt</a></li><li data-type='method'><a href="wsemi.html#.log">log</a></li><li data-type='method'><a href="wsemi.html#.ltdt2vrtsable">ltdt2vrtsable</a></li><li data-type='method'><a href="wsemi.html#.ltdtDiff">ltdtDiff</a></li><li data-type='method'><a href="wsemi.html#.ltdtDiffByKey">ltdtDiffByKey</a></li><li data-type='method'><a href="wsemi.html#.ltdtkeys2mat">ltdtkeys2mat</a></li><li data-type='method'><a href="wsemi.html#.ltdtkeysheads2mat">ltdtkeysheads2mat</a></li><li data-type='method'><a href="wsemi.html#.ltdtmapping">ltdtmapping</a></li><li data-type='method'><a href="wsemi.html#.ltdtmerge">ltdtmerge</a></li><li data-type='method'><a href="wsemi.html#.ltdtpick">ltdtpick</a></li><li data-type='method'><a href="wsemi.html#.ltdtpull">ltdtpull</a></li><li data-type='method'><a href="wsemi.html#.mat2ltdt">mat2ltdt</a></li><li data-type='method'><a href="wsemi.html#.matConcat">matConcat</a></li><li data-type='method'><a href="wsemi.html#.matDiff">matDiff</a></li><li data-type='method'><a href="wsemi.html#.matat">matat</a></li><li data-type='method'><a href="wsemi.html#.now2str">now2str</a></li><li data-type='method'><a href="wsemi.html#.now2strp">now2strp</a></li><li data-type='method'><a href="wsemi.html#.nowDay2str">nowDay2str</a></li><li data-type='method'><a href="wsemi.html#.nowms2str">nowms2str</a></li><li data-type='method'><a href="wsemi.html#.nowms2strp">nowms2strp</a></li><li data-type='method'><a href="wsemi.html#.o2j">o2j</a></li><li data-type='method'><a href="wsemi.html#.obj2b64">obj2b64</a></li><li data-type='method'><a href="wsemi.html#.obj2pb64">obj2pb64</a></li><li data-type='method'><a href="wsemi.html#.obj2str">obj2str</a></li><li data-type='method'><a href="wsemi.html#.obj2stru8arr">obj2stru8arr</a></li><li data-type='method'><a href="wsemi.html#.obj2u8arr">obj2u8arr</a></li><li data-type='method'><a href="wsemi.html#.objSortBy">objSortBy</a></li><li data-type='method'><a href="wsemi.html#.objSortByKeys">objSortByKeys</a></li><li data-type='method'><a href="wsemi.html#.ocr">ocr</a></li><li data-type='method'><a href="wsemi.html#.ocrDyn">ocrDyn</a></li><li data-type='method'><a href="wsemi.html#.oo">oo</a></li><li data-type='method'><a href="wsemi.html#.openLink">openLink</a></li><li data-type='method'><a href="wsemi.html#.pb642obj">pb642obj</a></li><li data-type='method'><a href="wsemi.html#.pmChain">pmChain</a></li><li data-type='method'><a href="wsemi.html#.pmConvertResolve">pmConvertResolve</a></li><li data-type='method'><a href="wsemi.html#.pmHook">pmHook</a></li><li data-type='method'><a href="wsemi.html#.pmHookReject">pmHookReject</a></li><li data-type='method'><a href="wsemi.html#.pmIni">pmIni</a></li><li data-type='method'><a href="wsemi.html#.pmInvResolve">pmInvResolve</a></li><li data-type='method'><a href="wsemi.html#.pmMap">pmMap</a></li><li data-type='method'><a href="wsemi.html#.pmQueue">pmQueue</a></li><li data-type='method'><a href="wsemi.html#.pmSeries">pmSeries</a></li><li data-type='method'><a href="wsemi.html#.pmThrottle">pmThrottle</a></li><li data-type='method'><a href="wsemi.html#.pseudoRandom">pseudoRandom</a></li><li data-type='method'><a href="wsemi.html#.pseudoRandomIntRange">pseudoRandomIntRange</a></li><li data-type='method'><a href="wsemi.html#.pseudoRandomRange">pseudoRandomRange</a></li><li data-type='method'><a href="wsemi.html#.queue">queue</a></li><li data-type='method'><a href="wsemi.html#.rang">rang</a></li><li data-type='method'><a href="wsemi.html#.rep">rep</a></li><li data-type='method'><a href="wsemi.html#.repObj">repObj</a></li><li data-type='method'><a href="wsemi.html#.replace">replace</a></li><li data-type='method'><a href="wsemi.html#.replaceObj">replaceObj</a></li><li data-type='method'><a href="wsemi.html#.replacePlus">replacePlus</a></li><li data-type='method'><a href="wsemi.html#.round">round</a></li><li data-type='method'><a href="wsemi.html#.secd">secd</a></li><li data-type='method'><a href="wsemi.html#.sep">sep</a></li><li data-type='method'><a href="wsemi.html#.sepInt">sepInt</a></li><li data-type='method'><a href="wsemi.html#.sind">sind</a></li><li data-type='method'><a href="wsemi.html#.split">split</a></li><li data-type='method'><a href="wsemi.html#.str2aes">str2aes</a></li><li data-type='method'><a href="wsemi.html#.str2b64">str2b64</a></li><li data-type='method'><a href="wsemi.html#.str2hint">str2hint</a></li><li data-type='method'><a href="wsemi.html#.str2md5">str2md5</a></li><li data-type='method'><a href="wsemi.html#.str2obj">str2obj</a></li><li data-type='method'><a href="wsemi.html#.str2sha512">str2sha512</a></li><li data-type='method'><a href="wsemi.html#.str2u8arr">str2u8arr</a></li><li data-type='method'><a href="wsemi.html#.strCompare">strCompare</a></li><li data-type='method'><a href="wsemi.html#.strDiff">strDiff</a></li><li data-type='method'><a href="wsemi.html#.strFindFuzz">strFindFuzz</a></li><li data-type='method'><a href="wsemi.html#.strFindFuzzDyn">strFindFuzzDyn</a></li><li data-type='method'><a href="wsemi.html#.strFindSimilar">strFindSimilar</a></li><li data-type='method'><a href="wsemi.html#.strdelleft">strdelleft</a></li><li data-type='method'><a href="wsemi.html#.strdelright">strdelright</a></li><li data-type='method'><a href="wsemi.html#.strleft">strleft</a></li><li data-type='method'><a href="wsemi.html#.strmid">strmid</a></li><li data-type='method'><a href="wsemi.html#.strright">strright</a></li><li data-type='method'><a href="wsemi.html#.stru8arr2obj">stru8arr2obj</a></li><li data-type='method'><a href="wsemi.html#.tand">tand</a></li><li data-type='method'><a href="wsemi.html#.time2day">time2day</a></li><li data-type='method'><a href="wsemi.html#.time2hour">time2hour</a></li><li data-type='method'><a href="wsemi.html#.time2min">time2min</a></li><li data-type='method'><a href="wsemi.html#.timeTZ2day">timeTZ2day</a></li><li data-type='method'><a href="wsemi.html#.timeTZ2expire">timeTZ2expire</a></li><li data-type='method'><a href="wsemi.html#.timeTZ2hour">timeTZ2hour</a></li><li data-type='method'><a href="wsemi.html#.timeTZ2min">timeTZ2min</a></li><li data-type='method'><a href="wsemi.html#.timeTZ2past">timeTZ2past</a></li><li data-type='method'><a href="wsemi.html#.timems2day">timems2day</a></li><li data-type='method'><a href="wsemi.html#.timems2hour">timems2hour</a></li><li data-type='method'><a href="wsemi.html#.timems2min">timems2min</a></li><li data-type='method'><a href="wsemi.html#.timems2time">timems2time</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2day">timemsTZ2day</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2expire">timemsTZ2expire</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2hour">timemsTZ2hour</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2min">timemsTZ2min</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2past">timemsTZ2past</a></li><li data-type='method'><a href="wsemi.html#.timemsTZ2time">timemsTZ2time</a></li><li data-type='method'><a href="wsemi.html#.treeObj">treeObj</a></li><li data-type='method'><a href="wsemi.html#.treeToFilepath">treeToFilepath</a></li><li data-type='method'><a href="wsemi.html#.trim">trim</a></li><li data-type='method'><a href="wsemi.html#.u16arr2b64">u16arr2b64</a></li><li data-type='method'><a href="wsemi.html#.u16arr2u8arr">u16arr2u8arr</a></li><li data-type='method'><a href="wsemi.html#.u8arr2ab">u8arr2ab</a></li><li data-type='method'><a href="wsemi.html#.u8arr2b64">u8arr2b64</a></li><li data-type='method'><a href="wsemi.html#.u8arr2blob">u8arr2blob</a></li><li data-type='method'><a href="wsemi.html#.u8arr2bs">u8arr2bs</a></li><li data-type='method'><a href="wsemi.html#.u8arr2obj">u8arr2obj</a></li><li data-type='method'><a href="wsemi.html#.u8arr2str">u8arr2str</a></li><li data-type='method'><a href="wsemi.html#.u8arr2u16arr">u8arr2u16arr</a></li><li data-type='method'><a href="wsemi.html#.urlParse">urlParse</a></li><li data-type='method'><a href="wsemi.html#.verifyValue">verifyValue</a></li><li data-type='method'><a href="wsemi.html#.waitFun">waitFun</a></li></ul></li></ul>
</nav>
<div id="main">
<h1 class="page-title">color.mjs</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>import trim from 'lodash/trim'
import get from 'lodash/get'
import map from 'lodash/map'
import each from 'lodash/each'
import size from 'lodash/size'
import keys from 'lodash/keys'
import round from 'lodash/round'
import sortBy from 'lodash/sortBy'
import toLower from 'lodash/toLower'
import toUpper from 'lodash/toUpper'
import isestr from './isestr.mjs'
import iseobj from './iseobj.mjs'
import isnum from './isnum.mjs'
import isarr from './isarr.mjs'
import isint from './isint.mjs'
import strleft from './strleft.mjs'
import strdelleft from './strdelleft.mjs'
import replace from './replace.mjs'
import sep from './sep.mjs'
import cdbl from './cdbl.mjs'
import cstr from './cstr.mjs'
import cint from './cint.mjs'
import haskey from './haskey.mjs'
import strmid from './strmid.mjs'
//svg-color
let kpColorNames = {
aliceblue: 'f0f8ff',
antiquewhite: 'faebd7',
aqua: '0ff',
aquamarine: '7fffd4',
azure: 'f0ffff',
beige: 'f5f5dc',
bisque: 'ffe4c4',
black: '000',
blanchedalmond: 'ffebcd',
blue: '00f',
blueviolet: '8a2be2',
brown: 'a52a2a',
burlywood: 'deb887',
burntsienna: 'ea7e5d',
cadetblue: '5f9ea0',
chartreuse: '7fff00',
chocolate: 'd2691e',
coral: 'ff7f50',
cornflowerblue: '6495ed',
cornsilk: 'fff8dc',
crimson: 'dc143c',
cyan: '0ff',
darkblue: '00008b',
darkcyan: '008b8b',
darkgoldenrod: 'b8860b',
darkgray: 'a9a9a9',
darkgreen: '006400',
darkgrey: 'a9a9a9',
darkkhaki: 'bdb76b',
darkmagenta: '8b008b',
darkolivegreen: '556b2f',
darkorange: 'ff8c00',
darkorchid: '9932cc',
darkred: '8b0000',
darksalmon: 'e9967a',
darkseagreen: '8fbc8f',
darkslateblue: '483d8b',
darkslategray: '2f4f4f',
darkslategrey: '2f4f4f',
darkturquoise: '00ced1',
darkviolet: '9400d3',
deeppink: 'ff1493',
deepskyblue: '00bfff',
dimgray: '696969',
dimgrey: '696969',
dodgerblue: '1e90ff',
firebrick: 'b22222',
floralwhite: 'fffaf0',
forestgreen: '228b22',
fuchsia: 'f0f',
gainsboro: 'dcdcdc',
ghostwhite: 'f8f8ff',
gold: 'ffd700',
goldenrod: 'daa520',
gray: '808080',
green: '008000',
greenyellow: 'adff2f',
grey: '808080',
honeydew: 'f0fff0',
hotpink: 'ff69b4',
indianred: 'cd5c5c',
indigo: '4b0082',
ivory: 'fffff0',
khaki: 'f0e68c',
lavender: 'e6e6fa',
lavenderblush: 'fff0f5',
lawngreen: '7cfc00',
lemonchiffon: 'fffacd',
lightblue: 'add8e6',
lightcoral: 'f08080',
lightcyan: 'e0ffff',
lightgoldenrodyellow: 'fafad2',
lightgray: 'd3d3d3',
lightgreen: '90ee90',
lightgrey: 'd3d3d3',
lightpink: 'ffb6c1',
lightsalmon: 'ffa07a',
lightseagreen: '20b2aa',
lightskyblue: '87cefa',
lightslategray: '789',
lightslategrey: '789',
lightsteelblue: 'b0c4de',
lightyellow: 'ffffe0',
lime: '0f0',
limegreen: '32cd32',
linen: 'faf0e6',
magenta: 'f0f',
maroon: '800000',
mediumaquamarine: '66cdaa',
mediumblue: '0000cd',
mediumorchid: 'ba55d3',
mediumpurple: '9370db',
mediumseagreen: '3cb371',
mediumslateblue: '7b68ee',
mediumspringgreen: '00fa9a',
mediumturquoise: '48d1cc',
mediumvioletred: 'c71585',
midnightblue: '191970',
mintcream: 'f5fffa',
mistyrose: 'ffe4e1',
moccasin: 'ffe4b5',
navajowhite: 'ffdead',
navy: '000080',
oldlace: 'fdf5e6',
olive: '808000',
olivedrab: '6b8e23',
orange: 'ffa500',
orangered: 'ff4500',
orchid: 'da70d6',
palegoldenrod: 'eee8aa',
palegreen: '98fb98',
paleturquoise: 'afeeee',
palevioletred: 'db7093',
papayawhip: 'ffefd5',
peachpuff: 'ffdab9',
peru: 'cd853f',
pink: 'ffc0cb',
plum: 'dda0dd',
powderblue: 'b0e0e6',
purple: '800080',
rebeccapurple: '663399',
red: 'f00',
rosybrown: 'bc8f8f',
royalblue: '4169e1',
saddlebrown: '8b4513',
salmon: 'fa8072',
sandybrown: 'f4a460',
seagreen: '2e8b57',
seashell: 'fff5ee',
sienna: 'a0522d',
silver: 'c0c0c0',
skyblue: '87ceeb',
slateblue: '6a5acd',
slategray: '708090',
slategrey: '708090',
snow: 'fffafa',
springgreen: '00ff7f',
steelblue: '4682b4',
tan: 'd2b48c',
teal: '008080',
thistle: 'd8bfd8',
tomato: 'ff6347',
turquoise: '40e0d0',
violet: 'ee82ee',
wheat: 'f5deb3',
white: 'fff',
whitesmoke: 'f5f5f5',
yellow: 'ff0',
yellowgreen: '9acd32'
}
function strIsHex(cc) {
if (strleft(cc, 1) !== '#') {
return false
}
let re1 = /[0-9A-Fa-f]{2}/g
let b1 = re1.test(cc)
if (b1) {
return true
}
let re2 = /[0-9A-Fa-f]{3}/g
let b2 = re2.test(cc)
if (b2) {
return true
}
let re3 = /[0-9A-Fa-f]{6}/g
let b3 = re3.test(cc)
if (b3) {
return true
}
let re4 = /[0-9A-Fa-f]{8}/g
let b4 = re4.test(cc)
if (b4) {
return true
}
return false
}
function strIsName(cc) {
return haskey(kpColorNames, cc)
}
function strIsRgba(cc) {
return strleft(cc, 3) === 'rgb' || strleft(cc, 4) === 'rgba'
}
function strIsHsla(cc) {
return strleft(cc, 3) === 'hsl' || strleft(cc, 4) === 'hsla'
}
function strIsHsva(cc) {
return strleft(cc, 3) === 'hsv' || strleft(cc, 4) === 'hsva'
}
function name2hex(key) {
let hex = kpColorNames[key]
return `#${hex}`
}
function strCvFrom01AndPercent(cc) {
return strCvFromPercent(cc, 1)
}
function strCvFrom0255AndPercent(cc) {
return strCvFromPercent(cc, 255)
}
function strCvFrom0360AndPercent(cc) {
return strCvFromPercent(cc, 360)
}
function strCvFromPercent(cc, defValue = 1) {
if (cc.indexOf('%') >= 0) {
cc = replace(cc, '%', '')
if (!isnum(cc)) {
throw new Error('invalid color: value is not a number')
}
cc = cdbl(cc) / 100 //百分比值0~100, 轉0~1分佈
}
else {
if (!isnum(cc)) {
throw new Error('invalid color: value is not a number')
}
cc = cdbl(cc) / defValue //基於defValue轉0~1分佈
}
if (cc > 1) {
throw new Error('invalid color: value > 1')
}
else if (cc < 0) {
throw new Error('invalid color: value < 0')
}
return cc //回傳0~1
}
function strCvFrom01(cc) {
if (!isnum(cc)) {
throw new Error('invalid color: value is not a number')
}
cc = cdbl(cc)
if (cc > 1) {
throw new Error('invalid color: value > 1')
}
else if (cc < 0) {
throw new Error('invalid color: value < 0')
}
return cc //回傳0~1
}
function strExtract4(arr, tar = 'rgba') {
if (!isarr(arr)) {
throw new Error('invalid colors array')
}
let v0 = get(arr, 0, 0)
let v1 = get(arr, 1, 0)
let v2 = get(arr, 2, 0)
let v3 = get(arr, 3, 1) //alpha無則預設給1
tar = tar.split('')
if (size(tar) !== 4) {
throw new Error('tar.length !== 4')
}
let t0 = get(tar, 0)
let t1 = get(tar, 1)
let t2 = get(tar, 2)
let t3 = get(tar, 3)
return {
[t0]: v0,
[t1]: v1,
[t2]: v2,
[t3]: v3,
}
}
function strParseHex8(cc) {
cc = strdelleft(cc, 1) //刪除#
let n = size(cc)
if (n === 2) {
cc = `${cc}${cc}${cc}ff`
}
else if (n === 3) {
let c0 = strmid(cc, 0, 1)
let c1 = strmid(cc, 1, 1)
let c2 = strmid(cc, 2, 1)
cc = `${c0}${c0}${c1}${c1}${c2}${c2}ff`
}
else if (n === 6) {
cc = `${cc}ff`
}
else if (n === 8) {
//hex含alpha
}
else {
throw new Error('invalid hex color')
}
function gvhex(c) {
if (size(c) !== 2) {
throw new Error('hex.length of color is not equal to 2')
}
c = parseInt(c, 16)
if (!isnum(c)) {
throw new Error('invalid hex of color')
}
c = cdbl(c)
return c / 255 //回傳0~1
}
let r = gvhex(strmid(cc, 0, 2))
let g = gvhex(strmid(cc, 2, 2))
let b = gvhex(strmid(cc, 4, 2))
let a = gvhex(strmid(cc, 6, 2))
return {
r, g, b, a
}
}
function strParseRgba(cc) {
//string: rgb (255, 0, 0)
//string: rgb (255 200 30)
//string: rgb (50%, 12%, 8%)
//string: rgb (50% 12% 8%)
//string: rgb 255, 0, 0
//string: rgb 255 200 30
//string: rgb 50%, 12%, 8%
//string: rgb 50% 12% 8%
//string: rgba (255, 0, 0, 0.1)
//string: rgba (255 200 30 0.1)
//string: rgba (50%, 12%, 8%, 0.1)
//string: rgba (50% 12% 8% 0.1)
//string: rgba 255, 0, 0, 0.1
//string: rgba 255 200 30 0.1
//string: rgba 50%, 12%, 8%, 0.1
//string: rgba 50% 12% 8% 0.1
cc = replace(cc, 'rgba', '') //要先取代, 否則先取待rgb會剩下a而出錯
cc = replace(cc, 'rgb', '')
cc = cc.replace(/[()]/g, '')
cc = replace(cc, ',', ' ')
let s = sep(cc, ' ')
return strParseRgbaCore(s)
}
function strParseRgbaCore(s) {
s = map(s, (v, k) => {
if (k <= 2) {
return strCvFrom0255AndPercent(v)
}
else if (k === 3) {
return strCvFrom01(v)
}
return null
})
s = strExtract4(s, 'rgba')
return s
}
function strParseHsla(cc) {
//string: hsl (320, 100%, 50%)
//string: hsl (320 100% 50%)
//string: hsl (320, 1, 0.5)
//string: hsl (320 1 0.5)
//string: hsl 320, 100%, 50%
//string: hsl 320 100% 50%
//string: hsl 320, 1, 0.5
//string: hsl 320 1 0.5
//string: hsla (320, 100%, 50%, 0.1)
//string: hsla (320 100% 50% 0.1)
//string: hsla (320, 1, 0.5, 0.1)
//string: hsla (320 1 0.5 0.1)
//string: hsla 320, 100%, 50%, 0.1
//string: hsla 320 100% 50% 0.1
//string: hsla 320, 1, 0.5, 0.1
//string: hsla 320 1 0.5 0.1
cc = replace(cc, 'hsla', '')
cc = replace(cc, 'hsl', '')
cc = cc.replace(/[()]/g, '')
cc = replace(cc, ',', ' ')
let s = sep(cc, ' ')
return strParseHslaCore(s)
}
function strParseHslaCore(s) {
s = map(s, (v, k) => {
if (k === 0) {
return strCvFrom0360AndPercent(v)
}
else if (k === 1 || k === 2) {
return strCvFrom01AndPercent(v)
}
else if (k === 3) {
return strCvFrom01(v)
}
return null
})
s = strExtract4(s, 'hsla')
s = hsla2Rgba(s)
return s
}
function strParseHsva(cc) {
//string: hsv (320, 100%, 50%)
//string: hsv (320 100% 50%)
//string: hsv (320, 1, 0.5)
//string: hsv (320 1 0.5)
//string: hsv 320, 100%, 50%
//string: hsv 320 100% 50%
//string: hsv 320, 1, 0.5
//string: hsv 320 1 0.5
//string: hsva (320, 100%, 50%, 0.1)
//string: hsva (320 100% 50% 0.1)
//string: hsva (320, 1, 0.5, 0.1)
//string: hsva (320 1 0.5 0.1)
//string: hsva 320, 100%, 50%, 0.1
//string: hsva 320 100% 50% 0.1
//string: hsva 320, 1, 0.5, 0.1
//string: hsva 320 1 0.5 0.1
cc = replace(cc, 'hsva', '')
cc = replace(cc, 'hsv', '')
cc = cc.replace(/[()]/g, '')
cc = replace(cc, ',', ' ')
let s = sep(cc, ' ')
return strParseHsvaCore(s)
}
function strParseHsvaCore(s) {
s = map(s, (v, k) => {
if (k === 0) {
return strCvFrom0360AndPercent(v)
}
else if (k === 1 || k === 2) {
return strCvFrom01AndPercent(v)
}
else if (k === 3) {
return strCvFrom01(v)
}
return null
})
s = strExtract4(s, 'hsva')
s = hsva2Rgba(s)
return s
}
function parseString(cc) {
if (cc === 'transparent') {
return { r: 0, g: 0, b: 0, a: 0 }
}
if (strIsName(cc)) {
cc = name2hex(cc) //轉成hex
return strParseHex8(cc)
}
else if (strIsHex(cc)) {
return strParseHex8(cc)
}
else if (strIsRgba(cc)) {
return strParseRgba(cc)
}
else if (strIsHsla(cc)) {
return strParseHsla(cc)
}
else if (strIsHsva(cc)) {
return strParseHsva(cc)
}
throw new Error('format of color string is not hex-color, name-color, rgba, hsla, hsva')
}
function objHaskey(o, key) {
key = toLower(key)
let b1 = haskey(o, key)
if (b1) {
return true
}
key = toUpper(key)
let b2 = haskey(o, key)
if (b2) {
return true
}
return false
}
function objIsRgba(co) {
let b0 = objHaskey(co, 'r')
let b1 = objHaskey(co, 'g')
let b2 = objHaskey(co, 'b')
return b0 && b1 && b2
}
function objIsHsla(co) {
let b0 = objHaskey(co, 'h')
let b1 = objHaskey(co, 's')
let b2 = objHaskey(co, 'l')
return b0 && b1 && b2
}
function objIsHsva(co) {
let b0 = objHaskey(co, 'h')
let b1 = objHaskey(co, 's')
let b2 = objHaskey(co, 'v')
return b0 && b1 && b2
}
function objGet(o, key, def) {
let v
v = get(o, key, null)
if (v !== null) {
return v
}
key = toUpper(key)
v = get(o, key, null)
if (v !== null) {
return v
}
return def
}
function objParseRgba(co) {
//object: { r: 255, g: 150, b: 50 }
//object: { r: '50%', g: 150, b: 50 }
//object: { r: '50%', g: '12%', b: '8%' }
//object: { r: 255, g: 150, b: 50, a: 0.1 }
//object: { r: '50%', g: 150, b: 50, a: 0.1 }
//object: { r: '50%', g: '12%', b: '8%', a: 0.1 }
let s0 = objGet(co, 'r', null)
let s1 = objGet(co, 'g', null)
let s2 = objGet(co, 'b', null)
let s3 = objGet(co, 'a', 1) //alpha若無預設為1
let s = [s0, s1, s2, s3]
s = map(s, cstr)
return strParseRgbaCore(s)
}
function objParseHsla(co) {
//object: { h: 320, s: 0.2, l: 0.15 }
//object: { h: 320, s: '12%', l: '8%' }
//object: { h: '50%', s: 0.2, l: 0.15 }
//object: { h: '50%', s: '12%', l: '8%' }
//object: { h: 320, s: 0.2, l: 0.15, a: 0.1 }
//object: { h: 320, s: '12%', l: '8%', a: 0.1 }
//object: { h: '50%', s: 0.2, l: 0.15, a: 0.1 }
//object: { h: '50%', s: '12%', l: '8%', a: 0.1 }
let s0 = objGet(co, 'h', null)
let s1 = objGet(co, 's', null)
let s2 = objGet(co, 'l', null)
let s3 = objGet(co, 'a', 1) //alpha若無預設為1
let s = [s0, s1, s2, s3]
s = map(s, cstr)
return strParseHslaCore(s)
}
function objParseHsva(co) {
//object: { h: 320, s: 0.2, v: 0.15 }
//object: { h: 320, s: '12%', v: '8%' }
//object: { h: '50%', s: 0.2, v: 0.15 }
//object: { h: '50%', s: '12%', v: '8%' }
//object: { h: 320, s: 0.2, v: 0.15, a: 0.1 }
//object: { h: 320, s: '12%', v: '8%', a: 0.1 }
//object: { h: '50%', s: 0.2, v: 0.15, a: 0.1 }
//object: { h: '50%', s: '12%', v: '8%', a: 0.1 }
let s0 = objGet(co, 'h', null)
let s1 = objGet(co, 's', null)
let s2 = objGet(co, 'v', null)
let s3 = objGet(co, 'a', 1) //alpha若無預設為1
let s = [s0, s1, s2, s3]
s = map(s, cstr)
return strParseHsvaCore(s)
}
function parseObject(co) {
if (objIsRgba(co)) {
return objParseRgba(co)
}
else if (objIsHsla(co)) {
return objParseHsla(co)
}
else if (objIsHsva(co)) {
return objParseHsva(co)
}
else {
throw new Error('color object is not one of rgba, hsla, hsva')
}
}
function getBrightness(rgba) {
//Brightness, 亮度
//http://www.w3.org/TR/AERT#color-contrast
//r,g,b都0~1, 回傳0~1
if (rgba.a !== 1) {
throw new Error('alpha of color can not be equal to 1')
}
return (rgba.r * 299 + rgba.g * 587 + rgba.b * 114) / 1000
}
function getLuminance(rgba) {
//Luminance, 亮度(輝度)
//https://zh.wikipedia.org/wiki/%E4%BA%AE%E5%BA%A6
//http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
//r,g,b都0~1, 回傳0~1
if (rgba.a !== 1) {
throw new Error('alpha of color can not be equal to 1')
}
let r01 = rgba.r
let g01 = rgba.g
let b01 = rgba.b
let R
let G
let B
if (r01 <= 0.03928) {
R = r01 / 12.92
}
else {
R = Math.pow(((r01 + 0.055) / 1.055), 2.4)
}
if (g01 <= 0.03928) {
G = g01 / 12.92
}
else {
G = Math.pow(((g01 + 0.055) / 1.055), 2.4)
}
if (b01 <= 0.03928) {
B = b01 / 12.92
}
else {
B = Math.pow(((b01 + 0.055) / 1.055), 2.4)
}
return (0.2126 * R) + (0.7152 * G) + (0.0722 * B)
}
function rgba2Hsla(rgba) {
//https://gist.github.com/mjackson/5311256
//r,g,b,a都0~1, 回傳h,s,l,a都0~1
let r = rgba.r
let g = rgba.g
let b = rgba.b
let max = Math.max(r, g, b)
let min = Math.min(r, g, b)
let h
let s
let l = (max + min) / 2
if (max === min) {
h = s = 0 // achromatic
}
else {
let d = max - min
s = l > 0.5 ? d / (2 - max - min) : d / (max + min)
switch (max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break
case g: h = (b - r) / d + 2; break
case b: h = (r - g) / d + 4; break
}
h /= 6
}
return { h, s, l, a: rgba.a }
}
function rgba2Hsva(rgba) {
//https://gist.github.com/mjackson/5311256
//r,g,b,a都0~1, 回傳h,s,v,a都0~1
let r = rgba.r
let g = rgba.g
let b = rgba.b
let max = Math.max(r, g, b)
let min = Math.min(r, g, b)
let h
let s
let v = max
let d = max - min
s = max === 0 ? 0 : d / max
if (max === min) {
h = 0 // achromatic
}
else {
switch (max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break
case g: h = (b - r) / d + 2; break
case b: h = (r - g) / d + 4; break
}
h /= 6
}
return { h, s, v, a: rgba.a }
}
function hsla2Rgba(hsla) {
//https://gist.github.com/mjackson/5311256
//h,s,l,a都0~1, 回傳r,g,b,a都0~1
let h = hsla.h
let s = hsla.s
let l = hsla.l
let r
let g
let b
function hue2rgb(p, q, t) {
if (t < 0) t += 1
if (t > 1) t -= 1
if (t < 1 / 6) return p + (q - p) * 6 * t
if (t < 1 / 2) return q
if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6
return p
}
if (s === 0) {
r = g = b = l // achromatic
}
else {
let q = l < 0.5 ? l * (1 + s) : l + s - l * s
let p = 2 * l - q
r = hue2rgb(p, q, h + 1 / 3)
g = hue2rgb(p, q, h)
b = hue2rgb(p, q, h - 1 / 3)
}
return { r, g, b, a: hsla.a }
}
function hsva2Rgba(hsva) {
//https://gist.github.com/mjackson/5311256
//h,s,v都0~1, 回傳r,g,b都0~1
let h = hsva.h
let s = hsva.s
let v = hsva.v
let r
let g
let b
let i = Math.floor(h * 6)
let f = h * 6 - i
let p = v * (1 - s)
let q = v * (1 - f * s)
let t = v * (1 - (1 - f) * s)
switch (i % 6) {
case 0:
r = v
g = t
b = p
break
case 1: r = q
g = v
b = p
break
case 2: r = p
g = v
b = t
break
case 3: r = p
g = q
b = v
break
case 4: r = t
g = p
b = v
break
case 5: r = v
g = p
b = q
break
}
return { r, g, b, a: hsva.a }
}
function value2Hex(v) {
//輸入0~1轉出hex
let hex = Math.round(v * 255).toString(16)
if (size(hex) === 1) {
return `0${hex}`
}
else if (size(hex) === 2) {
return hex
}
else {
throw new Error('invalid value')
}
}
function rgba2Hex(rgba) {
return rgba2Hex8(rgba, false)
}
function rgba2Hex8(rgba, useLen8 = true) {
//r,g,b,a都0~1, 回傳hex或hex8
let r = rgba.r
let g = rgba.g
let b = rgba.b
let a = rgba.a
let hex8 = `${value2Hex(r)}${value2Hex(g)}${value2Hex(b)}`
if (useLen8) {
hex8 = `${hex8}${value2Hex(a)}`
}
return hex8
}
function maxmin(v) {
return Math.min(1, Math.max(0, v))
}
function fmtColor(rgba, fmtOutput) {
if (!isestr(fmtOutput)) {
throw new Error('fmtOutput is not a string')
}
if (kpCv[fmtOutput]) {
rgba = kpCv[fmtOutput](rgba)
}
else {
console.log(`fmtOutput must be [${keys(kpCv)}]`)
throw new Error('invalid fmtOutput')
}
return rgba
}
function modSaturate(rgba, amount, fmtOutput = 'toRgbString') {
//調整飽和度, amount介於0~1
if (amount < 0 || amount > 1) {
throw new Error('amount < 0 or > 1')
}
let hsla = rgba2Hsla(rgba)
hsla.s += amount
hsla.s = maxmin(hsla.s)
let rt = hsla2Rgba(hsla)
return fmtColor(rt, fmtOutput)
}
function modGrey(rgba, fmtOutput = 'toRgbString') {
let hsla = rgba2Hsla(rgba)
hsla.s = 0
let rt = hsla2Rgba(hsla)
return fmtColor(rt, fmtOutput)
}
function modLighten(rgba, amount, fmtOutput = 'toRgbString') {
//調整亮度, amount介於0~1
if (amount < 0 || amount > 1) {
throw new Error('amount < 0 or > 1')
}
let hsla = rgba2Hsla(rgba)
hsla.l += amount
hsla.l = maxmin(hsla.l)
let rt = hsla2Rgba(hsla)
return fmtColor(rt, fmtOutput)
}
function modBrighten(rgba, amount, fmtOutput = 'toRgbString') {
//調整亮度, amount介於0~1
if (amount < 0 || amount > 1) {
throw new Error('amount < 0 or > 1')
}
rgba.r += amount
rgba.r = maxmin(rgba.r)
rgba.g += amount
rgba.g = maxmin(rgba.g)
rgba.b += amount
rgba.b = maxmin(rgba.b)
let rt = rgba
return fmtColor(rt, fmtOutput)
}
function modHue(rgba, amount, fmtOutput = 'toRgbString') {
//調整色相, amount介於0~1