mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-10-26 23:12:38 +02:00
Move some files in libse
This commit is contained in:
parent
844834c951
commit
bc78b4e0e8
@ -227,11 +227,7 @@ Note: Do check free disk space.</WaveFileMalformed>
|
||||
<TransportStreamFileNameEnding>File name ending</TransportStreamFileNameEnding>
|
||||
<TransportStreamSettingsButton>TS settings...</TransportStreamSettingsButton>
|
||||
<RemoveLineBreaks>Remove line-breaks</RemoveLineBreaks>
|
||||
<DeleteLines>Delete lines</DeleteLines>
|
||||
<TryToUseSourceEncoding>Try to use source encoding</TryToUseSourceEncoding>
|
||||
<DeleteFirstLines>Delete first lines</DeleteFirstLines>
|
||||
<DeleteLastLines>Delete last lines</DeleteLastLines>
|
||||
<DeleteContaining>Delete lines containing</DeleteContaining>
|
||||
<MkvLanguageInOutputFileName>"Language" in output file name</MkvLanguageInOutputFileName>
|
||||
<MkvLanguageInOutputFileNameX>Matroska (.mkv) "Language" in output file name: {0}</MkvLanguageInOutputFileNameX>
|
||||
<MkvLanguageStyleTwoLetter>Two letter language code</MkvLanguageStyleTwoLetter>
|
||||
@ -2110,9 +2106,6 @@ can edit in same subtitle file (collaboration)</Information>
|
||||
<ListViewAndTextBox>List view and text box</ListViewAndTextBox>
|
||||
<ListView>List view</ListView>
|
||||
<TextBox>Text box</TextBox>
|
||||
<UseSyntaxColoring>Use syntax coloring</UseSyntaxColoring>
|
||||
<HtmlColor>Html color</HtmlColor>
|
||||
<AssaColor>ASSA color</AssaColor>
|
||||
<UpdateShortcut>Update</UpdateShortcut>
|
||||
<FoucsSetVideoPosition>Focus set video position</FoucsSetVideoPosition>
|
||||
<ToggleDockUndockOfVideoControls>Toggle dock/undock of video controls</ToggleDockUndockOfVideoControls>
|
||||
@ -2124,8 +2117,6 @@ can edit in same subtitle file (collaboration)</Information>
|
||||
<AdjustSetStartAutoDurationAndGoToNext>Set start, auto duration and go to next</AdjustSetStartAutoDurationAndGoToNext>
|
||||
<AdjustSetEndNextStartAndGoToNext>Set end, next start and go to next</AdjustSetEndNextStartAndGoToNext>
|
||||
<AdjustStartDownEndUpAndGoToNext>Key down=set start, Key up=set end and go to next</AdjustStartDownEndUpAndGoToNext>
|
||||
<AdjustSetStartAndEndOfPrevious>Set start and set end of previous (minus min gap)</AdjustSetStartAndEndOfPrevious>
|
||||
<AdjustSetStartAndEndOfPreviousAndGoToNext>Set start and set end of previous and go to next (minus min gap)</AdjustSetStartAndEndOfPreviousAndGoToNext>
|
||||
<AdjustSelected100MsForward>Move selected lines 100 ms forward</AdjustSelected100MsForward>
|
||||
<AdjustSelected100MsBack>Move selected lines 100 ms back</AdjustSelected100MsBack>
|
||||
<AdjustStartXMsBack>Move start {0} ms back</AdjustStartXMsBack>
|
||||
@ -2160,7 +2151,6 @@ can edit in same subtitle file (collaboration)</Information>
|
||||
<MainCreateStartDownEndUp>Insert new subtitle at key-down, set end time at key-up</MainCreateStartDownEndUp>
|
||||
<MergeDialog>Merge dialog (insert dashes)</MergeDialog>
|
||||
<GoToNext>Go to next line</GoToNext>
|
||||
<GoToNextCursorAtEnd>Go to next line and set cursor at end</GoToNextCursorAtEnd>
|
||||
<GoToPrevious>Go to previous line</GoToPrevious>
|
||||
<GoToCurrentSubtitleStart>Go to current line start</GoToCurrentSubtitleStart>
|
||||
<GoToCurrentSubtitleEnd>Go to current line end</GoToCurrentSubtitleEnd>
|
||||
@ -2284,7 +2274,6 @@ can edit in same subtitle file (collaboration)</Information>
|
||||
<MainTextBoxMoveLastWordDownCurrent>Move last word from first line down (current subtitle)</MainTextBoxMoveLastWordDownCurrent>
|
||||
<MainTextBoxSelectionToLower>Selection to lowercase</MainTextBoxSelectionToLower>
|
||||
<MainTextBoxSelectionToUpper>Selection to uppercase</MainTextBoxSelectionToUpper>
|
||||
<MainTextBoxSelectionToggleCasing>Toggle casing of selection (propercase/uppercase/lowercase)</MainTextBoxSelectionToggleCasing>
|
||||
<MainTextBoxSelectionToRuby>Selection to Ruby (Japanese)</MainTextBoxSelectionToRuby>
|
||||
<MainTextBoxToggleAutoDuration>Toggle auto duration</MainTextBoxToggleAutoDuration>
|
||||
<MainTextBoxAutoBreak>Auto break text</MainTextBoxAutoBreak>
|
||||
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using Nikse.SubtitleEdit.Core.AudioToText.PhocketSphinx;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.AudioToText.PocketSphinx
|
||||
{
|
||||
|
@ -1,6 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Nikse.SubtitleEdit.Core.AudioToText.PhocketSphinx;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Dictionaries;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.AudioToText.PocketSphinx
|
||||
|
@ -1,6 +1,4 @@
|
||||
using System;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.AudioToText.PhocketSphinx
|
||||
namespace Nikse.SubtitleEdit.Core.AudioToText
|
||||
{
|
||||
public class ResultText
|
||||
{
|
||||
|
@ -25,6 +25,7 @@ using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.BluRaySup
|
||||
{
|
||||
|
@ -20,6 +20,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.BluRaySup
|
||||
{
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Forms.FixCommonErrors;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.CDG
|
||||
|
@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class BmpReader
|
||||
{
|
@ -3,7 +3,7 @@ using System.IO;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class BookmarkPersistence
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class CharUtils
|
||||
{
|
@ -1,248 +1,248 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Configuration settings via Singleton pattern
|
||||
/// </summary>
|
||||
public class Configuration
|
||||
{
|
||||
private static readonly Lazy<Configuration> Instance = new Lazy<Configuration>(() => new Configuration());
|
||||
|
||||
private readonly Lazy<Settings> _settings;
|
||||
private readonly IEnumerable<Encoding> _encodings;
|
||||
|
||||
public static readonly string BaseDirectory = GetBaseDirectory();
|
||||
public static readonly string DataDirectory = GetDataDirectory();
|
||||
public static readonly string TesseractOriginalDirectory = BaseDirectory + "Tesseract302" + Path.DirectorySeparatorChar;
|
||||
public static readonly string DictionariesDirectory = DataDirectory + "Dictionaries" + Path.DirectorySeparatorChar;
|
||||
public static readonly string SpectrogramsDirectory = DataDirectory + "Spectrograms" + Path.DirectorySeparatorChar;
|
||||
public static readonly string SceneChangesDirectory = DataDirectory + "SceneChanges" + Path.DirectorySeparatorChar;
|
||||
public static readonly string AutoBackupDirectory = DataDirectory + "AutoBackup" + Path.DirectorySeparatorChar;
|
||||
public static readonly string VobSubCompareDirectory = DataDirectory + "VobSub" + Path.DirectorySeparatorChar;
|
||||
public static readonly string TesseractDirectory = DataDirectory + "Tesseract500.Alpha.20200328" + Path.DirectorySeparatorChar;
|
||||
public static readonly string Tesseract302Directory = DataDirectory + "Tesseract302" + Path.DirectorySeparatorChar;
|
||||
public static readonly string WaveformsDirectory = DataDirectory + "Waveforms" + Path.DirectorySeparatorChar;
|
||||
public static readonly string PluginsDirectory = DataDirectory + "Plugins" + Path.DirectorySeparatorChar;
|
||||
public static readonly string IconsDirectory = BaseDirectory + "Icons" + Path.DirectorySeparatorChar;
|
||||
public static readonly string OcrDirectory = DataDirectory + "Ocr" + Path.DirectorySeparatorChar;
|
||||
public static readonly string SettingsFileName = DataDirectory + "Settings.xml";
|
||||
public static readonly string TesseractDataDirectory = GetTesseractDataDirectory();
|
||||
public static readonly string Tesseract302DataDirectory = GetTesseract302DataDirectory();
|
||||
|
||||
public static readonly string DefaultLinuxFontName = "DejaVu Serif";
|
||||
|
||||
private Configuration()
|
||||
{
|
||||
_encodings = GetAvailableEncodings();
|
||||
_settings = new Lazy<Settings>(Settings.GetSettings);
|
||||
}
|
||||
|
||||
private const int PlatformWindows = 1;
|
||||
private const int PlatformLinux = 2;
|
||||
private const int PlatformMac = 3;
|
||||
private static int _platform;
|
||||
|
||||
public static bool IsRunningOnWindows
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_platform == 0)
|
||||
{
|
||||
_platform = GetPlatform();
|
||||
}
|
||||
return _platform == PlatformWindows;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsRunningOnLinux
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_platform == 0)
|
||||
{
|
||||
_platform = GetPlatform();
|
||||
}
|
||||
return _platform == PlatformLinux;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsRunningOnMac
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_platform == 0)
|
||||
{
|
||||
_platform = GetPlatform();
|
||||
}
|
||||
return _platform == PlatformMac;
|
||||
}
|
||||
}
|
||||
|
||||
private static int GetPlatform()
|
||||
{
|
||||
// Current versions of Mono report MacOSX platform as Unix
|
||||
return Environment.OSVersion.Platform == PlatformID.MacOSX || (Environment.OSVersion.Platform == PlatformID.Unix && Directory.Exists("/Applications") && Directory.Exists("/System") && Directory.Exists("/Users"))
|
||||
? PlatformMac
|
||||
: Environment.OSVersion.Platform == PlatformID.Unix
|
||||
? PlatformLinux
|
||||
: PlatformWindows;
|
||||
}
|
||||
|
||||
public static Settings Settings => Instance.Value._settings.Value;
|
||||
|
||||
public static IEnumerable<Encoding> AvailableEncodings => Instance.Value._encodings;
|
||||
|
||||
private static string GetInstallerPath()
|
||||
{
|
||||
const string valueName = "InstallLocation";
|
||||
var value = RegistryUtil.GetValue(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SubtitleEdit_is1", valueName);
|
||||
if (value != null && Directory.Exists(value))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
value = RegistryUtil.GetValue(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\SubtitleEdit_is1", valueName);
|
||||
if (value != null && Directory.Exists(value))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static string GetBaseDirectory()
|
||||
{
|
||||
var assembly = System.Reflection.Assembly.GetEntryAssembly() ?? System.Reflection.Assembly.GetExecutingAssembly();
|
||||
return Path.GetDirectoryName(assembly.Location) + Path.DirectorySeparatorChar;
|
||||
}
|
||||
|
||||
private static string GetDataDirectory()
|
||||
{
|
||||
// hack for unit tests
|
||||
var assembly = System.Reflection.Assembly.GetEntryAssembly() ?? System.Reflection.Assembly.GetExecutingAssembly();
|
||||
var srcTestResultsIndex = assembly.Location.IndexOf(@"\src\TestResults", StringComparison.Ordinal);
|
||||
if (srcTestResultsIndex > 0)
|
||||
{
|
||||
var debugOrReleaseFolderName = "Release";
|
||||
#if DEBUG
|
||||
debugOrReleaseFolderName = "Debug";
|
||||
#endif
|
||||
return $@"{assembly.Location.Substring(0, srcTestResultsIndex)}\src\Test\bin\{debugOrReleaseFolderName}\";
|
||||
}
|
||||
|
||||
var appDataRoamingPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Subtitle Edit");
|
||||
if (IsRunningOnLinux || IsRunningOnMac)
|
||||
{
|
||||
if (!Directory.Exists(appDataRoamingPath) && !File.Exists(Path.Combine(BaseDirectory, ".PACKAGE-MANAGER")))
|
||||
{
|
||||
try
|
||||
{
|
||||
var path = Path.Combine(Directory.CreateDirectory(Path.Combine(BaseDirectory, "Dictionaries")).FullName, "not-a-word-list");
|
||||
File.Create(path).Close();
|
||||
File.Delete(path);
|
||||
return BaseDirectory; // user installation
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
Directory.CreateDirectory(Path.Combine(appDataRoamingPath, "Dictionaries"));
|
||||
return appDataRoamingPath + Path.DirectorySeparatorChar; // system installation
|
||||
}
|
||||
|
||||
var installerPath = GetInstallerPath();
|
||||
var hasUninstallFiles = Directory.GetFiles(BaseDirectory, "unins*.*").Length > 0;
|
||||
var hasDictionaryFolder = Directory.Exists(Path.Combine(BaseDirectory, "Dictionaries"));
|
||||
|
||||
if ((installerPath == null || !installerPath.TrimEnd(Path.DirectorySeparatorChar).Equals(BaseDirectory.TrimEnd(Path.DirectorySeparatorChar), StringComparison.OrdinalIgnoreCase))
|
||||
&& !hasUninstallFiles && (hasDictionaryFolder || !Directory.Exists(Path.Combine(appDataRoamingPath, "Dictionaries"))))
|
||||
{
|
||||
return BaseDirectory;
|
||||
}
|
||||
|
||||
if (Directory.Exists(appDataRoamingPath))
|
||||
{
|
||||
return appDataRoamingPath + Path.DirectorySeparatorChar;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Directory.CreateDirectory(appDataRoamingPath);
|
||||
Directory.CreateDirectory(Path.Combine(appDataRoamingPath, "Dictionaries"));
|
||||
return appDataRoamingPath + Path.DirectorySeparatorChar;
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw new Exception("Please re-install Subtitle Edit (installer version)");
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetTesseractDataDirectory()
|
||||
{
|
||||
if (IsRunningOnLinux || IsRunningOnMac)
|
||||
{
|
||||
if (Directory.Exists("/usr/share/tesseract-ocr/4.00/tessdata"))
|
||||
{
|
||||
return "/usr/share/tesseract-ocr/4.00/tessdata";
|
||||
}
|
||||
|
||||
if (Directory.Exists("/usr/share/tesseract-ocr/tessdata"))
|
||||
{
|
||||
return "/usr/share/tesseract-ocr/tessdata";
|
||||
}
|
||||
|
||||
if (Directory.Exists("/usr/share/tessdata"))
|
||||
{
|
||||
return "/usr/share/tessdata";
|
||||
}
|
||||
}
|
||||
return Path.Combine(TesseractDirectory, "tessdata");
|
||||
}
|
||||
|
||||
private static string GetTesseract302DataDirectory()
|
||||
{
|
||||
if (IsRunningOnLinux || IsRunningOnMac)
|
||||
{
|
||||
if (Directory.Exists("/usr/share/tesseract-ocr/tessdata"))
|
||||
{
|
||||
return "/usr/share/tesseract-ocr/tessdata";
|
||||
}
|
||||
|
||||
if (Directory.Exists("/usr/share/tesseract/tessdata"))
|
||||
{
|
||||
return "/usr/share/tesseract/tessdata";
|
||||
}
|
||||
|
||||
if (Directory.Exists("/usr/share/tessdata"))
|
||||
{
|
||||
return "/usr/share/tessdata";
|
||||
}
|
||||
}
|
||||
return Path.Combine(Tesseract302Directory, "tessdata");
|
||||
}
|
||||
|
||||
private static IEnumerable<Encoding> GetAvailableEncodings()
|
||||
{
|
||||
var encodings = new List<Encoding>();
|
||||
foreach (var ei in Encoding.GetEncodings())
|
||||
{
|
||||
try
|
||||
{
|
||||
encodings.Add(Encoding.GetEncoding(ei.CodePage));
|
||||
}
|
||||
catch
|
||||
{
|
||||
// though advertised, this code page is not supported
|
||||
}
|
||||
}
|
||||
return encodings.AsEnumerable();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
/// <summary>
|
||||
/// Configuration settings via Singleton pattern
|
||||
/// </summary>
|
||||
public class Configuration
|
||||
{
|
||||
private static readonly Lazy<Configuration> Instance = new Lazy<Configuration>(() => new Configuration());
|
||||
|
||||
private readonly Lazy<Settings> _settings;
|
||||
private readonly IEnumerable<Encoding> _encodings;
|
||||
|
||||
public static readonly string BaseDirectory = GetBaseDirectory();
|
||||
public static readonly string DataDirectory = GetDataDirectory();
|
||||
public static readonly string TesseractOriginalDirectory = BaseDirectory + "Tesseract302" + Path.DirectorySeparatorChar;
|
||||
public static readonly string DictionariesDirectory = DataDirectory + "Dictionaries" + Path.DirectorySeparatorChar;
|
||||
public static readonly string SpectrogramsDirectory = DataDirectory + "Spectrograms" + Path.DirectorySeparatorChar;
|
||||
public static readonly string SceneChangesDirectory = DataDirectory + "SceneChanges" + Path.DirectorySeparatorChar;
|
||||
public static readonly string AutoBackupDirectory = DataDirectory + "AutoBackup" + Path.DirectorySeparatorChar;
|
||||
public static readonly string VobSubCompareDirectory = DataDirectory + "VobSub" + Path.DirectorySeparatorChar;
|
||||
public static readonly string TesseractDirectory = DataDirectory + "Tesseract500.Alpha.20200328" + Path.DirectorySeparatorChar;
|
||||
public static readonly string Tesseract302Directory = DataDirectory + "Tesseract302" + Path.DirectorySeparatorChar;
|
||||
public static readonly string WaveformsDirectory = DataDirectory + "Waveforms" + Path.DirectorySeparatorChar;
|
||||
public static readonly string PluginsDirectory = DataDirectory + "Plugins" + Path.DirectorySeparatorChar;
|
||||
public static readonly string IconsDirectory = BaseDirectory + "Icons" + Path.DirectorySeparatorChar;
|
||||
public static readonly string OcrDirectory = DataDirectory + "Ocr" + Path.DirectorySeparatorChar;
|
||||
public static readonly string SettingsFileName = DataDirectory + "Settings.xml";
|
||||
public static readonly string TesseractDataDirectory = GetTesseractDataDirectory();
|
||||
public static readonly string Tesseract302DataDirectory = GetTesseract302DataDirectory();
|
||||
|
||||
public static readonly string DefaultLinuxFontName = "DejaVu Serif";
|
||||
|
||||
private Configuration()
|
||||
{
|
||||
_encodings = GetAvailableEncodings();
|
||||
_settings = new Lazy<Settings>(Settings.GetSettings);
|
||||
}
|
||||
|
||||
private const int PlatformWindows = 1;
|
||||
private const int PlatformLinux = 2;
|
||||
private const int PlatformMac = 3;
|
||||
private static int _platform;
|
||||
|
||||
public static bool IsRunningOnWindows
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_platform == 0)
|
||||
{
|
||||
_platform = GetPlatform();
|
||||
}
|
||||
return _platform == PlatformWindows;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsRunningOnLinux
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_platform == 0)
|
||||
{
|
||||
_platform = GetPlatform();
|
||||
}
|
||||
return _platform == PlatformLinux;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsRunningOnMac
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_platform == 0)
|
||||
{
|
||||
_platform = GetPlatform();
|
||||
}
|
||||
return _platform == PlatformMac;
|
||||
}
|
||||
}
|
||||
|
||||
private static int GetPlatform()
|
||||
{
|
||||
// Current versions of Mono report MacOSX platform as Unix
|
||||
return Environment.OSVersion.Platform == PlatformID.MacOSX || (Environment.OSVersion.Platform == PlatformID.Unix && Directory.Exists("/Applications") && Directory.Exists("/System") && Directory.Exists("/Users"))
|
||||
? PlatformMac
|
||||
: Environment.OSVersion.Platform == PlatformID.Unix
|
||||
? PlatformLinux
|
||||
: PlatformWindows;
|
||||
}
|
||||
|
||||
public static Settings Settings => Instance.Value._settings.Value;
|
||||
|
||||
public static IEnumerable<Encoding> AvailableEncodings => Instance.Value._encodings;
|
||||
|
||||
private static string GetInstallerPath()
|
||||
{
|
||||
const string valueName = "InstallLocation";
|
||||
var value = RegistryUtil.GetValue(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SubtitleEdit_is1", valueName);
|
||||
if (value != null && Directory.Exists(value))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
value = RegistryUtil.GetValue(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\SubtitleEdit_is1", valueName);
|
||||
if (value != null && Directory.Exists(value))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static string GetBaseDirectory()
|
||||
{
|
||||
var assembly = System.Reflection.Assembly.GetEntryAssembly() ?? System.Reflection.Assembly.GetExecutingAssembly();
|
||||
return Path.GetDirectoryName(assembly.Location) + Path.DirectorySeparatorChar;
|
||||
}
|
||||
|
||||
private static string GetDataDirectory()
|
||||
{
|
||||
// hack for unit tests
|
||||
var assembly = System.Reflection.Assembly.GetEntryAssembly() ?? System.Reflection.Assembly.GetExecutingAssembly();
|
||||
var srcTestResultsIndex = assembly.Location.IndexOf(@"\src\TestResults", StringComparison.Ordinal);
|
||||
if (srcTestResultsIndex > 0)
|
||||
{
|
||||
var debugOrReleaseFolderName = "Release";
|
||||
#if DEBUG
|
||||
debugOrReleaseFolderName = "Debug";
|
||||
#endif
|
||||
return $@"{assembly.Location.Substring(0, srcTestResultsIndex)}\src\Test\bin\{debugOrReleaseFolderName}\";
|
||||
}
|
||||
|
||||
var appDataRoamingPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Subtitle Edit");
|
||||
if (IsRunningOnLinux || IsRunningOnMac)
|
||||
{
|
||||
if (!Directory.Exists(appDataRoamingPath) && !File.Exists(Path.Combine(BaseDirectory, ".PACKAGE-MANAGER")))
|
||||
{
|
||||
try
|
||||
{
|
||||
var path = Path.Combine(Directory.CreateDirectory(Path.Combine(BaseDirectory, "Dictionaries")).FullName, "not-a-word-list");
|
||||
File.Create(path).Close();
|
||||
File.Delete(path);
|
||||
return BaseDirectory; // user installation
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
}
|
||||
Directory.CreateDirectory(Path.Combine(appDataRoamingPath, "Dictionaries"));
|
||||
return appDataRoamingPath + Path.DirectorySeparatorChar; // system installation
|
||||
}
|
||||
|
||||
var installerPath = GetInstallerPath();
|
||||
var hasUninstallFiles = Directory.GetFiles(BaseDirectory, "unins*.*").Length > 0;
|
||||
var hasDictionaryFolder = Directory.Exists(Path.Combine(BaseDirectory, "Dictionaries"));
|
||||
|
||||
if ((installerPath == null || !installerPath.TrimEnd(Path.DirectorySeparatorChar).Equals(BaseDirectory.TrimEnd(Path.DirectorySeparatorChar), StringComparison.OrdinalIgnoreCase))
|
||||
&& !hasUninstallFiles && (hasDictionaryFolder || !Directory.Exists(Path.Combine(appDataRoamingPath, "Dictionaries"))))
|
||||
{
|
||||
return BaseDirectory;
|
||||
}
|
||||
|
||||
if (Directory.Exists(appDataRoamingPath))
|
||||
{
|
||||
return appDataRoamingPath + Path.DirectorySeparatorChar;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Directory.CreateDirectory(appDataRoamingPath);
|
||||
Directory.CreateDirectory(Path.Combine(appDataRoamingPath, "Dictionaries"));
|
||||
return appDataRoamingPath + Path.DirectorySeparatorChar;
|
||||
}
|
||||
catch
|
||||
{
|
||||
throw new Exception("Please re-install Subtitle Edit (installer version)");
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetTesseractDataDirectory()
|
||||
{
|
||||
if (IsRunningOnLinux || IsRunningOnMac)
|
||||
{
|
||||
if (Directory.Exists("/usr/share/tesseract-ocr/4.00/tessdata"))
|
||||
{
|
||||
return "/usr/share/tesseract-ocr/4.00/tessdata";
|
||||
}
|
||||
|
||||
if (Directory.Exists("/usr/share/tesseract-ocr/tessdata"))
|
||||
{
|
||||
return "/usr/share/tesseract-ocr/tessdata";
|
||||
}
|
||||
|
||||
if (Directory.Exists("/usr/share/tessdata"))
|
||||
{
|
||||
return "/usr/share/tessdata";
|
||||
}
|
||||
}
|
||||
return Path.Combine(TesseractDirectory, "tessdata");
|
||||
}
|
||||
|
||||
private static string GetTesseract302DataDirectory()
|
||||
{
|
||||
if (IsRunningOnLinux || IsRunningOnMac)
|
||||
{
|
||||
if (Directory.Exists("/usr/share/tesseract-ocr/tessdata"))
|
||||
{
|
||||
return "/usr/share/tesseract-ocr/tessdata";
|
||||
}
|
||||
|
||||
if (Directory.Exists("/usr/share/tesseract/tessdata"))
|
||||
{
|
||||
return "/usr/share/tesseract/tessdata";
|
||||
}
|
||||
|
||||
if (Directory.Exists("/usr/share/tessdata"))
|
||||
{
|
||||
return "/usr/share/tessdata";
|
||||
}
|
||||
}
|
||||
return Path.Combine(Tesseract302Directory, "tessdata");
|
||||
}
|
||||
|
||||
private static IEnumerable<Encoding> GetAvailableEncodings()
|
||||
{
|
||||
var encodings = new List<Encoding>();
|
||||
foreach (var ei in Encoding.GetEncodings())
|
||||
{
|
||||
try
|
||||
{
|
||||
encodings.Add(Encoding.GetEncoding(ei.CodePage));
|
||||
}
|
||||
catch
|
||||
{
|
||||
// though advertised, this code page is not supported
|
||||
}
|
||||
}
|
||||
return encodings.AsEnumerable();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,10 +1,10 @@
|
||||
using Nikse.SubtitleEdit.Core.Enums;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using Nikse.SubtitleEdit.Core.Enums;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class ContinuationUtilities
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
using System.Globalization;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class CultureExtensions
|
||||
{
|
@ -1,9 +1,9 @@
|
||||
using Nikse.SubtitleEdit.Core.Enums;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.Enums;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class DialogSplitMerge
|
||||
{
|
@ -4,7 +4,7 @@ using System.Collections.ObjectModel;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class DvdSubtitleLanguage
|
||||
{
|
@ -4,7 +4,7 @@ using System;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public unsafe class FastBitmap
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
/// <summary>
|
||||
/// Exposes a <see cref="Stream"/> around a file, supporting synchronous read operations.
|
@ -2,7 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public abstract class FilePathComparer : IEqualityComparer<string>, IComparer<string>
|
||||
{
|
File diff suppressed because it is too large
Load Diff
@ -5,7 +5,7 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.Dictionaries;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class FixCasing
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class FixDurationLimits
|
||||
{
|
@ -1,52 +1,52 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
{
|
||||
public class HistoryItem
|
||||
{
|
||||
public int Index { get; set; }
|
||||
public DateTime Timestamp { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string FileName { get; set; }
|
||||
public DateTime FileModified { get; set; }
|
||||
public Subtitle Subtitle { get; set; }
|
||||
public string SubtitleFormatFriendlyName { get; set; }
|
||||
public Subtitle OriginalSubtitle { get; set; }
|
||||
public string OriginalSubtitleFileName { get; set; }
|
||||
public List<Paragraph> RedoParagraphs { get; set; }
|
||||
public List<Paragraph> RedoParagraphsAlternate { get; set; }
|
||||
public int RedoLineIndex { get; set; }
|
||||
public int RedoLinePosition { get; set; }
|
||||
public int RedoLinePositionAlternate { get; set; }
|
||||
public string RedoFileName { get; set; }
|
||||
public DateTime RedoFileModified { get; set; }
|
||||
public string RedoOriginalFileName { get; set; }
|
||||
public int LineIndex { get; set; }
|
||||
public int LinePosition { get; set; }
|
||||
public int LinePositionAlternate { get; set; }
|
||||
|
||||
public HistoryItem(int index, Subtitle subtitle, string description, string fileName, DateTime fileModified, string subtitleFormatFriendlyName, Subtitle originalSubtitle, string originalSubtitleFileName, int lineIndex, int linePosition, int linePositionAlternate)
|
||||
{
|
||||
Index = index;
|
||||
Timestamp = DateTime.Now;
|
||||
Subtitle = new Subtitle(subtitle);
|
||||
Description = description;
|
||||
FileName = fileName;
|
||||
FileModified = fileModified;
|
||||
SubtitleFormatFriendlyName = subtitleFormatFriendlyName;
|
||||
OriginalSubtitle = new Subtitle(originalSubtitle);
|
||||
OriginalSubtitleFileName = originalSubtitleFileName;
|
||||
LineIndex = lineIndex;
|
||||
LinePosition = linePosition;
|
||||
LinePositionAlternate = linePositionAlternate;
|
||||
RedoLineIndex = -1;
|
||||
RedoLinePosition = -1;
|
||||
}
|
||||
|
||||
public string ToHHMMSS()
|
||||
{
|
||||
return $"{Timestamp.Hour:00}:{Timestamp.Minute:00}:{Timestamp.Second:00}";
|
||||
}
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class HistoryItem
|
||||
{
|
||||
public int Index { get; set; }
|
||||
public DateTime Timestamp { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string FileName { get; set; }
|
||||
public DateTime FileModified { get; set; }
|
||||
public Subtitle Subtitle { get; set; }
|
||||
public string SubtitleFormatFriendlyName { get; set; }
|
||||
public Subtitle OriginalSubtitle { get; set; }
|
||||
public string OriginalSubtitleFileName { get; set; }
|
||||
public List<Paragraph> RedoParagraphs { get; set; }
|
||||
public List<Paragraph> RedoParagraphsAlternate { get; set; }
|
||||
public int RedoLineIndex { get; set; }
|
||||
public int RedoLinePosition { get; set; }
|
||||
public int RedoLinePositionAlternate { get; set; }
|
||||
public string RedoFileName { get; set; }
|
||||
public DateTime RedoFileModified { get; set; }
|
||||
public string RedoOriginalFileName { get; set; }
|
||||
public int LineIndex { get; set; }
|
||||
public int LinePosition { get; set; }
|
||||
public int LinePositionAlternate { get; set; }
|
||||
|
||||
public HistoryItem(int index, Subtitle subtitle, string description, string fileName, DateTime fileModified, string subtitleFormatFriendlyName, Subtitle originalSubtitle, string originalSubtitleFileName, int lineIndex, int linePosition, int linePositionAlternate)
|
||||
{
|
||||
Index = index;
|
||||
Timestamp = DateTime.Now;
|
||||
Subtitle = new Subtitle(subtitle);
|
||||
Description = description;
|
||||
FileName = fileName;
|
||||
FileModified = fileModified;
|
||||
SubtitleFormatFriendlyName = subtitleFormatFriendlyName;
|
||||
OriginalSubtitle = new Subtitle(originalSubtitle);
|
||||
OriginalSubtitleFileName = originalSubtitleFileName;
|
||||
LineIndex = lineIndex;
|
||||
LinePosition = linePosition;
|
||||
LinePositionAlternate = linePositionAlternate;
|
||||
RedoLineIndex = -1;
|
||||
RedoLinePosition = -1;
|
||||
}
|
||||
|
||||
public string ToHHMMSS()
|
||||
{
|
||||
return $"{Timestamp.Hour:00}:{Timestamp.Minute:00}:{Timestamp.Second:00}";
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@ using System.Drawing;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class IfoParser : IDisposable
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class ImageSplitterItem
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
/// <summary>
|
||||
/// Language codes according to ISO 639.2 https://www.loc.gov/standards/iso639-2/php/code_list.php
|
@ -1,6 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class IsoCountryCodes
|
||||
{
|
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@
|
||||
using System.IO;
|
||||
using System.IO.Compression;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class ManagedBitmap
|
||||
{
|
@ -2,7 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class MergeLinesSameTextUtils
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class MergeShortLinesUtils
|
||||
{
|
@ -2,7 +2,7 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
/// <summary>
|
||||
/// Hash from OpenSubtitles: http://trac.opensubtitles.org/projects/opensubtitles/wiki/HashSourceCodes
|
@ -1,4 +1,4 @@
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
// The MurmurHash3 algorithm was created by Austin Appleby and put into the public domain. See http://code.google.com/p/smhasher
|
||||
// This code is based on https://gist.github.com/automatonic/3725443
|
@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
internal static class NativeMethods
|
||||
{
|
@ -5,7 +5,7 @@ using System.Globalization;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class NetflixImsc11JapaneseToAss
|
||||
{
|
@ -5,7 +5,7 @@ using System.Drawing.Imaging;
|
||||
using System.IO;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class RunLengthTwoParts
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class NoBreakAfterItem : IComparable<NoBreakAfterItem>
|
||||
{
|
@ -1,122 +1,122 @@
|
||||
using System;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
{
|
||||
public class Paragraph
|
||||
{
|
||||
public int Number { get; set; }
|
||||
|
||||
public string Text { get; set; }
|
||||
|
||||
public TimeCode StartTime { get; set; }
|
||||
|
||||
public TimeCode EndTime { get; set; }
|
||||
|
||||
public TimeCode Duration => new TimeCode(EndTime.TotalMilliseconds - StartTime.TotalMilliseconds);
|
||||
|
||||
public bool Forced { get; set; }
|
||||
|
||||
public string Extra { get; set; }
|
||||
|
||||
public bool IsComment { get; set; }
|
||||
|
||||
public string Actor { get; set; }
|
||||
public string Region { get; set; }
|
||||
|
||||
public string MarginL { get; set; }
|
||||
public string MarginR { get; set; }
|
||||
public string MarginV { get; set; }
|
||||
|
||||
public string Effect { get; set; }
|
||||
|
||||
public int Layer { get; set; }
|
||||
|
||||
public string Id { get; }
|
||||
|
||||
public string Language { get; set; }
|
||||
|
||||
public string Style { get; set; }
|
||||
|
||||
public bool NewSection { get; set; }
|
||||
|
||||
public string Bookmark { get; set; }
|
||||
|
||||
public bool IsDefault => Math.Abs(StartTime.TotalMilliseconds) < 0.01 && Math.Abs(EndTime.TotalMilliseconds) < 0.01 && string.IsNullOrEmpty(Text);
|
||||
|
||||
private static string GenerateId()
|
||||
{
|
||||
return Guid.NewGuid().ToString();
|
||||
}
|
||||
|
||||
public Paragraph() : this(new TimeCode(), new TimeCode(), string.Empty)
|
||||
{
|
||||
}
|
||||
|
||||
public Paragraph(TimeCode startTime, TimeCode endTime, string text)
|
||||
{
|
||||
StartTime = startTime;
|
||||
EndTime = endTime;
|
||||
Text = text;
|
||||
Id = GenerateId();
|
||||
}
|
||||
|
||||
public Paragraph(Paragraph paragraph, bool generateNewId = true)
|
||||
{
|
||||
Number = paragraph.Number;
|
||||
Text = paragraph.Text;
|
||||
StartTime = new TimeCode(paragraph.StartTime.TotalMilliseconds);
|
||||
EndTime = new TimeCode(paragraph.EndTime.TotalMilliseconds);
|
||||
Forced = paragraph.Forced;
|
||||
Extra = paragraph.Extra;
|
||||
IsComment = paragraph.IsComment;
|
||||
Actor = paragraph.Actor;
|
||||
Region = paragraph.Region;
|
||||
MarginL = paragraph.MarginL;
|
||||
MarginR = paragraph.MarginR;
|
||||
MarginV = paragraph.MarginV;
|
||||
Effect = paragraph.Effect;
|
||||
Layer = paragraph.Layer;
|
||||
Id = generateNewId ? GenerateId() : paragraph.Id;
|
||||
Language = paragraph.Language;
|
||||
Style = paragraph.Style;
|
||||
NewSection = paragraph.NewSection;
|
||||
Bookmark = paragraph.Bookmark;
|
||||
}
|
||||
|
||||
public Paragraph(string text, double startTotalMilliseconds, double endTotalMilliseconds)
|
||||
: this(new TimeCode(startTotalMilliseconds), new TimeCode(endTotalMilliseconds), text)
|
||||
{
|
||||
}
|
||||
|
||||
public void Adjust(double factor, double adjustmentInSeconds)
|
||||
{
|
||||
if (StartTime.IsMaxTime)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
StartTime.TotalMilliseconds = StartTime.TotalMilliseconds * factor + adjustmentInSeconds * TimeCode.BaseUnit;
|
||||
EndTime.TotalMilliseconds = EndTime.TotalMilliseconds * factor + adjustmentInSeconds * TimeCode.BaseUnit;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{StartTime} --> {EndTime} {Text}";
|
||||
}
|
||||
|
||||
public int NumberOfLines => Utilities.GetNumberOfLines(Text);
|
||||
|
||||
public double WordsPerMinute
|
||||
{
|
||||
get
|
||||
{
|
||||
if (string.IsNullOrEmpty(Text))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 60.0 / Duration.TotalSeconds * Text.CountWords();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
using System;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class Paragraph
|
||||
{
|
||||
public int Number { get; set; }
|
||||
|
||||
public string Text { get; set; }
|
||||
|
||||
public TimeCode StartTime { get; set; }
|
||||
|
||||
public TimeCode EndTime { get; set; }
|
||||
|
||||
public TimeCode Duration => new TimeCode(EndTime.TotalMilliseconds - StartTime.TotalMilliseconds);
|
||||
|
||||
public bool Forced { get; set; }
|
||||
|
||||
public string Extra { get; set; }
|
||||
|
||||
public bool IsComment { get; set; }
|
||||
|
||||
public string Actor { get; set; }
|
||||
public string Region { get; set; }
|
||||
|
||||
public string MarginL { get; set; }
|
||||
public string MarginR { get; set; }
|
||||
public string MarginV { get; set; }
|
||||
|
||||
public string Effect { get; set; }
|
||||
|
||||
public int Layer { get; set; }
|
||||
|
||||
public string Id { get; }
|
||||
|
||||
public string Language { get; set; }
|
||||
|
||||
public string Style { get; set; }
|
||||
|
||||
public bool NewSection { get; set; }
|
||||
|
||||
public string Bookmark { get; set; }
|
||||
|
||||
public bool IsDefault => Math.Abs(StartTime.TotalMilliseconds) < 0.01 && Math.Abs(EndTime.TotalMilliseconds) < 0.01 && string.IsNullOrEmpty(Text);
|
||||
|
||||
private static string GenerateId()
|
||||
{
|
||||
return Guid.NewGuid().ToString();
|
||||
}
|
||||
|
||||
public Paragraph() : this(new TimeCode(), new TimeCode(), string.Empty)
|
||||
{
|
||||
}
|
||||
|
||||
public Paragraph(TimeCode startTime, TimeCode endTime, string text)
|
||||
{
|
||||
StartTime = startTime;
|
||||
EndTime = endTime;
|
||||
Text = text;
|
||||
Id = GenerateId();
|
||||
}
|
||||
|
||||
public Paragraph(Paragraph paragraph, bool generateNewId = true)
|
||||
{
|
||||
Number = paragraph.Number;
|
||||
Text = paragraph.Text;
|
||||
StartTime = new TimeCode(paragraph.StartTime.TotalMilliseconds);
|
||||
EndTime = new TimeCode(paragraph.EndTime.TotalMilliseconds);
|
||||
Forced = paragraph.Forced;
|
||||
Extra = paragraph.Extra;
|
||||
IsComment = paragraph.IsComment;
|
||||
Actor = paragraph.Actor;
|
||||
Region = paragraph.Region;
|
||||
MarginL = paragraph.MarginL;
|
||||
MarginR = paragraph.MarginR;
|
||||
MarginV = paragraph.MarginV;
|
||||
Effect = paragraph.Effect;
|
||||
Layer = paragraph.Layer;
|
||||
Id = generateNewId ? GenerateId() : paragraph.Id;
|
||||
Language = paragraph.Language;
|
||||
Style = paragraph.Style;
|
||||
NewSection = paragraph.NewSection;
|
||||
Bookmark = paragraph.Bookmark;
|
||||
}
|
||||
|
||||
public Paragraph(string text, double startTotalMilliseconds, double endTotalMilliseconds)
|
||||
: this(new TimeCode(startTotalMilliseconds), new TimeCode(endTotalMilliseconds), text)
|
||||
{
|
||||
}
|
||||
|
||||
public void Adjust(double factor, double adjustmentInSeconds)
|
||||
{
|
||||
if (StartTime.IsMaxTime)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
StartTime.TotalMilliseconds = StartTime.TotalMilliseconds * factor + adjustmentInSeconds * TimeCode.BaseUnit;
|
||||
EndTime.TotalMilliseconds = EndTime.TotalMilliseconds * factor + adjustmentInSeconds * TimeCode.BaseUnit;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{StartTime} --> {EndTime} {Text}";
|
||||
}
|
||||
|
||||
public int NumberOfLines => Utilities.GetNumberOfLines(Text);
|
||||
|
||||
public double WordsPerMinute
|
||||
{
|
||||
get
|
||||
{
|
||||
if (string.IsNullOrEmpty(Text))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 60.0 / Duration.TotalSeconds * Text.CountWords();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class PlainTextImporter
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class Position
|
||||
{
|
@ -4,7 +4,7 @@
|
||||
|
||||
using System;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class RealFFT
|
||||
{
|
@ -2,7 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class RegexUtils
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
using Microsoft.Win32;
|
||||
using System.Security;
|
||||
using System.Security;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class RegistryUtil
|
||||
{
|
@ -1,4 +1,4 @@
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class ReplaceExpression
|
||||
{
|
@ -1,268 +1,268 @@
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Rich Text to plain text
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Translated from Python located at:
|
||||
/// http://stackoverflow.com/a/188877/448
|
||||
/// to C# by Chris Benard - http://chrisbenard.net/2014/08/20/Extract-Text-from-RTF-in-.Net
|
||||
/// </remarks>
|
||||
public static class RichTextToPlainText
|
||||
{
|
||||
|
||||
public static IRtfTextConverter NativeRtfTextConverter { get; set; }
|
||||
|
||||
private class StackEntry
|
||||
{
|
||||
public int NumberOfCharactersToSkip { get; private set; }
|
||||
public bool Ignorable { get; private set; }
|
||||
|
||||
public StackEntry(int numberOfCharactersToSkip, bool ignorable)
|
||||
{
|
||||
NumberOfCharactersToSkip = numberOfCharactersToSkip;
|
||||
Ignorable = ignorable;
|
||||
}
|
||||
}
|
||||
|
||||
private static readonly Regex RtfRegex = new Regex(@"\\([a-z]{1,32})(-?\d{1,10})?[ ]?|\\'([0-9a-f]{2})|\\([^a-z])|([{}])|[\r\n]+|(.)", RegexOptions.Singleline | RegexOptions.IgnoreCase);
|
||||
|
||||
private static readonly List<string> Destinations = new List<string>
|
||||
{
|
||||
"aftncn","aftnsep","aftnsepc","annotation","atnauthor","atndate","atnicn","atnid",
|
||||
"atnparent","atnref","atntime","atrfend","atrfstart","author","background",
|
||||
"bkmkend","bkmkstart","blipuid","buptim","category","colorschememapping",
|
||||
"colortbl","comment","company","creatim","datafield","datastore","defchp","defpap",
|
||||
"do","doccomm","docvar","dptxbxtext","ebcend","ebcstart","factoidname","falt",
|
||||
"fchars","ffdeftext","ffentrymcr","ffexitmcr","ffformat","ffhelptext","ffl",
|
||||
"ffname","ffstattext","field","file","filetbl","fldinst","fldrslt","fldtype",
|
||||
"fname","fontemb","fontfile","fonttbl","footer","footerf","footerl","footerr",
|
||||
"footnote","formfield","ftncn","ftnsep","ftnsepc","g","generator","gridtbl",
|
||||
"header","headerf","headerl","headerr","hl","hlfr","hlinkbase","hlloc","hlsrc",
|
||||
"hsv","htmltag","info","keycode","keywords","latentstyles","lchars","levelnumbers",
|
||||
"leveltext","lfolevel","linkval","list","listlevel","listname","listoverride",
|
||||
"listoverridetable","listpicture","liststylename","listtable","listtext",
|
||||
"lsdlockedexcept","macc","maccPr","mailmerge","maln","malnScr","manager","margPr",
|
||||
"mbar","mbarPr","mbaseJc","mbegChr","mborderBox","mborderBoxPr","mbox","mboxPr",
|
||||
"mchr","mcount","mctrlPr","md","mdeg","mdegHide","mden","mdiff","mdPr","me",
|
||||
"mendChr","meqArr","meqArrPr","mf","mfName","mfPr","mfunc","mfuncPr","mgroupChr",
|
||||
"mgroupChrPr","mgrow","mhideBot","mhideLeft","mhideRight","mhideTop","mhtmltag",
|
||||
"mlim","mlimloc","mlimlow","mlimlowPr","mlimupp","mlimuppPr","mm","mmaddfieldname",
|
||||
"mmath","mmathPict","mmathPr","mmaxdist","mmc","mmcJc","mmconnectstr",
|
||||
"mmconnectstrdata","mmcPr","mmcs","mmdatasource","mmheadersource","mmmailsubject",
|
||||
"mmodso","mmodsofilter","mmodsofldmpdata","mmodsomappedname","mmodsoname",
|
||||
"mmodsorecipdata","mmodsosort","mmodsosrc","mmodsotable","mmodsoudl",
|
||||
"mmodsoudldata","mmodsouniquetag","mmPr","mmquery","mmr","mnary","mnaryPr",
|
||||
"mnoBreak","mnum","mobjDist","moMath","moMathPara","moMathParaPr","mopEmu",
|
||||
"mphant","mphantPr","mplcHide","mpos","mr","mrad","mradPr","mrPr","msepChr",
|
||||
"mshow","mshp","msPre","msPrePr","msSub","msSubPr","msSubSup","msSubSupPr","msSup",
|
||||
"msSupPr","mstrikeBLTR","mstrikeH","mstrikeTLBR","mstrikeV","msub","msubHide",
|
||||
"msup","msupHide","mtransp","mtype","mvertJc","mvfmf","mvfml","mvtof","mvtol",
|
||||
"mzeroAsc","mzeroDesc","mzeroWid","nesttableprops","nextfile","nonesttables",
|
||||
"objalias","objclass","objdata","object","objname","objsect","objtime","oldcprops",
|
||||
"oldpprops","oldsprops","oldtprops","oleclsid","operator","panose","password",
|
||||
"passwordhash","pgp","pgptbl","picprop","pict","pn","pnseclvl","pntext","pntxta",
|
||||
"pntxtb","printim","private","propname","protend","protstart","protusertbl","pxe",
|
||||
"result","revtbl","revtim","rsidtbl","rxe","shp","shpgrp","shpinst",
|
||||
"shppict","shprslt","shptxt","sn","sp","staticval","stylesheet","subject","sv",
|
||||
"svb","tc","template","themedata","title","txe","ud","upr","userprops",
|
||||
"wgrffmtfilter","windowcaption","writereservation","writereservhash","xe","xform",
|
||||
"xmlattrname","xmlattrvalue","xmlclose","xmlname","xmlnstbl",
|
||||
"xmlopen"
|
||||
};
|
||||
|
||||
private static readonly Dictionary<string, string> SpecialCharacters = new Dictionary<string, string>
|
||||
{
|
||||
{ "par", "\n" },
|
||||
{ "sect", "\n\n" },
|
||||
{ "page", "\n\n" },
|
||||
{ "line", "\n" },
|
||||
{ "tab", "\t" },
|
||||
{ "emdash", "\u2014" },
|
||||
{ "endash", "\u2013" },
|
||||
{ "emspace", "\u2003" },
|
||||
{ "enspace", "\u2002" },
|
||||
{ "qmspace", "\u2005" },
|
||||
{ "bullet", "\u2022" },
|
||||
{ "lquote", "\u2018" },
|
||||
{ "rquote", "\u2019" },
|
||||
{ "ldblquote", "\u201C" },
|
||||
{ "rdblquote", "\u201D" },
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Strip RTF Tags from RTF Text
|
||||
/// </summary>
|
||||
/// <param name="inputRtf">RTF formatted text</param>
|
||||
/// <returns>Plain text from RTF</returns>
|
||||
public static string ConvertToText(string inputRtf)
|
||||
{
|
||||
if (inputRtf == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// use interface converter if available
|
||||
if (NativeRtfTextConverter != null)
|
||||
{
|
||||
return NativeRtfTextConverter.RtfToText(inputRtf);
|
||||
}
|
||||
|
||||
var stack = new Stack<StackEntry>();
|
||||
bool ignorable = false; // Whether this group (and all inside it) are "ignorable".
|
||||
int ucskip = 1; // Number of ASCII characters to skip after a unicode character.
|
||||
int curskip = 0; // Number of ASCII characters left to skip
|
||||
var outList = new List<string>(); // Output buffer.
|
||||
|
||||
MatchCollection matches = RtfRegex.Matches(inputRtf);
|
||||
|
||||
if (matches.Count > 0)
|
||||
{
|
||||
foreach (Match match in matches)
|
||||
{
|
||||
string word = match.Groups[1].Value;
|
||||
string arg = match.Groups[2].Value;
|
||||
string hex = match.Groups[3].Value;
|
||||
string character = match.Groups[4].Value;
|
||||
string brace = match.Groups[5].Value;
|
||||
string tchar = match.Groups[6].Value;
|
||||
|
||||
if (!string.IsNullOrEmpty(brace))
|
||||
{
|
||||
curskip = 0;
|
||||
if (brace == "{")
|
||||
{
|
||||
// Push state
|
||||
stack.Push(new StackEntry(ucskip, ignorable));
|
||||
}
|
||||
else if (brace == "}")
|
||||
{
|
||||
// Pop state
|
||||
StackEntry entry = stack.Pop();
|
||||
ucskip = entry.NumberOfCharactersToSkip;
|
||||
ignorable = entry.Ignorable;
|
||||
}
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(character)) // \x (not a letter)
|
||||
{
|
||||
curskip = 0;
|
||||
if (character == "~")
|
||||
{
|
||||
if (!ignorable)
|
||||
{
|
||||
outList.Add("\xA0");
|
||||
}
|
||||
}
|
||||
else if ("{}\\".Contains(character))
|
||||
{
|
||||
if (!ignorable)
|
||||
{
|
||||
outList.Add(character);
|
||||
}
|
||||
}
|
||||
else if (character == "*")
|
||||
{
|
||||
ignorable = true;
|
||||
}
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(word)) // \foo
|
||||
{
|
||||
curskip = 0;
|
||||
if (Destinations.Contains(word))
|
||||
{
|
||||
ignorable = true;
|
||||
}
|
||||
else if (ignorable)
|
||||
{
|
||||
}
|
||||
else if (SpecialCharacters.ContainsKey(word))
|
||||
{
|
||||
outList.Add(SpecialCharacters[word]);
|
||||
}
|
||||
else if (word == "uc")
|
||||
{
|
||||
ucskip = int.Parse(arg);
|
||||
}
|
||||
else if (word == "u")
|
||||
{
|
||||
int c = int.Parse(arg);
|
||||
if (c < 0)
|
||||
{
|
||||
c += 0x10000;
|
||||
}
|
||||
outList.Add(char.ConvertFromUtf32(c));
|
||||
curskip = ucskip;
|
||||
}
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(hex)) // \'xx
|
||||
{
|
||||
if (curskip > 0)
|
||||
{
|
||||
curskip -= 1;
|
||||
}
|
||||
else if (!ignorable)
|
||||
{
|
||||
int c = int.Parse(hex, System.Globalization.NumberStyles.HexNumber);
|
||||
outList.Add(char.ConvertFromUtf32(c));
|
||||
}
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(tchar))
|
||||
{
|
||||
if (curskip > 0)
|
||||
{
|
||||
curskip -= 1;
|
||||
}
|
||||
else if (!ignorable)
|
||||
{
|
||||
outList.Add(tchar);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return string.Join(string.Empty, outList.ToArray());
|
||||
}
|
||||
|
||||
public static string ConvertToRtf(string value)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
// use interface converter if available
|
||||
if (NativeRtfTextConverter != null)
|
||||
{
|
||||
NativeRtfTextConverter.TextToRtf(value);
|
||||
}
|
||||
|
||||
// special RTF chars
|
||||
var backslashed = new StringBuilder(value);
|
||||
backslashed.Replace(@"\", @"\\");
|
||||
backslashed.Replace(@"{", @"\{");
|
||||
backslashed.Replace(@"}", @"\}");
|
||||
backslashed.Replace(Environment.NewLine, @"\par" + Environment.NewLine);
|
||||
|
||||
// convert string char by char
|
||||
var sb = new StringBuilder();
|
||||
foreach (char character in backslashed.ToString())
|
||||
{
|
||||
if (character <= 0x7f)
|
||||
{
|
||||
sb.Append(character);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.Append("\\u" + Convert.ToUInt32(character) + "?");
|
||||
}
|
||||
}
|
||||
|
||||
return @"{\rtf1\ansi\ansicpg1252\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard " + sb + @"\par" + Environment.NewLine + "}";
|
||||
}
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
/// <summary>
|
||||
/// Rich Text to plain text
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Translated from Python located at:
|
||||
/// http://stackoverflow.com/a/188877/448
|
||||
/// to C# by Chris Benard - http://chrisbenard.net/2014/08/20/Extract-Text-from-RTF-in-.Net
|
||||
/// </remarks>
|
||||
public static class RichTextToPlainText
|
||||
{
|
||||
|
||||
public static IRtfTextConverter NativeRtfTextConverter { get; set; }
|
||||
|
||||
private class StackEntry
|
||||
{
|
||||
public int NumberOfCharactersToSkip { get; private set; }
|
||||
public bool Ignorable { get; private set; }
|
||||
|
||||
public StackEntry(int numberOfCharactersToSkip, bool ignorable)
|
||||
{
|
||||
NumberOfCharactersToSkip = numberOfCharactersToSkip;
|
||||
Ignorable = ignorable;
|
||||
}
|
||||
}
|
||||
|
||||
private static readonly Regex RtfRegex = new Regex(@"\\([a-z]{1,32})(-?\d{1,10})?[ ]?|\\'([0-9a-f]{2})|\\([^a-z])|([{}])|[\r\n]+|(.)", RegexOptions.Singleline | RegexOptions.IgnoreCase);
|
||||
|
||||
private static readonly List<string> Destinations = new List<string>
|
||||
{
|
||||
"aftncn","aftnsep","aftnsepc","annotation","atnauthor","atndate","atnicn","atnid",
|
||||
"atnparent","atnref","atntime","atrfend","atrfstart","author","background",
|
||||
"bkmkend","bkmkstart","blipuid","buptim","category","colorschememapping",
|
||||
"colortbl","comment","company","creatim","datafield","datastore","defchp","defpap",
|
||||
"do","doccomm","docvar","dptxbxtext","ebcend","ebcstart","factoidname","falt",
|
||||
"fchars","ffdeftext","ffentrymcr","ffexitmcr","ffformat","ffhelptext","ffl",
|
||||
"ffname","ffstattext","field","file","filetbl","fldinst","fldrslt","fldtype",
|
||||
"fname","fontemb","fontfile","fonttbl","footer","footerf","footerl","footerr",
|
||||
"footnote","formfield","ftncn","ftnsep","ftnsepc","g","generator","gridtbl",
|
||||
"header","headerf","headerl","headerr","hl","hlfr","hlinkbase","hlloc","hlsrc",
|
||||
"hsv","htmltag","info","keycode","keywords","latentstyles","lchars","levelnumbers",
|
||||
"leveltext","lfolevel","linkval","list","listlevel","listname","listoverride",
|
||||
"listoverridetable","listpicture","liststylename","listtable","listtext",
|
||||
"lsdlockedexcept","macc","maccPr","mailmerge","maln","malnScr","manager","margPr",
|
||||
"mbar","mbarPr","mbaseJc","mbegChr","mborderBox","mborderBoxPr","mbox","mboxPr",
|
||||
"mchr","mcount","mctrlPr","md","mdeg","mdegHide","mden","mdiff","mdPr","me",
|
||||
"mendChr","meqArr","meqArrPr","mf","mfName","mfPr","mfunc","mfuncPr","mgroupChr",
|
||||
"mgroupChrPr","mgrow","mhideBot","mhideLeft","mhideRight","mhideTop","mhtmltag",
|
||||
"mlim","mlimloc","mlimlow","mlimlowPr","mlimupp","mlimuppPr","mm","mmaddfieldname",
|
||||
"mmath","mmathPict","mmathPr","mmaxdist","mmc","mmcJc","mmconnectstr",
|
||||
"mmconnectstrdata","mmcPr","mmcs","mmdatasource","mmheadersource","mmmailsubject",
|
||||
"mmodso","mmodsofilter","mmodsofldmpdata","mmodsomappedname","mmodsoname",
|
||||
"mmodsorecipdata","mmodsosort","mmodsosrc","mmodsotable","mmodsoudl",
|
||||
"mmodsoudldata","mmodsouniquetag","mmPr","mmquery","mmr","mnary","mnaryPr",
|
||||
"mnoBreak","mnum","mobjDist","moMath","moMathPara","moMathParaPr","mopEmu",
|
||||
"mphant","mphantPr","mplcHide","mpos","mr","mrad","mradPr","mrPr","msepChr",
|
||||
"mshow","mshp","msPre","msPrePr","msSub","msSubPr","msSubSup","msSubSupPr","msSup",
|
||||
"msSupPr","mstrikeBLTR","mstrikeH","mstrikeTLBR","mstrikeV","msub","msubHide",
|
||||
"msup","msupHide","mtransp","mtype","mvertJc","mvfmf","mvfml","mvtof","mvtol",
|
||||
"mzeroAsc","mzeroDesc","mzeroWid","nesttableprops","nextfile","nonesttables",
|
||||
"objalias","objclass","objdata","object","objname","objsect","objtime","oldcprops",
|
||||
"oldpprops","oldsprops","oldtprops","oleclsid","operator","panose","password",
|
||||
"passwordhash","pgp","pgptbl","picprop","pict","pn","pnseclvl","pntext","pntxta",
|
||||
"pntxtb","printim","private","propname","protend","protstart","protusertbl","pxe",
|
||||
"result","revtbl","revtim","rsidtbl","rxe","shp","shpgrp","shpinst",
|
||||
"shppict","shprslt","shptxt","sn","sp","staticval","stylesheet","subject","sv",
|
||||
"svb","tc","template","themedata","title","txe","ud","upr","userprops",
|
||||
"wgrffmtfilter","windowcaption","writereservation","writereservhash","xe","xform",
|
||||
"xmlattrname","xmlattrvalue","xmlclose","xmlname","xmlnstbl",
|
||||
"xmlopen"
|
||||
};
|
||||
|
||||
private static readonly Dictionary<string, string> SpecialCharacters = new Dictionary<string, string>
|
||||
{
|
||||
{ "par", "\n" },
|
||||
{ "sect", "\n\n" },
|
||||
{ "page", "\n\n" },
|
||||
{ "line", "\n" },
|
||||
{ "tab", "\t" },
|
||||
{ "emdash", "\u2014" },
|
||||
{ "endash", "\u2013" },
|
||||
{ "emspace", "\u2003" },
|
||||
{ "enspace", "\u2002" },
|
||||
{ "qmspace", "\u2005" },
|
||||
{ "bullet", "\u2022" },
|
||||
{ "lquote", "\u2018" },
|
||||
{ "rquote", "\u2019" },
|
||||
{ "ldblquote", "\u201C" },
|
||||
{ "rdblquote", "\u201D" },
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Strip RTF Tags from RTF Text
|
||||
/// </summary>
|
||||
/// <param name="inputRtf">RTF formatted text</param>
|
||||
/// <returns>Plain text from RTF</returns>
|
||||
public static string ConvertToText(string inputRtf)
|
||||
{
|
||||
if (inputRtf == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// use interface converter if available
|
||||
if (NativeRtfTextConverter != null)
|
||||
{
|
||||
return NativeRtfTextConverter.RtfToText(inputRtf);
|
||||
}
|
||||
|
||||
var stack = new Stack<StackEntry>();
|
||||
bool ignorable = false; // Whether this group (and all inside it) are "ignorable".
|
||||
int ucskip = 1; // Number of ASCII characters to skip after a unicode character.
|
||||
int curskip = 0; // Number of ASCII characters left to skip
|
||||
var outList = new List<string>(); // Output buffer.
|
||||
|
||||
MatchCollection matches = RtfRegex.Matches(inputRtf);
|
||||
|
||||
if (matches.Count > 0)
|
||||
{
|
||||
foreach (Match match in matches)
|
||||
{
|
||||
string word = match.Groups[1].Value;
|
||||
string arg = match.Groups[2].Value;
|
||||
string hex = match.Groups[3].Value;
|
||||
string character = match.Groups[4].Value;
|
||||
string brace = match.Groups[5].Value;
|
||||
string tchar = match.Groups[6].Value;
|
||||
|
||||
if (!string.IsNullOrEmpty(brace))
|
||||
{
|
||||
curskip = 0;
|
||||
if (brace == "{")
|
||||
{
|
||||
// Push state
|
||||
stack.Push(new StackEntry(ucskip, ignorable));
|
||||
}
|
||||
else if (brace == "}")
|
||||
{
|
||||
// Pop state
|
||||
StackEntry entry = stack.Pop();
|
||||
ucskip = entry.NumberOfCharactersToSkip;
|
||||
ignorable = entry.Ignorable;
|
||||
}
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(character)) // \x (not a letter)
|
||||
{
|
||||
curskip = 0;
|
||||
if (character == "~")
|
||||
{
|
||||
if (!ignorable)
|
||||
{
|
||||
outList.Add("\xA0");
|
||||
}
|
||||
}
|
||||
else if ("{}\\".Contains(character))
|
||||
{
|
||||
if (!ignorable)
|
||||
{
|
||||
outList.Add(character);
|
||||
}
|
||||
}
|
||||
else if (character == "*")
|
||||
{
|
||||
ignorable = true;
|
||||
}
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(word)) // \foo
|
||||
{
|
||||
curskip = 0;
|
||||
if (Destinations.Contains(word))
|
||||
{
|
||||
ignorable = true;
|
||||
}
|
||||
else if (ignorable)
|
||||
{
|
||||
}
|
||||
else if (SpecialCharacters.ContainsKey(word))
|
||||
{
|
||||
outList.Add(SpecialCharacters[word]);
|
||||
}
|
||||
else if (word == "uc")
|
||||
{
|
||||
ucskip = int.Parse(arg);
|
||||
}
|
||||
else if (word == "u")
|
||||
{
|
||||
int c = int.Parse(arg);
|
||||
if (c < 0)
|
||||
{
|
||||
c += 0x10000;
|
||||
}
|
||||
outList.Add(char.ConvertFromUtf32(c));
|
||||
curskip = ucskip;
|
||||
}
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(hex)) // \'xx
|
||||
{
|
||||
if (curskip > 0)
|
||||
{
|
||||
curskip -= 1;
|
||||
}
|
||||
else if (!ignorable)
|
||||
{
|
||||
int c = int.Parse(hex, System.Globalization.NumberStyles.HexNumber);
|
||||
outList.Add(char.ConvertFromUtf32(c));
|
||||
}
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(tchar))
|
||||
{
|
||||
if (curskip > 0)
|
||||
{
|
||||
curskip -= 1;
|
||||
}
|
||||
else if (!ignorable)
|
||||
{
|
||||
outList.Add(tchar);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return string.Join(string.Empty, outList.ToArray());
|
||||
}
|
||||
|
||||
public static string ConvertToRtf(string value)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
// use interface converter if available
|
||||
if (NativeRtfTextConverter != null)
|
||||
{
|
||||
NativeRtfTextConverter.TextToRtf(value);
|
||||
}
|
||||
|
||||
// special RTF chars
|
||||
var backslashed = new StringBuilder(value);
|
||||
backslashed.Replace(@"\", @"\\");
|
||||
backslashed.Replace(@"{", @"\{");
|
||||
backslashed.Replace(@"}", @"\}");
|
||||
backslashed.Replace(Environment.NewLine, @"\par" + Environment.NewLine);
|
||||
|
||||
// convert string char by char
|
||||
var sb = new StringBuilder();
|
||||
foreach (char character in backslashed.ToString())
|
||||
{
|
||||
if (character <= 0x7f)
|
||||
{
|
||||
sb.Append(character);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.Append("\\u" + Convert.ToUInt32(character) + "?");
|
||||
}
|
||||
}
|
||||
|
||||
return @"{\rtf1\ansi\ansicpg1252\deff0{\fonttbl\f0\fswiss Helvetica;}\f0\pard " + sb + @"\par" + Environment.NewLine + "}";
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +1,11 @@
|
||||
using Nikse.SubtitleEdit.Core.Enums;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.Enums;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class RulesProfile
|
||||
{
|
@ -1,6 +1,6 @@
|
||||
using System.Drawing;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class SccPositionAndStyle
|
||||
{
|
@ -2,7 +2,7 @@
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Drawing;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class SccPositionAndStyleTable
|
||||
{
|
@ -3,7 +3,7 @@ using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class SceneChangeHelper
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class SeJsonParser
|
||||
{
|
@ -1,8 +1,8 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using static Nikse.SubtitleEdit.Core.SeJsonParser;
|
||||
using static Nikse.SubtitleEdit.Core.Common.SeJsonParser;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
/// <summary>
|
||||
/// Validate json file - a simple C# json validator.
|
@ -3,7 +3,7 @@ using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class SeLogger
|
||||
{
|
File diff suppressed because it is too large
Load Diff
@ -1,303 +1,303 @@
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
{
|
||||
public class SsaStyle
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string FontName { get; set; }
|
||||
public float FontSize { get; set; }
|
||||
public bool Italic { get; set; }
|
||||
public bool Bold { get; set; }
|
||||
public bool Underline { get; set; }
|
||||
public Color Primary { get; set; }
|
||||
public Color Secondary { get; set; }
|
||||
public Color Tertiary { get; set; }
|
||||
public Color Outline { get; set; }
|
||||
public Color Background { get; set; }
|
||||
public decimal ShadowWidth { get; set; }
|
||||
public decimal OutlineWidth { get; set; }
|
||||
public string Alignment { get; set; }
|
||||
public int MarginLeft { get; set; }
|
||||
public int MarginRight { get; set; }
|
||||
public int MarginVertical { get; set; }
|
||||
public string BorderStyle { get; set; }
|
||||
public string RawLine { get; set; }
|
||||
public bool LoadedFromHeader { get; set; }
|
||||
|
||||
public SsaStyle()
|
||||
{
|
||||
FontName = Configuration.Settings.SubtitleSettings.SsaFontName;
|
||||
FontSize = (float)Configuration.Settings.SubtitleSettings.SsaFontSize;
|
||||
Primary = Color.FromArgb(Configuration.Settings.SubtitleSettings.SsaFontColorArgb);
|
||||
Secondary = Color.Yellow;
|
||||
Outline = Color.Black;
|
||||
Background = Color.Black;
|
||||
Alignment = "2";
|
||||
OutlineWidth = Configuration.Settings.SubtitleSettings.SsaOutline;
|
||||
ShadowWidth = Configuration.Settings.SubtitleSettings.SsaShadow;
|
||||
MarginLeft = 10;
|
||||
MarginRight = 10;
|
||||
MarginVertical = 10;
|
||||
BorderStyle = "1";
|
||||
if (Configuration.Settings.SubtitleSettings.SsaOpaqueBox)
|
||||
{
|
||||
BorderStyle = "3";
|
||||
}
|
||||
|
||||
RawLine = string.Empty;
|
||||
LoadedFromHeader = false;
|
||||
}
|
||||
|
||||
public SsaStyle(SsaStyle ssaStyle)
|
||||
{
|
||||
Name = ssaStyle.Name;
|
||||
FontName = ssaStyle.FontName;
|
||||
FontSize = ssaStyle.FontSize;
|
||||
|
||||
Italic = ssaStyle.Italic;
|
||||
Bold = ssaStyle.Bold;
|
||||
Underline = ssaStyle.Underline;
|
||||
|
||||
Primary = ssaStyle.Primary;
|
||||
Secondary = ssaStyle.Secondary;
|
||||
Tertiary = ssaStyle.Tertiary;
|
||||
Outline = ssaStyle.Outline;
|
||||
Background = ssaStyle.Background;
|
||||
|
||||
ShadowWidth = ssaStyle.ShadowWidth;
|
||||
OutlineWidth = ssaStyle.OutlineWidth;
|
||||
|
||||
Alignment = ssaStyle.Alignment;
|
||||
MarginLeft = ssaStyle.MarginLeft;
|
||||
MarginRight = ssaStyle.MarginRight;
|
||||
MarginVertical = ssaStyle.MarginVertical;
|
||||
|
||||
BorderStyle = ssaStyle.BorderStyle;
|
||||
RawLine = ssaStyle.RawLine;
|
||||
LoadedFromHeader = ssaStyle.LoadedFromHeader;
|
||||
}
|
||||
|
||||
public string ToRawSsa(string styleFormat)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.Append("Style: ");
|
||||
var format = styleFormat.ToLowerInvariant().Substring(8).Split(',');
|
||||
for (int i = 0; i < format.Length; i++)
|
||||
{
|
||||
string f = format[i].Trim();
|
||||
if (f == "name")
|
||||
{
|
||||
sb.Append(Name);
|
||||
}
|
||||
else if (f == "fontname")
|
||||
{
|
||||
sb.Append(FontName);
|
||||
}
|
||||
else if (f == "fontsize")
|
||||
{
|
||||
sb.Append(FontSize.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
else if (f == "primarycolour")
|
||||
{
|
||||
sb.Append(ColorTranslator.ToWin32(Primary));
|
||||
}
|
||||
else if (f == "secondarycolour")
|
||||
{
|
||||
sb.Append(ColorTranslator.ToWin32(Secondary));
|
||||
}
|
||||
else if (f == "tertiarycolour")
|
||||
{
|
||||
sb.Append(ColorTranslator.ToWin32(Tertiary));
|
||||
}
|
||||
else if (f == "outlinecolour")
|
||||
{
|
||||
sb.Append(ColorTranslator.ToWin32(Outline));
|
||||
}
|
||||
else if (f == "backcolour")
|
||||
{
|
||||
sb.Append(ColorTranslator.ToWin32(Background));
|
||||
}
|
||||
else if (f == "bold")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Bold));
|
||||
}
|
||||
else if (f == "italic")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Italic));
|
||||
}
|
||||
else if (f == "underline")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Underline));
|
||||
}
|
||||
else if (f == "outline")
|
||||
{
|
||||
sb.Append(Outline);
|
||||
}
|
||||
else if (f == "shadow")
|
||||
{
|
||||
sb.Append(OutlineWidth);
|
||||
}
|
||||
else if (f == "marginl")
|
||||
{
|
||||
sb.Append(MarginLeft);
|
||||
}
|
||||
else if (f == "marginr")
|
||||
{
|
||||
sb.Append(MarginRight);
|
||||
}
|
||||
else if (f == "marginv")
|
||||
{
|
||||
sb.Append(MarginVertical);
|
||||
}
|
||||
else if (f == "borderstyle")
|
||||
{
|
||||
sb.Append(BorderStyle);
|
||||
}
|
||||
else if (f == "encoding")
|
||||
{
|
||||
sb.Append('1');
|
||||
}
|
||||
else if (f == "strikeout")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
else if (f == "scalex")
|
||||
{
|
||||
sb.Append("100");
|
||||
}
|
||||
else if (f == "scaley")
|
||||
{
|
||||
sb.Append("100");
|
||||
}
|
||||
else if (f == "spacing")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
else if (f == "angle")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
|
||||
sb.Append(',');
|
||||
}
|
||||
string s = sb.ToString().Trim();
|
||||
return s.Substring(0, s.Length - 1);
|
||||
}
|
||||
|
||||
public string ToRawAss(string styleFormat)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.Append("Style: ");
|
||||
var format = styleFormat.ToLowerInvariant().Substring(8).Split(',');
|
||||
for (int i = 0; i < format.Length; i++)
|
||||
{
|
||||
string f = format[i].Trim();
|
||||
if (f == "name")
|
||||
{
|
||||
sb.Append(Name);
|
||||
}
|
||||
else if (f == "fontname")
|
||||
{
|
||||
sb.Append(FontName);
|
||||
}
|
||||
else if (f == "fontsize")
|
||||
{
|
||||
sb.Append(FontSize.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
else if (f == "primarycolour")
|
||||
{
|
||||
sb.Append(AdvancedSubStationAlpha.GetSsaColorString(Primary));
|
||||
}
|
||||
else if (f == "secondarycolour")
|
||||
{
|
||||
sb.Append(AdvancedSubStationAlpha.GetSsaColorString(Secondary));
|
||||
}
|
||||
else if (f == "tertiarycolour")
|
||||
{
|
||||
sb.Append(AdvancedSubStationAlpha.GetSsaColorString(Tertiary));
|
||||
}
|
||||
else if (f == "outlinecolour")
|
||||
{
|
||||
sb.Append(AdvancedSubStationAlpha.GetSsaColorString(Outline));
|
||||
}
|
||||
else if (f == "backcolour")
|
||||
{
|
||||
sb.Append(AdvancedSubStationAlpha.GetSsaColorString(Background));
|
||||
}
|
||||
else if (f == "bold")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Bold));
|
||||
}
|
||||
else if (f == "italic")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Italic));
|
||||
}
|
||||
else if (f == "underline")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Underline));
|
||||
}
|
||||
else if (f == "outline")
|
||||
{
|
||||
sb.Append(OutlineWidth);
|
||||
}
|
||||
else if (f == "shadow")
|
||||
{
|
||||
sb.Append(ShadowWidth);
|
||||
}
|
||||
else if (f == "alignment")
|
||||
{
|
||||
sb.Append(Alignment);
|
||||
}
|
||||
else if (f == "marginl")
|
||||
{
|
||||
sb.Append(MarginLeft);
|
||||
}
|
||||
else if (f == "marginr")
|
||||
{
|
||||
sb.Append(MarginRight);
|
||||
}
|
||||
else if (f == "marginv")
|
||||
{
|
||||
sb.Append(MarginVertical);
|
||||
}
|
||||
else if (f == "borderstyle")
|
||||
{
|
||||
sb.Append(BorderStyle);
|
||||
}
|
||||
else if (f == "encoding")
|
||||
{
|
||||
sb.Append('1');
|
||||
}
|
||||
else if (f == "strikeout")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
else if (f == "scalex")
|
||||
{
|
||||
sb.Append("100");
|
||||
}
|
||||
else if (f == "scaley")
|
||||
{
|
||||
sb.Append("100");
|
||||
}
|
||||
else if (f == "spacing")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
else if (f == "angle")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
|
||||
sb.Append(',');
|
||||
}
|
||||
string s = sb.ToString().Trim();
|
||||
return s.Substring(0, s.Length - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Globalization;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class SsaStyle
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string FontName { get; set; }
|
||||
public float FontSize { get; set; }
|
||||
public bool Italic { get; set; }
|
||||
public bool Bold { get; set; }
|
||||
public bool Underline { get; set; }
|
||||
public Color Primary { get; set; }
|
||||
public Color Secondary { get; set; }
|
||||
public Color Tertiary { get; set; }
|
||||
public Color Outline { get; set; }
|
||||
public Color Background { get; set; }
|
||||
public decimal ShadowWidth { get; set; }
|
||||
public decimal OutlineWidth { get; set; }
|
||||
public string Alignment { get; set; }
|
||||
public int MarginLeft { get; set; }
|
||||
public int MarginRight { get; set; }
|
||||
public int MarginVertical { get; set; }
|
||||
public string BorderStyle { get; set; }
|
||||
public string RawLine { get; set; }
|
||||
public bool LoadedFromHeader { get; set; }
|
||||
|
||||
public SsaStyle()
|
||||
{
|
||||
FontName = Configuration.Settings.SubtitleSettings.SsaFontName;
|
||||
FontSize = (float)Configuration.Settings.SubtitleSettings.SsaFontSize;
|
||||
Primary = Color.FromArgb(Configuration.Settings.SubtitleSettings.SsaFontColorArgb);
|
||||
Secondary = Color.Yellow;
|
||||
Outline = Color.Black;
|
||||
Background = Color.Black;
|
||||
Alignment = "2";
|
||||
OutlineWidth = Configuration.Settings.SubtitleSettings.SsaOutline;
|
||||
ShadowWidth = Configuration.Settings.SubtitleSettings.SsaShadow;
|
||||
MarginLeft = 10;
|
||||
MarginRight = 10;
|
||||
MarginVertical = 10;
|
||||
BorderStyle = "1";
|
||||
if (Configuration.Settings.SubtitleSettings.SsaOpaqueBox)
|
||||
{
|
||||
BorderStyle = "3";
|
||||
}
|
||||
|
||||
RawLine = string.Empty;
|
||||
LoadedFromHeader = false;
|
||||
}
|
||||
|
||||
public SsaStyle(SsaStyle ssaStyle)
|
||||
{
|
||||
Name = ssaStyle.Name;
|
||||
FontName = ssaStyle.FontName;
|
||||
FontSize = ssaStyle.FontSize;
|
||||
|
||||
Italic = ssaStyle.Italic;
|
||||
Bold = ssaStyle.Bold;
|
||||
Underline = ssaStyle.Underline;
|
||||
|
||||
Primary = ssaStyle.Primary;
|
||||
Secondary = ssaStyle.Secondary;
|
||||
Tertiary = ssaStyle.Tertiary;
|
||||
Outline = ssaStyle.Outline;
|
||||
Background = ssaStyle.Background;
|
||||
|
||||
ShadowWidth = ssaStyle.ShadowWidth;
|
||||
OutlineWidth = ssaStyle.OutlineWidth;
|
||||
|
||||
Alignment = ssaStyle.Alignment;
|
||||
MarginLeft = ssaStyle.MarginLeft;
|
||||
MarginRight = ssaStyle.MarginRight;
|
||||
MarginVertical = ssaStyle.MarginVertical;
|
||||
|
||||
BorderStyle = ssaStyle.BorderStyle;
|
||||
RawLine = ssaStyle.RawLine;
|
||||
LoadedFromHeader = ssaStyle.LoadedFromHeader;
|
||||
}
|
||||
|
||||
public string ToRawSsa(string styleFormat)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.Append("Style: ");
|
||||
var format = styleFormat.ToLowerInvariant().Substring(8).Split(',');
|
||||
for (int i = 0; i < format.Length; i++)
|
||||
{
|
||||
string f = format[i].Trim();
|
||||
if (f == "name")
|
||||
{
|
||||
sb.Append(Name);
|
||||
}
|
||||
else if (f == "fontname")
|
||||
{
|
||||
sb.Append(FontName);
|
||||
}
|
||||
else if (f == "fontsize")
|
||||
{
|
||||
sb.Append(FontSize.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
else if (f == "primarycolour")
|
||||
{
|
||||
sb.Append(ColorTranslator.ToWin32(Primary));
|
||||
}
|
||||
else if (f == "secondarycolour")
|
||||
{
|
||||
sb.Append(ColorTranslator.ToWin32(Secondary));
|
||||
}
|
||||
else if (f == "tertiarycolour")
|
||||
{
|
||||
sb.Append(ColorTranslator.ToWin32(Tertiary));
|
||||
}
|
||||
else if (f == "outlinecolour")
|
||||
{
|
||||
sb.Append(ColorTranslator.ToWin32(Outline));
|
||||
}
|
||||
else if (f == "backcolour")
|
||||
{
|
||||
sb.Append(ColorTranslator.ToWin32(Background));
|
||||
}
|
||||
else if (f == "bold")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Bold));
|
||||
}
|
||||
else if (f == "italic")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Italic));
|
||||
}
|
||||
else if (f == "underline")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Underline));
|
||||
}
|
||||
else if (f == "outline")
|
||||
{
|
||||
sb.Append(Outline);
|
||||
}
|
||||
else if (f == "shadow")
|
||||
{
|
||||
sb.Append(OutlineWidth);
|
||||
}
|
||||
else if (f == "marginl")
|
||||
{
|
||||
sb.Append(MarginLeft);
|
||||
}
|
||||
else if (f == "marginr")
|
||||
{
|
||||
sb.Append(MarginRight);
|
||||
}
|
||||
else if (f == "marginv")
|
||||
{
|
||||
sb.Append(MarginVertical);
|
||||
}
|
||||
else if (f == "borderstyle")
|
||||
{
|
||||
sb.Append(BorderStyle);
|
||||
}
|
||||
else if (f == "encoding")
|
||||
{
|
||||
sb.Append('1');
|
||||
}
|
||||
else if (f == "strikeout")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
else if (f == "scalex")
|
||||
{
|
||||
sb.Append("100");
|
||||
}
|
||||
else if (f == "scaley")
|
||||
{
|
||||
sb.Append("100");
|
||||
}
|
||||
else if (f == "spacing")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
else if (f == "angle")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
|
||||
sb.Append(',');
|
||||
}
|
||||
string s = sb.ToString().Trim();
|
||||
return s.Substring(0, s.Length - 1);
|
||||
}
|
||||
|
||||
public string ToRawAss(string styleFormat)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
sb.Append("Style: ");
|
||||
var format = styleFormat.ToLowerInvariant().Substring(8).Split(',');
|
||||
for (int i = 0; i < format.Length; i++)
|
||||
{
|
||||
string f = format[i].Trim();
|
||||
if (f == "name")
|
||||
{
|
||||
sb.Append(Name);
|
||||
}
|
||||
else if (f == "fontname")
|
||||
{
|
||||
sb.Append(FontName);
|
||||
}
|
||||
else if (f == "fontsize")
|
||||
{
|
||||
sb.Append(FontSize.ToString(CultureInfo.InvariantCulture));
|
||||
}
|
||||
else if (f == "primarycolour")
|
||||
{
|
||||
sb.Append(AdvancedSubStationAlpha.GetSsaColorString(Primary));
|
||||
}
|
||||
else if (f == "secondarycolour")
|
||||
{
|
||||
sb.Append(AdvancedSubStationAlpha.GetSsaColorString(Secondary));
|
||||
}
|
||||
else if (f == "tertiarycolour")
|
||||
{
|
||||
sb.Append(AdvancedSubStationAlpha.GetSsaColorString(Tertiary));
|
||||
}
|
||||
else if (f == "outlinecolour")
|
||||
{
|
||||
sb.Append(AdvancedSubStationAlpha.GetSsaColorString(Outline));
|
||||
}
|
||||
else if (f == "backcolour")
|
||||
{
|
||||
sb.Append(AdvancedSubStationAlpha.GetSsaColorString(Background));
|
||||
}
|
||||
else if (f == "bold")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Bold));
|
||||
}
|
||||
else if (f == "italic")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Italic));
|
||||
}
|
||||
else if (f == "underline")
|
||||
{
|
||||
sb.Append(Convert.ToInt32(Underline));
|
||||
}
|
||||
else if (f == "outline")
|
||||
{
|
||||
sb.Append(OutlineWidth);
|
||||
}
|
||||
else if (f == "shadow")
|
||||
{
|
||||
sb.Append(ShadowWidth);
|
||||
}
|
||||
else if (f == "alignment")
|
||||
{
|
||||
sb.Append(Alignment);
|
||||
}
|
||||
else if (f == "marginl")
|
||||
{
|
||||
sb.Append(MarginLeft);
|
||||
}
|
||||
else if (f == "marginr")
|
||||
{
|
||||
sb.Append(MarginRight);
|
||||
}
|
||||
else if (f == "marginv")
|
||||
{
|
||||
sb.Append(MarginVertical);
|
||||
}
|
||||
else if (f == "borderstyle")
|
||||
{
|
||||
sb.Append(BorderStyle);
|
||||
}
|
||||
else if (f == "encoding")
|
||||
{
|
||||
sb.Append('1');
|
||||
}
|
||||
else if (f == "strikeout")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
else if (f == "scalex")
|
||||
{
|
||||
sb.Append("100");
|
||||
}
|
||||
else if (f == "scaley")
|
||||
{
|
||||
sb.Append("100");
|
||||
}
|
||||
else if (f == "spacing")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
else if (f == "angle")
|
||||
{
|
||||
sb.Append('0');
|
||||
}
|
||||
|
||||
sb.Append(',');
|
||||
}
|
||||
string s = sb.ToString().Trim();
|
||||
return s.Substring(0, s.Length - 1);
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class StrippableText
|
||||
{
|
@ -2,7 +2,7 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class TarHeader
|
||||
{
|
@ -2,7 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class TarReader : IDisposable
|
||||
{
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class TesseractDictionary
|
||||
{
|
@ -1,10 +1,8 @@
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class TextDraw
|
||||
{
|
@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class TextEncoding : IEquatable<Encoding>, IEquatable<string>
|
||||
{
|
@ -2,7 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class TextEncodingExtensions
|
||||
{
|
@ -2,7 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class TextSplit
|
||||
{
|
@ -3,7 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class TextSplitResult
|
||||
{
|
@ -1,259 +1,259 @@
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
{
|
||||
public class TimeCode
|
||||
{
|
||||
private static readonly char[] TimeSplitChars = { ':', ',', '.' };
|
||||
public const double BaseUnit = 1000.0; // Base unit of time
|
||||
|
||||
public bool IsMaxTime => Math.Abs(TotalMilliseconds - MaxTimeTotalMilliseconds) < 0.01;
|
||||
public const double MaxTimeTotalMilliseconds = 359999999; // new TimeCode(99, 59, 59, 999).TotalMilliseconds
|
||||
|
||||
public static TimeCode FromSeconds(double seconds)
|
||||
{
|
||||
return new TimeCode(seconds * BaseUnit);
|
||||
}
|
||||
|
||||
public static double ParseToMilliseconds(string text)
|
||||
{
|
||||
var parts = text.Split(TimeSplitChars, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (parts.Length == 4)
|
||||
{
|
||||
if (int.TryParse(parts[0], out var hours) && int.TryParse(parts[1], out var minutes) && int.TryParse(parts[2], out var seconds) && int.TryParse(parts[3], out var milliseconds))
|
||||
{
|
||||
return new TimeSpan(0, hours, minutes, seconds, milliseconds).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static double ParseHHMMSSFFToMilliseconds(string text)
|
||||
{
|
||||
var parts = text.Split(TimeSplitChars, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (parts.Length == 4)
|
||||
{
|
||||
if (int.TryParse(parts[0], out var hours) && int.TryParse(parts[1], out var minutes) && int.TryParse(parts[2], out var seconds) && int.TryParse(parts[3], out var frames))
|
||||
{
|
||||
return new TimeCode(hours, minutes, seconds, SubtitleFormat.FramesToMillisecondsMax999(frames)).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public TimeCode()
|
||||
{
|
||||
}
|
||||
|
||||
public TimeCode(TimeSpan timeSpan)
|
||||
{
|
||||
TotalMilliseconds = timeSpan.TotalMilliseconds;
|
||||
}
|
||||
|
||||
public TimeCode(double totalMilliseconds)
|
||||
{
|
||||
TotalMilliseconds = totalMilliseconds;
|
||||
}
|
||||
|
||||
public TimeCode(int hours, int minutes, int seconds, int milliseconds)
|
||||
{
|
||||
TotalMilliseconds = hours * 60 * 60 * BaseUnit + minutes * 60 * BaseUnit + seconds * BaseUnit + milliseconds;
|
||||
}
|
||||
|
||||
public int Hours
|
||||
{
|
||||
get
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
return ts.Hours + ts.Days * 24;
|
||||
}
|
||||
set
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
TotalMilliseconds = new TimeSpan(ts.Days, value, ts.Minutes, ts.Seconds, ts.Milliseconds).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
public int Minutes
|
||||
{
|
||||
get => TimeSpan.Minutes;
|
||||
set
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
TotalMilliseconds = new TimeSpan(ts.Days, ts.Hours, value, ts.Seconds, ts.Milliseconds).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
public int Seconds
|
||||
{
|
||||
get => TimeSpan.Seconds;
|
||||
set
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
TotalMilliseconds = new TimeSpan(ts.Days, ts.Hours, ts.Minutes, value, ts.Milliseconds).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
public int Milliseconds
|
||||
{
|
||||
get => TimeSpan.Milliseconds;
|
||||
set
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
TotalMilliseconds = new TimeSpan(ts.Days, ts.Hours, ts.Minutes, ts.Seconds, value).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
public double TotalMilliseconds { get; set; }
|
||||
|
||||
public double TotalSeconds
|
||||
{
|
||||
get => TotalMilliseconds / BaseUnit;
|
||||
set => TotalMilliseconds = value * BaseUnit;
|
||||
}
|
||||
|
||||
public TimeSpan TimeSpan
|
||||
{
|
||||
get => TimeSpan.FromMilliseconds(TotalMilliseconds);
|
||||
set => TotalMilliseconds = value.TotalMilliseconds;
|
||||
}
|
||||
|
||||
public override string ToString() => ToString(false);
|
||||
|
||||
public string ToString(bool localize)
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
string decimalSeparator = localize ? CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator : ",";
|
||||
string s = $"{ts.Hours + ts.Days * 24:00}:{ts.Minutes:00}:{ts.Seconds:00}{decimalSeparator}{ts.Milliseconds:000}";
|
||||
|
||||
return PrefixSign(s);
|
||||
}
|
||||
|
||||
public string ToShortString(bool localize = false)
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
string decimalSeparator = localize ? CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator : ",";
|
||||
string s;
|
||||
if (ts.Minutes == 0 && ts.Hours == 0 && ts.Days == 0)
|
||||
{
|
||||
s = $"{ts.Seconds:0}{decimalSeparator}{ts.Milliseconds:000}";
|
||||
}
|
||||
else if (ts.Hours == 0 && ts.Days == 0)
|
||||
{
|
||||
s = $"{ts.Minutes:0}:{ts.Seconds:00}{decimalSeparator}{ts.Milliseconds:000}";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = $"{ts.Hours + ts.Days * 24:0}:{ts.Minutes:00}:{ts.Seconds:00}{decimalSeparator}{ts.Milliseconds:000}";
|
||||
}
|
||||
return PrefixSign(s);
|
||||
}
|
||||
|
||||
public string ToShortStringHHMMSSFF()
|
||||
{
|
||||
string s = ToHHMMSSFF();
|
||||
string pre = string.Empty;
|
||||
if (s.StartsWith('-'))
|
||||
{
|
||||
pre = "-";
|
||||
s = s.TrimStart('-');
|
||||
}
|
||||
int j = 0;
|
||||
int len = s.Length;
|
||||
while (j + 6 < len && s[j] == '0' && s[j + 1] == '0' && s[j + 2] == ':')
|
||||
{
|
||||
j += 3;
|
||||
}
|
||||
s = j > 0 ? s.Substring(j) : s;
|
||||
return pre + s;
|
||||
}
|
||||
|
||||
public string ToHHMMSSFF()
|
||||
{
|
||||
string s;
|
||||
var ts = TimeSpan;
|
||||
var frames = Math.Round(ts.Milliseconds / (BaseUnit / Configuration.Settings.General.CurrentFrameRate));
|
||||
if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001)
|
||||
{
|
||||
var newTs = new TimeSpan(ts.Ticks);
|
||||
newTs = newTs.Add(new TimeSpan(0, 0, 1));
|
||||
s = $"{newTs.Days * 24 + newTs.Hours:00}:{newTs.Minutes:00}:{newTs.Seconds:00}:{0:00}";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}";
|
||||
}
|
||||
return PrefixSign(s);
|
||||
}
|
||||
|
||||
public string ToSSFF()
|
||||
{
|
||||
string s;
|
||||
var ts = TimeSpan;
|
||||
var frames = Math.Round(ts.Milliseconds / (BaseUnit / Configuration.Settings.General.CurrentFrameRate));
|
||||
if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001)
|
||||
{
|
||||
s = $"{ts.Seconds + 1:00}:{0:00}";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = $"{ts.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}";
|
||||
}
|
||||
return PrefixSign(s);
|
||||
}
|
||||
|
||||
public string ToHHMMSSPeriodFF()
|
||||
{
|
||||
string s;
|
||||
var ts = TimeSpan;
|
||||
var frames = Math.Round(ts.Milliseconds / (BaseUnit / Configuration.Settings.General.CurrentFrameRate));
|
||||
if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001)
|
||||
{
|
||||
var newTs = new TimeSpan(ts.Ticks);
|
||||
newTs = newTs.Add(new TimeSpan(0, 0, 1));
|
||||
s = $"{newTs.Days * 24 + newTs.Hours:00}:{newTs.Minutes:00}:{newTs.Seconds:00}.{0:00}";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}.{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}";
|
||||
}
|
||||
|
||||
return PrefixSign(s);
|
||||
}
|
||||
|
||||
private string PrefixSign(string time) => TotalMilliseconds >= 0 ? time : $"-{time.RemoveChar('-')}";
|
||||
|
||||
public string ToDisplayString()
|
||||
{
|
||||
if (IsMaxTime)
|
||||
{
|
||||
return "-";
|
||||
}
|
||||
|
||||
if (Configuration.Settings?.General.UseTimeFormatHHMMSSFF == true)
|
||||
{
|
||||
return ToHHMMSSFF();
|
||||
}
|
||||
|
||||
return ToString(true);
|
||||
}
|
||||
|
||||
public string ToShortDisplayString()
|
||||
{
|
||||
if (IsMaxTime)
|
||||
{
|
||||
return "-";
|
||||
}
|
||||
|
||||
if (Configuration.Settings?.General.UseTimeFormatHHMMSSFF == true)
|
||||
{
|
||||
return ToShortStringHHMMSSFF();
|
||||
}
|
||||
|
||||
return ToShortString(true);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class TimeCode
|
||||
{
|
||||
private static readonly char[] TimeSplitChars = { ':', ',', '.' };
|
||||
public const double BaseUnit = 1000.0; // Base unit of time
|
||||
|
||||
public bool IsMaxTime => Math.Abs(TotalMilliseconds - MaxTimeTotalMilliseconds) < 0.01;
|
||||
public const double MaxTimeTotalMilliseconds = 359999999; // new TimeCode(99, 59, 59, 999).TotalMilliseconds
|
||||
|
||||
public static TimeCode FromSeconds(double seconds)
|
||||
{
|
||||
return new TimeCode(seconds * BaseUnit);
|
||||
}
|
||||
|
||||
public static double ParseToMilliseconds(string text)
|
||||
{
|
||||
var parts = text.Split(TimeSplitChars, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (parts.Length == 4)
|
||||
{
|
||||
if (int.TryParse(parts[0], out var hours) && int.TryParse(parts[1], out var minutes) && int.TryParse(parts[2], out var seconds) && int.TryParse(parts[3], out var milliseconds))
|
||||
{
|
||||
return new TimeSpan(0, hours, minutes, seconds, milliseconds).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static double ParseHHMMSSFFToMilliseconds(string text)
|
||||
{
|
||||
var parts = text.Split(TimeSplitChars, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (parts.Length == 4)
|
||||
{
|
||||
if (int.TryParse(parts[0], out var hours) && int.TryParse(parts[1], out var minutes) && int.TryParse(parts[2], out var seconds) && int.TryParse(parts[3], out var frames))
|
||||
{
|
||||
return new TimeCode(hours, minutes, seconds, SubtitleFormat.FramesToMillisecondsMax999(frames)).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public TimeCode()
|
||||
{
|
||||
}
|
||||
|
||||
public TimeCode(TimeSpan timeSpan)
|
||||
{
|
||||
TotalMilliseconds = timeSpan.TotalMilliseconds;
|
||||
}
|
||||
|
||||
public TimeCode(double totalMilliseconds)
|
||||
{
|
||||
TotalMilliseconds = totalMilliseconds;
|
||||
}
|
||||
|
||||
public TimeCode(int hours, int minutes, int seconds, int milliseconds)
|
||||
{
|
||||
TotalMilliseconds = hours * 60 * 60 * BaseUnit + minutes * 60 * BaseUnit + seconds * BaseUnit + milliseconds;
|
||||
}
|
||||
|
||||
public int Hours
|
||||
{
|
||||
get
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
return ts.Hours + ts.Days * 24;
|
||||
}
|
||||
set
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
TotalMilliseconds = new TimeSpan(ts.Days, value, ts.Minutes, ts.Seconds, ts.Milliseconds).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
public int Minutes
|
||||
{
|
||||
get => TimeSpan.Minutes;
|
||||
set
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
TotalMilliseconds = new TimeSpan(ts.Days, ts.Hours, value, ts.Seconds, ts.Milliseconds).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
public int Seconds
|
||||
{
|
||||
get => TimeSpan.Seconds;
|
||||
set
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
TotalMilliseconds = new TimeSpan(ts.Days, ts.Hours, ts.Minutes, value, ts.Milliseconds).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
public int Milliseconds
|
||||
{
|
||||
get => TimeSpan.Milliseconds;
|
||||
set
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
TotalMilliseconds = new TimeSpan(ts.Days, ts.Hours, ts.Minutes, ts.Seconds, value).TotalMilliseconds;
|
||||
}
|
||||
}
|
||||
|
||||
public double TotalMilliseconds { get; set; }
|
||||
|
||||
public double TotalSeconds
|
||||
{
|
||||
get => TotalMilliseconds / BaseUnit;
|
||||
set => TotalMilliseconds = value * BaseUnit;
|
||||
}
|
||||
|
||||
public TimeSpan TimeSpan
|
||||
{
|
||||
get => TimeSpan.FromMilliseconds(TotalMilliseconds);
|
||||
set => TotalMilliseconds = value.TotalMilliseconds;
|
||||
}
|
||||
|
||||
public override string ToString() => ToString(false);
|
||||
|
||||
public string ToString(bool localize)
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
string decimalSeparator = localize ? CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator : ",";
|
||||
string s = $"{ts.Hours + ts.Days * 24:00}:{ts.Minutes:00}:{ts.Seconds:00}{decimalSeparator}{ts.Milliseconds:000}";
|
||||
|
||||
return PrefixSign(s);
|
||||
}
|
||||
|
||||
public string ToShortString(bool localize = false)
|
||||
{
|
||||
var ts = TimeSpan;
|
||||
string decimalSeparator = localize ? CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator : ",";
|
||||
string s;
|
||||
if (ts.Minutes == 0 && ts.Hours == 0 && ts.Days == 0)
|
||||
{
|
||||
s = $"{ts.Seconds:0}{decimalSeparator}{ts.Milliseconds:000}";
|
||||
}
|
||||
else if (ts.Hours == 0 && ts.Days == 0)
|
||||
{
|
||||
s = $"{ts.Minutes:0}:{ts.Seconds:00}{decimalSeparator}{ts.Milliseconds:000}";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = $"{ts.Hours + ts.Days * 24:0}:{ts.Minutes:00}:{ts.Seconds:00}{decimalSeparator}{ts.Milliseconds:000}";
|
||||
}
|
||||
return PrefixSign(s);
|
||||
}
|
||||
|
||||
public string ToShortStringHHMMSSFF()
|
||||
{
|
||||
string s = ToHHMMSSFF();
|
||||
string pre = string.Empty;
|
||||
if (s.StartsWith('-'))
|
||||
{
|
||||
pre = "-";
|
||||
s = s.TrimStart('-');
|
||||
}
|
||||
int j = 0;
|
||||
int len = s.Length;
|
||||
while (j + 6 < len && s[j] == '0' && s[j + 1] == '0' && s[j + 2] == ':')
|
||||
{
|
||||
j += 3;
|
||||
}
|
||||
s = j > 0 ? s.Substring(j) : s;
|
||||
return pre + s;
|
||||
}
|
||||
|
||||
public string ToHHMMSSFF()
|
||||
{
|
||||
string s;
|
||||
var ts = TimeSpan;
|
||||
var frames = Math.Round(ts.Milliseconds / (BaseUnit / Configuration.Settings.General.CurrentFrameRate));
|
||||
if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001)
|
||||
{
|
||||
var newTs = new TimeSpan(ts.Ticks);
|
||||
newTs = newTs.Add(new TimeSpan(0, 0, 1));
|
||||
s = $"{newTs.Days * 24 + newTs.Hours:00}:{newTs.Minutes:00}:{newTs.Seconds:00}:{0:00}";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}";
|
||||
}
|
||||
return PrefixSign(s);
|
||||
}
|
||||
|
||||
public string ToSSFF()
|
||||
{
|
||||
string s;
|
||||
var ts = TimeSpan;
|
||||
var frames = Math.Round(ts.Milliseconds / (BaseUnit / Configuration.Settings.General.CurrentFrameRate));
|
||||
if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001)
|
||||
{
|
||||
s = $"{ts.Seconds + 1:00}:{0:00}";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = $"{ts.Seconds:00}:{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}";
|
||||
}
|
||||
return PrefixSign(s);
|
||||
}
|
||||
|
||||
public string ToHHMMSSPeriodFF()
|
||||
{
|
||||
string s;
|
||||
var ts = TimeSpan;
|
||||
var frames = Math.Round(ts.Milliseconds / (BaseUnit / Configuration.Settings.General.CurrentFrameRate));
|
||||
if (frames >= Configuration.Settings.General.CurrentFrameRate - 0.001)
|
||||
{
|
||||
var newTs = new TimeSpan(ts.Ticks);
|
||||
newTs = newTs.Add(new TimeSpan(0, 0, 1));
|
||||
s = $"{newTs.Days * 24 + newTs.Hours:00}:{newTs.Minutes:00}:{newTs.Seconds:00}.{0:00}";
|
||||
}
|
||||
else
|
||||
{
|
||||
s = $"{ts.Days * 24 + ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}.{SubtitleFormat.MillisecondsToFramesMaxFrameRate(ts.Milliseconds):00}";
|
||||
}
|
||||
|
||||
return PrefixSign(s);
|
||||
}
|
||||
|
||||
private string PrefixSign(string time) => TotalMilliseconds >= 0 ? time : $"-{time.RemoveChar('-')}";
|
||||
|
||||
public string ToDisplayString()
|
||||
{
|
||||
if (IsMaxTime)
|
||||
{
|
||||
return "-";
|
||||
}
|
||||
|
||||
if (Configuration.Settings?.General.UseTimeFormatHHMMSSFF == true)
|
||||
{
|
||||
return ToHHMMSSFF();
|
||||
}
|
||||
|
||||
return ToString(true);
|
||||
}
|
||||
|
||||
public string ToShortDisplayString()
|
||||
{
|
||||
if (IsMaxTime)
|
||||
{
|
||||
return "-";
|
||||
}
|
||||
|
||||
if (Configuration.Settings?.General.UseTimeFormatHHMMSSFF == true)
|
||||
{
|
||||
return ToShortStringHHMMSSFF();
|
||||
}
|
||||
|
||||
return ToShortString(true);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -30,7 +30,7 @@ using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
#pragma warning disable 1591
|
||||
public class ParserException : Exception
|
@ -1,11 +1,11 @@
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
/// <summary>
|
||||
/// Generic subtitle format parser
|
@ -1,11 +1,11 @@
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
using System;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class UnknownFormatImporterJson
|
||||
{
|
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public class VideoInfo
|
||||
{
|
File diff suppressed because it is too large
Load Diff
@ -1,7 +1,7 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
public static class XmlDeserializerGenerator
|
||||
{
|
@ -10,7 +10,7 @@ using System.IO;
|
||||
using System.IO.Compression;
|
||||
using System.Text;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core
|
||||
namespace Nikse.SubtitleEdit.Core.Common
|
||||
{
|
||||
/// <summary>
|
||||
/// Zip archive decompression. Represents a Zip file.
|
@ -1,5 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.MaterialExchangeFormat
|
||||
{
|
||||
|
@ -5,6 +5,7 @@ using System.IO;
|
||||
using System.IO.MemoryMappedFiles;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.Matroska
|
||||
{
|
||||
|
@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.Matroska
|
||||
{
|
||||
|
@ -4,6 +4,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.Mp4.Boxes
|
||||
{
|
||||
|
@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.Mp4.Boxes
|
||||
{
|
||||
|
@ -2,6 +2,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.Mp4
|
||||
{
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
using System;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats
|
||||
{
|
||||
|
@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using System.IO;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
|
||||
{
|
||||
|
@ -1,5 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
|
||||
{
|
||||
|
@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
|
||||
{
|
||||
|
@ -14,6 +14,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
|
||||
{
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
|
||||
{
|
||||
|
@ -5,6 +5,7 @@ using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
|
||||
{
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System.Drawing;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats.TransportStream
|
||||
|
@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.ContainerFormats
|
||||
{
|
||||
|
@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Xml;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Dictionaries
|
||||
{
|
||||
|
@ -4,6 +4,7 @@ using System.IO;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Xml;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Dictionaries
|
||||
{
|
||||
|
@ -3,6 +3,7 @@ using System.Net;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms
|
||||
{
|
||||
|
@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
|
@ -1,6 +1,7 @@
|
||||
using Nikse.SubtitleEdit.Core.SubtitleFormats;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
|
@ -1,4 +1,5 @@
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
{
|
||||
|
@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
|
@ -1,5 +1,6 @@
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
using System.Text.RegularExpressions;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
{
|
||||
|
@ -3,6 +3,7 @@ using Nikse.SubtitleEdit.Core.Dictionaries;
|
||||
using Nikse.SubtitleEdit.Core.Enums;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
using System.Collections.Generic;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
{
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
|
@ -1,4 +1,5 @@
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
using Nikse.SubtitleEdit.Core.Common;
|
||||
using Nikse.SubtitleEdit.Core.Interfaces;
|
||||
|
||||
namespace Nikse.SubtitleEdit.Core.Forms.FixCommonErrors
|
||||
{
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user