void (@NotNull ConsoleView consoleView, @Nullable Notification notification, @NotNull String text) { String content = StringUtil.convertLineSeparators(text); while (true) { Matcher tagMatcher = TAG_PATTERN.matcher(content); if (!tagMatcher.find()) { consoleView.print(content, ConsoleViewContentType.ERROR_OUTPUT); break; } String tagStart = tagMatcher.group(); consoleView.print(content.substring(0, tagMatcher.start()), ConsoleViewContentType.ERROR_OUTPUT); Matcher aMatcher = A_PATTERN.matcher(tagStart); if (aMatcher.matches()) { final String href = aMatcher.group(2); int linkEnd = content.indexOf(A_CLOSING, tagMatcher.end()); if (linkEnd > 0) { String linkText = content.substring(tagMatcher.end(), linkEnd).replaceAll(TAG_PATTERN.pattern(), ""); consoleView.printHyperlink(linkText, new HyperlinkInfo() { @Override public void navigate(@NotNull Project project) { if (notification != null && notification.getListener() != null) { notification.getListener().hyperlinkUpdate( notification, IJSwingUtilities.createHyperlinkEvent(href, consoleView.getComponent())); } } }); content = content.substring(linkEnd + A_CLOSING.length()); continue; } } if (NEW_LINES.contains(tagStart)) { consoleView.print("\n", ConsoleViewContentType.SYSTEM_OUTPUT); } else { consoleView.print(content.substring(tagMatcher.start(), tagMatcher.end()), ConsoleViewContentType.ERROR_OUTPUT); } content = content.substring(tagMatcher.end()); } consoleView.print("\n", ConsoleViewContentType.SYSTEM_OUTPUT); }