Help build fix

This commit is contained in:
dragonmacher 2024-03-01 20:17:30 +00:00
parent c8790828f4
commit 89f9e6f8d5
4 changed files with 119 additions and 62 deletions

View file

@ -0,0 +1,65 @@
/* ###
* IP: GHIDRA
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package help;
import java.nio.file.Path;
import java.util.Objects;
/** A class that wraps a Path and allows map lookup for paths from different file systems */
public class PathKey {
private String path;
public PathKey(Path p) {
if (p == null) {
Objects.requireNonNull(p, "Path cannot be null");
}
this.path = p.toString().replace('\\', '/');
}
public PathKey(String path) {
Objects.requireNonNull(path, "Path cannot be null");;
this.path = path.replace('\\', '/');
}
@Override
public int hashCode() {
return path.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
PathKey other = (PathKey) obj;
boolean result = path.equals(other.path);
return result;
}
@Override
public String toString() {
return path.toString();
}
}

View file

@ -15,15 +15,24 @@
*/ */
package help.validator; package help.validator;
import help.validator.model.*;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import help.PathKey;
import help.validator.model.AnchorDefinition;
import help.validator.model.HREF;
import help.validator.model.IMG;
public class AnchorManager { public class AnchorManager {
private Map<String, AnchorDefinition> anchorsByHelpPath = private Map<PathKey, AnchorDefinition> anchorsByHelpPath =
new HashMap<String, AnchorDefinition>(); new HashMap<>();
private Map<String, AnchorDefinition> anchorsById = new HashMap<String, AnchorDefinition>(); private Map<String, AnchorDefinition> anchorsById = new HashMap<String, AnchorDefinition>();
private Map<String, AnchorDefinition> anchorsByName = new HashMap<String, AnchorDefinition>(); private Map<String, AnchorDefinition> anchorsByName = new HashMap<String, AnchorDefinition>();
private Map<String, List<AnchorDefinition>> duplicateAnchorsById = private Map<String, List<AnchorDefinition>> duplicateAnchorsById =
@ -45,7 +54,7 @@ public class AnchorManager {
} }
anchorsById.put(id, anchor); anchorsById.put(id, anchor);
anchorsByHelpPath.put(anchor.getHelpPath(), anchor); anchorsByHelpPath.put(new PathKey(anchor.getHelpPath()), anchor);
if (anchorName != null) { if (anchorName != null) {
anchorsByName.put(anchorName, anchor); anchorsByName.put(anchorName, anchor);
@ -71,11 +80,11 @@ public class AnchorManager {
if (!anchorsByName.containsKey(anchorName)) { if (!anchorsByName.containsKey(anchorName)) {
anchorsByName.put(anchorName, anchor); anchorsByName.put(anchorName, anchor);
anchorsByHelpPath.put(anchor.getHelpPath(), anchor); anchorsByHelpPath.put(new PathKey(anchor.getHelpPath()), anchor);
} }
} }
public Map<String, AnchorDefinition> getAnchorsByHelpPath() { public Map<PathKey, AnchorDefinition> getAnchorsByHelpPath() {
return anchorsByHelpPath; return anchorsByHelpPath;
} }

View file

@ -16,10 +16,21 @@
package help.validator.location; package help.validator.location;
import java.io.File; import java.io.File;
import java.net.*; import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.*; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.help.HelpSet; import javax.help.HelpSet;
@ -29,8 +40,17 @@ import javax.swing.tree.DefaultMutableTreeNode;
import help.CustomTOCView.CustomTreeItemDecorator; import help.CustomTOCView.CustomTreeItemDecorator;
import help.HelpBuildUtils; import help.HelpBuildUtils;
import help.PathKey;
import help.TOCItemProvider; import help.TOCItemProvider;
import help.validator.model.*; import help.validator.model.AnchorDefinition;
import help.validator.model.GhidraTOCFile;
import help.validator.model.HREF;
import help.validator.model.HelpFile;
import help.validator.model.HelpTopic;
import help.validator.model.IMG;
import help.validator.model.TOCItem;
import help.validator.model.TOCItemDefinition;
import help.validator.model.TOCItemExternal;
/** /**
* A class that is meant to hold a single help <b>input</b> directory and 0 or more * A class that is meant to hold a single help <b>input</b> directory and 0 or more
@ -353,48 +373,4 @@ public class HelpModuleCollection implements TOCItemProvider {
public String toString() { public String toString() {
return helpLocations.toString(); return helpLocations.toString();
} }
//==================================================================================================
// Inner Classes
//==================================================================================================
/** A class that wraps a Path and allows map lookup for paths from different file systems */
private class PathKey {
private String path;
PathKey(Path p) {
if (p == null) {
throw new IllegalArgumentException("Path cannot be null");
}
this.path = p.toString().replace('\\', '/');
}
@Override
public int hashCode() {
return path.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
PathKey other = (PathKey) obj;
boolean result = path.equals(other.path);
return result;
}
@Override
public String toString() {
return path.toString();
}
}
} }

View file

@ -17,11 +17,17 @@ package help.validator.model;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.*; import java.util.Collection;
import java.util.List;
import java.util.Map;
import ghidra.util.exception.AssertException; import ghidra.util.exception.AssertException;
import help.HelpBuildUtils; import help.HelpBuildUtils;
import help.validator.*; import help.PathKey;
import help.validator.AnchorManager;
import help.validator.HTMLFileParser;
import help.validator.ReferenceTagProcessor;
import help.validator.TagProcessor;
import help.validator.location.HelpModuleLocation; import help.validator.location.HelpModuleLocation;
public class HelpFile { public class HelpFile {
@ -75,8 +81,9 @@ public class HelpFile {
} }
public AnchorDefinition getAnchorDefinition(Path helpPath) { public AnchorDefinition getAnchorDefinition(Path helpPath) {
Map<String, AnchorDefinition> anchorsByHelpPath = anchorManager.getAnchorsByHelpPath(); Map<PathKey, AnchorDefinition> anchorsByHelpPath = anchorManager.getAnchorsByHelpPath();
return anchorsByHelpPath.get(helpPath.toString()); AnchorDefinition def = anchorsByHelpPath.get(new PathKey(helpPath));
return def;
} }
public Collection<AnchorDefinition> getAllAnchorDefinitions() { public Collection<AnchorDefinition> getAllAnchorDefinitions() {