Skip to content

Commit

Permalink
Throw getEnumeratedListType error in node generator
Browse files Browse the repository at this point in the history
  • Loading branch information
Trinovantes committed Jul 3, 2024
1 parent a8f574b commit 1482ee2
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 19 deletions.
45 changes: 28 additions & 17 deletions src/RstNode/List/BulletListItem.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { romanToInt } from '@/utils/romanToInt.js'
import { RstNode, RstNodeJson, RstNodeObject, RstNodeSource } from '../RstNode.js'
import { RstEnumeratedList } from './EnumeratedList.js'
import { RstEnumeratedListType } from './EnumeratedListType.js'
import { createNodeGenerators } from '@/Generator/RstGenerator.js'
import { RstNodeRegistrar } from '@/Parser/RstNodeRegistrar.js'
import { RstNodeType } from '../RstNodeType.js'
import { HtmlAttributeStore } from '@/Generator/HtmlAttributeStore.js'
import { RstGeneratorState } from '@/Generator/RstGeneratorState.js'
import { RstGeneratorError } from '@/Generator/RstGeneratorError.js'
import { RstEnumeratedListType } from './EnumeratedListType.js'

// ----------------------------------------------------------------------------
// MARK: Node
Expand Down Expand Up @@ -77,25 +79,34 @@ export class RstBulletListItem extends RstNode {
return false
}

getEnumeratedListValue(): number {
getEnumeratedListValue(generatorState: RstGeneratorState): number {
if (this.bullet === '#') {
return this.getMyIndexInParent() + 1
}
const idx = this.getMyIndexInParent()
if (idx === null) {
throw new RstGeneratorError(generatorState, this, 'Failed to getEnumeratedListValue (failed to getMyIndexInParent)')
}

const parent = this.getParent(RstNodeType.EnumeratedList)
switch (parent.listType) {
case RstEnumeratedListType.AlphabetUpper:
case RstEnumeratedListType.AlphabetLower: {
const letter = this.bullet.toLowerCase()
return letter.charCodeAt(0) - 'a'.charCodeAt(0) + 1
return idx + 1
} else {
const parent = this.getParent(RstNodeType.EnumeratedList)
if (!parent) {
throw new RstGeneratorError(generatorState, this, 'Failed to getEnumeratedListValue (failed to getParent)')
}

case RstEnumeratedListType.RomanUpper:
case RstEnumeratedListType.RomanLower:
return romanToInt(this.bullet)
switch (parent.listType) {
case RstEnumeratedListType.AlphabetUpper:
case RstEnumeratedListType.AlphabetLower: {
const letter = this.bullet.toLowerCase()
return letter.charCodeAt(0) - 'a'.charCodeAt(0) + 1
}

case RstEnumeratedListType.RomanUpper:
case RstEnumeratedListType.RomanLower:
return romanToInt(this.bullet)

default:
return parseInt(this.bullet)
default:
return parseInt(this.bullet)
}
}
}
}
Expand All @@ -110,7 +121,7 @@ export const bulletListItemGenerators = createNodeGenerators(
(generatorState, node) => {
const attrs = new HtmlAttributeStore()
if (node.parent instanceof RstEnumeratedList && node.isFirstChild() && !node.isEnumeratedListFirstValue()) {
attrs.set('value', node.getEnumeratedListValue().toString())
attrs.set('value', node.getEnumeratedListValue(generatorState).toString())
}

generatorState.writeLineHtmlTagWithAttr('li', node, attrs, () => {
Expand All @@ -120,7 +131,7 @@ export const bulletListItemGenerators = createNodeGenerators(

(generatorState, node) => {
const bullet = node.parent instanceof RstEnumeratedList
? `${node.getEnumeratedListValue()}. `
? `${node.getEnumeratedListValue(generatorState)}. `
: `${node.bullet} `
const bulletWhitespace = ' '.repeat(bullet.length)

Expand Down
4 changes: 4 additions & 0 deletions src/RstNode/List/EnumeratedList.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@ export const enumeratedListParser: RstNodeParser<RstNodeType.EnumeratedList> = {
}

const listType = getEnumeratedListType(listItems[0].bullet)
if (listType === null) {
return null
}

const endLineIdx = parserState.lineIdx
return new RstEnumeratedList(parserState.registrar, { startLineIdx, endLineIdx }, listItems, listType)
},
Expand Down
4 changes: 2 additions & 2 deletions src/RstNode/List/EnumeratedListType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export const enum RstEnumeratedListType {
RomanLower = 'RomanLower',
}

export function getEnumeratedListType(bulletValue: string): RstEnumeratedListType {
export function getEnumeratedListType(bulletValue: string): RstEnumeratedListType | null {
switch (true) {
case romanUpperRe.test(bulletValue):
return RstEnumeratedListType.RomanUpper
Expand All @@ -27,7 +27,7 @@ export function getEnumeratedListType(bulletValue: string): RstEnumeratedListTyp
return RstEnumeratedListType.AlphabetLower

default:
throw new Error('Failed to getEnumeratedListType')
return null
}
}

Expand Down

0 comments on commit 1482ee2

Please sign in to comment.