Sketch 55 新功能

发布日期:2019 年 5 月 21 日 – 阅读发行说明

更改

URL 方案,用于将插件启动到特定命令

GitHub 拉取请求

您可以使用新的 URL 方案来定位插件的特定命令

sketch://plugin/my.plugin.identifier/my.command.identifier

您也可以传入参数。请注意,这是第二个 URL 方案。第一个方案用于 打开特定文档,使用 sketch://path/to/file.sketch

当使用上述 URL 方案打开时,将触发 HandleURL 操作,其中包含一个包含三个键的操作上下文

url

触发此操作的 NSURL

path

一个包含 sketch://plugin 之后所有内容的字符串,例如 /my.plugin.identifier/my.command.identifier

query

一个包含 URL 查询的对象,例如对于 sketch://plugin/my.plugin.identifier/my.command.identifier?foo=bar&baz=qux,query 将为

{
  foo: 'bar',
  baz: 'qux'
}

用法

您需要正确设置清单文件才能在 HandleURL 操作上触发函数

{
  "identifier": "com.sketchapp.examples.log-message",
  "compatibleVersion": 3,
  "bundleVersion": 1,
  "icon": "icon.png",
  "commands": [
    {
      "name": "Log Message",
      "identifier": "log-message",
      "script": "./log-message.js",
      "handlers": {
        "actions": {
          "HandleURL": "handleURL"
        }
      }
    }
  ]
}

在 JavaScript 中,以以下方式实现操作处理程序,以便当用户导航到 url sketch://plugin/com.sketchapp.examples.log-message/log-message?foo=Hello%20World 时,应用程序中将出现一条包含文本“Hello World”的消息。

const sketch = require('sketch')

function handleURL(context) {
  let query = context.actionContext.query
  sketch.UI.message(query.foo)
}

请注意,在这种情况下,用户需要安装插件,并且已经打开了一个文档。您还可以为用户创建一个新文档,如下所示

const sketch = require('sketch')
const Document = sketch.Document
const currentDocument = sketch.getSelectedDocument()

function handleURL(context) {
  let query = context.actionContext.query
  if (currentDocument) {
    sketch.UI.message(query.foo)
  } else {
    let document = new Document()
    sketch.UI.message(query.foo)
  }
}

完整的插件示例可以在 此处找到。

CurvePoint 上添加 isSelected 方法

GitHub 拉取请求

如果用户当前正在编辑路径,您可以使用 curvePoint.isSelected() 方法检查曲线点是否被选中。

用法

如果用户正在选择形状的点,您可以使用以下方法检查它

shape.points[0].isSelected()

以下是如何在实践中使用它的示例。在您的 Sketch 文档中创建并选择一个矩形。

let sketch = require('sketch')
let document = sketch.getSelectedDocument()
let selection = document.selectedLayers.layers[0]

let isAnyPointSelected = false
let pointSelectionArray = []

selection.points.forEach(point => {
  if (point.isSelected()) {
    isAnyPointSelected = true
    pointSelectionArray.push(true)
  } else {
    pointSelectionArray.push(false)
  }
})

console.log(isAnyPointSelected)
// true

console.log(pointSelectionArray)
// [true, true, false, false]

getSelectedDocument() 以前在没有打开文档的情况下会抛出错误,现在改为返回 undefined

GitHub 拉取请求

Babel 会将 [nativeDocument] = NSApplication.sharedApplication().orderedDocuments() 转换为一个适当的数组,但它不是,它是一个 NSArray,因此它会抛出错误。

这是对之前 URL 示例的一个很好的补充。我们可以自信地检查当前是否已打开文档。

用法

let sketch = require('sketch')
let document = sketch.getSelectedDocument()

if (document) {
  // has open document
}

通过弃用 Fill.fill,改为使用 Fill.fillType 来提高一致性

GitHub 拉取请求

这是为了与 Border.fileType 和其他类型匹配。

用法

设置填充与设置边框更加一致。

const style = new Style({
  fills: [{ color: '#1234', fill: Style.FillType.Color }],
})
const style = new Style({
  fills: [{ color: '#123456', fillType: Style.FillType.Color }],
})

对包装对象的原型进行更好的日志记录

GitHub 拉取请求

util.inspect 算法(控制台使用)中存在一个错误,它认为包装对象的原型是一个包装对象,并使用包装对象的代码路径。此问题已修复,以提供更好的日志输出。