parent
							
								
									7013e8f578
								
							
						
					
					
						commit
						e00aa56658
					
				@ -35,3 +35,29 @@ exports[`compiler: codeframe multi-line highlights 1`] = `
 | 
				
			|||||||
4  |  \\">
 | 
					4  |  \\">
 | 
				
			||||||
   |  ^"
 | 
					   |  ^"
 | 
				
			||||||
`;
 | 
					`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports[`compiler: codeframe newline sequences - unix 1`] = `
 | 
				
			||||||
 | 
					"8  |          <input name=\\"email\\" type=\\"text\\"/>
 | 
				
			||||||
 | 
					9  |        </div>
 | 
				
			||||||
 | 
					10 |        <div id=\\"hook\\">
 | 
				
			||||||
 | 
					   |        ^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					11 |          <label for=\\"password\\">Password</label>
 | 
				
			||||||
 | 
					   |  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					12 |          <input name=\\"password\\" type=\\"password\\"/>
 | 
				
			||||||
 | 
					   |  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					13 |        </div>
 | 
				
			||||||
 | 
					   |  ^^^^^^^^^^^^"
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports[`compiler: codeframe newline sequences - windows 1`] = `
 | 
				
			||||||
 | 
					"8  |          <input name=\\"email\\" type=\\"text\\"/>
 | 
				
			||||||
 | 
					9  |        </div>
 | 
				
			||||||
 | 
					10 |        <div id=\\"hook\\">
 | 
				
			||||||
 | 
					   |        ^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					11 |          <label for=\\"password\\">Password</label>
 | 
				
			||||||
 | 
					   |  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					12 |          <input name=\\"password\\" type=\\"password\\"/>
 | 
				
			||||||
 | 
					   |  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 | 
				
			||||||
 | 
					13 |        </div>
 | 
				
			||||||
 | 
					   |  ^^^^^^^^^^^^"
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
				
			|||||||
@ -43,4 +43,49 @@ attr
 | 
				
			|||||||
    const attrEnd = source.indexOf(`">`) + 1
 | 
					    const attrEnd = source.indexOf(`">`) + 1
 | 
				
			||||||
    expect(generateCodeFrame(source, attrStart, attrEnd)).toMatchSnapshot()
 | 
					    expect(generateCodeFrame(source, attrStart, attrEnd)).toMatchSnapshot()
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    const source = `
 | 
				
			||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div>
 | 
				
			||||||
 | 
					    <h1>Sign In</h1>
 | 
				
			||||||
 | 
					    <form>
 | 
				
			||||||
 | 
					      <div>
 | 
				
			||||||
 | 
					        <label for="email">Email</label>
 | 
				
			||||||
 | 
					        <input name="email" type="text"/>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					      <div id="hook">
 | 
				
			||||||
 | 
					        <label for="password">Password</label>
 | 
				
			||||||
 | 
					        <input name="password" type="password"/>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					    </form>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
					    const startToken = '<div id="hook">'
 | 
				
			||||||
 | 
					    const endToken = '</div>'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Explicitly ensure the line-ending for the platform instead of assuming
 | 
				
			||||||
 | 
					    // the newline sequences used in the source above.
 | 
				
			||||||
 | 
					    const unixNewlineSource = source.replace(/\r\n/g, '\n')
 | 
				
			||||||
 | 
					    const windowsNewLineSource = unixNewlineSource.replace(/\n/g, '\r\n')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    test('newline sequences - windows', () => {
 | 
				
			||||||
 | 
					      const keyStart = windowsNewLineSource.indexOf(startToken)
 | 
				
			||||||
 | 
					      const keyEnd =
 | 
				
			||||||
 | 
					        windowsNewLineSource.indexOf(endToken, keyStart) + endToken.length
 | 
				
			||||||
 | 
					      expect(
 | 
				
			||||||
 | 
					        generateCodeFrame(windowsNewLineSource, keyStart, keyEnd)
 | 
				
			||||||
 | 
					      ).toMatchSnapshot()
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    test('newline sequences - unix', () => {
 | 
				
			||||||
 | 
					      const keyStart = unixNewlineSource.indexOf(startToken)
 | 
				
			||||||
 | 
					      const keyEnd =
 | 
				
			||||||
 | 
					        unixNewlineSource.indexOf(endToken, keyStart) + endToken.length
 | 
				
			||||||
 | 
					      expect(
 | 
				
			||||||
 | 
					        generateCodeFrame(unixNewlineSource, keyStart, keyEnd)
 | 
				
			||||||
 | 
					      ).toMatchSnapshot()
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
				
			|||||||
@ -5,11 +5,22 @@ export function generateCodeFrame(
 | 
				
			|||||||
  start = 0,
 | 
					  start = 0,
 | 
				
			||||||
  end = source.length
 | 
					  end = source.length
 | 
				
			||||||
): string {
 | 
					): string {
 | 
				
			||||||
  const lines = source.split(/\r?\n/)
 | 
					  // Split the content into individual lines but capture the newline sequence
 | 
				
			||||||
 | 
					  // that separated each line. This is important because the actual sequence is
 | 
				
			||||||
 | 
					  // needed to properly take into account the full line length for offset
 | 
				
			||||||
 | 
					  // comparison
 | 
				
			||||||
 | 
					  let lines = source.split(/(\r?\n)/)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Separate the lines and newline sequences into separate arrays for easier referencing
 | 
				
			||||||
 | 
					  const newlineSequences = lines.filter((_, idx) => idx % 2 === 1)
 | 
				
			||||||
 | 
					  lines = lines.filter((_, idx) => idx % 2 === 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let count = 0
 | 
					  let count = 0
 | 
				
			||||||
  const res: string[] = []
 | 
					  const res: string[] = []
 | 
				
			||||||
  for (let i = 0; i < lines.length; i++) {
 | 
					  for (let i = 0; i < lines.length; i++) {
 | 
				
			||||||
    count += lines[i].length + 1
 | 
					    count +=
 | 
				
			||||||
 | 
					      lines[i].length +
 | 
				
			||||||
 | 
					      ((newlineSequences[i] && newlineSequences[i].length) || 0)
 | 
				
			||||||
    if (count >= start) {
 | 
					    if (count >= start) {
 | 
				
			||||||
      for (let j = i - range; j <= i + range || end > count; j++) {
 | 
					      for (let j = i - range; j <= i + range || end > count; j++) {
 | 
				
			||||||
        if (j < 0 || j >= lines.length) continue
 | 
					        if (j < 0 || j >= lines.length) continue
 | 
				
			||||||
@ -20,9 +31,12 @@ export function generateCodeFrame(
 | 
				
			|||||||
          }`
 | 
					          }`
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        const lineLength = lines[j].length
 | 
					        const lineLength = lines[j].length
 | 
				
			||||||
 | 
					        const newLineSeqLength =
 | 
				
			||||||
 | 
					          (newlineSequences[j] && newlineSequences[j].length) || 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (j === i) {
 | 
					        if (j === i) {
 | 
				
			||||||
          // push underline
 | 
					          // push underline
 | 
				
			||||||
          const pad = start - (count - lineLength) + 1
 | 
					          const pad = start - (count - (lineLength + newLineSeqLength))
 | 
				
			||||||
          const length = Math.max(
 | 
					          const length = Math.max(
 | 
				
			||||||
            1,
 | 
					            1,
 | 
				
			||||||
            end > count ? lineLength - pad : end - start
 | 
					            end > count ? lineLength - pad : end - start
 | 
				
			||||||
@ -33,7 +47,8 @@ export function generateCodeFrame(
 | 
				
			|||||||
            const length = Math.max(Math.min(end - count, lineLength), 1)
 | 
					            const length = Math.max(Math.min(end - count, lineLength), 1)
 | 
				
			||||||
            res.push(`   |  ` + '^'.repeat(length))
 | 
					            res.push(`   |  ` + '^'.repeat(length))
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          count += lineLength + 1
 | 
					
 | 
				
			||||||
 | 
					          count += lineLength + newLineSeqLength
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      break
 | 
					      break
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user