Index: CHANGES.txt
==================================================================
--- CHANGES.txt
+++ CHANGES.txt
@@ -1,4 +1,11 @@
+Version 0.9.9.1
+2022-03-10
+
+[Feature] macOS builds are working now.
+[Feature] First macOS release.
+
+
Version 0.9.9.0
2022-02-24
[Feature] First working version.
Index: src/groffstudio.lpi
==================================================================
--- src/groffstudio.lpi
+++ src/groffstudio.lpi
@@ -1,126 +1,130 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
Index: src/groffstudio.lps
==================================================================
--- src/groffstudio.lps
+++ src/groffstudio.lps
@@ -6,131 +6,98 @@
-
-
-
-
-
+
+
+
-
-
-
+
+
+
+
-
+
-
+
-
-
+
+
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -179,12 +146,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: src/unit1.lfm
==================================================================
--- src/unit1.lfm
+++ src/unit1.lfm
@@ -1,20 +1,20 @@
object MainForm: TMainForm
- Left = 1932
+ Left = 819
Height = 692
Top = 147
Width = 861
Caption = 'groffstudio'
ClientHeight = 692
ClientWidth = 861
OnClose = FormClose
OnCreate = FormCreate
- LCLVersion = '2.2.0.4'
+ LCLVersion = '2.3.0.0'
object MainStatusBar: TStatusBar
Left = 0
- Height = 23
- Top = 669
+ Height = 18
+ Top = 674
Width = 861
Panels = <
item
Text = 'file name with save status'
Width = 200
@@ -39,39 +39,40 @@
Style = tsFlatButtons
TabIndex = 0
TabOrder = 1
object tsEdit: TTabSheet
Caption = 'edit a groff document'
- ClientHeight = 631
- ClientWidth = 833
+ ClientHeight = 632
+ ClientWidth = 835
ParentFont = False
object GroupBox1: TGroupBox
Left = 10
Height = 65
- Top = 561
- Width = 813
+ Top = 562
+ Width = 815
Align = alBottom
BorderSpacing.Left = 10
BorderSpacing.Right = 10
BorderSpacing.Bottom = 5
Caption = 'build'
- ClientHeight = 45
- ClientWidth = 809
+ ClientHeight = 46
+ ClientWidth = 805
TabOrder = 0
object Label1: TLabel
Left = 112
- Height = 15
+ Height = 16
Top = -4
- Width = 72
+ Width = 83
Caption = 'macro to use:'
+ ParentColor = False
end
object cmbMacro: TComboBox
Left = 112
- Height = 23
+ Height = 20
Top = 14
Width = 100
- ItemHeight = 15
+ ItemHeight = 19
Items.Strings = (
'man'
'me'
'mm'
'mom'
@@ -79,112 +80,115 @@
)
TabOrder = 0
Text = '[ select ]'
end
object Label2: TLabel
- Left = 686
- Height = 15
+ Left = 673
+ Height = 16
Top = -4
- Width = 78
+ Width = 87
Anchors = [akTop, akRight]
Caption = 'output format:'
+ ParentColor = False
end
object rdPs: TRadioButton
- Left = 686
- Height = 19
+ Left = 670
+ Height = 18
Top = 14
- Width = 73
+ Width = 85
Anchors = [akTop, akRight]
Caption = 'PostScript'
OnChange = rdPsChange
TabOrder = 1
end
object rdPdf: TRadioButton
- Left = 766
- Height = 19
+ Left = 753
+ Height = 18
Top = 14
- Width = 41
+ Width = 50
Anchors = [akTop, akRight]
Caption = 'PDF'
OnChange = rdPdfChange
TabOrder = 2
end
object Label3: TLabel
- Left = 304
- Height = 15
+ Left = 285
+ Height = 16
Top = -4
- Width = 76
+ Width = 91
Anchors = [akTop, akRight]
Caption = 'preprocessors:'
+ ParentColor = False
end
object chkEqn: TCheckBox
- Left = 360
- Height = 19
+ Left = 348
+ Height = 18
Top = 14
- Width = 40
+ Width = 48
Anchors = [akTop, akRight]
Caption = 'eqn'
TabOrder = 3
end
object chkPic: TCheckBox
- Left = 446
- Height = 19
+ Left = 434
+ Height = 18
Top = 14
- Width = 36
+ Width = 44
Anchors = [akTop, akRight]
Caption = 'pic'
TabOrder = 4
end
object chkTbl: TCheckBox
- Left = 534
- Height = 19
+ Left = 523
+ Height = 18
Top = 14
- Width = 34
+ Width = 41
Anchors = [akTop, akRight]
Caption = 'tbl'
TabOrder = 5
end
object chkGrn: TCheckBox
- Left = 404
- Height = 19
+ Left = 392
+ Height = 18
Top = 14
- Width = 38
+ Width = 46
Anchors = [akTop, akRight]
Caption = 'grn'
TabOrder = 6
end
object chkChem: TCheckBox
- Left = 304
- Height = 19
+ Left = 292
+ Height = 18
Top = 14
- Width = 50
+ Width = 58
Anchors = [akTop, akRight]
Caption = 'chem'
TabOrder = 7
end
object chkRefer: TCheckBox
- Left = 486
- Height = 19
+ Left = 473
+ Height = 18
Top = 14
- Width = 44
+ Width = 53
Anchors = [akTop, akRight]
Caption = 'refer'
TabOrder = 8
end
object Label4: TLabel
- Left = 587
- Height = 15
+ Left = 576
+ Height = 16
Top = -4
- Width = 34
+ Width = 41
Anchors = [akTop, akRight]
Caption = 'extras:'
+ ParentColor = False
end
object chkPdfMark: TCheckBox
- Left = 587
- Height = 19
+ Left = 574
+ Height = 18
Top = 14
- Width = 65
+ Width = 74
Anchors = [akTop, akRight]
Caption = 'Pdfmark'
Enabled = False
TabOrder = 9
end
@@ -201,59 +205,60 @@
ParentFont = False
TabOrder = 10
end
end
object btnSaveGroff: TButton
- Left = 748
+ Left = 750
Height = 28
- Top = 530
+ Top = 531
Width = 75
Anchors = [akRight, akBottom]
Caption = 'save'
Font.Style = [fsBold]
OnClick = btnSaveGroffClick
ParentFont = False
TabOrder = 1
end
object btnLoadGroff: TButton
- Left = 667
+ Left = 669
Height = 28
- Top = 530
+ Top = 531
Width = 75
Anchors = [akRight, akBottom]
Caption = 'load'
Font.Style = [fsBold]
OnClick = btnLoadGroffClick
ParentFont = False
TabOrder = 2
end
object Label5: TLabel
- Left = 211
- Height = 15
+ Left = 142
+ Height = 16
Top = 543
- Width = 438
+ Width = 509
Anchors = [akRight, akBottom]
Caption = 'note that everything build-related will be stored in the document''s storage directory'
Font.Color = clBlue
Font.Style = [fsItalic]
+ ParentColor = False
ParentFont = False
end
inline SynEdit1: TSynEdit
Left = 10
- Height = 523
+ Height = 524
Top = 0
- Width = 813
+ Width = 815
Anchors = [akTop, akLeft, akRight, akBottom]
Font.CharSet = 4
Font.Height = -13
Font.Name = 'Consolas'
Font.Pitch = fpFixed
Font.Quality = fqCleartypeNatural
ParentColor = False
ParentFont = False
TabOrder = 3
- Gutter.Width = 55
+ Gutter.Width = 67
Gutter.MouseActions = <>
RightGutter.Width = 0
RightGutter.MouseActions = <>
Keystrokes = <
item
@@ -707,11 +712,11 @@
object SynGutterMarks1: TSynGutterMarks
Width = 24
MouseActions = <>
end
object SynGutterLineNumber1: TSynGutterLineNumber
- Width = 15
+ Width = 27
MouseActions = <>
MarkupInfo.Background = clBtnFace
MarkupInfo.Foreground = clNone
DigitCount = 2
ShowOnlyLineNumbersMultiplesOf = 1
@@ -740,75 +745,77 @@
end
end
end
object tsSettings: TTabSheet
Caption = 'groffstudio settings'
- ClientHeight = 631
- ClientWidth = 833
+ ClientHeight = 632
+ ClientWidth = 835
object chkAutoSaveBuildSettings: TCheckBox
Left = 0
- Height = 19
+ Height = 18
Top = 16
- Width = 312
+ Width = 342
Caption = 'Save and restore the chosen build settings for next time'
TabOrder = 0
end
object btnSaveSettings: TButton
- Left = 744
+ Left = 746
Height = 25
- Top = 600
+ Top = 601
Width = 91
Anchors = [akRight, akBottom]
Caption = 'save settings'
OnClick = btnSaveSettingsClick
TabOrder = 1
end
object Label14: TLabel
Left = 0
- Height = 15
+ Height = 16
Top = 48
- Width = 129
+ Width = 150
Caption = 'Yes, that''s all for now. :-)'
+ ParentColor = False
end
end
object tsGroff: TTabSheet
Caption = 'groff version'
- ClientHeight = 631
- ClientWidth = 833
+ ClientHeight = 632
+ ClientWidth = 835
object GroupBox2: TGroupBox
Left = 20
Height = 57
- Top = 566
- Width = 793
+ Top = 567
+ Width = 795
Align = alBottom
BorderSpacing.Left = 20
BorderSpacing.Right = 20
BorderSpacing.Bottom = 8
Caption = 'groff for Windows'
- ClientHeight = 37
- ClientWidth = 789
+ ClientHeight = 38
+ ClientWidth = 785
TabOrder = 0
object Label6: TLabel
Left = 8
- Height = 15
+ Height = 16
Top = 8
- Width = 108
+ Width = 125
Caption = 'latest version online:'
+ ParentColor = False
end
object edtOnlineGroffVersionWindows: TEdit
Left = 136
- Height = 15
+ Height = 17
Top = 8
- Width = 556
+ Width = 552
Anchors = [akTop, akLeft, akRight]
BorderStyle = bsNone
Enabled = False
TabOrder = 0
Text = 'fetching ...'
end
object btnDownloadGroffWindows: TButton
- Left = 700
+ Left = 696
Height = 25
Top = 5
Width = 80
Anchors = [akTop, akRight]
Caption = 'download it'
@@ -816,155 +823,167 @@
TabOrder = 1
end
end
object Label7: TLabel
Left = 8
- Height = 30
+ Height = 32
Top = 8
- Width = 821
+ Width = 823
Anchors = [akTop, akLeft, akRight]
Caption = 'as you might guess, groffstudio requires a working installation of groff. this page performs the basic checks for you. note that on windows, everything is harder than it should. :-)'
Constraints.MaxHeight = 582
+ ParentColor = False
WordWrap = True
end
object Label9: TLabel
Left = 8
- Height = 15
+ Height = 16
Top = 56
- Width = 70
+ Width = 81
Caption = 'groff version:'
+ ParentColor = False
end
object edtGroffInstalledVersion: TEdit
Left = 144
- Height = 15
+ Height = 17
Top = 56
- Width = 685
+ Width = 687
Anchors = [akTop, akLeft, akRight]
BorderStyle = bsNone
Enabled = False
TabOrder = 1
end
object lblTroffCommandNotFound: TLabel
Left = 8
- Height = 45
+ Height = 48
Top = 112
- Width = 820
+ Width = 822
Anchors = [akTop, akLeft, akRight]
Caption = 'groff was not found. in order to use groffstudio, you absolutely need groff in your PATH variable. on unix and unix-like systems, you''ll need to edit the $PATH variable. on windows, i warmly recommend the Rapid Environment Editor for that.'#13#10'please exit groffstudio at your nearest convenience and adjust your PATH variables. then try again.'
Font.Color = clRed
+ ParentColor = False
ParentFont = False
Visible = False
WordWrap = True
end
object edtGroffstudioInstalledVersion: TEdit
Left = 144
- Height = 15
+ Height = 17
Top = 77
- Width = 685
+ Width = 687
Anchors = [akTop, akLeft, akRight]
BorderStyle = bsNone
Enabled = False
TabOrder = 2
end
object Label10: TLabel
Left = 8
- Height = 15
+ Height = 16
Top = 77
- Width = 103
+ Width = 118
Caption = 'groffstudio version:'
+ ParentColor = False
end
end
object tsAbout: TTabSheet
Caption = 'about groffstudio'
- ClientHeight = 631
- ClientWidth = 833
+ ClientHeight = 632
+ ClientWidth = 835
object lblAboutProductName: TLabel
Left = 0
- Height = 61
+ Height = 53
Top = 16
- Width = 315
+ Width = 297
Caption = 'groffstudio x.y.z'
Font.Color = clBlue
Font.Height = -45
+ ParentColor = False
ParentFont = False
end
object Label8: TLabel
Left = 20
- Height = 15
+ Height = 16
Top = 80
- Width = 217
+ Width = 246
Caption = 'brought to you by tux0r and contributors'
+ ParentColor = False
end
object Label11: TLabel
Left = 0
- Height = 15
+ Height = 16
Top = 128
- Width = 45
+ Width = 53
Caption = 'Website:'
Font.Style = [fsItalic]
+ ParentColor = False
ParentFont = False
end
object Label12: TLabel
Left = 0
- Height = 15
+ Height = 16
Top = 152
- Width = 57
+ Width = 69
Caption = 'Repository:'
Font.Style = [fsItalic]
+ ParentColor = False
ParentFont = False
end
object Label13: TLabel
Left = 0
- Height = 15
+ Height = 16
Top = 176
- Width = 99
+ Width = 119
Caption = 'Repository (mirror):'
Font.Style = [fsItalic]
+ ParentColor = False
ParentFont = False
end
object mLicense: TMemo
Left = 0
Height = 418
Top = 216
- Width = 840
+ Width = 842
Anchors = [akTop, akLeft, akRight]
ScrollBars = ssAutoBoth
TabOrder = 0
end
object lblWebsite: TLabel
Cursor = crHandPoint
Left = 120
- Height = 15
+ Height = 16
Top = 128
- Width = 99
+ Width = 113
Caption = 'groff.tuxproject.de'
Font.Color = clBlue
Font.Style = [fsUnderline]
+ ParentColor = False
ParentFont = False
OnClick = lblWebsiteClick
end
object lblFossilRepo: TLabel
Cursor = crHandPoint
Left = 120
- Height = 15
+ Height = 16
Top = 152
- Width = 121
+ Width = 140
Caption = 'code.rosaelefanten.org'
Font.Color = clBlue
Font.Style = [fsUnderline]
+ ParentColor = False
ParentFont = False
OnClick = lblFossilRepoClick
end
object lblGithubRepo: TLabel
Cursor = crHandPoint
Left = 120
- Height = 15
+ Height = 16
Top = 176
- Width = 62
+ Width = 68
Caption = 'github.com'
Font.Color = clBlue
Font.Style = [fsUnderline]
+ ParentColor = False
ParentFont = False
OnClick = lblGithubRepoClick
end
end
end
Index: src/unit1.pas
==================================================================
--- src/unit1.pas
+++ src/unit1.pas
@@ -23,12 +23,12 @@
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls,
ExtCtrls, Buttons, ExtendedNotebook, SynEdit, fphttpclient, opensslsockets,
RegExpr, LCLIntf, LCLType, IniPropStorage, Process, Helpers, fileinfo,
{$IF DEFINED(WINDOWS)}
winpeimagereader,
- {$ELSEIF DEFINED(MACOS)}
- machoreader,
+ {$ELSEIF DEFINED(DARWIN)}
+ machoreader, ssockets, sslsockets, sslbase,
{$ELSEIF DEFINED(LINUX)}
elfreader,
{$ENDIF}
BuildOutputWindow;
@@ -99,17 +99,21 @@
procedure lblGithubRepoClick(Sender: TObject);
procedure lblWebsiteClick(Sender: TObject);
procedure rdPdfChange(Sender: TObject);
procedure rdPsChange(Sender: TObject);
procedure SynEdit1Change(Sender: TObject);
+{$IFDEF DARWIN}
+ procedure GetSocketHandler(Sender: TObject; const UseSSL: Boolean; out AHandler: TSocketHandler);
+{$ENDIF}
private
var currentGroffFilePath: String;
var currentGroffFileName: String;
var hasGroff: Boolean;
var unsavedChanges: Boolean;
+{$IFDEF WINDOWS}
var latestGroffWindowsUrl: String;
-
+{$ENDIF}
var storeBuildSettings: Boolean;
public
end;
@@ -125,15 +129,21 @@
procedure TMainForm.FormCreate(Sender: TObject);
var
GroffOutputVersion: String;
OnlineVersionsFile: String;
- reGroffVersion, reGroffStudioVersion: TRegExpr;
+ {$IFDEF WINDOWS}
+ reGroffVersion: TRegExpr;
+ {$ENDIF}
+ reGroffStudioVersion: TRegExpr;
FileVerInfo: TFileVersionInfo;
HasVersionUpdate: Integer;
GroffHelpers: TGroffHelpers;
ResStream: TResourceStream;
+ {$IFDEF DARWIN}
+ HTTPClient: TFPHttpClient;
+ {$ENDIF}
begin
// What's the current running groff version?
if RunCommand('troff', ['--version'], GroffOutputVersion) then
begin
edtGroffInstalledVersion.Text := GroffOutputVersion;
@@ -172,19 +182,19 @@
chkPdfMark.Checked := iniStorage.ReadBoolean('BuildUsePdfMark', False);
rdPs.Checked := iniStorage.ReadBoolean('BuildToPostscript', False);
rdPdf.Checked := iniStorage.ReadBoolean('BuildToPDF', False);
end;
- {$IFDEF WINDOWS}
// What's the latest available version?
FileVerInfo := TFileVersionInfo.Create(nil);
try
FileVerInfo.ReadFileInfo;
edtGroffStudioInstalledVersion.Text := FileVerInfo.VersionStrings.Values['FileVersion'];
lblAboutProductName.Caption := FileVerInfo.VersionStrings.Values['ProductName'] + ' ' + FileVerInfo.VersionStrings.Values['FileVersion'];
+ {$IFDEF WINDOWS}
OnlineVersionsFile := TFPCustomHTTPClient.SimpleGet('https://groff.tuxproject.de/updates/versions.txt');
reGroffVersion := TRegExpr.Create('groff-win ([\d\.]+) (.*)$');
reGroffVersion.ModifierM := True;
if reGroffVersion.Exec(OnlineVersionsFile) then
begin
@@ -206,19 +216,41 @@
if HasVersionUpdate > 0 then
MainStatusBar.Panels[2].Text := 'update ' + reGroffStudioVersion.Match[1] + ' available'
else
MainStatusBar.Panels[2].Text := IntToStr(HasVersionUpdate);
end else MainStatusBar.Panels[2].Text := '';
+ {$ELSE}
+ // Non-Windows platforms won't need some of that.
+ {$IFDEF DARWIN}
+ // What's the latest available version?
+ MainStatusBar.Panels[2].Text := '';
+ try
+ HTTPClient := TFPHTTPClient.Create(Nil);
+ HTTPClient.OnGetSocketHandler := @GetSocketHandler;
+ OnlineVersionsFile := HTTPClient.SimpleGet('https://groff.tuxproject.de/updates/versions.txt');
+
+ reGroffStudioVersion := TRegExpr.Create('studio-macos ([\d\.]+) (.*)$');
+ reGroffStudioVersion.ModifierM := True;
+ if reGroffStudioVersion.Exec(OnlineVersionsFile) then
+ begin
+ // Compare the two versions - ours and the online one:
+ GroffHelpers.VerStrCompare(reGroffStudioVersion.Match[1], FileVerInfo.VersionStrings.Values['FileVersion'], HasVersionUpdate);
+ if HasVersionUpdate > 0 then
+ MainStatusBar.Panels[2].Text := 'update ' + reGroffStudioVersion.Match[1] + ' available'
+ else
+ MainStatusBar.Panels[2].Text := IntToStr(HasVersionUpdate);
+ end;
+ finally
+ HTTPClient.Free;
+ end;
+ {$ENDIF}
+ edtOnlineGroffVersionWindows.Text := 'n/a';
+ btnDownloadGroffWindows.Enabled := False;
+ {$ENDIF}
finally
FileVerInfo.Free;
end;
- {$ELSE}
- // Non-Windows platforms won't need all that.
- edtOnlineGroffVersionWindows.Text := 'n/a';
- btnDownloadGroffWindows.Enabled := False;
- MainStatusBar.Panels[2].Text := '';
- {$ENDIF}
// Loaded file display
MainStatusBar.Panels[0].Text := '';
// Groff build status
@@ -392,8 +424,19 @@
BoxStyle := MB_ICONQUESTION + MB_YESNO;
Reply := MessageBox('Do you want to save the document first?', 'UnsavedChanges', BoxStyle);
if Reply = IDYES then SynEdit1.Lines.SaveToFile(currentGroffFilePath);
end;
end;
+
+{$IFDEF DARWIN}
+// Fix HTTPS on macOS:
+procedure TMainForm.GetSocketHandler(Sender: TObject; const UseSSL: Boolean; out AHandler: TSocketHandler);
+begin
+ if UseSSL then begin
+ AHandler := TSSLSocketHandler.Create;
+ TSSLSocketHandler(AHandler).SSLType := stTLSv1_2;
+ end else AHandler := TSocketHandler.Create;
+end;
+{$ENDIF}
end.