Changeset 8717


Ignore:
Timestamp:
03/06/05 04:37:53 (16 years ago)
Author:
piso
Message:

listBindings(): support submaps.

File:
1 edited

Legend:

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

    r8677 r8717  
    33 *
    44 * Copyright (C) 1998-2005 Peter Graves
    5  * $Id: Help.java,v 1.15 2005-03-01 21:18:47 piso Exp $
     5 * $Id: Help.java,v 1.16 2005-03-06 04:37:53 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2828import java.io.OutputStreamWriter;
    2929import java.io.Writer;
     30import java.util.ArrayList;
    3031import java.util.Comparator;
    3132import java.util.Collections;
     
    173174            writer.write("</b><br><br>");
    174175            addBindingsFromKeyMap(editor.getBuffer().getKeyMapForMode(), docDir,
    175                 writer);
     176                                  writer, "");
    176177            writer.write("<br>");
    177178            writer.write("<b>");
    178179            writer.write("Global Bindings");
    179180            writer.write("</b><br><br>");
    180             addBindingsFromKeyMap(KeyMap.getGlobalKeyMap(), docDir, writer);
     181            addBindingsFromKeyMap(KeyMap.getGlobalKeyMap(), docDir, writer, "");
    181182            writer.write("</body>\n</html>\n");
    182183            writer.flush();
     
    217218
    218219    private static void addBindingsFromKeyMap(KeyMap keyMap, File docDir,
    219                                               Writer writer)
     220                                              Writer writer, String prefix)
    220221        throws IOException
    221222    {
     
    226227            return;
    227228        }
     229        int prefixLength = prefix.length();
     230        final String sanitizedPrefix =
     231            (prefixLength > 0) ? sanitize(prefix) : null;
     232        final int spaces = 32 - prefixLength;
     233        ArrayList submappings = null;
    228234        for (int i = 0; i < count; i++) {
    229235            KeyMapping mapping = mappings[i];
    230             FastStringBuffer sb = new FastStringBuffer(64);
    231             sb.append(mapping.getKeyText());
    232             int spaces = 32 - sb.length();
    233             for (int j = spaces; j-- > 0;)
     236            FastStringBuffer sb = new FastStringBuffer();
     237            if (sanitizedPrefix != null)
     238                sb.append(sanitizedPrefix);
     239            final String keytext = mapping.getKeyText();
     240            sb.append(sanitize(keytext));
     241            for (int j = spaces - keytext.length(); j-- > 0;)
    234242                sb.append("&nbsp;");
    235243            Object command = mapping.getCommand();
     
    250258                try {
    251259                    String s = ((LispObject)command).writeToString();
    252                     if (s.startsWith("#<"))
    253                         s = "#&lt;".concat(s.substring(2));
    254                     if (s.endsWith(">"))
    255                         s = s.substring(0, s.length() - 1).concat("&gt;");
    256                     sb.append(s);
     260                    sb.append(sanitize(s));
    257261                }
    258262                catch (Throwable t) {
     
    262266                sb.append(mapping.getKeyText());
    263267                sb.append(" prefix command");
     268                if (submappings == null)
     269                    submappings = new ArrayList();
     270                submappings.add(mapping);
    264271            }
    265272            sb.append("<br>\n");
    266273            writer.write(sb.toString());
    267274        }
     275        if (submappings != null) {
     276            for (int i = 0; i < submappings.size(); i++) {
     277                writer.write("<br>\n");
     278                KeyMapping mapping = (KeyMapping) submappings.get(i);
     279                String keytext = mapping.getKeyText();
     280                KeyMap submap = (KeyMap) mapping.getCommand();
     281                FastStringBuffer sb = new FastStringBuffer();
     282                if (prefixLength > 0) {
     283                    sb.append(prefix);
     284                    sb.append(' ');
     285                }
     286                sb.append(keytext);
     287                sb.append(' ');
     288                addBindingsFromKeyMap(submap, docDir, writer, sb.toString());
     289            }
     290        }
     291    }
     292
     293    private static String sanitize(String s)
     294    {
     295        FastStringBuffer sb = null;
     296        final int limit = s.length();
     297        for (int i = 0; i < limit; i++) {
     298            char c = s.charAt(i);
     299            switch (c) {
     300                case '<':
     301                    if (sb == null) {
     302                        sb = new FastStringBuffer();
     303                        sb.append(s.substring(0, i));
     304                    }
     305                    sb.append("&lt;");
     306                    break;
     307                case '>':
     308                    if (sb == null) {
     309                        sb = new FastStringBuffer();
     310                        sb.append(s.substring(0, i));
     311                    }
     312                    sb.append("&gt;");
     313                    break;
     314                case '&':
     315                    if (sb == null) {
     316                        sb = new FastStringBuffer();
     317                        sb.append(s.substring(0, i));
     318                    }
     319                    sb.append("&amp;");
     320                    break;
     321                default:
     322                    if (sb != null)
     323                        sb.append(c);
     324                    break;
     325            }
     326        }
     327        return (sb != null) ? sb.toString() : s;
    268328    }
    269329
Note: See TracChangeset for help on using the changeset viewer.