妈的,这是我这辈子见过的最恶心的代码。

2016-12-01 02:50:10 +08:00
 wdhwg001

最近在修图,听说 Photoshop 可以用 JavaScript 写脚本,于是就去看了看怎么写,觉得自己作为一个前端,总不能看不懂代码吧。

目标是对选中的所有图层和组里的所有图层应用一个动作…需求很简单,也很常见吧。

查了一下代码,对特定的一个图层应用一个动作是这样的:

var doc = app.activeDocument;
doc.activeLayer = doc.artLayers.getByName("背景色");
app.doAction("foo", "foo_folder");

感觉已经没什么好害怕的了。但是发现这样只能选一个图层或者一个组,颇为不方便,要知道 PhotoShop 是可以同时选中多个图层的,而文档里也没有说明这个功能…

于是,在继续找下去的过程中,我看到了这玩意。

function getSelectedLayersIdx() {
  var selectedLayers = new Array;
  var ref = new ActionReference();
  ref.putEnumerated(charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
  var desc = executeActionGet(ref);
  if (desc.hasKey(stringIDToTypeID('targetLayers'))) {
    desc = desc.getList(stringIDToTypeID('targetLayers'));
    var c = desc.count
    var selectedLayers = new Array();
    for (var i = 0; i < c; i++) {
      try {
        activeDocument.backgroundLayer;
        selectedLayers.push(desc.getReference(i).getIndex());
      } catch (e) {
        selectedLayers.push(desc.getReference(i).getIndex() + 1);
      }
    }
  } else {
    var ref = new ActionReference();
    ref.putProperty(charIDToTypeID("Prpr"), charIDToTypeID("ItmI"));
    ref.putEnumerated(charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt"));
    try {
      activeDocument.backgroundLayer;
      selectedLayers.push(executeActionGet(ref).getInteger(charIDToTypeID("ItmI")) - 1);
    } catch (e) {
      selectedLayers.push(executeActionGet(ref).getInteger(charIDToTypeID("ItmI")));
    }
    var vis = app.activeDocument.activeLayer.visible;
    if (vis == true) app.activeDocument.activeLayer.visible = false;
    var desc9 = new ActionDescriptor();
    var list9 = new ActionList();
    var ref9 = new ActionReference();
    ref9.putEnumerated(charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
    list9.putReference(ref9);
    desc9.putList(charIDToTypeID('null'), list9);
    executeAction(charIDToTypeID('Shw '), desc9, DialogModes.NO);
    if (app.activeDocument.activeLayer.visible == false) selectedLayers.shift();
    app.activeDocument.activeLayer.visible = vis;
  }
  return selectedLayers;
};

………………

……………

…………

………

……

…那个,我盯着这堆玩意已经看了半个多小时了,有谁能看懂这堆玩意干了啥吗?

13659 次点击
所在节点    程序员
75 条回复
mhycy
2016-12-01 10:28:37 +08:00
http://gist.github.com/anonymous/b59e1de584e8f923a2c4e29eeb6b8143

重新格式化一下
除了命名略坑并不难懂
yanzixuan
2016-12-01 10:30:25 +08:00
搞不好是机器自动生成的代码。当年玩 FPGA 的时候看混淆过的 VERILOG 的路过。。。
jyf
2016-12-01 10:40:45 +08:00
这代码挺厚道的 已经把意图弄到命名上了 看变量名基本能看出来是在干啥
你要碰到那种 i p 变量满天飞的 那才真是生不如死呢

这个代码最大的问题只是没有把片段分离出来导致一个函数太长了 但是这只是 better 追求
shellcodecow
2016-12-01 10:40:55 +08:00
还好吧 除了命名以外..
hoythan
2016-12-01 10:42:45 +08:00
慢慢看下去逻辑还是很明显的
loryyang
2016-12-01 10:53:41 +08:00
这代码很难懂吗?我觉得这个代码已经质量不错了,函数、变量的命名相当规范,你试想一下里面的变量全部叫做 ab, c, xx, tmp, str 的时候,你是怎样的感觉?
BigDipper7
2016-12-01 11:09:13 +08:00
擦,看来我的承受能力还不错,我上次还看到用拼音做 annotation 的,还有什么变量名 abcd 的,你这个算是好的了好么, PS 我的也是没有文档的,啥也没有
zongwan
2016-12-01 11:19:20 +08:00
只能用 alert 调试 这点不太方便
api 官网是找的到文档的
可以下载别人写的 plugins 做参考 然后再使用
小动作 使用 fireworks 写脚本会更方便(不过这玩意过时了 被 adobe 抛弃了)
hector
2016-12-01 11:21:27 +08:00
我们 20 个程序员两年的项目,到现在没有一行注释,这算个啥
zongwan
2016-12-01 11:23:36 +08:00
sup
2016-12-01 11:25:47 +08:00
我懂你的苦
zongwan
2016-12-01 11:26:25 +08:00
kaifeii
2016-12-01 11:35:56 +08:00
见过业务逻辑全写到 sql 里,跑程序就是跑 sql 。……跨语言、跨平台性 MAX 。
j4fun
2016-12-01 11:40:54 +08:00
这就恶心啦?。。。还差的远那。。。我们有 C 写的各路回调( N 层),各种强制类型转换,各种名字一样,其实完全不同含义的形参。。各种一个函数上千行的代码。。你要来试试不 :)
mazyi
2016-12-01 11:59:56 +08:00
51 楼有文档???楼主的救星啊哈哈哈。
zhuangzhuang1988
2016-12-01 12:19:05 +08:00
这还恶心??
另外 ps 可以调试的
jason19659
2016-12-01 14:12:16 +08:00
```
function a(a) {
var f = 1 << a[27] | 1 << a[28] | 1 << a[29] | 1 << a[30] | 1 << a[31] | 1 << a[32] | 1 << a[33];
if (16 <= f) return ! 1;
if (2 == (f & 3) && 2 == a[0] * a[8] * a[9] * a[17] * a[18] * a[26] * a[27] * a[28] * a[29] * a[30] * a[31] * a[32] * a[33] || !(f & 10) && 7 == (2 == a[0]) + (2 == a[1]) + (2 == a[2]) + (2 == a[3]) + (2 == a[4]) + (2 == a[5]) + (2 == a[6]) + (2 == a[7]) + (2 == a[8]) + (2 == a[9]) + (2 == a[10]) + (2 == a[11]) + (2 == a[12]) + (2 == a[13]) + (2 == a[14]) + (2 == a[15]) + (2 == a[16]) + (2 == a[17]) + (2 == a[18]) + (2 == a[19]) + (2 == a[20]) + (2 == a[21]) + (2 == a[22]) + (2 == a[23]) + (2 == a[24]) + (2 == a[25]) + (2 == a[26]) + (2 == a[27]) + (2 == a[28]) + (2 == a[29]) + (2 == a[30]) + (2 == a[31]) + (2 == a[32]) + (2 == a[33])) return ! 0;
if (f & 2) return ! 1;
var q = a[0] + a[3] + a[6],
e = a[1] + a[4] + a[7],
n = a[9] + a[12] + a[15],
d = a[10] + a[13] + a[16],
r = a[18] + a[21] + a[24],
k = a[19] + a[22] + a[25],
p = (q + e + (a[2] + a[5] + a[8])) % 3;
if (1 == p) return ! 1;
var l = (n + d + (a[11] + a[14] + a[17])) % 3;
if (1 == l) return ! 1;
var s = (r + k + (a[20] + a[23] + a[26])) % 3;
if (1 == s || 1 != (2 == p) + (2 == l) + (2 == s) + (2 == a[27]) + (2 == a[28]) + (2 == a[29]) + (2 == a[30]) + (2 == a[31]) + (2 == a[32]) + (2 == a[33])) return ! 1;
q = (1 * q + 2 * e) % 3;
e = g(a, 0);
n = (1 * n + 2 * d) % 3;
d = g(a, 9);
r = (1 * r + 2 * k) % 3;
a = g(a, 18);
var sb = f & 4 ? !(p | q | l | n | s | r) && c(e) && c(d) && c(a) : 2 == p ? !(l | n | s | r) && c(d) && c(a) && b(q, e) : 2 == l ? !(s | r | p | q) && c(a) && c(e) && b(n, d) : 2 == s ? !(p | q | l | n) && c(e) && c(d) && b(r, a) : !1
return sb
}
```

头疼
mhycy
2016-12-01 14:20:14 +08:00
@jason19659 谁家的验证代码?看起来还行
Caratpine
2016-12-01 15:03:14 +08:00
这段代码至少在风格少还是比较清晰吧。哎,遇到风格千奇百怪的代码才让人头大。。
Thoxvi
2016-12-01 15:12:56 +08:00
PS 不是有个录制功能吗…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/324464

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX