⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uhtmldocgen.pas

📁 ESS-Model is a powerful, reverse engine, UML-tool for Delphi/Kylix and Java-files.
💻 PAS
字号:
{
  ESS-Model
  Copyright (C) 2002  Eldean AB, Peter S鰀erman, Ville Krumlinde

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
}

unit uHtmlDocGen;

interface

uses uDocGen, uModel, uModelEntity, uXmiExport;

type
  //Html documentation generator
  THtmlDocGen = class(TDocGen)
  private
    Xmi : TXmiExporter;
    Source,Detail : variant;
    procedure MakeDiagram(P : TAbstractPackage);
  protected
    procedure DocStart; override;
    procedure DocFinished; override;
    procedure WriteOverview; override;
    procedure WritePackageDetail(P : TUnitPackage); override;
  public
    destructor Destroy; override;
  end;

implementation
{$ifdef WIN32}
uses Forms, SysUtils, Graphics,
  ShellApi, Windows, ComObj,
  uConfig, Classes, uIterators, Dialogs, uViewIntegrator;
{$endif}
{$ifdef LINUX}
uses QForms, SysUtils, QGraphics,
  uConfig, Classes, uIterators, QDialogs, uViewIntegrator;
{$endif}



{$IFDEF Win32}
function MakeDOM : variant;
begin
  try
    //This should make it work with xml 3 and 4
    //MSXML no longer have version independent progids
    try
      Result := CreateOleObject('MSXML2.DOMDocument.4.0');
    except
      Result := CreateOleObject('MSXML2.DOMDocument.3.0');
    end;
  except
    ShowMessage('MS XML 4 or later is required.'#13#10'Download from http://msdn.microsoft.com/xml');
    Abort;
  end;
  Result.async := false;
  Result.resolveExternals := false;
  Result.setProperty('SelectionNamespaces','xmlns:xsl=''http://www.w3.org/1999/XSL/Transform''');
end;
{$ENDIF}

{$IFDEF Linux}
function MakeDOM : variant;
begin
{ TODO : linux xsl-processor }
end;
{$ENDIF}



{ THtmlDocGen }

destructor THtmlDocGen.Destroy;
begin
  if Assigned(Xmi) then Xmi.Free;
  inherited;
end;


procedure THtmlDocGen.DocStart;
begin
  //Establish stylesheet
  with Config.GetResourceStream('css_file') do
  begin
    SaveToFile(DestPath +  'styles.css');
    Free;
  end;

  Xmi := TXmiExporter.Create(Model);
  Xmi.InitFromModel;

  Source := MakeDOM;
  Source.loadXML( Xmi.GetXmi );

  Detail := MakeDOM;
  if not Detail.loadXML( Config.GetResourceText('p_detail_xsl_file') ) then
    raise exception.Create('nix');
end;


procedure THtmlDocGen.DocFinished;
begin
  {$IFDEF Win32}
  if Assigned(Application.MainForm) then
    ShellExecute(Application.MainForm.Handle,'open',PChar( DestPath +  'overview.html' ),'',
      PChar( DestPath ),SW_SHOWDEFAULT);
  {$ENDIF}
end;

procedure THtmlDocGen.WriteOverview;
var
  Sheet : variant;
  S : string;
  F : TFileStream;
begin
  Sheet := MakeDOM;
  Sheet.loadXML( Config.GetResourceText('p_overview_xsl_file') );
  S := Source.TransformNode(Sheet);
  F := TFileStream.Create( DestPath +  'overview.html' , fmCreate);
  try
    F.Write(S[1],Length(S));
  finally
    F.Free;
  end;
  MakeDiagram( Model.ModelRoot );
end;

procedure THtmlDocGen.WritePackageDetail(P: TUnitPackage);
var
  F : TFileStream;
  Id,FileName,S : string;
begin
  Id := Xmi.GetXMIId(P);

  //Tell the styesheet which package we want to generate html for
  Detail.SelectSingleNode('//xsl:param').Text := Id;

  S := Source.TransformNode(Detail);
  FileName := DestPath + 'p_' + id + '.html';
  F := TFileStream.Create( FileName , fmCreate);
  try
    F.Write(S[1],Length(S));
  finally
    F.Free;
  end;
  MakeDiagram( P );
end;

procedure THtmlDocGen.MakeDiagram(P: TAbstractPackage);
var
  Di : TDiagramIntegrator;
  TempForm : TForm;
  W,H : integer;
  FilePrefix,ImageFileName : string;

  Html,Clicks : TStringList;
  Target,Coords : string;
  E : TModelEntity;
  I : integer;
  IsRoot : boolean;
begin
  IsRoot := P=Model.ModelRoot;
  if IsRoot then
    FilePrefix := DestPath + 'p_overview'
  else
    FilePrefix := DestPath + 'p_' + Xmi.GetXMIId(P);

  ImageFileName := FilePrefix + '.png';

  TempForm := TForm.CreateNew(nil);
  Di := TDiagramIntegrator.CreateDiagram(Model, TempForm);
  try
    Di.Package := P;
    Di.InitFromModel;
    Di.GetDiagramSize(W,H);
    Clicks := Di.GetClickAreas;

    TempForm.Height:=0;
    TempForm.Width:=0;
    TempForm.SendToBack;
    TempForm.Top := Screen.Height;
    TempForm.Show;
    Di.SaveAsPicture(ImageFileName);
    TempForm.Hide;

  finally
    Di.Free;
    TempForm.Free;
  end;

  Html := TStringList.Create;
  try
    Html.Add( '<html> <body>' );
    Html.Add( '<img src="' + ExtractFileName(ImageFileName) + '" usemap="#map1">' );
    Html.Add( '<map name="map1">' );
    for I := 0 to Clicks.Count-1 do
    begin
      E := Clicks.Objects[I] as TModelEntity;
      if IsRoot then
        Target := 'p_' + Xmi.GetXMIId( E ) + '.html'
      else
        Target := 'p_' + Xmi.GetXMIId( E.Owner ) + '.html' + '#' + Xmi.GetXMIId(E);
      Coords := Clicks[I];
      Html.Add( '<area href="' + Target + '" shape="rect" coords="' + Coords + '">' );
    end;
    Html.Add( '</map>' );
    Html.Add( '</body> </html>' );
    Html.SaveToFile(FilePrefix + '_diagram.html');
  finally
    Html.Free;
    Clicks.Free;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -