Files
blockly/theme_scripts/create_blockStyles.py
Neil Fraser b46a4fe286 Bring our license format up to date (#3127)
* Google changed from an Inc to an LLC.

This happened back in 2017 but we didn’t notice.  Officially we should update files from Inc to LLC when they are changed as part of regular edits, but this is a nightmare to remember for the next decade.

* Remove project description/titles from licenses

This is no longer part of Google’s header requirements.  Our existing descriptions were useless (“Visual Blocks Editor”) or grossly obselete (“Visual Blocks Language”).

* License no longer requires URL.

* Fix license regexps.
2019-10-02 14:46:56 -07:00

182 lines
5.4 KiB
Python

# !/usr/bin/env python
# Converts a single colour to primary, secondary and tertiary colours.
# Primary Colour - The colour given
# Secondary Colour - Lightens the primary colour by .8
# Tertiary Colour - Darkens the primary colour by .2
#
# Copyright 2012 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# Usage: create_blockStyles.py <fileName>
#
# fileName - Name of the file holding the map of style names to colours.
# Refer to blockStyles_example.json for an example input.
#
# Input: A json file with the keys being style names and the values
# being either a hue (number) or a hex value (string).
# Ex: {"styleName": 10, "styleName2": "#FFFFFF"}
#
# Output: A json file with the keys being style names and the values being an
# object holding primary, secondary, and tertiary colours in hex format.
# {"styleName":
# {"colourPrimary":"hexVal",
# "colourSecondary":"hexVal",
# "colourTertiary":"hexVal"
# }
# }
import math
import json
import sys
HSV_SATURATION = .45
BRIGHTNESS_VAL = .65 * 255
LIGHT_FACTOR = .8
DARK_FACTOR = .2
#Change HSV (Hue Saturation Value) to RGB
#This is adapted to python from the js version found here:
#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js
def hsvToRgb(h, s, brightness):
red = 0
green = 0
blue = 0
if (s == 0):
red = brightness
green = brightness
blue = brightness
else:
sextant = math.floor(h / 60)
remainder = (float(h) / float(60)) - sextant
val1 = brightness * (1 - s)
val2 = brightness * (1 - (s * remainder))
val3 = brightness * (1 - (s * (1 - remainder)))
if sextant == 1:
red = val2
green = brightness
blue = val1
elif sextant == 2:
red = val1
green = brightness
blue = val3
elif sextant == 3:
red = val1
green = val2
blue = brightness
elif sextant == 4:
red = val3
green = val1
blue = brightness
elif sextant == 5:
red = brightness
green = val1
blue = val2
elif sextant == 0:
red = brightness
green = val3
blue = val1
return [math.floor(red), math.floor(green), math.floor(blue)]
#Blend two rgb colours with the factor being the weight given to the first colour
#This is adapted to python from the js version found here:
#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js
def blend(rgb1, rgb2, factor):
factor = max(min(factor, 1), 0)
return [
round(rgb2[0] + factor * (rgb1[0] - rgb2[0])),
round(rgb2[1] + factor * (rgb1[1] - rgb2[1])),
round(rgb2[2] + factor * (rgb1[2] - rgb2[2]))
]
#Lightens a given rgb colour
#This is adapted to python from the js version found here:
#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js
def lighten(rgb, factor):
white = [255, 255, 255]
return blend(white, rgb, factor)
#Darkens a given rgb colour
#This is adapted to python from the js version found here:
#https://blockly-demo.appspot.com/closure-library/closure/goog/colour/color.js
def darken(rgb, factor):
black = [0, 0, 0];
return blend(black, rgb, factor)
#Converts rgb to hex
def rgbToHex(rgb):
#Add checks in here to make sure valid numbers
return '#%02x%02x%02x' % (rgb[0], rgb[1], rgb[2])
#Calculates the primary, secondary and tertiary colours for the block style
def findOtherColours(rgb):
colourPrimary = rgbToHex(rgb)
colourSecondary = rgbToHex(lighten(rgb, LIGHT_FACTOR))
colourTertiary = rgbToHex(darken(rgb, DARK_FACTOR))
return {
"colourPrimary": colourPrimary,
"colourSecondary": colourSecondary,
"colourTertiary": colourTertiary
}
# Converts a hex colour to rgb colour format
def hexToRgb(hexColour):
r = int(hexColour[1:3], 16)
g = int(hexColour[3:5], 16)
b = int(hexColour[5:7], 16)
return [r, g, b]
# Converts either a hue or hex colour to rgb colour format
def findRgbVal(colour):
try:
hue = int(colour)
rgb = hsvToRgb(hue, HSV_SATURATION, BRIGHTNESS_VAL)
except (TypeError, ValueError):
hexColour = colour
rgb = hexToRgb(hexColour)
return rgb
# Get info on the input file
def getFileInfo():
if (len(sys.argv) < 2):
print("Please provide a filename")
sys.exit()
fileName = sys.argv[1]
try:
jsonFile = open(fileName).read()
except IOError as err:
print('Could not find that file name')
sys.exit()
return (jsonFile, fileName)
# Creates a map with the keys being the style names and the values being an object
# holding colourPrimary, colourSecondary, colourTertiary
def createColourMap():
(jsonFile, fileName) = getFileInfo()
jsonData = json.loads(jsonFile)
colourObj = {}
for key in jsonData.keys():
rgbVal = findRgbVal(jsonData[key])
colourObj[key] = findOtherColours(rgbVal)
f= open("new_" + fileName,"w+")
f.write(json.dumps(colourObj, indent=2, sort_keys=True))
f.close()
createColourMap()