diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/AbstractExternalFilter.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/AbstractExternalFilter.java index b8d6f346bf7d..2aac13d32b30 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/AbstractExternalFilter.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/AbstractExternalFilter.java @@ -67,6 +67,8 @@ public abstract class AbstractExternalFilter { @NonNls protected static final String HTML = ""; @NonNls private static final String BR = "
"; @NonNls private static final String DT = "
"; + private static final Pattern CHARSET_META_PATTERN = + Pattern.compile("", Pattern.CASE_INSENSITIVE); protected static abstract class RefConvertor { private final Pattern mySelector; @@ -166,7 +168,7 @@ public abstract class AbstractExternalFilter { final InputStream inputStream = pi != null ? UrlConnectionUtil.getConnectionInputStreamWithException(urlConnection, pi) : urlConnection.getInputStream(); //noinspection IOResourceOpenedButNotSafelyClosed - return contentEncoding != null ? new InputStreamReader(inputStream, contentEncoding) : new InputStreamReader(inputStream); + return contentEncoding != null ? new MyReader(inputStream, contentEncoding) : new MyReader(inputStream); } @Nullable @@ -207,7 +209,7 @@ public abstract class AbstractExternalFilter { } protected void doBuildFromStream(String surl, Reader input, StringBuffer data) throws IOException { - final BufferedReader buf = new BufferedReader(input); + BufferedReader buf = new BufferedReader(input); Matcher anchorMatcher = ourAnchorsuffix.matcher(surl); @NonNls String startSection = ""; @NonNls String endSection = "SUMMARY ========"; @@ -223,12 +225,22 @@ public abstract class AbstractExternalFilter { data.append(HTML); String read; - + String charset = null; do { read = buf.readLine(); + if (read != null && read.contains("charset")) { + charset = read; + } } while (read != null && read.toUpperCase().indexOf(startSection) == -1); + if (input instanceof MyReader && charset != null) { + String contentEncoding = parseContentEncoding(charset); + if (contentEncoding != null) { //restart page parsing with correct encoding + input = new MyReader(((MyReader)input).getInputStream(), contentEncoding); + buf = new BufferedReader(input); + } + } if (read == null) { data.delete(0, data.length()); @@ -275,6 +287,15 @@ public abstract class AbstractExternalFilter { data.append(HTML_CLOSE); } + @Nullable + private static String parseContentEncoding(String charset) { + final Matcher matcher = CHARSET_META_PATTERN.matcher(charset); + if (matcher.matches()) { + return matcher.group(1); + } + return null; + } + private static void appendLine(final StringBuffer buffer, final String read) { buffer.append(read); buffer.append("\n"); @@ -356,4 +377,22 @@ public abstract class AbstractExternalFilter { myExceptions[0] = null; } } + + private static class MyReader extends InputStreamReader { + private InputStream myInputStream; + + public MyReader(InputStream in) { + super(in); + myInputStream = in; + } + + public MyReader(InputStream in, String charsetName) throws UnsupportedEncodingException { + super(in, charsetName); + myInputStream = in; + } + + public InputStream getInputStream() { + return myInputStream; + } + } } diff --git a/platform/lang-impl/src/com/intellij/refactoring/ui/NameSuggestionsField.java b/platform/lang-impl/src/com/intellij/refactoring/ui/NameSuggestionsField.java index 22994aeced58..ccdf4202f269 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/ui/NameSuggestionsField.java +++ b/platform/lang-impl/src/com/intellij/refactoring/ui/NameSuggestionsField.java @@ -118,7 +118,7 @@ public class NameSuggestionsField extends JPanel { public void run() { Editor editor = getEditor(); if (editor == null) return; - final int pos = editor.getDocument().getText().indexOf('.'); + final int pos = editor.getDocument().getText().lastIndexOf('.'); if (pos > 0) { editor.getSelectionModel().setSelection(0, pos); editor.getCaretModel().moveToOffset(pos); diff --git a/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java b/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java index 1b0ecf5a0fd1..889c1bf95960 100644 --- a/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java +++ b/platform/platform-impl/src/com/intellij/ide/CommandLineProcessor.java @@ -128,6 +128,7 @@ public class CommandLineProcessor { String command = args.get(0); for(ApplicationStarter starter: Extensions.getExtensions(ApplicationStarter.EP_NAME)) { if (starter instanceof ApplicationStarterEx && command.equals(starter.getCommandName())) { + LOG.info("Processing command with " + starter); ((ApplicationStarterEx) starter).processExternalCommandLine(ArrayUtil.toStringArray(args)); return null; }