ã¿ãŒããã«ãšãã¥ã¬ãŒã¿ã¯ãã€ããŒãªã³ã¯ããµããŒããå§ããŠããŸãã å€ãã®ç«¯æ«ã¯é·ãéURLãæ€åºããŠãªã³ã¯ããŠãããããã³ãã³ãã¯ãªãã¯ãŸãã¯ControlããŒãæŒããªããã¯ãªãã¯ããŠãã©ãŠã¶ãéãããšãã§ããŸãããèŠèŠããé·ãURLãç»é¢ã«å°å·ããå¿ èŠããããŸããã 2017幎æ¥ã®æç¹ã§ããªã³ã¯ããã¹ããšå®å ãå¥ã ã«æå®ã§ãããªã³ã¯ã®ãããªHTMLã®ãµããŒããéå§ãã端æ«ã
iTerm2 3.1ã®äŸïŒ
è¯ãã¢ã€ãã¢ãPRæè¿ïŒ
ãããæšæºã«ãªããæ§æ解æã容æã«ãªãå¯èœæ§ããããŸãã
é¢é£ããåé¡ïŒ https ïŒ
æ倧ã®å©ç¹ã¯ãé·ãURLã§ç«¯æ«ãã¹ãã ããããšãªãããã¹ãããªã³ã¯ã§ããããšã§ãã ããšãã°ããšã©ãŒã¡ãã»ãŒãžã®ããã¥ã¡ã³ãã«ãåé·ã«ããããšãªããªã³ã¯ã§ããŸãã
ããã¯æ³šæããŠå®è£ ããå¿ èŠããããŸãããªã³ã¯ã«ã«ãŒãœã«ãåããããšããªã³ã¯ãã©ãã«ã€ãªãããã確èªã§ããå¿ èŠããããŸããããããªããšããŠãŒã¶ãŒãç¡æèã®ãã¡ã«æªæã®ãããµã€ãã«ãªã³ã¯ããå¯èœæ§ããããŸãã ããã¯ãé»åã¡ãŒã«ãã£ãã·ã³ã°ã§ã¯ãã§ã«å€§ããªåé¡ã§ãã
ããšãã°ããlogin.facebook.comããšããã¿ã€ãã«ã®ãªã³ã¯ãäœæããå®éã«ã¯ãããlogin.faceboook.comã«ãªã³ã¯ããŠãããŒãžã¯ãŸã£ããåãã«èŠããŸããããã°ã€ã³æã«ãŠãŒã¶ãŒã®ãã¹ã¯ãŒããä¿åããããšãã§ããŸãã
iTerm2ã¯æ¬¡ã®ãããªURLã衚瀺ããŸãïŒ
ããã¯ããªã³ã¯ã«ã«ãŒãœã«ãåããããšãã«ChromeãURLã衚瀺ããæ¹æ³ã«ã䌌ãŠããŸãã
/ãããå®è£
ãããŠããå Žåã¯ããã®æ©èœã®ãµããŒããæ€åºããããšãç®çãšããåé¡ãŸãã¯PRãsupports-hyperlinks
ã«éä¿¡ããŠãã ããã
@jamestalmageããã¯ããããTERM_PROGRAM
ãŸãã
@ Tyriar-ãã®å Žåããããããããå®è¡ããã³ããããšããããåºããªããšãã®ãªãªãŒã¹ããŒãã«supports-hyperlinks
ãžã®åç
§ãå«ããã ãã§ãã ä»ã®èšèªã«çžåœããsupports-hyperlinks
ããããã©ããã¯ããããŸããããããå Žåã¯ããããããããã«ã€ããŠãèšåãã䟡å€ããããŸãã
æŠå¿µå®èšŒã®å®è£ ããããŸãã
ãããã®ãªã³ã¯ã¯å®éã«ã¯ãããã¡ã«ä¿åãããªãããããŠã£ã³ããŠã®ãµã€ãºãå€æŽãããšæ¶ããŠããŸããšããæ ¹æ¬çãªåé¡ããããŸãã 代ããã«ããªã³ã¯æ
å ±ãä¿åãããŠããã«MouseZoneManager
ã«ãã£ãŠã¯ãªã¢ããã_mouseZoneManager.clearAll
ã
å®éã®ä¿®æ£ã¯ããããã¡ã®åå®è£ ãå®äºãããŸã§åŸ ããªããã°ãªããªããšæããŸãã ãµã€ãºå€æŽæã«å®å®ããŠãããã»ã«ãã»ã«ç¯å²ã«æ³šéãä»ããã¡ã«ããºã ãå¿ èŠã§ãã
ïŒãŸãã¯ããã®ã³ãŒãããŒã¹ã«æ £ããŠããªãããã«ãäœãã足ããªãã ããããããŸãããïŒ
å®éã®ä¿®æ£ã¯ããããã¡ã®åå®è£ ãå®äºãããŸã§åŸ ããªããã°ãªããªããšæããŸãã ãµã€ãºå€æŽæã«å®å®ããŠãããã»ã«ãã»ã«ç¯å²ã«æ³šéãä»ããã¡ã«ããºã ãå¿ èŠã§ãã
@PerBothnerããããªãã¯ããããæ£ããã§ãã ãããåºè·å¯èœã«ãªãåã«èæ ®ããå¿ èŠããããã1ã€ã®ããšã¯ãåºã«ãªãURLãxterm.jsããå ¬éãããåã蟌ã¿è ãUIã«è¡šç€ºã§ããããã«ããæ¹æ³ã§ãã ãŸããã»ãã¥ãªãã£äžã®çç±ãããããã©ã«ãã§ãªãã«ããããšãã§ããŸãïŒURLã¯ããã©ã«ãã§è¡šç€ºãããªãããïŒã
ããããæŽæ°ããŠãã©ã³ãã«ããã·ã¥ããŸããïŒ https ïŒ
ãã ãããã«ãªã¯ãšã¹ãã®æºåã¯ã§ããŠããŸãããåè¿°ã®ããŸããŸãªåé¡ã¯è§£æ±ºãããŠããŸããã
ããã䜿çšããããã®APIã®ææ¡ïŒ
export class Terminal {
/**
* Adds a handler for the ANSI hyperlink escape `\x1b]8;;url\alabel\x1b]8;;`, you should use
* this API to display the full URL to the user. Note that ANSI hyperlinks will only work if
* there is a handler for security reasons.
* <strong i="6">@param</strong> onHover The callback that fires when the mouse enters a link's zone.
* <strong i="7">@param</strong> onLeave The callback that fires when the mouse leaves a link's zone.
* <strong i="8">@return</strong> An IDisposable which can be used to disable the handler.
*/
addAnsiHyperlinkHandler(onHover: (event: MouseEvent, url: string) => void, onLeave: () => void): IDisposable;
}
APIã·ã§ã€ãã«é¢ãã@ mofux @ jerchãã£ãŒãããã¯ïŒ ãããã®åœ¢åŒã«ã€ããŠè©±ããŠããã¹ã¬ããã¯èŠã€ãããŸãããã set
ããã®ãçã«ããªã£ãŠããããã add
ã§ã¯ãªãset
ã«ããå¿
èŠããããŸãã
ãŸãã ILinkHoverEvent
ãããªãã®ã䜿çšããæ¹ãè¯ããããããŸããïŒ
interface ILinkHoverEvent {
// Maybe the cell the mouse is under is also needed?
x1: number;
y1: number;
x2: number;
y2: number;
url: string;
}
export class Terminal {
addAnsiHyperlinkHandler(onHover: (event: ILinkHoverEvent) => void, onLeave: () => void): IDisposable;
}
å¥ã®éžæè¢ïŒ
interface ILinkHoverEvent {
linkStart: Cell;
linkEnd: Cell;
mousePosition: Cell;
url: string
}
@TyriarIMOãã®ããã«å¥ã®ãã³ãã©ãŒãäœæããããšã¯ããŸãæå³ããããŸããã ãã®APIã䜿çšããå¯èœæ§ãé«ãã®ã¯ããªã³ã¯ãããããã¹ãã«ã«ãŒãœã«ãåããããšããŒã«ãããã«URLãã¬ã³ããªã³ã°ããã¬ã³ãã©ãŒã§ãã ãã¶ãã onLinkHover
ãšonLinkLeave
ã®åè¿°ã®ããã¯ã䜿çšããŠãªã³ããã¡ã€ã¢ãæ¡åŒµãããããã®ansiãã€ããŒãªã³ã¯ãçŸåšã®Webãªã³ã¯ãšåãããã«åŠçããã®ã¯çã«ããªã£ãŠããŸããïŒ
ãã®APIã䜿çšããå¯èœæ§ãé«ãã®ã¯ãããŒã«ãããã§URLãã¬ã³ããªã³ã°ããã¬ã³ãã©ãŒã§ãã
@mofuxç§ã¯æ€çŽ¢ã¢ããªã³ã®ããã«èããŠããŸãããITerminalOptions.enableAnsiHyperlinks
ãèšå®ããŠãããšæããŸããããã®çç±ã詳ãã説æããŸããïŒ
æ¢åã®ãªã³ã¯APIã«ããŒãžãããªããã€ã³çšã«
ITerminalOptions.enableAnsiHyperlinks
ãèšå®ããŠãããšæããŸããããã®çç±ã詳ãã説æããŸããïŒ
åã蟌ã¿è ããã®æ©èœããµããŒãããããã®ã¹ããŒãªãŒã¯ã©ãã§ããããïŒ ãªã³ã¯ãããããã¹ããã¯ãªãã¯ãããšãã«ïŒé衚瀺ã®ïŒãªã³ã¯ãéãããšã¯æœåšçã«å±éºã§ã-ç¹ã«ãªã³ã¯ãããURLãã©ãã«ã衚瀺ãããŠããªãå Žåð€
ã¿ãŒã²ãããåãã£ãŠè¡šç€ºããã®ã¯ç¢ºãã«çŽ æŽãããããšã§ããããäžæãªãURLãéãããšã«åé¡ã¯ãªããšæããŸãã ã»ãã¥ãªãã£ã®åŽé¢ã¯ãä»æ§ã®äžã®ã³ã¡ã³ãã§èª¬æãããŠããŸãã ãã©ãŠã¶ã¯åžžã«ãäžæãªãURLãéããŸããããšãã°ãã¿ãŒã²ãããéãçŽåã«ã¿ãŒã²ãããå€æŽããJSã³ãŒããããå Žåãå€ãã®å ŽåããŠãŒã¶ãŒã«ãé©åãªãURLã衚瀺ããŸãããå®éã«ã¯ãªãã€ã¬ã¯ã¿ãä»ããŠéããŸãã
ããããã°...ä»ã®ãšããç§ã«ã¯èµ·ãããªãã£ãããšã...
xterm.jsãå®éã®ãã©ãŠã¶å ã§å®è¡ãããŠããŠããã®ãã©ãŠã¶ã®æ°ããã¿ãã§ãªã³ã¯ãéããå Žåã[ãªãã¡ã©ãŒ]ãã£ãŒã«ãããxterm.jsã®URLãæŒæŽ©ããã®ã¯å¿é ãªããšã ãšæããŸãã rel = "noreferrer"ã®çŸåšã®ãµããŒãã«ã€ããŠã¯ããããŸãããã䜿çšããå¿ èŠãããããã§ãã
ãããŒããã¹ãã®ãã®é¢é£ãã説æãåç
§ããŠãã ããã ããã¯ãåºåã®ã»ã¯ã·ã§ã³ã«ãããŒã«ããããããã®ä»ã®ããŠã¹ãªãŒããŒãããã¢ããã§æ³šéãä»ããããšã«é¢ããåé¡ã§ããããã¯ããªã³ã¯ã«ã«ãŒãœã«ãåããããšãã«URLã衚瀺ããããšãšåãã§ã¯ãããŸããã ãã ããã©ã¡ããåãã¡ã«ããºã ã䜿çšããŠå®éã®ãããŒããã¹ãã衚瀺ãããå ŽåããããŸãã ã©ã¡ããããããMouseZoneManager
ãå©çšããã§ãããã
XSSã®å°é家ãã¶ãã¶ãããŠããŸããïŒ ãã¶ãç§ãã¡ã¯ç£æ»ãå¿ èŠã§ããç¬ã
ãã©ãŠã¶ã®ã»ãã¥ãªãã£ã«é¢ããç§ã®éãããç¥èã§ã¯ãxterm.jsã䜿çšããäž»ãªæ»æãã¯ãã«ã¯ãã¿ãŒããã«ãšãã©ãŠã¶ã®å¢çãè¶ããããŒã¿ã§ãã
åé¡ã¯ã-ã¿ãŒããã«ïŒããŒã¿ïŒ-ãã©ãŠã¶ïŒJSïŒã®å¢çãURLãšäº€å·®ãããå¯èœæ§ã¯ãããŸããïŒ ããã§ãããã©ãŠã¶ã®ã»ãã¥ãªãã£ã«é¢ããç§ã®éãããç¥èã¯ããŸã圹ã«ç«ã¡ãŸããã ç§ãèããããšãã§ããå¯äžã®ã·ããªãªã¯ãããŒãžã®JSã«èªåèªèº«ãæ¿å ¥ããããã¯ããŒã¯ã¬ããã§ãã åžžã«æ°ãããŠã£ã³ããŠ/ã¿ãã§ã®ã¿éãããšã§ãããåé¿ã§ãããã©ããã¯ããããŸããïŒhttpOnlyã§ãªãå Žåã§ããã»ãã·ã§ã³ã¯ãªãŒã¯ãããšæããŸããïŒWebSocketæ¥ç¶ã¯ã©ãã§ããïŒïŒããã«ãããURLã解æããå¿ èŠããããšæããŸããJSã«èŠããã³ã³ãã³ãããåé€ããŸãã
ç·šéïŒWebSocketã¯ãã©ãŠã¶ã®ã»ãã¥ãªãã£èšå®ã®ã»ãšãã©ãèŠéããŠããããšã«æ³šæããŠãã ãããä¿¡é Œã§ããåäžçæå ãã§ãã¯ãããããŸããïŒãããå¿ èŠãªå Žåã¯ajaxãã³ã°ããŒãªã³ã°ã䜿çšããŠãã ããïŒã ããŒã...
ããã¯ããŒã¯ã¬ãã[...]ãJSã«èŠããã³ã³ãã³ãããåé€ããŸã
ãhttpïŒ//ãããhttpsïŒ//ãããããããftpïŒ//ãã§å§ãŸãURLã®ã¿ããã¯ã€ããªã¹ãã«ç»é²ãããã以å€ã¯æåŠããããšããå§ãããŸãã ãŸãã¯ãå°ãªããšãã¹ããŒã ã®æ¬ åŠãšãjavascriptïŒãããã©ãã¯ãªã¹ãã«ç»é²ããŸãã
ãã€ããŒãªã³ã¯ãã©ã³ãã«ãã¯ãªãã¯æã«èšå®å¯èœãªã³ãŒã«ããã¯é¢æ°ã®ãããhttps://github.com/PerBothner/xterm.js/commit/b2647b90d301c52229d01720800865a0d39f436fãè¿œå ããŸããã ããã«ããããªã³ã¯ã®åŠçæ¹æ³ãå€æŽã§ããŸãã ããšãã°ã DomTermãls --hyperlink=auto
åŸã«xterm.jsãã©ã³ãã䜿çšããããã«æ§æãããŠããå Žåãã»ãšãã©ã®ãã¡ã€ã«åã§èšå®ã«ãã£ãŠã¯ãhtmlãã¡ã€ã«ã§ããã©ã«ãã®ãã©ãŠã¶ãŒã§ãã¡ã€ã«ãéã
ïŒãããã¿ã€ãã«ã¯å€å°ã®ãã¬ãŒã¯ãããããšã«æ³šæããŠãã ããããããDomTermãããã¿ã€ãã«åºæã®ãã®ã§ãããã©ããã¯ããããŸãããïŒ
ãã©ãŠã¶ã¯åžžã«ãäžæãªãURLãéããŸããããšãã°ãã¿ãŒã²ãããéãçŽåã«ã¿ãŒã²ãããå€æŽããJSã³ãŒããããå Žåãå€ãã®å ŽåããŠãŒã¶ãŒã«ãé©åãªãURLã衚瀺ããŸãããå®éã«ã¯ãªãã€ã¬ã¯ã¿ãä»ããŠéããŸãã
ãã©ãŠã¶ã®@egmontkobã¯ãéåžžãæ€çŽ¢ãšã³ãžã³ã®ãããªå®å šãªå Žæããéå§ããŸããæ€çŽ¢ãšã³ãžã³ã¯ããã¡ã€ã³ããã€ã§ããããéåžžã«æ確ã«ç€ºããŸãã ã¿ãŒããã«ã®å Žåãããã°ã©ã ãä¿¡é Œããå¿ èŠãããïŒãã®äžéšã¯ãªã¢ãŒãã³ã³ãã³ããå°å·ããå¯èœæ§ããããŸãïŒããã¡ã€ã«ããã£ããããã ãã§ãæªæã®ãããªã³ã¯ã衚瀺ãããå¯èœæ§ããããŸãã ããã©ã«ãã§å®å šã§ããããªã¹ã¯ã説æãã軜æžçãæäŸããã ãã®èšå®ãèšå®ããã®ãæåã®ããã§ãã
ãã€ããŒãªã³ã¯ãã©ã³ãã«ãã¯ãªãã¯æã«èšå®å¯èœãªã³ãŒã«ããã¯é¢æ°ã®ãããPerBothner @ b2647b9ãè¿œå ããŸããã
@PerBothnerã¯ãã§ã«webLinksã¢ããªã³ã«ãã³ãã©ãŒããããŸãïŒ https ïŒ
ïŒå¿çãé ããŠç³ãèš³ãããŸãã-ç§ã¯èéã«è¿œãããããŸãããïŒ
@Tyriarã¯ããwebLinksã¢ããªã³ã«ã¯ãã§ã«ãã³ãã©ãŒããããŸãããšæžããŠããŸãã åé¡ã¯ãwebLinksInitãILinkMatcherãäœæããæå®ããããã³ãã©ãŒããäžèŽããæ£èŠè¡šçŸã®ã»ãããå«ãç¹å®ã®ILinkMatcherã«é¢é£ä»ããããšã§ãã ãããããšã¹ã±ãŒãã·ãŒã±ã³ã¹ã«ãã£ãŠäœæãããæ£èŠè¡šçŸã®äžèŽã®çµæã§ã¯ãªããã€ããŒãªã³ã¯ã®ãªã³ã¯ãã³ãã©ãŒãã©ã®ããã«æå®ããã®ã§ããããã ãã®ãã³ãã©ãŒã¯ãILinkMatcherãŸãã¯æ£èŠè¡šçŸã«é¢é£ä»ããããŠããªããšããæå³ã§ãã°ããŒãã«ãã§ããå¿ èŠããããŸãã webLinksInitãŸãã¯Terminal.registerLinkMatcherã䜿çšããŠãã®ã°ããŒãã«/ããã©ã«ããã³ãã©ãŒãèšå®ããããšã¯æ©èœããŸããã
æã
ãå¿
èŠãšç§ã«ã¯æããlinkHandler
æã€-ã¿ãŒããã«å
ã®ãã£ãŒã«ãhandler
ã§ãã£ãŒã«ããILinkMatcher
ååã§ã¯ãããŸãããã ãŸãã Terminal
ã«linkHandler
ãã£ãŒã«ããªã©ãããå Žåã¯ããã®ãã³ãã©ãŒãregisterLinkMatcherã§äœ¿çšãããããã©ã«ãã«ããã®ãçã«ããªã£ãŠããŸãã ããã¯ç§ã®ããããè¡ãããšã§ãã
誰ãããããæäŒãããå Žåã¯ã次ã®ããšãå¿ èŠã§ãã
IMarker
sãšããŠïŒç§ã®ãã€ããŒãªã³ã¯ãã©ã³ãhttps://github.com/PerBothner/xterm.js/tree/hyperlinksãåºçºç¹ã«ãªããŸãã ïŒå°ãå€ãã®ã§ãããåäœããªããããããŸããããïŒ
äžèšã®æ¯åºã®ç¶æ³ã¯ã©ããªã£ãŠããŸããïŒ èª°ããããã«åãçµãã§ããŸããïŒ
@Tyriarã¯ãå¿
èŠãªæé ãããŸããªã¹ãããŸããã ãããã®æé ã®ãããããå®è¡ãããŸãããïŒ
@ Jma353誰ããããã«ç©æ¥µçã«åãçµãã§ãããšã¯æããªãã®ã§ãå¿ èŠãªããããèªç±ã«å®è£ ããŠãã ããã
@Tyriarä»æ§ã®è©³çŽ°ããã¹ãŠèªãã InputHandler.print
ãªãŒããŒããŒãã®ãããªãã®ã ãã®ããã«äœæãããŠããã®ã¯ã¡ãã£ãšå¥åŠã§ãïŒããã¯ã端æ«ã®ç¶æ
ãããŒãµãŒã«ããããåŒã蟌ã¿ãŸãããããŸã§ã®ãšãããä»ã®ãšã¹ã±ãŒãã·ãŒã±ã³ã¹ã¯å®è¡ãããŠããŸããïŒãããã®éã«å°å·ãã³ãã©ãŒã眮ãæããããšã§å®è¡ã§ããã¯ãã§ãã
@jerchãããããŒãµãŒã®å€æŽãå¿ èŠã«ãªããŸãã ã©ããããããªã³ã¯ã®ãµã€ãºå€æŽã¯ã確å®ã«æ©èœããããã«ããå¿ èŠãããå Žåã§ãã
VS Codeã¯ããªã³ã¯ã®è©³çŽ°ãªãããŒã®è¡šç€ºããµããŒãããããã«ãªã£ãããããããããã«æ¥ç¶ãããšåé¡ã解決ããŸãã
ããŒãµãŒããã¯ãã«ããŒããŠããªãã®ã§ãå°ãå¥åŠãªã·ãŒã±ã³ã¹ã§ããã®ã¯æ®å¿µã§ãã ãããããªããããã¯ããŒãµãŒããã¯ãããŒã«ãŒããªã³ã¯ãããã€ããŒAPIã䜿çšããŠã¢ããªã³ãšããŠå®å šã«è¡ãããšãã§ããŸãã
@ Tyriar ïŒ2751ã§ããæ¡åŒµattrã¹ãã¬ãŒãžã䜿çšããŠãURLã®ãã®ããããã¡ãŒã»ã«ã«æ³šéãä»ããããšãã§ããŸãã
ããŒãµãŒããã¯ãã«ããŒããŠããªãã®ã§ãå°ãå¥åŠãªã·ãŒã±ã³ã¹ã§ããã®ã¯æ®å¿µã§ãã ãããããªããããã¯ããŒãµãŒããã¯ãããŒã«ãŒããªã³ã¯ãããã€ããŒAPIã䜿çšããŠã¢ããªã³ãšããŠå®å šã«è¡ãããšãã§ããŸãã
ãããããã¯åé¡ã§ãããããªã³ããã³ãã©ãŒããã¯ãå ¬éãããšããŠããã¢ããªã³ã¬ãã«ã§imhoã解決ããããšã¯ã§ããŸããã ããã¯ãã³ãŒãããŒã¹ã«å ããŠããã€ãã®äŸå€çãªæ¡ä»¶ã«çŽæ¥å ¥ãå¿ èŠããããšæããŸãïŒãã¡ã€ãã©ã€ã¶ãŒãæ¿èªãããåã®éå°å·ã¢ã¯ã·ã§ã³ã¯ãã»ã«ã®URLããŒãã³ã°ãªã©ãå£ãã¯ãã§ãïŒã
æãåèã«ãªãã³ã¡ã³ã
iTerm2ã¯æ¬¡ã®ãããªURLã衚瀺ããŸãïŒ
ããã¯ããªã³ã¯ã«ã«ãŒãœã«ãåããããšãã«ChromeãURLã衚瀺ããæ¹æ³ã«ã䌌ãŠããŸãã