commit 1699024e8a0f7abddb866134dea41918d6b5eed9 Author: Roberto Alsina Date: Fri Aug 2 17:03:39 2024 -0300 Initial dumb stuff diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..163eb75 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*.cr] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0bb75ea --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/docs/ +/lib/ +/bin/ +/.shards/ +*.dwarf diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..930c197 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Roberto Alsina + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..66fac15 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# tartrazine + +TODO: Write a description here + +## Installation + +TODO: Write installation instructions here + +## Usage + +TODO: Write usage instructions here + +## Development + +TODO: Write development instructions here + +## Contributing + +1. Fork it () +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create a new Pull Request + +## Contributors + +- [Roberto Alsina](https://github.com/your-github-user) - creator and maintainer diff --git a/lexers/LICENSE b/lexers/LICENSE new file mode 100644 index 0000000..92dc39f --- /dev/null +++ b/lexers/LICENSE @@ -0,0 +1,19 @@ +Copyright (C) 2017 Alec Thomas + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/shard.yml b/shard.yml new file mode 100644 index 0000000..4530e35 --- /dev/null +++ b/shard.yml @@ -0,0 +1,17 @@ +name: tartrazine +version: 0.1.0 + +authors: + - Roberto Alsina + +dependencies: + xmlt: + github: devnote-dev/xmlt + +targets: + tartrazine: + main: src/tartrazine.cr + +crystal: '>= 1.13.0' + +license: MIT diff --git a/spec/spec_helper.cr b/spec/spec_helper.cr new file mode 100644 index 0000000..323e272 --- /dev/null +++ b/spec/spec_helper.cr @@ -0,0 +1,2 @@ +require "spec" +require "../src/tartrazine" diff --git a/spec/tartrazine_spec.cr b/spec/tartrazine_spec.cr new file mode 100644 index 0000000..347bf74 --- /dev/null +++ b/spec/tartrazine_spec.cr @@ -0,0 +1,9 @@ +require "./spec_helper" + +describe Tartrazine do + # TODO: Write tests + + it "works" do + false.should eq(true) + end +end diff --git a/src/tartrazine.cr b/src/tartrazine.cr new file mode 100644 index 0000000..6d47334 --- /dev/null +++ b/src/tartrazine.cr @@ -0,0 +1,44 @@ +require "xml" + +module Tartrazine + VERSION = "0.1.0" + + class Lexer + property config = { + name: "", + aliases: [] of String, + filenames: [] of String, + mime_types: [] of String, + priority: 0, + } + + macro xml_to_s(node, name) + {{node}}.children.find{|n| n.name == "{{name}}".lstrip("_")}.as(XML::Node).content.to_s + end + + macro xml_to_a(node, name) + {{node}}.children.select{|n| n.name == "{{name}}".lstrip("_")}.map {|n| n.content.to_s} + end + + def self.from_xml(xml : String) : Lexer + l = Lexer.new + lexer = XML.parse(xml).first_element_child + if lexer + config = lexer.children.find { |n| n.name == "config" } + if config + l.config = { + name: xml_to_s(config, name), + aliases: xml_to_a(config, _alias), + filenames: xml_to_a(config, filename), + mime_types: xml_to_a(config, mime_type), + priority: xml_to_s(config, priority).to_i, + } + end + end + l + end + end +end + +l = Tartrazine::Lexer.from_xml(File.read("chroma/lexers/embedded/plaintext.xml")) +p! l.config