Changeset 211


Ignore:
Timestamp:
11/05/02 19:06:35 (20 years ago)
Author:
piso
Message:

wrapParagraph(): handle quoted text prefixes ("> ", "> > ", etc.) correctly.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/j/WrapText.java

    r98 r211  
    33 *
    44 * Copyright (C) 1998-2002 Peter Graves
    5  * $Id: WrapText.java,v 1.3 2002-10-11 14:07:35 piso Exp $
     5 * $Id: WrapText.java,v 1.4 2002-11-05 19:06:35 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2222package org.armedbear.j;
    2323
     24import gnu.regexp.RE;
     25import gnu.regexp.REMatch;
     26import gnu.regexp.UncheckedRE;
    2427import javax.swing.undo.CompoundEdit;
    2528import org.armedbear.j.mail.SendMail;
     
    7073    public void wrapParagraph()
    7174    {
    72         Position begin = findStartOfParagraph(dot);
    73         Position end = findEndOfParagraph(dot);
     75        String prefix = getPrefix(dot.getLine());
     76        final Position begin, end;
     77        if (prefix != null) {
     78            int prefixLength = prefix.length();
     79            begin = findStartOfQuotedText(dot, prefix, prefixLength);
     80            end = findEndOfQuotedText(dot, prefix, prefixLength);
     81        } else {
     82            begin = findStartOfParagraph(dot);
     83            end = findEndOfParagraph(dot);
     84        }
    7485        if (begin != null && end != null) {
    7586            Region r = new Region(buffer, begin, end);
    76             wrapRegion(r);
     87            wrapRegion(r, prefix);
    7788        }
    7889    }
     
    8798        }
    8899    }
    89 
     100   
    90101    private void wrapCommentInternal()
    91102    {
     
    141152    private void wrapRegion(Region r)
    142153    {
     154        wrapRegion(r, null);
     155    }
     156
     157    private void wrapRegion(Region r, String prefix)
     158    {
    143159        try {
    144160            r.getBuffer().lockWrite();
     
    149165        }
    150166        try {
    151             processRegion(r, null, true);
     167            processRegion(r, prefix, true);
    152168        }
    153169        finally {
     
    523539        return new Position(endLine, endLine.length());
    524540    }
     541   
     542    private static final RE prefixRE = new UncheckedRE("^[> ]+");
     543   
     544    private static String getPrefix(Line line)
     545    {
     546        REMatch match = prefixRE.getMatch(line.getText());
     547        return match != null ? match.toString() : null;
     548    }
     549
     550    private static Position findStartOfQuotedText(Position pos, String prefix,
     551        int prefixLength)
     552    {
     553        Line start = pos.getLine();
     554        for (Line line = start.previous(); line != null; line = line.previous()) {
     555            if (!prefix.equals(getPrefix(line)))
     556                break;
     557            if (line.substring(prefixLength).trim().length() == 0)
     558                break; // Blank line (except for prefix string).
     559            start = line;
     560        }
     561        return new Position(start, 0);
     562    }
     563
     564    private static Position findEndOfQuotedText(Position pos, String prefix,
     565        int prefixLength)
     566    {
     567        Line end = pos.getLine();
     568        for (Line line = end.next(); line != null; line = line.next()) {
     569            if (!prefix.equals(getPrefix(line)))
     570                break;
     571            if (line.substring(prefixLength).trim().length() == 0)
     572                break; // Blank line (except for prefix string).
     573            end = line;
     574        }
     575        if (end.next() != null)
     576            return new Position(end.next(), 0);
     577        return new Position(end, end.length());
     578    }
    525579
    526580    private void detab(Region r)
Note: See TracChangeset for help on using the changeset viewer.