Skip to content

Instantly share code, notes, and snippets.

@vorbei
Created August 23, 2019 03:23
Show Gist options
  • Save vorbei/b1649d83b5a655d3ea757b718e4a5dc5 to your computer and use it in GitHub Desktop.
Save vorbei/b1649d83b5a655d3ea757b718e4a5dc5 to your computer and use it in GitHub Desktop.
Sketch 数字上标格式
const digit_font = "DINAlternate-Bold";
const digit_re = /[\.0-9]+/g;
const digit_sup_re = /\.[0-9]+/g;
const offsetScale = 0.2;
const scale = 0.7;
function reHelper (re, text){
let buffer, ranges = [];
while ((buffer = re.exec(text)) !== null) {
res = { "string": buffer[0], "start": buffer.index, "length": buffer[0].length};
ranges.push(NSMakeRange(res.start,res.length))
}
return ranges;
}
function fontHelper (fn,size) { return NSFont.fontWithName_size(fn,size?size:16) };
function sizeInRange (layer,range){
let sub = [[layer attributedStringValue] attributedSubstringFromRange: range];
return sub.treeAsDictionary().attributes[0].NSFont.attributes.NSFontSizeAttribute;
}
function updateLayers(){
let selectedLayers = context.selection;
let layers = selectedLayers;
layers.forEach(function(layer){
if (layer.className() != 'MSTextLayer') return;
let text = layer.stringValue();
let digit_ranges = reHelper(digit_re,text);
let digit_sup_ranges = reHelper(digit_sup_re,text);
layer.setIsEditingText(true);
digit_ranges.forEach(function(range){
let size = sizeInRange(layer,range);
layer.addAttribute_value_forRange(NSFontAttributeName, fontHelper(digit_font,size), range);
});
digit_sup_ranges.forEach(function(range){
let size = sizeInRange(layer,range);
layer.addAttribute_value_forRange(NSFontAttributeName, fontHelper(digit_font,size*scale), range);
layer.addAttribute_value_forRange(NSBaselineOffsetAttributeName, offsetScale*size, range);
});
layer.setIsEditingText(false);
})
};
updateLayers();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment