wsemi
Version:
A support package for web developer.
734 lines (596 loc) • 14 kB
JavaScript
import trim from 'lodash/trim'
import uniq from 'lodash/uniq'
import get from 'lodash/get'
import size from 'lodash/size'
import each from 'lodash/each'
import filter from 'lodash/filter'
import join from 'lodash/join'
import sep from './sep.mjs'
import isearr from './isearr.mjs'
import isestr from './isestr.mjs'
function sepItems(composItems) {
//check
if (!isestr(composItems)) {
return []
}
//arrItems
let arrItems = sep(composItems, ';')
//uniq
arrItems = uniq(arrItems)
return arrItems
}
function joinItems(arrItems) {
//check
if (!isearr(arrItems)) {
return ''
}
//uniq
arrItems = uniq(arrItems)
//str
let str = join(arrItems, ';')
return str
}
function atItemsMergeS1(its) {
//filter
its = filter(its, isestr)
//uniq
its = uniq(its)
return joinItems(its)
}
function atItemsMergeS2(its) {
//itsTemp
let itsTemp = []
each(its, (v) => {
let table = get(v, 'table', '')
let id = get(v, 'id', '')
if (trim(table) === '') {
console.log('atItemsMergeS2: invalid table in its', v, its)
}
else if (trim(id) === '') {
console.log('atItemsMergeS2: invalid id in its', v, its)
}
else {
itsTemp.push(`${table}@${id}`)
}
})
//itsTemp
its = joinItems(itsTemp)
return its
}
function atParseS1(composItems) {
//check
if (!isestr(composItems)) {
return []
}
//arrItems
let arrItems = sepItems(composItems)
//ids
let ids = filter(arrItems, isestr)
return ids
}
function atParseS2(composItems) {
//check
if (!isestr(composItems)) {
return []
}
//arrItems
let arrItems = sepItems(composItems)
//ids
let ids = []
each(arrItems, (v) => {
let s = sep(v, '@')
let table = get(s, 0, '')
let id = get(s, 1, '')
if (table === '') {
console.log('atParseS2: invalid table in composItems', v, composItems)
}
else if (id === '') {
console.log('atParseS2: invalid id in composItems', v, composItems)
}
else {
ids.push({
item: v,
table,
id,
})
}
})
return ids
}
function atParse(composItems, opt = {}) {
//check
if (!isestr(composItems)) {
return []
}
//mode
let mode = get(opt, 'mode')
if (mode !== '1p' && mode !== '2p') {
mode = 'auto'
}
//mode
if (mode === '1p') {
return atParseS1(composItems)
}
else if (mode === '2p') {
return atParseS2(composItems)
}
//indexOf
let bc = composItems.indexOf('@') >= 0
if (bc) {
return atParseS2(composItems)
}
return atParseS1(composItems)
}
function atCombineS1(composItems1, composItems2) {
//atParseS1
let itp1 = atParseS1(composItems1)
let itp2 = atParseS1(composItems2)
//its
let its = [...itp1, ...itp2]
//check
if (size(its) === 0) {
return ''
}
return atItemsMergeS1(its)
}
function atCombineS2(composItems1, composItems2) {
//atParseS2
let itp1 = atParseS2(composItems1)
let itp2 = atParseS2(composItems2)
//its
let its = [...itp1, ...itp2]
//check
if (size(its) === 0) {
return ''
}
return atItemsMergeS2(its)
}
function atCombine(composItems1, composItems2, opt = {}) {
//mode
let mode = get(opt, 'mode')
if (mode !== '1p' && mode !== '2p') {
mode = 'auto'
}
//indexOf
let bc1 = composItems1.indexOf('@') >= 0
let bc2 = composItems2.indexOf('@') >= 0
//mode
if (mode === '1p') {
atCombineS1(composItems1, composItems2)
}
else if (mode === '2p') {
return atCombineS2(composItems1, composItems2)
}
if (bc1 || bc2) {
return atCombineS2(composItems1, composItems2)
}
return atCombineS1(composItems1, composItems2)
}
function atItemsRemoveS1(its, removeItem) {
//check its
if (!isearr(its)) {
return ''
}
//check removeItem
if (!isestr(removeItem)) {
return atItemsMergeS1(its)
}
//filter
its = filter(its, (v) => {
return v !== removeItem
})
return atItemsMergeS1(its)
}
function atRemoveS1(composItems, removeId) {
//check composItems
if (!isestr(composItems)) {
return ''
}
//check removeId
if (!isestr(removeId)) {
return composItems
}
//atParseS1
let its = atParseS1(composItems)
//check
if (size(its) === 0) {
return ''
}
//atItemsRemoveS1
its = atItemsRemoveS1(its, removeId)
return its
}
function atItemsRemoveS2(its, removeItem) {
//check
if (!isearr(its)) {
return ''
}
//check removeId
if (!isestr(removeItem)) {
return atItemsMergeS2(its)
}
//removeId為純id, 則提取取後面純id出來
let s = sep(removeItem, '@')
let rmTable = get(s, 0, '')
let rmId = get(s, 1, '')
//check rmTable and rmId
if (!isestr(rmTable)) {
console.log('atItemsRemoveS2: table of removeItem is not an effective string', removeItem)
return ''
}
if (!isestr(rmId)) {
console.log('atItemsRemoveS2: id of removeItem is not an effective string', removeItem)
return ''
}
//filter
its = filter(its, (v) => {
return (v.table !== rmTable) && (v.id !== rmId)
})
return atItemsMergeS2(its)
}
function atRemoveS2(composItems, removeItem) {
//check composItems
if (!isestr(composItems)) {
return ''
}
//atParseS2
let its = atParseS2(composItems)
//check
if (size(its) === 0) {
return ''
}
//atItemsRemoveS2
let composItemsTemp = atItemsRemoveS2(its, removeItem)
return composItemsTemp
}
function atRemove(composItems, removeItemOrId, opt = {}) {
//check composItems
if (!isestr(composItems)) {
return ''
}
//check removeItemOrId
if (!isestr(removeItemOrId)) {
return composItems
}
//mode
let mode = get(opt, 'mode')
if (mode !== '1p' && mode !== '2p') {
mode = 'auto'
}
//mode
if (mode === '1p') {
return atRemoveS1(composItems, removeItemOrId)
}
else if (mode === '2p') {
return atRemoveS2(composItems, removeItemOrId)
}
//indexOf
let bc = composItems.indexOf('@') >= 0
let bt = removeItemOrId.indexOf('@') >= 0
if (bc && bt) {
return atRemoveS2(composItems, removeItemOrId)
}
return atRemoveS1(composItems, removeItemOrId)
}
function atItemsAddS1(its, addId) {
//check its
if (!isearr(its)) {
return ''
}
//check addId
if (!isestr(addId)) {
return atItemsMergeS1(its)
}
//push
if (its.indexOf(addId) < 0) {
its.push(addId)
}
return atItemsMergeS1(its)
}
function atAddS1(composItems, addId) {
//check composItems
if (!isestr(composItems)) {
return ''
}
//check addId
if (!isestr(addId)) {
return composItems
}
//atParseS1
let its = atParseS1(composItems)
//check
if (size(its) === 0) {
return ''
}
//atItemsAddS1
let composItemsTemp = atItemsAddS1(its, addId)
return composItemsTemp
}
function atItemsAddS2(its, addItem) {
//check
if (!isearr(its)) {
return ''
}
//addItem為純id, 則提取取後面純id出來
let s = sep(addItem, '@')
let addTable = get(s, 0, '')
let addId = get(s, 1, '')
//check addTable and addId
if (!isestr(addTable)) {
console.log('atItemsAddS2: table of addItem is not an effective string', addItem)
return ''
}
if (!isestr(addId)) {
console.log('atItemsAddS2: id of addItem is not an effective string', addItem)
return ''
}
//find
let b = false
each(its, (v) => {
if (v === addItem) {
b = true
return false //跳出
}
})
//push
if (!b) {
its.push({
table: addTable,
id: addId,
})
}
return atItemsMergeS2(its)
}
function atAddS2(composItems, addItem) {
//check composItems
if (!isestr(composItems)) {
return ''
}
//atParseS2
let its = atParseS2(composItems)
//check
if (size(its) === 0) {
return ''
}
//atItemsAddS2
let composItemsTemp = atItemsAddS2(its, addItem)
return composItemsTemp
}
function atAdd(composItems, addItemOrId, opt = {}) {
//check composItems
if (!isestr(composItems)) {
return ''
}
//check addItemOrId
if (!isestr(addItemOrId)) {
return composItems
}
//mode
let mode = get(opt, 'mode')
if (mode !== '1p' && mode !== '2p') {
mode = 'auto'
}
//mode
if (mode === '1p') {
return atAddS1(composItems, addItemOrId)
}
else if (mode === '2p') {
return atAddS2(composItems, addItemOrId)
}
//indexOf
let bc = composItems.indexOf('@') >= 0
let bt = addItemOrId.indexOf('@') >= 0
if (bc && bt) {
return atAddS2(composItems, addItemOrId)
}
return atAddS1(composItems, addItemOrId)
}
/**
* 屬性字串處理
*
* Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/attstr.test.mjs Github}
* @memberOf wsemi
* @returns {Object} 回傳attstr物件,提供parse、remove、add、combine等共4種處理函數
* @example
*
* import at from 'wsemi/src/attstr.mjs'
*
* let c
* let c1
* let c2
* let r
*
* //parse
* console.log('parse')
*
* c = 'abc123'
* r = at.parse(c)
* console.log(r)
* // => [ 'abc123' ]
*
* c = 'abc123;abc123'
* r = at.parse(c)
* console.log(r)
* // => [ 'abc123' ]
*
* c = 'abc123;def456'
* r = at.parse(c)
* console.log(r)
* // => [ 'abc123', 'def456' ]
*
* c = 'abc@123'
* r = at.parse(c)
* console.log(r)
* // => [ { item: 'abc@123', table: 'abc', id: '123' } ]
*
* c = 'abc@123;abc@123'
* r = at.parse(c)
* console.log(r)
* // => [ { item: 'abc@123', table: 'abc', id: '123' } ]
*
* c = 'abc@123;def@456'
* r = at.parse(c)
* console.log(r)
* // => [
* // { item: 'abc@123', table: 'abc', id: '123' },
* // { item: 'def@456', table: 'def', id: '456' }
* // ]
*
* //combine
* console.log('combine')
*
* c1 = 'abc123'
* c2 = 'def456'
* r = at.combine(c1, c2)
* console.log(r)
* // => abc123;def456
*
* c1 = 'abc123'
* c2 = 'def456;ghi789'
* r = at.combine(c1, c2)
* console.log(r)
* // => abc123;def456;ghi789
*
* c1 = 'abc123'
* c2 = 'abc123'
* r = at.combine(c1, c2)
* console.log(r)
* // => abc123
*
* c1 = 'abc123'
* c2 = 'abc123;def456'
* r = at.combine(c1, c2)
* console.log(r)
* // => abc123;def456
*
* c1 = 'abc@123'
* c2 = 'def@456'
* r = at.combine(c1, c2)
* console.log(r)
* // => abc@123;def@456
*
* c1 = 'abc@123'
* c2 = 'def@456;ghi@789'
* r = at.combine(c1, c2)
* console.log(r)
* // => abc@123;def@456;ghi@789
*
* c1 = 'abc@123'
* c2 = 'abc@123;def@456'
* r = at.combine(c1, c2)
* console.log(r)
* // => abc@123;def@456
*
* //remove
* console.log('remove')
*
* c1 = 'abc123'
* c2 = 'abc123'
* r = at.remove(c1, c2)
* console.log(r)
* // => ''
*
* c1 = 'abc123;def456'
* c2 = 'abc123'
* r = at.remove(c1, c2)
* console.log(r)
* // => def456
*
* c1 = 'abc123'
* c2 = 'def456'
* r = at.remove(c1, c2)
* console.log(r)
* // => abc123
*
* c1 = 'abc123;def456'
* c2 = 'ghi789;jkl012'
* r = at.remove(c1, c2)
* console.log(r)
* // => abc123;def456
*
* c1 = 'abc@123'
* c2 = 'abc@123'
* r = at.remove(c1, c2)
* console.log(r)
* // => ''
*
* c1 = 'abc@123;def@456'
* c2 = 'abc@123'
* r = at.remove(c1, c2)
* console.log(r)
* // => def@456
*
* c1 = 'abc@123'
* c2 = 'def@456'
* r = at.remove(c1, c2)
* console.log(r)
* // => abc@123
*
* c1 = 'abc@123;def@456'
* c2 = 'ghi@789;jkl@012'
* r = at.remove(c1, c2)
* console.log(r)
* // => abc@123;def@456
*
* //add
* console.log('add')
*
* c1 = 'abc123'
* c2 = 'abc123'
* r = at.add(c1, c2)
* console.log(r)
* // => abc123
*
* c1 = 'abc123;def456'
* c2 = 'abc123'
* r = at.add(c1, c2)
* console.log(r)
* // => abc123;def456
*
* c1 = 'abc123'
* c2 = 'def456'
* r = at.add(c1, c2)
* console.log(r)
* // => abc123;def456
*
* c1 = 'abc123;def456'
* c2 = 'ghi789;jkl012'
* r = at.add(c1, c2)
* console.log(r)
* // => abc123;def456;ghi789;jkl012
*
* c1 = 'abc@123'
* c2 = 'abc@123'
* r = at.add(c1, c2)
* console.log(r)
* // => abc@123
*
* c1 = 'abc@123;def@456'
* c2 = 'abc@123'
* r = at.add(c1, c2)
* console.log(r)
* // => abc@123;def@456
*
* c1 = 'abc@123'
* c2 = 'def@456'
* r = at.add(c1, c2)
* console.log(r)
* // => abc@123;def@456
*
* c1 = 'abc@123;def@456'
* c2 = 'ghi@789;jkl@012'
* r = at.add(c1, c2)
* console.log(r)
* // => abc@123;def@456;ghi@789;jkl@012
*
*/
function attstr() {
let at = {
parse: atParse,
remove: atRemove,
add: atAdd,
combine: atCombine,
}
return at
}
export default attstr()