-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.js
134 lines (123 loc) · 4.39 KB
/
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
const { alert, error } = require('./lib/dialogs.js')
const DEPRECATED_COLORS = ['#616161']
// interface LintResult {
// objectName: string
// objectType: string
// resultItems: {
// lintType: 'fill', 'stroke' // maybe more in future...?
// detail: string
// }[]
// }
/**
* 非推奨の色を探します
* @param {*} selection
* @param {*} documentRoot
*/
async function searchDeprecatedColors (selection, documentRoot) {
// アートボードごとに探していきたいので、アートボードを1つ以上しない場合は動かない
if (!selection.hasArtboards) {
await error('アートボードを1つ以上選択してください')
return
}
// アートボードごとに探していく
for(let i = 0; i < selection.items.length; i++) {
const result = digChildNode(selection.items[i])
if (result.length > 0) {
const messages = [];
let count = 0
let isResultMoreThanThree = false
result.forEach(r => {
count ++
if (count >= 3) {
isResultMoreThanThree = true
return
}
messages.push(createErrorMessage(r))
})
if (isResultMoreThanThree) { messages.push(`その他${count - 3}件の問題は省略されました。\n最初に表示されている問題を解決してください。`) }
await alert(`アートボード「${selection.items[i].name}」に以下の問題が見つかりました。`, messages)
} else {
await alert(`アートボード「${selection.items[i].name}」問題は見つかりませんでした。`)
}
}
}
function digChildNode (sceneNode) {
let errors = []
sceneNode.children.forEach((childNode, i) => {
const result = {
objectName: childNode.name,
objectType: childNode.constructor.name,
resultItems: []
}
// 塗り色に非推奨の色が使われていないかチェック
if (childNode.fill && childNode.fill.toHex && childNode.fillEnabled) {
DEPRECATED_COLORS.forEach(color => {
if (color === childNode.fill.toHex(true)) {
result.resultItems.push({
lintType: 'fill',
detail: color
})
}
})
}
// 境界線色に非推奨の色が使われていないかチェック
if (childNode.stroke && childNode.strokeEnabled) {
DEPRECATED_COLORS.forEach(color => {
if (color === childNode.stroke.toHex(true)) {
result.resultItems.push({
lintType: 'stroke',
detail: color
})
}
})
}
if (childNode.children.length > 0) {
const childResult = digChildNode(childNode)
errors = errors.concat(childResult)
}
if (result.resultItems.length > 0) {
errors.push(result)
}
})
return errors
}
/**
* オブジェクトの名前をユーザーにわかりやすいように変換します
* @param {*} string
*/
function translate (objectType) {
// オブジェクトの名称
// https://adobexdplatform.com/plugin-docs/reference/scenegraph.html
if (objectType === 'Group') { return 'グループ' }
if (objectType === 'Rectangle') { return '長方形' }
if (objectType === 'Artboard') { return 'アートボード' }
if (objectType === 'Ellipse') { return '円' }
if (objectType === 'Line') { return '線' }
if (objectType === 'Path') { return 'パス' }
if (objectType === 'BooleanGroup') { return 'Boolean Group' }
if (objectType === 'Text') { return 'テキスト' }
if (objectType === 'SymbolInstance') { return 'シンボル' }
if (objectType === 'RepeatGrid') { return 'リピートグリッド' }
if (objectType === 'LinkedGraphic') { return 'Linked Graphic' }
// GraphicNodeのプロパティ
// https://adobexdplatform.com/plugin-docs/reference/scenegraph.html#graphicnode
if (objectType === 'fill') { return '塗り色' }
if (objectType === 'stroke') { return '境界線色' }
return objectType
}
/**
* Lintエラーをもとにエラーダイアログ用のメッセージを作成する
* @param {*} LintResult
*/
function createErrorMessage (lintResult) {
let message = []
message.push(`# ${translate(lintResult.objectType)}`)
message.push(`## ${lintResult.objectName}`)
lintResult.resultItems.forEach(item => {
message.push(`* ${translate(item.lintType)}に ${item.detail} が使われています。`)
})
return message
}
module.exports.commands = {
searchDeprecatedColors: searchDeprecatedColors
}