diff --git a/.gitignore b/.gitignore index b7cafe7..9696ebb 100644 --- a/.gitignore +++ b/.gitignore @@ -162,4 +162,5 @@ cython_debug/ notebooks/ .vscode/ -poetry.lock \ No newline at end of file +poetry.lock +cov.xml \ No newline at end of file diff --git a/README.md b/README.md index 92e6fd9..ad58c7d 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ # Getting started with `fave-recode` + + [](https://codecov.io/gh/Forced-Alignment-and-Vowel-Extraction/fave-recode) [](https://codeclimate.com/github/Forced-Alignment-and-Vowel-Extraction/fave-recode/maintainability) [](https://github.com/Forced-Alignment-and-Vowel-Extraction/fave-recode/actions/workflows/test-and-run.yml) [](https://forced-alignment-and-vowel-extraction.github.io/fave-recode/) +[](https://zenodo.org/badge/latestdoi/605740158) The idea behind `fave-recode` is that no matter how much you may adjust the dictionary of a forced-aligner, you may still want to make @@ -41,6 +44,7 @@ fave_recode --help -d, --output_dest PATH An output directory Other options: + -a, --parser TEXT Label set parser. Built in options are cmu_parser -s, --scheme TEXT Recoding scheme. Built in options are cmu2labov and cmu2phila [required] -r, --recode_stem TEXT Stem to append to recoded TextGrid file names @@ -59,7 +63,7 @@ ls data KY25A_1.TextGrid josef-fruehwald_speaker.TextGrid ``` bash -fave_recode -i data/josef-fruehwald_speaker.TextGrid -s cmu2phila +fave_recode -i data/josef-fruehwald_speaker.TextGrid -s cmu2phila -a cmu_parser ls data ``` diff --git a/README.qmd b/README.qmd index 9849c35..7ea51bd 100644 --- a/README.qmd +++ b/README.qmd @@ -3,11 +3,12 @@ title: Getting started with `fave-recode` engine: jupyter format: gfm --- - + [](https://codecov.io/gh/Forced-Alignment-and-Vowel-Extraction/fave-recode) [](https://codeclimate.com/github/Forced-Alignment-and-Vowel-Extraction/fave-recode/maintainability) [](https://github.com/Forced-Alignment-and-Vowel-Extraction/fave-recode/actions/workflows/test-and-run.yml) [](https://forced-alignment-and-vowel-extraction.github.io/fave-recode/) +[](https://zenodo.org/badge/latestdoi/605740158) The idea behind `fave-recode` is that no matter how much you may adjust the dictionary of a forced-aligner, you may still want to make programmatic changes to the output. @@ -47,13 +48,13 @@ ls data ``` ```bash -fave_recode -i data/josef-fruehwald_speaker.TextGrid -s cmu2phila +fave_recode -i data/josef-fruehwald_speaker.TextGrid -s cmu2phila -a cmu_parser ls data ``` ```{python} #| echo: false -!fave_recode -i docs/getting-started/data/josef-fruehwald_speaker.TextGrid -s cmu2phila +!fave_recode -i docs/getting-started/data/josef-fruehwald_speaker.TextGrid -s cmu2phila -a cmu_parser !ls docs/getting-started/data ``` diff --git a/docs/_extensions/jofrhwld/codeblocklabel/_extension.yml b/docs/_extensions/jofrhwld/codeblocklabel/_extension.yml new file mode 100644 index 0000000..3c068e5 --- /dev/null +++ b/docs/_extensions/jofrhwld/codeblocklabel/_extension.yml @@ -0,0 +1,8 @@ +title: Codeblocklabel +author: Josef Fruehwald +version: 1.0.0 +quarto-required: ">=1.3.0" +contributes: + filters: + - codeblocklabel.lua + diff --git a/docs/_extensions/jofrhwld/codeblocklabel/codeblocklabel.css b/docs/_extensions/jofrhwld/codeblocklabel/codeblocklabel.css new file mode 100644 index 0000000..fdb38d0 --- /dev/null +++ b/docs/_extensions/jofrhwld/codeblocklabel/codeblocklabel.css @@ -0,0 +1,10 @@ +.langname { + margin-bottom: 0%; + padding-bottom: 0%; + font-style: italic; + font-size:smaller; +} + +.sourceCode[id]{ + margin-top: 0%; +} diff --git a/docs/_extensions/jofrhwld/codeblocklabel/codeblocklabel.lua b/docs/_extensions/jofrhwld/codeblocklabel/codeblocklabel.lua new file mode 100644 index 0000000..677e3a5 --- /dev/null +++ b/docs/_extensions/jofrhwld/codeblocklabel/codeblocklabel.lua @@ -0,0 +1,30 @@ + +-- function Div(el) +-- if el.content[1].t == "CodeBlock" then +-- return pandoc.Para("CodeBlock!") +-- end +-- end + +quarto.doc.add_html_dependency({ + name = 'codenamelabel', + stylesheets = {'codeblocklabel.css'} + }) + +function CodeBlock(block) + local newblock = block + if (FORMAT:match "html") and + (block.classes[1]) then + local langname = block.classes[1] + out = {pandoc.Div( + pandoc.RawInline("html", + "
"..block.classes[1].."" + ), + pandoc.Attr("", {"langname"}, {}) + ), + newblock + } + else + out = newblock + end + return out +end \ No newline at end of file diff --git a/docs/_quarto.yml b/docs/_quarto.yml index c29cceb..30e51fe 100644 --- a/docs/_quarto.yml +++ b/docs/_quarto.yml @@ -5,6 +5,7 @@ project: website: page-navigation: true image: assets/logo.png + favicon: assets/logo.png navbar: left: - file: getting-started/overview.qmd @@ -35,14 +36,19 @@ website: contents: - getting-started/condition-attributes.qmd - getting-started/condition-relations.qmd - + - section: Labelset Parsing + contents: + - getting-started/label_set_parser.qmd format: html: theme: - light: flatly - dark: darkly + light: [flatly, styles/light.scss] + dark: [darkly, styles/dark.scss] + css: styles/styles.css toc: true + filters: + - codeblocklabel # tell quarto to read the generated sidebar metadata-files: @@ -75,6 +81,11 @@ quartodoc: - rule_classes.Condition - rule_classes.Rule - rule_classes.RuleSet + - title: Label Set Parsers + desc: Label set parsers + contents: + - labelset_parser.LabelSetParser + - labelset_parser.LabelSetParserProperties - title: Relations - subtitle: "`in`, `not in`" contents: diff --git a/docs/getting-started/label_set_parser.qmd b/docs/getting-started/label_set_parser.qmd new file mode 100644 index 0000000..099dcde --- /dev/null +++ b/docs/getting-started/label_set_parser.qmd @@ -0,0 +1,69 @@ +--- +title: Label Set Parsers +engine: jupyter +toc: true +--- + +There are some properties of label sets that you might want to include in your output labels. +For example, the CMU dictionary encodes vowel stress like so: + +| label | meaning | +| ---- | ---- | +| `AY0` | unstressed /ay/ | +| `AY2` | secondary stressed /ay/ | +| `AY1` | primary stressed /ay/ | + +A labelset parser can make these properties available so you can write a recoding rule like so: + +```yaml +- rule: ay + conditions: + - attribute: label + relation: contains + set: AY + return: ay_{stress} +``` + +`fave_recode` has built in parser for CMU labels called `cmu_parser` that you can include like so + +```bash +fave_recode \ + -i data/josef-fruehwald_speaker.TextGrid \ + -s cmu2phila \ + -a cmu_parser +``` + +## Label Set Parser Basics + +A labelset parser has two top level attributes + +```yaml +parser: CMU +properties: [] +``` + +- `parser` just names the parser +- `properties` is a list of properties you wish to make available. + +### A property + +A single property that parses primary stress out of the cmu label would look like this: + +```yaml +name: stress +updates: stress +default: "" +rules: + - rule: "1" + conditions: + - attribute: label + relation: contains + set: "1" + return: "1" +``` + +The `rule` component is identical to [rules for recoding](rule-scheme-basics.qmd). + +The `updates` field defines the variable name you want to use to access the value "1" in our recoding rule. + +Unlike a recoding rule, every segment will be given some value for "stress", so a `default` value also needs to be provided. \ No newline at end of file diff --git a/docs/getting-started/overview.qmd b/docs/getting-started/overview.qmd index cc183a0..1bc549d 100644 --- a/docs/getting-started/overview.qmd +++ b/docs/getting-started/overview.qmd @@ -4,7 +4,7 @@ aliases: - ../index.html engine: jupyter --- - + [](https://codecov.io/gh/Forced-Alignment-and-Vowel-Extraction/fave-recode) [](https://codeclimate.com/github/Forced-Alignment-and-Vowel-Extraction/fave-recode/maintainability) [](https://github.com/Forced-Alignment-and-Vowel-Extraction/fave-recode/actions/workflows/test-and-run.yml) @@ -48,7 +48,10 @@ ls data ``` ```bash -fave_recode -i data/josef-fruehwald_speaker.TextGrid -s cmu2phila +fave_recode \ + -i data/josef-fruehwald_speaker.TextGrid \ + -a cmu_parser \ + -s cmu2phila ls data ``` diff --git a/docs/objects.json b/docs/objects.json index 0427fc6..259baab 100644 --- a/docs/objects.json +++ b/docs/objects.json @@ -1 +1 @@ -{"project": "fave_recode", "version": "0.0.9999", "count": 16, "items": [{"name": "fave_recode.rule_classes.Condition.check_condition", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.Condition.html#fave_recode.rule_classes.Condition.check_condition", "dispname": "-"}, {"name": "fave_recode.rule_classes.Condition.validate_condition", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.Condition.html#fave_recode.rule_classes.Condition.validate_condition", "dispname": "-"}, {"name": "fave_recode.rule_classes.Condition", "domain": "py", "role": "class", "priority": "1", "uri": "reference/rule_classes.Condition.html#fave_recode.rule_classes.Condition", "dispname": "-"}, {"name": "fave_recode.rule_classes.Rule.apply_rule", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.Rule.html#fave_recode.rule_classes.Rule.apply_rule", "dispname": "-"}, {"name": "fave_recode.rule_classes.Rule.validate_rule", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.Rule.html#fave_recode.rule_classes.Rule.validate_rule", "dispname": "-"}, {"name": "fave_recode.rule_classes.Rule", "domain": "py", "role": "class", "priority": "1", "uri": "reference/rule_classes.Rule.html#fave_recode.rule_classes.Rule", "dispname": "-"}, {"name": "fave_recode.rule_classes.RuleSet.apply_ruleset", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.RuleSet.html#fave_recode.rule_classes.RuleSet.apply_ruleset", "dispname": "-"}, {"name": "fave_recode.rule_classes.RuleSet.map_ruleset", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.RuleSet.html#fave_recode.rule_classes.RuleSet.map_ruleset", "dispname": "-"}, {"name": "fave_recode.rule_classes.RuleSet.read_ruleset", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.RuleSet.html#fave_recode.rule_classes.RuleSet.read_ruleset", "dispname": "-"}, {"name": "fave_recode.rule_classes.RuleSet", "domain": "py", "role": "class", "priority": "1", "uri": "reference/rule_classes.RuleSet.html#fave_recode.rule_classes.RuleSet", "dispname": "-"}, {"name": "fave_recode.relations.in_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.in_relation.html#fave_recode.relations.in_relation", "dispname": "-"}, {"name": "fave_recode.relations.not_in_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.not_in_relation.html#fave_recode.relations.not_in_relation", "dispname": "-"}, {"name": "fave_recode.relations.equals_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.equals_relation.html#fave_recode.relations.equals_relation", "dispname": "-"}, {"name": "fave_recode.relations.not_equals_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.not_equals_relation.html#fave_recode.relations.not_equals_relation", "dispname": "-"}, {"name": "fave_recode.relations.rematches_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.rematches_relation.html#fave_recode.relations.rematches_relation", "dispname": "-"}, {"name": "fave_recode.relations.reunmatches_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.reunmatches_relation.html#fave_recode.relations.reunmatches_relation", "dispname": "-"}]} \ No newline at end of file +{"project": "fave_recode", "version": "0.0.9999", "count": 23, "items": [{"name": "fave_recode.rule_classes.Condition.check_condition", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.Condition.html#fave_recode.rule_classes.Condition.check_condition", "dispname": "-"}, {"name": "fave_recode.rule_classes.Condition.validate_condition", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.Condition.html#fave_recode.rule_classes.Condition.validate_condition", "dispname": "-"}, {"name": "fave_recode.rule_classes.Condition", "domain": "py", "role": "class", "priority": "1", "uri": "reference/rule_classes.Condition.html#fave_recode.rule_classes.Condition", "dispname": "-"}, {"name": "fave_recode.rule_classes.Rule.apply_rule", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.Rule.html#fave_recode.rule_classes.Rule.apply_rule", "dispname": "-"}, {"name": "fave_recode.rule_classes.Rule.validate_rule", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.Rule.html#fave_recode.rule_classes.Rule.validate_rule", "dispname": "-"}, {"name": "fave_recode.rule_classes.Rule", "domain": "py", "role": "class", "priority": "1", "uri": "reference/rule_classes.Rule.html#fave_recode.rule_classes.Rule", "dispname": "-"}, {"name": "fave_recode.rule_classes.RuleSet.apply_ruleset", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.RuleSet.html#fave_recode.rule_classes.RuleSet.apply_ruleset", "dispname": "-"}, {"name": "fave_recode.rule_classes.RuleSet.map_ruleset", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.RuleSet.html#fave_recode.rule_classes.RuleSet.map_ruleset", "dispname": "-"}, {"name": "fave_recode.rule_classes.RuleSet.read_ruleset", "domain": "py", "role": "function", "priority": "1", "uri": "reference/rule_classes.RuleSet.html#fave_recode.rule_classes.RuleSet.read_ruleset", "dispname": "-"}, {"name": "fave_recode.rule_classes.RuleSet", "domain": "py", "role": "class", "priority": "1", "uri": "reference/rule_classes.RuleSet.html#fave_recode.rule_classes.RuleSet", "dispname": "-"}, {"name": "fave_recode.labelset_parser.LabelSetParser.apply_parser", "domain": "py", "role": "function", "priority": "1", "uri": "reference/labelset_parser.LabelSetParser.html#fave_recode.labelset_parser.LabelSetParser.apply_parser", "dispname": "-"}, {"name": "fave_recode.labelset_parser.LabelSetParser.map_parser", "domain": "py", "role": "function", "priority": "1", "uri": "reference/labelset_parser.LabelSetParser.html#fave_recode.labelset_parser.LabelSetParser.map_parser", "dispname": "-"}, {"name": "fave_recode.labelset_parser.LabelSetParser.read_parser", "domain": "py", "role": "function", "priority": "1", "uri": "reference/labelset_parser.LabelSetParser.html#fave_recode.labelset_parser.LabelSetParser.read_parser", "dispname": "-"}, {"name": "fave_recode.labelset_parser.LabelSetParser.validate_parser", "domain": "py", "role": "function", "priority": "1", "uri": "reference/labelset_parser.LabelSetParser.html#fave_recode.labelset_parser.LabelSetParser.validate_parser", "dispname": "-"}, {"name": "fave_recode.labelset_parser.LabelSetParser", "domain": "py", "role": "class", "priority": "1", "uri": "reference/labelset_parser.LabelSetParser.html#fave_recode.labelset_parser.LabelSetParser", "dispname": "-"}, {"name": "fave_recode.labelset_parser.LabelSetParserProperties.validate_property", "domain": "py", "role": "function", "priority": "1", "uri": "reference/labelset_parser.LabelSetParserProperties.html#fave_recode.labelset_parser.LabelSetParserProperties.validate_property", "dispname": "-"}, {"name": "fave_recode.labelset_parser.LabelSetParserProperties", "domain": "py", "role": "class", "priority": "1", "uri": "reference/labelset_parser.LabelSetParserProperties.html#fave_recode.labelset_parser.LabelSetParserProperties", "dispname": "-"}, {"name": "fave_recode.relations.in_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.in_relation.html#fave_recode.relations.in_relation", "dispname": "-"}, {"name": "fave_recode.relations.not_in_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.not_in_relation.html#fave_recode.relations.not_in_relation", "dispname": "-"}, {"name": "fave_recode.relations.equals_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.equals_relation.html#fave_recode.relations.equals_relation", "dispname": "-"}, {"name": "fave_recode.relations.not_equals_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.not_equals_relation.html#fave_recode.relations.not_equals_relation", "dispname": "-"}, {"name": "fave_recode.relations.rematches_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.rematches_relation.html#fave_recode.relations.rematches_relation", "dispname": "-"}, {"name": "fave_recode.relations.reunmatches_relation", "domain": "py", "role": "function", "priority": "1", "uri": "reference/relations.reunmatches_relation.html#fave_recode.relations.reunmatches_relation", "dispname": "-"}]} \ No newline at end of file diff --git a/docs/reference/_sidebar.yml b/docs/reference/_sidebar.yml index a5bb4d4..eba87de 100644 --- a/docs/reference/_sidebar.yml +++ b/docs/reference/_sidebar.yml @@ -7,6 +7,10 @@ website: - reference/rule_classes.Rule.qmd - reference/rule_classes.RuleSet.qmd section: Rule Classes + - contents: + - reference/labelset_parser.LabelSetParser.qmd + - reference/labelset_parser.LabelSetParserProperties.qmd + section: Label Set Parsers - contents: - contents: - reference/relations.in_relation.qmd diff --git a/docs/reference/index.qmd b/docs/reference/index.qmd index 2fb8987..c9ff83d 100644 --- a/docs/reference/index.qmd +++ b/docs/reference/index.qmd @@ -10,6 +10,15 @@ Rule application classes | [rule_classes.Rule](rule_classes.Rule.qmd#fave_recode.rule_classes.Rule) | _A rule class_ | | [rule_classes.RuleSet](rule_classes.RuleSet.qmd#fave_recode.rule_classes.RuleSet) | A rule set class | +## Label Set Parsers + +Label set parsers + +| | | +| --- | --- | +| [labelset_parser.LabelSetParser](labelset_parser.LabelSetParser.qmd#fave_recode.labelset_parser.LabelSetParser) | A labelset parser object | +| [labelset_parser.LabelSetParserProperties](labelset_parser.LabelSetParserProperties.qmd#fave_recode.labelset_parser.LabelSetParserProperties) | A property of the labelset, including rules that | + ## Relations ### `in`, `not in` diff --git a/docs/reference/labelset_parser.LabelSetParser.qmd b/docs/reference/labelset_parser.LabelSetParser.qmd new file mode 100644 index 0000000..5881348 --- /dev/null +++ b/docs/reference/labelset_parser.LabelSetParser.qmd @@ -0,0 +1,75 @@ +# labelset_parser.LabelSetParser { #fave_recode.labelset_parser.LabelSetParser } + +`labelset_parser.LabelSetParser(self, parser=None, parser_path=None)` + +A labelset parser object + +## Parameters + +| Name | Type | Description | Default | +|---------------|------------------------|-------------------------------------------------------------------|-----------| +| `parser` | [dict](`dict`) | A dictionary defining the parser rules. Defaults to None. | `None` | +| `parser_path` | [Path](`pathlib.Path`) | A path to a yaml file definition of the parser. Defaults to None. | `None` | + +## Methods + +| Name | Description | +| --- | --- | +| [apply_parser](#fave_recode.labelset_parser.LabelSetParser.apply_parser) | Apply the parser to a single interval | +| [map_parser](#fave_recode.labelset_parser.LabelSetParser.map_parser) | Map the parser to an entire sequence tier. | +| [read_parser](#fave_recode.labelset_parser.LabelSetParser.read_parser) | Read in a yaml file defining the parser | +| [validate_parser](#fave_recode.labelset_parser.LabelSetParser.validate_parser) | Validate wellformedness of parser | + +### apply_parser { #fave_recode.labelset_parser.LabelSetParser.apply_parser } + +`labelset_parser.LabelSetParser.apply_parser(obj)` + +Apply the parser to a single interval + +#### Parameters + +| Name | Type | Description | Default | +|--------|-----------------------------------------------------------------------------|--------------------|------------| +| `obj` | [SequenceInterval](`aligned_textgrid.sequences.sequences.SequenceInterval`) | A SequenceInterval | _required_ | + +### map_parser { #fave_recode.labelset_parser.LabelSetParser.map_parser } + +`labelset_parser.LabelSetParser.map_parser(obj)` + +Map the parser to an entire sequence tier. + +#### Parameters + +| Name | Type | Description | Default | +|--------|-----------------------------------------------------------------|----------------|------------| +| `obj` | [SequenceTier](`aligned_textgrid.sequences.tiers.SequenceTier`) | A SequenceTier | _required_ | + +### read_parser { #fave_recode.labelset_parser.LabelSetParser.read_parser } + +`labelset_parser.LabelSetParser.read_parser(path)` + +Read in a yaml file defining the parser + +#### Parameters + +| Name | Type | Description | Default | +|--------|------------------------|-----------------------------------|------------| +| `path` | [Path](`pathlib.Path`) | Path to the yaml file definition. | _required_ | + +### validate_parser { #fave_recode.labelset_parser.LabelSetParser.validate_parser } + +`labelset_parser.LabelSetParser.validate_parser(parser)` + +Validate wellformedness of parser + +#### Parameters + +| Name | Type | Description | Default | +|----------|----------------|-------------------|------------| +| `parser` | [dict](`dict`) | parser dictionary | _required_ | + +#### Raises + +| Type | Description | +|--------------------------|------------------------------------| +| [Exception](`Exception`) | Any errors raised by the validator | \ No newline at end of file diff --git a/docs/reference/labelset_parser.LabelSetParserProperties.qmd b/docs/reference/labelset_parser.LabelSetParserProperties.qmd new file mode 100644 index 0000000..fd4f7a2 --- /dev/null +++ b/docs/reference/labelset_parser.LabelSetParserProperties.qmd @@ -0,0 +1,36 @@ +# labelset_parser.LabelSetParserProperties { #fave_recode.labelset_parser.LabelSetParserProperties } + +`labelset_parser.LabelSetParserProperties(self, property=None)` + +A property of the labelset, including rules that +ought to be applied and the SequenceInterval property to update. + +## Parameters + +| Name | Type | Description | Default | +|------------|----------------|-------------------------------------------------------|-----------| +| `property` | [dict](`dict`) | A dictionary defining the property. Defaults to None. | `None` | + +## Methods + +| Name | Description | +| --- | --- | +| [validate_property](#fave_recode.labelset_parser.LabelSetParserProperties.validate_property) | Validate wellformedness of parser property | + +### validate_property { #fave_recode.labelset_parser.LabelSetParserProperties.validate_property } + +`labelset_parser.LabelSetParserProperties.validate_property(property)` + +Validate wellformedness of parser property + +#### Parameters + +| Name | Type | Description | Default | +|----------|----------------|---------------------|------------| +| `parser` | [dict](`dict`) | property dictionary | _required_ | + +#### Raises + +| Type | Description | +|--------------------------|------------------------------------| +| [Exception](`Exception`) | Any errors raised by the validator | \ No newline at end of file diff --git a/docs/styles/dark.scss b/docs/styles/dark.scss new file mode 100644 index 0000000..b1ce1d6 --- /dev/null +++ b/docs/styles/dark.scss @@ -0,0 +1,10 @@ +/*-- scss:defaults --*/ + +/*-- scss:rules --*/ + + + +/*-- scss:rules --*/ +.cell:not(.page-full):has(.cell-output){ + background-color: $gray-600; +} \ No newline at end of file diff --git a/docs/styles/light.scss b/docs/styles/light.scss new file mode 100644 index 0000000..f4f5ed7 --- /dev/null +++ b/docs/styles/light.scss @@ -0,0 +1,11 @@ +/*-- scss:defaults --*/ + +/*-- scss:rules --*/ + + + +/*-- scss:rules --*/ + + .cell:not(.page-full):has(.cell-output){ + background-color: $gray-100; + } \ No newline at end of file diff --git a/docs/styles/styles.css b/docs/styles/styles.css new file mode 100644 index 0000000..c24e338 --- /dev/null +++ b/docs/styles/styles.css @@ -0,0 +1,5 @@ +.cell:not(.page-full):has(.cell-output){ + padding: 2%; + border-radius: 10px; + margin-bottom: 1em; + } \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 28c71bb..f809c7f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "fave-recode" -version = "0.2.0" +version = "0.3.0" description = "A package for recoding Praat TextGrids" authors = ["JoFrhwld