// TypeScript React
/** @author Willy
* @url https://reactjs.org/ **/
import React from 'react';
import { PhotoStory, VideoStory } from './stories';
function Story(props) {
const SpecificStory = components[props.storyType];
return story={ props.story } attr2="&ref;" attr3="Hello\n" />;
}
function
attr1={/> function return class var 0x123 {} &noRef; hello() React.Component() } attr2="&ref;">
/* no comment*/ function /> return class var 0x123 &ref; hello() React.Component()
./> anyWord />{ function return class var 0x123 hello() React.Component() }>
> >
> >
> >
/*comment*/attr1/*comment*/= /*comment*/"value"/*comment*/attr2 /*comment*/attr3='a' key/*comment*/key2 />
// Detect Valid tags
/* comment */>>
{ /* comment
*//>
word . }
return /* comment
multiline *//>/* comment *//>
&& /*comment*//>
& /*comment*//>{ >Hello> }
?/>;
[ /> ( />
,/> =/>
&&/> ||/>
return /> ;
default/> ;
> > />> return >
anyWord
anyWord/*comment*/
.
& |
% /* comment*/
// TODO: Fix this (comment before the tag name):
var x = </**/div>;
// Tag after ":"
annotation: />
annotation: text [/>]
console.log("hello")
// Type assertion in tag
/>> >
/>
// Non-ASCII tag name & attribute
<日本語>日本語>;
本本:本-本 aa本:本 aa:aa />/>/>;
{ ... x } y
={2 } z />;
let k1 =
a={10} b="hi" {...o} >
hi hi hi!
>;
let k2 =
a={10} b="hi">
> My Div
>
{(name: string) =>
> My name {name}
>}>;
let k3 = initialValues={{ x: "y" }} nextValues={a => ({ x: a.x })}/>; // No Error
// OK
let k1 = a={10} b="hi"><>>>;
let k2 = a={10} b="hi"><>>;
let k3 = a={10} b="hi"><>>;
let k4 = a={10} b="hi"><>>;
// OK
let k1 =
>
> Hello
>
> world
>
>;
let k2 =
>
> Hello
> {(user: any) =>
>{user.name}
>}
>;
let k3 =
> {1}{"That is a number"}
>;
let k4 = >;
// Empty tags
hello<>
hello<>>; // no whitespace
< > >; // lots of whitespace
< /*starting wrap*/ > /*ending wrap*/>; // comments in the tags
<>hi>; // text inside
<>>hi>
>bye
>>; // children
<>>1><>>2.1>>2.2>>>3>>; // nested fragments
<>#>; // # would cause scanning error if not in jsxtext
// Tags after substitutions in templates
`aaa${>>//comment
/*comment*//>}`
// Don't highlight tags within type declaration
type T12 = ReturnType<(() => T)>;
type T13 = ReturnType<([]>() => T)>;
type T14 = ReturnType;
type T15 = ReturnType<(s: string) => void>;
// Don't highlight tags within variable declaration
let myIdentity: (arg: T) => T = />;
var myIdentity: (arg: U) => U = identity;
const myIdentity: {(arg: T): T} = identity;
// Don't highlight tags within interfaces and classes
interface GenericIdentityFn {(arg: T): T;
}
class Handler {
info: (arg: T): T ;
> >
}
// Highlight "(
arg: T
) => {
const a = arg
return a
}> text extends I/>> // Here "" is a tag
// Check character after tag name, do not highlight invalid tags
/* comment */ ?
/*comment*/#
// Conditionals expressions
let y = foo == null ? null : />;
let x = (foo === null || foo === undefined) ?
undefined :>hello>;
// Tagged template literals
tagFunc`
Hello world!
${ />; 22 + "11" }`;
obj.something.tagFunc`Setting ${setting} is ${value}!`;