[
  {
    "path": "README.md",
    "content": "# Sketch SubtlePatterns\n\nImport [Subtle Patterns](https://github.com/subtlepatterns/SubtlePatterns) as shape fills in Sketch.\n\n![subtlepatterns](https://raw.githubusercontent.com/dunckr/sketch-subtlepatterns/master/assets/example.png)\n\n## Usage\n\n![Using plugin](https://raw.githubusercontent.com/dunckr/sketch-subtlepatterns/master/assets/usage.gif)\n\n+ Select Shapes\n+ Run using ```Plugins > Menu > sketch-subtlepatterns > random```\n+ Wait for the images to be inserted as a fill\n\n## Installation\n\nThe [official documentation](http://bohemiancoding.com/sketch/support/developer/01-introduction/01.html) explains how to install plugins in detail.\n\n### Clone\n\n+ Find Sketch Plugins folder using ```Plugins menu > Reveal Plugins Folder```\n+ e.g. ```git clone /Users/dunc/Library/Containers/com.bohemiancoding.sketch3/Data/Library/Application\\ Support/com.bohemiancoding.sketch3/Plugins```\n\n### Download\n\n+ Find Sketch Plugins folder using ```Plugins menu > Reveal Plugins Folder```\n+ [Download](https://github.com/dunckr/sketch-subtlepatterns/archive/master.zip)\n+ Unzip and copy into the Sketch plugins folder\n\n## Update\n\n```sh\n./update.sh\n```\n\n## Thanks\n\nA big thanks to the awesome [SubtlePatterns](http://subtlepatterns.com/).\n\n## License\n\nMIT © [Duncan Beaton](http://dunckr.com)\n"
  },
  {
    "path": "SubtlePatterns/.gitignore",
    "content": "\n.DS_Store\n"
  },
  {
    "path": "lib/util.js",
    "content": "@import 'vendor/index.js'\n\nvar DATA_PATH = 'SubtlePatterns/';\n\nfunction getDir(name) {\n  var scriptPath = sketch.scriptPath;\n  var pluginFolder = scriptPath.match(/Plugins\\/([\\w -])*/)[0] + '/';\n  var sketchPluginsPath = scriptPath.replace(/Plugins([\\w \\/ -])*.sketchplugin$/, '');\n  return sketchPluginsPath + pluginFolder + name;\n}\n\nfunction getFilePath(dir, type) {\n  var fileManager = NSFileManager.defaultManager();\n  var imagesFileNames = fileManager.contentsOfDirectoryAtPath_error(dir, nil);\n  var imgLen = imagesFileNames.count();\n  var ran = random(imgLen);\n  var fileName = imagesFileNames[ran];\n  if (endsWith(fileName, 'png')) {\n    return fileName;\n  }\n  return imagesFileNames[1];\n}\n\nfunction loadImage() {\n  var imagesPath = getDir(DATA_PATH);\n  var fullPath = imagesPath + getFilePath(imagesPath, '.png')\n  return NSImage.alloc().initWithContentsOfFile(fullPath);\n}\n\nfunction setSelection() {\n  var loop = selection.objectEnumerator();\n  while (layer = loop.nextObject()) {\n    var data = loadImage();\n    setImage(layer, data);\n  }\n}\n"
  },
  {
    "path": "random.sketchplugin",
    "content": "@import 'lib/util.js'\n\nsetSelection();\n"
  },
  {
    "path": "sketchpack.json",
    "content": "{\n    \"name\": \"Subtle Patterns\",\n    \"description\": \"Import subtle patterns as shape fills in Sketch\",\n    \"tags\": [\"placeholders\", \"images\"]\n}"
  },
  {
    "path": "update.sh",
    "content": "#!/bin/bash\n\nrm -rf SubtlePatterns\n\ngit clone https://github.com/subtlepatterns/SubtlePatterns\n\nrm SubtlePatterns/{*.zip,*.php,*.html,*.md}\n"
  },
  {
    "path": "vendor/README.md",
    "content": "# Sketch Utils\n\nHelper functions for creating Sketch plugins.\n\n## Usage\n\n+ Git clone or subtree\n\n```git subtree add --prefix vendor https://github.com/dunckr/sketch-utils master —squash```\n\n+ Import into sketchplugin file\n\n```#import 'vendor/utils.js'```\n\n## License\n\nMIT © [Duncan Beaton](http://dunckr.com)\n"
  },
  {
    "path": "vendor/index.js",
    "content": "/**\n * AJAX request.\n *\n * @param {String} url\n * @return {NSString}\n */\nfunction request(url) {\n  var request = NSURLRequest.requestWithURL(NSURL.URLWithString(url));\n  return NSURLConnection.sendSynchronousRequest_returningResponse_error(request, null, null);\n}\n\n/**\n * Convert NSString to String.\n *\n * @param {NSString} response\n * @return {String}\n */\nfunction toString(response) {\n  return NSString.alloc().initWithData_encoding(response, NSUTF8StringEncoding);\n}\n\n/**\n * Fill layer with Image Data\n *\n * @param {Layer} layer\n * @param {Image} image\n * @return {Fill}\n */\nfunction setImage(layer, image) {\n  var version = sketchVersion()\n  var fill = layer.style().fills().firstObject();\n  fill.setFillType(4);\n  fill.setPatternFillType(0);\n  if (version > 370) {\n    var imageData = MSImageData.alloc().initWithImage_convertColorSpace(image, false)\n    fill.setImage(imageData)\n  } else if (version < 350) {\n    fill.setPatternImage_collection(image, fill.documentData().images())\n  } else {\n    fill.setPatternImage(image)\n  }\n  fill.setPatternFillType(0);\n  return fill;\n}\n\n/**\n * Random number between 0 and limit\n *\n * @param {Number} limit\n * @return {Number}\n */\nfunction random(limit) {\n  return Math.floor(Math.random() * limit) + 1;\n}\n\n/**\n * Determine if Str ends with a suffix\n *\n * @param {String} str\n * @param {String} suffix\n * @return {Boolean}\n */\nfunction endsWith(str, suffix) {\n  return str.indexOf(suffix, str.length - suffix.length) !== -1;\n}\n\n\n/**\n * Sketch Version as a number\n *\n * @return {Number}\n */\nfunction sketchVersion() {\n  var version = NSBundle.mainBundle().objectForInfoDictionaryKey('CFBundleShortVersionString')\n  var versionNumber = version.stringByReplacingOccurrencesOfString_withString('.', '') + ''\n  if (versionNumber.length < 3) versionNumber += '0'\n  return parseInt(versionNumber)\n}\n"
  }
]