mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-31 21:03:48 +01:00
Add option to clear non-ascii symbols from paths again.
This commit is contained in:
parent
b14cd26e4e
commit
59ea1f2dd6
13 changed files with 56 additions and 62 deletions
|
|
@ -4,7 +4,6 @@ using OtterGui;
|
|||
using OtterGui.Classes;
|
||||
using Penumbra.Api.Enums;
|
||||
using Penumbra.Communication;
|
||||
using Penumbra.Meta.Manipulations;
|
||||
using Penumbra.Mods.Manager;
|
||||
using Penumbra.Mods.Subclasses;
|
||||
using Penumbra.Services;
|
||||
|
|
@ -15,6 +14,7 @@ namespace Penumbra.Mods.Editor;
|
|||
|
||||
public class ModMerger : IDisposable
|
||||
{
|
||||
private readonly Configuration _config;
|
||||
private readonly CommunicatorService _communicator;
|
||||
private readonly ModOptionEditor _editor;
|
||||
private readonly ModFileSystemSelector _selector;
|
||||
|
|
@ -40,13 +40,14 @@ public class ModMerger : IDisposable
|
|||
public Exception? Error { get; private set; }
|
||||
|
||||
public ModMerger(ModManager mods, ModOptionEditor editor, ModFileSystemSelector selector, DuplicateManager duplicates,
|
||||
CommunicatorService communicator, ModCreator creator)
|
||||
CommunicatorService communicator, ModCreator creator, Configuration config)
|
||||
{
|
||||
_editor = editor;
|
||||
_selector = selector;
|
||||
_duplicates = duplicates;
|
||||
_communicator = communicator;
|
||||
_creator = creator;
|
||||
_config = config;
|
||||
_mods = mods;
|
||||
_selector.SelectionChanged += OnSelectionChange;
|
||||
_communicator.ModPathChanged.Subscribe(OnModPathChange, ModPathChanged.Priority.ModMerger);
|
||||
|
|
@ -82,7 +83,8 @@ public class ModMerger : IDisposable
|
|||
catch (Exception ex)
|
||||
{
|
||||
Error = ex;
|
||||
Penumbra.Messager.NotificationMessage(ex, $"Could not merge {MergeFromMod!.Name} into {MergeToMod!.Name}, cleaning up changes.", NotificationType.Error, false);
|
||||
Penumbra.Messager.NotificationMessage(ex, $"Could not merge {MergeFromMod!.Name} into {MergeToMod!.Name}, cleaning up changes.",
|
||||
NotificationType.Error, false);
|
||||
FailureCleanup();
|
||||
DataCleanup();
|
||||
}
|
||||
|
|
@ -138,10 +140,10 @@ public class ModMerger : IDisposable
|
|||
var (option, optionCreated) = _editor.FindOrAddOption(MergeToMod!, groupIdx, optionName);
|
||||
if (optionCreated)
|
||||
_createdOptions.Add(option);
|
||||
var dir = ModCreator.NewOptionDirectory(MergeToMod!.ModPath, groupName);
|
||||
var dir = ModCreator.NewOptionDirectory(MergeToMod!.ModPath, groupName, _config.ReplaceNonAsciiOnImport);
|
||||
if (!dir.Exists)
|
||||
_createdDirectories.Add(dir.FullName);
|
||||
dir = ModCreator.NewOptionDirectory(dir, optionName);
|
||||
dir = ModCreator.NewOptionDirectory(dir, optionName, _config.ReplaceNonAsciiOnImport);
|
||||
if (!dir.Exists)
|
||||
_createdDirectories.Add(dir.FullName);
|
||||
CopyFiles(dir);
|
||||
|
|
|
|||
|
|
@ -6,11 +6,10 @@ using Penumbra.Mods.Manager;
|
|||
using Penumbra.Mods.Subclasses;
|
||||
using Penumbra.String.Classes;
|
||||
|
||||
namespace Penumbra.Mods;
|
||||
namespace Penumbra.Mods.Editor;
|
||||
|
||||
public class ModNormalizer
|
||||
public class ModNormalizer(ModManager _modManager, Configuration _config)
|
||||
{
|
||||
private readonly ModManager _modManager;
|
||||
private readonly List<List<Dictionary<Utf8GamePath, FullPath>>> _redirections = new();
|
||||
|
||||
public Mod Mod { get; private set; } = null!;
|
||||
|
|
@ -25,9 +24,6 @@ public class ModNormalizer
|
|||
public bool Running
|
||||
=> !Worker.IsCompleted;
|
||||
|
||||
public ModNormalizer(ModManager modManager)
|
||||
=> _modManager = modManager;
|
||||
|
||||
public void Normalize(Mod mod)
|
||||
{
|
||||
if (Step < TotalSteps)
|
||||
|
|
@ -175,10 +171,10 @@ public class ModNormalizer
|
|||
for (var i = _redirections[groupIdx + 1].Count; i < group.Count; ++i)
|
||||
_redirections[groupIdx + 1].Add(new Dictionary<Utf8GamePath, FullPath>());
|
||||
|
||||
var groupDir = ModCreator.CreateModFolder(directory, group.Name);
|
||||
var groupDir = ModCreator.CreateModFolder(directory, group.Name, _config.ReplaceNonAsciiOnImport, true);
|
||||
foreach (var option in group.OfType<SubMod>())
|
||||
{
|
||||
var optionDir = ModCreator.CreateModFolder(groupDir, option.Name);
|
||||
var optionDir = ModCreator.CreateModFolder(groupDir, option.Name, _config.ReplaceNonAsciiOnImport, true);
|
||||
|
||||
newDict = _redirections[groupIdx + 1][option.OptionIdx];
|
||||
newDict.Clear();
|
||||
|
|
@ -228,7 +224,8 @@ public class ModNormalizer
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Penumbra.Messager.NotificationMessage(e, $"Could not move old files out of the way while normalizing mod {Mod.Name}.", NotificationType.Error, false);
|
||||
Penumbra.Messager.NotificationMessage(e, $"Could not move old files out of the way while normalizing mod {Mod.Name}.",
|
||||
NotificationType.Error, false);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
@ -251,7 +248,8 @@ public class ModNormalizer
|
|||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Penumbra.Messager.NotificationMessage(e, $"Could not move new files into the mod while normalizing mod {Mod.Name}.", NotificationType.Error, false);
|
||||
Penumbra.Messager.NotificationMessage(e, $"Could not move new files into the mod while normalizing mod {Mod.Name}.",
|
||||
NotificationType.Error, false);
|
||||
foreach (var dir in Mod.ModPath.EnumerateDirectories())
|
||||
{
|
||||
if (dir.FullName.Equals(_oldDirName, StringComparison.OrdinalIgnoreCase)
|
||||
|
|
|
|||
|
|
@ -217,7 +217,7 @@ public sealed class ModManager : ModStorage, IDisposable
|
|||
if (oldName == newName)
|
||||
return NewDirectoryState.Identical;
|
||||
|
||||
var fixedNewName = ModCreator.ReplaceBadXivSymbols(newName);
|
||||
var fixedNewName = ModCreator.ReplaceBadXivSymbols(newName, _config.ReplaceNonAsciiOnImport);
|
||||
if (fixedNewName != newName)
|
||||
return NewDirectoryState.ContainsInvalidSymbols;
|
||||
|
||||
|
|
|
|||
|
|
@ -16,30 +16,15 @@ using Penumbra.String.Classes;
|
|||
|
||||
namespace Penumbra.Mods;
|
||||
|
||||
public partial class ModCreator
|
||||
public partial class ModCreator(SaveService _saveService, Configuration _config, ModDataEditor _dataEditor, MetaFileManager _metaFileManager,
|
||||
IGamePathParser _gamePathParser)
|
||||
{
|
||||
private readonly Configuration _config;
|
||||
private readonly SaveService _saveService;
|
||||
private readonly ModDataEditor _dataEditor;
|
||||
private readonly MetaFileManager _metaFileManager;
|
||||
private readonly IGamePathParser _gamePathParser;
|
||||
|
||||
public ModCreator(SaveService saveService, Configuration config, ModDataEditor dataEditor, MetaFileManager metaFileManager,
|
||||
IGamePathParser gamePathParser)
|
||||
{
|
||||
_saveService = saveService;
|
||||
_config = config;
|
||||
_dataEditor = dataEditor;
|
||||
_metaFileManager = metaFileManager;
|
||||
_gamePathParser = gamePathParser;
|
||||
}
|
||||
|
||||
/// <summary> Creates directory and files necessary for a new mod without adding it to the manager. </summary>
|
||||
public DirectoryInfo? CreateEmptyMod(DirectoryInfo basePath, string newName, string description = "")
|
||||
{
|
||||
try
|
||||
{
|
||||
var newDir = CreateModFolder(basePath, newName);
|
||||
var newDir = CreateModFolder(basePath, newName, _config.ReplaceNonAsciiOnImport, true);
|
||||
_dataEditor.CreateMeta(newDir, newName, _config.DefaultModAuthor, description, "1.0", string.Empty);
|
||||
CreateDefaultFiles(newDir);
|
||||
return newDir;
|
||||
|
|
@ -138,13 +123,13 @@ public partial class ModCreator
|
|||
/// - Unique, by appending (digit) for duplicates.<br/>
|
||||
/// - Containing no symbols invalid for FFXIV or windows paths.<br/>
|
||||
/// </summary>
|
||||
public static DirectoryInfo CreateModFolder(DirectoryInfo outDirectory, string modListName, bool create = true)
|
||||
public static DirectoryInfo CreateModFolder(DirectoryInfo outDirectory, string modListName, bool onlyAscii, bool create)
|
||||
{
|
||||
var name = modListName;
|
||||
if (name.Length == 0)
|
||||
name = "_";
|
||||
|
||||
var newModFolderBase = NewOptionDirectory(outDirectory, name);
|
||||
var newModFolderBase = NewOptionDirectory(outDirectory, name, onlyAscii);
|
||||
var newModFolder = newModFolderBase.FullName.ObtainUniqueFile();
|
||||
if (newModFolder.Length == 0)
|
||||
throw new IOException("Could not create mod folder: too many folders of the same name exist.");
|
||||
|
|
@ -238,9 +223,9 @@ public partial class ModCreator
|
|||
/// Create the name for a group or option subfolder based on its parent folder and given name.
|
||||
/// subFolderName should never be empty, and the result is unique and contains no invalid symbols.
|
||||
/// </summary>
|
||||
public static DirectoryInfo? NewSubFolderName(DirectoryInfo parentFolder, string subFolderName)
|
||||
public static DirectoryInfo? NewSubFolderName(DirectoryInfo parentFolder, string subFolderName, bool onlyAscii)
|
||||
{
|
||||
var newModFolderBase = NewOptionDirectory(parentFolder, subFolderName);
|
||||
var newModFolderBase = NewOptionDirectory(parentFolder, subFolderName, onlyAscii);
|
||||
var newModFolder = newModFolderBase.FullName.ObtainUniqueFile();
|
||||
return newModFolder.Length == 0 ? null : new DirectoryInfo(newModFolder);
|
||||
}
|
||||
|
|
@ -325,14 +310,14 @@ public partial class ModCreator
|
|||
}
|
||||
|
||||
/// <summary> Return the name of a new valid directory based on the base directory and the given name. </summary>
|
||||
public static DirectoryInfo NewOptionDirectory(DirectoryInfo baseDir, string optionName)
|
||||
public static DirectoryInfo NewOptionDirectory(DirectoryInfo baseDir, string optionName, bool onlyAscii)
|
||||
{
|
||||
var option = ReplaceBadXivSymbols(optionName);
|
||||
var option = ReplaceBadXivSymbols(optionName, onlyAscii);
|
||||
return new DirectoryInfo(Path.Combine(baseDir.FullName, option.Length > 0 ? option : "_"));
|
||||
}
|
||||
|
||||
/// <summary> Normalize for nicer names, and remove invalid symbols or invalid paths. </summary>
|
||||
public static string ReplaceBadXivSymbols(string s, string replacement = "_")
|
||||
public static string ReplaceBadXivSymbols(string s, bool onlyAscii, string replacement = "_")
|
||||
{
|
||||
switch (s)
|
||||
{
|
||||
|
|
@ -345,6 +330,8 @@ public partial class ModCreator
|
|||
{
|
||||
if (c.IsInvalidInPath())
|
||||
sb.Append(replacement);
|
||||
else if (onlyAscii && c.IsInvalidAscii())
|
||||
sb.Append(replacement);
|
||||
else
|
||||
sb.Append(c);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ public class TemporaryMod : IMod
|
|||
DirectoryInfo? dir = null;
|
||||
try
|
||||
{
|
||||
dir = ModCreator.CreateModFolder(modManager.BasePath, collection.Name);
|
||||
dir = ModCreator.CreateModFolder(modManager.BasePath, collection.Name, config.ReplaceNonAsciiOnImport, true);
|
||||
var fileDir = Directory.CreateDirectory(Path.Combine(dir.FullName, "files"));
|
||||
modManager.DataEditor.CreateMeta(dir, collection.Name, character ?? config.DefaultModAuthor,
|
||||
$"Mod generated from temporary collection {collection.Name} for {character ?? "Unknown Character"}.", null, null);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue