Last active
March 6, 2021 04:14
-
-
Save catgirlinspace/3d3df47aadf7ac41af6e9bece2a1f373 to your computer and use it in GitHub Desktop.
Code Block Roact Component
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
local plugin = script:FindFirstAncestorWhichIsA("Plugin") | |
local Lexer = require(script.Lexer) -- https://devforum.roblox.com/t/lexer-for-rbx-lua/183115/19?u=dog2puppy | |
local RichText = require(script.RichText) -- https://github.com/Mullets-Gavin/Roblox/blob/master/Shared/RichText.lua | |
local Roact = require(script.Parent.Parent.Modules.Roact) | |
local e = Roact.createElement | |
local CodeBlock = Roact.Component:extend("CodeBlock") | |
function CodeBlock:init() | |
local theme = settings().Studio.Theme | |
self.state = { | |
theme = theme, | |
colors = { | |
keyword = theme:GetColor(Enum.StudioStyleGuideColor.ScriptLuauKeyword), | |
builtin = theme:GetColor(Enum.StudioStyleGuideColor.ScriptBuiltInFunction), | |
iden = theme:GetColor(Enum.StudioStyleGuideColor.ScriptText), | |
["string"] = theme:GetColor(Enum.StudioStyleGuideColor.ScriptString), | |
number = theme:GetColor(Enum.StudioStyleGuideColor.ScriptNumber), | |
space = theme:GetColor(Enum.StudioStyleGuideColor.ScriptText), | |
comment = theme:GetColor(Enum.StudioStyleGuideColor.ScriptComment), | |
operator = theme:GetColor(Enum.StudioStyleGuideColor.ScriptOperator) | |
} | |
} | |
self._themeChangedConnection = settings().Studio.ThemeChanged:Connect(function() | |
local theme = settings().Studio.Theme | |
self:setState({ | |
theme = theme, | |
colors = { | |
keyword = theme:GetColor(Enum.StudioStyleGuideColor.ScriptLuauKeyword), | |
builtin = theme:GetColor(Enum.StudioStyleGuideColor.ScriptBuiltInFunction), | |
iden = theme:GetColor(Enum.StudioStyleGuideColor.ScriptText), | |
["string"] = theme:GetColor(Enum.StudioStyleGuideColor.ScriptString), | |
number = theme:GetColor(Enum.StudioStyleGuideColor.ScriptNumber), | |
space = theme:GetColor(Enum.StudioStyleGuideColor.ScriptText), | |
comment = theme:GetColor(Enum.StudioStyleGuideColor.ScriptComment), | |
operator = theme:GetColor(Enum.StudioStyleGuideColor.ScriptOperator) | |
} | |
}) | |
end) | |
end | |
function CodeBlock:willUnmount() | |
self._themeChangedConnection:Disconnect() | |
end | |
function CodeBlock:render() | |
local theme = self.state.theme | |
local colors = self.state.colors | |
local code = self.props.code | |
local codeBlock = RichText.create() | |
for token, source in Lexer.scan(code) do | |
local color = colors[token] or theme:GetColor(Enum.StudioStyleGuideColor.ScriptText) | |
codeBlock:Color(color) | |
codeBlock:Append(source) | |
codeBlock:Color(false) | |
end | |
return e("TextLabel", { | |
RichText = true, | |
Text = codeBlock:GetText(), | |
TextXAlignment = Enum.TextXAlignment.Left, | |
Font = Enum.Font.Ubuntu, | |
BackgroundTransparency = 0, | |
BackgroundColor3 = theme:GetColor(Enum.StudioStyleGuideColor.ScriptBackground), | |
Size = self.props.Size, | |
Position = self.props.Position, | |
TextSize = 16, | |
AutomaticSize = Enum.AutomaticSize.Y | |
}) | |
end | |
return CodeBlock |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment