Skip to content

Commit

Permalink
fix(detection): better <script/> detect, close #623
Browse files Browse the repository at this point in the history
  • Loading branch information
antfu committed Jul 16, 2021
1 parent 38a5c47 commit 67dc0b0
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 57 deletions.
15 changes: 11 additions & 4 deletions src/extraction/parsers/html.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Parser } from 'htmlparser2'
import { DefaultDynamicExtractionsRules, DefaultExtractionRules, ExtractionRule } from '../rules'
import { shouldExtract } from '../shouldExtract'
import { ExtractionHTMLOptions } from './options'
import { shiftDetectionPosition } from './utils'
import { DetectionResult } from '~/core/types'

const defaultOptions: Required<ExtractionHTMLOptions> = {
Expand All @@ -16,7 +17,8 @@ export function detect(
rules: ExtractionRule[] = DefaultExtractionRules,
dynamicRules: ExtractionRule[] = DefaultDynamicExtractionsRules,
userOptions: ExtractionHTMLOptions = {},
) {
extractScripts?: (script: string, start: number) => DetectionResult[],
): DetectionResult[] {
const {
attributes: ATTRS,
ignoredTags: IGNORED_TAGS,
Expand Down Expand Up @@ -80,6 +82,14 @@ export function detect(
}
},
ontext(fullText) {
const start = parser.startIndex
const end = parser.endIndex! + 1

if (extractScripts && lastTag === 'script') {
detections.push(...shiftDetectionPosition(extractScripts(fullText, start), start))
return
}

if (IGNORED_TAGS.includes(lastTag))
return

Expand All @@ -88,9 +98,6 @@ export function detect(
if (!shouldExtract(text, rules))
return

const start = parser.startIndex
const end = parser.endIndex! + 1

detections.push({
text: fullText,
fullText,
Expand Down
34 changes: 8 additions & 26 deletions src/frameworks/svelte.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,36 +38,18 @@ class SvelteFramework extends Framework {
detectHardStrings(doc: TextDocument) {
const text = doc.getText()

const result: DetectionResult[] = []

result.push(
...extractionsParsers.html.detect(
text,
return extractionsParsers.html.detect(
text,
DefaultExtractionRules,
DefaultDynamicExtractionsRules,
Config.extractParserHTMLOptions,
// <script>
script => extractionsParsers.babel.detect(
script,
DefaultExtractionRules,
DefaultDynamicExtractionsRules,
Config.extractParserHTMLOptions,
),
)

// <script>
const scriptMatch = text.match(/(<script[^>]*?>)([\s\S*]*?)<\/script>/)
if (scriptMatch && scriptMatch.index != null && scriptMatch.length > 2) {
const index = scriptMatch.index + scriptMatch[1].length
const code = scriptMatch[2]

result.push(
...shiftDetectionPosition(
extractionsParsers.babel.detect(
code,
DefaultExtractionRules,
DefaultDynamicExtractionsRules,
),
index,
),
)
}

return result
}
}

Expand Down
35 changes: 8 additions & 27 deletions src/frameworks/vue.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { Framework } from './base'
import { LanguageId } from '~/utils'
import { DefaultDynamicExtractionsRules, DefaultExtractionRules, extractionsParsers } from '~/extraction'
import { Config, DetectionResult } from '~/core'
import { shiftDetectionPosition } from '~/extraction/parsers/utils'

class VueFramework extends Framework {
id = 'vue'
Expand Down Expand Up @@ -68,36 +67,18 @@ class VueFramework extends Framework {
detectHardStrings(doc: TextDocument) {
const text = doc.getText()

const result: DetectionResult[] = []

result.push(
...extractionsParsers.html.detect(
text,
return extractionsParsers.html.detect(
text,
DefaultExtractionRules,
DefaultDynamicExtractionsRules,
Config.extractParserHTMLOptions,
// <script>
script => extractionsParsers.babel.detect(
script,
DefaultExtractionRules,
DefaultDynamicExtractionsRules,
Config.extractParserHTMLOptions,
),
)

// <script>
const scriptMatch = text.match(/(<script[^>]*?>)([\s\S*]*?)<\/script>/)
if (scriptMatch && scriptMatch.index != null && scriptMatch.length > 2) {
const index = scriptMatch.index + scriptMatch[1].length
const code = scriptMatch[2]

result.push(
...shiftDetectionPosition(
extractionsParsers.babel.detect(
code,
DefaultExtractionRules,
DefaultDynamicExtractionsRules,
),
index,
),
)
}

return result
}
}

Expand Down

0 comments on commit 67dc0b0

Please sign in to comment.