#!/usr/bin/perl -w use strict; # java to html converter # output is filename.java.out.html # overwrites output without asking # very slow # Brian Robb. my $start_time = time(); my @keywords = qw(abstract boolean break byte case catch char class continue default delegate do double else extends false final finally float for if implements import instanceof int interface length long native new null package private protected public return short static super switch synchronized this threadsafe throw throws transient true try void volatile while); my @common_important_words = qw(String Array Applet Exception Math System); my @important_words = qw(AWTError AWTEvent AWTEventMulticaster AWTException AbstractAction AbstractBorder AbstractButton AbstractColorChooserPanel AbstractDocument AbstractDocumentAttributeContext AbstractDocumentContent AbstractDocumentElementEdit AbstractLayoutCache AbstractLayoutCacheNodeDimensions AbstractListModel AbstractMethodError AbstractTableModel AbstractUndoableEdit AbstractWriter AccessException Accessible AccessibleAction AccessibleBundle AccessibleComponent AccessibleContext AccessibleHyperlink AccessibleHypertext AccessibleResourceBundle AccessibleRole AccessibleSelection AccessibleState AccessibleStateSet AccessibleText AccessibleValue Acl AclEntry AclNotFoundException Action ActionEvent ActionListener Adjustable AdjustmentEvent AdjustmentListener Adler Adler32 AlreadyBoundException AncestorEvent AncestorListener Applet AppletContext AppletStub AreaAveragingScaleFilter ArithmeticException Array ArrayIndexOutOfBoundsException ArrayStoreException AttributeList AttributeSet AttributeSetCharacterAttribute AttributeSetColorAttribute AttributeSetFontAttribute AttributeSetParagraphAttribute AudioClip BadLocationException BasicArrowButton BasicBorders BasicBordersButtonBorder BasicBordersFieldBorder BasicBordersMarginBorder BasicBordersMenuBarBorder BasicBordersRadioButtonBorder BasicBordersSplitPaneBorder BasicBordersToggleButtonBorder BasicButtonListener BasicButtonUI BasicCheckBoxMenuItemUI BasicCheckBoxUI BasicColorChooserUI BasicComboBoxEditor BasicComboBoxEditorUIResource BasicComboBoxRenderer BasicComboBoxRendererUIResource BasicComboBoxUI BasicComboPopup BasicDesktopIconUI BasicDesktopPaneUI BasicDirectoryModel BasicEditorPaneUI BasicFileChooserUI BasicGraphicsUtils BasicIconFactory BasicInternalFrameTitlePane BasicInternalFrameUI BasicLabelUI BasicListUI BasicLookAndFeel BasicMenuBarUI BasicMenuItemUI BasicMenuUI BasicOptionPaneUI BasicOptionPaneUIButtonAreaLayout BasicPanelUI BasicPasswordFieldUI BasicPopupMenuSeparatorUI BasicPopupMenuUI BasicProgressBarUI BasicRadioButtonMenuItemUI BasicRadioButtonUI BasicScrollBarUI BasicScrollPaneUI BasicSeparatorUI BasicSliderUI BasicSplitPaneDivider BasicSplitPaneUI BasicTabbedPaneUI BasicTableHeaderUI BasicTableUI BasicTextAreaUI BasicTextFieldUI BasicTextPaneUI BasicTextUI BasicTextUIBasicCaret BasicTextUIBasicHighlighter BasicToggleButtonUI BasicToolBarSeparatorUI BasicToolBarUI BasicToolTipUI BasicTreeUI BasicViewportUI BeanDescriptor BeanInfo Beans BevelBorder BigDecimal BigInteger BindException BitSet BlockView Boolean Border BorderFactory BorderLayout BorderUIResource BorderUIResourceBevelBorderUIResource BorderUIResourceCompoundBorderUIResource BorderUIResourceEmptyBorderUIResource BorderUIResourceEtchedBorderUIResource BorderUIResourceLineBorderUIResource BorderUIResourceMatteBorderUIResource BorderUIResourceTitledBorderUIResource BoundedRangeModel Box BoxFiller BoxLayout BoxView BreakIterator BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter Button ButtonGroup ButtonModel ButtonPeer ButtonUI Byte ByteArrayInputStream ByteArrayOutputStream CRC CRC32 CSS CSSAttribute Calendar CallableStatement CannotRedoException CannotUndoException Canvas CanvasCanvasPeer CardLayout Caret CaretEvent CaretListener CellEditor CellEditorListener CellRendererPane Certificate ChangeEvent ChangeListener ChangedCharSetException CharArrayReader CharArrayWriter CharConversionException Character CharacterIterator Checkbox CheckboxGroup CheckboxMenuItem CheckboxMenuItemPeer CheckboxPeer CheckedInputStream CheckedOutputStream Checksum Choice ChoiceFormat ChoicePeer Class ClassCastException ClassCircularityError ClassFormatError ClassLoader ClassNotFoundException Clipboard ClipboardOwner CloneNotSupportedException Cloneable CollationElementIterator CollationKey Collator Color ColorChooserComponentFactory ColorChooserUI ColorModel ColorSelectionModel ColorUIResource ComboBoxEditor ComboBoxModel ComboBoxUI ComboPopup Compiler Component ComponentAdapter ComponentEvent ComponentListener ComponentPeer ComponentUI ComponentView CompositeView CompoundBorder CompoundEdit ConnectException ConnectIOException Connection Constructor Container ContainerAdapter ContainerEvent ContainerListener ContainerPeer ContentHandler ContentHandlerFactory ContentModel CropImageFilter Cursor Customizer DGC DSAKey DSAKeyPairGenerator DSAParams DSAPrivateKey DSAPublicKey DTD DTDConstants DataFlavor DataFormatException DataInput DataInputStream DataOutput DataOutputStream DataTruncation DatabaseMetaData DatagramPacket DatagramSocket DatagramSocketImpl Date DateFormat DateFormatSymbols DebugGraphics DecimalFormat DecimalFormatSymbols DefaultBoundedRangeModel DefaultButtonModel DefaultCaret DefaultCellEditor DefaultColorSelectionModel DefaultComboBoxModel DefaultDesktopManager DefaultEditorKit DefaultEditorKitBeepAction DefaultEditorKitCopyAction DefaultEditorKitCutAction DefaultEditorKitDefaultKeyTypedAction DefaultEditorKitInsertBreakAction DefaultEditorKitInsertContentAction DefaultEditorKitInsertTabAction DefaultEditorKitPasteAction DefaultFocusManager DefaultHighlighter DefaultHighlighterDefaultHighlightPainter DefaultListCellRenderer DefaultListCellRendererUIResource DefaultListModel DefaultListSelectionModel DefaultMenuLayout DefaultMetalTheme DefaultMutableTreeNode DefaultSingleSelectionModel DefaultStyledDocument DefaultStyledDocumentAttributeUndoableEdit DefaultStyledDocumentElementSpec DefaultTableCellRenderer DefaultTableCellRendererUIResource DefaultTableColumnModel DefaultTableModel DefaultTextUI DefaultTreeCellEditor DefaultTreeCellRenderer DefaultTreeModel DefaultTreeSelectionModel Deflater DeflaterOutputStream DesktopIconUI DesktopManager DesktopPaneUI Dialog DialogPeer Dictionary DigestException DigestInputStream DigestOutputStream Dimension DimensionUIResource DirectColorModel Document DocumentEvent DocumentEventElementChange DocumentEventEventType DocumentListener DocumentParser Double Driver DriverManager DriverPropertyInfo EOFException EditorKit Element ElementIterator EmptyBorder EmptyStackException Entity Enumeration Error EtchedBorder Event EventListener EventListenerList EventObject EventQueue EventSetDescriptor Exception ExceptionInInitializerError ExpandVetoException ExportException Externalizable FeatureDescriptor Field FieldPosition FieldView File FileChooserUI FileDescriptor FileDialog FileDialogPeer FileFilter FileInputStream FileNameMap FileNotFoundException FileOutputStream FileReader FileSystemView FileView FileWriter FilenameFilter FilterInputStream FilterOutputStream FilterReader FilterWriter FilteredImageSource FixedHeightLayoutCache Float FlowLayout FocusAdapter FocusEvent FocusListener FocusManager Font FontMetrics FontPeer FontUIResource FormView Format Frame FramePeer GZIPInputStream GZIPOutputStream GapContent Graphics GrayFilter GregorianCalendar GridBagConstraints GridBagLayout GridLayout Group HTML HTMLAttribute HTMLDocument HTMLDocumentIterator HTMLEditorKit HTMLEditorKitHTMLFactory HTMLEditorKitHTMLTextAction HTMLEditorKitInsertHTMLTextAction HTMLEditorKitLinkController HTMLEditorKitParser HTMLEditorKitParserCallback HTMLFrameHyperlinkEvent HTMLTag HTMLUnknownTag HTMLWriter Hashtable Highlighter HighlighterHighlight HighlighterHighlightPainter HttpURLConnection HyperlinkEvent HyperlinkEventEventType HyperlinkListener IOException Icon IconUIResource IconView Identity IdentityScope IllegalAccessError IllegalAccessException IllegalArgumentException IllegalComponentStateException IllegalMonitorStateException IllegalStateException IllegalThreadStateException Image ImageConsumer ImageFilter ImageIcon ImageObserver ImageProducer IncompatibleClassChangeError IndexColorModel IndexOutOfBoundsException IndexedPropertyDescriptor InetAddress Inflater InflaterInputStream InlineView InputEvent InputStream InputStreamReader Insets InsetsUIResource InstantiationError InstantiationException Integer InternalError InternalFrameAdapter InternalFrameEvent InternalFrameListener InternalFrameUI InterruptedException InterruptedIOException IntrospectionException Introspector InvalidClassException InvalidKeyException InvalidObjectException InvalidParameterException InvocationTargetException ItemEvent ItemListener ItemSelectable JApplet JButton JCheckBox JCheckBoxMenuItem JColorChooser JComboBox JComboBoxKeySelectionManager JComponent JDesktopPane JDialog JEditorPane JFileChooser JFrame JInternalFrame JInternalFrameJDesktopIcon JLabel JLayeredPane JList JMenu JMenuBar JMenuItem JOptionPane JPanel JPasswordField JPopupMenu JPopupMenuSeparator JProgressBar JRadioButton JRadioButtonMenuItem JRootPane JScrollBar JScrollPane JSeparator JSlider JSplitPane JTabbedPane JTable JTableHeader JTextArea JTextComponent JTextComponentKeyBinding JTextField JTextPane JToggleButton JToggleButtonToggleButtonModel JToolBar JToolBarSeparator JToolTip JTree JTreeDynamicUtilTreeNode JTreeEmptySelectionModel JViewport JWindow Key KeyAdapter KeyEvent KeyException KeyListener KeyManagementException KeyPair KeyPairGenerator KeyStroke Keymap Label LabelPeer LabelUI LabelView LabelViewD LastOwnerException LayeredHighlighter LayeredHighlighterLayerPainter LayoutManager LayoutManager2 Lease LightweightPeer LineBorder LineNumberInputStream LineNumberReader LinkageError List ListCellRenderer ListDataEvent ListDataListener ListModel ListPeer ListResourceBundle ListSelectionEvent ListSelectionListener ListSelectionModel ListUI ListView LoaderHandler Locale LocateRegistry LogStream Long LookAndFeel MalformedURLException MarshalException Math MatteBorder MediaTracker Member MemoryImageSource Menu MenuBar MenuBarPeer MenuBarUI MenuComponent MenuComponentPeer MenuContainer MenuDragMouseEvent MenuDragMouseListener MenuElement MenuEvent MenuItem MenuItemPeer MenuItemUI MenuKeyEvent MenuKeyListener MenuListener MenuPeer MenuSelectionManager MenuShortcut MessageDigest MessageFormat MetalBorders MetalBordersButtonBorder MetalBordersFlushDBorder MetalBordersInternalFrameBorder MetalBordersMenuBarBorder MetalBordersMenuItemBorder MetalBordersPopupMenuBorder MetalBordersRolloverButtonBorder MetalBordersScrollPaneBorder MetalBordersTextFieldBorder MetalBordersToolBarBorder MetalButtonUI MetalCheckBoxIcon MetalCheckBoxUI MetalComboBoxButton MetalComboBoxEditor MetalComboBoxEditorUIResource MetalComboBoxIcon MetalComboBoxUI MetalDesktopIconUI MetalFileChooserUI MetalIconFactory MetalIconFactoryFileIcon MetalIconFactoryFolderIcon MetalIconFactoryTreeControlIcon MetalIconFactoryTreeFolderIcon MetalIconFactoryTreeLeafIcon MetalInternalFrameUI MetalLabelUI MetalLookAndFeel MetalPopupMenuSeparatorUI MetalProgressBarUI MetalRadioButtonUI MetalScrollBarUI MetalScrollButton MetalScrollPaneUI MetalSeparatorUI MetalSliderUI MetalSplitPaneUI MetalTabbedPaneUI MetalTextFieldUI MetalTheme MetalToggleButtonUI MetalToolBarUI MetalToolTipUI MetalTreeUI Method MethodDescriptor MinimalHTMLWriter MissingResourceException Modifier MouseAdapter MouseEvent MouseInputAdapter MouseInputListener MouseListener MouseMotionAdapter MouseMotionListener MultiButtonUI MultiColorChooserUI MultiComboBoxUI MultiDesktopIconUI MultiDesktopPaneUI MultiFileChooserUI MultiInternalFrameUI MultiLabelUI MultiListUI MultiLookAndFeel MultiMenuBarUI MultiMenuItemUI MultiOptionPaneUI MultiPanelUI MultiPopupMenuUI MultiProgressBarUI MultiScrollBarUI MultiScrollPaneUI MultiSeparatorUI MultiSliderUI MultiSplitPaneUI MultiTabbedPaneUI MultiTableHeaderUI MultiTableUI MultiTextUI MultiToolBarUI MultiToolTipUI MultiTreeUI MultiViewportUI MulticastSocket MutableAttributeSet MutableComboBoxModel MutableTreeNode Naming NegativeArraySizeException NoClassDefFoundError NoRouteToHostException NoSuchAlgorithmException NoSuchElementException NoSuchFieldError NoSuchFieldException NoSuchMethodError NoSuchMethodException NoSuchObjectException NoSuchProviderException NotActiveException NotBoundException NotOwnerException NotSerializableException NullPointerException Number NumberFormat NumberFormatException ObjID Object ObjectInput ObjectInputStream ObjectInputValidation ObjectOutput ObjectOutputStream ObjectStreamClass ObjectStreamException ObjectView Observable Observer Operation Option OptionPaneUI OptionalDataException OutOfMemoryError OutputStream OutputStreamWriter OverlayLayout Owner PaintEvent Panel PanelPeer PanelUI ParagraphView ParameterDescriptor ParseException ParsePosition Parser ParserDelegator PasswordView Permission PipedInputStream PipedOutputStream PipedReader PipedWriter PixelGrabber PlainDocument PlainView Point Polygon PopupMenu PopupMenuEvent PopupMenuListener PopupMenuPeer PopupMenuUI Position PositionBias PreparedStatement Principal PrintGraphics PrintJob PrintStream PrintWriter PrivateKey Process ProgressBarUI ProgressMonitor ProgressMonitorInputStream Properties PropertyChangeEvent PropertyChangeListener PropertyChangeSupport PropertyDescriptor PropertyEditor PropertyEditorManager PropertyEditorSupport PropertyResourceBundle PropertyVetoException ProtocolException Provider ProviderException PublicKey PushbackInputStream PushbackReader RGBImageFilter RMIClassLoader RMIFailureHandler RMISecurityException RMISecurityManager RMISocketFactory RTFEditorKit Random RandomAccessFile Reader Rectangle RectangleRegistry Registry RegistryHandler Remote RemoteCall RemoteException RemoteObject RemoteRef RemoteServer RemoteStub Renderer RepaintManager ReplicateScaleFilter ResourceBundle ResultSet ResultSetMetaData RootPaneContainer RowMapper RuleBasedCollator Runnable Runtime RuntimeException SQLException SQLWarning ScrollBarUI ScrollPane ScrollPaneConstants ScrollPaneLayout ScrollPaneLayoutUIResource ScrollPanePeer ScrollPaneUI Scrollable Scrollbar ScrollbarPeer SecureRandom Security SecurityException SecurityManager Segment SeparatorUI SequenceInputStream Serializable ServerCloneException ServerError ServerException ServerNotActiveException ServerRef ServerRuntimeException ServerSocket Shape Short Signature SignatureException Signer SimpleAttributeSet SimpleBeanInfo SimpleDateFormat SimpleTimeZone SingleSelectionModel SizeRequirements Skeleton SkeletonMismatchException SkeletonNotFoundException SliderUI Socket SocketException SocketImpl SocketImplFactory SocketSecurityException SoftBevelBorder SplitPaneUI Stack StackOverflowError StateEdit StateEditable Statement StreamCorruptedException StreamTokenizer String StringBuffer StringBufferInputStream StringCharacterIterator StringContent StringIndexOutOfBoundsException StringReader StringSelection StringTokenizer StringWriter StubNotFoundException Style StyleConstants StyleConstantsCharacterConstants StyleConstantsColorConstants StyleConstantsFontConstants StyleConstantsParagraphConstants StyleContext StyleSheet StyleSheetBoxPainter StyleSheetListPainter StyledDocument StyledEditorKit StyledEditorKitAlignmentAction StyledEditorKitBoldAction StyledEditorKitFontFamilyAction StyledEditorKitFontSizeAction StyledEditorKitForegroundAction StyledEditorKitItalicAction StyledEditorKitStyledTextAction StyledEditorKitUnderlineAction SwingConstants SwingPropertyChangeSupport SwingUtilities SyncFailedException System SystemColor TabExpander TabSet TabStop TabableView TabbedPaneUI TableCellEditor TableCellRenderer TableColumn TableColumnModel TableColumnModelEvent TableColumnModelListener TableHeaderUI TableModel TableModelEvent TableModelListener TableUI TableView TagElement TextAction TextArea TextAreaPeer TextComponent TextComponentPeer TextEvent TextField TextFieldPeer TextListener TextUI Thread ThreadDeath ThreadGroup Throwable Time TimeZone Timer Timestamp TitledBorder TooManyListenersException ToolBarUI ToolTipManager ToolTipUI Toolkit Transferable TreeCellEditor TreeCellRenderer TreeExpansionEvent TreeExpansionListener TreeModel TreeModelEvent TreeModelListener TreeNode TreePath TreeSelectionEvent TreeSelectionListener TreeSelectionModel TreeUI TreeWillExpandListener Types UID UIDefaults UIDefaultsActiveValue UIDefaultsLazyValue UIManager UIManagerLookAndFeelInfo UIResource URL URLConnection URLEncoder URLStreamHandler URLStreamHandlerFactory UTFDataFormatException UndoManager UndoableEdit UndoableEditEvent UndoableEditListener UndoableEditSupport UnexpectedException UnicastRemoteObject UnknownError UnknownHostException UnknownServiceException UnmarshalException Unreferenced UnsatisfiedLinkError UnsupportedEncodingException UnsupportedFlavorException UnsupportedLookAndFeelException Utilities VMID VariableHeightLayoutCache Vector VerifyError VetoableChangeListener VetoableChangeSupport View ViewFactory ViewportLayout ViewportUI VirtualMachineError Visibility Void Window WindowAdapter WindowConstants WindowEvent WindowListener WindowPeer WrappedPlainView WriteAbortedException Writer ZipEntry ZipException ZipFile ZipInputStream ZipOutputStream); my @preprocessor_words = qw(define elif else endif error if undef warning); die "Usage: $0 " unless (@ARGV == 1); my @filenames = glob($ARGV[0]); foreach my $filename (@filenames) { open(IN, "$filename") || die ($!); open(OUT, ">$filename.out.html") || die ($!); my $keywords_color = "#0033FF"; my $important_words_color = "#FF6600"; my $single_line_comment_color = "#339999"; my $multi_line_comment_color = "#339966"; my $string_color = "#663366"; my $brace_color = "#FF0000"; my $number_color = "#3399FF"; my $floating_point_number_color = "#6699FF"; my $preprocessor_words_color = "#333333"; my $in_comment = 0; my $in_string = 0; my $line_number = 0; my $debug = 0; my $warnings = 1; my @tokens = (); print OUT "\n\n\t$filename\n\n
";

  while () {

    $line_number++;
    if ($warnings) {
      if (length($_) > 80) {
        print "Warning, line ", $line_number, " ", $filename,
        " maybe too long (", length($_), " characters) to print:\n", $_;
      }
    }

    @tokens = ();

    chomp;
    my $comment = "";
    my $matches = 0;

    do {
      $matches = 0;

      if (!$in_comment) {

        if (m@(\s)*/\*@) {
          print OUT "$&$'";
          $_ = $`;
          $in_comment = 1;
          $matches++;
        }
        elsif (m@//@) {
          $_ = $`;
          $comment = "$&$'";
          $matches++;
        }
      }

      if (!$in_comment && !$in_string) {
        if (m/\"/) {
          push(@tokens, "$`", "", "$&");
          $_ = $';
          $in_string = 1;
          $matches++;
        }
      }

      if ($in_comment) {
        if (m@(\s)*\*/@) {
          $_ = $';
          $in_comment = 0;
          print OUT "$&$`"; 
          $matches++;
        }
      }
  
      if (!$in_comment && $in_string) {
        if (m/\"/) {
          $_ = $';
          $in_string = 0;
          push(@tokens, "$`$&", "");
          $matches++;
        }
      }

    } while ($matches > 0);
  
    if (!$in_comment) {

      foreach my $token (@tokens) {

        if (m/^"/ || m/"$/) { # if token is start or end of string

          # numbers here need whitespace before them, otherwise it messes with html tags
          #$token =~ s/(\s)(\d+)(\.)(\d+)(\s|\b)/$1$2$3$4$5<\/font>/g;
          #$token =~ s/(\s)(\d+)(\s|\b)/$1$2$3<\/font>/g;

          foreach my $word (@keywords) {
            $token =~ s/(\b)$word(\b)/$1$word$2<\/font>/g;
          }

          foreach my $word (@important_words) {
            $token =~ s/(\b)$word(\b)/$1$word$2<\/font>/g;
          }

          $token =~ s/\(/\(<\/font>/g;
          $token =~ s/\[/\[<\/font>/g;
          $token =~ s/\{/\{<\/font>/g;

          $token =~ s/\)/\)<\/font>/g;
          $token =~ s/\]/\]<\/font>/g;
          $token =~ s/\}/\}<\/font>/g;
        }      
        print OUT $token;
      }
    
      foreach my $word (@keywords) {
        s/(\b)$word(\b)/$1$word$2<\/font>/g;
      }

      foreach my $word (@common_important_words) {
        s/^$word$/$word<\/font>/;           
      }

      if (0) { # slow
        foreach my $word (@important_words) {
          s/(\b)$word(\b)/$1$word$2<\/font>/g;
        }
      }
    
      s/(\s|-|\+)(\d+)(\.)(\d+)(\s|\b)/$1$2$3$4$5<\/font>/g;
      s/(\s|-|\+)(\d+)(\s|\b)/$1$2$3<\/font>/g;
    
      s/\(/\(<\/font>/g;
      s/\[/\[<\/font>/g;
      s/\{/\{<\/font>/g;

      s/\)/\)<\/font>/g;
      s/\]/\]<\/font>/g;
      s/\}/\}<\/font>/g;

    }
  
    print OUT $_, $comment, "\n" || die($!);
  }

  print OUT "
\n\n"; close IN || die ($!); close OUT || die ($!); my $total_time = time() - $start_time; print "tadah! ", $filename, " took ", $total_time, " second", ($total_time == 1 ? "" : "s"), "\n"; }