Changeset 1209


Ignore:
Timestamp:
Jul 12, 2011, 6:50:34 PM (6 years ago)
Author:
stefan
Message:
 
Location:
trunk
Files:
4 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/jlatexeditor/errorhighlighting/LatexCompiler.java

    r1149 r1209  
    100100    BufferedReader in = new BufferedReader(new InputStreamReader(latexCompiler.getInputStream()), 100000);
    101101    try {
    102       LatexCompileError error;
    103 
    104       ArrayList<String> fileStack = new ArrayList<String>();
    105       String versionString = in.readLine();
    106       errorView.appendLine(versionString);
    107       String line = in.readLine();
    108       errorView.appendLine(line);
    109       while (line != null) {
    110         // error messages
    111         Matcher errorMatcher = fileLineError.matcher(line);
    112         if (line.startsWith("!") || errorMatcher.matches()) {
    113           error = new LatexCompileError();
    114           error.setOutputLine(errorView.getLinesCount()-2);
    115           error.setType(LatexCompileError.TYPE_ERROR);
    116           if (line.startsWith("!")) {
    117             String fileName = fileStack.get(fileStack.size() - 1);
    118             error.setFile(SystemUtils.newFile(file.getParentFile(), fileName), fileName);
    119             error.setMessage(line.substring(1).trim());
    120           } else {
    121             String fileName = errorMatcher.group(1);
    122             error.setFile(SystemUtils.newFile(file.getParentFile(), fileName), fileName);
    123             error.setLine(Integer.parseInt(errorMatcher.group(2)));
    124             error.setMessage(errorMatcher.group(3).trim());
    125 
    126             // bug
    127             if (!fileStack.get(fileStack.size() - 1).equals(fileName)) fileStack.add(fileName);
    128           }
    129 
    130           while (line != null && !line.startsWith("l.")) {
    131             if (line.startsWith("<argument>")) {
    132               error.setCommand(line.substring("<argument>".length()).trim());
    133             }
    134             line = in.readLine();
    135             errorView.appendLine(line);
    136           }
    137 
    138           if (line == null) {
    139             compileError(error);
    140             continue;
    141           }
    142 
    143           if (line.startsWith("l.")) {
    144             int space = line.indexOf(' ');
    145             if (space == -1) space = line.length();
    146 
    147             try {
    148               error.setLine(Integer.parseInt(line.substring(2, space)));
    149             } catch (Exception e) {
    150               continue;
    151             }
    152 
    153             String before = line.substring(space + 1);
    154             if (before.startsWith("...")) before = before.substring(3);
    155             error.setTextBefore(before);
    156 
    157             int position = line.length();
    158             line = in.readLine();
    159             errorView.appendLine(line);
    160             error.setTextAfter(line.substring(position));
    161 
    162             compileError(error);
    163             line = in.readLine();
    164             errorView.appendLine(line);
    165             continue;
    166           } else {
    167             compileError(error);
    168             continue;
    169           }
    170         }
    171 
    172         if (line.startsWith("LaTeX Warning:") || line.startsWith("LaTeX Font Warning:")) {
    173           error = new LatexCompileError();
    174           error.setOutputLine(errorView.getLinesCount()-2);
    175           error.setType(LatexCompileError.TYPE_WARNING);
    176           String fileName = fileStack.get(fileStack.size() - 1);
    177           error.setFile(SystemUtils.newFile(file.getParentFile(), fileName), fileName);
    178 
    179           int linePos = line.indexOf("on input line ");
    180           if (linePos != -1) {
    181             linePos += "on input line ".length();
    182             try {
    183               error.setLine(Integer.parseInt(line.substring(linePos, line.indexOf('.', linePos))));
    184             } catch (Exception ignored) {
    185             }
    186           }
    187 
    188           StringBuffer errorMessage = new StringBuffer(line.substring(line.indexOf(':') + 1).trim());
    189           for (int i = 0; i < 5; i++) {
    190             line = in.readLine();
    191             errorView.appendLine(line);
    192             if (line.trim().equals("")) break;
    193           }
    194           error.setMessage(errorMessage.toString());
    195 
    196           compileError(error);
    197           line = in.readLine();
    198           errorView.appendLine(line);
    199           continue;
    200         }
    201 
    202         if (line.startsWith("Overfull \\hbox") || line.startsWith("Underfull \\hbox")) {
    203           error = new LatexCompileError();
    204           error.setOutputLine(errorView.getLinesCount()-2);
    205           error.setType(LatexCompileError.TYPE_OVERFULL_HBOX);
    206           String fileName = fileStack.get(fileStack.size() - 1);
    207           error.setFile(SystemUtils.newFile(file.getParentFile(), fileName), fileName);
    208           error.setMessage(line);
    209 
    210           while (!line.trim().equals("")) {
    211             int linePos = line.indexOf("at lines ");
    212             if (linePos != -1) {
    213               linePos += "at lines ".length();
    214               int mmPos = line.indexOf("--", linePos);
    215               try {
    216                 error.setLineStart(Integer.parseInt(line.substring(linePos, mmPos)));
    217                 error.setLineEnd(Integer.parseInt(line.substring(mmPos + 2)));
    218               } catch (Exception e) {
    219                 continue;
    220               }
    221             }
    222             line = in.readLine();
    223             errorView.appendLine(line);
    224             if (!line.contains("/10")) break;
    225           }
    226 
    227           compileError(error);
    228           line = in.readLine();
    229           errorView.appendLine(line);
    230           continue;
    231         }
    232 
    233         // opening and closing files
    234         if ((line.contains("(") && !line.startsWith("(see")) || line.startsWith(")") ||
    235                 (line.indexOf(')') != -1 && (line.startsWith("[") || line.indexOf(".tex") != 0 || line.indexOf(".sty") != 0 || line.indexOf(".bbl") != 0 || line.indexOf(".aux") != 0))) {
    236           int position = 0;
    237 
    238           while (position < line.length()) {
    239             int open = line.indexOf('(', position);
    240             int close = line.indexOf(')', position);
    241 
    242             if (close == -1 && open == -1) break;
    243 
    244             if (close == -1 || (open != -1 && open < close)) {
    245               String fileName = "";
    246               while (true) {
    247                 int space = line.indexOf(' ', open);
    248                 if (space == -1) space = line.length();
    249                 close = line.indexOf(')', open);
    250                 if (close != -1 && close < space) space = close;
    251 
    252                 position = space;
    253                 fileName += line.substring(open + 1, space);
    254                 if (line.length() == 79 && position == line.length()) {
    255                   line = in.readLine();
    256                   errorView.appendLine(line);
    257                   open = -1;
    258                 } else break;
    259               }
    260               fileStack.add(fileName);
    261             } else {
    262               // never empty the stack... parsing bugs
    263               if (fileStack.size() > 1) fileStack.remove(fileStack.size() - 1);
    264               position = close + 1;
    265             }
    266           }
    267 
    268           // for debugging: print the stack of open files
    269           // for(String fileName : fileStack) System.out.print(fileName + " ");
    270           // System.out.println();
    271 
    272           line = in.readLine();
    273           errorView.appendLine(line);
    274           continue;
    275         }
    276 
    277         line = in.readLine();
    278         errorView.appendLine(line);
    279       }
     102      parseLatexOutput(file, in);
    280103    } catch (IOException ignored) {
    281104    }
     
    306129  }
    307130
    308   public void halt() {
     131  public void parseLatexOutput(File file, BufferedReader in) throws IOException {
     132    LatexCompileError error;
     133
     134    ArrayList<String> fileStack = new ArrayList<String>();
     135    String versionString = in.readLine();
     136    errorView.appendLine(versionString);
     137    String line = in.readLine();
     138    errorView.appendLine(line);
     139    while (line != null) {
     140      // error messages
     141      Matcher errorMatcher = fileLineError.matcher(line);
     142      if (line.startsWith("!") || errorMatcher.matches()) {
     143        error = new LatexCompileError();
     144        error.setOutputLine(errorView.getLinesCount()-2);
     145        error.setType(LatexCompileError.TYPE_ERROR);
     146        if (line.startsWith("!")) {
     147          String fileName = fileStack.get(fileStack.size() - 1);
     148          error.setFile(SystemUtils.newFile(file.getParentFile(), fileName), fileName);
     149          error.setMessage(line.substring(1).trim());
     150        } else {
     151          String fileName = errorMatcher.group(1);
     152          error.setFile(SystemUtils.newFile(file.getParentFile(), fileName), fileName);
     153          error.setLine(Integer.parseInt(errorMatcher.group(2)));
     154          error.setMessage(errorMatcher.group(3).trim());
     155
     156          // bug
     157          if (!fileStack.get(fileStack.size() - 1).equals(fileName)) fileStack.add(fileName);
     158        }
     159
     160        while (line != null && !line.startsWith("l.")) {
     161          if (line.startsWith("<argument>")) {
     162            error.setCommand(line.substring("<argument>".length()).trim());
     163          }
     164          line = in.readLine();
     165          errorView.appendLine(line);
     166        }
     167
     168        if (line == null) {
     169          compileError(error);
     170          continue;
     171        }
     172
     173        if (line.startsWith("l.")) {
     174          int space = line.indexOf(' ');
     175          if (space == -1) space = line.length();
     176
     177          try {
     178            error.setLine(Integer.parseInt(line.substring(2, space)));
     179          } catch (Exception e) {
     180            continue;
     181          }
     182
     183          String before = line.substring(space + 1);
     184          if (before.startsWith("...")) before = before.substring(3);
     185          error.setTextBefore(before);
     186
     187          int position = line.length();
     188          line = in.readLine();
     189          errorView.appendLine(line);
     190          error.setTextAfter(line.substring(position));
     191
     192          compileError(error);
     193          line = in.readLine();
     194          errorView.appendLine(line);
     195          continue;
     196        } else {
     197          compileError(error);
     198          continue;
     199        }
     200      }
     201
     202      if (line.startsWith("LaTeX Warning:") || line.startsWith("LaTeX Font Warning:")) {
     203        error = new LatexCompileError();
     204        error.setOutputLine(errorView.getLinesCount()-2);
     205        error.setType(LatexCompileError.TYPE_WARNING);
     206        String fileName = fileStack.get(fileStack.size() - 1);
     207        error.setFile(SystemUtils.newFile(file.getParentFile(), fileName), fileName);
     208
     209        int linePos = line.indexOf("on input line ");
     210        if (linePos != -1) {
     211          linePos += "on input line ".length();
     212          try {
     213            error.setLine(Integer.parseInt(line.substring(linePos, line.indexOf('.', linePos))));
     214          } catch (Exception ignored) {
     215          }
     216        }
     217
     218        StringBuffer errorMessage = new StringBuffer(line.substring(line.indexOf(':') + 1).trim());
     219        for (int i = 0; i < 5; i++) {
     220          line = in.readLine();
     221          errorView.appendLine(line);
     222          if (line.trim().equals("")) break;
     223        }
     224        error.setMessage(errorMessage.toString());
     225
     226        compileError(error);
     227        line = in.readLine();
     228        errorView.appendLine(line);
     229        continue;
     230      }
     231
     232      if (line.startsWith("Overfull \\hbox") || line.startsWith("Underfull \\hbox")) {
     233        error = new LatexCompileError();
     234        error.setOutputLine(errorView.getLinesCount()-2);
     235        error.setType(LatexCompileError.TYPE_OVERFULL_HBOX);
     236        String fileName = fileStack.get(fileStack.size() - 1);
     237        error.setFile(SystemUtils.newFile(file.getParentFile(), fileName), fileName);
     238        error.setMessage(line);
     239
     240        while (!line.trim().equals("")) {
     241          int linePos = line.indexOf("at lines ");
     242          if (linePos != -1) {
     243            linePos += "at lines ".length();
     244            int mmPos = line.indexOf("--", linePos);
     245            try {
     246              error.setLineStart(Integer.parseInt(line.substring(linePos, mmPos)));
     247              error.setLineEnd(Integer.parseInt(line.substring(mmPos + 2)));
     248            } catch (Exception e) {
     249              continue;
     250            }
     251          }
     252          line = in.readLine();
     253          errorView.appendLine(line);
     254          if (!line.contains("/10")) break;
     255        }
     256
     257        compileError(error);
     258        line = in.readLine();
     259        errorView.appendLine(line);
     260        continue;
     261      }
     262
     263      // opening and closing files
     264      if ((line.contains("(") && !line.startsWith("(see")) || line.startsWith(")") ||
     265              (line.indexOf(')') != -1 && (line.startsWith("[") || line.indexOf(".tex") != 0 || line.indexOf(".sty") != 0 || line.indexOf(".bbl") != 0 || line.indexOf(".aux") != 0))) {
     266        int position = 0;
     267
     268        while (position < line.length()) {
     269          int open = line.indexOf('(', position);
     270          int close = line.indexOf(')', position);
     271
     272          if (close == -1 && open == -1) break;
     273
     274          if (close == -1 || (open != -1 && open < close)) {
     275            String fileName = "";
     276            while (true) {
     277              int space = line.indexOf(' ', open);
     278              if (space == -1) space = line.length();
     279              close = line.indexOf(')', open);
     280              if (close != -1 && close < space) space = close;
     281
     282              position = space;
     283              fileName += line.substring(open + 1, space);
     284              if (line.length() == 79 && position == line.length()) {
     285                line = in.readLine();
     286                errorView.appendLine(line);
     287                open = -1;
     288              } else break;
     289            }
     290            fileStack.add(fileName);
     291          } else {
     292            // never empty the stack... parsing bugs
     293            if (fileStack.size() > 1) fileStack.remove(fileStack.size() - 1);
     294            position = close + 1;
     295          }
     296        }
     297
     298        // for debugging: print the stack of open files
     299        // for(String fileName : fileStack) System.out.print(fileName + " ");
     300        // System.out.println();
     301
     302        line = in.readLine();
     303        errorView.appendLine(line);
     304        continue;
     305      }
     306
     307      line = in.readLine();
     308      errorView.appendLine(line);
     309    }
     310  }
     311
     312  public void halt() {
    309313    try {
    310314      if (latexCompiler != null) latexCompiler.destroy();
Note: See TracChangeset for help on using the changeset viewer.